[cig-commits] r22035 - short/3D/PyLith/trunk/unittests/libtests/meshio
brad at geodynamics.org
brad at geodynamics.org
Fri May 10 17:26:13 PDT 2013
Author: brad
Date: 2013-05-10 17:26:13 -0700 (Fri, 10 May 2013)
New Revision: 22035
Modified:
short/3D/PyLith/trunk/unittests/libtests/meshio/TestCellFilterAvg.cc
short/3D/PyLith/trunk/unittests/libtests/meshio/TestCellFilterAvg.hh
Log:
Added unit test for CellFilterAvg with submesh to expose bug.
Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/TestCellFilterAvg.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/TestCellFilterAvg.cc 2013-05-11 00:08:25 UTC (rev 22034)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/TestCellFilterAvg.cc 2013-05-11 00:26:13 UTC (rev 22035)
@@ -33,6 +33,7 @@
// ----------------------------------------------------------------------
typedef pylith::topology::Field<pylith::topology::Mesh> MeshField;
+typedef pylith::topology::Field<pylith::topology::SubMesh> SubMeshField;
// ----------------------------------------------------------------------
// Test constructor
@@ -43,10 +44,10 @@
} // testConstructor
// ----------------------------------------------------------------------
-// Test filter()
+// Test filter() w/mesh.
void
-pylith::meshio::TestCellFilterAvg::testFilter(void)
-{ // testFilter
+pylith::meshio::TestCellFilterAvg::testFilterMesh(void)
+{ // testFilterMesh
PYLITH_METHOD_BEGIN;
const char* filename = "data/quad4.mesh";
@@ -127,7 +128,7 @@
CellFilterAvg<topology::Mesh, MeshField> filter;
filter.quadrature(&quadrature);
- const topology::Field<topology::Mesh>& fieldF = filter.filter(field);
+ const MeshField& fieldF = filter.filter(field);
CPPUNIT_ASSERT_EQUAL(fieldTypeE, fieldF.vectorFieldType());
CPPUNIT_ASSERT_EQUAL(label, std::string(fieldF.label()));
@@ -145,7 +146,113 @@
} // for
PYLITH_METHOD_END;
-} // testFilter
+} // testFilterMesh
+// ----------------------------------------------------------------------
+// Test filter() w/submesh.
+void
+pylith::meshio::TestCellFilterAvg::testFilterSubMesh(void)
+{ // testFilterMesh
+ PYLITH_METHOD_BEGIN;
+
+ const char* filename = "data/quad4.mesh";
+ const char* group = "bc";
+
+ const int fiberDim = 2;
+ const int ncells = 2;
+ const std::string label = "field data";
+ const topology::FieldBase::VectorFieldEnum fieldType =
+ topology::FieldBase::MULTI_SCALAR;
+ const PylithScalar fieldValues[] = {
+ 1.1, 1.2,
+ 2.1, 2.2,
+ };
+ const int cellDim = 1;
+ const int numBasis = 2;
+ const int numQuadPts = 1;
+ const int spaceDim = 2;
+ const PylithScalar basis[] = {
+ 1.0, 1.0,
+ 1.0, 1.0,
+ };
+ const PylithScalar basisDerivRef[] = {
+ 1.0, 1.0, 1.0, 1.0,
+ 1.0, 1.0, 1.0, 1.0,
+ };
+ const PylithScalar quadPtsRef[] = {
+ 0.0, 0.0,
+ };
+ const PylithScalar quadWts[] = { 1.0 };
+ const PylithScalar minJacobian = 1.0;
+
+ const topology::FieldBase::VectorFieldEnum fieldTypeE =
+ topology::FieldBase::SCALAR;
+ const int fiberDimE = 1;
+ const PylithScalar fieldValuesE[] = {
+ (1.5*1.1 + 0.5*1.2)/2.0,
+ (1.5*2.1 + 0.5*2.2)/2.0,
+ };
+
+ MeshIOAscii iohandler;
+ topology::Mesh mesh;
+ iohandler.filename(filename);
+ iohandler.read(&mesh);
+
+ topology::SubMesh submesh(mesh, group);
+
+ // Set cell field
+ SubMeshField field(submesh);
+ field.newSection(topology::FieldBase::CELLS_FIELD, fiberDim);
+ field.allocate();
+ field.vectorFieldType(fieldType);
+ field.label(label.c_str());
+
+ PetscDM dmMesh = submesh.dmMesh();CPPUNIT_ASSERT(dmMesh);
+ topology::Stratum cellsStratum(dmMesh, topology::Stratum::HEIGHT, 1);
+ const PetscInt cStart = cellsStratum.begin();
+ const PetscInt cEnd = cellsStratum.end();
+
+ topology::VecVisitorMesh fieldVisitor(field);
+ PetscScalar* fieldArray = fieldVisitor.localArray();CPPUNIT_ASSERT(fieldArray);
+ for(PetscInt c = cStart, index = 0; c < cEnd; ++c) {
+ const PetscInt off = fieldVisitor.sectionOffset(c);
+ CPPUNIT_ASSERT_EQUAL(fiberDim, fieldVisitor.sectionDof(c));
+
+ for(PetscInt d = 0; d < fiberDim; ++d, ++index) {
+ fieldArray[off+d] = fieldValues[index];
+ } // for
+ } // for
+
+ feassemble::Quadrature<topology::SubMesh> quadrature;
+ quadrature.initialize(basis, numQuadPts, numBasis,
+ basisDerivRef, numQuadPts, numBasis, cellDim,
+ quadPtsRef, numQuadPts, cellDim,
+ quadWts, numQuadPts,
+ spaceDim);
+
+ CellFilterAvg<topology::SubMesh, SubMeshField> filter;
+ filter.quadrature(&quadrature);
+
+ const SubMeshField& fieldF = filter.filter(field);
+
+ CPPUNIT_ASSERT_EQUAL(fieldTypeE, fieldF.vectorFieldType());
+ CPPUNIT_ASSERT_EQUAL(label, std::string(fieldF.label()));
+
+ topology::VecVisitorMesh fieldFVisitor(fieldF);
+ const PetscScalar* fieldFArray = fieldFVisitor.localArray();CPPUNIT_ASSERT(fieldFArray);
+
+ const PylithScalar tolerance = 1.0e-06;
+ for(PetscInt c = cStart, index = 0; c < cEnd; ++c) {
+ const PetscInt off = fieldFVisitor.sectionOffset(c);
+ CPPUNIT_ASSERT_EQUAL(fiberDimE, fieldFVisitor.sectionDof(c));
+ for(PetscInt d = 0; d < fiberDimE; ++d, ++index) {
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, fieldFArray[off+d]/fieldValuesE[index], tolerance);
+ }
+ } // for
+
+ PYLITH_METHOD_END;
+} // testFilterSubMesh
+
+
// End of file
Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/TestCellFilterAvg.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/TestCellFilterAvg.hh 2013-05-11 00:08:25 UTC (rev 22034)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/TestCellFilterAvg.hh 2013-05-11 00:26:13 UTC (rev 22035)
@@ -45,7 +45,8 @@
CPPUNIT_TEST_SUITE( TestCellFilterAvg );
CPPUNIT_TEST( testConstructor );
- CPPUNIT_TEST( testFilter );
+ CPPUNIT_TEST( testFilterMesh );
+ CPPUNIT_TEST( testFilterSubMesh );
CPPUNIT_TEST_SUITE_END();
@@ -55,9 +56,12 @@
/// Test constructor
void testConstructor(void);
- /// Test filter()
- void testFilter(void);
+ /// Test filter() w/mesh.
+ void testFilterMesh(void);
+ /// Test filter() w/submesh.
+ void testFilterSubMesh(void);
+
}; // class TestCellFilterAvg
#endif // pylith_meshio_testcellfilteravg_hh
More information about the CIG-COMMITS
mailing list