[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