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

brad at geodynamics.org brad at geodynamics.org
Mon Jan 25 11:56:34 PST 2010


Author: brad
Date: 2010-01-25 11:56:34 -0800 (Mon, 25 Jan 2010)
New Revision: 16172

Added:
   short/3D/PyLith/trunk/unittests/libtests/friction/data/friction_static.spatialdb
   short/3D/PyLith/trunk/unittests/libtests/friction/data/tri3.mesh
Modified:
   short/3D/PyLith/trunk/libsrc/friction/FrictionModel.cc
   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/data/Makefile.am
Log:
Implemented unit test for FrictionModel::initialize().

Modified: short/3D/PyLith/trunk/libsrc/friction/FrictionModel.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/friction/FrictionModel.cc	2010-01-25 19:43:28 UTC (rev 16171)
+++ short/3D/PyLith/trunk/libsrc/friction/FrictionModel.cc	2010-01-25 19:56:34 UTC (rev 16172)
@@ -114,6 +114,7 @@
   const int spaceDim = quadrature->spaceDim();
   const double_array& quadWts = quadrature->quadWts();
   assert(quadWts.size() == numQuadPts);
+  double_array quadPtsGlobal(numQuadPts*spaceDim);
 
   // Get cells associated with friction interface
   const ALE::Obj<SieveSubMesh>& faultSieveMesh = faultMesh.sieveMesh();
@@ -123,6 +124,13 @@
   assert(!cells.isNull());
   const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
   const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
+  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+    faultSieveMesh->depthStratum(0);
+  assert(!vertices.isNull());
+  const SieveSubMesh::label_sequence::iterator verticesBegin =
+    vertices->begin();
+  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
   const spatialdata::geocoords::CoordSys* cs = faultMesh.coordsys();
   assert(0 != cs);
 
@@ -134,11 +142,15 @@
         coordinatesCell.size(), &coordinatesCell[0]);
 #endif
 
+  assert(0 != _normalizer);
+  const double lengthScale = _normalizer->lengthScale();
+
+  // Query database for properties
+
   // Create arrays for querying.
   const int numDBProperties = _metadata.numDBProperties();
-  double_array quadPtsGlobal(numQuadPts*spaceDim);
   double_array propertiesDBQuery(numDBProperties);
-  double_array propertiesQuadPt(numQuadPts*_numPropsVertex);
+  double_array propertiesQuadPt(_numPropsVertex);
 
   // Create field to hold physical properties.
   delete _properties; _properties = 
@@ -146,7 +158,7 @@
   _properties->label("properties");
   assert(0 != _properties);
   int fiberDim = _numPropsVertex;
-  _properties->newSection(cells, fiberDim);
+  _properties->newSection(vertices, fiberDim);
   _properties->allocate();
   _properties->zero();
   const ALE::Obj<RealSection>& propertiesSection = _properties->section();
@@ -161,43 +173,6 @@
   _dbProperties->queryVals(_metadata.dbProperties(),
 			   _metadata.numDBProperties());
 
-  // Create arrays for querying
-  const int numDBStateVars = _metadata.numDBStateVars();
-  double_array stateVarsDBQuery;
-  double_array stateVarsQuadPt;
-  if (0 != _dbInitialState) {
-    assert(numDBStateVars > 0);
-    assert(_numVarsVertex > 0);
-    stateVarsDBQuery.resize(numDBStateVars);
-    stateVarsQuadPt.resize(numQuadPts*_numVarsVertex);
-    // Setup database for querying for initial state variables
-    _dbInitialState->open();
-    _dbInitialState->queryVals(_metadata.dbStateVars(),
-             _metadata.numDBStateVars());
-  } // if
-
-  // Create field to hold state variables. We create the field even
-  // if there is no initial state, because this we will use this field
-  // to hold the state variables.
-  delete _stateVars; _stateVars = new topology::Field<topology::SubMesh>(faultMesh);
-  _stateVars->label("state variables");
-  fiberDim = _numVarsVertex;
-  if (fiberDim > 0) {
-    assert(0 != _stateVars);
-    assert(0 != _properties);
-    _stateVars->newSection(*_properties, fiberDim);
-    _stateVars->allocate();
-    _stateVars->zero();
-  } // if
-  const ALE::Obj<RealSection>& stateVarsSection = 
-    (fiberDim > 0) ? _stateVars->section() : 0;
-  double_array stateVarsCell(numBasis*numDBStateVars); // size may be zero, is this ok?
-  topology::Mesh::UpdateAddVisitor stateVarsVisitor(*stateVarsSection,
-        &stateVarsCell[0]);
-
-  assert(0 != _normalizer);
-  const double lengthScale = _normalizer->lengthScale();
-    
   for (SieveSubMesh::label_sequence::iterator c_iter=cellsBegin;
        c_iter != cellsEnd;
        ++c_iter) {
@@ -213,7 +188,7 @@
     const double_array& quadPtsNonDim = quadrature->quadPts();
     quadPtsGlobal = quadPtsNonDim;
     _normalizer->dimensionalize(&quadPtsGlobal[0], quadPtsGlobal.size(),
-				lengthScale);
+        lengthScale);
 
     // Loop over quadrature points in cell and query database
     for (int iQuadPt=0, index=0;
@@ -230,8 +205,7 @@
             << "using spatial database '" << _dbProperties->label() << "'.";
         throw std::runtime_error(msg.str());
       } // if
-      _dbToProperties(&propertiesQuadPt[iQuadPt*_numPropsVertex],
-          propertiesDBQuery);
+      _dbToProperties(&propertiesQuadPt[0], propertiesDBQuery);
 
       // Get cell geometry information that depends on cell
       const double_array& basis = quadrature->basis();
@@ -242,15 +216,92 @@
       for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
         const double dArea = wt * basis[iQuadPt*numBasis+iBasis];
         for (int iProp = 0; iProp < numDBProperties; ++iProp)
+        {
           propertiesCell[iBasis*numDBProperties+iProp]
               = propertiesQuadPt[iProp] * dArea;
+          std::cout << "propertiesCell[" << iBasis*numDBProperties+iProp << "]: "
+              << propertiesCell[iBasis*numDBProperties+iProp]
+                                << ", propertiesQuadPt[" << iProp << "]: " << propertiesQuadPt[iProp]
+                                                                                               << std::endl;
+        }
       } // for
       propertiesVisitor.clear();
       faultSieveMesh->updateClosure(*c_iter, propertiesVisitor);
+    } // for
+  } // for
+  // Close properties database
+  _dbProperties->close();
 
-      if (0 != _dbInitialState) {
-        err = _dbInitialState->query(&stateVarsDBQuery[0], numDBStateVars,
-            &quadPtsGlobal[index], spaceDim, cs);
+  // Loop over vertices and divide by area to get weighted values and
+  // nondimensionalize properties.
+  double_array propertiesVertex(_numPropsVertex);
+  for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
+       v_iter != verticesEnd;
+       ++v_iter) {
+    propertiesSection->restrictPoint(*v_iter,
+        &propertiesVertex[0], propertiesVertex.size());
+    _nondimProperties(&propertiesVertex[0], _numPropsVertex);
+    propertiesSection->updatePoint(*v_iter, &propertiesVertex[0]);
+  } // for
+
+
+  // Create field to hold state variables. We create the field even
+  // if there is no initial state, because this we will use this field
+  // to hold the state variables.
+  delete _stateVars; _stateVars = new topology::Field<topology::SubMesh>(faultMesh);
+  _stateVars->label("state variables");
+  fiberDim = _numVarsVertex;
+  if (fiberDim > 0) {
+    assert(0 != _stateVars);
+    assert(0 != _properties);
+    _stateVars->newSection(*_properties, fiberDim);
+    _stateVars->allocate();
+    _stateVars->zero();
+  } // if
+
+  // Query database for initial state variables
+  if (0 != _dbInitialState) {
+    assert(_numVarsVertex > 0);
+
+    // Create arrays for querying
+    const int numDBStateVars = _metadata.numDBStateVars();
+    double_array stateVarsDBQuery(numDBStateVars);
+    double_array stateVarsQuadPt(_numVarsVertex);
+
+    // Setup database for querying for initial state variables
+    _dbInitialState->open();
+    _dbInitialState->queryVals(_metadata.dbStateVars(),
+             _metadata.numDBStateVars());
+
+    const ALE::Obj<RealSection>& stateVarsSection =_stateVars->section();
+    assert(!stateVarsSection.isNull());
+    double_array stateVarsCell(numBasis*numDBStateVars);
+    topology::Mesh::UpdateAddVisitor stateVarsVisitor(*stateVarsSection,
+                                                      &stateVarsCell[0]);
+
+    for (SieveSubMesh::label_sequence::iterator c_iter=cellsBegin;
+        c_iter != cellsEnd;
+        ++c_iter) {
+      // Compute geometry information for current cell
+#if defined(PRECOMPUTE_GEOMETRY)
+      quadrature->retrieveGeometry(*c_iter);
+#else
+      coordsVisitor.clear();
+      faultSieveMesh->restrictClosure(*c_iter, coordsVisitor);
+      quadrature->computeGeometry(coordinatesCell, *c_iter);
+#endif
+
+      const double_array& quadPtsNonDim = quadrature->quadPts();
+      quadPtsGlobal = quadPtsNonDim;
+      _normalizer->dimensionalize(&quadPtsGlobal[0], quadPtsGlobal.size(),
+          lengthScale);
+
+      // Loop over quadrature points in cell and query database
+      for (int iQuadPt=0, index=0;
+          iQuadPt < numQuadPts;
+          ++iQuadPt, index+=spaceDim) {
+        int err = _dbInitialState->query(&stateVarsDBQuery[0], numDBStateVars,
+          &quadPtsGlobal[index], spaceDim, cs);
         if (err) {
           std::ostringstream msg;
           msg << "Could not find initial state variables at \n" << "(";
@@ -260,10 +311,14 @@
               << "using spatial database '" << _dbInitialState->label() << "'.";
           throw std::runtime_error(msg.str());
         } // if
-        _dbToStateVars(&stateVarsQuadPt[iQuadPt*_numVarsVertex],
-            stateVarsDBQuery);
+        _dbToStateVars(&stateVarsQuadPt[0], stateVarsDBQuery);
 
+        // Get cell geometry information that depends on cell
+        const double_array& basis = quadrature->basis();
+        const double_array& jacobianDet = quadrature->jacobianDet();
+
         // Compute state variables weighted by area
+        const double wt = quadWts[iQuadPt] * jacobianDet[iQuadPt];
         for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
           const double dArea = wt * basis[iQuadPt*numBasis+iBasis];
           for (int iVar = 0; iVar < numDBStateVars; ++iVar)
@@ -271,43 +326,30 @@
                 = stateVarsDBQuery[iVar] * dArea;
         } // for
         stateVarsVisitor.clear();
-        faultSieveMesh->updateClosure(*c_iter, stateVarsVisitor);
-      } // if
+      faultSieveMesh->updateClosure(*c_iter, stateVarsVisitor);
+      } // for
     } // for
-  } // for
-
-  // Close databases
-  _dbProperties->close();
-  if (0 != _dbInitialState)
+    // Close database
     _dbInitialState->close();
 
-  // Loop over vertices and divide by area to get weighted values and
-  // nondimensionalize properties and state variables
-  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-    faultSieveMesh->depthStratum(0);
-  assert(!vertices.isNull());
-  const SieveSubMesh::label_sequence::iterator verticesBegin =
-    vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+    // Loop over vertices and divide by area to get weighted values and
+    // nondimensionalize properties.
+    double_array stateVarsVertex(_numVarsVertex);
 
-  double_array propertiesVertex(_numPropsVertex);
-  double_array stateVarsVertex(_numVarsVertex);
-  for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
-       v_iter != verticesEnd;
-       ++v_iter) {
-    propertiesSection->restrictPoint(*v_iter,
-        &propertiesVertex[0], propertiesVertex.size());
-    _nondimProperties(&propertiesVertex[0], _numPropsVertex);
-    propertiesSection->updatePoint(*v_iter, &propertiesVertex[0]);
-
-    if (0 != _dbInitialState) {
+    for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
+         v_iter != verticesEnd;
+         ++v_iter) {
       stateVarsSection->restrictPoint(*v_iter,
           &stateVarsVertex[0], stateVarsVertex.size());
       _nondimStateVars(&stateVarsVertex[0], _numVarsVertex);
       stateVarsSection->updatePoint(*v_iter, &stateVarsVertex[0]);
-    } // if
-  } // for
+    } // for
+  } // if
 
+  // Setup buffers for restrict/update of properties and state variables.
+  _propertiesVertex.resize(_numPropsVertex);
+  _stateVarsVertex.resize(_numVarsVertex);
+
   logger.stagePop();
 } // initialize
 

Modified: short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc	2010-01-25 19:43:28 UTC (rev 16171)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc	2010-01-25 19:56:34 UTC (rev 16172)
@@ -20,8 +20,9 @@
 #include "pylith/topology/Field.hh" // USES Field
 #include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
 #include "pylith/friction/StaticFriction.hh" // USES StaticFriction
+#include "pylith/faults/FaultCohesiveDynL.hh" // USES FaultCohesiveDynL
 #include "pylith/feassemble/Quadrature.hh" // USES Quadrature
-#include "pylith/feassemble/GeometryTri2D.hh" // USES GeometryTri2D
+#include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
 
 #include "pylith/utils/array.hh" // USES double_array
 
@@ -38,6 +39,7 @@
 CPPUNIT_TEST_SUITE_REGISTRATION( pylith::friction::TestFrictionModel );
 
 // ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
 typedef pylith::topology::Mesh::SieveSubMesh SieveSubMesh;
 typedef pylith::topology::Mesh::RealSection RealSection;
 
@@ -114,15 +116,69 @@
 } // testNormalizer
 
 // ----------------------------------------------------------------------
-// Test initialize()
+// Test initialize().
 void
 pylith::friction::TestFrictionModel::testInitialize(void)
 { // testInitialize
+  const double propertiesE[] = { 0.55, 0.45 };
+  const int numProperties = 1;
+
   topology::Mesh mesh;
+  faults::FaultCohesiveDynL fault;
   StaticFriction friction;
   StaticFrictionData data;
-  _initialize(&mesh, &friction, &data);
+  _initialize(&mesh, &fault, &friction, &data);
 
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault.faultMesh().sieveMesh();
+  assert(!faultSieveMesh.isNull());
+  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+    faultSieveMesh->depthStratum(0);
+  assert(!vertices.isNull());
+  const SieveSubMesh::label_sequence::iterator verticesBegin =
+    vertices->begin();
+  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+  const double tolerance = 1.0e-06;
+
+  // Test propertiesVertex with mesh
+  int index = 0;
+  double_array propertiesVertex(numProperties);
+  CPPUNIT_ASSERT(0 != friction._properties);
+  friction._properties->view("PROPERTIES");
+  const ALE::Obj<RealSection>& propertiesSection = friction._properties->section();
+  CPPUNIT_ASSERT(!propertiesSection.isNull());
+  for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
+       v_iter != verticesEnd;
+       ++v_iter) {
+    CPPUNIT_ASSERT(numProperties == propertiesSection->getFiberDimension(*v_iter));
+    propertiesSection->restrictPoint(*v_iter, &propertiesVertex[0], propertiesVertex.size());
+    for (int i=0; i < numProperties; ++i, ++index)
+      if (0 != propertiesE[index])
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, propertiesVertex[i]/propertiesE[index], tolerance);
+      else
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(propertiesE[index], propertiesVertex[i], tolerance);
+  } // for
+
+  // Test vertex array sizes.
+  size_t size = data.numPropsVertex;
+  CPPUNIT_ASSERT_EQUAL(size, friction._propertiesVertex.size());
+
+  size = data.numVarsVertex;
+  CPPUNIT_ASSERT_EQUAL(size, friction._stateVarsVertex.size());
+
+} // testInitialize
+
+// ----------------------------------------------------------------------
+// Test getField().
+void
+pylith::friction::TestFrictionModel::testGetField(void)
+{ // testGetField
+  topology::Mesh mesh;
+  faults::FaultCohesiveDynL fault;
+  StaticFriction friction;
+  StaticFrictionData data;
+  _initialize(&mesh, &fault, &friction, &data);
+
 #if 1
   CPPUNIT_ASSERT(false);
 #else
@@ -139,7 +195,7 @@
   size = data.numLocs;
   CPPUNIT_ASSERT_EQUAL(size, material._frictionVertex.size());
 #endif
-} // testInitialize
+} // testGetField
 
 // ----------------------------------------------------------------------
 // Test retrievePropsAndVars().
@@ -147,9 +203,10 @@
 pylith::friction::TestFrictionModel::testRetrievePropsAndVars(void)
 { // testRetrievePropsAndVars
   topology::Mesh mesh;
+  faults::FaultCohesiveDynL fault;
   StaticFriction friction;
   StaticFrictionData data;
-  _initialize(&mesh, &friction, &data);
+  _initialize(&mesh, &fault, &friction, &data);
 
 #if 1
   CPPUNIT_ASSERT(false);
@@ -189,9 +246,10 @@
 pylith::friction::TestFrictionModel::testCalcFriction(void)
 { // testCalcFriction
   topology::Mesh mesh;
+  faults::FaultCohesiveDynL fault;
   StaticFriction friction;
   StaticFrictionData data;
-  _initialize(&mesh, &friction, &data);
+  _initialize(&mesh, &fault, &friction, &data);
 
 #if 1
   CPPUNIT_ASSERT(false);
@@ -548,16 +606,17 @@
 void
 pylith::friction::TestFrictionModel::_initialize(
 					  topology::Mesh* mesh,
+            faults::FaultCohesiveDynL* fault,
 					  StaticFriction* friction,
 					  const StaticFrictionData* data)
 { // _initialize
   CPPUNIT_ASSERT(0 != mesh);
+  CPPUNIT_ASSERT(0 != fault);
   CPPUNIT_ASSERT(0 != friction);
   CPPUNIT_ASSERT(0 != data);
 
-#if 0
   meshio::MeshIOAscii iohandler;
-  iohandler.filename("data/line3.mesh");
+  iohandler.filename("data/tri3.mesh");
   iohandler.read(mesh);
 
   // Set up coordinates
@@ -569,23 +628,16 @@
   mesh->nondimensionalize(normalizer);
 
   // Setup quadrature
-  feassemble::Quadrature<topology::Mesh> quadrature;
-  feassemble::GeometryLine1D geometry;
+  feassemble::Quadrature<topology::SubMesh> quadrature;
+  feassemble::GeometryLine2D geometry;
   quadrature.refGeometry(&geometry);
   const int cellDim = 1;
-  const int numCorners = 3;
+  const int numCorners = 2;
   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 int spaceDim = 2;
+  const double basis[] = { 0.75, 0.25, 0.25, 0.75 };
+  const double basisDeriv[] = { -0.5, 0.5, -0.5, 0.5 };
+  const double quadPtsRef[] = { -0.5, 0.5 };
   const double quadWts[] = { 1.0, 1.0  };
   quadrature.initialize(basis, numQuadPts, numCorners,
 			basisDeriv, numQuadPts, numCorners, cellDim,
@@ -593,47 +645,47 @@
 			quadWts, numQuadPts,
 			spaceDim);
 
+  const bool flipFault = false;
+  const char* label = "fault";
+  int firstFaultVertex = 0;
+  int firstLagrangeVertex = mesh->sieveMesh()->getIntSection(label)->size();
+  int firstFaultCell = mesh->sieveMesh()->getIntSection(label)->size();
+  if (fault->useLagrangeConstraints())
+    firstFaultCell += mesh->sieveMesh()->getIntSection(label)->size();
+  fault->id(100);
+  fault->label(label);
+  fault->quadrature(&quadrature);
+  fault->adjustTopology(mesh, &firstFaultVertex, &firstLagrangeVertex,
+      &firstFaultCell, flipFault);
 
-  // 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);
+  const double upDir[] = { 0.0, 0.0, 1.0 };
+  const double normalDir[] = { 1.0, 0.0, 0.0 };
+  fault->initialize(*mesh, upDir, normalDir);
 
+  // Get cells associated with fault
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault->faultMesh().sieveMesh();
+  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+  const ALE::Obj<SieveSubMesh::label_sequence>& cells =
+    faultSieveMesh->heightStratum(0);
+  CPPUNIT_ASSERT(!cells.isNull());
+
   // Compute geometry for cells
   quadrature.initializeGeometry();
 #if defined(PRECOMPUTE_GEOMETRY)
-  quadrature.computeGeometry(*mesh, cells);
+  quadrature.computeGeometry(fault->faultMesh(), cells);
 #endif
 
   spatialdata::spatialdb::SimpleDB db;
   spatialdata::spatialdb::SimpleIOAscii dbIO;
-  dbIO.filename("data/matinitialize.spatialdb");
+  dbIO.filename("data/friction_static.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);
+  friction->dbProperties(&db);
+  friction->label("my_friction");
+  friction->normalizer(normalizer);
   
-  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_friction");
-  material->normalizer(normalizer);
-  material->dbInitialStress(&dbStress);
-  material->dbInitialStrain(&dbStrain);
-  
-  material->initialize(*mesh, &quadrature);
-#endif
+  friction->initialize(fault->faultMesh(), &quadrature);
 } // _initialize
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh	2010-01-25 19:43:28 UTC (rev 16171)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh	2010-01-25 19:56:34 UTC (rev 16172)
@@ -25,6 +25,7 @@
 
 #include "pylith/friction/frictionfwd.hh" // forward declarations
 #include "pylith/topology/topologyfwd.hh" // forward declarations
+#include "pylith/faults/faultsfwd.hh" // forward declarations
 
 /// Namespace for pylith package
 namespace pylith {
@@ -48,6 +49,7 @@
   CPPUNIT_TEST( testDBStateVars );
   CPPUNIT_TEST( testNormalizer );
   CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testGetField );
   CPPUNIT_TEST( testRetrievePropsAndVars );
   CPPUNIT_TEST( testCalcFriction );
   CPPUNIT_TEST( testUpdateStateVars );
@@ -72,9 +74,12 @@
   /// Test normalizer().
   void testNormalizer(void);
 
-  /// Test initialize()
+  /// Test initialize().
   void testInitialize(void);
 
+  /// Test getField().
+  void testGetField(void);
+
   /// Test retrievePropsAndVars().
   void testRetrievePropsAndVars(void);
 
@@ -139,15 +144,17 @@
   /** Setup mesh and material.
    *
    * @param mesh Finite-element mesh.
+   * @param fault Fault with friction.
    * @param friction Friction model.
    * @param data Data with properties for friction model.
    */
   void _initialize(topology::Mesh* mesh,
-		   StaticFriction* friction,
-		   const StaticFrictionData* data);
+                   faults::FaultCohesiveDynL* fault,
+                   StaticFriction* friction,
+                   const StaticFrictionData* data);
 
 }; // class TestFrictionModel
 
 #endif // pylith_friction_testfrictionmodel_hh
 
-// End of file 
+// End of file

Modified: short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am	2010-01-25 19:43:28 UTC (rev 16171)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/data/Makefile.am	2010-01-25 19:56:34 UTC (rev 16172)
@@ -10,7 +10,9 @@
 # ----------------------------------------------------------------------
 #
 
-dist_noinst_DATA =
+dist_noinst_DATA = \
+	tri3.mesh \
+	friction_static.spatialdb
 
 noinst_TMP =
 

Added: short/3D/PyLith/trunk/unittests/libtests/friction/data/friction_static.spatialdb
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/data/friction_static.spatialdb	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/data/friction_static.spatialdb	2010-01-25 19:56:34 UTC (rev 16172)
@@ -0,0 +1,15 @@
+#SPATIAL.ascii 1
+SimpleDB {
+  num-values = 1
+  value-names =  friction-coefficient
+  value-units =  none
+  num-locs = 2
+  data-dim = 1
+  space-dim = 2
+  cs-data = cartesian {
+    to-meters = 1.0
+    space-dim = 2
+  }
+}
+0.0   1.0   0.6
+0.0  -1.0   0.4

Added: short/3D/PyLith/trunk/unittests/libtests/friction/data/tri3.mesh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/data/tri3.mesh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/data/tri3.mesh	2010-01-25 19:56:34 UTC (rev 16172)
@@ -0,0 +1,45 @@
+mesh = {
+  dimension = 2
+  use-index-zero = true
+  vertices = {
+    dimension = 2
+    count = 4
+    coordinates = {
+             0     -1.0  0.0
+             1      0.0  1.0
+             2      0.0 -1.0
+             3      1.0  0.0
+    }
+  }
+  cells = {
+    count = 2
+    num-corners = 3
+    simplices = {
+             0       0  2  1
+             1       1  2  3
+    }
+    material-ids = {
+             0   0
+             1   0
+    }
+  }
+  group = {
+    name = fault
+    type = vertices
+    count = 2
+    indices = {
+      1
+      2
+    }
+  }
+  group = {
+    name = output
+    type = vertices
+    count = 3
+    indices = {
+      1
+      2
+      3
+    }
+  }
+}



More information about the CIG-COMMITS mailing list