[cig-commits] r16548 - in short/3D/PyLith/trunk: libsrc/faults libsrc/friction modulesrc/friction unittests/libtests/friction unittests/libtests/friction/data
brad at geodynamics.org
brad at geodynamics.org
Tue Apr 13 09:23:26 PDT 2010
Author: brad
Date: 2010-04-13 09:23:25 -0700 (Tue, 13 Apr 2010)
New Revision: 16548
Added:
short/3D/PyLith/trunk/unittests/libtests/friction/data/friction_slipweakening.spatialdb
Modified:
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc
short/3D/PyLith/trunk/libsrc/friction/FrictionModel.cc
short/3D/PyLith/trunk/libsrc/friction/FrictionModel.hh
short/3D/PyLith/trunk/modulesrc/friction/FrictionModel.i
short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc
short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am
Log:
Fixed bug where friction state variables were computed but not updated in section.
Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc 2010-04-13 14:14:42 UTC (rev 16547)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc 2010-04-13 16:23:25 UTC (rev 16548)
@@ -289,14 +289,14 @@
const double slipMag = 0.0;
const double slipRateMag = 0.0;
const double tractionNormal = tractionTpdtVertex[0];
- _friction->updateStateVars(slipMag, slipRateMag, tractionNormal);
+ _friction->updateStateVars(slipMag, slipRateMag, tractionNormal, v_fault);
break;
} // case 1
case 2: { // case 2
const double slipMag = fabs(slipVertex[0]);
const double slipRateMag = fabs(slipRateVertex[0]);
const double tractionNormal = tractionTpdtVertex[1];
- _friction->updateStateVars(slipMag, slipRateMag, tractionNormal);
+ _friction->updateStateVars(slipMag, slipRateMag, tractionNormal, v_fault);
break;
} // case 2
case 3: { // case 3
@@ -306,7 +306,7 @@
sqrt(slipRateVertex[0]*slipRateVertex[0] +
slipRateVertex[1]*slipRateVertex[1]);
const double tractionNormal = tractionTpdtVertex[2];
- _friction->updateStateVars(slipMag, slipRateMag, tractionNormal);
+ _friction->updateStateVars(slipMag, slipRateMag, tractionNormal, v_fault);
break;
} // case 3
default:
Modified: short/3D/PyLith/trunk/libsrc/friction/FrictionModel.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/friction/FrictionModel.cc 2010-04-13 14:14:42 UTC (rev 16547)
+++ short/3D/PyLith/trunk/libsrc/friction/FrictionModel.cc 2010-04-13 16:23:25 UTC (rev 16548)
@@ -641,11 +641,22 @@
void
pylith::friction::FrictionModel::updateStateVars(const double slip,
const double slipRate,
- const double normalTraction)
+ const double normalTraction,
+ const int vertex)
{ // updateStateVars
+ if (0 == _numVarsVertex)
+ return;
+
_updateStateVars(slip, slipRate, normalTraction,
&_stateVarsVertex[0], _stateVarsVertex.size(),
&_propertiesVertex[0], _propertiesVertex.size());
+
+ const ALE::Obj<RealSection>& stateVarsSection = _stateVars->section();
+ assert(!stateVarsSection.isNull());
+ assert(_stateVarsVertex.size() ==
+ stateVarsSection->getFiberDimension(vertex));
+ stateVarsSection->updatePoint(vertex, &_stateVarsVertex[0],
+ _stateVarsVertex.size());
} // updateStateVars
// ----------------------------------------------------------------------
Modified: short/3D/PyLith/trunk/libsrc/friction/FrictionModel.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/friction/FrictionModel.hh 2010-04-13 14:14:42 UTC (rev 16547)
+++ short/3D/PyLith/trunk/libsrc/friction/FrictionModel.hh 2010-04-13 16:23:25 UTC (rev 16548)
@@ -186,10 +186,12 @@
* @param slip Current slip at location.
* @param slipRate Current slip rate at location.
* @param normalTraction Normal traction at location.
+ * @param vertex Finite-element vertex on friction interface.
*/
void updateStateVars(const double slip,
const double slipRate,
- const double normalTraction);
+ const double normalTraction,
+ const int vertex);
// PROTECTED METHODS //////////////////////////////////////////////////
protected :
Modified: short/3D/PyLith/trunk/modulesrc/friction/FrictionModel.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/friction/FrictionModel.i 2010-04-13 14:14:42 UTC (rev 16547)
+++ short/3D/PyLith/trunk/modulesrc/friction/FrictionModel.i 2010-04-13 16:23:25 UTC (rev 16548)
@@ -166,10 +166,12 @@
* @param slip Current slip at location.
* @param slipRate Current slip rate at location.
* @param normalTraction Normal traction at location.
+ * @param vertex Finite-element vertex on friction interface.
*/
void updateStateVars(const double slip,
const double slipRate,
- const double normalTraction);
+ const double normalTraction,
+ const int vertex);
// PROTECTED METHODS //////////////////////////////////////////////
protected :
Modified: short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc 2010-04-13 14:14:42 UTC (rev 16547)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc 2010-04-13 16:23:25 UTC (rev 16548)
@@ -314,45 +314,64 @@
friction.timeStep(data.dt);
friction.retrievePropsAndVars(vertex);
- friction.updateStateVars(slip, slipRate, normalTraction);
+ friction.updateStateVars(slip, slipRate, normalTraction, vertex);
// no outcome to test
} // Test with friction model without state variables
{ // Test with friction model with state variables (slip weakening)
- // Initialize uses static friction, so we hardwire the properties
- // and stateVars
+ // Initialize uses static friction, so we change to slip weakening.
+ topology::Mesh mesh;
+ faults::FaultCohesiveDyn fault;
+ StaticFriction frictionDummy;
+ StaticFrictionData data;
+ _initialize(&mesh, &fault, &frictionDummy, &data);
+
+ SlipWeakening friction;
+ spatialdata::spatialdb::SimpleDB db;
+ spatialdata::spatialdb::SimpleIOAscii dbIO;
+ dbIO.filename("data/friction_slipweakening.spatialdb");
+ db.ioHandler(&dbIO);
+ db.queryType(spatialdata::spatialdb::SimpleDB::NEAREST);
+
+ friction.dbProperties(&db);
+ fault.frictionModel(&friction);
+
+ const double upDir[] = { 0.0, 0.0, 1.0 };
+ const double normalDir[] = { 1.0, 0.0, 0.0 };
+ fault.initialize(mesh, upDir, normalDir);
+ const int vertex = 2;
+
const double slip = 0.25;
const double slipRate = 0.64;
const double normalTraction = -2.3;
const double cohesion = 1000000;
const double dt = 0.01;
- const size_t numProperties = 4;
- const double properties[4] = { 0.6, 0.5, 0.004, 1000000 };
- const size_t numStateVars = 2;
+ const int numStateVars = 2;
const double stateVars[2] = { 0.5, 0.1 };
- const double stateVarsUpdated[2] = { 0.65, 0.5 };
+ const double stateVarsUpdatedE[2] = { 0.65, 0.5 };
- SlipWeakening friction;
- friction._propertiesVertex.resize(numProperties);
- for (size_t i=0; i < numProperties; ++i)
- friction._propertiesVertex[i] = properties[i];
- friction._stateVarsVertex.resize(numStateVars);
+ // Set state variables to given values
+ CPPUNIT_ASSERT_EQUAL(numStateVars, int(friction._stateVarsVertex.size()));
for (size_t i=0; i < numStateVars; ++i)
friction._stateVarsVertex[i] = stateVars[i];
friction.timeStep(dt);
- friction.updateStateVars(slip, slipRate, normalTraction);
+ friction.updateStateVars(slip, slipRate, normalTraction, vertex);
- CPPUNIT_ASSERT_EQUAL(numStateVars, friction._stateVarsVertex.size());
-
const double tolerance = 1.0e-06;
- CPPUNIT_ASSERT_DOUBLES_EQUAL(stateVarsUpdated[0],
- friction._stateVarsVertex[0], tolerance);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(stateVarsUpdated[1],
- friction._stateVarsVertex[1], tolerance);
+ CPPUNIT_ASSERT(0 != friction._stateVars);
+ const ALE::Obj<RealSection>& stateVarsSection =
+ friction._stateVars->section();
+ const double* stateVarsUpdated = stateVarsSection->restrictPoint(vertex);
+ CPPUNIT_ASSERT_EQUAL(numStateVars,
+ stateVarsSection->getFiberDimension(vertex));
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(stateVarsUpdatedE[0],
+ stateVarsUpdated[0], tolerance);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(stateVarsUpdatedE[1],
+ stateVarsUpdated[1], tolerance);
} // Test with friction model with state variables (slip weakening)
} // testUpdateStateVars
Modified: short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am 2010-04-13 14:14:42 UTC (rev 16547)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am 2010-04-13 16:23:25 UTC (rev 16548)
@@ -12,7 +12,8 @@
dist_noinst_DATA = \
tri3.mesh \
- friction_static.spatialdb
+ friction_static.spatialdb \
+ friction_slipweakening.spatialdb
noinst_TMP =
Added: short/3D/PyLith/trunk/unittests/libtests/friction/data/friction_slipweakening.spatialdb
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/data/friction_slipweakening.spatialdb (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/data/friction_slipweakening.spatialdb 2010-04-13 16:23:25 UTC (rev 16548)
@@ -0,0 +1,15 @@
+#SPATIAL.ascii 1
+SimpleDB {
+ num-values = 4
+ value-names = static-coefficient dynamic-coefficient slip-weakening-parameter cohesion
+ value-units = none none m Pa
+ num-locs = 2
+ data-dim = 1
+ space-dim = 2
+ cs-data = cartesian {
+ to-meters = 1.0
+ space-dim = 2
+ }
+}
+0.0 1.0 0.6 0.5 0.004 1000000
+0.0 -1.0 0.4 0.3 0.003 1000000
More information about the CIG-COMMITS
mailing list