[cig-commits] r21590 - short/3D/PyLith/trunk/unittests/libtests/topology

brad at geodynamics.org brad at geodynamics.org
Wed Mar 20 15:32:52 PDT 2013


Author: brad
Date: 2013-03-20 15:32:51 -0700 (Wed, 20 Mar 2013)
New Revision: 21590

Removed:
   short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsNewMesh.cc
   short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsNewMesh.hh
Modified:
   short/3D/PyLith/trunk/unittests/libtests/topology/Makefile.am
   short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldSubMesh.cc
   short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsMesh.cc
   short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsSubMesh.cc
   short/3D/PyLith/trunk/unittests/libtests/topology/TestMesh.cc
Log:
Code cleanup. Update to use visitors where applicable.

Modified: short/3D/PyLith/trunk/unittests/libtests/topology/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/topology/Makefile.am	2013-03-20 02:27:39 UTC (rev 21589)
+++ short/3D/PyLith/trunk/unittests/libtests/topology/Makefile.am	2013-03-20 22:32:51 UTC (rev 21590)
@@ -50,7 +50,6 @@
 	TestFieldSubMesh.hh \
 	TestFieldsMesh.hh \
 	TestFieldsSubMesh.hh \
-	TestFieldsNewMesh.hh \
 	TestSolutionFields.hh \
 	TestJacobian.hh \
 	TestRefineUniform.hh

Modified: short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldSubMesh.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldSubMesh.cc	2013-03-20 02:27:39 UTC (rev 21589)
+++ short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldSubMesh.cc	2013-03-20 22:32:51 UTC (rev 21590)
@@ -22,6 +22,8 @@
 
 #include "pylith/topology/Field.hh" // USES Field
 #include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/topology/Stratum.hh" // USES Stratum
+#include "pylith/topology/VisitorMesh.hh" // USES VecVisitorMesh
 
 #include "pylith/utils/array.hh" // USES scalar_array
 
@@ -31,9 +33,6 @@
 CPPUNIT_TEST_SUITE_REGISTRATION( pylith::topology::TestFieldSubMesh );
 
 // ----------------------------------------------------------------------
-typedef pylith::topology::SubMesh::SieveMesh SieveMesh;
-
-// ----------------------------------------------------------------------
 namespace pylith {
   namespace topology {
     namespace _TestFieldSubMesh {
@@ -140,23 +139,20 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
   Field<SubMesh> field(submesh);
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
   field.newSection(topology::FieldBase::VERTICES_FIELD, fiberDim);
   field.allocate();
-  PetscSection section = field.petscSection();
-  CPPUNIT_ASSERT(section);
 
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
+
+  VecVisitorMesh fieldVisitor(field);
   for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(section, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(fiberDim, dof);
-  }
+    CPPUNIT_ASSERT_EQUAL(fiberDim, fieldVisitor.sectionDof(v));
+  } // for
 } // testNewSectionPoints
 
 // ----------------------------------------------------------------------
@@ -169,24 +165,20 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
   Field<SubMesh> field(submesh);
   field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
   field.allocate();
-  PetscSection section = field.petscSection();
-  Vec          vec     = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
+
+  VecVisitorMesh fieldVisitor(field);
   for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(section, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(fiberDim, dof);
-  }
+    CPPUNIT_ASSERT_EQUAL(fiberDim, fieldVisitor.sectionDof(v));
+  } // for
 } // testNewSectionDomain
 
 // ----------------------------------------------------------------------
@@ -199,9 +191,6 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
   // Create field with atlas to use to create new field
   Field<SubMesh> fieldSrc(submesh);
@@ -212,16 +201,16 @@
   Field<SubMesh> field(submesh);
   field.newSection(fieldSrc, fiberDim2);
   field.allocate();
-  PetscSection section = field.petscSection();
-  Vec          vec     = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
+
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
+
+  VecVisitorMesh fieldVisitor(field);
   for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(section, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(fiberDim2, dof);
-  }
+    CPPUNIT_ASSERT_EQUAL(fiberDim2, fieldVisitor.sectionDof(v));
+  } // for
 } // testNewSectionChart
 
 // ----------------------------------------------------------------------
@@ -241,39 +230,36 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  PetscErrorCode err = 0;
+  PetscInt vStart, vEnd;
   err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
 
   // Create field with atlas to use to create new field
   Field<SubMesh> fieldSrc(submesh);
   { // Setup source field
     fieldSrc.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
-    PetscSection section = fieldSrc.petscSection();
-    CPPUNIT_ASSERT(section);
+    PetscSection section = fieldSrc.petscSection();CPPUNIT_ASSERT(section);
     int iV=0;
     for(PetscInt v = vStart; v < vEnd; ++v) {
       err = PetscSectionAddConstraintDof(section, v, nconstraints[iV++]);CHECK_PETSC_ERROR(err);
-    }
+    } // for
     fieldSrc.allocate();
 
     int index = 0;
     iV = 0;
     for(PetscInt v = vStart; v < vEnd; ++v, index += nconstraints[iV++]) {
       err = PetscSectionSetConstraintIndices(section, v, (PetscInt *) &constraints[index]);CHECK_PETSC_ERROR(err);
-    }
+    } // for
     fieldSrc.zero();
   } // Setup source field
 
-
   Field<SubMesh> field(submesh);
   field.cloneSection(fieldSrc);
-  PetscSection section = field.petscSection();
-  Vec          vec     = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
+  PetscSection section = field.petscSection();CPPUNIT_ASSERT(section);
+  PetscVec vec = field.localVector();CPPUNIT_ASSERT(vec);
+
   int iV = 0;
   for(PetscInt v = vStart; v < vEnd; ++v) {
     PetscInt dof, cdof;
@@ -321,44 +307,35 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-
   Field<SubMesh> field(submesh);
   field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
   field.allocate();
-  PetscSection section = field.petscSection();
-  Vec          vec     = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
 
-  PetscScalar *array;
-  PetscInt     i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
 
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+  VecVisitorMesh fieldVisitor(field);
+  PetscScalar* fieldArray = fieldVisitor.localArray();
+
+  for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+    const PetscInt off = fieldVisitor.sectionOffset(v);
     for(PetscInt d = 0; d < fiberDim; ++d)
-      array[off+d] = valuesNondim[i++];
+      fieldArray[off+d] = valuesNondim[i++];
   } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
+  fieldVisitor.clear();
 
+  fieldVisitor.initialize(field);
+  fieldArray = fieldVisitor.localArray();
   const PylithScalar tolerance = 1.0e-6;
-  i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
-
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+  for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+    const PetscInt off = fieldVisitor.sectionOffset(v);
     for(PetscInt d = 0; d < fiberDim; ++d) {
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesNondim[i++], array[off+d], tolerance);
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesNondim[i++], fieldArray[off+d], tolerance);
     } // for
   } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
 } // testAllocate
 
 // ----------------------------------------------------------------------
@@ -377,46 +354,37 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-
   Field<SubMesh> field(submesh);
   field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
   field.allocate();
-  PetscSection section = field.petscSection();
-  Vec          vec     = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
 
-  PetscScalar *array;
-  PetscInt     i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
 
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+  VecVisitorMesh fieldVisitor(field);
+  PetscScalar* fieldArray = fieldVisitor.localArray();
+
+  for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+    const PetscInt off = fieldVisitor.sectionOffset(v);
     for(PetscInt d = 0; d < fiberDim; ++d)
-      array[off+d] = valuesNondim[i++];
+      fieldArray[off+d] = valuesNondim[i++];
   } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
+  fieldVisitor.clear();
 
   field.zero();
 
+  fieldVisitor.initialize(field);
+  fieldArray = fieldVisitor.localArray();
   const PylithScalar tolerance = 1.0e-6;
-  i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
   for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
-
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+    const PetscInt off = fieldVisitor.sectionOffset(v);
     for(PetscInt d = 0; d < fiberDim; ++d) {
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, array[off+d], tolerance);
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, fieldArray[off+d], tolerance);
     } // for
   } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
 } // testZero
 
 // ----------------------------------------------------------------------
@@ -435,47 +403,37 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
 
   Field<SubMesh> field(submesh);
-  field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
-  field.allocate();
-  PetscSection section = field.petscSection();
-  Vec          vec     = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
+  { // setup field
+    field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
+    field.allocate();
+    VecVisitorMesh fieldVisitor(field);
+    PetscScalar* fieldArray = fieldVisitor.localArray();
 
-  PetscScalar *array;
-  PetscInt     i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
+    for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+      const PetscInt off = fieldVisitor.sectionOffset(v);
+      for(PetscInt d = 0; d < fiberDim; ++d)
+	fieldArray[off+d] = valuesNondim[i++];
+    } // for
+  } // setup field
 
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
-    for(PetscInt d = 0; d < fiberDim; ++d)
-      array[off+d] = valuesNondim[i++];
-  } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
-
   field.complete();
 
-  // Expect no change for this serial test
+  VecVisitorMesh fieldVisitor(field);
+  const PetscScalar* fieldArray = fieldVisitor.localArray();
   const PylithScalar tolerance = 1.0e-6;
-  i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
-
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+  for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+    const PetscInt off = fieldVisitor.sectionOffset(v);
     for(PetscInt d = 0; d < fiberDim; ++d) {
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesNondim[i++], array[off+d], tolerance);
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesNondim[i++], fieldArray[off+d], tolerance);
     } // for
   } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
 } // testComplete
 
 // ----------------------------------------------------------------------
@@ -494,56 +452,40 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
 
   Field<SubMesh> fieldSrc(submesh);
-  { // Setup source field
+  { // setup source field
     fieldSrc.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
     fieldSrc.allocate();
-    PetscSection section = fieldSrc.petscSection();
-    Vec          vec     = fieldSrc.localVector();
-    CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
-    
-    PetscScalar *array;
-    PetscInt     i = 0;
-    err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-    for(PetscInt v = vStart; v < vEnd; ++v) {
-      PetscInt off;
+    VecVisitorMesh fieldVisitor(fieldSrc);
+    PetscScalar* fieldArray = fieldVisitor.localArray();
 
-      err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+    for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+      const PetscInt off = fieldVisitor.sectionOffset(v);
       for(PetscInt d = 0; d < fiberDim; ++d)
-        array[off+d] = valuesNondim[i++];
+	fieldArray[off+d] = valuesNondim[i++];
     } // for
-    err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
-  } // Setup source field
+  } // setup source field
 
   Field<SubMesh> field(submesh);
   field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
   field.allocate();
-  PetscSection section = field.petscSection();
-  Vec          vec     = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
-
   field.copy(fieldSrc);
 
+  VecVisitorMesh fieldVisitor(field);
+  const PetscScalar* fieldArray = fieldVisitor.localArray();
   const PylithScalar tolerance = 1.0e-6;
-  PetscScalar *array;
-  PetscInt i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
-
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+  for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+    const PetscInt off = fieldVisitor.sectionOffset(v);
     for(PetscInt d = 0; d < fiberDim; ++d) {
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesNondim[i++], array[off+d], tolerance);
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesNondim[i++], fieldArray[off+d], tolerance);
     } // for
   } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
 } // testCopy
 
 // ----------------------------------------------------------------------
@@ -567,71 +509,51 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
 
   Field<SubMesh> fieldSrc(submesh);
-  { // Setup source field
+  { // setup source field
     fieldSrc.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
     fieldSrc.allocate();
-    PetscSection section = fieldSrc.petscSection();
-    Vec          vec     = fieldSrc.localVector();
-    CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
-    
-    PetscScalar *array;
-    PetscInt     i = 0;
-    err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-    for(PetscInt v = vStart; v < vEnd; ++v) {
-      PetscInt off;
+    VecVisitorMesh fieldVisitor(fieldSrc);
+    PetscScalar* fieldArray = fieldVisitor.localArray();
 
-      err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+    for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+      const PetscInt off = fieldVisitor.sectionOffset(v);
       for(PetscInt d = 0; d < fiberDim; ++d)
-        array[off+d] = valuesA[i++];
+	fieldArray[off+d] = valuesA[i++];
     } // for
-    err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
-  } // Setup source field
+  } // setup source field
 
   Field<SubMesh> field(submesh);
-  field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
-  field.allocate();
-  PetscSection section = field.petscSection();
-  Vec          vec     = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
-  { // Setup destination field
+  { // setup destination field
+    field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
+    field.allocate();
+    VecVisitorMesh fieldVisitor(field);
+    PetscScalar* fieldArray = fieldVisitor.localArray();
 
-    PetscScalar *array;
-    PetscInt     i = 0;
-    err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-    for(PetscInt v = vStart; v < vEnd; ++v) {
-      PetscInt off;
-
-      err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+    for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+      const PetscInt off = fieldVisitor.sectionOffset(v);
       for(PetscInt d = 0; d < fiberDim; ++d)
-        array[off+d] = valuesB[i++];
+	fieldArray[off+d] = valuesB[i++];
     } // for
-    err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
-  } // Setup destination field
+  } // setup destination field
 
   field += fieldSrc;
 
+  VecVisitorMesh fieldVisitor(field);
+  const PetscScalar* fieldArray = fieldVisitor.localArray();
   const PylithScalar tolerance = 1.0e-6;
-  PetscScalar *array;
-  PetscInt i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
-
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
-    for(PetscInt d = 0; d < fiberDim; ++d) {
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesA[i] + valuesB[i], array[off+d], tolerance);
-      ++i;
+  for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+    const PetscInt off = fieldVisitor.sectionOffset(v);
+    for(PetscInt d = 0; d < fiberDim; ++d, ++i) {
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesA[i] + valuesB[i], fieldArray[off+d], tolerance);
     } // for
   } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
 } // testOperateAdd
 
 // ----------------------------------------------------------------------
@@ -650,48 +572,39 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
 
   Field<SubMesh> field(submesh);
-  field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
-  field.allocate();
-  PetscSection section = field.petscSection();
-  Vec          vec     = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
+  { // setup field
+    field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
+    field.allocate();
+    VecVisitorMesh fieldVisitor(field);
+    PetscScalar* fieldArray = fieldVisitor.localArray();
 
-  PetscScalar *array;
-  PetscInt     i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
+    for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+      const PetscInt off = fieldVisitor.sectionOffset(v);
+      for(PetscInt d = 0; d < fiberDim; ++d)
+	fieldArray[off+d] = valuesNondim[i++];
+    } // for
+  } // setup field
 
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
-    for(PetscInt d = 0; d < fiberDim; ++d)
-      array[off+d] = valuesNondim[i++];
-  } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
-
   field.scale(scale);
   field.addDimensionOkay(true);
   field.dimensionalize();
 
   const PylithScalar tolerance = 1.0e-6;
-  i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
-
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+  VecVisitorMesh fieldVisitor(field);
+  PetscScalar* fieldArray = fieldVisitor.localArray();
+  for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+    const PetscInt off = fieldVisitor.sectionOffset(v);
     for(PetscInt d = 0; d < fiberDim; ++d) {
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesNondim[i++]*scale, array[off+d], tolerance);
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesNondim[i++]*scale, fieldArray[off+d], tolerance);
     } // for
   } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
 } // testDimensionalize
 
 // ----------------------------------------------------------------------
@@ -710,31 +623,22 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
+  PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
 
   Field<SubMesh> field(submesh);
   field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
   field.allocate();
-  PetscSection section = field.petscSection();
-  Vec          vec     = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(vec);
-
-  PetscScalar *array;
-  PetscInt     i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
-
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
+  VecVisitorMesh fieldVisitor(field);
+  PetscScalar* fieldArray = fieldVisitor.localArray();
+  for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+    const PetscInt off = fieldVisitor.sectionOffset(v);
     for(PetscInt d = 0; d < fiberDim; ++d)
-      array[off+d] = valuesNondim[i++];
+      fieldArray[off+d] = valuesNondim[i++];
   } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
 
   field.view("Testing view");
 } // testView
@@ -749,21 +653,19 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-
   Field<SubMesh> field(submesh);
   field.newSection(FieldBase::VERTICES_FIELD, fiberDim);
   field.allocate();
-  
-  const int sizeE = (vEnd-vStart) * fiberDim;
-  
+
   CPPUNIT_ASSERT_EQUAL(size_t(0), field._scatters.size());
   field.createScatter(submesh);
+
+  DM dmMesh = submesh.dmMesh();
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
+
   CPPUNIT_ASSERT_EQUAL(size_t(1), field._scatters.size());
   const Field<SubMesh>::ScatterInfo& sinfo = field._getScatter("");
   CPPUNIT_ASSERT(sinfo.dm);
@@ -771,6 +673,7 @@
 
   int size = 0;
   VecGetSize(sinfo.vector, &size);
+  const int sizeE = (vEnd-vStart) * fiberDim;  
   CPPUNIT_ASSERT_EQUAL(sizeE, size);
 
   // Make sure we can do multiple calls to createScatter().
@@ -807,28 +710,27 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-
   Field<SubMesh> field(submesh);
   field.newSection(FieldBase::VERTICES_FIELD, fiberDim);
   field.allocate();
   
-  const int sizeE = (vEnd-vStart) * fiberDim;
-
   CPPUNIT_ASSERT_EQUAL(size_t(0), field._scatters.size());
   field.createScatterWithBC(submesh);
   CPPUNIT_ASSERT_EQUAL(size_t(1), field._scatters.size());
+
+  DM dmMesh = submesh.dmMesh();
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
+
   const Field<SubMesh>::ScatterInfo& sinfo = field._getScatter("");
   CPPUNIT_ASSERT(sinfo.dm);
   CPPUNIT_ASSERT(sinfo.vector);
 
   int size = 0;
   VecGetSize(sinfo.vector, &size);
+  const int sizeE = (vEnd-vStart) * fiberDim;
   CPPUNIT_ASSERT_EQUAL(sizeE, size);
 
   // Make sure we can do multiple calls to createScatterWithBC().
@@ -865,13 +767,7 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
-  DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-
   Field<SubMesh> field(submesh);
   field.newSection(FieldBase::VERTICES_FIELD, fiberDim);
   field.allocate();
@@ -883,10 +779,14 @@
   CPPUNIT_ASSERT(sinfo.dm);
   CPPUNIT_ASSERT(sinfo.vector);
 
+  DM dmMesh = submesh.dmMesh();
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
   const PetscVec vec = field.vector();
   CPPUNIT_ASSERT_EQUAL(sinfo.vector, vec);
   int size = 0;
-  err = VecGetSize(vec, &size);CHECK_PETSC_ERROR(err);
+  PetscErrorCode err = VecGetSize(vec, &size);CHECK_PETSC_ERROR(err);
   const int sizeE = (vEnd-vStart) * fiberDim;
   CPPUNIT_ASSERT_EQUAL(sizeE, size);
 } // testVector
@@ -907,39 +807,34 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
+
   DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-
   Field<SubMesh> field(submesh);
-  field.newSection(FieldBase::VERTICES_FIELD, fiberDim);
-  field.allocate();
-  PetscSection section = field.petscSection();
-  Vec          secvec  = field.localVector();
-  CPPUNIT_ASSERT(section);CPPUNIT_ASSERT(secvec);
+  { // setup field
+    field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
+    field.allocate();
+    VecVisitorMesh fieldVisitor(field);
+    PetscScalar* fieldArray = fieldVisitor.localArray();
 
-  PetscScalar *array;
-  PetscInt     i = 0;
-  err = VecGetArray(secvec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
+    for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+      const PetscInt off = fieldVisitor.sectionOffset(v);
+      for(PetscInt d = 0; d < fiberDim; ++d)
+	fieldArray[off+d] = valuesE[i++];
+    } // for
+  } // setup field
 
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
-    for(PetscInt d = 0; d < fiberDim; ++d)
-      array[off+d] = valuesE[i++];
-  } // for
-  err = VecRestoreArray(secvec, &array);CHECK_PETSC_ERROR(err);
-
   field.createScatter(submesh, context);
   field.scatterSectionToVector(context);
-  const PetscVec vec = field.vector(context);
-  CPPUNIT_ASSERT(0 != vec);
-  int size = 0;
+
+  PetscErrorCode err = 0;
+  const PetscVec vec = field.vector(context);CPPUNIT_ASSERT(vec);
+  PetscInt size = 0;
   err = VecGetSize(vec, &size);CHECK_PETSC_ERROR(err);
-  PylithScalar* valuesVec = 0;
+  PetscScalar* valuesVec = NULL;
   err = VecGetArray(vec, &valuesVec);CHECK_PETSC_ERROR(err);
 
   const PylithScalar tolerance = 1.0e-06;
@@ -966,25 +861,20 @@
   Mesh mesh;
   SubMesh submesh;
   _buildMesh(&mesh, &submesh);
+
   DM dmMesh = submesh.dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-
   Field<SubMesh> field(submesh);
-  field.newSection(FieldBase::VERTICES_FIELD, fiberDim);
+  field.newSection(Field<SubMesh>::VERTICES_FIELD, fiberDim);
   field.allocate();
-  PetscSection section = field.petscSection();
-  CPPUNIT_ASSERT(section);
   field.createScatter(submesh, context);
-
-  const PetscVec vec = field.vector(context);
-  CPPUNIT_ASSERT(0 != vec);
-  int size = 0;
-  err = VecGetSize(vec, &size);CHECK_PETSC_ERROR(err);
-  PylithScalar* valuesVec = 0;
+  const PetscVec vec = field.vector(context);CPPUNIT_ASSERT(vec);
+  PetscInt size = 0;
+  PetscErrorCode err = VecGetSize(vec, &size);CHECK_PETSC_ERROR(err);
+  PetscScalar* valuesVec = NULL;
   err = VecGetArray(vec, &valuesVec);CHECK_PETSC_ERROR(err);
 
   const PylithScalar tolerance = 1.0e-06;
@@ -993,20 +883,6 @@
   for (int i=0; i < sizeE; ++i)
     valuesVec[i] = valuesE[i];
   err = VecRestoreArray(vec, &valuesVec);CHECK_PETSC_ERROR(err);
-
-  field.scatterVectorToSection(context);
-
-  PetscScalar *array;
-  PetscInt     i = 0;
-  err = VecGetArray(vec, &array);CHECK_PETSC_ERROR(err);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt off;
-
-    err = PetscSectionGetOffset(section, v, &off);CHECK_PETSC_ERROR(err);
-    for(PetscInt d = 0; d < fiberDim; ++d)
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesE[i++], array[off+d], tolerance);
-  } // for
-  err = VecRestoreArray(vec, &array);CHECK_PETSC_ERROR(err);
 } // testScatterVectorToSection
 
 // ----------------------------------------------------------------------
@@ -1014,25 +890,9 @@
 pylith::topology::TestFieldSubMesh::_buildMesh(Mesh* mesh,
 					       SubMesh* submesh)
 { // _buildMesh
-  assert(0 != mesh);
-  assert(0 != submesh);
+  assert(mesh);
+  assert(submesh);
 
-  mesh->createSieveMesh(_TestFieldSubMesh::cellDim);
-  const ALE::Obj<Mesh::SieveMesh>& sieveMesh = mesh->sieveMesh();
-  CPPUNIT_ASSERT(!sieveMesh.isNull());
-
-  ALE::Obj<Mesh::SieveMesh::sieve_type> sieve = 
-    new Mesh::SieveMesh::sieve_type(sieveMesh->comm());
-  CPPUNIT_ASSERT(!sieve.isNull());
-
-  ALE::Obj<SieveFlexMesh::sieve_type> s = 
-    new SieveFlexMesh::sieve_type(sieve->comm(), sieve->debug());
-  CPPUNIT_ASSERT(!s.isNull());
-
-  mesh->createDMMesh(_TestFieldSubMesh::cellDim);
-  DM dmMesh = mesh->dmMesh();
-  PetscErrorCode err;
-  
   const int cellDim = _TestFieldSubMesh::cellDim;
   const int ncells = _TestFieldSubMesh::ncells;
   const int* cells = _TestFieldSubMesh::cells;
@@ -1041,75 +901,56 @@
   const int spaceDim = _TestFieldSubMesh::cellDim;
   const PylithScalar* coordinates = _TestFieldSubMesh::coordinates;
   const bool interpolate = false;
-  ALE::SieveBuilder<SieveFlexMesh>::buildTopology(s, cellDim, ncells, (int*) cells,
-					      nvertices, interpolate, 
-					      ncorners);
-  std::map<Mesh::SieveMesh::point_type,Mesh::SieveMesh::point_type> renumbering;
-  ALE::ISieveConverter::convertSieve(*s, *sieve, renumbering);
-  sieveMesh->setSieve(sieve);
-  sieveMesh->stratify();
-  ALE::SieveBuilder<SieveMesh>::buildCoordinates(sieveMesh, spaceDim, 
-						 coordinates);
-  
+
+  PetscErrorCode err = 0;
+
+  mesh->createDMMesh(_TestFieldSubMesh::cellDim);
+  PetscDM dmMesh = mesh->dmMesh();CPPUNIT_ASSERT(dmMesh);  
   err = DMPlexSetChart(dmMesh, 0, ncells+nvertices);CHECK_PETSC_ERROR(err);
   for(PetscInt c = 0; c < ncells; ++c) {
     err = DMPlexSetConeSize(dmMesh, c, ncorners);CHECK_PETSC_ERROR(err);
-  }
+  } // for
   err = DMSetUp(dmMesh);CHECK_PETSC_ERROR(err);
   PetscInt *cone = new PetscInt[ncorners];
   for(PetscInt c = 0; c < ncells; ++c) {
     for(PetscInt v = 0; v < ncorners; ++v) {
       cone[v] = cells[c*ncorners+v]+ncells;
-    }
+    } // for
     err = DMPlexSetCone(dmMesh, c, cone);CHECK_PETSC_ERROR(err);
   } // for
-  delete [] cone; cone = 0;
+  delete[] cone; cone = 0;
   err = DMPlexSymmetrize(dmMesh);CHECK_PETSC_ERROR(err);
   err = DMPlexStratify(dmMesh);CHECK_PETSC_ERROR(err);
-  PetscSection coordSection;
-  Vec          coordVec;
-  PetscScalar *coords;
-  PetscInt     coordSize;
 
+  PetscSection coordSection = NULL;
+  PetscVec coordVec = NULL;
+  PetscScalar *coords = NULL;
+  PetscInt coordSize = 0;
   err = DMPlexGetCoordinateSection(dmMesh, &coordSection);CHECK_PETSC_ERROR(err);
   err = PetscSectionSetChart(coordSection, ncells, ncells+nvertices);CHECK_PETSC_ERROR(err);
   for(PetscInt v = ncells; v < ncells+nvertices; ++v) {
     err = PetscSectionSetDof(coordSection, v, spaceDim);CHECK_PETSC_ERROR(err);
-  }
+  } // for
   err = PetscSectionSetUp(coordSection);CHECK_PETSC_ERROR(err);
   err = PetscSectionGetStorageSize(coordSection, &coordSize);CHECK_PETSC_ERROR(err);
-  err = VecCreate(sieveMesh->comm(), &coordVec);CHECK_PETSC_ERROR(err);
+  err = VecCreate(mesh->comm(), &coordVec);CHECK_PETSC_ERROR(err);
   err = VecSetSizes(coordVec, coordSize, PETSC_DETERMINE);CHECK_PETSC_ERROR(err);
   err = VecSetFromOptions(coordVec);CHECK_PETSC_ERROR(err);
   err = VecGetArray(coordVec, &coords);CHECK_PETSC_ERROR(err);
   for(PetscInt v = 0; v < nvertices; ++v) {
     PetscInt off;
-
     err = PetscSectionGetOffset(coordSection, v+ncells, &off);CHECK_PETSC_ERROR(err);
     for(PetscInt d = 0; d < spaceDim; ++d) {
       coords[off+d] = coordinates[v*spaceDim+d];
-    }
-  }
+    } // for
+  } // for
   err = VecRestoreArray(coordVec, &coords);CHECK_PETSC_ERROR(err);
   err = DMSetCoordinatesLocal(dmMesh, coordVec);CHECK_PETSC_ERROR(err);
 
-  typedef Mesh::SieveMesh::int_section_type::chart_type chart_type;
-  const ALE::Obj<SieveMesh::int_section_type>& groupField = 
-    sieveMesh->getIntSection(_TestFieldSubMesh::label);
-  assert(!groupField.isNull());
-
   const int numPoints = _TestFieldSubMesh::groupSize;
-  const int numVertices = sieveMesh->depthStratum(0)->size();
-  const int numCells = sieveMesh->heightStratum(0)->size();
-  groupField->setChart(chart_type(numCells, numCells+numVertices));
-  for(int i=0; i < numPoints; ++i)
-    groupField->setFiberDimension(numCells+_TestFieldSubMesh::groupVertices[i],
-				  1);
-  sieveMesh->allocate(groupField);
-
   for(PetscInt i = 0; i < numPoints; ++i) {
     err = DMPlexSetLabelValue(dmMesh, _TestFieldSubMesh::label, ncells+_TestFieldSubMesh::groupVertices[i], 1);CHECK_PETSC_ERROR(err);
-  }
+  } // for
 
   spatialdata::geocoords::CSCart cs;
   cs.setSpaceDim(spaceDim);

Modified: short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsMesh.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsMesh.cc	2013-03-20 02:27:39 UTC (rev 21589)
+++ short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsMesh.cc	2013-03-20 22:32:51 UTC (rev 21590)
@@ -23,6 +23,8 @@
 #include "pylith/topology/Mesh.hh" // USES Mesh
 #include "pylith/topology/Field.hh" // USES Field
 #include "pylith/topology/Fields.hh" // USES Fields
+#include "pylith/topology/Stratum.hh" // USES Stratum
+#include "pylith/topology/VisitorMesh.hh" // USES VecVisitorMesh
 
 #include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
 
@@ -31,8 +33,6 @@
 
 // ----------------------------------------------------------------------
 typedef pylith::topology::Fields<pylith::topology::Field<pylith::topology::Mesh> > FieldsMesh;
-typedef pylith::topology::Mesh::RealSection RealSection;
-typedef pylith::topology::Mesh::SieveMesh SieveMesh;
 
 // ----------------------------------------------------------------------
 void
@@ -56,7 +56,7 @@
 void
 pylith::topology::TestFieldsMesh::testConstructor(void)
 { // testConstructor
-  CPPUNIT_ASSERT(0 != _mesh);
+  CPPUNIT_ASSERT(_mesh);
   FieldsMesh fields(*_mesh);
 } // testConstructor
  
@@ -65,7 +65,7 @@
 void
 pylith::topology::TestFieldsMesh::testAdd(void)
 { // testAdd
-  CPPUNIT_ASSERT(0 != _mesh);
+  CPPUNIT_ASSERT(_mesh);
   FieldsMesh fields(*_mesh);
   
   const char* label = "field";
@@ -81,15 +81,9 @@
 { // testAddDomain
   const int fiberDim = 3;
 
-  CPPUNIT_ASSERT(0 != _mesh);
+  CPPUNIT_ASSERT(_mesh);
   FieldsMesh fields(*_mesh);
-  DM dmMesh = _mesh->dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-  
   const char* label = "field";
   fields.add(label, "velocity", Field<Mesh>::VERTICES_FIELD, fiberDim);
   const size_t size = 1;
@@ -97,13 +91,16 @@
 
   Field<Mesh>& field = fields.get(label);
   field.allocate();
-  PetscSection section = field.petscSection();
-  CPPUNIT_ASSERT(section);
+
+  PetscDM dmMesh = _mesh->dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
+  
+  VecVisitorMesh fieldVisitor(field);
   for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(section, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(fiberDim, dof);
-  }
+    CPPUNIT_ASSERT_EQUAL(fiberDim, fieldVisitor.sectionDof(v));
+  } // for
 } // testAddDomain
 
 // ----------------------------------------------------------------------
@@ -111,7 +108,7 @@
 void
 pylith::topology::TestFieldsMesh::testDelete(void)
 { // testDelete
-  CPPUNIT_ASSERT(0 != _mesh);
+  CPPUNIT_ASSERT(_mesh);
   FieldsMesh fields(*_mesh);
 
   const char* labelA = "field A";
@@ -134,7 +131,7 @@
 void
 pylith::topology::TestFieldsMesh::testGet(void)
 { // testGet
-  CPPUNIT_ASSERT(0 != _mesh);
+  CPPUNIT_ASSERT(_mesh);
   FieldsMesh fields(*_mesh);
 
   const char* label = "field";
@@ -147,14 +144,14 @@
 void
 pylith::topology::TestFieldsMesh::testGetConst(void)
 { // testGetConst
-  CPPUNIT_ASSERT(0 != _mesh);
+  CPPUNIT_ASSERT(_mesh);
   FieldsMesh fields(*_mesh);
 
   const char* label = "field";
   fields.add(label, "velocity");
 
   const FieldsMesh* fieldsPtr = &fields;
-  CPPUNIT_ASSERT(0 != fieldsPtr);
+  CPPUNIT_ASSERT(fieldsPtr);
   const Field<Mesh>& field = fieldsPtr->get(label);
 } // testGetConst
 
@@ -163,7 +160,7 @@
 void
 pylith::topology::TestFieldsMesh::testHasField(void)
 { // testHasField
-  CPPUNIT_ASSERT(0 != _mesh);
+  CPPUNIT_ASSERT(_mesh);
   FieldsMesh fields(*_mesh);
 
   fields.add("field A", "velocity");
@@ -187,15 +184,9 @@
 { // testCopyLayout
   const int fiberDim = 3;
 
-  CPPUNIT_ASSERT(0 != _mesh);
+  CPPUNIT_ASSERT(_mesh);
   FieldsMesh fields(*_mesh);
-  DM dmMesh = _mesh->dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-
   const char* labelA = "field A";
   fields.add(labelA, "displacement", Field<Mesh>::VERTICES_FIELD, fiberDim);
 
@@ -208,14 +199,17 @@
 
   const size_t size = 2;
   CPPUNIT_ASSERT_EQUAL(size, fields._fields.size());
+
+  PetscDM dmMesh = _mesh->dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
+  
   const Field<Mesh>& field = fields.get(labelB);
-  PetscSection section = field.petscSection();
-  CPPUNIT_ASSERT(section);
+  VecVisitorMesh fieldVisitor(field);
   for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(section, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(fiberDim, dof);
-  }
+    CPPUNIT_ASSERT_EQUAL(fiberDim, fieldVisitor.sectionDof(v));
+  } // for
 } // testCopyLayout
 
 

Deleted: short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsNewMesh.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsNewMesh.cc	2013-03-20 02:27:39 UTC (rev 21589)
+++ short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsNewMesh.cc	2013-03-20 22:32:51 UTC (rev 21590)
@@ -1,431 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard, U.S. Geological Survey
-// Charles A. Williams, GNS Science
-// Matthew G. Knepley, University of Chicago
-//
-// This code was developed as part of the Computational Infrastructure
-// for Geodynamics (http://geodynamics.org).
-//
-// Copyright (c) 2010-2012 University of California, Davis
-//
-// See COPYING for license information.
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFieldsNewMesh.hh" // Implementation of class methods
-
-#include "pylith/topology/Mesh.hh" // USES Mesh
-#include "pylith/topology/Field.hh" // USES Field
-#include "pylith/topology/FieldsNew.hh" // USES FieldsNew
-
-#include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::topology::TestFieldsNewMesh );
-
-// ----------------------------------------------------------------------
-typedef pylith::topology::FieldsNew<pylith::topology::Mesh> FieldsNewMesh;
-typedef pylith::topology::Mesh::SieveMesh SieveMesh;
-typedef pylith::topology::Mesh::RealUniformSection RealUniformSection;
-
-// ----------------------------------------------------------------------
-void
-pylith::topology::TestFieldsNewMesh::setUp(void)
-{ // setUp
-  _mesh = new Mesh;
-  meshio::MeshIOAscii importer;
-  importer.filename("data/tri3.mesh");
-  importer.read(_mesh);
-} // setUp
-
-// ----------------------------------------------------------------------
-void
-pylith::topology::TestFieldsNewMesh::tearDown(void)
-{ // tearDown
-  delete _mesh; _mesh = 0;
-} // tearDown
-
-// ----------------------------------------------------------------------
-// Test constructor.
-void
-pylith::topology::TestFieldsNewMesh::testConstructor(void)
-{ // testConstructor
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-} // testConstructor
- 
-// ----------------------------------------------------------------------
-// Test hasField().
-void
-pylith::topology::TestFieldsNewMesh::testHasField(void)
-{ // testHasField
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  
-  CPPUNIT_ASSERT_EQUAL(true, fields.hasField("field A"));
-  CPPUNIT_ASSERT_EQUAL(false, fields.hasField("field B"));
-  CPPUNIT_ASSERT_EQUAL(false, fields.hasField("field C"));
-
-  fields.add("field B", "displacement", 3, FieldBase::VECTOR);
-
-  CPPUNIT_ASSERT_EQUAL(true, fields.hasField("field A"));
-  CPPUNIT_ASSERT_EQUAL(true, fields.hasField("field B"));
-  CPPUNIT_ASSERT_EQUAL(false, fields.hasField("field C"));
-
-} // testHasField
-
-// ----------------------------------------------------------------------
-// Test add().
-void
-pylith::topology::TestFieldsNewMesh::testAdd(void)
-{ // testAdd
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-  
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "displacement", 4, FieldBase::OTHER, 2.0, true);
-
-  const size_t size = 2;
-  CPPUNIT_ASSERT_EQUAL(size, fields._fields.size());
-} // testAdd
-
-// ----------------------------------------------------------------------
-// Test allocate(sequence).
-void
-pylith::topology::TestFieldsNewMesh::testAllocateSequence(void)
-{ // testAllocateSequence
-  const int fiberDim = 7;
-
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-  
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "other", 4, FieldBase::OTHER);
-
-  const ALE::Obj<SieveMesh>& sieveMesh = _mesh->sieveMesh();
-  CPPUNIT_ASSERT(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& vertices = 
-    sieveMesh->depthStratum(0);
-  CPPUNIT_ASSERT(!vertices.isNull());
-
-  fields.allocate(vertices);
-
-  const size_t size = 2;
-  CPPUNIT_ASSERT_EQUAL(size, fields._fields.size());
-
-  const ALE::Obj<RealUniformSection>& section = fields.section();
-  CPPUNIT_ASSERT(!section.isNull());
-  for (SieveMesh::label_sequence::iterator v_iter=vertices->begin();
-       v_iter != vertices->end();
-       ++v_iter)
-    CPPUNIT_ASSERT_EQUAL(fiberDim, section->getFiberDimension(*v_iter));
-} // testAllocateSequence
-
-// ----------------------------------------------------------------------
-// Test allocate(array).
-void
-pylith::topology::TestFieldsNewMesh::testAllocateArray(void)
-{ // testAllocateSequence
-  const int fiberDim = 7;
-  const int nptsIn = 3;
-  const int ptsIn[nptsIn] = {
-    1, 3, 4,
-  };
-  const int nptsOut = 1;
-  const int ptsOut[nptsOut] = {
-    2,
-  };
-
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-  
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "other", 4, FieldBase::OTHER);
-
-  int_array verticesIn(nptsIn);
-  for (int i=0; i < nptsIn; ++i)
-    verticesIn = ptsIn[i];
-
-  int_array verticesOut(nptsOut);
-  for (int i=0; i < nptsOut; ++i)
-    verticesOut = ptsOut[i];
-
-  fields.allocate(verticesIn);
-
-  const size_t size = 2;
-  CPPUNIT_ASSERT_EQUAL(size, fields._fields.size());
-
-  const ALE::Obj<RealUniformSection>& section = fields.section();
-  CPPUNIT_ASSERT(!section.isNull());
-  for (int i=0; i < nptsIn; ++i)
-    CPPUNIT_ASSERT_EQUAL(fiberDim, section->getFiberDimension(verticesIn[i]));
-  for (int i=0; i < nptsOut; ++i)
-    CPPUNIT_ASSERT_EQUAL(0, section->getFiberDimension(verticesOut[i]));
-} // testAllocateArray
-
-// ----------------------------------------------------------------------
-// Test allocate(domain).
-void
-pylith::topology::TestFieldsNewMesh::testAllocateDomain(void)
-{ // testAllocateDomain
-  const int fiberDim = 7;
-
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-  
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "other", 4, FieldBase::OTHER);
-  fields.allocate(Field<Mesh>::VERTICES_FIELD);
-
-  const size_t size = 2;
-  CPPUNIT_ASSERT_EQUAL(size, fields._fields.size());
-
-  const ALE::Obj<RealUniformSection>& section = fields.section();
-  CPPUNIT_ASSERT(!section.isNull());
-  const ALE::Obj<SieveMesh>& sieveMesh = _mesh->sieveMesh();
-  CPPUNIT_ASSERT(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& vertices = 
-    sieveMesh->depthStratum(0);
-  CPPUNIT_ASSERT(!vertices.isNull());
-  for (SieveMesh::label_sequence::iterator v_iter=vertices->begin();
-       v_iter != vertices->end();
-       ++v_iter)
-    CPPUNIT_ASSERT_EQUAL(fiberDim, section->getFiberDimension(*v_iter));
-} // testAllocateDomain
-
-// ----------------------------------------------------------------------
-// Test get().
-void
-pylith::topology::TestFieldsNewMesh::testGet(void)
-{ // testGet
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-  DM dmMesh = _mesh->dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
-
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "displacement", 4, FieldBase::OTHER, 2.0, true);
-  fields.allocate(FieldBase::VERTICES_FIELD);
-
-  // Check field A
-  Field<Mesh>& fieldA = fields.get("field A");
-  CPPUNIT_ASSERT_EQUAL(std::string("velocity"), std::string(fieldA.label()));
-  CPPUNIT_ASSERT_EQUAL(FieldBase::VECTOR,
-		       fieldA.vectorFieldType());
-  CPPUNIT_ASSERT_EQUAL(PylithScalar(1.0), fieldA.scale());
-  CPPUNIT_ASSERT_EQUAL(false, fieldA.addDimensionOkay());
-
-  PetscSection sectionA = fieldA.petscSection();
-  CPPUNIT_ASSERT(sectionA);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(sectionA, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(3, dof);
-  }
-
-  // Check field B
-  Field<Mesh>& fieldB = fields.get("field B");
-  CPPUNIT_ASSERT_EQUAL(std::string("displacement"), 
-		       std::string(fieldB.label()));
-  CPPUNIT_ASSERT_EQUAL(FieldBase::OTHER,
-		       fieldB.vectorFieldType());
-  CPPUNIT_ASSERT_EQUAL(PylithScalar(2.0), fieldB.scale());
-  CPPUNIT_ASSERT_EQUAL(true, fieldB.addDimensionOkay());
-
-  PetscSection sectionB = fieldB.petscSection();
-  CPPUNIT_ASSERT(sectionB);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(sectionB, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(4, dof);
-  }
-
-  // Make sure we can clone field B
-  Field<Mesh> fieldC(*_mesh);
-  fieldC.cloneSection(fieldB);
-  fieldC.copy(fieldB);
-} // testGet
-
-// ----------------------------------------------------------------------
-// Test get() const.
-void
-pylith::topology::TestFieldsNewMesh::testGetConst(void)
-{ // testGetConst
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-  DM dmMesh = _mesh->dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
-
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "displacement", 4, FieldBase::OTHER, 2.0, true);
-  fields.allocate(FieldBase::VERTICES_FIELD);
-
-  // Check field A
-  const Field<Mesh>& fieldA = fields.get("field A");
-  CPPUNIT_ASSERT_EQUAL(std::string("velocity"), std::string(fieldA.label()));
-  CPPUNIT_ASSERT_EQUAL(FieldBase::VECTOR,
-		       fieldA.vectorFieldType());
-  CPPUNIT_ASSERT_EQUAL(PylithScalar(1.0), fieldA.scale());
-  CPPUNIT_ASSERT_EQUAL(false, fieldA.addDimensionOkay());
-
-  PetscSection sectionA = fieldA.petscSection();
-  CPPUNIT_ASSERT(sectionA);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(sectionA, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(3, dof);
-  }
-
-  // Check field B
-  const Field<Mesh>& fieldB = fields.get("field B");
-  CPPUNIT_ASSERT_EQUAL(std::string("displacement"), 
-		       std::string(fieldB.label()));
-  CPPUNIT_ASSERT_EQUAL(FieldBase::OTHER,
-		       fieldB.vectorFieldType());
-  CPPUNIT_ASSERT_EQUAL(PylithScalar(2.0), fieldB.scale());
-  CPPUNIT_ASSERT_EQUAL(true, fieldB.addDimensionOkay());
-
-  PetscSection sectionB = fieldB.petscSection();
-  CPPUNIT_ASSERT(sectionB);
-  for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(sectionB, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(4, dof);
-  }
-} // testGetConst
-
-// ----------------------------------------------------------------------
-// Test mesh().
-void
-pylith::topology::TestFieldsNewMesh::testMesh(void)
-{ // testMesh
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-
-  const Mesh& mesh = fields.mesh();
-} // testMesh
-
-// ----------------------------------------------------------------------
-// Test fiberDim().
-void
-pylith::topology::TestFieldsNewMesh::testFiberDim(void)
-{ // testFiberDim
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "displacement", 4, FieldBase::OTHER, 2.0, true);
-
-  CPPUNIT_ASSERT_EQUAL(7, fields.fiberDim());
-} // testFiberDim
-
-// ----------------------------------------------------------------------
-// Test sectionIndex().
-void
-pylith::topology::TestFieldsNewMesh::testSectionIndex(void)
-{ // testSectionIndex
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "displacement", 4, FieldBase::OTHER, 2.0, true);
-
-  CPPUNIT_ASSERT_EQUAL(0, fields.sectionIndex("field A"));
-  CPPUNIT_ASSERT_EQUAL(3, fields.sectionIndex("field B"));
-} // testSectionIndex
-
-// ----------------------------------------------------------------------
-// Test sectionFiberDim().
-void
-pylith::topology::TestFieldsNewMesh::testSectionFiberDim(void)
-{ // testSectionFiberDim
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "displacement", 4, FieldBase::OTHER, 2.0, true);
-
-  CPPUNIT_ASSERT_EQUAL(3, fields.sectionFiberDim("field A"));
-  CPPUNIT_ASSERT_EQUAL(4, fields.sectionFiberDim("field B"));
-} // testSectionFiberDim
-
-// ----------------------------------------------------------------------
-// Test complete().
-void
-pylith::topology::TestFieldsNewMesh::testComplete(void)
-{ // testComplete
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "displacement", 4, FieldBase::OTHER, 2.0, true);
-  fields.allocate(FieldBase::VERTICES_FIELD);
-
-  fields.complete();
-} // testComplete
-
-// ----------------------------------------------------------------------
-// Test fieldNames() const.
-void
-pylith::topology::TestFieldsNewMesh::testFieldNames(void)
-{ // testFieldNames
-  const int numFieldsE = 2;
-  const char* namesE[2] = {
-    "field A",
-    "field B"
-  };
-
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "displacement", 4, FieldBase::OTHER, 2.0, true);
-
-  int numFields = 0;
-  char** names = 0;
-  fields.fieldNames(&numFields, &names);
-  
-  CPPUNIT_ASSERT_EQUAL(numFieldsE, numFields);
-  
-  for (int i=0; i < numFields; ++i)
-    CPPUNIT_ASSERT_EQUAL(std::string(namesE[i]), std::string(names[i]));
-
-  for (int i=0; i < numFields; ++i) {
-    delete[] names[i]; names[i] = 0;
-  } // for
-  delete[] names; names = 0;
-} // testFieldNames
-
-// ----------------------------------------------------------------------
-// Test view().
-void
-pylith::topology::TestFieldsNewMesh::testView(void)
-{ // testView
-  CPPUNIT_ASSERT(0 != _mesh);
-  FieldsNewMesh fields(*_mesh);
-
-  fields.add("field A", "velocity", 3, FieldBase::VECTOR);
-  fields.add("field B", "displacement", 4, FieldBase::OTHER, 2.0, true);
-  fields.allocate(FieldBase::VERTICES_FIELD);
-
-  fields.view("TEST VIEW");
-} // testView
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsNewMesh.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsNewMesh.hh	2013-03-20 02:27:39 UTC (rev 21589)
+++ short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsNewMesh.hh	2013-03-20 22:32:51 UTC (rev 21590)
@@ -1,131 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard, U.S. Geological Survey
-// Charles A. Williams, GNS Science
-// Matthew G. Knepley, University of Chicago
-//
-// This code was developed as part of the Computational Infrastructure
-// for Geodynamics (http://geodynamics.org).
-//
-// Copyright (c) 2010-2012 University of California, Davis
-//
-// See COPYING for license information.
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/topology/TestFieldsNewMesh.hh
- *
- * @brief C++ unit testing for FieldsNew<Mesh>.
- */
-
-#if !defined(pylith_topology_testfieldsnewmesh_hh)
-#define pylith_topology_testfieldsnewmesh_hh
-
-// Include directives ---------------------------------------------------
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "pylith/topology/topologyfwd.hh" // forward declarations
-
-// Forward declarations -------------------------------------------------
-/// Namespace for pylith package
-namespace pylith {
-  namespace topology {
-    class TestFieldsNewMesh;
-  } // topology
-} // pylith
-
-// TestField -------------------------------------------------------------
-/// C++ unit testing for Field.
-class pylith::topology::TestFieldsNewMesh : public CppUnit::TestFixture
-{ // class TestField
-
-  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
-  CPPUNIT_TEST_SUITE( TestFieldsNewMesh );
-
-  CPPUNIT_TEST( testConstructor );
-  CPPUNIT_TEST( testHasField );
-  CPPUNIT_TEST( testAdd );
-  CPPUNIT_TEST( testAllocateSequence );
-  CPPUNIT_TEST( testAllocateArray );
-  CPPUNIT_TEST( testAllocateDomain );
-  CPPUNIT_TEST( testGet );
-  CPPUNIT_TEST( testGetConst );
-  CPPUNIT_TEST( testMesh );
-  CPPUNIT_TEST( testFiberDim );
-  CPPUNIT_TEST( testSectionIndex );
-  CPPUNIT_TEST( testSectionFiberDim );
-  CPPUNIT_TEST( testComplete );
-  CPPUNIT_TEST( testFieldNames );
-  CPPUNIT_TEST( testView );
-
-  CPPUNIT_TEST_SUITE_END();
-
-  // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
-  /// Setup test case.
-  void setUp(void);
-
-  /// Tear down test case.
-  void tearDown(void);
-
-  /// Test constructor.
-  void testConstructor(void);
-
-  /// Test hasField().
-  void testHasField(void);
-
-  /// Test add().
-  void testAdd(void);
-
-  /// Test allocate(label_sequence).
-  void testAllocateSequence(void);
-
-  /// Test allocate(int_array).
-  void testAllocateArray(void);
-
-  /// Test allocate(domain).
-  void testAllocateDomain(void);
-
-  /// Test getField().
-  void testGet(void);
-
-  /// Test getField() for const FieldsNew.
-  void testGetConst(void);
-
-  /// Test mesh().
-  void testMesh(void);
-
-  /// Test fiberDim().
-  void testFiberDim(void);
-
-  /// Test sectionIndex().
-  void testSectionIndex(void);
-
-  /// Test sectionFiberDim().
-  void testSectionFiberDim(void);
-
-  /// Test complete().
-  void testComplete(void);
-
-  /// Test fieldNames().
-  void testFieldNames(void);
-
-  /// Test view().
-  void testView(void);
-
-// PRIVATE MEMBERS /////////////////////////////////////////////////////
-private :
-
-  Mesh* _mesh;
-
-}; // class TestFieldsNewMesh
-
-#endif // pylith_topology_testfieldsnewmesh_hh
-
-
-// End of file 

Modified: short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsSubMesh.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsSubMesh.cc	2013-03-20 02:27:39 UTC (rev 21589)
+++ short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsSubMesh.cc	2013-03-20 22:32:51 UTC (rev 21590)
@@ -23,6 +23,8 @@
 #include "pylith/topology/SubMesh.hh" // USES SubMesh
 #include "pylith/topology/Field.hh" // USES Field
 #include "pylith/topology/Fields.hh" // USES Fields
+#include "pylith/topology/Stratum.hh" // USES Stratum
+#include "pylith/topology/VisitorMesh.hh" // USES VecVisitorMesh
 
 #include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
 
@@ -31,8 +33,6 @@
 
 // ----------------------------------------------------------------------
 typedef pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> > FieldsSubMesh;
-typedef pylith::topology::SubMesh::RealSection RealSection;
-typedef pylith::topology::SubMesh::SieveMesh SieveMesh;
 
 // ----------------------------------------------------------------------
 void
@@ -59,7 +59,7 @@
 void
 pylith::topology::TestFieldsSubMesh::testConstructor(void)
 { // testConstructor
-  CPPUNIT_ASSERT(0 != _submesh);
+  CPPUNIT_ASSERT(_submesh);
   FieldsSubMesh fields(*_submesh);
 } // testConstructor
  
@@ -68,7 +68,7 @@
 void
 pylith::topology::TestFieldsSubMesh::testAdd(void)
 { // testAdd
-  CPPUNIT_ASSERT(0 != _submesh);
+  CPPUNIT_ASSERT(_submesh);
   FieldsSubMesh fields(*_submesh);
   
   const char* label = "field";
@@ -84,15 +84,9 @@
 { // testAddDomain
   const int fiberDim = 3;
 
-  CPPUNIT_ASSERT(0 != _submesh);
+  CPPUNIT_ASSERT(_submesh);
   FieldsSubMesh fields(*_submesh);
-  DM dmMesh = _submesh->dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
 
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
-  
   const char* label = "field";
   fields.add(label, "velocity", Field<SubMesh>::VERTICES_FIELD, fiberDim);
   const size_t size = 1;
@@ -100,13 +94,16 @@
 
   Field<SubMesh>& field = fields.get(label);
   field.allocate();
-  PetscSection section = field.petscSection();
-  CPPUNIT_ASSERT(section);
+
+  PetscDM dmMesh = _submesh->dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
+
+  VecVisitorMesh fieldVisitor(field);
   for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(section, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(fiberDim, dof);
-  }
+    CPPUNIT_ASSERT_EQUAL(fiberDim, fieldVisitor.sectionDof(v));
+  } // for
 } // testAddDomain
 
 // ----------------------------------------------------------------------
@@ -114,7 +111,7 @@
 void
 pylith::topology::TestFieldsSubMesh::testDelete(void)
 { // testDelete
-  CPPUNIT_ASSERT(0 != _submesh);
+  CPPUNIT_ASSERT(_submesh);
   FieldsSubMesh fields(*_submesh);
 
   const char* labelA = "field A";
@@ -136,7 +133,7 @@
 void
 pylith::topology::TestFieldsSubMesh::testGet(void)
 { // testGet
-  CPPUNIT_ASSERT(0 != _submesh);
+  CPPUNIT_ASSERT(_submesh);
   FieldsSubMesh fields(*_submesh);
 
   const char* label = "field";
@@ -149,14 +146,14 @@
 void
 pylith::topology::TestFieldsSubMesh::testGetConst(void)
 { // testGetConst
-  CPPUNIT_ASSERT(0 != _submesh);
+  CPPUNIT_ASSERT(_submesh);
   FieldsSubMesh fields(*_submesh);
 
   const char* label = "field";
   fields.add(label, "displacement");
 
   const FieldsSubMesh* fieldsPtr = &fields;
-  CPPUNIT_ASSERT(0 != fieldsPtr);
+  CPPUNIT_ASSERT(fieldsPtr);
   const Field<SubMesh>& field = fieldsPtr->get(label);
 } // testGetConst
 
@@ -165,7 +162,7 @@
 void
 pylith::topology::TestFieldsSubMesh::testHasField(void)
 { // testHasField
-  CPPUNIT_ASSERT(0 != _submesh);
+  CPPUNIT_ASSERT(_submesh);
   FieldsSubMesh fields(*_submesh);
 
   fields.add("field A", "velocity");
@@ -189,14 +186,8 @@
 { // testCopyLayout
   const int fiberDim = 3;
 
-  CPPUNIT_ASSERT(0 != _submesh);
+  CPPUNIT_ASSERT(_submesh);
   FieldsSubMesh fields(*_submesh);
-  DM dmMesh = _submesh->dmMesh();
-  PetscErrorCode err;
-  CPPUNIT_ASSERT(dmMesh);
-
-  PetscInt       vStart, vEnd;
-  err = DMPlexGetDepthStratum(dmMesh, 0, &vStart, &vEnd);CHECK_PETSC_ERROR(err);
   
   const char* labelA = "field A";
   fields.add(labelA, "velocity", Field<SubMesh>::VERTICES_FIELD, fiberDim);
@@ -211,13 +202,16 @@
   const size_t size = 2;
   CPPUNIT_ASSERT_EQUAL(size, fields._fields.size());
   const Field<SubMesh>& field = fields.get(labelB);
-  PetscSection section = field.petscSection();
-  CPPUNIT_ASSERT(section);
+
+  PetscDM dmMesh = _submesh->dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
+
+  VecVisitorMesh fieldVisitor(field);
   for(PetscInt v = vStart; v < vEnd; ++v) {
-    PetscInt dof;
-    err = PetscSectionGetDof(section, v, &dof);CHECK_PETSC_ERROR(err);
-    CPPUNIT_ASSERT_EQUAL(fiberDim, dof);
-  }
+    CPPUNIT_ASSERT_EQUAL(fiberDim, fieldVisitor.sectionDof(v));
+  } // for
 } // testCopyLayout
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/topology/TestMesh.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/topology/TestMesh.cc	2013-03-20 02:27:39 UTC (rev 21589)
+++ short/3D/PyLith/trunk/unittests/libtests/topology/TestMesh.cc	2013-03-20 22:32:51 UTC (rev 21590)
@@ -20,6 +20,8 @@
 
 #include "TestMesh.hh" // Implementation of class methods
 #include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/Stratum.hh" // USES Stratum
+#include "pylith/topology/CoordsVisitor.hh" // USES CoordsVisitor
 
 #include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
 
@@ -164,64 +166,30 @@
   normalizer.lengthScale(lengthScale);
   mesh.nondimensionalize(normalizer);
 
-  const ALE::Obj<Mesh::SieveMesh>& sieveMesh = mesh.sieveMesh();
-  CPPUNIT_ASSERT(!sieveMesh.isNull());
-  const ALE::Obj<Mesh::SieveMesh::label_sequence>& vertices = 
-    sieveMesh->depthStratum(0);
-  CPPUNIT_ASSERT(!vertices.isNull());
-  const Mesh::SieveMesh::label_sequence::iterator verticesBegin =
-    vertices->begin();
-  const Mesh::SieveMesh::label_sequence::iterator verticesEnd =
-    vertices->end();
-  CPPUNIT_ASSERT_EQUAL(numVertices, int(vertices->size()));
+  // Get vertices
+  PetscDM dmMesh = mesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+  Stratum depthStratum(dmMesh, Stratum::DEPTH, 0);
+  const PetscInt vStart = depthStratum.begin();
+  const PetscInt vEnd = depthStratum.end();
 
   // Check nondimensional coordinates
-  const ALE::Obj<Mesh::RealSection>& coordsField =
-    sieveMesh->getRealSection("coordinates");
-  CPPUNIT_ASSERT(!coordsField.isNull());
-  CPPUNIT_ASSERT_EQUAL(spaceDim, 
-		       coordsField->getFiberDimension(*verticesBegin));
-  int i = 0;
-  for(Mesh::SieveMesh::label_sequence::iterator v_iter = verticesBegin;
-      v_iter != verticesEnd;
-      ++v_iter) {
-    const PylithScalar* coordsVertex = coordsField->restrictPoint(*v_iter);
-    CPPUNIT_ASSERT(0 != coordsVertex);
-    const PylithScalar tolerance = 1.0e-06;
-    for (int iDim=0; iDim < spaceDim; ++iDim) {
-      const PylithScalar coordE = coordinates[i++] / lengthScale;
-      if (coordE < 1.0)
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(coordE, coordsVertex[iDim],
-				     tolerance);
-      else
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, coordsVertex[iDim]/coordE,
-				     tolerance);
+  CoordsVisitor coordsVisitor(dmMesh);
+  const PetscScalar* coordsArray = coordsVisitor.localArray();
+
+  const PylithScalar tolerance = 1.0e-06;
+  for(PetscInt v = vStart, i = 0; v < vEnd; ++v) {
+    CPPUNIT_ASSERT_EQUAL(spaceDim, coordsVisitor.sectionDof(v));
+    const PetscInt off = coordsVisitor.sectionOffset(v);
+    for (int iDim=0; iDim < spaceDim; ++iDim, ++i) {
+      const PylithScalar coordE = coordinates[i] / lengthScale;
+      if (fabs(coordE) < 1.0) {
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(coordE, coordsArray[off+iDim], tolerance);
+      } else {
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, coordsArray[off+iDim]/coordE, tolerance);
+      } // if/else
     } // for
   } // for
   
-  // Check dimensioned coordinates
-  const ALE::Obj<Mesh::RealSection>& coordsDimField =
-    sieveMesh->getRealSection("coordinates_dimensioned");
-  CPPUNIT_ASSERT(!coordsDimField.isNull());
-  CPPUNIT_ASSERT_EQUAL(spaceDim, 
-		       coordsDimField->getFiberDimension(*verticesBegin));
-  i = 0;
-  for(Mesh::SieveMesh::label_sequence::iterator v_iter = verticesBegin;
-      v_iter != verticesEnd;
-      ++v_iter) {
-    const PylithScalar* coordsVertex = coordsDimField->restrictPoint(*v_iter);
-    CPPUNIT_ASSERT(0 != coordsVertex);
-    const PylithScalar tolerance = 1.0e-06;
-    for (int iDim=0; iDim < spaceDim; ++iDim) {
-      const PylithScalar coordE = coordinates[i++];
-      if (coordE < 1.0)
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(coordE, coordsVertex[iDim],
-				     tolerance);
-      else
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, coordsVertex[iDim]/coordE,
-				     tolerance);
-    } // for
-  } // for
 } // testNondimensionalize
 
 



More information about the CIG-COMMITS mailing list