PetscCopyMode was added, ISCreateGeneral takes an additional parameter
---
 include/numerics/petsc_macro.h |    8 ++++++++
 src/numerics/petsc_matrix.C    |    2 ++
 src/numerics/petsc_vector.C    |   10 ++++++----
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/include/numerics/petsc_macro.h b/include/numerics/petsc_macro.h
index 57e39b8..abac335 100644
--- a/include/numerics/petsc_macro.h
+++ b/include/numerics/petsc_macro.h
@@ -85,6 +85,14 @@ EXTERN_C_FOR_PETSC_END
 
 #if PETSC_VERSION_RELEASE && PETSC_VERSION_LESS_THAN(3,1,1)
 typedef PetscTruth PetscBool;
+// libMesh currently holds zero long-lived IS, it always creates an IS with a 
std::vector<int>,
+// uses it through the Vec or Mat API, and destroys the IS.  This can always 
be done without a
+// copy, so we assume mode = PETSC_USE_POINTER (the IS just uses the array, 
without ownership).
+#  if PETSC_VERSION_LESS_THAN(2,2,1)         // Cannot avoid a copy
+#    define ISCreateGeneral(comm,n,idx,mode,is) 
ISCreateGeneral((comm),(n),(idx),(is))
+#  else
+#    define ISCreateGeneral(comm,n,idx,mode,is) 
ISCreateGeneralWithArray((comm),(n),(idx),(is))
+#  endif
 #endif
 
 #endif // LIBMESH_HAVE_PETSC
diff --git a/src/numerics/petsc_matrix.C b/src/numerics/petsc_matrix.C
index c92daa5..d50d428 100644
--- a/src/numerics/petsc_matrix.C
+++ b/src/numerics/petsc_matrix.C
@@ -381,11 +381,13 @@ void PetscMatrix<T>::_get_submatrix(SparseMatrix<T>& 
submatrix,
   ierr = ISCreateGeneral(libMesh::COMM_WORLD,
                         rows.size(),
                         (int*) &rows[0],
+                        PETSC_USE_POINTER,
                         &isrow); CHKERRABORT(libMesh::COMM_WORLD,ierr);
 
   ierr = ISCreateGeneral(libMesh::COMM_WORLD,
                         cols.size(),
                         (int*) &cols[0],
+                        PETSC_USE_POINTER,
                         &iscol); CHKERRABORT(libMesh::COMM_WORLD,ierr);
 
   // Extract submatrix
diff --git a/src/numerics/petsc_vector.C b/src/numerics/petsc_vector.C
index 29c9b28..c38c7da 100644
--- a/src/numerics/petsc_vector.C
+++ b/src/numerics/petsc_vector.C
@@ -708,7 +708,7 @@ void PetscVector<T>::localize (NumericVector<T>& 
v_local_in) const
   std::vector<int> idx(n); Utility::iota (idx.begin(), idx.end(), 0);
 
   // Create the index set & scatter object
-  ierr = ISCreateGeneral(libMesh::COMM_WORLD, n, &idx[0], &is);
+  ierr = ISCreateGeneral(libMesh::COMM_WORLD, n, &idx[0], PETSC_USE_POINTER, 
&is);
          CHKERRABORT(libMesh::COMM_WORLD,ierr);
 
   ierr = VecScatterCreate(_vec,          is,
@@ -780,10 +780,10 @@ void PetscVector<T>::localize (NumericVector<T>& 
v_local_in,
   // Create the index set & scatter object
   if (idx.empty())
     ierr = ISCreateGeneral(libMesh::COMM_WORLD,
-                           n_sl+this->local_size(), PETSC_NULL, &is);
+                           n_sl+this->local_size(), PETSC_NULL, 
PETSC_USE_POINTER, &is);
   else
     ierr = ISCreateGeneral(libMesh::COMM_WORLD,
-                          n_sl+this->local_size(), &idx[0], &is);
+                          n_sl+this->local_size(), &idx[0], PETSC_USE_POINTER, 
&is);
            CHKERRABORT(libMesh::COMM_WORLD,ierr);
 
   ierr = VecScatterCreate(_vec,          is,
@@ -870,7 +870,7 @@ void PetscVector<T>::localize (const unsigned int 
first_local_idx,
     Utility::iota (idx.begin(), idx.end(), first_local_idx);
 
     // Create the index set & scatter object
-    ierr = ISCreateGeneral(libMesh::COMM_WORLD, local_size, &idx[0], &is); 
+    ierr = ISCreateGeneral(libMesh::COMM_WORLD, local_size, &idx[0], 
PETSC_USE_POINTER, &is);
            CHKERRABORT(libMesh::COMM_WORLD,ierr);
 
     ierr = VecScatterCreate(_vec,              is,
@@ -1260,11 +1260,13 @@ void PetscVector<T>::create_subvector(NumericVector<T>& 
subvector,
   ierr = ISCreateGeneral(libMesh::COMM_WORLD,
                         rows.size(),
                         (int*) &rows[0],
+                        PETSC_USE_POINTER,
                         &parent_is); CHKERRABORT(libMesh::COMM_WORLD,ierr);
 
   ierr = ISCreateGeneral(libMesh::COMM_WORLD,
                         rows.size(),
                         (int*) &idx[0],
+                        PETSC_USE_POINTER,
                         &subvector_is); CHKERRABORT(libMesh::COMM_WORLD,ierr);
 
   // Construct the scatter object
-- 
1.7.3.1


------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Libmesh-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmesh-devel

Reply via email to