[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