[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