[cig-commits] [commit] knepley/upgrade-petsc-interface: Add ability to use subfield section in VecVisitor via argument to constructor. (9d55cac)
cig_noreply at geodynamics.org
cig_noreply at geodynamics.org
Fri Jan 17 17:20:40 PST 2014
Repository : ssh://geoshell/pylith
On branch : knepley/upgrade-petsc-interface
Link : https://github.com/geodynamics/pylith/compare/7a219dfd15d0b9fda084e39111a258bc97b47814...a289b5b9fb88708d2d1cdfbaf7bd2f3b7c8d91a4
>---------------------------------------------------------------
commit 9d55cacd0870d9fe6defe82c63297f70c2deb0b6
Author: Brad Aagaard <baagaard at usgs.gov>
Date: Fri Jan 17 17:17:45 2014 -0800
Add ability to use subfield section in VecVisitor via argument to constructor.
>---------------------------------------------------------------
9d55cacd0870d9fe6defe82c63297f70c2deb0b6
libsrc/pylith/topology/VisitorMesh.hh | 16 ++++++++++++++--
libsrc/pylith/topology/VisitorMesh.icc | 23 ++++++++++++++++++-----
2 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/libsrc/pylith/topology/VisitorMesh.hh b/libsrc/pylith/topology/VisitorMesh.hh
index 06da6e8..9b2c25b 100644
--- a/libsrc/pylith/topology/VisitorMesh.hh
+++ b/libsrc/pylith/topology/VisitorMesh.hh
@@ -45,18 +45,30 @@ public :
/** Constructor with field over a mesh.
*
+ * The optional subfield argument is designed to improve performance
+ * when the visitor is associated with a single subfield within a
+ * field.
+ *
* @param field Field over a mesh.
+ * @param subfield Name of subfield section to use instead of field section.
*/
- VecVisitorMesh(const Field& field);
+ VecVisitorMesh(const Field& field,
+ const char* subfield =0);
/// Default destructor
~VecVisitorMesh(void);
/** Initialize using field over a mesh or submesh.
*
+ * The optional subfield argument is designed to improve performance
+ * when the visitor is associated with a single subfield within a
+ * field.
+ *
* @param field Field over a mesh/submesh.
+ * @param subfield Name of subfield section to use instead of field section.
*/
- void initialize(const Field& field);
+ void initialize(const Field& field,
+ const char *subfield =0);
/// Clear cached data.
void clear(void);
diff --git a/libsrc/pylith/topology/VisitorMesh.icc b/libsrc/pylith/topology/VisitorMesh.icc
index 9024563..637518f 100644
--- a/libsrc/pylith/topology/VisitorMesh.icc
+++ b/libsrc/pylith/topology/VisitorMesh.icc
@@ -28,14 +28,15 @@
// ----------------------------------------------------------------------
// Constructor with field over a mesh.
inline
-pylith::topology::VecVisitorMesh::VecVisitorMesh(const Field& field) :
+pylith::topology::VecVisitorMesh::VecVisitorMesh(const Field& field,
+ const char* subfield) :
_dm(NULL),
_localVec(NULL),
_section(NULL),
_localArray(NULL)
{ // constructor
_dm = field.mesh().dmMesh();assert(_dm);
- initialize(field);
+ initialize(field, subfield);
} // constructor
// ----------------------------------------------------------------------
@@ -51,14 +52,26 @@ pylith::topology::VecVisitorMesh::~VecVisitorMesh(void)
// Initialized cached data members.
inline
void
-pylith::topology::VecVisitorMesh::initialize(const Field& field)
+pylith::topology::VecVisitorMesh::initialize(const Field& field,
+ const char* subfield)
{ // initialize
clear();
- _section = field.petscSection();assert(_section);
+ PetscErrorCode err;
+ PetscSection fieldSection = field.petscSection();assert(fieldSection);
+ PetscInt numFields = 0;
+ err = PetscSectionGetNumFields(fieldSection, &numFields);PYLITH_CHECK_ERROR(err);
+
+ if (!subfield || numFields < 2) {
+ _section = fieldSection;
+ } else {
+ const Field::Metadata fieldMetadata = field.subfieldMetadata(subfield);
+ assert(fieldMetadata.index >= 0 && fieldMetadata.index < numFields);
+ err = PetscSectionGetField(fieldSection, fieldMetadata.index, &_section);PYLITH_CHECK_ERROR(err);
+ } // if/else
_localVec = field.localVector();assert(_localVec);
- PetscErrorCode err = VecGetArray(_localVec, &_localArray);PYLITH_CHECK_ERROR(err);
+ err = VecGetArray(_localVec, &_localArray);PYLITH_CHECK_ERROR(err);
} // initialize
// ----------------------------------------------------------------------
More information about the CIG-COMMITS
mailing list