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