[cig-commits] r16163 - in short/3D/PyLith/trunk: . unittests/libtests unittests/libtests/friction unittests/libtests/friction/data

brad at geodynamics.org brad at geodynamics.org
Thu Jan 21 21:54:50 PST 2010


Author: brad
Date: 2010-01-21 21:54:49 -0800 (Thu, 21 Jan 2010)
New Revision: 16163

Added:
   short/3D/PyLith/trunk/unittests/libtests/friction/
   short/3D/PyLith/trunk/unittests/libtests/friction/Makefile.am
   short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc
   short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh
   short/3D/PyLith/trunk/unittests/libtests/friction/TestStatiFriction.cc
   short/3D/PyLith/trunk/unittests/libtests/friction/TestStatiFriction.hh
   short/3D/PyLith/trunk/unittests/libtests/friction/data/
   short/3D/PyLith/trunk/unittests/libtests/friction/data/FrictionModelData.cc
   short/3D/PyLith/trunk/unittests/libtests/friction/data/FrictionModelData.hh
   short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am
   short/3D/PyLith/trunk/unittests/libtests/friction/data/StaticFrictionData.cc
   short/3D/PyLith/trunk/unittests/libtests/friction/data/StaticFrictionData.hh
   short/3D/PyLith/trunk/unittests/libtests/friction/test_friction.cc
Modified:
   short/3D/PyLith/trunk/configure.ac
   short/3D/PyLith/trunk/unittests/libtests/Makefile.am
Log:
Started work on setting up unit tests for fault constitutive models.

Modified: short/3D/PyLith/trunk/configure.ac
===================================================================
--- short/3D/PyLith/trunk/configure.ac	2010-01-21 21:23:26 UTC (rev 16162)
+++ short/3D/PyLith/trunk/configure.ac	2010-01-22 05:54:49 UTC (rev 16163)
@@ -254,6 +254,8 @@
 		unittests/libtests/faults/data/Makefile
 		unittests/libtests/feassemble/Makefile
 		unittests/libtests/feassemble/data/Makefile
+		unittests/libtests/friction/Makefile
+		unittests/libtests/friction/data/Makefile
 		unittests/libtests/materials/Makefile
 		unittests/libtests/materials/data/Makefile
 		unittests/libtests/meshio/Makefile

Modified: short/3D/PyLith/trunk/unittests/libtests/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/Makefile.am	2010-01-21 21:23:26 UTC (rev 16162)
+++ short/3D/PyLith/trunk/unittests/libtests/Makefile.am	2010-01-22 05:54:49 UTC (rev 16163)
@@ -14,6 +14,7 @@
 	bc \
 	faults \
 	feassemble \
+	friction \
 	materials \
 	meshio \
 	topology \

Added: short/3D/PyLith/trunk/unittests/libtests/friction/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/Makefile.am	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/Makefile.am	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,65 @@
+# -*- Makefile -*-
+#
+# ----------------------------------------------------------------------
+#
+#                           Brad T. Aagaard
+#                        U.S. Geological Survey
+#
+# <LicenseText>
+#
+# ----------------------------------------------------------------------
+#
+
+subpackage = friction
+include $(top_srcdir)/subpackage.am
+
+SUBDIRS = data
+
+TESTS = testfriction
+
+check_PROGRAMS = testfriction
+
+# Primary source files
+testfriction_SOURCES = \
+	test_friction.cc
+
+#	TestFrictionModel.cc \
+#	TestStaticFriction.cc
+
+
+noinst_HEADERS = 
+
+#	TestFrictionModel.hh \
+#	TestStaticFriction.hh
+
+# Source files associated with testing data
+testfriction_SOURCES += 
+
+#	data/FrictionModelData.cc \
+#	data/StaticFrictionData.cc
+
+
+noinst_HEADERS += 
+
+#	data/FrictionModelData.hh \
+#	data/StaticFrictionData.hh
+
+AM_CPPFLAGS = \
+	$(PYTHON_EGG_CPPFLAGS) -I$(PYTHON_INCDIR) \
+	$(PETSC_SIEVE_FLAGS) $(PETSC_INCLUDE)
+
+testfriction_LDFLAGS = \
+	$(AM_LDFLAGS) $(PYTHON_LA_LDFLAGS)
+
+testfriction_LDADD = \
+	-lcppunit -ldl \
+	$(top_builddir)/libsrc/libpylith.la \
+	-lspatialdata \
+	$(PETSC_LIB) $(PYTHON_BLDLIBRARY) $(PYTHON_LIBS) $(PYTHON_SYSLIBS)
+
+if ENABLE_CUBIT
+  testfriction_LDADD += -lnetcdf_c++ -lnetcdf
+endif
+
+
+# End of file 

Added: short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,751 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestElasticMaterial.hh" // Implementation of class methods
+
+#include "data/ElasticMaterialData.hh" // USES ElasticMaterialData
+#include "data/ElasticStrain1DData.hh" // USES ElasticStrain1DData
+
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/Field.hh" // USES Field
+#include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
+#include "pylith/materials/ElasticIsotropic3D.hh" // USES ElasticIsotropic3D
+#include "pylith/materials/ElasticStrain1D.hh" // USES ElasticStrain1D
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
+#include "pylith/feassemble/GeometryLine1D.hh" // USES GeometryLine1D
+
+#include "pylith/utils/array.hh" // USES double_array
+
+#include "spatialdata/spatialdb/SimpleDB.hh" // USES SimpleDB
+#include "spatialdata/spatialdb/SimpleIOAscii.hh" // USES SimpleIOAscii
+#include "spatialdata/geocoords/CSCart.hh" // USES CSCart
+#include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
+
+#include <cstring> // USES memcpy()
+
+//#define PRECOMPUTE_GEOMETRY
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::materials::TestElasticMaterial );
+
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+
+// ----------------------------------------------------------------------
+// Test dbInitialStress()
+void
+pylith::materials::TestElasticMaterial::testDBInitialStress(void)
+{ // testDBInitialStress
+  const std::string& label = "my_database";
+  spatialdata::spatialdb::SimpleDB db;
+  db.label(label.c_str());
+  
+  ElasticIsotropic3D material;
+  material.dbInitialStress(&db);
+  
+  CPPUNIT_ASSERT(0 != material._dbInitialStress);
+  CPPUNIT_ASSERT_EQUAL(label, std::string(material._dbInitialStress->label()));
+} // testDBInitialStress
+
+// ----------------------------------------------------------------------
+// Test dbInitialStrain()
+void
+pylith::materials::TestElasticMaterial::testDBInitialStrain(void)
+{ // testDBInitialStrain
+  const std::string& label = "my_database";
+  spatialdata::spatialdb::SimpleDB db;
+  db.label(label.c_str());
+  
+  ElasticIsotropic3D material;
+  material.dbInitialStrain(&db);
+  
+  CPPUNIT_ASSERT(0 != material._dbInitialStrain);
+  CPPUNIT_ASSERT_EQUAL(label, std::string(material._dbInitialStrain->label()));
+} // testDBInitialStrain
+
+// ----------------------------------------------------------------------
+// Test initialize()
+void
+pylith::materials::TestElasticMaterial::testInitialize(void)
+{ // testInitialize
+  topology::Mesh mesh;
+  ElasticStrain1D material;
+  ElasticStrain1DData data;
+  _initialize(&mesh, &material, &data);
+
+  // Get cells associated with material
+  const int materialId = 24;
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+  SieveMesh::point_type cell = *cells->begin();
+
+  const double tolerance = 1.0e-06;
+  const int tensorSize = material._tensorSize;
+  const int numQuadPts = data.numLocs;
+
+  // Test initialStress field
+  CPPUNIT_ASSERT(0 != material._initialFields);
+  const ALE::Obj<RealSection>& stressSection = 
+    material._initialFields->get("initial stress").section();
+  CPPUNIT_ASSERT(!stressSection.isNull());
+  int fiberDim = numQuadPts * tensorSize;
+  CPPUNIT_ASSERT_EQUAL(fiberDim, stressSection->getFiberDimension(cell));
+  const double* initialStress = stressSection->restrictPoint(cell);
+  CPPUNIT_ASSERT(0 != initialStress);
+  const double* initialStressE = data.initialStress;
+  CPPUNIT_ASSERT(0 != initialStressE);
+  for (int i=0; i < fiberDim; ++i)
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, initialStress[i]/initialStressE[i],
+				 tolerance);
+
+  // Test initialStrain field
+  CPPUNIT_ASSERT(0 != material._initialFields);
+  const ALE::Obj<RealSection>& strainSection = 
+    material._initialFields->get("initial strain").section();
+  CPPUNIT_ASSERT(!strainSection.isNull());
+  fiberDim = numQuadPts * tensorSize;
+  CPPUNIT_ASSERT_EQUAL(fiberDim, strainSection->getFiberDimension(cell));
+  const double* initialStrain = strainSection->restrictPoint(cell);
+  CPPUNIT_ASSERT(0 != initialStrain);
+  const double* initialStrainE = data.initialStrain;
+  CPPUNIT_ASSERT(0 != initialStrainE);
+  for (int i=0; i < fiberDim; ++i)
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, initialStrain[i]/initialStrainE[i],
+				 tolerance);
+
+  // Test cell arrays
+  size_t size = data.numLocs*data.numPropsQuadPt;
+  CPPUNIT_ASSERT_EQUAL(size, material._propertiesCell.size());
+
+  size = data.numLocs*data.numVarsQuadPt;
+  CPPUNIT_ASSERT_EQUAL(size, material._stateVarsCell.size());
+
+  size = data.numLocs*tensorSize;
+  CPPUNIT_ASSERT_EQUAL(size, material._initialStressCell.size());
+
+  size = data.numLocs*tensorSize;
+  CPPUNIT_ASSERT_EQUAL(size, material._initialStrainCell.size());
+
+  size = data.numLocs;
+  CPPUNIT_ASSERT_EQUAL(size, material._densityCell.size());
+
+  size = data.numLocs*tensorSize;
+  CPPUNIT_ASSERT_EQUAL(size, material._stressCell.size());
+
+  int numElasticConsts = 0;
+  switch (data.dimension)
+    { // switch
+    case 1 :
+      numElasticConsts = 1;
+      break;
+    case 2 :
+      numElasticConsts = 6;
+      break;
+    case 3 :
+      numElasticConsts = 21;
+      break;
+    default :
+      assert(0);
+    } // switch
+  size = data.numLocs*numElasticConsts;
+  CPPUNIT_ASSERT_EQUAL(size, material._elasticConstsCell.size());
+} // testInitialize
+
+// ----------------------------------------------------------------------
+// Test retrievePropsAndVars().
+void
+pylith::materials::TestElasticMaterial::testRetrievePropsAndVars(void)
+{ // testRetrievePropsAndVars
+  topology::Mesh mesh;
+  ElasticStrain1D material;
+  ElasticStrain1DData data;
+  _initialize(&mesh, &material, &data);
+
+  // Get cells associated with material
+  const int materialId = 24;
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+  SieveMesh::point_type cell = *cells->begin();
+
+  material.retrievePropsAndVars(cell);
+
+  const double tolerance = 1.0e-06;
+  const int tensorSize = material._tensorSize;
+  const int numQuadPts = data.numLocs;
+  const int numVarsQuadPt = data.numVarsQuadPt;
+
+  // Test cell arrays
+  const double* propertiesE = data.properties;
+  CPPUNIT_ASSERT(0 != propertiesE);
+  const double_array& properties = material._propertiesCell;
+  size_t size = data.numLocs*data.numPropsQuadPt;
+  CPPUNIT_ASSERT_EQUAL(size, properties.size());
+  for (size_t i=0; i < size; ++i)
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, properties[i]/propertiesE[i],
+				 tolerance);
+
+  const double* stateVarsE = data.stateVars;
+  CPPUNIT_ASSERT( (0 < numVarsQuadPt && 0 != stateVarsE) ||
+		  (0 == numVarsQuadPt && 0 == stateVarsE) );
+  const double_array& stateVars = material._stateVarsCell;
+  size = data.numLocs*numVarsQuadPt;
+  CPPUNIT_ASSERT_EQUAL(size, stateVars.size());
+  for (size_t i=0; i < size; ++i)
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, stateVars[i]/stateVarsE[i],
+				 tolerance);
+
+  const double* initialStressE = data.initialStress;
+  CPPUNIT_ASSERT(0 != initialStressE);
+  const double_array& initialStress = material._initialStressCell;
+  size = data.numLocs*tensorSize;
+  CPPUNIT_ASSERT_EQUAL(size, initialStress.size());
+  for (size_t i=0; i < size; ++i)
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, initialStress[i]/initialStressE[i],
+				 tolerance);
+
+  const double* initialStrainE = data.initialStrain;
+  CPPUNIT_ASSERT(0 != initialStrainE);
+  const double_array& initialStrain = material._initialStrainCell;
+  size = data.numLocs*tensorSize;
+  CPPUNIT_ASSERT_EQUAL(size, initialStrain.size());
+  for (size_t i=0; i < size; ++i)
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, initialStrain[i]/initialStrainE[i],
+				 tolerance);
+} // testRetrievePropsAndVars
+
+// ----------------------------------------------------------------------
+// Test calcDensity()
+void
+pylith::materials::TestElasticMaterial::testCalcDensity(void)
+{ // testCalcDensity
+  topology::Mesh mesh;
+  ElasticStrain1D material;
+  ElasticStrain1DData data;
+  _initialize(&mesh, &material, &data);
+
+  // Get cells associated with material
+  const int materialId = 24;
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+  SieveMesh::point_type cell = *cells->begin();
+
+  material.retrievePropsAndVars(cell);
+  const double_array& density = material.calcDensity();
+
+  const int tensorSize = material._tensorSize;
+  const int numQuadPts = data.numLocs;
+
+  const double* densityE = data.density;
+  CPPUNIT_ASSERT(0 != densityE);
+  const size_t size = numQuadPts;
+  CPPUNIT_ASSERT_EQUAL(size, density.size());
+  const double tolerance = 1.0e-06;
+  for (size_t i=0; i < size; ++i)
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, density[i]/densityE[i], tolerance);
+} // testCalcDensity
+    
+// ----------------------------------------------------------------------
+// Test calcStress()
+void
+pylith::materials::TestElasticMaterial::testCalcStress(void)
+{ // testCalcStress
+  topology::Mesh mesh;
+  ElasticStrain1D material;
+  ElasticStrain1DData data;
+  _initialize(&mesh, &material, &data);
+
+  // Get cells associated with material
+  const int materialId = 24;
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+  SieveMesh::point_type cell = *cells->begin();
+
+  const int tensorSize = material._tensorSize;
+  const int numQuadPts = data.numLocs;
+
+  // Setup total strain
+  double_array strain(data.strain, numQuadPts*tensorSize);
+
+  material.retrievePropsAndVars(cell);
+  const double_array& stress = material.calcStress(strain);
+
+  const double* stressE = data.stress;
+  CPPUNIT_ASSERT(0 != stressE);
+  const size_t size = numQuadPts * tensorSize;
+  CPPUNIT_ASSERT_EQUAL(size, stress.size());
+  const double tolerance = 1.0e-06;
+  for (size_t i=0; i < size; ++i)
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, stress[i]/stressE[i], tolerance);
+} // testCalcStress
+    
+// ----------------------------------------------------------------------
+// Test calcDerivElastic()
+void
+pylith::materials::TestElasticMaterial::testCalcDerivElastic(void)
+{ // testCalcDerivElastic
+  topology::Mesh mesh;
+  ElasticStrain1D material;
+  ElasticStrain1DData data;
+  _initialize(&mesh, &material, &data);
+
+  // Get cells associated with material
+  const int materialId = 24;
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+  SieveMesh::point_type cell = *cells->begin();
+
+  const int tensorSize = material._tensorSize;
+  const int numQuadPts = data.numLocs;
+
+  // Setup total strain
+  double_array strain(data.strain, numQuadPts*tensorSize);
+
+  material.retrievePropsAndVars(cell);
+  const double_array& elasticConsts = material.calcDerivElastic(strain);
+
+  int numElasticConsts = 0;
+  switch (data.dimension)
+    { // switch
+    case 1 :
+      numElasticConsts = 1;
+      break;
+    case 2 :
+      numElasticConsts = 6;
+      break;
+    case 3 :
+      numElasticConsts = 21;
+      break;
+    default :
+      assert(0);
+    } // switch
+
+  const double* elasticConstsE = data.elasticConsts;
+  CPPUNIT_ASSERT(0 != elasticConstsE);
+  const size_t size = numQuadPts * numElasticConsts;
+  CPPUNIT_ASSERT_EQUAL(size, elasticConsts.size());
+  const double tolerance = 1.0e-06;
+  for (size_t i=0; i < size; ++i)
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, elasticConsts[i]/elasticConstsE[i],
+				 tolerance);
+} // testCalcDerivElastic
+    
+// ----------------------------------------------------------------------
+// Test updateStateVars()
+void
+pylith::materials::TestElasticMaterial::testUpdateStateVars(void)
+{ // testUpdateStateVars
+  std::cout << "\n\nWARNING!! WARNING!! WARNING!!\n"
+    "Need to implement using material with state variables.\n\n";
+} // testUpdateStateVars
+
+// ----------------------------------------------------------------------
+// Test calcStableTimeStepImplicit()
+void
+pylith::materials::TestElasticMaterial::testStableTimeStepImplicit(void)
+{ // testStableTimeStepImplicit
+  topology::Mesh mesh;
+  ElasticStrain1D material;
+  ElasticStrain1DData data;
+  _initialize(&mesh, &material, &data);
+
+  // Get cells associated with material
+  const int materialId = 24;
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+  SieveMesh::point_type cell = *cells->begin();
+
+  material.retrievePropsAndVars(cell);
+  const double dt = material.stableTimeStepImplicit(mesh);
+
+  const double tolerance = 1.0e-06;
+  const double dtE = data.dtStableImplicit;
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, dt/dtE, tolerance);
+} // testStableTimeStepImplicit
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::materials::TestElasticMaterial::setUp(void)
+{ // setUp
+  TestMaterial::setUp();
+  _matElastic = 0;
+  _dataElastic = 0;
+} // setUp
+
+// ----------------------------------------------------------------------
+// Tear down testing data.
+void
+pylith::materials::TestElasticMaterial::tearDown(void)
+{ // tearDown
+  TestMaterial::tearDown();
+  delete _matElastic; _matElastic = 0;
+  delete _dataElastic; _dataElastic = 0;
+} // tearDown
+
+// ----------------------------------------------------------------------
+// Test _calcDensity()
+void
+pylith::materials::TestElasticMaterial::test_calcDensity(void)
+{ // _testCalcDensity
+  CPPUNIT_ASSERT(0 != _matElastic);
+  CPPUNIT_ASSERT(0 != _dataElastic);
+  const ElasticMaterialData* data = _dataElastic;
+
+  const int numLocs = data->numLocs;
+  const int numPropsQuadPt = data->numPropsQuadPt;
+  const int numVarsQuadPt = data->numVarsQuadPt;
+  
+  double density = 0;
+  double_array properties(numPropsQuadPt);
+  double_array stateVars(numVarsQuadPt);
+
+  for (int iLoc=0; iLoc < numLocs; ++iLoc) {
+    memcpy(&properties[0], &data->properties[iLoc*numPropsQuadPt],
+	   numPropsQuadPt*sizeof(double));
+    memcpy(&stateVars[0], &data->stateVars[iLoc*numVarsQuadPt],
+	   numVarsQuadPt*sizeof(double));
+
+    _matElastic->_calcDensity(&density, 
+			      &properties[0], properties.size(),
+			      &stateVars[0], stateVars.size());
+    
+    const double densityE = data->density[iLoc];
+    
+    const double tolerance = 1.0e-06;
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, density/densityE, tolerance);
+  } // for
+} // _testCalcDensity
+
+// ----------------------------------------------------------------------
+// Test _calcStress()
+void
+pylith::materials::TestElasticMaterial::test_calcStress(void)
+{ // _testCalcStress
+  CPPUNIT_ASSERT(0 != _matElastic);
+  CPPUNIT_ASSERT(0 != _dataElastic);
+  const ElasticMaterialData* data = _dataElastic;
+
+  const bool computeStateVars = true;
+
+  const int numLocs = data->numLocs;
+  const int numPropsQuadPt = data->numPropsQuadPt;
+  const int numVarsQuadPt = data->numVarsQuadPt;
+  const int tensorSize = _matElastic->_tensorSize;
+  
+  double_array stress(tensorSize);
+  double_array properties(numPropsQuadPt);
+  double_array stateVars(numVarsQuadPt);
+  double_array strain(tensorSize);
+  double_array initialStress(tensorSize);
+  double_array initialStrain(tensorSize);
+
+  for (int iLoc=0; iLoc < numLocs; ++iLoc) {
+    memcpy(&properties[0], &data->properties[iLoc*numPropsQuadPt],
+	   properties.size()*sizeof(double));
+    memcpy(&stateVars[0], &data->stateVars[iLoc*numVarsQuadPt],
+	   stateVars.size()*sizeof(double));
+    memcpy(&strain[0], &data->strain[iLoc*tensorSize],
+	   strain.size()*sizeof(double));
+    memcpy(&initialStress[0], &data->initialStress[iLoc*tensorSize],
+	   initialStress.size()*sizeof(double));
+    memcpy(&initialStrain[0], &data->initialStrain[iLoc*tensorSize],
+	   initialStrain.size()*sizeof(double));
+
+    _matElastic->_calcStress(&stress[0], stress.size(),
+			     &properties[0], properties.size(),
+			     &stateVars[0], stateVars.size(),
+			     &strain[0], strain.size(),
+			     &initialStress[0], initialStress.size(),
+			     &initialStrain[0], initialStrain.size(),
+			     computeStateVars);
+
+    const double* stressE = &data->stress[iLoc*tensorSize];
+    CPPUNIT_ASSERT(0 != stressE);
+
+    const double tolerance = 1.0e-06;
+    for (int i=0; i < tensorSize; ++i)
+      if (fabs(stressE[i]) > tolerance)
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, stress[i]/stressE[i], 
+				     tolerance);
+      else
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(stressE[i], stress[i],
+				     tolerance);
+  } // for
+} // _testCalcStress
+
+// ----------------------------------------------------------------------
+// Test _calcElasticConsts()
+void
+pylith::materials::TestElasticMaterial::test_calcElasticConsts(void)
+{ // _testCalcElasticConsts
+  CPPUNIT_ASSERT(0 != _matElastic);
+  CPPUNIT_ASSERT(0 != _dataElastic);
+  const ElasticMaterialData* data = _dataElastic;
+
+  int numConsts = 0;
+  int tensorSize = 0;
+  switch(data->dimension)
+    { // switch
+    case 1 :
+      numConsts = 1;
+      tensorSize = 1;
+      break;
+    case 2 :
+      numConsts = 6;
+      tensorSize = 3;
+      break;
+    case 3 :
+      numConsts = 21;
+      tensorSize = 6;
+      break;
+    } // switch
+  const int numLocs = data->numLocs;
+  const int numPropsQuadPt = data->numPropsQuadPt;
+  const int numVarsQuadPt = data->numVarsQuadPt;
+  
+  double_array elasticConsts(numConsts);
+  double_array properties(numPropsQuadPt);
+  double_array stateVars(numVarsQuadPt);
+  double_array strain(tensorSize);
+  double_array initialStress(tensorSize);
+  double_array initialStrain(tensorSize);
+
+  for (int iLoc=0; iLoc < numLocs; ++iLoc) {
+    memcpy(&properties[0], &data->properties[iLoc*numPropsQuadPt],
+	   numPropsQuadPt*sizeof(double));
+    memcpy(&stateVars[0], &data->stateVars[iLoc*numVarsQuadPt],
+	   numVarsQuadPt*sizeof(double));
+    memcpy(&strain[0], &data->strain[iLoc*tensorSize],
+	   tensorSize*sizeof(double));
+    memcpy(&initialStress[0], &data->initialStress[iLoc*tensorSize],
+	   tensorSize*sizeof(double));
+    memcpy(&initialStrain[0], &data->initialStrain[iLoc*tensorSize],
+	   tensorSize*sizeof(double));
+
+    _matElastic->_calcElasticConsts(&elasticConsts[0], elasticConsts.size(),
+				    &properties[0], properties.size(),
+				    &stateVars[0], stateVars.size(),
+				    &strain[0], strain.size(),
+				    &initialStress[0], initialStress.size(),
+				    &initialStrain[0], initialStrain.size());
+
+    const double* elasticConstsE = &data->elasticConsts[iLoc*numConsts];
+    CPPUNIT_ASSERT(0 != elasticConstsE);
+    
+    const double tolerance = 1.0e-06;
+    for (int i=0; i < numConsts; ++i)
+      if (fabs(elasticConstsE[i]) > tolerance)
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, elasticConsts[i]/elasticConstsE[i], 
+				     tolerance);
+      else
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(elasticConstsE[i], elasticConsts[i],
+				     tolerance);
+  } // for
+} // _testCalcElasticConsts
+
+// ----------------------------------------------------------------------
+// Test _updateStateVars()
+void
+pylith::materials::TestElasticMaterial::test_updateStateVars(void)
+{ // test_updateStateVars
+  CPPUNIT_ASSERT(0 != _matElastic);
+  CPPUNIT_ASSERT(0 != _dataElastic);
+  const ElasticMaterialData* data = _dataElastic;
+
+  const bool computeStateVars = true;
+
+  const int numLocs = data->numLocs;
+  const int numPropsQuadPt = data->numPropsQuadPt;
+  const int numVarsQuadPt = data->numVarsQuadPt;
+  const int tensorSize = _matElastic->_tensorSize;
+  
+  double_array properties(numPropsQuadPt);
+  double_array stateVars(numVarsQuadPt);
+  double_array strain(tensorSize);
+  double_array initialStress(tensorSize);
+  double_array initialStrain(tensorSize);
+
+  for (int iLoc=0; iLoc < numLocs; ++iLoc) {
+    memcpy(&properties[0], &data->properties[iLoc*numPropsQuadPt],
+	   numPropsQuadPt*sizeof(double));
+    memcpy(&stateVars[0], &data->stateVars[iLoc*numVarsQuadPt],
+	   numVarsQuadPt*sizeof(double));
+    memcpy(&strain[0], &data->strain[iLoc*tensorSize],
+	   tensorSize*sizeof(double));
+    memcpy(&initialStress[0], &data->initialStress[iLoc*tensorSize],
+	   tensorSize*sizeof(double));
+    memcpy(&initialStrain[0], &data->initialStrain[iLoc*tensorSize],
+	   tensorSize*sizeof(double));
+
+    _matElastic->_updateStateVars(&stateVars[0], stateVars.size(),
+				  &properties[0], properties.size(),
+				  &strain[0], strain.size(),
+				  &initialStress[0], initialStress.size(),
+				  &initialStrain[0], initialStrain.size());
+    
+    const double* stateVarsE = 
+      (numVarsQuadPt > 0) ? &data->stateVarsUpdated[iLoc*numVarsQuadPt] : 0;
+    CPPUNIT_ASSERT( (0 < numVarsQuadPt && 0 != stateVarsE) ||
+		    (0 == numVarsQuadPt && 0 == stateVarsE) );
+
+    const double tolerance = 1.0e-06;
+    for (int i=0; i < numVarsQuadPt; ++i)
+      if (fabs(stateVarsE[i]) > tolerance)
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, stateVars[i]/stateVarsE[i], 
+				     tolerance);
+      else
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(stateVarsE[i], stateVars[i],
+				     tolerance);
+  } // for
+} // test_updateStateVars
+
+// ----------------------------------------------------------------------
+// Test _stableTimeStepImplicit()
+void
+pylith::materials::TestElasticMaterial::test_stableTimeStepImplicit(void)
+{ // _testCalcDensity
+  CPPUNIT_ASSERT(0 != _matElastic);
+  CPPUNIT_ASSERT(0 != _dataElastic);
+  const ElasticMaterialData* data = _dataElastic;
+
+  const double dt =
+    _matElastic->_stableTimeStepImplicit(data->properties, data->numPropsQuadPt,
+					 data->stateVars, data->numVarsQuadPt);
+
+  const double dtE = data->dtStableImplicit;
+
+  const double tolerance = 1.0e-06;
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, dt/dtE, tolerance);
+} // _testStableTimeStepImplicit
+
+// ----------------------------------------------------------------------
+// Setup nondimensionalization.
+void
+pylith::materials::TestElasticMaterial::setupNormalizer(void)
+{ // setupNormalizer
+  spatialdata::units::Nondimensional normalizer;
+  normalizer.lengthScale(_data->lengthScale);
+  normalizer.pressureScale(_data->pressureScale);
+  normalizer.timeScale(_data->timeScale);
+  normalizer.densityScale(_data->densityScale);
+  _material->normalizer(normalizer);
+  _matElastic->normalizer(normalizer);
+} // setupNormalizer
+
+// ----------------------------------------------------------------------
+// Setup mesh and material.
+void
+pylith::materials::TestElasticMaterial::_initialize(
+					  topology::Mesh* mesh,
+					  ElasticStrain1D* material,
+					  const ElasticStrain1DData* data)
+{ // _initialize
+  CPPUNIT_ASSERT(0 != mesh);
+  CPPUNIT_ASSERT(0 != material);
+  CPPUNIT_ASSERT(0 != data);
+
+  meshio::MeshIOAscii iohandler;
+  iohandler.filename("data/line3.mesh");
+  iohandler.read(mesh);
+
+  // Set up coordinates
+  spatialdata::geocoords::CSCart cs;
+  spatialdata::units::Nondimensional normalizer;
+  cs.setSpaceDim(mesh->dimension());
+  cs.initialize();
+  mesh->coordsys(&cs);
+  mesh->nondimensionalize(normalizer);
+
+  // Setup quadrature
+  feassemble::Quadrature<topology::Mesh> quadrature;
+  feassemble::GeometryLine1D geometry;
+  quadrature.refGeometry(&geometry);
+  const int cellDim = 1;
+  const int numCorners = 3;
+  const int numQuadPts = 2;
+  const int spaceDim = 1;
+  const double basis[] = { 0.455, -0.122, 0.667, -0.122, 0.455, 0.667 };
+  const double basisDeriv[] = { 
+    -1.07735027e+00,
+    -7.73502692e-02,
+    1.15470054e+00,
+    7.73502692e-02,
+    1.07735027e+00,
+    -1.15470054e+00,
+  };
+  const double quadPtsRef[] = { -0.577350269, 0.577350269 };
+  const double quadWts[] = { 1.0, 1.0  };
+  quadrature.initialize(basis, numQuadPts, numCorners,
+			basisDeriv, numQuadPts, numCorners, cellDim,
+			quadPtsRef, numQuadPts, cellDim,
+			quadWts, numQuadPts,
+			spaceDim);
+
+
+  // Get cells associated with material
+  const int materialId = 24;
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh->sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+
+  // Compute geometry for cells
+  quadrature.initializeGeometry();
+#if defined(PRECOMPUTE_GEOMETRY)
+  quadrature.computeGeometry(*mesh, cells);
+#endif
+
+  spatialdata::spatialdb::SimpleDB db;
+  spatialdata::spatialdb::SimpleIOAscii dbIO;
+  dbIO.filename("data/matinitialize.spatialdb");
+  db.ioHandler(&dbIO);
+  db.queryType(spatialdata::spatialdb::SimpleDB::NEAREST);
+  
+  spatialdata::spatialdb::SimpleDB dbStress;
+  spatialdata::spatialdb::SimpleIOAscii dbIOStress;
+  dbIOStress.filename("data/matstress.spatialdb");
+  dbStress.ioHandler(&dbIOStress);
+  dbStress.queryType(spatialdata::spatialdb::SimpleDB::NEAREST);
+  
+  spatialdata::spatialdb::SimpleDB dbStrain;
+  spatialdata::spatialdb::SimpleIOAscii dbIOStrain;
+  dbIOStrain.filename("data/matstrain.spatialdb");
+  dbStrain.ioHandler(&dbIOStrain);
+  dbStrain.queryType(spatialdata::spatialdb::SimpleDB::NEAREST);
+  
+  material->dbProperties(&db);
+  material->id(materialId);
+  material->label("my_material");
+  material->normalizer(normalizer);
+  material->dbInitialStress(&dbStress);
+  material->dbInitialStrain(&dbStrain);
+  
+  material->initialize(*mesh, &quadrature);
+} // _initialize
+
+
+// End of file 

Added: short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,137 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/friction/TestFrictionModel.hh
+ *
+ * @brief C++ TestFrictionModel object
+ *
+ * C++ unit testing for FrictionModel.
+ */
+
+#if !defined(pylith_friction_testfrictionmodel_hh)
+#define pylith_friction_testfrictionmodel_hh
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include "pylith/friction/frictionfwd.hh" // forward declarations
+#include "pylith/topology/topologyfwd.hh" // forward declarations
+
+/// Namespace for pylith package
+namespace pylith {
+  namespace friction {
+    class TestFrictionModel;
+    class FrictionModelData;
+  } // friction
+} // pylith
+
+/// C++ unit testing for FrictionModel
+class pylith::friction::TestFrictionModel : public CppUnit::TestFixture
+{ // class TestFrictionModel
+
+  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+  CPPUNIT_TEST_SUITE( TestFrictionModel );
+
+  CPPUNIT_TEST( testLabel );
+  CPPUNIT_TEST( testTimeStep );
+  CPPUNIT_TEST( testDBProperties );
+  CPPUNIT_TEST( testDBStateVars );
+  CPPUNIT_TEST( testNormalizer );
+  CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testRetrievePropsAndVars );
+
+  CPPUNIT_TEST_SUITE_END();
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /// Test label()
+  void testLabel(void);
+
+  /// Test timeStep()
+  void testTimeStep(void);
+
+  /// Test dbProperties()
+  void testDBProperties(void);
+
+  /// Test dbStateVars().
+  void testDBStateVars(void);
+
+  /// Test normalizer().
+  void testNormalizer(void);
+
+  /// Test needNewJacobian()
+  void testNeedNewJacobian(void);
+
+  /// Test initialize()
+  void testInitialize(void);
+
+  /// Test retrievePropsAndVars().
+  void testRetrievePropsAndVars(void);
+
+  /// Test calcFriction()
+  void testCalcFriction(void);
+
+  /// Test updateStateVars().
+  void testUpdateStateVars(void);
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  // Methods used in testing children of this class.
+
+  /// Setup testing data.
+  virtual
+  void setUp(void);
+
+  /// Tear down testing data.
+  virtual
+  void tearDown(void);
+
+  /// Test _calcFriction().
+  void test_calcFriction(void);
+
+  /// Test _updateStateVars().
+  void test_updateStateVars(void);
+
+  /// Test hasProperty().
+  void testHasProperty(void);
+
+  /// Test hasStateVar().
+  void testHasStateVar(void);
+
+  // PROTECTED METHODS //////////////////////////////////////////////////
+protected :
+
+  /// Setup nondimensionalization.
+  void setupNormalizer(void);
+
+  // PROTECTED MEMBERS //////////////////////////////////////////////////
+protected :
+
+  FrictionModel* _friction; ///< Test subject.
+  FrictionModelData* _data; ///< Data for tests.
+
+  // PRIVATE MEMBERS ////////////////////////////////////////////////////
+private :
+
+  /** Setup mesh and material.
+   *
+   * @param mesh Finite-element mesh.
+   */
+  void _initialize(topology::SubMesh* mesh);
+
+}; // class TestFrictionModel
+
+#endif // pylith_friction_testfrictionmodel_hh
+
+// End of file 

Added: short/3D/PyLith/trunk/unittests/libtests/friction/TestStatiFriction.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestStatiFriction.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestStatiFriction.cc	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,76 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestElasticIsotropic3D.hh" // Implementation of class methods
+
+#include "data/ElasticIsotropic3DData.hh" // USES ElasticIsotropic3DData
+
+#include "pylith/materials/ElasticIsotropic3D.hh" // USES ElasticIsotropic3D
+
+#include "pylith/utils/constdefs.h" // USES MAXDOUBLE
+#include "pylith/topology/Mesh.hh" // USES Mesh
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::materials::TestElasticIsotropic3D );
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::materials::TestElasticIsotropic3D::setUp(void)
+{ // setUp
+  _material = new ElasticIsotropic3D();
+  _matElastic = new ElasticIsotropic3D();
+  _data = new ElasticIsotropic3DData();
+  _dataElastic = new ElasticIsotropic3DData();
+  setupNormalizer();
+} // setUp
+
+// ----------------------------------------------------------------------
+// Test stableTimeStepImplicit().
+void
+pylith::materials::TestElasticIsotropic3D::testStableTimeStepImplicit(void)
+{ // testStableTimeStepImplicit
+  assert(0 != _matElastic);
+
+  topology::Mesh mesh;
+
+  const double dt = _matElastic->stableTimeStepImplicit(mesh);
+  CPPUNIT_ASSERT_EQUAL(1.0, dt/pylith::PYLITH_MAXDOUBLE);
+} // testStableTimeStepImplicit
+
+// ----------------------------------------------------------------------
+// Test hasProperty().
+void
+pylith::materials::TestElasticIsotropic3D::testHasProperty(void)
+{ // testHasProperty
+  ElasticIsotropic3D material;
+
+  CPPUNIT_ASSERT(material.hasProperty("mu"));
+  CPPUNIT_ASSERT(material.hasProperty("lambda"));
+  CPPUNIT_ASSERT(material.hasProperty("density"));
+  CPPUNIT_ASSERT(!material.hasProperty("aaa"));
+} // testHasProperty
+
+// ----------------------------------------------------------------------
+// Test hasStateVar().
+void
+pylith::materials::TestElasticIsotropic3D::testHasStateVar(void)
+{ // testHasStateVar
+  ElasticIsotropic3D material;
+
+  CPPUNIT_ASSERT(!material.hasStateVar("stress"));
+} // testHasStateVar
+
+
+// End of file 

Added: short/3D/PyLith/trunk/unittests/libtests/friction/TestStatiFriction.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestStatiFriction.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestStatiFriction.hh	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,80 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/materials/TestElasticIsotropic3D.hh
+ *
+ * @brief C++ TestElasticIsotropic3D object
+ *
+ * C++ unit testing for ElasticIsotropic3D.
+ */
+
+#if !defined(pylith_materials_testelasticisotropic3d_hh)
+#define pylith_materials_testelasticisotropic3d_hh
+
+#include "TestElasticMaterial.hh"
+
+/// Namespace for pylith package
+namespace pylith {
+  namespace materials {
+    class TestElasticIsotropic3D;
+  } // materials
+} // pylith
+
+/// C++ unit testing for ElasticIsotropic3D
+class pylith::materials::TestElasticIsotropic3D : public TestElasticMaterial
+{ // class TestElasticIsotropic3D
+
+  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+  CPPUNIT_TEST_SUITE( TestElasticIsotropic3D );
+
+  CPPUNIT_TEST( testDimension );
+  CPPUNIT_TEST( testTensorSize );
+  CPPUNIT_TEST( testDBToProperties );
+  CPPUNIT_TEST( testNonDimProperties );
+  CPPUNIT_TEST( testDimProperties );
+  CPPUNIT_TEST( testDBToStateVars );
+  CPPUNIT_TEST( testNonDimStateVars );
+  CPPUNIT_TEST( testDimStateVars );
+  CPPUNIT_TEST( testStableTimeStepImplicit );
+  CPPUNIT_TEST( test_calcDensity );
+  CPPUNIT_TEST( test_calcStress );
+  CPPUNIT_TEST( test_calcElasticConsts );
+  CPPUNIT_TEST( test_updateStateVars );
+  CPPUNIT_TEST( test_stableTimeStepImplicit );
+
+  CPPUNIT_TEST( testHasProperty );
+  CPPUNIT_TEST( testHasStateVar );
+
+  CPPUNIT_TEST_SUITE_END();
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /// Setup testing data.
+  void setUp(void);
+
+  /// Test stableTimeStepImplicit().
+  void testStableTimeStepImplicit(void);
+
+  /// Test hasProperty().
+  void testHasProperty(void);
+
+  /// Test hasStateVar().
+  void testHasStateVar(void);
+
+}; // class TestElasticIsotropic3D
+
+#endif // pylith_materials_testelasticisotropic3d_hh
+
+
+// End of file 

Added: short/3D/PyLith/trunk/unittests/libtests/friction/data/FrictionModelData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/data/FrictionModelData.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/data/FrictionModelData.cc	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,47 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#include "MaterialData.hh"
+
+// ----------------------------------------------------------------------
+// Constructor
+pylith::materials::MaterialData::MaterialData(void) :
+  dimension(0),
+  numLocs(0),
+  numProperties(0),
+  numStateVars(0),
+  numDBProperties(0),
+  numDBStateVars(0),
+  numPropsQuadPt(0),
+  numVarsQuadPt(0),
+  numPropertyValues(0),
+  numStateVarValues(0),
+  dbPropertyValues(0),
+  dbStateVarValues(0),
+  dbProperties(0),
+  dbStateVars(0),
+  properties(0),
+  stateVars(0),
+  lengthScale(0),
+  timeScale(0),
+  pressureScale(0),
+  densityScale(0)
+{ // constructor
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor
+pylith::materials::MaterialData::~MaterialData(void)
+{ // destructor
+} // destructor
+
+// End of file

Added: short/3D/PyLith/trunk/unittests/libtests/friction/data/FrictionModelData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/data/FrictionModelData.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/data/FrictionModelData.hh	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,69 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_friction_frictionmodeldata_hh)
+#define pylith_friction_frictionmodeldata_hh
+
+namespace pylith {
+  namespace friction {
+     class FrictionModelData;
+  } // pylith
+} // friction
+
+class pylith::friction::FrictionModelData {
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public :
+  
+  /// Constructor
+  FrictionModelData(void);
+
+  /// Destructor
+  ~FrictionModelData(void);
+
+// PUBLIC MEMBERS ///////////////////////////////////////////////////////
+public:
+
+  int numProperties; ///< Number of parameters for physical properties.
+  int numStateVars; ///< Number of state variables.
+  int numDBProperties; ///< Number of db values for properties.
+  int numDBStateVars; ///< Number of db values for state variables.
+
+  int numProps; ///< Number of properties at each vertex.
+  int numVars; ///< Number of state variables at each vertex.
+
+  int* numPropertyValues; ///< Number of values for each property
+  int* numStateVarValues; ///< Number of values for each state variable
+
+  char** dbPropertyValues; ///< Names of db values for properties.
+  char** dbStateVarValues; ///< Names of db values for state variables.
+
+  double* dbProperties; ///< Database values for properties at locations.
+  double* dbStateVars; ///< Database values for state variables at locations.
+  double* properties; ///< Properties at locations.
+  double* stateVars; ///< State variables at locations.
+  double* propertiesNondim; ///< Nondimensional properties at locations.
+  double* stateVarsNondim; ///< Nondimensional state variables at locations.
+
+  double* friction; ///< Friction at location.
+  double* stateVarsUpdated; ///< Updated state variables at location.
+
+  double lengthScale; ///< Length scale for nondimensionalization.
+  double timeScale; ///< Time scale for nondimensionalization.
+  double pressureScale; ///< Pressure scale for nondimensionalization.
+  double densityScale; ///< Density scale for nondimensionalization.
+
+};
+
+#endif // pylith_friction_frictionmodeldata_hh
+
+// End of file

Added: short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,29 @@
+# -*- Makefile -*-
+#
+# ----------------------------------------------------------------------
+#
+#                           Brad T. Aagaard
+#                        U.S. Geological Survey
+#
+# <LicenseText>
+#
+# ----------------------------------------------------------------------
+#
+
+dist_noinst_DATA =
+
+noinst_TMP =
+
+# 'export' the input files by performing a mock install
+export_datadir = $(top_builddir)/unittests/libtests/friction/data
+export-data: $(dist_noinst_DATA)
+	if [ "X$(top_srcdir)" != "X$(top_builddir)" ]; then for f in $(dist_noinst_DATA); do $(install_sh_DATA) $(srcdir)/$$f $(export_datadir); done; fi
+
+clean-data:
+	if [ "X$(top_srcdir)" != "X$(top_builddir)" ]; then for f in $(dist_noinst_DATA) $(noinst_TMP); do $(RM) $(RM_FLAGS) $(export_datadir)/$$f; done; fi
+
+BUILT_SOURCES = export-data
+clean-local: clean-data
+
+
+# End of file 

Added: short/3D/PyLith/trunk/unittests/libtests/friction/data/StaticFrictionData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/data/StaticFrictionData.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/data/StaticFrictionData.cc	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,243 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+// DO NOT EDIT THIS FILE
+// This file was generated from python application elasticisotropic3d.
+
+#include "ElasticIsotropic3DData.hh"
+
+const int pylith::materials::ElasticIsotropic3DData::_dimension = 3;
+
+const int pylith::materials::ElasticIsotropic3DData::_numLocs = 2;
+
+const int pylith::materials::ElasticIsotropic3DData::_numProperties = 3;
+
+const int pylith::materials::ElasticIsotropic3DData::_numStateVars = 0;
+
+const int pylith::materials::ElasticIsotropic3DData::_numDBProperties = 3;
+
+const int pylith::materials::ElasticIsotropic3DData::_numDBStateVars = 0;
+
+const int pylith::materials::ElasticIsotropic3DData::_numPropsQuadPt = 3;
+
+const int pylith::materials::ElasticIsotropic3DData::_numVarsQuadPt = 0;
+
+const double pylith::materials::ElasticIsotropic3DData::_lengthScale =   1.00000000e+03;
+
+const double pylith::materials::ElasticIsotropic3DData::_timeScale =   1.00000000e+00;
+
+const double pylith::materials::ElasticIsotropic3DData::_pressureScale =   2.25000000e+10;
+
+const double pylith::materials::ElasticIsotropic3DData::_densityScale =   1.00000000e+03;
+
+const double pylith::materials::ElasticIsotropic3DData::_dtStableImplicit =   1.00000000e+30;
+
+const int pylith::materials::ElasticIsotropic3DData::_numPropertyValues[] = {
+1,
+1,
+1,
+};
+
+const int* pylith::materials::ElasticIsotropic3DData::_numStateVarValues = 0;
+
+const char* pylith::materials::ElasticIsotropic3DData::_dbPropertyValues[] = {
+"density",
+"vs",
+"vp",
+};
+
+const char** pylith::materials::ElasticIsotropic3DData::_dbStateVarValues = 0;
+
+const double pylith::materials::ElasticIsotropic3DData::_dbProperties[] = {
+  2.50000000e+03,
+  3.00000000e+03,
+  5.19615242e+03,
+  2.00000000e+03,
+  1.20000000e+03,
+  2.07846097e+03,
+};
+
+const double* pylith::materials::ElasticIsotropic3DData::_dbStateVars = 0;
+
+const double pylith::materials::ElasticIsotropic3DData::_properties[] = {
+  2.50000000e+03,
+  2.25000000e+10,
+  2.25000000e+10,
+  2.00000000e+03,
+  2.88000000e+09,
+  2.88000000e+09,
+};
+
+const double* pylith::materials::ElasticIsotropic3DData::_stateVars = 0;
+
+const double pylith::materials::ElasticIsotropic3DData::_propertiesNondim[] = {
+  2.50000000e+00,
+  1.00000000e+00,
+  1.00000000e+00,
+  2.00000000e+00,
+  1.28000000e-01,
+  1.28000000e-01,
+};
+
+const double* pylith::materials::ElasticIsotropic3DData::_stateVarsNondim = 0;
+
+const double pylith::materials::ElasticIsotropic3DData::_density[] = {
+  2.50000000e+03,
+  2.00000000e+03,
+};
+
+const double pylith::materials::ElasticIsotropic3DData::_strain[] = {
+  1.10000000e-04,
+  1.20000000e-04,
+  1.30000000e-04,
+  1.40000000e-04,
+  1.50000000e-04,
+  1.60000000e-04,
+  4.10000000e-04,
+  4.20000000e-04,
+  4.30000000e-04,
+  4.40000000e-04,
+  4.50000000e-04,
+  4.60000000e-04,
+};
+
+const double pylith::materials::ElasticIsotropic3DData::_stress[] = {
+ -2.24790000e+07,
+ -2.24780000e+07,
+ -2.24770000e+07,
+ -8.97600000e+06,
+  6.61750000e+06,
+ -8.97400000e+06,
+ -2.82900000e+06,
+ -2.82800000e+06,
+ -2.82700000e+06,
+ -1.09800000e+06,
+  2.60956000e+06,
+ -1.09600000e+06,
+};
+
+const double pylith::materials::ElasticIsotropic3DData::_elasticConsts[] = {
+  6.75000000e+10,
+  2.25000000e+10,
+  2.25000000e+10,
+  0.00000000e+00,
+  0.00000000e+00,
+  0.00000000e+00,
+  6.75000000e+10,
+  2.25000000e+10,
+  0.00000000e+00,
+  0.00000000e+00,
+  0.00000000e+00,
+  6.75000000e+10,
+  0.00000000e+00,
+  0.00000000e+00,
+  0.00000000e+00,
+  4.50000000e+10,
+  0.00000000e+00,
+  0.00000000e+00,
+  4.50000000e+10,
+  0.00000000e+00,
+  4.50000000e+10,
+  8.64000000e+09,
+  2.88000000e+09,
+  2.88000000e+09,
+  0.00000000e+00,
+  0.00000000e+00,
+  0.00000000e+00,
+  8.64000000e+09,
+  2.88000000e+09,
+  0.00000000e+00,
+  0.00000000e+00,
+  0.00000000e+00,
+  8.64000000e+09,
+  0.00000000e+00,
+  0.00000000e+00,
+  0.00000000e+00,
+  5.76000000e+09,
+  0.00000000e+00,
+  0.00000000e+00,
+  5.76000000e+09,
+  0.00000000e+00,
+  5.76000000e+09,
+};
+
+const double pylith::materials::ElasticIsotropic3DData::_initialStress[] = {
+  2.10000000e+04,
+  2.20000000e+04,
+  2.30000000e+04,
+  2.40000000e+04,
+  2.50000000e+04,
+  2.60000000e+04,
+  5.10000000e+04,
+  5.20000000e+04,
+  5.30000000e+04,
+  5.40000000e+04,
+  5.50000000e+04,
+  5.60000000e+04,
+};
+
+const double pylith::materials::ElasticIsotropic3DData::_initialStrain[] = {
+  3.10000000e-04,
+  3.20000000e-04,
+  3.30000000e-04,
+  3.40000000e-04,
+  3.50000000e-06,
+  3.60000000e-04,
+  6.10000000e-04,
+  6.20000000e-04,
+  6.30000000e-04,
+  6.40000000e-04,
+  6.50000000e-06,
+  6.60000000e-04,
+};
+
+const double* pylith::materials::ElasticIsotropic3DData::_stateVarsUpdated = 0;
+
+pylith::materials::ElasticIsotropic3DData::ElasticIsotropic3DData(void)
+{ // constructor
+  dimension = _dimension;
+  numLocs = _numLocs;
+  numProperties = _numProperties;
+  numStateVars = _numStateVars;
+  numDBProperties = _numDBProperties;
+  numDBStateVars = _numDBStateVars;
+  numPropsQuadPt = _numPropsQuadPt;
+  numVarsQuadPt = _numVarsQuadPt;
+  lengthScale = _lengthScale;
+  timeScale = _timeScale;
+  pressureScale = _pressureScale;
+  densityScale = _densityScale;
+  dtStableImplicit = _dtStableImplicit;
+  numPropertyValues = const_cast<int*>(_numPropertyValues);
+  numStateVarValues = const_cast<int*>(_numStateVarValues);
+  dbPropertyValues = const_cast<char**>(_dbPropertyValues);
+  dbStateVarValues = const_cast<char**>(_dbStateVarValues);
+  dbProperties = const_cast<double*>(_dbProperties);
+  dbStateVars = const_cast<double*>(_dbStateVars);
+  properties = const_cast<double*>(_properties);
+  stateVars = const_cast<double*>(_stateVars);
+  propertiesNondim = const_cast<double*>(_propertiesNondim);
+  stateVarsNondim = const_cast<double*>(_stateVarsNondim);
+  density = const_cast<double*>(_density);
+  strain = const_cast<double*>(_strain);
+  stress = const_cast<double*>(_stress);
+  elasticConsts = const_cast<double*>(_elasticConsts);
+  initialStress = const_cast<double*>(_initialStress);
+  initialStrain = const_cast<double*>(_initialStrain);
+  stateVarsUpdated = const_cast<double*>(_stateVarsUpdated);
+} // constructor
+
+pylith::materials::ElasticIsotropic3DData::~ElasticIsotropic3DData(void)
+{}
+
+
+// End of file

Added: short/3D/PyLith/trunk/unittests/libtests/friction/data/StaticFrictionData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/data/StaticFrictionData.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/data/StaticFrictionData.hh	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,104 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+// DO NOT EDIT THIS FILE
+// This file was generated from python application elasticisotropic3d.
+
+#if !defined(pylith_materials_elasticisotropic3ddata_hh)
+#define pylith_materials_elasticisotropic3ddata_hh
+
+#include "ElasticMaterialData.hh"
+
+namespace pylith {
+  namespace materials {
+     class ElasticIsotropic3DData;
+  } // pylith
+} // materials
+
+class pylith::materials::ElasticIsotropic3DData : public ElasticMaterialData
+{
+
+public: 
+
+  /// Constructor
+  ElasticIsotropic3DData(void);
+
+  /// Destructor
+  ~ElasticIsotropic3DData(void);
+
+private:
+
+  static const int _dimension;
+
+  static const int _numLocs;
+
+  static const int _numProperties;
+
+  static const int _numStateVars;
+
+  static const int _numDBProperties;
+
+  static const int _numDBStateVars;
+
+  static const int _numPropsQuadPt;
+
+  static const int _numVarsQuadPt;
+
+  static const double _lengthScale;
+
+  static const double _timeScale;
+
+  static const double _pressureScale;
+
+  static const double _densityScale;
+
+  static const double _dtStableImplicit;
+
+  static const int _numPropertyValues[];
+
+  static const int* _numStateVarValues;
+
+  static const char* _dbPropertyValues[];
+
+  static const char** _dbStateVarValues;
+
+  static const double _dbProperties[];
+
+  static const double* _dbStateVars;
+
+  static const double _properties[];
+
+  static const double* _stateVars;
+
+  static const double _propertiesNondim[];
+
+  static const double* _stateVarsNondim;
+
+  static const double _density[];
+
+  static const double _strain[];
+
+  static const double _stress[];
+
+  static const double _elasticConsts[];
+
+  static const double _initialStress[];
+
+  static const double _initialStrain[];
+
+  static const double* _stateVarsUpdated;
+
+};
+
+#endif // pylith_materials_elasticisotropic3ddata_hh
+
+// End of file

Added: short/3D/PyLith/trunk/unittests/libtests/friction/test_friction.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/test_friction.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/test_friction.cc	2010-01-22 05:54:49 UTC (rev 16163)
@@ -0,0 +1,74 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include "petsc.h"
+#include <Python.h>
+
+#include <cppunit/extensions/TestFactoryRegistry.h>
+
+#include <cppunit/BriefTestProgressListener.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <cppunit/TestResult.h>
+#include <cppunit/TestResultCollector.h>
+#include <cppunit/TestRunner.h>
+#include <cppunit/TextOutputter.h>
+
+#include <stdlib.h> // USES abort()
+
+int
+main(int argc,
+     char* argv[])
+{ // main
+  CppUnit::TestResultCollector result;
+
+  try {
+    // Initialize PETSc
+    PetscErrorCode err = PetscInitialize(&argc, &argv,
+					 PETSC_NULL, PETSC_NULL);
+    CHKERRQ(err);
+
+    // Initialize Python (to eliminate need to initialize when
+    // parsing units in spatial databases).
+    Py_Initialize();
+
+    // Create event manager and test controller
+    CppUnit::TestResult controller;
+
+    // Add listener to collect test results
+    controller.addListener(&result);
+
+    // Add listener to show progress as tests run
+    CppUnit::BriefTestProgressListener progress;
+    controller.addListener(&progress);
+
+    // Add top suite to test runner
+    CppUnit::TestRunner runner;
+    runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
+    runner.run(controller);
+
+    // Print tests
+    CppUnit::TextOutputter outputter(&result, std::cerr);
+    outputter.write();
+
+    // Finalize Python
+    Py_Finalize();
+
+    // Finalize PETSc
+    err = PetscFinalize(); CHKERRQ(err);
+  } catch (...) {
+    abort();
+  } // catch
+
+  return (result.wasSuccessful() ? 0 : 1);
+} // main
+
+// End of file



More information about the CIG-COMMITS mailing list