[cig-commits] r16314 - in short/3D/PyLith/trunk: libsrc/faults unittests/libtests/faults unittests/pytests/faults

brad at geodynamics.org brad at geodynamics.org
Mon Feb 22 16:57:53 PST 2010


Author: brad
Date: 2010-02-22 16:57:53 -0800 (Mon, 22 Feb 2010)
New Revision: 16314

Modified:
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc
   short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py
Log:
Finished implementing updateStateVars() for dynamic (friction) fault.

Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc	2010-02-23 00:28:40 UTC (rev 16313)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc	2010-02-23 00:57:53 UTC (rev 16314)
@@ -145,7 +145,119 @@
   assert(0 != fields);
   assert(0 != _fields);
 
-  // :TODO: Update friction state variables
+  _updateSlipRate(*fields);
+
+  const int spaceDim = _quadrature->spaceDim();
+
+  // Allocate arrays for vertex values
+  double_array tractionTVertex(spaceDim);
+  double_array tractionTpdtVertex(spaceDim);
+  double_array slipTpdtVertex(spaceDim);
+  double_array lagrangeTpdtVertex(spaceDim);
+
+  // Get sections
+  double_array slipVertex(spaceDim);
+  const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
+  assert(!slipSection.isNull());
+
+  double_array slipRateVertex(spaceDim);
+  const ALE::Obj<RealSection>& slipRateSection =
+      _fields->get("slip rate").section();
+  assert(!slipRateSection.isNull());
+
+  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+  assert(!areaSection.isNull());
+
+  double_array tractionInitialVertex(spaceDim);
+  const ALE::Obj<RealSection>& tractionInitialSection =
+      (0 != _dbInitialTract) ? _fields->get("initial traction").section() : 0;
+
+  double_array lagrangeTVertex(spaceDim);
+  const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
+  assert(!dispTSection.isNull());
+
+  double_array lagrangeTIncrVertex(spaceDim);
+  const ALE::Obj<RealSection>& dispTIncrSection =
+      fields->get("dispIncr(t->t+dt)").section();
+  assert(!dispTIncrSection.isNull());
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    const int v_fault = _cohesiveVertices[iVertex].fault;
+    const int v_negative = _cohesiveVertices[iVertex].negative;
+    const int v_positive = _cohesiveVertices[iVertex].positive;
+
+    // Get slip
+    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+
+    // Get slip rate
+    slipRateSection->restrictPoint(v_fault, &slipRateVertex[0],
+      slipRateVertex.size());
+
+    // Get total fault area asssociated with vertex (assembled over all cells)
+    const double* areaVertex = areaSection->restrictPoint(v_fault);
+    assert(0 != areaVertex);
+    assert(1 == areaSection->getFiberDimension(v_fault));
+
+    // Get initial fault tractions
+    if (0 != _dbInitialTract) {
+      assert(!tractionInitialSection.isNull());
+      tractionInitialSection->restrictPoint(v_fault,
+        &tractionInitialVertex[0], tractionInitialVertex.size());
+    } // if
+
+    // Get Lagrange multiplier values from disp(t), and dispIncr(t->t+dt)
+    dispTSection->restrictPoint(v_lagrange, &lagrangeTVertex[0],
+      lagrangeTVertex.size());
+    dispTIncrSection->restrictPoint(v_lagrange, &lagrangeTIncrVertex[0],
+      lagrangeTIncrVertex.size());
+
+    // Compute Lagrange multiplier at time t+dt
+    lagrangeTpdtVertex = lagrangeTVertex + lagrangeTIncrVertex;
+
+    // :KLUDGE: Solution at Lagrange constraint vertices is the
+    // Lagrange multiplier value, which is currently the force.
+    // Compute traction by dividing force by area
+    assert(*areaVertex > 0);
+    tractionTVertex = lagrangeTVertex / (*areaVertex);
+      tractionTpdtVertex = lagrangeTpdtVertex / (*areaVertex);
+
+    // Get friction properties and state variables.
+    _friction->retrievePropsAndVars(v_fault);
+
+    // Use fault constitutive model to compute traction associated with
+    // friction.
+    switch (spaceDim) { // switch
+    case 1: { // case 1
+      const double slipMag = 0.0;
+      const double slipRateMag = 0.0;
+      const double tractionNormal = tractionTpdtVertex[0];
+      _friction->updateStateVars(slipMag, slipRateMag, tractionNormal);
+      break;
+    } // case 1
+    case 2: { // case 2
+      const double slipMag = slipVertex[0];
+      const double slipRateMag = slipRateVertex[0];
+      const double tractionNormal = tractionTpdtVertex[1];
+      _friction->updateStateVars(slipMag, slipRateMag, tractionNormal);
+      break;
+    } // case 2
+    case 3: { // case 3
+      const double slipMag = 
+	sqrt(slipVertex[0]*slipVertex[0] + slipVertex[1]*slipVertex[1]);
+      const double slipRateMag = 
+	sqrt(slipRateVertex[0]*slipRateVertex[0] + 
+	     slipRateVertex[1]*slipRateVertex[1]);
+      const double tractionNormal = tractionTpdtVertex[2];
+      _friction->updateStateVars(slipMag, slipRateMag, tractionNormal);
+      break;
+    } // case 3
+    default:
+      assert(0);
+      throw std::logic_error("Unknown spatial dimension in updateStateVars().");
+    } // switch
+  } // for
 } // updateStateVars
 
 // ----------------------------------------------------------------------
@@ -483,6 +595,7 @@
     } // case 3
     default:
       assert(0);
+      throw std::logic_error("Unknown spatial dimension in updateStateVars().");
     } // switch
 
     // Update Lagrange multiplier values.

Modified: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc	2010-02-23 00:28:40 UTC (rev 16313)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc	2010-02-23 00:57:53 UTC (rev 16314)
@@ -570,7 +570,24 @@
 void
 pylith::faults::TestFaultCohesiveDyn::testUpdateStateVars(void)
 { // testUpdateStateVars
+  assert(0 != _data);
+
+  topology::Mesh mesh;
+  FaultCohesiveDyn fault;
+  topology::SolutionFields fields(mesh);
+  _initialize(&mesh, &fault, &fields);
+  topology::Jacobian jacobian(fields, "seqdense");
+  _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrSlip);
+
+  const int spaceDim = _data->spaceDim;
+
+  const double t = 2.134;
+  const double dt = 0.01;
+  fault.timeStep(dt);
+  fault.updateStateVars(t, &fields);
+
   // :TODO: Need to verify that fault constitutive updateStateVars is called.
+  // We don't have a way to verify state variables inside friction object.
 } // testUpdateStateVars
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py	2010-02-23 00:28:40 UTC (rev 16313)
+++ short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py	2010-02-23 00:57:53 UTC (rev 16314)
@@ -326,6 +326,7 @@
     fields.add("residual", "residual")
     fields.add("dispIncr(t->t+dt)", "displacement_increment")
     fields.add("disp(t)", "displacement")
+    fields.add("velocity(t)", "velocity")
     fields.solutionName("dispIncr(t->t+dt)")
     residual = fields.get("residual")
     residual.newSection(residual.VERTICES_FIELD, cs.spaceDim())



More information about the CIG-COMMITS mailing list