[cig-commits] r7087 - in short/3D/PyLith/trunk: . libsrc/faults modulesrc/faults pylith/faults unittests/libtests/faults unittests/pytests/faults

brad at geodynamics.org brad at geodynamics.org
Wed Jun 6 21:32:15 PDT 2007


Author: brad
Date: 2007-06-06 21:32:14 -0700 (Wed, 06 Jun 2007)
New Revision: 7087

Added:
   short/3D/PyLith/trunk/unittests/pytests/faults/TestBruneSlipFn.py
Modified:
   short/3D/PyLith/trunk/TODO
   short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc
   short/3D/PyLith/trunk/modulesrc/faults/faults.pyxe.src
   short/3D/PyLith/trunk/pylith/faults/BruneSlipFn.py
   short/3D/PyLith/trunk/unittests/libtests/faults/TestBruneSlipFn.cc
   short/3D/PyLith/trunk/unittests/pytests/faults/Makefile.am
   short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py
Log:
Finished C++ and Python unit tests for BruneSlipFn. Fixed some bugs in BruneSlipFn exposed by unit tests.

Modified: short/3D/PyLith/trunk/TODO
===================================================================
--- short/3D/PyLith/trunk/TODO	2007-06-07 04:03:56 UTC (rev 7086)
+++ short/3D/PyLith/trunk/TODO	2007-06-07 04:32:14 UTC (rev 7087)
@@ -26,16 +26,9 @@
 
    b. Implement integrator for faults
 
-     i. BruneSlipFn
+     i. EqKinSrc
        (1) C++ unit tests
-         slip()
-       (2) Python unit tests
          constructor
-         initialize()
-
-     ii. EqKinSrc
-       (1) C++ unit tests
-         constructor
          slipfn()
          initialize()
          slip()
@@ -43,7 +36,7 @@
          constructor
          initialize()
 
-     iii. FaultCohesiveKin
+     ii. FaultCohesiveKin
        (1) C++ unit tests
          constructor
          eqsrc()
@@ -65,6 +58,10 @@
 
 4. Implement absorbing boundary conditions
 
+5. Additional unit tests
+  a. FaultCohesive
+    i. Check faultMesh
+
 ======================================================================
 SECONDARY PRIORITIES
 ======================================================================

Modified: short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc	2007-06-07 04:03:56 UTC (rev 7086)
+++ short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc	2007-06-07 04:32:14 UTC (rev 7087)
@@ -192,7 +192,7 @@
 // Get slip on fault surface at time t.
 const ALE::Obj<pylith::real_section_type>&
 pylith::faults::BruneSlipFn::slip(const double t,
-				const std::set<Mesh::point_type>& vertices)
+				  const std::set<Mesh::point_type>& vertices)
 { // slip
   typedef std::set<Mesh::point_type>::const_iterator vert_iterator;  
 

Modified: short/3D/PyLith/trunk/modulesrc/faults/faults.pyxe.src
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/faults.pyxe.src	2007-06-07 04:03:56 UTC (rev 7086)
+++ short/3D/PyLith/trunk/modulesrc/faults/faults.pyxe.src	2007-06-07 04:32:14 UTC (rev 7087)
@@ -312,4 +312,88 @@
     return
 
 
+  property dbFinalSlip:
+    def __set__(self, value):
+      """
+      Set database for final slip.
+      """
+      # create shim for method 'dbFinalSlip'
+      #embed{ void BruneSlipFn_dbFinalSlip_set(void* objVptr, void* dbVptr)
+      try {
+        assert(0 != objVptr);
+        assert(0 != dbVptr);
+        spatialdata::spatialdb::SpatialDB* db =
+          (spatialdata::spatialdb::SpatialDB*) dbVptr;
+        ((pylith::faults::BruneSlipFn*) objVptr)->dbFinalSlip(db);
+      } catch (const std::exception& err) {
+        PyErr_SetString(PyExc_RuntimeError,
+                        const_cast<char*>(err.what()));
+      } catch (...) {
+        PyErr_SetString(PyExc_RuntimeError,
+                        "Caught unknown C++ exception.");
+      } // try/catch
+      #}embed
+      if not value.name == "spatialdata_spatialdb_SpatialDB":
+        raise TypeError, \
+              "Argument must be extension module type " \
+              "'spatialdata::spatialdb::SpatialDB'."
+      BruneSlipFn_dbFinalSlip_set(self.thisptr, ptrFromHandle(value))
+
+
+  property dbSlipTime:
+    def __set__(self, value):
+      """
+      Set database for slip initiation time.
+      """
+      # create shim for method 'dbSlipTime'
+      #embed{ void BruneSlipFn_dbSlipTime_set(void* objVptr, void* dbVptr)
+      try {
+        assert(0 != objVptr);
+        assert(0 != dbVptr);
+        spatialdata::spatialdb::SpatialDB* db =
+          (spatialdata::spatialdb::SpatialDB*) dbVptr;
+        ((pylith::faults::BruneSlipFn*) objVptr)->dbSlipTime(db);
+      } catch (const std::exception& err) {
+        PyErr_SetString(PyExc_RuntimeError,
+                        const_cast<char*>(err.what()));
+      } catch (...) {
+        PyErr_SetString(PyExc_RuntimeError,
+                        "Caught unknown C++ exception.");
+      } // try/catch
+      #}embed
+      if not value.name == "spatialdata_spatialdb_SpatialDB":
+        raise TypeError, \
+              "Argument must be extension module type " \
+              "'spatialdata::spatialdb::SpatialDB'."
+      BruneSlipFn_dbSlipTime_set(self.thisptr, ptrFromHandle(value))
+
+
+  property dbPeakRate:
+    def __set__(self, value):
+      """
+      Set database for peak slip rate.
+      """
+      # create shim for method 'dbPeakRate'
+      #embed{ void BruneSlipFn_dbPeakRate_set(void* objVptr, void* dbVptr)
+      try {
+        assert(0 != objVptr);
+        assert(0 != dbVptr);
+        spatialdata::spatialdb::SpatialDB* db =
+          (spatialdata::spatialdb::SpatialDB*) dbVptr;
+        ((pylith::faults::BruneSlipFn*) objVptr)->dbPeakRate(db);
+      } catch (const std::exception& err) {
+        PyErr_SetString(PyExc_RuntimeError,
+                        const_cast<char*>(err.what()));
+      } catch (...) {
+        PyErr_SetString(PyExc_RuntimeError,
+                        "Caught unknown C++ exception.");
+      } // try/catch
+      #}embed
+      if not value.name == "spatialdata_spatialdb_SpatialDB":
+        raise TypeError, \
+              "Argument must be extension module type " \
+              "'spatialdata::spatialdb::SpatialDB'."
+      BruneSlipFn_dbPeakRate_set(self.thisptr, ptrFromHandle(value))
+
+
 # End of file 

Modified: short/3D/PyLith/trunk/pylith/faults/BruneSlipFn.py
===================================================================
--- short/3D/PyLith/trunk/pylith/faults/BruneSlipFn.py	2007-06-07 04:03:56 UTC (rev 7086)
+++ short/3D/PyLith/trunk/pylith/faults/BruneSlipFn.py	2007-06-07 04:32:14 UTC (rev 7087)
@@ -87,9 +87,9 @@
     self.slipTime.initialize()
     self.slipRate.initialize()
 
-    self.cppHandle.dbSlip = self.slip.cppHandle
+    self.cppHandle.dbFinalSlip = self.slip.cppHandle
     self.cppHandle.dbSlipTime = self.slipTime.cppHandle
-    self.cppHandle.dbSlipRate = self.slipRate.cppHandle
+    self.cppHandle.dbPeakRate = self.slipRate.cppHandle
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/faults/TestBruneSlipFn.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestBruneSlipFn.cc	2007-06-07 04:03:56 UTC (rev 7086)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestBruneSlipFn.cc	2007-06-07 04:32:14 UTC (rev 7087)
@@ -212,7 +212,95 @@
 void
 pylith::faults::TestBruneSlipFn::testSlip(void)
 { // testSlip
-  throw std::logic_error("Unit test not implemented.");
+  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* peakRateFilename = "data/tri3_peakrate.spatialdb";
+  const int constraintPts[] = { 3, 4 };
+  const double finalSlipE[] = { 2.3, 0.1, 
+				2.4, 0.2};
+  const double slipTimeE[] = { 1.2, 1.3 };
+  const double peakRateE[] = { 1.4, 1.5 };
+  const int numConstraintPts = 2;
+
+  ALE::Obj<Mesh> mesh;
+  meshio::MeshIOAscii meshIO;
+  meshIO.filename(meshFilename);
+  meshIO.debug(false);
+  meshIO.interpolate(false);
+  meshIO.read(&mesh);
+  CPPUNIT_ASSERT(!mesh.isNull());
+  const int spaceDim = mesh->getDimension();
+  spatialdata::geocoords::CSCart cs;
+  cs.setSpaceDim(spaceDim);
+
+  // Create fault mesh
+  ALE::Obj<Mesh> faultMesh;
+  const bool useLagrangeConstraints = true;
+  CohesiveTopology::create(&faultMesh, mesh, 
+			   mesh->getIntSection(faultLabel),
+			   faultId);
+  CPPUNIT_ASSERT(!faultMesh.isNull());
+
+  // Create set of constraint vertices
+  std::set<Mesh::point_type> eqsrcVertices;
+  for (int i=0; i < numConstraintPts; ++i)
+    eqsrcVertices.insert(constraintPts[i]);
+  CPPUNIT_ASSERT_EQUAL(numConstraintPts, int(eqsrcVertices.size()));
+  
+  // Setup databases
+  spatialdata::spatialdb::SimpleDB dbFinalSlip("final slip");
+  spatialdata::spatialdb::SimpleIOAscii ioFinalSlip;
+  ioFinalSlip.filename(finalSlipFilename);
+  dbFinalSlip.ioHandler(&ioFinalSlip);
+  
+  spatialdata::spatialdb::SimpleDB dbSlipTime("slip time");
+  spatialdata::spatialdb::SimpleIOAscii ioSlipTime;
+  ioSlipTime.filename(slipTimeFilename);
+  dbSlipTime.ioHandler(&ioSlipTime);
+  
+  spatialdata::spatialdb::SimpleDB dbPeakRate("peak rate");
+  spatialdata::spatialdb::SimpleIOAscii ioPeakRate;
+  ioPeakRate.filename(peakRateFilename);
+  dbPeakRate.ioHandler(&ioPeakRate);
+
+  // setup BruneSlipFn
+  BruneSlipFn slipFn;
+  slipFn.dbFinalSlip(&dbFinalSlip);
+  slipFn.dbSlipTime(&dbSlipTime);
+  slipFn.dbPeakRate(&dbPeakRate);
+  
+  slipFn.initialize(mesh, faultMesh, eqsrcVertices, &cs);
+  
+  const double t = 2.134;
+  const ALE::Obj<real_section_type>& slip = slipFn.slip(t, eqsrcVertices);
+  CPPUNIT_ASSERT(!slip.isNull());
+
+  int iPoint = 0;
+  const double tolerance = 1.0e-06;
+  typedef std::set<Mesh::point_type>::const_iterator vert_iterator;  
+  const vert_iterator vBegin = eqsrcVertices.begin();
+  const vert_iterator vEnd = eqsrcVertices.end();
+  for (vert_iterator v_iter=vBegin; v_iter != vEnd; ++v_iter, ++iPoint) {
+    double slipMag = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      slipMag += pow(finalSlipE[iPoint*spaceDim+iDim], 2);
+    slipMag = sqrt(slipMag);
+    const double tau = slipMag / (exp(1.0) * peakRateE[iPoint]);
+    const double t0 = slipTimeE[iPoint];
+    const double slipNorm = 1.0 - exp(-(t-t0)/tau) * (1.0 + (t-t0)/tau);
+
+    const int fiberDim = slip->getFiberDimension(*v_iter);
+    CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
+    const real_section_type::value_type* vals = 
+      slip->restrictPoint(*v_iter);
+    for (int iDim=0; iDim < fiberDim; ++iDim) {
+      const double slipE = finalSlipE[iPoint*spaceDim+iDim] * slipNorm;
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(slipE, vals[iDim], tolerance);
+    } // for
+  } // for
 } // testSlip
 
 // ----------------------------------------------------------------------
@@ -312,7 +400,7 @@
   int iPoint = 0;
   const vert_iterator vBegin = eqsrcVertices.begin();
   const vert_iterator vEnd = eqsrcVertices.end();
-  for (vert_iterator v_iter=vBegin; v_iter != vEnd; ++v_iter) {
+  for (vert_iterator v_iter=vBegin; v_iter != vEnd; ++v_iter, ++iPoint) {
     { // final slip
       const int fiberDim = finalSlip->getFiberDimension(*v_iter);
       CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
@@ -339,8 +427,6 @@
 	peakRate->restrictPoint(*v_iter);
       CPPUNIT_ASSERT_DOUBLES_EQUAL(data.peakRateE[iPoint], vals[0], tolerance);
     } // peak rate
-
-    ++iPoint;
   } // for
 } // _testInitialize
 

Modified: short/3D/PyLith/trunk/unittests/pytests/faults/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/faults/Makefile.am	2007-06-07 04:03:56 UTC (rev 7086)
+++ short/3D/PyLith/trunk/unittests/pytests/faults/Makefile.am	2007-06-07 04:32:14 UTC (rev 7087)
@@ -20,6 +20,7 @@
 check_SCRIPTS = testfaults.py
 
 noinst_PYTHON = \
+	TestBruneSlipFn.py \
 	TestFault.py \
 	TestFaultCohesive.py \
 	TestFaultCohesiveKin.py

Added: short/3D/PyLith/trunk/unittests/pytests/faults/TestBruneSlipFn.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/faults/TestBruneSlipFn.py	2007-06-07 04:03:56 UTC (rev 7086)
+++ short/3D/PyLith/trunk/unittests/pytests/faults/TestBruneSlipFn.py	2007-06-07 04:32:14 UTC (rev 7087)
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+#
+# ======================================================================
+#
+#                           Brad T. Aagaard
+#                        U.S. Geological Survey
+#
+# {LicenseText}
+#
+# ======================================================================
+#
+
+## @file unittests/pytests/faults/TestBruneSlipFn.py
+
+## @brief Unit testing of BruneSlipFn object.
+
+import unittest
+
+from pylith.faults.BruneSlipFn import BruneSlipFn
+
+# ----------------------------------------------------------------------
+class TestBruneSlipFn(unittest.TestCase):
+  """
+  Unit testing of BruneSlipFn object.
+  """
+
+  def test_constructor(self):
+    """
+    Test constructor.
+    """
+    slipFn = BruneSlipFn()
+    self.failIfEqual(None, slipFn.cppHandle)
+    return
+
+
+  def test_initialize(self):
+    """
+    Test initialize().
+    """
+    from spatialdata.spatialdb.SimpleDB import SimpleDB
+    from spatialdata.spatialdb.SimpleIOAscii import SimpleIOAscii
+
+    ioFinalSlip = SimpleIOAscii()
+    ioFinalSlip.filename = "finalslip.spatialdb"
+    dbFinalSlip = SimpleDB()
+    dbFinalSlip.iohandler = ioFinalSlip
+    dbFinalSlip.label = "final slip"
+    
+    ioSlipTime = SimpleIOAscii()
+    ioSlipTime.filename = "sliptime.spatialdb"
+    dbSlipTime = SimpleDB()
+    dbSlipTime.iohandler = ioSlipTime
+    dbSlipTime.label = "slip time"
+    
+    ioPeakRate = SimpleIOAscii()
+    ioPeakRate.filename = "peakrate.spatialdb"
+    dbPeakRate = SimpleDB()
+    dbPeakRate.iohandler = ioPeakRate
+    dbPeakRate.label = "peak rate"
+    
+    slipFn = BruneSlipFn()
+    slipFn.slip = dbFinalSlip
+    slipFn.slipTime = dbSlipTime
+    slipFn.slipRate = dbPeakRate
+    slipFn.initialize()
+    return
+
+
+# End of file 

Modified: short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py	2007-06-07 04:03:56 UTC (rev 7086)
+++ short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py	2007-06-07 04:32:14 UTC (rev 7087)
@@ -56,6 +56,9 @@
 
     suite = unittest.TestSuite()
 
+    from TestBruneSlipFn import TestBruneSlipFn
+    suite.addTest(unittest.makeSuite(TestBruneSlipFn))
+
     from TestFault import TestFault
     suite.addTest(unittest.makeSuite(TestFault))
 



More information about the cig-commits mailing list