[cig-commits] r19529 - in short/3D/PyLith/branches/pylith-scecdynrup: libsrc/pylith/faults libsrc/pylith/materials libsrc/pylith/topology modulesrc/materials pylith/materials tests/3d/plasticity tests/3d/refine unittests/pytests/materials

brad at geodynamics.org brad at geodynamics.org
Mon Jan 30 20:55:42 PST 2012


Author: brad
Date: 2012-01-30 20:55:42 -0800 (Mon, 30 Jan 2012)
New Revision: 19529

Added:
   short/3D/PyLith/branches/pylith-scecdynrup/tests/3d/plasticity/dynamic/
Modified:
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/faults/CohesiveTopology.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/DruckerPrager3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/DruckerPrager3D.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticIsotropic3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticMaterial.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticMaterial.icc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/topology/MeshRefiner.cc
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/DruckerPrager3D.i
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/materials/DruckerPrager3D.py
   short/3D/PyLith/branches/pylith-scecdynrup/tests/3d/refine/tet4.exo.gz
   short/3D/PyLith/branches/pylith-scecdynrup/tests/3d/refine/tet4.jou
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/materials/TestDruckerPrager3D.py
Log:
Merge from trunk.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/faults/CohesiveTopology.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/faults/CohesiveTopology.cc	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/faults/CohesiveTopology.cc	2012-01-31 04:55:42 UTC (rev 19529)
@@ -766,6 +766,8 @@
   logger.stagePush("FaultCreation");
 
   // Convert fault to an IMesh
+  //   In general, renumbering[global point number] = local point number
+  //   fRenumbering[mesh point] = fault mesh point
   SieveSubMesh::renumbering_type& fRenumbering =
     faultSieveMesh->getRenumbering();
   const SieveSubMesh::renumbering_type::const_iterator fRenumberingEnd = 
@@ -882,22 +884,50 @@
   SieveMesh::renumbering_type& renumbering = sieveMesh->getRenumbering();
   SieveMesh::renumbering_type gRenumbering;
 
-  const SieveMesh::renumbering_type::const_iterator renumberingEnd =
-    renumbering.end();
-  for (SieveMesh::renumbering_type::const_iterator r_iter = renumbering.begin();
-       r_iter != renumberingEnd;
-       ++r_iter)
-    if (fRenumbering.find(r_iter->second) != fRenumbering.end())
-      gRenumbering[r_iter->first] = fRenumbering[r_iter->second];
+  if (renumbering.size()) {
+    //std::cout << "Using renumbering to construct Fault Overlap" << std::endl;
+    const SieveMesh::renumbering_type::const_iterator renumberingEnd =
+      renumbering.end();
+    for (SieveMesh::renumbering_type::const_iterator r_iter = renumbering.begin();
+         r_iter != renumberingEnd;
+         ++r_iter)
+      if (fRenumbering.find(r_iter->second) != fRenumbering.end())
+        gRenumbering[r_iter->first] = fRenumbering[r_iter->second];
+  } else {
+    //std::cout << "Using new numbering to construct Fault Overlap" << std::endl;
+    const SieveMesh::sieve_type::chart_type& chart = sieveMesh->getSieve()->getChart();
+    const ALE::Obj<SieveMesh::numbering_type>& globalNumbering = 
+      sieveMesh->getFactory()->getNumbering(sieveMesh, -1);
+    assert(!globalNumbering.isNull());
+    for(SieveMesh::point_type p = chart.min(); p < chart.max(); ++p) {
+      if (fRenumbering.find(p) != fRenumbering.end()) {
+        gRenumbering[globalNumbering->getIndex(p)] = fRenumbering[p];
+      } // if
+    } // for
+  } // if/else
 
   ALE::SetFromMap<SieveMesh::renumbering_type> globalPoints(gRenumbering);
   ALE::OverlapBuilder<>::constructOverlap(globalPoints, gRenumbering,
 					  sendParallelMeshOverlap,
 					  recvParallelMeshOverlap);
   faultSieveMesh->setCalculatedOverlap(true);
-  //sendParallelMeshOverlap->view("Send parallel fault overlap");
-  //recvParallelMeshOverlap->view("Recv parallel fault overlap");
 
+#if 0 // Seems to break unit tests.
+  // Consistency check for parallel overlap.
+  if (fRenumbering.size() > 0) {
+    if (renumbering.size() <= 0 ||
+	gRenumbering.size() <= 0) {
+      throw std::logic_error("Inconsistent data when computing overlap for "
+			     "parallel fault mesh.");
+    } // if
+  } // if
+#endif
+  
+#if 0 // DEBUGGING
+  sendParallelMeshOverlap->view("Send parallel fault overlap");
+  recvParallelMeshOverlap->view("Recv parallel fault overlap");
+#endif
+
   logger.stagePop();
 } // createFaultParallel
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/DruckerPrager3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/DruckerPrager3D.cc	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/DruckerPrager3D.cc	2012-01-31 04:55:42 UTC (rev 19529)
@@ -65,10 +65,14 @@
 
       // Values expected in properties spatial database
       const int numDBProperties = 6;
-      const char* dbProperties[] = {"density", "vs", "vp" ,
-				    "friction-angle",
-				    "cohesion",
-				    "dilatation-angle"};
+      const char* dbProperties[6] = {
+	"density", 
+	"vs", 
+	"vp" ,
+	"friction-angle",
+	"cohesion",
+	"dilatation-angle",
+      };
 
       /// Number of state variables.
       const int numStateVars = 1;
@@ -80,12 +84,13 @@
 
       // Values expected in state variables spatial database.
       const int numDBStateVars = 6;
-      const char* dbStateVars[] = { "plastic-strain-xx",
-				    "plastic-strain-yy",
-				    "plastic-strain-zz",
-				    "plastic-strain-xy",
-				    "plastic-strain-yz",
-				    "plastic-strain-xz"
+      const char* dbStateVars[6] = {
+	"plastic-strain-xx",
+	"plastic-strain-yy",
+	"plastic-strain-zz",
+	"plastic-strain-xy",
+	"plastic-strain-yz",
+	"plastic-strain-xz",
       };
 
     } // _DruckerPrager3D
@@ -148,6 +153,7 @@
 			   _DruckerPrager3D::numStateVars,
 			   _DruckerPrager3D::dbStateVars,
 			   _DruckerPrager3D::numDBStateVars)),
+  _fitMohrCoulomb(MOHR_COULOMB_INSCRIBED),
   _calcElasticConstsFn(0),
   _calcStressFn(0),
   _updateStateVarsFn(0)
@@ -162,6 +168,14 @@
 } // destructor
 
 // ----------------------------------------------------------------------
+// Set fit to Mohr-Coulomb surface.
+void
+pylith::materials::DruckerPrager3D::fitMohrCoulomb(FitMohrCoulombEnum value)
+{ // fitMohrCoulomb
+  _fitMohrCoulomb = value;
+} // fitMohrCoulomb
+
+// ----------------------------------------------------------------------
 // Set whether elastic or inelastic constitutive relations are used.
 void
 pylith::materials::DruckerPrager3D::useElasticBehavior(const bool flag)
@@ -191,7 +205,7 @@
 				PylithScalar* const propValues,
 				const scalar_array& dbValues)
 { // _dbToProperties
-  assert(0 != propValues);
+  assert(propValues);
   const int numDBValues = dbValues.size();
   assert(_DruckerPrager3D::numDBProperties == numDBValues);
 
@@ -202,9 +216,12 @@
   const PylithScalar cohesion = dbValues[db_cohesion];
   const PylithScalar dilatationAngle = dbValues[db_dilatationAngle];
  
-  if (density <= 0.0 || vs <= 0.0 || vp <= 0.0 || frictionAngle < 0.0
-      || cohesion < 0.0 || dilatationAngle < 0.0
-      || frictionAngle < dilatationAngle) {
+  const double pi = M_PI;
+
+  if (density <= 0.0 || vs <= 0.0 || vp <= 0.0 || cohesion < 0.0 ||
+      frictionAngle < 0.0 || frictionAngle > pi/2 ||
+      dilatationAngle < 0.0 || dilatationAngle > pi/2 ||
+      frictionAngle < dilatationAngle) {
     std::ostringstream msg;
     msg << "Spatial database returned illegal value for physical "
 	<< "properties.\n"
@@ -222,12 +239,39 @@
 
   const PylithScalar mu = density * vs*vs;
   const PylithScalar lambda = density * vp*vp - 2.0*mu;
-  const PylithScalar denomFriction = sqrt(3.0) * (3.0 - sin(frictionAngle));
-  const PylithScalar denomDilatation = sqrt(3.0) * (3.0 - sin(dilatationAngle));
-  const PylithScalar alphaYield = 2.0 * sin(frictionAngle)/denomFriction;
-  const PylithScalar beta = 6.0 * cohesion * cos(frictionAngle)/denomFriction;
-  const PylithScalar alphaFlow = 2.0 * sin(dilatationAngle)/denomDilatation;
 
+  PylithScalar alphaYield = 0.0;
+  PylithScalar beta = 0.0;
+  PylithScalar alphaFlow = 0.0;
+  switch (_fitMohrCoulomb) { // switch
+  case MOHR_COULOMB_INSCRIBED: {
+    const PylithScalar denomFriction = sqrt(3.0) * (3.0 - sin(frictionAngle));
+    const PylithScalar denomDilatation = sqrt(3.0) * (3.0 - sin(dilatationAngle));
+    alphaYield = 2.0 * sin(frictionAngle)/denomFriction;
+    beta = 6.0 * cohesion * cos(frictionAngle)/denomFriction;
+    alphaFlow = 2.0 * sin(dilatationAngle)/denomDilatation;
+    break;
+  } // MOHR_COULOMB_INSCRIBED
+  case MOHR_COULOMB_MIDDLE: {
+    alphaYield = sin(frictionAngle)/3.0;
+    beta = cohesion * cos(frictionAngle);
+    alphaFlow = sin(dilatationAngle)/3.0;
+    break;
+  } // MOHR_COULOMB_MIDDLE
+  case MOHR_COULOMB_CIRCUMSCRIBED: {
+    const PylithScalar denomFriction = sqrt(3.0) * (3.0 + sin(frictionAngle));
+    const PylithScalar denomDilatation = sqrt(3.0) * (3.0 + sin(dilatationAngle));
+    alphaYield = 2.0 * sin(frictionAngle)/denomFriction;
+    beta = 6.0 * cohesion * cos(frictionAngle)/denomFriction;
+    alphaFlow = 2.0 * sin(dilatationAngle)/denomDilatation;
+    break;
+  } // MOHR_COULOMB_CIRCUMSCRIBED
+  default :
+    assert(0);
+    throw std::logic_error("Unknown Mohr-Coulomb fit.");
+    break;
+  } // switch
+
   if (lambda <= 0.0) {
     std::ostringstream msg;
     msg << "Attempted to set Lame's constant lambda to nonpositive value.\n"
@@ -254,8 +298,8 @@
 pylith::materials::DruckerPrager3D::_nondimProperties(PylithScalar* const values,
 					         const int nvalues) const
 { // _nondimProperties
-  assert(0 != _normalizer);
-  assert(0 != values);
+  assert(_normalizer);
+  assert(values);
   assert(nvalues == _numPropsQuadPt);
 
   const PylithScalar densityScale = _normalizer->densityScale();
@@ -280,8 +324,8 @@
 pylith::materials::DruckerPrager3D::_dimProperties(PylithScalar* const values,
 						      const int nvalues) const
 { // _dimProperties
-  assert(0 != _normalizer);
-  assert(0 != values);
+  assert(_normalizer);
+  assert(values);
   assert(nvalues == _numPropsQuadPt);
 
   const PylithScalar densityScale = _normalizer->densityScale();
@@ -306,7 +350,7 @@
 				PylithScalar* const stateValues,
 				const scalar_array& dbValues)
 { // _dbToStateVars
-  assert(0 != stateValues);
+  assert(stateValues);
   const int numDBValues = dbValues.size();
   assert(_DruckerPrager3D::numDBStateVars == numDBValues);
 
@@ -315,8 +359,6 @@
   assert(totalSize == numDBValues);
   memcpy(&stateValues[s_plasticStrain], &dbValues[db_plasticStrain],
 	 _tensorSize*sizeof(PylithScalar));
-
-  PetscLogFlops(0);
 } // _dbToStateVars
 
 // ----------------------------------------------------------------------
@@ -325,11 +367,9 @@
 pylith::materials::DruckerPrager3D::_nondimStateVars(PylithScalar* const values,
 						const int nvalues) const
 { // _nondimStateVars
-  assert(0 != _normalizer);
-  assert(0 != values);
+  assert(_normalizer);
+  assert(values);
   assert(nvalues == _numVarsQuadPt);
-
-  PetscLogFlops(0);
 } // _nondimStateVars
 
 // ----------------------------------------------------------------------
@@ -338,11 +378,9 @@
 pylith::materials::DruckerPrager3D::_dimStateVars(PylithScalar* const values,
 					     const int nvalues) const
 { // _dimStateVars
-  assert(0 != _normalizer);
-  assert(0 != values);
+  assert(_normalizer);
+  assert(values);
   assert(nvalues == _numVarsQuadPt);
-
-  PetscLogFlops(0);
 } // _dimStateVars
 
 // ----------------------------------------------------------------------
@@ -354,8 +392,8 @@
 					    const PylithScalar* stateVars,
 					    const int numStateVars)
 { // _calcDensity
-  assert(0 != density);
-  assert(0 != properties);
+  assert(density);
+  assert(properties);
   assert(_numPropsQuadPt == numProperties);
 
   density[0] = properties[p_density];
@@ -370,14 +408,15 @@
 				  const PylithScalar* stateVars,
 				  const int numStateVars) const
 { // _stableTimeStepImplicit
-  assert(0 != properties);
+  assert(properties);
   assert(_numPropsQuadPt == numProperties);
-  assert(0 != stateVars);
+  assert(stateVars);
   assert(_numVarsQuadPt == numStateVars);
+
   // It's unclear what to do for an elasto-plastic material, which has no
   // inherent time scale. For now, just set dtStable to a large value.
   const PylithScalar dtStable = pylith::PYLITH_MAXDOUBLE;
-  PetscLogFlops(0);
+
   return dtStable;
 } // _stableTimeStepImplicit
 
@@ -400,17 +439,17 @@
 					 const int initialStrainSize,
 					 const bool computeStateVars)
 { // _calcStressElastic
-  assert(0 != stress);
+  assert(stress);
   assert(_DruckerPrager3D::tensorSize == stressSize);
-  assert(0 != properties);
+  assert(properties);
   assert(_numPropsQuadPt == numProperties);
-  assert(0 != stateVars);
+  assert(stateVars);
   assert(_numVarsQuadPt == numStateVars);
-  assert(0 != totalStrain);
+  assert(totalStrain);
   assert(_DruckerPrager3D::tensorSize == strainSize);
-  assert(0 != initialStress);
+  assert(initialStress);
   assert(_DruckerPrager3D::tensorSize == initialStressSize);
-  assert(0 != initialStrain);
+  assert(initialStrain);
   assert(_DruckerPrager3D::tensorSize == initialStrainSize);
 
   const PylithScalar mu = properties[p_mu];
@@ -456,20 +495,21 @@
 					const int initialStrainSize,
 					const bool computeStateVars)
 { // _calcStressElastoplastic
-  assert(0 != stress);
+  assert(stress);
   assert(_DruckerPrager3D::tensorSize == stressSize);
-  assert(0 != properties);
+  assert(properties);
   assert(_numPropsQuadPt == numProperties);
-  assert(0 != stateVars);
+  assert(stateVars);
   assert(_numVarsQuadPt == numStateVars);
-  assert(0 != totalStrain);
+  assert(totalStrain);
   assert(_DruckerPrager3D::tensorSize == strainSize);
-  assert(0 != initialStress);
+  assert(initialStress);
   assert(_DruckerPrager3D::tensorSize == initialStressSize);
-  assert(0 != initialStrain);
+  assert(initialStrain);
   assert(_DruckerPrager3D::tensorSize == initialStrainSize);
 
-  const int tensorSize = _tensorSize;
+  const int tensorSize = 6;
+  assert(_tensorSize == tensorSize);
   const PylithScalar mu = properties[p_mu];
   const PylithScalar lambda = properties[p_lambda];
     
@@ -485,39 +525,35 @@
     const PylithScalar ae = 1.0/mu2;
     const PylithScalar am = 1.0/(3.0 * bulkModulus);
 
-    const PylithScalar plasticStrainT[] = {stateVars[s_plasticStrain],
-				     stateVars[s_plasticStrain + 1],
-				     stateVars[s_plasticStrain + 2],
-				     stateVars[s_plasticStrain + 3],
-				     stateVars[s_plasticStrain + 4],
-				     stateVars[s_plasticStrain + 5]};
+    const PylithScalar plasticStrainT[tensorSize] = {
+      stateVars[s_plasticStrain  ],
+      stateVars[s_plasticStrain+1],
+      stateVars[s_plasticStrain+2],
+      stateVars[s_plasticStrain+3],
+      stateVars[s_plasticStrain+4],
+      stateVars[s_plasticStrain+5],
+    };
     const PylithScalar meanPlasticStrainT = (plasticStrainT[0] +
 				       plasticStrainT[1] +
 				       plasticStrainT[2])/3.0;
     PylithScalar devPlasticStrainT[tensorSize];
-    pylith::materials::ElasticMaterial::calcDeviatoric3D(devPlasticStrainT,
-							 plasticStrainT,
-							 meanPlasticStrainT);
+    calcDeviatoric3D(devPlasticStrainT, plasticStrainT, meanPlasticStrainT);
 
-    const PylithScalar diag[] = { 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 };
+    const PylithScalar diag[tensorSize] = { 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 };
 
     // Initial stress values
     const PylithScalar meanStressInitial = (initialStress[0] +
 				      initialStress[1] +
 				      initialStress[2])/3.0;
     PylithScalar devStressInitial[tensorSize];
-    pylith::materials::ElasticMaterial::calcDeviatoric3D(devStressInitial,
-							 initialStress,
-							 meanStressInitial);
+    calcDeviatoric3D(devStressInitial, initialStress, meanStressInitial);
 
     // Initial strain values
     const PylithScalar meanStrainInitial = (initialStrain[0] +
 				      initialStrain[1] +
 				      initialStrain[2])/3.0;
     PylithScalar devStrainInitial[tensorSize];
-    pylith::materials::ElasticMaterial::calcDeviatoric3D(devStrainInitial,
-							 initialStrain,
-							 meanStrainInitial);
+    calcDeviatoric3D(devStrainInitial, initialStrain, meanStrainInitial);
 
     // Values for current time step
     const PylithScalar e11 = totalStrain[0];
@@ -527,30 +563,28 @@
     const PylithScalar meanStrainPPTpdt = meanStrainTpdt - meanPlasticStrainT -
       meanStrainInitial;
 
-    const PylithScalar strainPPTpdt[] =
-      { totalStrain[0] - meanStrainTpdt - devPlasticStrainT[0] -
-	devStrainInitial[0],
-	totalStrain[1] - meanStrainTpdt - devPlasticStrainT[1] -
-	devStrainInitial[1],
-	totalStrain[2] - meanStrainTpdt - devPlasticStrainT[2] -
-	devStrainInitial[2],
-	totalStrain[3] - devPlasticStrainT[3] - devStrainInitial[3],
-	totalStrain[4] - devPlasticStrainT[4] - devStrainInitial[4],
-	totalStrain[5] - devPlasticStrainT[5] - devStrainInitial[5] };
+    const PylithScalar strainPPTpdt[tensorSize] = {
+      totalStrain[0] - meanStrainTpdt - devPlasticStrainT[0] - devStrainInitial[0],
+      totalStrain[1] - meanStrainTpdt - devPlasticStrainT[1] - devStrainInitial[1],
+      totalStrain[2] - meanStrainTpdt - devPlasticStrainT[2] - devStrainInitial[2],
+      totalStrain[3] - devPlasticStrainT[3] - devStrainInitial[3],
+      totalStrain[4] - devPlasticStrainT[4] - devStrainInitial[4],
+      totalStrain[5] - devPlasticStrainT[5] - devStrainInitial[5],
+    };
 
     // Compute trial elastic stresses and yield function to see if yield should
     // occur.
-    const PylithScalar trialDevStress[] = { strainPPTpdt[0]/ae + devStressInitial[0],
-				      strainPPTpdt[1]/ae + devStressInitial[1],
-				      strainPPTpdt[2]/ae + devStressInitial[2],
-				      strainPPTpdt[3]/ae + devStressInitial[3],
-				      strainPPTpdt[4]/ae + devStressInitial[4],
-				      strainPPTpdt[5]/ae + devStressInitial[5]};
+    const PylithScalar trialDevStress[tensorSize] = { 
+      strainPPTpdt[0]/ae + devStressInitial[0],
+      strainPPTpdt[1]/ae + devStressInitial[1],
+      strainPPTpdt[2]/ae + devStressInitial[2],
+      strainPPTpdt[3]/ae + devStressInitial[3],
+      strainPPTpdt[4]/ae + devStressInitial[4],
+      strainPPTpdt[5]/ae + devStressInitial[5],
+    };
     const PylithScalar trialMeanStress = meanStrainPPTpdt/am + meanStressInitial;
     const PylithScalar stressInvar2 =
-      sqrt(0.5 *
-	   pylith::materials::ElasticMaterial::scalarProduct3D(trialDevStress,
-							       trialDevStress));
+      sqrt(0.5 * scalarProduct3D(trialDevStress, trialDevStress));
     const PylithScalar yieldFunction = 3.0 * alphaYield * trialMeanStress +
       stressInvar2 - beta;
 #if 0 // DEBUGGING
@@ -566,16 +600,12 @@
     // If yield function is greater than zero, compute elastoplastic stress.
     if (yieldFunction >= 0.0) {
       const PylithScalar devStressInitialProd = 
-	pylith::materials::ElasticMaterial::scalarProduct3D(devStressInitial,
-							    devStressInitial);
-      const PylithScalar strainPPTpdtProd =
-	pylith::materials::ElasticMaterial::scalarProduct3D(strainPPTpdt,
-							    strainPPTpdt);
+	scalarProduct3D(devStressInitial, devStressInitial);
+      const PylithScalar strainPPTpdtProd = 
+	scalarProduct3D(strainPPTpdt, strainPPTpdt);
       const PylithScalar d =
 	sqrt(ae * ae * devStressInitialProd + 2.0 * ae *
-	   pylith::materials::ElasticMaterial::scalarProduct3D(devStressInitial,
-							       strainPPTpdt) +
-	     strainPPTpdtProd);
+	   scalarProduct3D(devStressInitial, strainPPTpdt) + strainPPTpdtProd);
       const PylithScalar plasticMult = 2.0 * ae * am *
 	(3.0 * alphaYield * meanStrainPPTpdt/am + d/(sqrt(2.0) * ae) - beta)/
 	(6.0 * alphaYield * alphaFlow * ae + am);
@@ -605,16 +635,18 @@
       stress[5] = strainPPTpdt[5]/ae + devStressInitial[5]; 
     } // if
 
+  } else {
     // If state variables have already been updated, the plastic strain for the
     // time step has already been computed.
-  } else {
     const PylithScalar mu2 = 2.0 * mu;
-    const PylithScalar plasticStrainTpdt[] = {stateVars[s_plasticStrain],
-					stateVars[s_plasticStrain + 1],
-					stateVars[s_plasticStrain + 2],
-					stateVars[s_plasticStrain + 3],
-					stateVars[s_plasticStrain + 4],
-					stateVars[s_plasticStrain + 5]};
+    const PylithScalar plasticStrainTpdt[tensorSize] = {
+      stateVars[s_plasticStrain  ],
+      stateVars[s_plasticStrain+1],
+      stateVars[s_plasticStrain+2],
+      stateVars[s_plasticStrain+3],
+      stateVars[s_plasticStrain+4],
+      stateVars[s_plasticStrain+5],
+    };
 
     const PylithScalar e11 = totalStrain[0] - plasticStrainTpdt[0] - initialStrain[0];
     const PylithScalar e22 = totalStrain[1] - plasticStrainTpdt[1] - initialStrain[1];
@@ -635,7 +667,7 @@
 
     PetscLogFlops(31);
 
-  } // else
+  } // if/else
 #if 0 // DEBUGGING
   const PylithScalar alphaYield = properties[p_alphaYield];
   const PylithScalar beta = properties[p_beta];
@@ -648,9 +680,7 @@
 				   stress[4],
 				   stress[5]};
   const PylithScalar stressInvar2Test =
-    sqrt(0.5 *
-	 pylith::materials::ElasticMaterial::scalarProduct3D(devStressTest,
-							     devStressTest));
+    sqrt(0.5 * scalarProduct3D(devStressTest, devStressTest));
   
   const PylithScalar yieldFunctionTest = 3.0 * alphaYield * meanStressTest +
       stressInvar2Test - beta;
@@ -773,7 +803,7 @@
 
   // Duplicate functionality of _calcStressElastoplastic
   // Get properties
-  const int tensorSize = _tensorSize;
+  const int tensorSize = 6;
   const PylithScalar mu = properties[p_mu];
   const PylithScalar lambda = properties[p_lambda];
   const PylithScalar alphaYield = properties[p_alphaYield];
@@ -785,19 +815,19 @@
   const PylithScalar am = 1.0/(3.0 * bulkModulus);
   
   // Get state variables from previous time step
-  const PylithScalar plasticStrainT[] = {stateVars[s_plasticStrain],
-				   stateVars[s_plasticStrain + 1],
-				   stateVars[s_plasticStrain + 2],
-				   stateVars[s_plasticStrain + 3],
-				   stateVars[s_plasticStrain + 4],
-				   stateVars[s_plasticStrain + 5]};
+  const PylithScalar plasticStrainT[tensorSize] = {
+    stateVars[s_plasticStrain  ],
+    stateVars[s_plasticStrain+1],
+    stateVars[s_plasticStrain+2],
+    stateVars[s_plasticStrain+3],
+    stateVars[s_plasticStrain+4],
+    stateVars[s_plasticStrain+5],
+  };
   const PylithScalar meanPlasticStrainT = (plasticStrainT[0] +
 				     plasticStrainT[1] +
 				     plasticStrainT[2])/3.0;
   PylithScalar devPlasticStrainT[tensorSize];
-  pylith::materials::ElasticMaterial::calcDeviatoric3D(devPlasticStrainT,
-						       plasticStrainT,
-						       meanPlasticStrainT);
+  calcDeviatoric3D(devPlasticStrainT, plasticStrainT, meanPlasticStrainT);
 
   const PylithScalar diag[] = { 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 };
 
@@ -806,18 +836,14 @@
 				    initialStress[1] +
 				    initialStress[2])/3.0;
   PylithScalar devStressInitial[tensorSize];
-  pylith::materials::ElasticMaterial::calcDeviatoric3D(devStressInitial,
-						       initialStress,
-						       meanStressInitial);
+  calcDeviatoric3D(devStressInitial, initialStress, meanStressInitial);
 
   // Initial strain values
   const PylithScalar meanStrainInitial = (initialStrain[0] +
 				    initialStrain[1] +
 				    initialStrain[2])/3.0;
   PylithScalar devStrainInitial[tensorSize];
-  pylith::materials::ElasticMaterial::calcDeviatoric3D(devStrainInitial,
-						       initialStrain,
-						       meanStrainInitial);
+  calcDeviatoric3D(devStrainInitial, initialStrain, meanStrainInitial);
 
   // Values for current time step
   const PylithScalar meanStrainTpdt = (totalStrain[0] +
@@ -847,9 +873,7 @@
 				    strainPPTpdt[5]/ae + devStressInitial[5]};
   const PylithScalar trialMeanStress = meanStrainPPTpdt/am + meanStressInitial;
   const PylithScalar stressInvar2 =
-    sqrt(0.5 *
-	 pylith::materials::ElasticMaterial::scalarProduct3D(trialDevStress,
-							     trialDevStress));
+    sqrt(0.5 * scalarProduct3D(trialDevStress, trialDevStress));
   const PylithScalar yieldFunction = 3.0 * alphaYield * trialMeanStress +
     stressInvar2 - beta;
 #if 0 // DEBUGGING
@@ -866,16 +890,12 @@
   // corresponding tangent matrix.
   if (yieldFunction >= 0.0) {
     const PylithScalar devStressInitialProd = 
-      pylith::materials::ElasticMaterial::scalarProduct3D(devStressInitial,
-							  devStressInitial);
+      scalarProduct3D(devStressInitial, devStressInitial);
     const PylithScalar strainPPTpdtProd =
-      pylith::materials::ElasticMaterial::scalarProduct3D(strainPPTpdt,
-							  strainPPTpdt);
+      scalarProduct3D(strainPPTpdt, strainPPTpdt);
     const PylithScalar d = 
       sqrt(ae * ae * devStressInitialProd + 2.0 * ae *
-	   pylith::materials::ElasticMaterial::scalarProduct3D(devStressInitial,
-							       strainPPTpdt) +
-	   strainPPTpdtProd);
+	   scalarProduct3D(devStressInitial, strainPPTpdt) + strainPPTpdtProd);
     const PylithScalar plasticFac = 2.0 * ae * am/
       (6.0 * alphaYield * alphaFlow * ae + am);
     const PylithScalar meanStrainFac = 3.0 * alphaYield/am;
@@ -1062,9 +1082,7 @@
 				     plasticStrainT[1] +
 				     plasticStrainT[2])/3.0;
   PylithScalar devPlasticStrainT[tensorSize];
-  pylith::materials::ElasticMaterial::calcDeviatoric3D(devPlasticStrainT,
-						       plasticStrainT,
-						       meanPlasticStrainT);
+  calcDeviatoric3D(devPlasticStrainT, plasticStrainT, meanPlasticStrainT);
 
   const PylithScalar diag[] = { 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 };
 
@@ -1073,18 +1091,14 @@
 				    initialStress[1] +
 				    initialStress[2])/3.0;
   PylithScalar devStressInitial[tensorSize];
-  pylith::materials::ElasticMaterial::calcDeviatoric3D(devStressInitial,
-						       initialStress,
-						       meanStressInitial);
+  calcDeviatoric3D(devStressInitial, initialStress, meanStressInitial);
 
   // Initial strain values
   const PylithScalar meanStrainInitial = (initialStrain[0] +
 				    initialStrain[1] +
 				    initialStrain[2])/3.0;
   PylithScalar devStrainInitial[tensorSize];
-  pylith::materials::ElasticMaterial::calcDeviatoric3D(devStrainInitial,
-						       initialStrain,
-						       meanStrainInitial);
+  calcDeviatoric3D(devStrainInitial, initialStrain, meanStrainInitial);
 
   // Values for current time step
   const PylithScalar e11 = totalStrain[0];
@@ -1115,9 +1129,7 @@
 				    strainPPTpdt[5]/ae + devStressInitial[5]};
   const PylithScalar trialMeanStress = meanStrainPPTpdt/am + meanStressInitial;
   const PylithScalar stressInvar2 =
-    sqrt(0.5 *
-	 pylith::materials::ElasticMaterial::scalarProduct3D(trialDevStress,
-							     trialDevStress));
+    sqrt(0.5 * scalarProduct3D(trialDevStress, trialDevStress));
   const PylithScalar yieldFunction = 3.0 * alphaYield * trialMeanStress +
     stressInvar2 - beta;
 #if 0 // DEBUGGING
@@ -1134,16 +1146,12 @@
   // Otherwise, plastic strains remain the same.
   if (yieldFunction >= 0.0) {
     const PylithScalar devStressInitialProd = 
-      pylith::materials::ElasticMaterial::scalarProduct3D(devStressInitial,
-							  devStressInitial);
+      scalarProduct3D(devStressInitial, devStressInitial);
     const PylithScalar strainPPTpdtProd =
-      pylith::materials::ElasticMaterial::scalarProduct3D(strainPPTpdt,
-							  strainPPTpdt);
+      scalarProduct3D(strainPPTpdt, strainPPTpdt);
     const PylithScalar d =
       sqrt(ae * ae * devStressInitialProd + 2.0 * ae *
-	   pylith::materials::ElasticMaterial::scalarProduct3D(devStressInitial,
-							       strainPPTpdt) +
-	   strainPPTpdtProd);
+	   scalarProduct3D(devStressInitial, strainPPTpdt) + strainPPTpdtProd);
     const PylithScalar plasticMult = 2.0 * ae * am *
       (3.0 * alphaYield * meanStrainPPTpdt/am + d/(sqrt(2.0) * ae) - beta)/
       (6.0 * alphaYield * alphaFlow * ae + am);

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/DruckerPrager3D.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/DruckerPrager3D.hh	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/DruckerPrager3D.hh	2012-01-31 04:55:42 UTC (rev 19529)
@@ -43,6 +43,15 @@
 { // class DruckerPrager3D
   friend class TestDruckerPrager3D; // unit testing
 
+  // PUBLIC ENUMS ///////////////////////////////////////////////////////
+public :
+
+  enum FitMohrCoulombEnum {
+    MOHR_COULOMB_CIRCUMSCRIBED=0, 
+    MOHR_COULOMB_MIDDLE=1,
+    MOHR_COULOMB_INSCRIBED=2,
+  }; // FitMohrCoulombType
+
   // PUBLIC METHODS /////////////////////////////////////////////////////
 public :
 
@@ -52,6 +61,12 @@
   /// Destructor
   ~DruckerPrager3D(void);
 
+  /** Set fit to Mohr-Coulomb surface.
+   *
+   * @param value Mohr-Coulomb surface match type.
+   */
+  void fitMohrCoulomb(FitMohrCoulombEnum value);
+
   /** Set current time step.
    *
    * @param dt Current time step.
@@ -481,6 +496,9 @@
   /// Method to use for _updateStateVars().
   updateStateVars_fn_type _updateStateVarsFn;
 
+  /// Fit to Mohr Coulomb surface
+  FitMohrCoulombEnum _fitMohrCoulomb;
+
   static const int p_density;
   static const int p_mu;
   static const int p_lambda;

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticIsotropic3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticIsotropic3D.cc	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticIsotropic3D.cc	2012-01-31 04:55:42 UTC (rev 19529)
@@ -211,16 +211,16 @@
 						   const int initialStrainSize,
 						   const bool computeStateVars)
 { // _calcStress
-  assert(0 != stress);
+  assert(stress);
   assert(_ElasticIsotropic3D::tensorSize == stressSize);
-  assert(0 != properties);
+  assert(properties);
   assert(_numPropsQuadPt == numProperties);
   assert(0 == numStateVars);
-  assert(0 != totalStrain);
+  assert(totalStrain);
   assert(_ElasticIsotropic3D::tensorSize == strainSize);
-  assert(0 != initialStress);
+  assert(initialStress);
   assert(_ElasticIsotropic3D::tensorSize == initialStressSize);
-  assert(0 != initialStrain);
+  assert(initialStrain);
   assert(_ElasticIsotropic3D::tensorSize == initialStrainSize);
 
   const PylithScalar mu = properties[p_mu];

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticMaterial.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticMaterial.hh	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticMaterial.hh	2012-01-31 04:55:42 UTC (rev 19529)
@@ -59,42 +59,6 @@
   virtual
   void deallocate(void);
   
-  /** Compute 2D deviatoric stress/strain from vector and mean value.
-   *
-   * @param deviatoric Array for deviatoric tensor.
-   * @param vec Input tensor (as vector).
-   * @param vecMean Tensor trace divided by spatial_dimension.
-   */
-  void calcDeviatoric2D(PylithScalar* const deviatoric,
-			const PylithScalar* vec,
-			const PylithScalar vecMean);
-  
-  /** Compute 3D deviatoric stress/strain from vector and mean value.
-   *
-   * @param deviatoric Array for deviatoric tensor.
-   * @param vec Input tensor (as vector).
-   * @param vecMean Tensor trace divided by spatial_dimension.
-   */
-  void calcDeviatoric3D(PylithScalar* const deviatoric,
-			const PylithScalar* vec,
-			const PylithScalar vecMean);
-  
-  /** Compute 2D scalar product of two tensors represented as vectors.
-   *
-   * @param tensor1 First tensor.
-   * @param tensor2 Second tensor.
-   */
-  PylithScalar scalarProduct2D(const PylithScalar* tensor1,
-			 const PylithScalar* tensor2) const;
-  
-  /** Compute 3D scalar product of two tensors represented as vectors.
-   *
-   * @param tensor1 First tensor.
-   * @param tensor2 Second tensor.
-   */
-  PylithScalar scalarProduct3D(const PylithScalar* tensor1,
-			 const PylithScalar* tensor2) const;
-  
   /** Set database for initial stress state.
    *
    * @param db Spatial database.
@@ -355,6 +319,46 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const = 0;
 
+  /** Compute 2D deviatoric stress/strain from vector and mean value.
+   *
+   * @param deviatoric Array for deviatoric tensor.
+   * @param vec Input tensor (as vector).
+   * @param vecMean Tensor trace divided by spatial_dimension.
+   */
+  static
+  void calcDeviatoric2D(PylithScalar* const deviatoric,
+			const PylithScalar* vec,
+			const PylithScalar vecMean);
+  
+  /** Compute 3D deviatoric stress/strain from vector and mean value.
+   *
+   * @param deviatoric Array for deviatoric tensor.
+   * @param vec Input tensor (as vector).
+   * @param vecMean Tensor trace divided by spatial_dimension.
+   */
+  static
+  void calcDeviatoric3D(PylithScalar* const deviatoric,
+			const PylithScalar* vec,
+			const PylithScalar vecMean);
+  
+  /** Compute 2D scalar product of two tensors represented as vectors.
+   *
+   * @param tensor1 First tensor.
+   * @param tensor2 Second tensor.
+   */
+  static
+  PylithScalar scalarProduct2D(const PylithScalar* tensor1,
+			       const PylithScalar* tensor2);
+  
+  /** Compute 3D scalar product of two tensors represented as vectors.
+   *
+   * @param tensor1 First tensor.
+   * @param tensor2 Second tensor.
+   */
+  static
+  PylithScalar scalarProduct3D(const PylithScalar* tensor1,
+			       const PylithScalar* tensor2);
+  
   // PRIVATE METHODS ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticMaterial.icc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticMaterial.icc	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/materials/ElasticMaterial.icc	2012-01-31 04:55:42 UTC (rev 19529)
@@ -22,6 +22,41 @@
 
 #include <cassert>
 
+// Set database for initial stress state.
+inline
+void
+pylith::materials::ElasticMaterial::dbInitialStress(spatialdata::spatialdb::SpatialDB* db) {
+  _dbInitialStress = db;
+}
+
+// Set database for initial strain state.
+inline
+void
+pylith::materials::ElasticMaterial::dbInitialStrain(spatialdata::spatialdb::SpatialDB* db) {
+  _dbInitialStrain = db;
+}
+
+// Set whether elastic or inelastic constitutive relations are used.
+inline
+void
+pylith::materials::ElasticMaterial::useElasticBehavior(const bool flag) {
+} // useElasticBehavior
+
+// Get flag indicating whether material implements an empty
+// _updateProperties() method.
+inline
+bool
+pylith::materials::ElasticMaterial::hasStateVars(void) const {
+  return _numVarsQuadPt > 0;
+} // usesUpdateProperties
+
+// Get initial stress/strain fields.
+inline
+const pylith::topology::Fields<pylith::topology::Field<pylith::topology::Mesh> >*
+pylith::materials::ElasticMaterial::initialFields(void) const {
+  return _initialFields;
+} // initialFields
+
 // Compute 2D deviatoric stress/strain from vector and mean value.
 // 2 FLOPs per call
 inline
@@ -45,9 +80,9 @@
 					const PylithScalar* vec,
 					const PylithScalar vecMean)
 {
-  deviatoric[0] = vec[0] -vecMean;
-  deviatoric[1] = vec[1] -vecMean;
-  deviatoric[2] = vec[2] -vecMean;
+  deviatoric[0] = vec[0] - vecMean;
+  deviatoric[1] = vec[1] - vecMean;
+  deviatoric[2] = vec[2] - vecMean;
   deviatoric[3] = vec[3];
   deviatoric[4] = vec[4];
   deviatoric[5] = vec[5];
@@ -59,12 +94,14 @@
 inline
 PylithScalar
 pylith::materials::ElasticMaterial::scalarProduct2D(const PylithScalar* tensor1,
-						    const PylithScalar* tensor2) const
+						    const PylithScalar* tensor2)
 { // scalarProduct2D
-  const PylithScalar scalarProduct = tensor1[0] * tensor2[0] +
-    tensor1[1] * tensor2[1] + 2.0 * tensor1[2] * tensor2[2];
+  const PylithScalar scalarProduct = 
+    tensor1[0] * tensor2[0] +
+    tensor1[1] * tensor2[1] + 
+    2.0 * tensor1[2] * tensor2[2];
+
   return scalarProduct;
-
 } // scalarProduct2D
 
 
@@ -73,54 +110,20 @@
 inline
 PylithScalar
 pylith::materials::ElasticMaterial::scalarProduct3D(const PylithScalar* tensor1,
-						    const PylithScalar* tensor2) const
+						    const PylithScalar* tensor2)
 { // scalarProduct3D
-  const PylithScalar scalarProduct = tensor1[0] * tensor2[0] +
+  const PylithScalar scalarProduct = 
+    tensor1[0] * tensor2[0] +
     tensor1[1] * tensor2[1] +
     tensor1[2] * tensor2[2] +
     2.0 * (tensor1[3] * tensor2[3] +
 	   tensor1[4] * tensor2[4] +
 	   tensor1[5] * tensor2[5]);
+
   return scalarProduct;
-
 } // scalarProduct3D
 
 
-// Set database for initial stress state.
-inline
-void
-pylith::materials::ElasticMaterial::dbInitialStress(spatialdata::spatialdb::SpatialDB* db) {
-  _dbInitialStress = db;
-}
-
-// Set database for initial strain state.
-inline
-void
-pylith::materials::ElasticMaterial::dbInitialStrain(spatialdata::spatialdb::SpatialDB* db) {
-  _dbInitialStrain = db;
-}
-
-// Set whether elastic or inelastic constitutive relations are used.
-inline
-void
-pylith::materials::ElasticMaterial::useElasticBehavior(const bool flag) {
-} // useElasticBehavior
-
-// Get flag indicating whether material implements an empty
-// _updateProperties() method.
-inline
-bool
-pylith::materials::ElasticMaterial::hasStateVars(void) const {
-  return _numVarsQuadPt > 0;
-} // usesUpdateProperties
-
-// Get initial stress/strain fields.
-inline
-const pylith::topology::Fields<pylith::topology::Field<pylith::topology::Mesh> >*
-pylith::materials::ElasticMaterial::initialFields(void) const {
-  return _initialFields;
-} // initialFields
-
 // ----------------------------------------------------------------------
 // Compute density for cell at quadrature points.
 inline

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/topology/MeshRefiner.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/topology/MeshRefiner.cc	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/pylith/topology/MeshRefiner.cc	2012-01-31 04:55:42 UTC (rev 19529)
@@ -802,6 +802,9 @@
   newSendOverlap->assemble();
   newRecvOverlap->assemble();
 
+  // Clear out renumbering
+  newMesh->getRenumbering().clear();
+
   // Verify size of new send/recv overlaps are at least as big as the
   // original ones.
   PetscErrorCode err = 0;

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/DruckerPrager3D.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/DruckerPrager3D.i	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/DruckerPrager3D.i	2012-01-31 04:55:42 UTC (rev 19529)
@@ -27,6 +27,15 @@
     class pylith::materials::DruckerPrager3D : public ElasticMaterial
     { // class DruckerPrager3D
 
+      // PUBLIC ENUMS ///////////////////////////////////////////////////
+    public :
+
+      enum FitMohrCoulombEnum {
+	MOHR_COULOMB_CIRCUMSCRIBED=0, 
+	MOHR_COULOMB_MIDDLE=1,
+	MOHR_COULOMB_INSCRIBED=2,
+      }; // FitMohrCoulombType
+
       // PUBLIC METHODS /////////////////////////////////////////////////
     public :
 
@@ -36,6 +45,12 @@
       /// Destructor
       ~DruckerPrager3D(void);
       
+      /** Set fit to Mohr-Coulomb surface.
+       *
+       * @param value Mohr-Coulomb surface match type.
+       */
+      void fitMohrCoulomb(FitMohrCoulombEnum value);
+
       /** Set current time step.
        *
        * @param dt Current time step.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/pylith/materials/DruckerPrager3D.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/materials/DruckerPrager3D.py	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/materials/DruckerPrager3D.py	2012-01-31 04:55:42 UTC (rev 19529)
@@ -26,6 +26,16 @@
 from ElasticMaterial import ElasticMaterial
 from materials import DruckerPrager3D as ModuleDruckerPrager3D
 
+# Validator to fit to Mohr-Coulomb
+def validateFitMohrCoulomb(value):
+  """
+  Validate fit to Mohr-Coulomb yield surface.
+  """
+  if not value in ["inscribed", "middle", "circumscribed"]:
+    raise ValueError("Unknown fit to Mohr-Coulomb yield surface.")
+  return value
+
+
 # DruckerPrager3D class
 class DruckerPrager3D(ElasticMaterial, ModuleDruckerPrager3D):
   """
@@ -35,6 +45,30 @@
   Factory: material.
   """
 
+  # INVENTORY //////////////////////////////////////////////////////////
+
+  class Inventory(ElasticMaterial.Inventory):
+    """
+    Python object for managing FaultCohesiveKin facilities and properties.
+    """
+    
+    ## @class Inventory
+    ## Python object for managing FaultCohesiveKin facilities and properties.
+    ##
+    ## \b Properties
+    ## @li \b fit_mohr_coulomb Fit to Mohr-Coulomb yield surface.
+    ##
+    ## \b Facilities
+    ## @li None
+
+    import pyre.inventory
+
+    from pylith.meshio.OutputMatElastic import OutputMatElastic
+    fitMohrCoulomb = pyre.inventory.str("fit_mohr_coulomb", default="inscribed",
+                                        validator=validateFitMohrCoulomb)
+    fitMohrCoulomb.meta['tip'] = "Fit to Mohr-Coulomb yield surface."
+
+
   # PUBLIC METHODS /////////////////////////////////////////////////////
 
   def __init__(self, name="druckerprager3d"):
@@ -56,6 +90,23 @@
 
   # PRIVATE METHODS ////////////////////////////////////////////////////
 
+  def _configure(self):
+    """
+    Setup members using inventory.
+    """
+    ElasticMaterial._configure(self)
+    if self.inventory.fitMohrCoulomb == "inscribed":
+      fitEnum = ModuleDruckerPrager3D.MOHR_COULOMB_INSCRIBED
+    elif self.inventory.fitMohrCoulomb == "middle":
+      fitEnum = ModuleDruckerPrager3D.MOHR_COULOMB_MIDDLE
+    elif self.inventory.fitMohrCoulomb == "circumscribed":
+      fitEnum = ModuleDruckerPrager3D.MOHR_COULOMB_CIRCUMSCRIBED
+    else:
+      raise ValueError("Unknown fit to Mohr-Coulomb yield surface.")
+    ModuleDruckerPrager3D.fitMohrCoulomb(self, fitEnum)
+    return
+
+  
   def _createModuleObj(self):
     """
     Call constructor for module object for access to C++ object.

Copied: short/3D/PyLith/branches/pylith-scecdynrup/tests/3d/plasticity/dynamic (from rev 19528, short/3D/PyLith/trunk/tests/3d/plasticity/dynamic)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests/3d/refine/tet4.exo.gz
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests/3d/refine/tet4.jou
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests/3d/refine/tet4.jou	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests/3d/refine/tet4.jou	2012-01-31 04:55:42 UTC (rev 19529)
@@ -7,7 +7,7 @@
 # Set discretization size
 # ----------------------------------------------------------------------
 volume all scheme tetmesh
-volume all size 500
+volume all size 1500
 
 # ----------------------------------------------------------------------
 # Generate the mesh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/materials/TestDruckerPrager3D.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/materials/TestDruckerPrager3D.py	2012-01-31 04:51:58 UTC (rev 19528)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/materials/TestDruckerPrager3D.py	2012-01-31 04:55:42 UTC (rev 19529)
@@ -46,6 +46,14 @@
     return
 
 
+  def test_fitMohrCoulomb(self):
+    """
+    Test useElasticBehavior().
+    """
+    self.material.fitMohrCoulomb(self.material.MOHR_COULOMB_MIDDLE)
+    return
+
+
   def test_useElasticBehavior(self):
     """
     Test useElasticBehavior().



More information about the CIG-COMMITS mailing list