[cig-commits] r15819 - in short/3D/PyLith/branches/pylith-friction: libsrc/faults unittests/libtests/faults unittests/libtests/faults/data unittests/pytests/faults unittests/pytests/faults/data

brad at geodynamics.org brad at geodynamics.org
Fri Oct 16 16:19:13 PDT 2009


Author: brad
Date: 2009-10-16 16:19:12 -0700 (Fri, 16 Oct 2009)
New Revision: 15819

Added:
   short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/TestTimeHistorySlipFn.cc
   short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/TestTimeHistorySlipFn.hh
   short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/data/slipfn.timedb
   short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/TestTimeHistorySlipFn.py
   short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/data/slipfn.timedb
Modified:
   short/3D/PyLith/branches/pylith-friction/libsrc/faults/TimeHistorySlipFn.cc
   short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/Makefile.am
   short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/data/Makefile.am
   short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/Makefile.am
   short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/testfaults.py
Log:
Finished unit tests for TimeHistorySlipFn.

Modified: short/3D/PyLith/branches/pylith-friction/libsrc/faults/TimeHistorySlipFn.cc
===================================================================
--- short/3D/PyLith/branches/pylith-friction/libsrc/faults/TimeHistorySlipFn.cc	2009-10-16 15:31:15 UTC (rev 15818)
+++ short/3D/PyLith/branches/pylith-friction/libsrc/faults/TimeHistorySlipFn.cc	2009-10-16 23:19:12 UTC (rev 15819)
@@ -59,6 +59,8 @@
 
   _dbAmplitude = 0; // :TODO: Use shared pointer
   _dbSlipTime = 0; // :TODO: Use shared pointer
+  if (0 != _dbTimeHistory)
+    _dbTimeHistory->close();
   _dbTimeHistory = 0; // :TODO: Use shared pointer
 } // deallocate
   
@@ -96,7 +98,8 @@
   assert(0 != _parameters);
   _parameters->add("slip amplitude", "slip_amplitude");
 
-  topology::Field<topology::SubMesh>& slipAmplitude = _parameters->get("slip amplitude");
+  topology::Field<topology::SubMesh>& slipAmplitude = 
+    _parameters->get("slip amplitude");
   slipAmplitude.newSection(vertices, spaceDim);
   slipAmplitude.allocate();
   slipAmplitude.scale(lengthScale);
@@ -234,7 +237,8 @@
   for (label_sequence::iterator v_iter=verticesBegin;
        v_iter != verticesEnd;
        ++v_iter) {
-    slipAmplitudeSection->restrictPoint(*v_iter, &_slipVertex[0], _slipVertex.size());
+    slipAmplitudeSection->restrictPoint(*v_iter, 
+					&_slipVertex[0], _slipVertex.size());
     slipTimeSection->restrictPoint(*v_iter, &_slipTimeVertex, 1);
 
     double relTime = t - _slipTimeVertex;
@@ -257,7 +261,7 @@
     slipSection->updateAddPoint(*v_iter, &_slipVertex[0]);
   } // for
 
-  PetscLogFlops(vertices->size() * 1);
+  PetscLogFlops(vertices->size() * 3);
 } // slip
 
 // ----------------------------------------------------------------------
@@ -269,6 +273,7 @@
 { // slipIncr
   assert(0 != slip);
   assert(0 != _parameters);
+  assert(0 != _dbTimeHistory);
 
   // Get vertices in fault mesh
   const ALE::Obj<SieveMesh>& sieveMesh = slip->mesh().sieveMesh();
@@ -328,7 +333,7 @@
     slipSection->updateAddPoint(*v_iter, &_slipVertex[0]);
   } // for
 
-  PetscLogFlops(vertices->size() * 2);
+  PetscLogFlops(vertices->size() * 6);
 } // slipIncr
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/Makefile.am	2009-10-16 15:31:15 UTC (rev 15818)
+++ short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/Makefile.am	2009-10-16 23:19:12 UTC (rev 15819)
@@ -27,6 +27,7 @@
 	TestConstRateSlipFn.cc \
 	TestBruneSlipFn.cc \
 	TestLiuCosSlipFn.cc \
+	TestTimeHistorySlipFn.cc \
 	TestEqKinSrc.cc \
 	TestFaultCohesiveKin.cc \
 	TestFaultCohesiveKinLine2.cc \
@@ -49,7 +50,7 @@
 
 noinst_HEADERS = \
 	TestBruneSlipFn.hh \
-	TestLiuCosSlipFn.hh \
+	TestTimeHistorySlipFn.hh \
 	TestConstRateSlipFn.hh \
 	TestStepSlipFn.hh \
 	TestEqKinSrc.hh \

Added: short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/TestTimeHistorySlipFn.cc
===================================================================
--- short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/TestTimeHistorySlipFn.cc	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/TestTimeHistorySlipFn.cc	2009-10-16 23:19:12 UTC (rev 15819)
@@ -0,0 +1,498 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestTimeHistorySlipFn.hh" // Implementation of class methods
+
+#include "pylith/faults/TimeHistorySlipFn.hh" // USES TimeHistorySlipFn
+
+#include "pylith/faults/CohesiveTopology.hh" // USES CohesiveTopology
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/topology/Field.hh" // USES Field
+#include "pylith/topology/Fields.hh" // USES Fields
+#include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
+
+#include "spatialdata/geocoords/CSCart.hh" // USES CSCart
+#include "spatialdata/spatialdb/SimpleDB.hh" // USES SimpleDB
+#include "spatialdata/spatialdb/SimpleIOAscii.hh" // USES SimpleIOAscii
+#include "spatialdata/spatialdb/TimeHistory.hh" // USES TimeHistory
+#include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestTimeHistorySlipFn );
+
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::SieveSubMesh SieveSubMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+
+// ----------------------------------------------------------------------
+namespace pylith {
+  namespace faults {
+    namespace _TestTimeHistorySlipFn {
+      struct DataStruct {
+	const char* meshFilename;
+	const char* faultLabel;
+	const int faultId;
+	const char* finalSlipFilename;
+	const char* slipTimeFilename;
+	const char* timeHistoryFilename;
+	const int* constraintPts;
+	const double* amplitudeE;
+	const double* slipTimeE;
+	const int numConstraintPts;
+      }; // DataStruct
+    } // _TestTimeHistorySlipFn
+  } // faults
+} // pylith
+
+// ----------------------------------------------------------------------
+// Test constructor.
+void
+pylith::faults::TestTimeHistorySlipFn::testConstructor(void)
+{ // testConstructor
+  TimeHistorySlipFn slipfn;
+} // testConstructor
+
+// ----------------------------------------------------------------------
+// Test dbAmplitude().
+void
+pylith::faults::TestTimeHistorySlipFn::testDbAmplitude(void)
+{ // testDbAmplitude
+  const char* label = "database ABC";
+  TimeHistorySlipFn slipfn;
+  
+  spatialdata::spatialdb::SimpleDB db(label);
+  slipfn.dbAmplitude(&db);
+
+  CPPUNIT_ASSERT(0 != slipfn._dbAmplitude);
+  CPPUNIT_ASSERT_EQUAL(std::string(label),
+		       std::string(slipfn._dbAmplitude->label()));
+  CPPUNIT_ASSERT(0 == slipfn._dbSlipTime);
+  CPPUNIT_ASSERT(0 == slipfn._dbTimeHistory);
+} // testDbAmplitude
+
+// ----------------------------------------------------------------------
+// Test dbSlipTime().
+void
+pylith::faults::TestTimeHistorySlipFn::testDbSlipTime(void)
+{ // testDbSlipTime
+  const char* label = "database ABCD";
+  TimeHistorySlipFn slipfn;
+  
+  spatialdata::spatialdb::SimpleDB db(label);
+  slipfn.dbSlipTime(&db);
+
+  CPPUNIT_ASSERT(0 != slipfn._dbSlipTime);
+  CPPUNIT_ASSERT_EQUAL(std::string(label),
+		       std::string(slipfn._dbSlipTime->label()));
+  CPPUNIT_ASSERT(0 == slipfn._dbAmplitude);
+  CPPUNIT_ASSERT(0 == slipfn._dbTimeHistory);
+} // testDbSlipTime
+
+// ----------------------------------------------------------------------
+// Test dbTimeHistory().
+void
+pylith::faults::TestTimeHistorySlipFn::testDbTimeHistory(void)
+{ // testDbTimeHistory
+  const char* label = "database ABCDE";
+  TimeHistorySlipFn slipfn;
+  
+  spatialdata::spatialdb::TimeHistory db(label);
+  slipfn.dbTimeHistory(&db);
+
+  CPPUNIT_ASSERT(0 != slipfn._dbTimeHistory);
+  CPPUNIT_ASSERT_EQUAL(std::string(label),
+		       std::string(slipfn._dbTimeHistory->label()));
+  CPPUNIT_ASSERT(0 == slipfn._dbAmplitude);
+  CPPUNIT_ASSERT(0 == slipfn._dbSlipTime);
+} // testDbTimeHistory
+
+// ----------------------------------------------------------------------
+// Test initialize() in 1-D.
+void
+pylith::faults::TestTimeHistorySlipFn::testInitialize1D(void)
+{ // testInitialize1D
+  const char* meshFilename = "data/line2.mesh";
+  const char* faultLabel = "fault";
+  const int faultId = 2;
+  const char* finalSlipFilename = "data/line2_finalslip.spatialdb";
+  const char* slipTimeFilename = "data/line2_sliptime.spatialdb";
+  const char* timeHistoryFilename = "data/slipfn.timedb";
+  const int constraintPts[] = { 3 };
+  const double amplitudeE[] = { 2.3 };
+  const double slipTimeE[] = { 1.2 };
+  const int numConstraintPts = 1;
+
+  _TestTimeHistorySlipFn::DataStruct data = {meshFilename,
+				       faultLabel,
+				       faultId,
+				       finalSlipFilename,
+				       slipTimeFilename,
+				       timeHistoryFilename,
+				       constraintPts,
+				       amplitudeE,
+				       slipTimeE,
+				       numConstraintPts};
+  _testInitialize(data);
+} // testInitialize1D
+
+// ----------------------------------------------------------------------
+// Test initialize() in 2-D.
+void
+pylith::faults::TestTimeHistorySlipFn::testInitialize2D(void)
+{ // testInitialize2D
+  const char* meshFilename = "data/tri3.mesh";
+  const char* faultLabel = "fault";
+  const int faultId = 2;
+  const char* finalSlipFilename = "data/tri3_finalslip.spatialdb";
+  const char* slipTimeFilename = "data/tri3_sliptime.spatialdb";
+  const char* timeHistoryFilename = "data/slipfn.timedb";
+  const int constraintPts[] = { 3, 4 };
+  const double amplitudeE[] = { 2.3, 0.1, 
+				2.4, 0.2};
+  const double slipTimeE[] = { 1.2, 1.3 };
+  const int numConstraintPts = 2;
+
+  _TestTimeHistorySlipFn::DataStruct data = {meshFilename,
+				       faultLabel,
+				       faultId,
+				       finalSlipFilename,
+				       slipTimeFilename,
+				       timeHistoryFilename,
+				       constraintPts,
+				       amplitudeE,
+				       slipTimeE,
+				       numConstraintPts};
+  _testInitialize(data);
+} // testInitialize2D
+
+// ----------------------------------------------------------------------
+// Test initialize() in 3-D.
+void
+pylith::faults::TestTimeHistorySlipFn::testInitialize3D(void)
+{ // testInitialize3D
+  const char* meshFilename = "data/tet4.mesh";
+  const char* faultLabel = "fault";
+  const int faultId = 2;
+  const char* finalSlipFilename = "data/tet4_finalslip.spatialdb";
+  const char* slipTimeFilename = "data/tet4_sliptime.spatialdb";
+  const char* timeHistoryFilename = "data/slipfn.timedb";
+  const int constraintPts[] = { 3, 4, 5 };
+  const double amplitudeE[] = { 2.3, -0.7, 0.1,
+				2.4, -0.8, 0.2,
+				2.5, -0.9, 0.3 };
+  const double slipTimeE[] = { 1.2, 1.3, 1.4 };
+  const int numConstraintPts = 3;
+
+  _TestTimeHistorySlipFn::DataStruct data = {meshFilename,
+				       faultLabel,
+				       faultId,
+				       finalSlipFilename,
+				       slipTimeFilename,
+				       timeHistoryFilename,
+				       constraintPts,
+				       amplitudeE,
+				       slipTimeE,
+				       numConstraintPts};
+  _testInitialize(data);
+} // testInitialize3D
+
+// ----------------------------------------------------------------------
+// Test slip().
+void
+pylith::faults::TestTimeHistorySlipFn::testSlip(void)
+{ // testSlip
+  const double slipTimeE[] = { 1.2, 1.3 };
+  const double slipE[] = { 0.92, 0.04,
+			   0.84, 0.07 };
+  const double originTime = 5.064;
+
+  topology::Mesh mesh;
+  topology::SubMesh faultMesh;
+  TimeHistorySlipFn slipfn;
+  spatialdata::spatialdb::TimeHistory th;
+  _initialize(&mesh, &faultMesh, &slipfn, &th, originTime);
+  
+  const spatialdata::geocoords::CoordSys* cs = faultMesh.coordsys();
+  CPPUNIT_ASSERT(0 != cs);
+
+  const int spaceDim = cs->spaceDim();
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = faultMesh.sieveMesh();
+  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& vertices =
+    faultSieveMesh->depthStratum(0);
+  const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+  topology::Field<topology::SubMesh> slip(faultMesh);
+  slip.newSection(vertices, spaceDim);
+  slip.allocate();
+
+  const double t = 2.0;
+  slipfn.slip(&slip, originTime+t);
+
+  const double tolerance = 1.0e-06;
+  int iPoint = 0;
+  const ALE::Obj<RealSection>& slipSection = slip.section();
+  CPPUNIT_ASSERT(!slipSection.isNull());
+  for (SieveMesh::label_sequence::iterator v_iter=vertices->begin();
+       v_iter != verticesEnd;
+       ++v_iter, ++iPoint) {
+    const int fiberDim = slipSection->getFiberDimension(*v_iter);
+    CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
+    const double* vals = slipSection->restrictPoint(*v_iter);
+    CPPUNIT_ASSERT(0 != vals);
+    
+    for (int iDim=0; iDim < fiberDim; ++iDim)
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(slipE[iPoint*spaceDim+iDim], 
+				   vals[iDim], tolerance);
+  } // for
+} // testSlip
+
+// ----------------------------------------------------------------------
+// Test slipIncr().
+void
+pylith::faults::TestTimeHistorySlipFn::testSlipIncr(void)
+{ // testSlipIncr
+  const double slipTimeE[] = { 1.2, 1.3 };
+  const double slipE[] = { 0.92, 0.04, 
+			   0.984, 0.082};
+  const double originTime = 1.064;
+
+  topology::Mesh mesh;
+  topology::SubMesh faultMesh;
+  TimeHistorySlipFn slipfn;
+  spatialdata::spatialdb::TimeHistory th;
+  _initialize(&mesh, &faultMesh, &slipfn, &th, originTime);
+
+  const spatialdata::geocoords::CoordSys* cs = faultMesh.coordsys();
+  CPPUNIT_ASSERT(0 != cs);
+
+  const int spaceDim = cs->spaceDim();
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = faultMesh.sieveMesh();
+  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& vertices =
+    faultSieveMesh->depthStratum(0);
+  const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+  topology::Field<topology::SubMesh> slip(faultMesh);
+  slip.newSection(vertices, spaceDim);
+  slip.allocate();
+
+  const double t0 = 3.2;
+  const double t1 = 9.7;
+  slipfn.slipIncr(&slip, originTime+t0, originTime+t1);
+
+  const double tolerance = 1.0e-06;
+  int iPoint = 0;
+  const ALE::Obj<RealSection>& slipSection = slip.section();
+  CPPUNIT_ASSERT(!slipSection.isNull());
+  for (SieveMesh::label_sequence::iterator v_iter=vertices->begin();
+       v_iter != verticesEnd;
+       ++v_iter, ++iPoint) {
+
+    const int fiberDim = slipSection->getFiberDimension(*v_iter);
+    CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
+    const double* vals = slipSection->restrictPoint(*v_iter);
+    CPPUNIT_ASSERT(0 != vals);
+
+    for (int iDim=0; iDim < fiberDim; ++iDim)
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(slipE[iPoint*spaceDim+iDim],
+				   vals[iDim], tolerance);
+  } // for
+} // testSlipIncr
+
+// ----------------------------------------------------------------------
+// Initialize TimeHistorySlipFn.
+void
+pylith::faults::TestTimeHistorySlipFn::_initialize(topology::Mesh* mesh,
+					      topology::SubMesh* faultMesh,
+					      TimeHistorySlipFn* slipfn,
+					      spatialdata::spatialdb::TimeHistory* th,
+					      const double originTime)
+{ // _initialize
+  assert(0 != slipfn);
+
+  const char* meshFilename = "data/tri3.mesh";
+  const char* faultLabel = "fault";
+  const int faultId = 2;
+  const char* finalSlipFilename = "data/tri3_finalslip.spatialdb";
+  const char* slipTimeFilename = "data/tri3_sliptime.spatialdb";
+  const char* timeHistoryFilename = "data/slipfn.timedb";
+
+  meshio::MeshIOAscii meshIO;
+  meshIO.filename(meshFilename);
+  meshIO.debug(false);
+  meshIO.interpolate(false);
+  meshIO.read(mesh);
+
+  // Set up coordinates
+  spatialdata::geocoords::CSCart cs;
+  cs.setSpaceDim(mesh->dimension());
+  cs.initialize();
+  mesh->coordsys(&cs);
+
+  // Create fault mesh
+  int firstFaultVertex = 0;
+  int firstFaultCell   = mesh->sieveMesh()->getIntSection(faultLabel)->size();
+  const bool useLagrangeConstraints = true;
+  if (useLagrangeConstraints) {
+    firstFaultCell += mesh->sieveMesh()->getIntSection(faultLabel)->size();
+  }
+  ALE::Obj<ALE::Mesh> faultBoundary = 0;
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh->sieveMesh();
+  CPPUNIT_ASSERT(!sieveMesh.isNull());
+  CohesiveTopology::createFault(faultMesh, faultBoundary,
+                                *mesh, sieveMesh->getIntSection(faultLabel));
+  CohesiveTopology::create(mesh, *faultMesh, faultBoundary, 
+                           sieveMesh->getIntSection(faultLabel),
+                           faultId,
+                           firstFaultVertex, firstFaultCell,
+                           useLagrangeConstraints);
+  // Need to copy coordinates from mesh to fault mesh since we are not
+  // using create() instead of createParallel().
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = faultMesh->sieveMesh();
+  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+  faultSieveMesh->setRealSection("coordinates", 
+				 sieveMesh->getRealSection("coordinates"));
+
+  // Setup databases
+  spatialdata::spatialdb::SimpleDB dbAmplitude("slip amplitude");
+  spatialdata::spatialdb::SimpleIOAscii ioFinalSlip;
+  ioFinalSlip.filename(finalSlipFilename);
+  dbAmplitude.ioHandler(&ioFinalSlip);
+  
+  spatialdata::spatialdb::SimpleDB dbSlipTime("slip time");
+  spatialdata::spatialdb::SimpleIOAscii ioSlipTime;
+  ioSlipTime.filename(slipTimeFilename);
+  dbSlipTime.ioHandler(&ioSlipTime);
+  
+  th->label("time history");
+  th->filename(timeHistoryFilename);
+
+  spatialdata::units::Nondimensional normalizer;
+
+  // setup TimeHistorySlipFn
+  slipfn->dbAmplitude(&dbAmplitude);
+  slipfn->dbSlipTime(&dbSlipTime);
+  slipfn->dbTimeHistory(th);
+  
+  slipfn->initialize(*faultMesh, normalizer, originTime);
+} // _initialize
+
+// ----------------------------------------------------------------------
+// Test initialize().
+void
+pylith::faults::TestTimeHistorySlipFn::_testInitialize(const _TestTimeHistorySlipFn::DataStruct& data)
+{ // _testInitialize
+  typedef std::set<Mesh::point_type>::const_iterator vert_iterator;  
+
+  // Setup mesh
+  topology::Mesh mesh;
+  meshio::MeshIOAscii meshIO;
+  meshIO.filename(data.meshFilename);
+  meshIO.debug(false);
+  meshIO.interpolate(false);
+  meshIO.read(&mesh);
+
+  // Set up coordinates
+  spatialdata::geocoords::CSCart cs;
+  const int spaceDim = mesh.dimension();
+  cs.setSpaceDim(spaceDim);
+  cs.initialize();
+  mesh.coordsys(&cs);
+
+  // Create fault mesh
+  topology::SubMesh faultMesh;
+  int firstFaultVertex = 0;
+  int firstFaultCell   = mesh.sieveMesh()->getIntSection(data.faultLabel)->size();
+  const bool useLagrangeConstraints = true;
+  if (useLagrangeConstraints) {
+    firstFaultCell += mesh.sieveMesh()->getIntSection(data.faultLabel)->size();
+  }
+  ALE::Obj<ALE::Mesh> faultBoundary = 0;
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  CPPUNIT_ASSERT(!sieveMesh.isNull());
+  CohesiveTopology::createFault(&faultMesh, faultBoundary,
+                                mesh, sieveMesh->getIntSection(data.faultLabel));
+  CohesiveTopology::create(&mesh, faultMesh, faultBoundary, 
+                           sieveMesh->getIntSection(data.faultLabel),
+                           data.faultId,
+                           firstFaultVertex, firstFaultCell,
+                           useLagrangeConstraints);
+  // Need to copy coordinates from mesh to fault mesh since we are not
+  // using create() instead of createParallel().
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = faultMesh.sieveMesh();
+  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+  faultSieveMesh->setRealSection("coordinates", 
+				 sieveMesh->getRealSection("coordinates"));
+
+  // Setup databases
+  spatialdata::spatialdb::SimpleDB dbAmplitude("slip amplitude");
+  spatialdata::spatialdb::SimpleIOAscii ioFinalSlip;
+  ioFinalSlip.filename(data.finalSlipFilename);
+  dbAmplitude.ioHandler(&ioFinalSlip);
+  
+  spatialdata::spatialdb::SimpleDB dbSlipTime("slip time");
+  spatialdata::spatialdb::SimpleIOAscii ioSlipTime;
+  ioSlipTime.filename(data.slipTimeFilename);
+  dbSlipTime.ioHandler(&ioSlipTime);
+  
+  spatialdata::spatialdb::TimeHistory dbTimeHistory("time history");
+  dbTimeHistory.filename(data.timeHistoryFilename);
+
+  // setup TimeHistorySlipFn
+  TimeHistorySlipFn slipfn;
+  slipfn.dbAmplitude(&dbAmplitude);
+  slipfn.dbSlipTime(&dbSlipTime);
+  slipfn.dbTimeHistory(&dbTimeHistory);
+  
+  spatialdata::units::Nondimensional normalizer;
+  const double originTime = 5.353;
+  
+  slipfn.initialize(faultMesh, normalizer, originTime);
+
+  const ALE::Obj<SieveMesh::label_sequence>& vertices =
+    faultSieveMesh->depthStratum(0);
+  const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+  CPPUNIT_ASSERT(0 != slipfn._parameters);
+  const ALE::Obj<RealSection>& finalSlipSection =
+    slipfn._parameters->get("slip amplitude").section();
+  CPPUNIT_ASSERT(!finalSlipSection.isNull());
+  const ALE::Obj<RealSection>& slipTimeSection =
+    slipfn._parameters->get("slip time").section();
+  CPPUNIT_ASSERT(!slipTimeSection.isNull());
+
+  const double tolerance = 1.0e-06;
+  int iPoint = 0;
+  for (SieveMesh::label_sequence::iterator v_iter=vertices->begin();
+       v_iter != verticesEnd;
+       ++v_iter, ++iPoint) {
+    CPPUNIT_ASSERT_EQUAL(spaceDim, finalSlipSection->getFiberDimension(*v_iter));
+    const double* amplitudeVertex = finalSlipSection->restrictPoint(*v_iter);
+    CPPUNIT_ASSERT(0 != amplitudeVertex);
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(data.amplitudeE[iPoint*spaceDim+iDim],
+				   amplitudeVertex[iDim],
+				   tolerance);
+
+    CPPUNIT_ASSERT_EQUAL(1, slipTimeSection->getFiberDimension(*v_iter));
+    const double* slipTimeVertex = slipTimeSection->restrictPoint(*v_iter);
+    CPPUNIT_ASSERT(0 != slipTimeVertex);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(data.slipTimeE[iPoint]+originTime,
+				 slipTimeVertex[0], tolerance);
+  } // for
+} // _testInitialize
+
+
+// End of file 

Added: short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/TestTimeHistorySlipFn.hh
===================================================================
--- short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/TestTimeHistorySlipFn.hh	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/TestTimeHistorySlipFn.hh	2009-10-16 23:19:12 UTC (rev 15819)
@@ -0,0 +1,131 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestTimeHistorySlipFn.hh
+ *
+ * @brief C++ TestTimeHistorySlipFn object
+ *
+ * C++ unit testing for TimeHistorySlipFn.
+ */
+
+#if !defined(pylith_faults_testtimehistoryslipfn_hh)
+#define pylith_faults_testtimehistoryslipfn_hh
+
+#include "pylith/faults/faultsfwd.hh" // USES TimeHistorySlipFn
+#include "pylith/topology/topologyfwd.hh" // USES Mesh, SubMesh
+#include "spatialdata/spatialdb/spatialdbfwd.hh" // USES TimeHistory
+
+#include <cppunit/extensions/HelperMacros.h>
+
+/// Namespace for pylith package
+namespace pylith {
+  namespace faults {
+    class TestTimeHistorySlipFn;
+
+    namespace _TestTimeHistorySlipFn {
+      struct DataStruct;
+    } // _TimeHistorySlipTimeFn
+  } // faults
+} // pylith
+
+/// C++ unit testing for TimeHistorySlipFn
+class pylith::faults::TestTimeHistorySlipFn : public CppUnit::TestFixture
+{ // class TestTimeHistorySlipFn
+
+  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+  CPPUNIT_TEST_SUITE( TestTimeHistorySlipFn );
+
+  CPPUNIT_TEST( testConstructor );
+  CPPUNIT_TEST( testDbAmplitude );
+  CPPUNIT_TEST( testDbSlipTime );
+  CPPUNIT_TEST( testDbTimeHistory );
+  CPPUNIT_TEST( testInitialize1D );
+  CPPUNIT_TEST( testInitialize2D );
+  CPPUNIT_TEST( testInitialize3D );
+  CPPUNIT_TEST( testSlip );
+  CPPUNIT_TEST( testSlipIncr );
+
+  CPPUNIT_TEST_SUITE_END();
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /// Test constructor.
+  void testConstructor(void);
+
+  /// Test dbAmplitude().
+  void testDbAmplitude(void);
+
+  /// Test dbSlipTime().
+  void testDbSlipTime(void);
+
+  /// Test dbTimeHistory().
+  void testDbTimeHistory(void);
+
+  /// Test initialize() in 1-D.
+  void testInitialize1D(void);
+
+  /// Test initialize() in 2-D.
+  void testInitialize2D(void);
+
+  /// Test initialize() in 3-D.
+  void testInitialize3D(void);
+
+  /// Test slip().
+  void testSlip(void);
+
+  /// Test slipIncr().
+  void testSlipIncr(void);
+
+  // PRIVATE METHODS ////////////////////////////////////////////////////
+private :
+
+  /** Initialize TimeHistorySlipFn.
+   *
+   * @param mesh Finite-element mesh of domain.
+   * @param faultMesh Finite-element mesh of fault.
+   * @param slipfn Step slip function.
+   * @param th Time history database.
+   * @param originTime Origin time for earthquake rupture.
+   */
+  static
+  void _initialize(topology::Mesh* mesh,
+		   topology::SubMesh* faultMesh,
+		   TimeHistorySlipFn* slipfn,
+		   spatialdata::spatialdb::TimeHistory* th,
+		   const double originTime);
+
+  /** Test intialize().
+   *
+   * @param data Data for initialization and testing of TimeHistorySlipFn.
+   */
+  static
+  void _testInitialize(const _TestTimeHistorySlipFn::DataStruct& data);
+
+  /** Slip time function.
+   *
+   * @param t Time relative to when slip begins.
+   * @param finalSlip Final slip.
+   * @param riseTime Rise time (t95).
+   */
+  static
+  double _slipFn(const double t,
+		 const double finalSlip,
+		 const double riseTime);
+
+}; // class TestTimeHistorySlipFn
+
+#endif // pylith_faults_testtimehistoryslipfn_hh
+
+
+// End of file 

Modified: short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/data/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/data/Makefile.am	2009-10-16 15:31:15 UTC (rev 15818)
+++ short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/data/Makefile.am	2009-10-16 23:19:12 UTC (rev 15819)
@@ -11,6 +11,7 @@
 #
 
 dist_noinst_DATA = \
+	slipfn.timedb \
 	bulkprops_1d.spatialdb \
 	bulkprops_2d.spatialdb \
 	bulkprops_3d.spatialdb \

Added: short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/data/slipfn.timedb
===================================================================
--- short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/data/slipfn.timedb	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-friction/unittests/libtests/faults/data/slipfn.timedb	2009-10-16 23:19:12 UTC (rev 15819)
@@ -0,0 +1,10 @@
+#TIME HISTORY ascii
+TimeHistory {
+  num-points = 5
+  time-units = second
+}
+ 0.0  0.0
+ 1.0  0.5
+ 4.0  0.8
+ 8.0  1.0
+10.0  1.0

Modified: short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/Makefile.am	2009-10-16 15:31:15 UTC (rev 15818)
+++ short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/Makefile.am	2009-10-16 23:19:12 UTC (rev 15819)
@@ -27,7 +27,8 @@
 	TestFaultCohesiveKin.py \
 	TestLiuCosSlipFn.py \
 	TestSingleRupture.py \
-	TestStepSlipFn.py
+	TestStepSlipFn.py \
+	TestTimeHistorySlipFn.py
 
 
 # End of file 

Added: short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/TestTimeHistorySlipFn.py
===================================================================
--- short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/TestTimeHistorySlipFn.py	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/TestTimeHistorySlipFn.py	2009-10-16 23:19:12 UTC (rev 15819)
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+#
+# ======================================================================
+#
+#                           Brad T. Aagaard
+#                        U.S. Geological Survey
+#
+# {LicenseText}
+#
+# ======================================================================
+#
+
+## @file unittests/pytests/faults/TestTimeHistorySlipFn.py
+
+## @brief Unit testing of TimeHistorySlipFn object.
+
+import unittest
+
+from pylith.faults.TimeHistorySlipFn import TimeHistorySlipFn
+
+# ----------------------------------------------------------------------
+class TestTimeHistorySlipFn(unittest.TestCase):
+  """
+  Unit testing of TimeHistorySlipFn object.
+  """
+
+  def test_constructor(self):
+    """
+    Test constructor.
+    """
+    slipFn = TimeHistorySlipFn()
+    return
+
+
+  def test_configure(self):
+    """
+    Test constructor.
+    """
+    slipFn = TimeHistorySlipFn()
+    slipFn._configure()
+    return
+
+
+  def test_initialize(self):
+    """
+    Test initialize().
+    """
+    from spatialdata.spatialdb.SimpleDB import SimpleDB
+    from spatialdata.spatialdb.SimpleIOAscii import SimpleIOAscii
+    from spatialdata.spatialdb.TimeHistory import TimeHistory
+
+    ioFinalSlip = SimpleIOAscii()
+    ioFinalSlip.inventory.filename = "finalslip.spatialdb"
+    ioFinalSlip._configure()
+    dbFinalSlip = SimpleDB()
+    dbFinalSlip.inventory.iohandler = ioFinalSlip
+    dbFinalSlip.inventory.label = "slip amplitude"
+    dbFinalSlip._configure()
+    
+    ioSlipTime = SimpleIOAscii()
+    ioSlipTime.inventory.filename = "sliptime.spatialdb"
+    ioSlipTime._configure()
+    dbSlipTime = SimpleDB()
+    dbSlipTime.inventory.iohandler = ioSlipTime
+    dbSlipTime.inventory.label = "slip time"
+    dbSlipTime._configure()
+    
+    dbTimeHistory = TimeHistory()
+    dbTimeHistory.inventory.filename = "slipfn.timedb"
+    dbTimeHistory.inventory.label = "time history"
+    dbTimeHistory._configure()
+    
+    slipFn = TimeHistorySlipFn()
+    slipFn.inventory.dbslip = dbFinalSlip
+    slipFn.inventory.dbSlipTime = dbSlipTime
+    slipFn.inventory.dbTimeHistory = dbTimeHistory
+    slipFn._configure()
+    slipFn.preinitialize()
+    slipFn.verifyConfiguration()
+    slipFn.initialize()
+    return
+
+
+  def test_factory(self):
+    """
+    Test factory method.
+    """
+    from pylith.faults.TimeHistorySlipFn import slip_time_fn
+    fn = slip_time_fn()
+    return
+
+
+# End of file 

Added: short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/data/slipfn.timedb
===================================================================
--- short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/data/slipfn.timedb	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/data/slipfn.timedb	2009-10-16 23:19:12 UTC (rev 15819)
@@ -0,0 +1,10 @@
+#TIME HISTORY ascii
+TimeHistory {
+  num-points = 5
+  time-units = second
+}
+ 0.0  0.0
+ 1.0  0.5
+ 4.0  0.8
+ 8.0  1.0
+10.0  1.0

Modified: short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/testfaults.py
===================================================================
--- short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/testfaults.py	2009-10-16 15:31:15 UTC (rev 15818)
+++ short/3D/PyLith/branches/pylith-friction/unittests/pytests/faults/testfaults.py	2009-10-16 23:19:12 UTC (rev 15819)
@@ -68,6 +68,9 @@
     from TestLiuCosSlipFn import TestLiuCosSlipFn
     suite.addTest(unittest.makeSuite(TestLiuCosSlipFn))
 
+    from TestTimeHistorySlipFn import TestTimeHistorySlipFn
+    suite.addTest(unittest.makeSuite(TestTimeHistorySlipFn))
+
     from TestEqKinSrc import TestEqKinSrc
     suite.addTest(unittest.makeSuite(TestEqKinSrc))
 



More information about the CIG-COMMITS mailing list