[cig-commits] r16280 - in short/3D/PyLith/trunk: . examples/twocells/twoquad4 libsrc libsrc/faults modulesrc/faults playpen/friction/twohex8 playpen/friction/twoquad4 playpen/friction/twotet4 playpen/friction/twotri3 pylith pylith/faults unittests/libtests/faults unittests/libtests/faults/data unittests/libtests/friction unittests/libtests/meshio unittests/pytests/faults

brad at geodynamics.org brad at geodynamics.org
Fri Feb 19 12:08:48 PST 2010


Author: brad
Date: 2010-02-19 12:08:42 -0800 (Fri, 19 Feb 2010)
New Revision: 16280

Added:
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.hh
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.cc
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.hh
   short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDyn.i
   short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveLagrange.i
   short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDyn.py
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.hh
   short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py
Removed:
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.cc
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.hh
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.icc
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.icc
   short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDynL.i
   short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDynL.py
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.hh
   short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDynL.py
Modified:
   short/3D/PyLith/trunk/TODO
   short/3D/PyLith/trunk/examples/twocells/twoquad4/dislocation.cfg
   short/3D/PyLith/trunk/libsrc/Makefile.am
   short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc
   short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.hh
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.icc
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveTract.cc
   short/3D/PyLith/trunk/libsrc/faults/Makefile.am
   short/3D/PyLith/trunk/libsrc/faults/faultsfwd.hh
   short/3D/PyLith/trunk/modulesrc/faults/FaultCohesive.i
   short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveKin.i
   short/3D/PyLith/trunk/modulesrc/faults/Makefile.am
   short/3D/PyLith/trunk/modulesrc/faults/faults.i
   short/3D/PyLith/trunk/playpen/friction/twohex8/compression.cfg
   short/3D/PyLith/trunk/playpen/friction/twohex8/opening.cfg
   short/3D/PyLith/trunk/playpen/friction/twohex8/shear-sliding.cfg
   short/3D/PyLith/trunk/playpen/friction/twohex8/shear-stick.cfg
   short/3D/PyLith/trunk/playpen/friction/twoquad4/compression.cfg
   short/3D/PyLith/trunk/playpen/friction/twoquad4/opening.cfg
   short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-sliding.cfg
   short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-stick.cfg
   short/3D/PyLith/trunk/playpen/friction/twotet4/compression.cfg
   short/3D/PyLith/trunk/playpen/friction/twotet4/opening.cfg
   short/3D/PyLith/trunk/playpen/friction/twotet4/shear-sliding.cfg
   short/3D/PyLith/trunk/playpen/friction/twotet4/shear-stick.cfg
   short/3D/PyLith/trunk/playpen/friction/twotri3/compression.cfg
   short/3D/PyLith/trunk/playpen/friction/twotri3/opening.cfg
   short/3D/PyLith/trunk/playpen/friction/twotri3/shear-sliding.cfg
   short/3D/PyLith/trunk/playpen/friction/twotri3/shear-stick.cfg
   short/3D/PyLith/trunk/pylith/Makefile.am
   short/3D/PyLith/trunk/pylith/faults/__init__.py
   short/3D/PyLith/trunk/unittests/libtests/faults/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/meshio/TestDataWriterVTKFaultMesh.cc
   short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py
Log:
Refactorization of cohesive fault objects. Added FaultCohesiveLagrange. Renamed FaultCohesiveDynL to FaultCohesiveDyn.

Modified: short/3D/PyLith/trunk/TODO
===================================================================
--- short/3D/PyLith/trunk/TODO	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/TODO	2010-02-19 20:08:42 UTC (rev 16280)
@@ -5,11 +5,6 @@
 * Better preconditioning
   Better PETSc settings or Laplacian based preconditioner
 
-* Data structure to hold label of fault Lagrange vertices and
-  conventional vertices [DONE, need to clean up FaultCohesive, etc]
-
-  Refactor in FaultCohesive
-
 * Drucker-Prager elastoplastic
 
 * Friction
@@ -43,15 +38,12 @@
 Initial tractions
   Integrate over fault surface (should be current implementation)
 
-FaultCohesiveDyn -> FaultCohesiveTract
 FaultCohesiveDynL -> FaultCohesiveDyn
 Refactor FaultCohesive
-  integrateResidualAssembled()
-    updateSlip() [implemented for FaultCohesiveKin, not for FaultCohesiveDyn]
 
 6. Other fault constitutive models [Surendra]
   Rate- and state-friction with aging law
-  Rate- and state-friction with slip law
+  Rate- and state-friction with slip law (only if desired)
 
 
 ----------------------------------------------------------------------
@@ -75,14 +67,17 @@
     integrateResidualLumped()
 
 
-  FaultCohesiveDynL
-    integrateJacobian (lumped)
+  FaultCohesiveDyn
     adjustSolnLumped
 
 ----------------------------------------------------------------------
 TODO WELL BEFORE WORKSHOP 2010
 ----------------------------------------------------------------------
 
+Examples
+  Cleanup PETSc setttings
+    ksp_view, monitor, converged reason
+
 Tutorial
   3d/hex8
     1. Dirichlet BC (static)

Modified: short/3D/PyLith/trunk/examples/twocells/twoquad4/dislocation.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/twocells/twoquad4/dislocation.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/examples/twocells/twoquad4/dislocation.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -121,3 +121,24 @@
 [pylithapp.timedependent.materials.material.output]
 cell_filter = pylith.meshio.CellFilterAvgMesh
 writer.filename = dislocation-statevars.vtk
+
+# ----------------------------------------------------------------------
+# PETSc
+# ----------------------------------------------------------------------
+# Set the solver options.
+
+[pylithapp.petsc]
+ksp_rtol = 1.0e-8
+pc_type = asm
+# Change the preconditioner settings (must turn off
+# shift_positive_definite and turn on shift_nonzero).
+sub_pc_factor_shift_positive_definite = 0
+sub_pc_factor_shift_nonzero = 
+
+ksp_max_it = 100
+ksp_gmres_restart = 50
+
+ksp_monitor = true
+ksp_view = true
+ksp_converged_reason = true
+

Modified: short/3D/PyLith/trunk/libsrc/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/libsrc/Makefile.am	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/Makefile.am	2010-02-19 20:08:42 UTC (rev 16280)
@@ -45,9 +45,10 @@
 	faults/TopologyOps.cc \
 	faults/CohesiveTopology.cc \
 	faults/FaultCohesive.cc \
+	faults/FaultCohesiveLagrange.cc \
+	faults/FaultCohesiveKin.cc \
+	faults/FaultCohesiveDyn.cc \
 	faults/FaultCohesiveTract.cc \
-	faults/FaultCohesiveDynL.cc \
-	faults/FaultCohesiveKin.cc \
 	feassemble/CellGeometry.cc \
 	feassemble/Constraint.cc \
 	feassemble/GeometryPoint1D.cc \

Modified: short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -672,13 +672,11 @@
 void
 pylith::faults::CohesiveTopology::createFaultParallel(
 			    topology::SubMesh* faultMesh,
-			    std::map<point_type, point_type>* cohesiveToFault,
 			    const topology::Mesh& mesh,
 			    const int materialId,
 			    const bool constraintCell)
 { // createFaultParallel
   assert(0 != faultMesh);
-  assert(0 != cohesiveToFault);
 
   // Memory logging
   ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
@@ -703,7 +701,6 @@
   ALE::Obj<ALE::Mesh::sieve_type> faultSieve =
     new ALE::Mesh::sieve_type(sieve->comm(), sieve->debug());
   assert(!faultSieve.isNull());
-  cohesiveToFault->clear();
 
   const ALE::Obj<SieveMesh::label_sequence>& cohesiveCells =
     sieveMesh->getLabelStratum("material-id", materialId);
@@ -747,7 +744,6 @@
       for (int i = 2*faceSize; i < 3*faceSize; ++i)
         faultSieve->addArrow(cone[i], face, color++);
     } // if/else
-    (*cohesiveToFault)[*c_iter] = face;
     ++face;
     cV.clear();
   } // for
@@ -787,11 +783,6 @@
   assert(!faultCells.isNull());
   SieveSubMesh::label_sequence::iterator f_iter = faultCells->begin();
 
-  for(SieveMesh::label_sequence::iterator c_iter = cBegin;
-      c_iter != cEnd;
-      ++c_iter, ++f_iter)
-    (*cohesiveToFault)[*c_iter] = *f_iter;
-    
   // Update coordinates
   const ALE::Obj<topology::Mesh::RealSection>& coordinates =
     sieveMesh->getRealSection("coordinates");

Modified: short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -80,8 +80,6 @@
   /** Create (distributed) fault mesh from cohesive cells.
    *
    * @param faultMesh Finite-element mesh of fault (output).
-   * @param cohesiveToFault Mapping of cohesive cell to fault mesh
-   *   cell (output).
    * @param mesh Finite-element mesh.
    * @param materialId Material id for cohesive elements.
    * @param constraintCell True if creating cells constrained with 
@@ -89,7 +87,6 @@
    */
   static
   void createFaultParallel(topology::SubMesh* faultMesh,
-			   std::map<point_type, point_type>* cohesiveToFault,
 			   const topology::Mesh& mesh,
 			   const int materialId,
 			   const bool constraintCell =false);

Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -22,7 +22,6 @@
 // Include directives ---------------------------------------------------
 #include "Fault.hh" // ISA Fault
 
-#include <map> // HASA std::map
 #include "pylith/topology/SubMesh.hh" // ISA Integrator<Quadrature<SubMesh> >
 #include "pylith/feassemble/Quadrature.hh" // ISA Integrator<Quadrature>
 #include "pylith/feassemble/Integrator.hh" // ISA Integrator
@@ -51,13 +50,20 @@
   /** Set flag for using fault mesh or group of vertices to define
    * fault surface.
    *
+   * This method is part of a KLUDGE to allow creation of cohesive
+   * cells in cases where domain cells have more than one face (edge
+   * for 2-D problems) on the fault.
+   *
    * @param flag True if using fault mesh, false if using vertices.
    */
   void useFaultMesh(const bool flag);
 
-  // TEMPORARY
   /** Set filename of UCD file for fault mesh.
    *
+   * This method is part of a KLUDGE to allow creation of cohesive
+   * cells in cases where domain cells have more than one face (edge
+   * for 2-D problems) on the fault.
+   *
    * @param filename Filename for UCD file.
    */
   void faultMeshFilename(const char* filename);
@@ -95,16 +101,19 @@
    */
   bool useLagrangeConstraints(void) const;
 
+  /** Get fields associated with fault.
+   *
+   * @returns Fields associated with fault.
+   */
+  const topology::Fields<topology::Field<topology::SubMesh> >*
+  fields(void) const;
+
   // PROTECTED MEMBERS //////////////////////////////////////////////////
 protected :
 
   /// Fields for fault information.
   topology::Fields<topology::Field<topology::SubMesh> >* _fields;
 
-  /// Map label of cohesive cell to label of cells in fault mesh.
-  std::map<topology::Mesh::SieveMesh::point_type, 
-	   topology::SubMesh::SieveMesh::point_type> _cohesiveToFault;
-
   bool _useLagrangeConstraints; ///< True if uses Lagrange multipliers.
 
   // PRIVATE MEMBERS ////////////////////////////////////////////////////

Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.icc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.icc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -21,5 +21,12 @@
   return _useLagrangeConstraints;
 } // useLagrangeConstraints
 
+// Get fields associated with fault.
+inline
+const pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> >*
+pylith::faults::FaultCohesive::fields(void) const {
+  return _fields;
+} // fields
 
+
 // End of file 

Copied: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc (from rev 16279, short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.cc)
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,1187 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "FaultCohesiveDyn.hh" // implementation of object methods
+
+#include "CohesiveTopology.hh" // USES CohesiveTopology
+
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
+#include "pylith/feassemble/CellGeometry.hh" // USES CellGeometry
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/topology/Field.hh" // USES Field
+#include "pylith/topology/Fields.hh" // USES Fields
+#include "pylith/topology/Jacobian.hh" // USES Jacobian
+#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+#include "pylith/friction/FrictionModel.hh" // USES FrictionModel
+
+#include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
+#include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
+#include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
+
+#include <cmath> // USES pow(), sqrt()
+#include <strings.h> // USES strcasecmp()
+#include <cstring> // USES strlen()
+#include <cstdlib> // USES atoi()
+#include <cassert> // USES assert()
+#include <sstream> // USES std::ostringstream
+#include <stdexcept> // USES std::runtime_error
+
+// Precomputing geometry significantly increases storage but gives a
+// slight speed improvement.
+//#define PRECOMPUTE_GEOMETRY
+
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
+
+// ----------------------------------------------------------------------
+// Default constructor.
+pylith::faults::FaultCohesiveDyn::FaultCohesiveDyn(void) :
+  _dbInitialTract(0),
+  _friction(0)
+{ // constructor
+  _needJacobianDiag = true;
+  _needVelocity = true;
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor.
+pylith::faults::FaultCohesiveDyn::~FaultCohesiveDyn(void)
+{ // destructor
+  deallocate();
+} // destructor
+
+// ----------------------------------------------------------------------
+// Deallocate PETSc and local data structures.
+void pylith::faults::FaultCohesiveDyn::deallocate(void)
+{ // deallocate
+  FaultCohesiveLagrange::deallocate();
+
+  _dbInitialTract = 0; // :TODO: Use shared pointer
+  _friction = 0; // :TODO: Use shared pointer
+} // deallocate
+
+// ----------------------------------------------------------------------
+// Sets the spatial database for the inital tractions
+void
+pylith::faults::FaultCohesiveDyn::dbInitialTract(spatialdata::spatialdb::SpatialDB* db)
+{ // dbInitial
+  _dbInitialTract = db;
+} // dbInitial
+
+// ----------------------------------------------------------------------
+// Get the friction (constitutive) model.  
+void
+pylith::faults::FaultCohesiveDyn::frictionModel(friction::FrictionModel* const model)
+{ // frictionModel
+  _friction = model;
+} // frictionModel
+
+// ----------------------------------------------------------------------
+// Initialize fault. Determine orientation and setup boundary
+void
+pylith::faults::FaultCohesiveDyn::initialize(const topology::Mesh& mesh,
+					      const double upDir[3],
+					      const double normalDir[3])
+{ // initialize
+  assert(0 != upDir);
+  assert(0 != normalDir);
+  assert(0 != _quadrature);
+  assert(0 != _normalizer);
+
+  FaultCohesiveLagrange::initialize(mesh, upDir, normalDir);
+
+  // Get initial tractions using a spatial database.
+  _getInitialTractions();
+
+  // Setup fault constitutive model.
+  assert(0 != _friction);
+  _friction->initialize(*_faultMesh, _quadrature, _fields->get("area"));
+
+  const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
+  assert(0 != cs);
+
+  topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+
+  // Create field for diagonal entries of Jacobian at conventional
+  // vertices i and j associated with Lagrange vertex k
+  _fields->add("Jacobian diagonal", "jacobian_diagonal");
+  topology::Field<topology::SubMesh>& jacobianDiag = _fields->get(
+    "Jacobian diagonal");
+  jacobianDiag.newSection(slip, 2 * cs->spaceDim());
+  jacobianDiag.allocate();
+  jacobianDiag.vectorFieldType(topology::FieldBase::OTHER);
+
+  // Create field for slip rate associated with Lagrange vertex k
+  _fields->add("slip rate", "slip_rate");
+  topology::Field<topology::SubMesh>& slipRate = _fields->get("slip rate");
+  slipRate.cloneSection(slip);
+  slipRate.vectorFieldType(topology::FieldBase::OTHER);
+
+  //logger.stagePop();
+} // initialize
+
+// ----------------------------------------------------------------------
+// Update state variables as needed.
+void
+pylith::faults::FaultCohesiveDyn::updateStateVars(
+				      const double t,
+				      topology::SolutionFields* const fields)
+{ // updateStateVars
+  assert(0 != fields);
+  assert(0 != _fields);
+
+  // :TODO: Update friction state variables
+} // updateStateVars
+
+// ----------------------------------------------------------------------
+// Constrain solution based on friction.
+void
+pylith::faults::FaultCohesiveDyn::constrainSolnSpace(
+				    topology::SolutionFields* const fields,
+				    const double t,
+				    const topology::Jacobian& jacobian)
+{ // constrainSolnSpace
+  assert(0 != fields);
+  assert(0 != _quadrature);
+  assert(0 != _fields);
+  assert(0 != _friction);
+
+  _updateSlipRate(*fields);
+
+  const int spaceDim = _quadrature->spaceDim();
+
+  // Allocate arrays for vertex values
+  double_array tractionTVertex(spaceDim);
+  double_array tractionTpdtVertex(spaceDim);
+  double_array slipTpdtVertex(spaceDim);
+  double_array lagrangeTpdtVertex(spaceDim);
+  double_array dLagrangeTpdtVertex(spaceDim);
+
+  // Get sections
+  double_array slipVertex(spaceDim);
+  const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
+  assert(!slipSection.isNull());
+
+  double_array slipRateVertex(spaceDim);
+  const ALE::Obj<RealSection>& slipRateSection =
+      _fields->get("slip rate").section();
+  assert(!slipRateSection.isNull());
+
+  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+  assert(!areaSection.isNull());
+
+  double_array orientationVertex(spaceDim * spaceDim);
+  const ALE::Obj<RealSection>& orientationSection =
+      _fields->get("orientation").section();
+  assert(!orientationSection.isNull());
+
+  double_array tractionInitialVertex(spaceDim);
+  const ALE::Obj<RealSection>& tractionInitialSection =
+      (0 != _dbInitialTract) ? _fields->get("initial traction").section() : 0;
+
+  double_array lagrangeTVertex(spaceDim);
+  const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
+  assert(!dispTSection.isNull());
+
+  double_array lagrangeTIncrVertex(spaceDim);
+  const ALE::Obj<RealSection>& dispTIncrSection =
+      fields->get("dispIncr(t->t+dt)").section();
+  assert(!dispTIncrSection.isNull());
+
+  double_array jacobianVertexN(spaceDim);
+  double_array jacobianVertexP(spaceDim);
+  const ALE::Obj<RealSection>& jacobianDiagSection =
+        fields->get("Jacobian diagonal").section();
+  assert(!jacobianDiagSection.isNull());
+
+  slipSection->view("SLIP");
+  areaSection->view("AREA");
+  if (0 != _dbInitialTract)
+    tractionInitialSection->view("INITIAL TRACTION");
+  dispTSection->view("DISP (t)");
+  dispTIncrSection->view("DISP INCR (t->t+dt)");
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    const int v_fault = _cohesiveVertices[iVertex].fault;
+    const int v_negative = _cohesiveVertices[iVertex].negative;
+    const int v_positive = _cohesiveVertices[iVertex].positive;
+
+    // Get slip
+    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+
+    // Get slip rate
+    slipRateSection->restrictPoint(v_fault, &slipRateVertex[0],
+      slipRateVertex.size());
+
+    // Get total fault area asssociated with vertex (assembled over all cells)
+    const double* areaVertex = areaSection->restrictPoint(v_fault);
+    assert(0 != areaVertex);
+    assert(1 == areaSection->getFiberDimension(v_fault));
+
+    // Get fault orientation
+    orientationSection->restrictPoint(v_fault, &orientationVertex[0],
+    orientationVertex.size());
+
+    // Get diagonal of Jacobian at conventional vertices i and j
+    // associated with Lagrange vertex k
+    jacobianDiagSection->restrictPoint(v_negative, &jacobianVertexN[0],
+      jacobianVertexN.size());
+    jacobianDiagSection->restrictPoint(v_positive, &jacobianVertexP[0],
+      jacobianVertexP.size());
+
+    // Get initial fault tractions
+    if (0 != _dbInitialTract) {
+      assert(!tractionInitialSection.isNull());
+      tractionInitialSection->restrictPoint(v_fault,
+        &tractionInitialVertex[0], tractionInitialVertex.size());
+    } // if
+
+    // Get Lagrange multiplier values from disp(t), and dispIncr(t->t+dt)
+    dispTSection->restrictPoint(v_lagrange, &lagrangeTVertex[0],
+      lagrangeTVertex.size());
+    dispTIncrSection->restrictPoint(v_lagrange, &lagrangeTIncrVertex[0],
+      lagrangeTIncrVertex.size());
+
+    // Compute Lagrange multiplier at time t+dt
+    lagrangeTpdtVertex = lagrangeTVertex + lagrangeTIncrVertex;
+    dLagrangeTpdtVertex = 0.0;
+
+    // :KLUDGE: Solution at Lagrange constraint vertices is the
+    // Lagrange multiplier value, which is currently the force.
+    // Compute traction by dividing force by area
+    assert(*areaVertex > 0);
+    tractionTVertex = lagrangeTVertex / (*areaVertex);
+      tractionTpdtVertex = lagrangeTpdtVertex / (*areaVertex);
+
+    // Get friction properties and state variables.
+    _friction->retrievePropsAndVars(v_fault);
+
+    // Use fault constitutive model to compute traction associated with
+    // friction.
+    switch (spaceDim) { // switch
+    case 1: { // case 1
+      // Sensitivity of slip to changes in the Lagrange multipliers
+      // Aixjx = 1.0/Aix + 1.0/Ajx
+      const double Aixjx = 1.0 / jacobianVertexN[0] + 1.0
+          / jacobianVertexP[0];
+      const double Spp = 1.0;
+
+      if (tractionTpdtVertex[0] + tractionInitialVertex[0] < 0) {
+        // if compression, then no changes to solution
+      } else {
+        // if tension, then traction is zero.
+
+        // Update slip based on value required to stick versus
+        // zero traction
+        dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
+        slipVertex[0] += Spp * dLagrangeTpdtVertex[0];
+
+        // Set traction to zero.
+        tractionTpdtVertex[0] = 0.0;
+      } // else
+      PetscLogFlops(0); // :TODO: Fix this
+      break;
+    } // case 1
+    case 2: { // case 2
+      std::cout << "Normal traction:" << tractionTpdtVertex[1]
+          + tractionInitialVertex[1] << std::endl;
+
+      // Sensitivity of slip to changes in the Lagrange multipliers
+      // Aixjx = 1.0/Aix + 1.0/Ajx
+      assert(jacobianVertexN[0] > 0.0);
+      assert(jacobianVertexP[0] > 0.0);
+      const double Aixjx = 1.0 / jacobianVertexN[0] + 1.0
+          / jacobianVertexP[0];
+      // Aiyjy = 1.0/Aiy + 1.0/Ajy
+      assert(jacobianVertexN[1] > 0.0);
+      assert(jacobianVertexP[1] > 0.0);
+      const double Aiyjy = 1.0 / jacobianVertexN[1] + 1.0
+          / jacobianVertexP[1];
+      const double Cpx = orientationVertex[0];
+      const double Cpy = orientationVertex[1];
+      const double Cqx = orientationVertex[2];
+      const double Cqy = orientationVertex[3];
+      const double Spp = Cpx * Cpx * Aixjx + Cpy * Cpy * Aiyjy;
+      const double Spq = Cpx * Cqx * Aixjx + Cpy * Cqy * Aiyjy;
+      const double Sqq = Cqx * Cqx * Aixjx + Cqy * Cqy * Aiyjy;
+
+      const double tractionNormal = tractionTpdtVertex[1]
+          + tractionInitialVertex[1];
+      const double slip = slipVertex[0];
+      const double slipRate = slipRateVertex[0];
+
+      if (tractionTpdtVertex[1] + tractionInitialVertex[1] < 0 && 0
+          == slipVertex[1]) {
+        // if in compression and no opening
+        std::cout << "FAULT IN COMPRESSION" << std::endl;
+        const double frictionStress = _friction->calcFriction(slip, slipRate,
+          tractionNormal);
+        std::cout << "frictionStress: " << frictionStress << std::endl;
+        if (tractionTpdtVertex[0] > frictionStress || (tractionTpdtVertex[0]
+            < frictionStress && slipVertex[0] > 0.0)) {
+          // traction is limited by friction, so have sliding
+          std::cout << "LIMIT TRACTION, HAVE SLIDING" << std::endl;
+
+          // Update slip based on value required to stick versus friction
+          dLagrangeTpdtVertex[0] = (tractionTpdtVertex[0] - frictionStress)
+              * (*areaVertex);
+          slipVertex[0] += Spp * dLagrangeTpdtVertex[0];
+          std::cout << "Estimated slip: " << slipVertex[0] << std::endl;
+          // Limit traction
+          tractionTpdtVertex[0] = frictionStress;
+        } else {
+          // else friction exceeds value necessary, so stick
+          std::cout << "STICK" << std::endl;
+          // no changes to solution
+        } // if/else
+      } else {
+        // if in tension, then traction is zero.
+        std::cout << "FAULT IN TENSION" << std::endl;
+
+        // Update slip based on value required to stick versus
+        // zero traction
+        dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
+        dLagrangeTpdtVertex[1] = tractionTpdtVertex[1] * (*areaVertex);
+        slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
+            * dLagrangeTpdtVertex[1];
+        slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
+            * dLagrangeTpdtVertex[1];
+
+        // Set traction to zero
+        tractionTpdtVertex = 0.0;
+      } // else
+      PetscLogFlops(0); // :TODO: Fix this
+      break;
+    } // case 2
+    case 3: { // case 3
+      std::cout << "Normal traction:" << tractionTpdtVertex[2]
+          + tractionInitialVertex[2] << std::endl;
+
+      // Sensitivity of slip to changes in the Lagrange multipliers
+      // Aixjx = 1.0/Aix + 1.0/Ajx
+      assert(jacobianVertexN[0] > 0.0);
+      assert(jacobianVertexP[0] > 0.0);
+      const double Aixjx = 1.0 / jacobianVertexN[0] + 1.0
+          / jacobianVertexP[0];
+      // Aiyjy = 1.0/Aiy + 1.0/Ajy
+      assert(jacobianVertexN[1] > 0.0);
+      assert(jacobianVertexP[1] > 0.0);
+      const double Aiyjy = 1.0 / jacobianVertexN[1] + 1.0
+          / jacobianVertexP[1];
+      // Aizjz = 1.0/Aiz + 1.0/Ajz
+      assert(jacobianVertexN[2] > 0.0);
+      assert(jacobianVertexP[2] > 0.0);
+      const double Aizjz = 1.0 / jacobianVertexN[2] + 1.0
+          / jacobianVertexP[2];
+      const double Cpx = orientationVertex[0];
+      const double Cpy = orientationVertex[1];
+      const double Cpz = orientationVertex[2];
+      const double Cqx = orientationVertex[3];
+      const double Cqy = orientationVertex[4];
+      const double Cqz = orientationVertex[5];
+      const double Crx = orientationVertex[6];
+      const double Cry = orientationVertex[7];
+      const double Crz = orientationVertex[8];
+      const double Spp = Cpx * Cpx * Aixjx + Cpy * Cpy * Aiyjy + Cpz * Cpz
+          * Aizjz;
+      const double Spq = Cpx * Cqx * Aixjx + Cpy * Cqy * Aiyjy + Cpz * Cqz
+          * Aizjz;
+      const double Spr = Cpx * Crx * Aixjx + Cpy * Cry * Aiyjy + Cpz * Crz
+          * Aizjz;
+      const double Sqq = Cqx * Cqx * Aixjx + Cqy * Cqy * Aiyjy + Cqz * Cqz
+          * Aizjz;
+      const double Sqr = Cqx * Crx * Aixjx + Cqy * Cry * Aiyjy + Cqz * Crz
+          * Aizjz;
+      const double Srr = Crx * Crx * Aixjx + Cry * Cry * Aiyjy + Crz * Crz
+          * Aizjz;
+
+      double slip = sqrt(pow(slipVertex[1], 2) + pow(slipVertex[0], 2));
+      double slipRate = sqrt(pow(slipRateVertex[1], 2) + pow(slipRateVertex[0],
+        2));
+
+      const double tractionNormalVertex = tractionTpdtVertex[2] + tractionInitialVertex[2];
+      const double tractionShearVertex = sqrt(pow(tractionTpdtVertex[1], 2) + pow(
+        tractionTpdtVertex[0], 2));
+      const double slipShearVertex = sqrt(pow(slipVertex[1], 2) + pow(slipVertex[0], 2));
+
+      if (tractionNormalVertex < 0 && 0 == slipVertex[2]) {
+        // if in compression and no opening
+        std::cout << "FAULT IN COMPRESSION" << std::endl;
+        const double frictionStress = _friction->calcFriction(slip, slipRate,
+          tractionNormalVertex);
+        std::cout << "frictionStress: " << frictionStress << std::endl;
+        if (tractionShearVertex > frictionStress || (tractionShearVertex
+            < frictionStress && slipShearVertex > 0.0)) {
+          // traction is limited by friction, so have sliding
+          std::cout << "LIMIT TRACTION, HAVE SLIDING" << std::endl;
+
+          // Update slip based on value required to stick versus friction
+          dLagrangeTpdtVertex[0] = (tractionShearVertex - frictionStress)
+              * tractionTpdtVertex[0] / tractionShearVertex * (*areaVertex);
+          dLagrangeTpdtVertex[1] = (tractionShearVertex - frictionStress)
+              * tractionTpdtVertex[1] / tractionShearVertex * (*areaVertex);
+          slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
+              * dLagrangeTpdtVertex[1];
+
+          slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
+              * dLagrangeTpdtVertex[1];
+
+          std::cout << "Estimated slip: " << "  " << slipVertex[0] << "  "
+              << slipVertex[1] << "  " << slipVertex[2] << std::endl;
+
+          // Limit traction
+          tractionTpdtVertex[0] = frictionStress * tractionTpdtVertex[0]
+              / tractionShearVertex;
+          tractionTpdtVertex[1] = frictionStress * tractionTpdtVertex[1]
+              / tractionShearVertex;
+        } else {
+          // else friction exceeds value necessary, so stick
+          std::cout << "STICK" << std::endl;
+          // no changes to solution
+        } // if/else
+      } else {
+        // if in tension, then traction is zero.
+        std::cout << "FAULT IN TENSION" << std::endl;
+
+        // Update slip based on value required to stick versus
+        // zero traction
+        dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
+        dLagrangeTpdtVertex[1] = tractionTpdtVertex[1] * (*areaVertex);
+        dLagrangeTpdtVertex[2] = tractionTpdtVertex[2] * (*areaVertex);
+        slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
+            * dLagrangeTpdtVertex[1] + Spr * dLagrangeTpdtVertex[2];
+        slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
+            * dLagrangeTpdtVertex[1] + Sqr * dLagrangeTpdtVertex[2];
+        slipVertex[2] += Spr * dLagrangeTpdtVertex[0] + Sqr
+            * dLagrangeTpdtVertex[1] + Srr * dLagrangeTpdtVertex[2];
+
+        std::cout << "Estimated slip: " << "  " << slipVertex[0] << "  "
+            << slipVertex[1] << "  " << slipVertex[2] << std::endl;
+
+        // Set traction to zero
+        tractionTpdtVertex = 0.0;
+      } // else
+      PetscLogFlops(0); // :TODO: Fix this
+      break;
+    } // case 3
+    default:
+      assert(0);
+    } // switch
+
+    // Update Lagrange multiplier values.
+    // :KLUDGE: (TEMPORARY) Solution at Lagrange constraint vertices
+    // is the Lagrange multiplier value, which is currently the
+    // force.  Compute force by multipling traction by area
+    lagrangeTIncrVertex =
+      (tractionTpdtVertex - tractionTVertex) * (*areaVertex);
+    assert(lagrangeTIncrVertex.size() ==
+        dispTIncrSection->getFiberDimension(v_lagrange));
+    dispTIncrSection->updatePoint(v_lagrange, &lagrangeTIncrVertex[0]);
+
+    // Update the slip estimate based on adjustment to the Lagrange
+    // multiplier values.
+    assert(slipVertex.size() ==
+        slipSection->getFiberDimension(v_fault));
+    slipSection->updatePoint(v_fault, &slipVertex[0]);
+  } // if
+
+  dispTIncrSection->view("AFTER DISP INCR (t->t+dt)");
+  slipSection->view("AFTER SLIP");
+} // constrainSolnSpace
+
+// ----------------------------------------------------------------------
+// Adjust solution from solver with lumped Jacobian to match Lagrange
+// multiplier constraints.
+void
+pylith::faults::FaultCohesiveDyn::adjustSolnLumped(topology::SolutionFields* const fields,
+                                                        const topology::Field<
+              topology::Mesh>& jacobian)
+{ // adjustSolnLumped
+  // :TODO: Update this to constrain solution space using friction
+  assert(false);
+#if 0
+  assert(0 != fields);
+  assert(0 != _quadrature);
+
+  // Cohesive cells with conventional vertices i and j, and constraint
+  // vertex k require 2 adjustments to the solution:
+  //
+  //   * DOF k: Compute increment in Lagrange multipliers
+  //            dl_k = S^{-1} (-C_ki (A_i^{-1} r_i - C_kj A_j^{-1} r_j + u_i - u_j) - d_k)
+  //            S = C_ki (A_i^{-1} + A_j^{-1}) C_ki^T
+  //   * DOF i and j: Adjust displacement increment (solution) to account
+  //            for Lagrange multiplier constraints
+  //            du_i = +A_i^-1 C_ki^T dlk
+  //            du_j = -A_j^-1 C_kj^T dlk
+
+  const int setupEvent = _logger->eventId("FaAS setup");
+  const int geometryEvent = _logger->eventId("FaAS geometry");
+  const int computeEvent = _logger->eventId("FaAS compute");
+  const int restrictEvent = _logger->eventId("FaAS restrict");
+  const int updateEvent = _logger->eventId("FaAS update");
+
+  _logger->eventBegin(setupEvent);
+
+  // Get cell information and setup storage for cell data
+  const int spaceDim = _quadrature->spaceDim();
+  const int orientationSize = spaceDim * spaceDim;
+
+  // Get section information
+  double_array orientationVertex(orientationSize);
+  const ALE::Obj<RealSection>& orientationSection =
+      _fields->get("orientation").section();
+  assert(!orientationSection.isNull());
+
+  double_array slipVertex(spaceDim);
+  const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
+  assert(!slipSection.isNull());
+
+  double_array jacobianVertexN(spaceDim);
+  double_array jacobianVertexP(spaceDim);
+  const ALE::Obj<RealSection>& jacobianSection = jacobian.section();
+  assert(!jacobianSection.isNull());
+
+  double_array residualVertexN(spaceDim);
+  double_array residualVertexP(spaceDim);
+  const ALE::Obj<RealSection>& residualSection =
+      fields->get("residual").section();
+
+  double_array dispTVertexN(spaceDim);
+  double_array dispTVertexP(spaceDim);
+  const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
+
+  double_array solutionVertexN(spaceDim);
+  double_array solutionVertexP(spaceDim);
+  double_array solutionVertexL(spaceDim);
+  const ALE::Obj<RealSection>& solutionSection = fields->get(
+    "dispIncr(t->t+dt)").section();
+
+  _logger->eventEnd(setupEvent);
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    const int v_fault = _cohesiveVertices[iVertex].fault;
+    const int v_negative = _cohesiveVertices[iVertex].negative;
+    const int v_positive = _cohesiveVertices[iVertex].positive;
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(restrictEvent);
+#endif
+
+    // Get orientations at fault cell's vertices.
+    orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
+
+    // Get slip at fault cell's vertices.
+    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+
+    // Get residual at cohesive cell's vertices.
+    residualSection->restrictPoint(v_negative, &residualVertexN[0], residualVertexN.size());
+    residualSection->restrictPoint(v_positive, &residualVertexP[0], residualVertexP.size());
+
+    // Get jacobian at cohesive cell's vertices.
+    jacobianSection->restrictPoint(v_negative, &jacobianVertexN[0], jacobianVertexN.size());
+    jacobianSection->restrictPoint(v_positive, &jacobianVertexP[0], jacobianVertexP.size());
+
+    // Get disp(t) at cohesive cell's vertices.
+    dispTSection->restrictPoint(v_negative, &dispTVertexN[0], dispTVertexN.size());
+    dispTSection->restrictPoint(v_positive, &dispTVertexP[0], dispTVertexP.size());
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(restrictEvent);
+    _logger->eventBegin(computeEvent);
+#endif
+
+      switch (spaceDim) { // switch
+    case 1: {
+      assert(jacobianVertexN[0] > 0.0);
+      assert(jacobianVertexP[0] > 0.0);
+
+      const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+          / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+      // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+      const double Aru = residualVertexN[0] / jacobianVertexN[0]
+          - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+          - dispTVertexP[0];
+
+      // dl_k = D^{-1}( - C_{ki} Aru - d_k)
+      const double Aruslip = -Aru - slipVertex[0];
+      const double dlp = Sinv * Aruslip;
+
+      // Update displacements at negative vertex
+      solutionVertexN[0] = +1.0 / jacobianVertexN[0] * dlp;
+
+      // Update displacements at positive vertex
+      solutionVertexP[0] = -1.0 / jacobianVertexP[0] * dlp;
+
+      // Update Lagrange multiplier.
+      solutionVertexL[0] = dlp;
+
+      break;
+    } // case 1
+    case 2: {
+      assert(jacobianVertexN[0] > 0.0);
+      assert(jacobianVertexN[1] > 0.0);
+      assert(jacobianVertexP[0] > 0.0);
+      assert(jacobianVertexP[1] > 0.0);
+
+      const double Cpx = orientationVertex[0];
+      const double Cpy = orientationVertex[1];
+      const double Cqx = orientationVertex[2];
+      const double Cqy = orientationVertex[3];
+
+      // Check to make sure Jacobian is same at all DOF for
+      // vertices i and j (means S is diagonal with equal enties).
+      assert(jacobianVertexN[0] == jacobianVertexN[1]);
+      assert(jacobianVertexP[0] == jacobianVertexP[1]);
+
+      const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+          / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+      // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+      const double Arux = residualVertexN[0] / jacobianVertexN[0]
+          - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+          - dispTVertexP[0];
+      const double Aruy = residualVertexN[1] / jacobianVertexN[1]
+          - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
+          - dispTVertexP[1];
+
+      // dl_k = S^{-1}(-C_{ki} Aru - d_k)
+      const double Arup = Cpx * Arux + Cpy * Aruy;
+      const double Aruq = Cqx * Arux + Cqy * Aruy;
+      const double Arupslip = -Arup - slipVertex[0];
+      const double Aruqslip = -Aruq - slipVertex[1];
+      const double dlp = Sinv * Arupslip;
+      const double dlq = Sinv * Aruqslip;
+
+      const double dlx = Cpx * dlp + Cqx * dlq;
+      const double dly = Cpy * dlp + Cqy * dlq;
+
+      // Update displacements at negative vertex.
+      solutionVertexN[0] = dlx / jacobianVertexN[0];
+      solutionVertexN[1] = dly / jacobianVertexN[1];
+
+      // Update displacements at positive vertex.
+      solutionVertexP[0] = -dlx / jacobianVertexP[0];
+      solutionVertexP[1] = -dly / jacobianVertexP[0];
+
+      // Update Lagrange multiplier.
+      solutionVertexL[0] = dlp;
+      solutionVertexL[1] = dlq;
+
+      break;
+    } // case 2
+    case 3: {
+      assert(jacobianVertexN[0] > 0.0);
+      assert(jacobianVertexN[1] > 0.0);
+      assert(jacobianVertexN[2] > 0.0);
+      assert(jacobianVertexP[0] > 0.0);
+      assert(jacobianVertexP[1] > 0.0);
+      assert(jacobianVertexP[2] > 0.0);
+
+      const double Cpx = orientationVertex[0];
+      const double Cpy = orientationVertex[1];
+      const double Cpz = orientationVertex[2];
+      const double Cqx = orientationVertex[3];
+      const double Cqy = orientationVertex[4];
+      const double Cqz = orientationVertex[5];
+      const double Crx = orientationVertex[6];
+      const double Cry = orientationVertex[7];
+      const double Crz = orientationVertex[8];
+
+      // Check to make sure Jacobian is same at all DOF for
+      // vertices i and j (means S is diagonal with equal enties).
+      assert(jacobianVertexN[0] == jacobianVertexN[1] && jacobianVertexN[0] == jacobianVertexN[2]);
+      assert(jacobianVertexP[0] == jacobianVertexP[1] && jacobianVertexP[0] == jacobianVertexP[2]);
+
+      const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+          / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+      // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+      const double Arux = residualVertexN[0] / jacobianVertexN[0]
+          - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+          - dispTVertexP[0];
+      const double Aruy = residualVertexN[1] / jacobianVertexN[1]
+          - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
+          - dispTVertexP[1];
+      const double Aruz = residualVertexN[2] / jacobianVertexN[2]
+          - residualVertexP[2] / jacobianVertexP[2] + dispTVertexN[2]
+          - dispTVertexP[2];
+
+      // dl_k = D^{-1}( -C_{ki} Aru - d_k)
+      const double Arup = Cpx * Arux + Cpy * Aruy + Cpz * Aruz;
+      const double Aruq = Cqx * Arux + Cqy * Aruy + Cqz * Aruz;
+      const double Arur = Crx * Arux + Cry * Aruy + Crz * Aruz;
+      const double Arupslip = -Arup - slipVertex[0];
+      const double Aruqslip = -Aruq - slipVertex[1];
+      const double Arurslip = -Arur - slipVertex[2];
+      const double dlp = Sinv * Arupslip;
+      const double dlq = Sinv * Aruqslip;
+      const double dlr = Sinv * Arurslip;
+
+      const double dlx = Cpx * dlp + Cqx * dlq + Crx * dlr;
+      const double dly = Cpy * dlp + Cqy * dlq + Cry * dlr;
+      const double dlz = Cpz * dlp + Cqz * dlq + Crz * dlr;
+
+      // Update displacements at negative vertex.
+      solutionVertexN[0] = dlx / jacobianVertexN[0];
+      solutionVertexN[1] = dly / jacobianVertexN[1];
+      solutionVertexN[2] = dlz / jacobianVertexN[2];
+
+      // Update displacements at positive vertex.
+      solutionVertexP[0] = -dlx / jacobianVertexP[0];
+      solutionVertexP[1] = -dly / jacobianVertexP[1];
+      solutionVertexP[2] = -dlz / jacobianVertexP[2];
+
+      // Update Lagrange multiplier.
+      solutionVertexL[0] = dlp;
+      solutionVertexL[1] = dlq;
+      solutionVertexL[2] = dlr;
+
+      break;
+    } // case 3
+    default:
+      assert(0);
+      throw std::logic_error("Unknown spatial dimension.");
+    } // switch
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(computeEvent);
+    _logger->eventBegin(updateEvent);
+#endif
+
+    assert(solutionVertexN.size() == solutionSection->getFiberDimension(v_negative));
+    solutionSection->updateAddPoint(v_negative, &solutionVertexN[0]);
+
+    assert(solutionVertexP.size() == solutionSection->getFiberDimension(v_positive));
+    solutionSection->updateAddPoint(v_positive, &solutionVertexP[0]);
+
+    assert(solutionVertexL.size() == solutionSection->getFiberDimension(v_lagrange));
+    solutionSection->updateAddPoint(v_lagrange, &solutionVertexL[0]);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(updateEvent);
+#endif
+  } // for
+
+  switch(spaceDim) {
+  case 1:
+    PetscLogFlops(numVertices*17);
+    break;
+  case 2:
+    PetscLogFlops(numVertices*41);
+    break;
+  case 3:
+    PetscLogFlops(numVertices*72);
+    break;
+  default:
+    assert(0);
+    throw std::logic_error("Unknown spatial dimension.");
+  } // switch
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventEnd(computeEvent);
+#endif
+#endif
+} // adjustSolnLumped
+
+// ----------------------------------------------------------------------
+// Get vertex field associated with integrator.
+const pylith::topology::Field<pylith::topology::SubMesh>&
+pylith::faults::FaultCohesiveDyn::vertexField(const char* name,
+                                               const topology::SolutionFields* fields)
+{ // vertexField
+  assert(0 != _faultMesh);
+  assert(0 != _quadrature);
+  assert(0 != _normalizer);
+  assert(0 != _fields);
+  assert(0 != _friction);
+
+  const int cohesiveDim = _faultMesh->dimension();
+  const int spaceDim = _quadrature->spaceDim();
+
+  const int slipStrLen = strlen("final_slip");
+  const int timeStrLen = strlen("slip_time");
+
+  double scale = 0.0;
+  int fiberDim = 0;
+  if (0 == strcasecmp("slip", name)) {
+    const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+    return slip;
+
+  } else if (cohesiveDim > 0 && 0 == strcasecmp("strike_dir", name)) {
+    const ALE::Obj<RealSection>& orientationSection = _fields->get(
+      "orientation").section();
+    assert(!orientationSection.isNull());
+    const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
+      0);
+    assert(!dirSection.isNull());
+    _allocateBufferVectorField();
+    topology::Field<topology::SubMesh>& buffer =
+        _fields->get("buffer (vector)");
+    buffer.copy(dirSection);
+    buffer.label("strike_dir");
+    buffer.scale(1.0);
+    return buffer;
+
+  } else if (2 == cohesiveDim && 0 == strcasecmp("dip_dir", name)) {
+    const ALE::Obj<RealSection>& orientationSection = _fields->get(
+      "orientation").section();
+    assert(!orientationSection.isNull());
+    const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
+      1);
+    _allocateBufferVectorField();
+    topology::Field<topology::SubMesh>& buffer =
+        _fields->get("buffer (vector)");
+    buffer.copy(dirSection);
+    buffer.label("dip_dir");
+    buffer.scale(1.0);
+    return buffer;
+
+  } else if (0 == strcasecmp("normal_dir", name)) {
+    const ALE::Obj<RealSection>& orientationSection = _fields->get(
+      "orientation").section();
+    assert(!orientationSection.isNull());
+    const int space = (0 == cohesiveDim) ? 0 : (1 == cohesiveDim) ? 1 : 2;
+    const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
+      space);
+    assert(!dirSection.isNull());
+    _allocateBufferVectorField();
+    topology::Field<topology::SubMesh>& buffer =
+        _fields->get("buffer (vector)");
+    buffer.copy(dirSection);
+    buffer.label("normal_dir");
+    buffer.scale(1.0);
+    return buffer;
+
+  } else if (0 == strncasecmp("initial_traction", name, slipStrLen)) {
+    assert(0 != _dbInitialTract);
+    const topology::Field<topology::SubMesh>& initialTraction = _fields->get(
+      "initial traction");
+    return initialTraction;
+
+  } else if (0 == strcasecmp("traction", name)) {
+    assert(0 != fields);
+    const topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
+    _allocateBufferVectorField();
+    topology::Field<topology::SubMesh>& buffer =
+        _fields->get("buffer (vector)");
+    _calcTractions(&buffer, dispT);
+    return buffer;
+
+  } else {
+    std::ostringstream msg;
+    msg << "Request for unknown vertex field '" << name << "' for fault '"
+        << label() << "'.";
+    throw std::runtime_error(msg.str());
+  } // else
+
+
+  // Satisfy return values
+  assert(0 != _fields);
+  const topology::Field<topology::SubMesh>& buffer = _fields->get(
+    "buffer (vector)");
+  return buffer;
+} // vertexField
+
+// ----------------------------------------------------------------------
+// Get cell field associated with integrator.
+const pylith::topology::Field<pylith::topology::SubMesh>&
+pylith::faults::FaultCohesiveDyn::cellField(const char* name,
+                                             const topology::SolutionFields* fields) { // cellField
+  // Should not reach this point if requested field was found
+  std::ostringstream msg;
+  msg << "Request for unknown cell field '" << name << "' for fault '"
+      << label() << ".";
+  throw std::runtime_error(msg.str());
+
+  // Satisfy return values
+  assert(0 != _fields);
+  const topology::Field<topology::SubMesh>& buffer = _fields->get(
+    "buffer (vector)");
+  return buffer;
+} // cellField
+
+// ----------------------------------------------------------------------
+void
+pylith::faults::FaultCohesiveDyn::_getInitialTractions(void)
+{ // _getInitialTractions
+  assert(0 != _normalizer);
+  assert(0 != _quadrature);
+
+  const double pressureScale = _normalizer->pressureScale();
+  const double lengthScale = _normalizer->lengthScale();
+
+  const int spaceDim = _quadrature->spaceDim();
+  const int numQuadPts = _quadrature->numQuadPts();
+
+  if (0 != _dbInitialTract) { // Setup initial values, if provided.
+    // Create section to hold initial tractions.
+    _fields->add("initial traction", "initial_traction");
+    topology::Field<topology::SubMesh>& traction = _fields->get(
+      "initial traction");
+    topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+    traction.cloneSection(slip);
+    traction.scale(pressureScale);
+    const ALE::Obj<RealSection>& tractionSection = traction.section();
+    assert(!tractionSection.isNull());
+
+    _dbInitialTract->open();
+    switch (spaceDim) { // switch
+    case 1: {
+      const char* valueNames[] = { "traction-normal" };
+      _dbInitialTract->queryVals(valueNames, 1);
+      break;
+    } // case 1
+    case 2: {
+      const char* valueNames[] = { "traction-shear", "traction-normal" };
+      _dbInitialTract->queryVals(valueNames, 2);
+      break;
+    } // case 2
+    case 3: {
+      const char* valueNames[] = { "traction-shear-leftlateral",
+          "traction-shear-updip", "traction-normal" };
+      _dbInitialTract->queryVals(valueNames, 3);
+      break;
+    } // case 3
+    default:
+      std::cerr << "Bad spatial dimension '" << spaceDim << "'." << std::endl;
+      assert(0);
+      throw std::logic_error("Bad spatial dimension in Neumann.");
+    } // switch
+
+    // Get 'fault' vertices.
+    const ALE::Obj<SieveSubMesh>& faultSieveMesh = _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 int numBasis = _quadrature->numBasis();
+    const int spaceDim = _quadrature->spaceDim();
+
+    // Containers for database query results and quadrature coordinates in
+    // reference geometry.
+    double_array tractionVertex(spaceDim);
+    double_array coordsVertex(spaceDim);
+
+    // Get sections.
+    const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
+      "coordinates");
+    assert(!coordinates.isNull());
+    const spatialdata::geocoords::CoordSys* cs = _faultMesh->coordsys();
+
+    const double lengthScale = _normalizer->lengthScale();
+
+    // Loop over vertices in fault mesh and perform queries.
+    for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+        != verticesEnd; ++v_iter) {
+      coordinates->restrictPoint(*v_iter, &coordsVertex[0], coordsVertex.size());
+      // Dimensionalize coordinates
+      _normalizer->dimensionalize(&coordsVertex[0], coordsVertex.size(),
+        lengthScale);
+
+      tractionVertex = 0.0;
+      const int err = _dbInitialTract->query(&tractionVertex[0], spaceDim,
+        &coordsVertex[0], spaceDim, cs);
+      if (err) {
+        std::ostringstream msg;
+        msg << "Could not find initial tractions at (";
+        for (int i = 0; i < spaceDim; ++i)
+          msg << " " << coordsVertex[i];
+        msg << ") for dynamic fault interface " << label() << "\n"
+            << "using spatial database " << _dbInitialTract->label() << ".";
+        throw std::runtime_error(msg.str());
+      } // if
+
+      _normalizer->nondimensionalize(&tractionVertex[0], tractionVertex.size(),
+        pressureScale);
+
+      // Update section
+      assert(tractionVertex.size() == tractionSection->getFiberDimension(*v_iter));
+      tractionSection->updatePoint(*v_iter, &tractionVertex[0]);
+    } // for
+
+    _dbInitialTract->close();
+
+    //traction.view("INITIAL TRACTIONS"); // DEBUGGING
+  } // if
+} // _getInitialTractions
+
+// ----------------------------------------------------------------------
+// Compute change in tractions on fault surface using solution.
+// NOTE: We must convert vertex labels to fault vertex labels
+void
+pylith::faults::FaultCohesiveDyn::_calcTractions(
+    topology::Field<topology::SubMesh>* tractions,
+    const topology::Field<topology::Mesh>& dispT)
+{ // _calcTractionsChange
+  assert(0 != tractions);
+  assert(0 != _faultMesh);
+  assert(0 != _fields);
+  assert(0 != _normalizer);
+
+  // Fiber dimension of tractions matches spatial dimension.
+  const int fiberDim = _quadrature->spaceDim();
+  double_array tractionsVertex(fiberDim);
+
+  // Get sections.
+  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+  assert(!areaSection.isNull());
+  const ALE::Obj<RealSection>& dispTSection = dispT.section();
+  assert(!dispTSection.isNull());
+
+  // Allocate buffer for tractions field (if necessary).
+  const ALE::Obj<RealSection>& tractionsSection = tractions->section();
+  if (tractionsSection.isNull()) {
+    ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+    //logger.stagePush("Fault");
+
+    const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+    tractions->newSection(slip, fiberDim);
+    tractions->allocate();
+
+    //logger.stagePop();
+  } // if
+  const double pressureScale = _normalizer->pressureScale();
+  tractions->label("traction");
+  tractions->scale(pressureScale);
+  tractions->zero();
+
+  // Set tractions to initial tractions if they exist
+  if (0 != _dbInitialTract) {
+    const ALE::Obj<RealSection>& initialTractionSection = _fields->get(
+      "initial traction").section();
+    assert(!initialTractionSection.isNull());
+    const int numVertices = _cohesiveVertices.size();
+    for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+      const int v_fault = _cohesiveVertices[iVertex].fault;
+      initialTractionSection->restrictPoint(v_fault, &tractionsVertex[0],
+        tractionsVertex.size());
+      assert(fiberDim == tractionsSection->getFiberDimension(v_fault));
+      tractionsSection->updatePoint(v_fault, &tractionsVertex[0]);
+    } // for
+  } // if
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    const int v_fault = _cohesiveVertices[iVertex].fault;
+
+    assert(fiberDim == dispTSection->getFiberDimension(v_lagrange));
+    assert(fiberDim == tractionsSection->getFiberDimension(v_fault));
+    assert(1 == areaSection->getFiberDimension(v_fault));
+
+    const double* dispTVertex = dispTSection->restrictPoint(v_lagrange);
+    assert(0 != dispTVertex);
+    const double* areaVertex = areaSection->restrictPoint(v_fault);
+    assert(0 != areaVertex);
+
+    for (int i = 0; i < fiberDim; ++i)
+      tractionsVertex[i] = dispTVertex[i] / areaVertex[0];
+
+    assert(tractionsVertex.size() == tractionsSection->getFiberDimension(v_fault));
+    tractionsSection->updateAddPoint(v_fault, &tractionsVertex[0]);
+  } // for
+
+  PetscLogFlops(numVertices * (1 + fiberDim) );
+
+#if 0 // DEBUGGING
+  tractions->view("TRACTIONS");
+#endif
+
+} // _calcTractions
+
+// ----------------------------------------------------------------------
+// Update slip rate associated with Lagrange vertex k corresponding
+// to diffential velocity between conventional vertices i and j.
+void
+pylith::faults::FaultCohesiveDyn::_updateSlipRate(const topology::SolutionFields& fields)
+{ // _updateSlipRate
+  assert(0 != _fields);
+
+  const int spaceDim = _quadrature->spaceDim();
+
+  // Get section information
+  double_array velocityVertexN(spaceDim);
+  double_array velocityVertexP(spaceDim);
+  const ALE::Obj<RealSection>& velocitySection =
+      fields.get("velocity(t)").section();
+  assert(!velocitySection.isNull());
+
+  double_array slipRateVertex(spaceDim);
+  const ALE::Obj<RealSection>& slipRateSection =
+      _fields->get("slip rate").section();
+
+  double_array orientationVertex(spaceDim*spaceDim);
+  const ALE::Obj<RealSection>& orientationSection =
+      _fields->get("orientation").section();
+  assert(!orientationSection.isNull());
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    const int v_fault = _cohesiveVertices[iVertex].fault;
+    const int v_negative = _cohesiveVertices[iVertex].negative;
+    const int v_positive = _cohesiveVertices[iVertex].positive;
+
+    // Get values
+    const double* velocityVertexN = velocitySection->restrictPoint(v_negative);
+    assert(0 != velocityVertexN);
+    assert(spaceDim == velocitySection->getFiberDimension(v_negative));
+
+    const double* velocityVertexP = velocitySection->restrictPoint(v_positive);
+    assert(0 != velocityVertexP);
+    assert(spaceDim == velocitySection->getFiberDimension(v_positive));
+
+    const double* orientationVertex = orientationSection->restrictPoint(v_fault);
+    assert(0 != orientationVertex);
+    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+
+    slipRateVertex = 0.0;
+    // Velocity for negative vertex.
+    for (int iDim = 0; iDim < spaceDim; ++iDim)
+      for (int kDim = 0; kDim < spaceDim; ++kDim)
+        slipRateVertex[iDim] +=
+          velocityVertexN[kDim] * -orientationVertex[kDim*spaceDim+iDim];
+
+    // Velocity for positive vertex.
+    for (int iDim = 0; iDim < spaceDim; ++iDim)
+      for (int kDim = 0; kDim < spaceDim; ++kDim)
+        slipRateVertex[iDim] +=
+          velocityVertexP[kDim] * +orientationVertex[kDim*spaceDim+iDim];
+
+    // Update slip rate field.
+    assert(slipRateVertex.size() == slipRateSection->getFiberDimension(v_fault));
+    slipRateSection->updatePoint(v_fault, &slipRateVertex[0]);
+  } // for
+
+  PetscLogFlops(numVertices*spaceDim*spaceDim*4);
+} // _updateSlipRate
+
+
+// End of file 

Copied: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.hh (from rev 16277, short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.hh)
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,171 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file libsrc/faults/FaultCohesiveDyn.hh
+ *
+ * @brief C++ implementation for a fault surface with spontaneous
+ * (dynamic) slip implemented with cohesive cells.
+ */
+
+#if !defined(pylith_faults_faultcohesivedyn_hh)
+#define pylith_faults_faultcohesivedyn_hh
+
+// Include directives ---------------------------------------------------
+#include "FaultCohesiveLagrange.hh" // ISA FaultCohesiveLagrange
+
+#include "pylith/friction/frictionfwd.hh" // HOLDSA Friction model
+
+// FaultCohesiveDyn -----------------------------------------------------
+/**
+ * @brief C++ implementation for a fault surface with spontaneous
+ * (dynamic) slip implemented with cohesive cells.
+ *
+ */
+class pylith::faults::FaultCohesiveDyn : public FaultCohesiveLagrange
+{ // class FaultCohesiveDyn
+  friend class TestFaultCohesiveDyn; // unit testing
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /// Default constructor.
+  FaultCohesiveDyn(void);
+
+  /// Destructor.
+  virtual
+  ~FaultCohesiveDyn(void);
+
+  /// Deallocate PETSc and local data structures.
+  virtual
+  void deallocate(void);
+  
+  /** Sets the spatial database for the inital tractions.
+   *
+   * @param db spatial database for initial tractions
+   */
+  void dbInitialTract(spatialdata::spatialdb::SpatialDB* db);
+  
+  /** Set the friction (constitutive) model.
+   *
+   * @param model Fault constutive model.
+   */
+  void frictionModel(friction::FrictionModel* const model);
+
+  /** Initialize fault. Determine orientation and setup boundary
+   * condition parameters.
+   *
+   * @param mesh Finite-element mesh.
+   * @param upDir Direction perpendicular to along-strike direction that is 
+   *   not collinear with fault normal (usually "up" direction but could 
+   *   be up-dip direction; only applies to fault surfaces in a 3-D domain).
+   * @param normalDir General preferred direction for fault normal
+   *   (used to pick which of two possible normal directions for
+   *   interface; only applies to fault surfaces in a 3-D domain).
+   */
+  void initialize(const topology::Mesh& mesh,
+		  const double upDir[3],
+		  const double normalDir[3]);
+
+  /** Update state variables as needed.
+   *
+   * @param t Current time
+   * @param fields Solution fields
+   * @param mesh Finite-element mesh
+   */
+  void updateStateVars(const double t,
+		       topology::SolutionFields* const fields);
+
+  /** Constrain solution space based on friction.
+   *
+   * @param fields Solution fields.
+   * @param t Current time.
+   * @param jacobian Sparse matrix for system Jacobian.
+   */
+  void constrainSolnSpace(topology::SolutionFields* const fields,
+			  const double t,
+			  const topology::Jacobian& jacobian);
+
+  /** Adjust solution from solver with lumped Jacobian to match Lagrange
+   *  multiplier constraints.
+   *
+   * @param fields Solution fields.
+   * @param jacobian Jacobian of the system.
+   */
+  void adjustSolnLumped(topology::SolutionFields* fields,
+      const topology::Field<topology::Mesh>& jacobian);
+
+  /** Get vertex field associated with integrator.
+   *
+   * @param name Name of cell field.
+   * @param fields Solution fields.
+   * @returns Vertex field.
+   */
+  const topology::Field<topology::SubMesh>&
+  vertexField(const char* name,
+	      const topology::SolutionFields* fields =0);
+
+  /** Get cell field associated with integrator.
+   *
+   * @param name Name of cell field.
+   * @param fields Solution fields.
+   * @returns Cell field.
+   */
+  const topology::Field<topology::SubMesh>&
+  cellField(const char* name,
+	    const topology::SolutionFields* fields =0);
+
+  // PRIVATE METHODS ////////////////////////////////////////////////////
+private :
+
+  /** Get initial tractions using a spatial database.
+   */
+  void _getInitialTractions(void);
+
+  /** Compute change in tractions on fault surface using solution.
+   *
+   * @param tractions Field for tractions.
+   * @param solution Solution over domain
+   */
+  void _calcTractions(topology::Field<topology::SubMesh>* tractions,
+          const topology::Field<topology::Mesh>& solution);
+
+  /** Update slip rate associated with Lagrange vertex k corresponding
+   * to diffential velocity between conventional vertices i and j.
+   *
+   * @param fields Solution fields.
+   */
+  void _updateSlipRate(const topology::SolutionFields& fields);
+
+  // PRIVATE MEMBERS ////////////////////////////////////////////////////
+private :
+
+  /// Database for initial tractions.
+  spatialdata::spatialdb::SpatialDB* _dbInitialTract;
+
+  /// To identify constitutive model
+  friction::FrictionModel* _friction;
+
+  // NOT IMPLEMENTED ////////////////////////////////////////////////////
+private :
+
+  /// Not implemented
+  FaultCohesiveDyn(const FaultCohesiveDyn&);
+
+  /// Not implemented
+  const FaultCohesiveDyn& operator=(const FaultCohesiveDyn&);
+
+}; // class FaultCohesiveDyn
+
+#endif // pylith_faults_faultcohesivedyn_hh
+
+
+// End of file 

Deleted: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,1914 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "FaultCohesiveDynL.hh" // implementation of object methods
-
-#include "CohesiveTopology.hh" // USES CohesiveTopology
-
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
-#include "pylith/feassemble/CellGeometry.hh" // USES CellGeometry
-#include "pylith/topology/Mesh.hh" // USES Mesh
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/topology/Field.hh" // USES Field
-#include "pylith/topology/Fields.hh" // USES Fields
-#include "pylith/topology/Jacobian.hh" // USES Jacobian
-#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
-#include "pylith/friction/FrictionModel.hh" // USES FrictionModel
-
-#include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
-#include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
-#include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
-
-#include <cmath> // USES pow(), sqrt()
-#include <strings.h> // USES strcasecmp()
-#include <cstring> // USES strlen()
-#include <cstdlib> // USES atoi()
-#include <cassert> // USES assert()
-#include <sstream> // USES std::ostringstream
-#include <stdexcept> // USES std::runtime_error
-
-// Precomputing geometry significantly increases storage but gives a
-// slight speed improvement.
-//#define PRECOMPUTE_GEOMETRY
-
-// ----------------------------------------------------------------------
-typedef pylith::topology::Mesh::SieveMesh SieveMesh;
-typedef pylith::topology::Mesh::RealSection RealSection;
-typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
-
-// ----------------------------------------------------------------------
-// Default constructor.
-pylith::faults::FaultCohesiveDynL::FaultCohesiveDynL(void) :
-  _dbInitialTract(0),
-  _friction(0)
-{ // constructor
-  _useLagrangeConstraints = true;
-  _needJacobianDiag = true;
-  _needVelocity = true;
-} // constructor
-
-// ----------------------------------------------------------------------
-// Destructor.
-pylith::faults::FaultCohesiveDynL::~FaultCohesiveDynL(void)
-{ // destructor
-  deallocate();
-} // destructor
-
-// ----------------------------------------------------------------------
-// Deallocate PETSc and local data structures.
-void pylith::faults::FaultCohesiveDynL::deallocate(void)
-{ // deallocate
-  FaultCohesive::deallocate();
-
-  _dbInitialTract = 0; // :TODO: Use shared pointer
-  _friction = 0; // :TODO: Use shared pointer
-} // deallocate
-
-// ----------------------------------------------------------------------
-// Sets the spatial database for the inital tractions
-void
-pylith::faults::FaultCohesiveDynL::dbInitialTract(spatialdata::spatialdb::SpatialDB* db)
-{ // dbInitial
-  _dbInitialTract = db;
-} // dbInitial
-
-// ----------------------------------------------------------------------
-// Get the friction (constitutive) model.  
-void
-pylith::faults::FaultCohesiveDynL::frictionModel(friction::FrictionModel* const model)
-{ // frictionModel
-  _friction = model;
-} // frictionModel
-
-// ----------------------------------------------------------------------
-// Initialize fault. Determine orientation and setup boundary
-void
-pylith::faults::FaultCohesiveDynL::initialize(const topology::Mesh& mesh,
-					      const double upDir[3],
-					      const double normalDir[3])
-{ // initialize
-  assert(0 != upDir);
-  assert(0 != normalDir);
-  assert(0 != _quadrature);
-  assert(0 != _normalizer);
-
-  const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
-  assert(0 != cs);
-
-  delete _faultMesh;
-  _faultMesh = new topology::SubMesh();
-  CohesiveTopology::createFaultParallel(_faultMesh, &_cohesiveToFault, mesh,
-    id(), useLagrangeConstraints());
-
-  delete _fields;
-  _fields = new topology::Fields<topology::Field<topology::SubMesh> >(
-    *_faultMesh);
-
-  ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
-  //logger.stagePush("Fault");
-
-  // Allocate slip field
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-      faultSieveMesh->depthStratum(0);
-  assert(!vertices.isNull());
-  _fields->add("slip", "slip");
-  topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  slip.newSection(vertices, cs->spaceDim());
-  slip.allocate();
-  slip.vectorFieldType(topology::FieldBase::VECTOR);
-  slip.scale(_normalizer->lengthScale());
-
-  const ALE::Obj<SieveSubMesh::label_sequence>& cells =
-      faultSieveMesh->heightStratum(0);
-  assert(!cells.isNull());
-  const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
-  const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
-  _quadrature->initializeGeometry();
-#if defined(PRECOMPUTE_GEOMETRY)
-  _quadrature->computeGeometry(*_faultMesh, cells);
-#endif
-
-  // Compute orientation at vertices in fault mesh.
-  _calcOrientation(upDir, normalDir);
-
-  // Compute tributary area for each vertex in fault mesh.
-  _calcArea();
-
-  // Get initial tractions using a spatial database.
-  _getInitialTractions();
-
-  // Setup fault constitutive model.
-  assert(0 != _friction);
-  _friction->initialize(*_faultMesh, _quadrature, _fields->get("area"));
-
-  // Create field for diagonal entries of Jacobian at conventional
-  // vertices i and j associated with Lagrange vertex k
-  _fields->add("Jacobian diagonal", "jacobian_diagonal");
-  topology::Field<topology::SubMesh>& jacobianDiag = _fields->get(
-    "Jacobian diagonal");
-  jacobianDiag.newSection(slip, 2 * cs->spaceDim());
-  jacobianDiag.allocate();
-  jacobianDiag.vectorFieldType(topology::FieldBase::OTHER);
-
-  // Create field for slip rate associated with Lagrange vertex k
-  _fields->add("slip rate", "slip_rate");
-  topology::Field<topology::SubMesh>& slipRate = _fields->get("slip rate");
-  slipRate.cloneSection(slip);
-  slipRate.vectorFieldType(topology::FieldBase::OTHER);
-
-  //logger.stagePop();
-} // initialize
-
-// ----------------------------------------------------------------------
-void pylith::faults::FaultCohesiveDynL::splitField(topology::Field<
-    topology::Mesh>* field)
-{ // splitField
-  assert(0 != field);
-
-  const ALE::Obj<RealSection>& section = field->section();
-  assert(!section.isNull());
-  if (0 == section->getNumSpaces())
-    return; // Return if there are no fibrations
-
-  const int fibrationDisp = 0;
-  const int fibrationLagrange = 1;
-
-  // Get domain Sieve mesh
-  const ALE::Obj<SieveMesh>& sieveMesh = field->mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-
-  // Get fault Sieve mesh
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-
-  const ALE::Obj<SieveMesh::label_sequence>& vertices =
-      sieveMesh->depthStratum(0);
-  assert(!vertices.isNull());
-  const SieveSubMesh::label_sequence::iterator verticesBegin =
-      vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-  SieveSubMesh::renumbering_type& renumbering =
-      faultSieveMesh->getRenumbering();
-  const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
-      renumbering.end();
-  for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-      != verticesEnd; ++v_iter)
-    if (renumbering.find(*v_iter) != renumberingEnd) {
-      const int vertexFault = renumbering[*v_iter];
-      const int vertexMesh = *v_iter;
-      const int fiberDim = section->getFiberDimension(vertexMesh);
-      assert(fiberDim > 0);
-      // Reset displacement fibration fiber dimension to zero.
-      section->setFiberDimension(vertexMesh, 0, fibrationDisp);
-      // Set Langrange fibration fiber dimension.
-      section->setFiberDimension(vertexMesh, fiberDim, fibrationLagrange);
-    } // if
-} // splitField
-
-// ----------------------------------------------------------------------
-// Integrate contribution of cohesive cells to residual term that
-// require assembly across processors.
-void pylith::faults::FaultCohesiveDynL::integrateResidual(const topology::Field<
-                                                              topology::Mesh>& residual,
-                                                          const double t,
-                                                          topology::SolutionFields* const fields)
-{ // integrateResidual
-  assert(0 != fields);
-  assert(0 != _quadrature);
-  assert(0 != _fields);
-
-  // Cohesive cells with normal vertices i and j, and constraint
-  // vertex k make 2 contributions to the residual:
-  //
-  //   * DOF i and j: internal forces in soln field associated with
-  //                  slip  -[C]^T{L(t)+dL(t)}
-  //   * DOF k: slip values  -[C]{u(t)+dt(t)}
-
-  // Get cell information and setup storage for cell data
-  const int spaceDim = _quadrature->spaceDim();
-  const int orientationSize = spaceDim * spaceDim;
-  const int numBasis = _quadrature->numBasis();
-  const int numConstraintVert = numBasis;
-  const int numCorners = 3 * numConstraintVert; // cohesive cell
-  const int numQuadPts = _quadrature->numQuadPts();
-  const double_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
-
-  // Allocate vectors for cell values
-  double_array dispTpdtCell(numCorners * spaceDim);
-
-  // Tributary area for the current for each vertex.
-  double_array areaVertexCell(numConstraintVert);
-
-  // Get cohesive cells
-  const ALE::Obj<SieveMesh>& sieveMesh = residual.mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
-      sieveMesh->getLabelStratum("material-id", id());
-  assert(!cellsCohesive.isNull());
-  const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
-      cellsCohesive->begin();
-  const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
-      cellsCohesive->end();
-  const int cellsCohesiveSize = cellsCohesive->size();
-
-  // Get fault Sieve mesh
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-
-  // Get section information
-  double_array orientationCell(numConstraintVert * orientationSize);
-  const ALE::Obj<RealSection>& orientationSection =
-      _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
-  topology::Mesh::RestrictVisitor orientationVisitor(*orientationSection,
-    orientationCell.size(), &orientationCell[0]);
-
-  // Total fault area associated with each vertex (assembled over all cells).
-  double_array areaCell(numConstraintVert);
-  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
-  assert(!areaSection.isNull());
-  topology::Mesh::RestrictVisitor areaVisitor(*areaSection, areaCell.size(),
-    &areaCell[0]);
-
-  double_array dispTCell(numCorners * spaceDim);
-  topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
-  const ALE::Obj<RealSection>& dispTSection = dispT.section();
-  assert(!dispTSection.isNull());
-  topology::Mesh::RestrictVisitor dispTVisitor(*dispTSection, dispTCell.size(),
-    &dispTCell[0]);
-
-  double_array dispTIncrCell(numCorners * spaceDim);
-  topology::Field<topology::Mesh>& dispTIncr = fields->get("dispIncr(t->t+dt)");
-  const ALE::Obj<RealSection>& dispTIncrSection = dispTIncr.section();
-  assert(!dispTIncrSection.isNull());
-  topology::Mesh::RestrictVisitor dispTIncrVisitor(*dispTIncrSection,
-    dispTIncrCell.size(), &dispTIncrCell[0]);
-
-  double_array residualCell(numCorners * spaceDim);
-  const ALE::Obj<RealSection>& residualSection = residual.section();
-  topology::Mesh::UpdateAddVisitor residualVisitor(*residualSection,
-    &residualCell[0]);
-
-  double_array coordinatesCell(numBasis * spaceDim);
-  const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
-    "coordinates");
-  assert(!coordinates.isNull());
-  topology::Mesh::RestrictVisitor coordsVisitor(*coordinates,
-    coordinatesCell.size(), &coordinatesCell[0]);
-
-  for (SieveMesh::label_sequence::iterator c_iter = cellsCohesiveBegin; c_iter
-      != cellsCohesiveEnd; ++c_iter) {
-    const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-    areaVertexCell = 0.0;
-    residualCell = 0.0;
-
-    // Compute geometry information for current cell
-#if defined(PRECOMPUTE_GEOMETRY)
-    _quadrature->retrieveGeometry(c_fault);
-#else
-    coordsVisitor.clear();
-    faultSieveMesh->restrictClosure(c_fault, coordsVisitor);
-    _quadrature->computeGeometry(coordinatesCell, c_fault);
-#endif
-    // Get cell geometry information that depends on cell
-    const double_array& basis = _quadrature->basis();
-    const double_array& jacobianDet = _quadrature->jacobianDet();
-
-    // Compute contributory area for cell (to weight contributions)
-    for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
-      const double wt = quadWts[iQuad] * jacobianDet[iQuad];
-      for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
-        const double dArea = wt * basis[iQuad * numBasis + iBasis];
-        areaVertexCell[iBasis] += dArea;
-      } // for
-    } // for
-
-    // Get orientations at fault cell's vertices.
-    orientationVisitor.clear();
-    faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
-
-    // Get area at fault cell's vertices.
-    areaVisitor.clear();
-    faultSieveMesh->restrictClosure(c_fault, areaVisitor);
-
-    // Get disp(t) at cohesive cell's vertices.
-    dispTVisitor.clear();
-    sieveMesh->restrictClosure(*c_iter, dispTVisitor);
-
-    // Get dispIncr(t) at cohesive cell's vertices.
-    dispTIncrVisitor.clear();
-    sieveMesh->restrictClosure(*c_iter, dispTIncrVisitor);
-
-    // Compute current estimate of displacement at time t+dt using
-    // solution increment.
-    dispTpdtCell = dispTCell + dispTIncrCell;
-
-    for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
-      // Blocks in cell matrix associated with normal cohesive
-      // vertices i and j and constraint vertex k
-      const int indexI = iConstraint;
-      const int indexJ = iConstraint + numConstraintVert;
-      const int indexK = iConstraint + 2 * numConstraintVert;
-
-      assert(areaCell[iConstraint] > 0);
-      const double wt = areaVertexCell[iConstraint] / areaCell[iConstraint];
-
-      // Get orientation at constraint vertex
-      const double* orientationVertex = &orientationCell[iConstraint
-          * orientationSize];
-      assert(0 != orientationVertex);
-
-      // Entries associated with constraint forces applied at node i
-      for (int iDim = 0; iDim < spaceDim; ++iDim) {
-        for (int kDim = 0; kDim < spaceDim; ++kDim)
-          residualCell[indexI * spaceDim + iDim] -= dispTpdtCell[indexK
-              * spaceDim + kDim] * -orientationVertex[kDim * spaceDim + iDim]
-              * wt;
-      } // for
-
-      // Entries associated with constraint forces applied at node j
-      for (int jDim = 0; jDim < spaceDim; ++jDim) {
-        for (int kDim = 0; kDim < spaceDim; ++kDim)
-          residualCell[indexJ * spaceDim + jDim] -= dispTpdtCell[indexK
-              * spaceDim + kDim] * orientationVertex[kDim * spaceDim + jDim]
-              * wt;
-      } // for
-
-      // Entries associated with relative displacements between node i
-      // and node j for constraint node k
-      for (int kDim = 0; kDim < spaceDim; ++kDim) {
-        for (int iDim = 0; iDim < spaceDim; ++iDim)
-          residualCell[indexK * spaceDim + kDim] -= (dispTpdtCell[indexJ
-              * spaceDim + iDim] - dispTpdtCell[indexI * spaceDim + iDim])
-              * orientationVertex[kDim * spaceDim + iDim] * wt;
-      } // for
-    } // for
-
-#if 0 // DEBUGGING
-    std::cout << "Updating fault residual for cell " << *c_iter << std::endl;
-    for(int i = 0; i < numCorners*spaceDim; ++i) {
-      std::cout << "  dispTpdt["<<i<<"]: " << dispTpdtCell[i] << std::endl;
-    }
-    for(int i = 0; i < numCorners*spaceDim; ++i) {
-      std::cout << "  dispT["<<i<<"]: " << dispTCell[i] << std::endl;
-    }
-    for(int i = 0; i < numCorners*spaceDim; ++i) {
-      std::cout << "  dispIncr["<<i<<"]: " << dispTIncrCell[i] << std::endl;
-    }
-    for(int i = 0; i < numCorners*spaceDim; ++i) {
-      std::cout << "  v["<<i<<"]: " << residualCell[i] << std::endl;
-    }
-#endif
-
-    residualVisitor.clear();
-    sieveMesh->updateClosure(*c_iter, residualVisitor);
-  } // for
-
-  PetscLogFlops(cellsCohesiveSize*numConstraintVert*spaceDim*spaceDim*11);
-} // integrateResidual
-
-// ----------------------------------------------------------------------
-// Integrate contribution of cohesive cells to residual term that do
-// not require assembly across cells, vertices, or processors.
-void pylith::faults::FaultCohesiveDynL::integrateResidualAssembled(const topology::Field<
-                                                                       topology::Mesh>& residual,
-                                                                   const double t,
-                                                                   topology::SolutionFields* const fields)
-{ // integrateResidualAssembled
-  assert(0 != fields);
-  assert(0 != _fields);
-
-  // Cohesive cells with normal vertices i and j, and constraint
-  // vertex k make contributions to the assembled residual:
-  //
-  //   * DOF k: slip values {D(t+dt)}
-
-  topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-
-  const int spaceDim = _quadrature->spaceDim();
-
-  // Get sections
-  const ALE::Obj<SieveMesh>& sieveMesh = residual.mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<RealSection>& slipSection = slip.section();
-  assert(!slipSection.isNull());
-  const ALE::Obj<RealSection>& residualSection = residual.section();
-  assert(!residualSection.isNull());
-
-  const ALE::Obj<SieveMesh::label_sequence>& vertices =
-      sieveMesh->depthStratum(0);
-  assert(!vertices.isNull());
-  const SieveSubMesh::label_sequence::iterator verticesBegin =
-      vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-  SieveSubMesh::renumbering_type& renumbering =
-      faultSieveMesh->getRenumbering();
-  const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
-      renumbering.end();
-
-  for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-      != verticesEnd; ++v_iter)
-    if (renumbering.find(*v_iter) != renumberingEnd) {
-      const int vertexFault = renumbering[*v_iter];
-      const int vertexMesh = *v_iter;
-      const double* slipVertex = slipSection->restrictPoint(vertexFault);
-      assert(spaceDim == slipSection->getFiberDimension(vertexFault));
-      assert(spaceDim == residualSection->getFiberDimension(vertexMesh));
-      assert(0 != slipVertex);
-      residualSection->updateAddPoint(vertexMesh, slipVertex);
-    } // if
-} // integrateResidualAssembled
-
-// ----------------------------------------------------------------------
-// Compute Jacobian matrix (A) associated with operator that do not
-// require assembly across cells, vertices, or processors.
-void
-pylith::faults::FaultCohesiveDynL::integrateJacobianAssembled(
-				      topology::Jacobian* jacobian,
-				      const double t,
-				      topology::SolutionFields* const fields)
-{ // integrateJacobianAssembled
-  assert(0 != jacobian);
-  assert(0 != fields);
-  assert(0 != _fields);
-
-  // Add constraint information to Jacobian matrix; these are the
-  // direction cosines. Entries are associated with vertices ik, jk,
-  // ki, and kj.
-
-  // Get cohesive cells
-  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
-      sieveMesh->getLabelStratum("material-id", id());
-  assert(!cellsCohesive.isNull());
-  const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
-      cellsCohesive->begin();
-  const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
-      cellsCohesive->end();
-  const int cellsCohesiveSize = cellsCohesive->size();
-
-  const int spaceDim = _quadrature->spaceDim();
-  const int orientationSize = spaceDim * spaceDim;
-
-  const int numConstraintVert = _quadrature->numBasis();
-  const int numCorners = 3 * numConstraintVert; // cohesive cell
-  double_array matrixCell(numCorners * spaceDim * numCorners * spaceDim);
-  double_array orientationCell(numConstraintVert * orientationSize);
-
-  // Get section information
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<RealSection>& solutionSection = fields->solution().section();
-  assert(!solutionSection.isNull());
-  const ALE::Obj<RealSection>& orientationSection =
-      _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
-  topology::Mesh::RestrictVisitor orientationVisitor(*orientationSection,
-    orientationCell.size(), &orientationCell[0]);
-
-#if 0 // DEBUGGING
-  // Check that fault cells match cohesive cells
-  ALE::ISieveVisitor::PointRetriever<sieve_type> cV(std::max(1, mesh->getSieve()->getMaxConeSize()));
-  ALE::ISieveVisitor::PointRetriever<sieve_type> cV2(std::max(1, _faultMesh->getSieve()->getMaxConeSize()));
-  Mesh::renumbering_type& fRenumbering = _faultMesh->getRenumbering();
-  const int rank = mesh->commRank();
-
-  for (Mesh::label_sequence::iterator c_iter = cellsCohesiveBegin;
-      c_iter != cellsCohesiveEnd;
-      ++c_iter) {
-    mesh->getSieve()->cone(*c_iter, cV);
-    const int coneSize = cV.getSize();
-    const Mesh::point_type *cone = cV.getPoints();
-    const int faceSize = coneSize / 3;
-    const Mesh::point_type face = _cohesiveToFault[*c_iter];
-    _faultMesh->getSieve()->cone(face, cV2);
-    const int fConeSize = cV2.getSize();
-    const Mesh::point_type *fCone = cV2.getPoints();
-
-    assert(0 == coneSize % faceSize);
-    assert(faceSize == fConeSize);
-    // Use last vertices (contraints) for fault mesh
-    for(int i = 2*faceSize, j = 0; i < 3*faceSize; ++i, ++j) {
-      assert(fRenumbering[cone[i]] == fCone[j]);
-    }
-    cV.clear();
-    cV2.clear();
-  }
-#endif
-
-  const PetscMat jacobianMatrix = jacobian->matrix();
-  assert(0 != jacobianMatrix);
-  const ALE::Obj<SieveMesh::order_type>& globalOrder =
-      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
-        solutionSection);
-  assert(!globalOrder.isNull());
-  // We would need to request unique points here if we had an interpolated mesh
-  topology::Mesh::IndicesVisitor jacobianVisitor(*solutionSection,
-    *globalOrder, (int) pow(sieveMesh->getSieve()->getMaxConeSize(),
-      sieveMesh->depth()) * spaceDim);
-
-  for (SieveMesh::label_sequence::iterator c_iter = cellsCohesiveBegin; c_iter
-      != cellsCohesiveEnd; ++c_iter) {
-    const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-
-    matrixCell = 0.0;
-    // Get orientations at fault cell's vertices.
-    orientationVisitor.clear();
-    faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
-
-    for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
-      // Blocks in cell matrix associated with normal cohesive
-      // vertices i and j and constraint vertex k
-      const int indexI = iConstraint;
-      const int indexJ = iConstraint + numConstraintVert;
-      const int indexK = iConstraint + 2 * numConstraintVert;
-
-      // Get orientation at constraint vertex
-      const double* orientationVertex = &orientationCell[iConstraint
-          * orientationSize];
-      assert(0 != orientationVertex);
-
-      // Entries associated with constraint forces applied at node i
-      for (int iDim = 0; iDim < spaceDim; ++iDim)
-        for (int kDim = 0; kDim < spaceDim; ++kDim) {
-          const int row = indexI * spaceDim + iDim;
-          const int col = indexK * spaceDim + kDim;
-          matrixCell[row * numCorners * spaceDim + col]
-              = -orientationVertex[kDim * spaceDim + iDim];
-          matrixCell[col * numCorners * spaceDim + row]
-              = -orientationVertex[kDim * spaceDim + iDim];
-        } // for
-
-      // Entries associated with constraint forces applied at node j
-      for (int jDim = 0; jDim < spaceDim; ++jDim)
-        for (int kDim = 0; kDim < spaceDim; ++kDim) {
-          const int row = indexJ * spaceDim + jDim;
-          const int col = indexK * spaceDim + kDim;
-          matrixCell[row * numCorners * spaceDim + col]
-              = orientationVertex[kDim * spaceDim + jDim];
-          matrixCell[col * numCorners * spaceDim + row]
-              = orientationVertex[kDim * spaceDim + jDim];
-        } // for
-    } // for
-
-    // Insert cell contribution into PETSc Matrix
-    jacobianVisitor.clear();
-    PetscErrorCode err = updateOperator(jacobianMatrix, *sieveMesh->getSieve(),
-      jacobianVisitor, *c_iter, &matrixCell[0], INSERT_VALUES);
-    CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
-  } // for
-  PetscLogFlops(cellsCohesiveSize*numConstraintVert*spaceDim*spaceDim*4);
-  _needNewJacobian = false;
-} // integrateJacobianAssembled
-
-// ----------------------------------------------------------------------
-// Update state variables as needed.
-void
-pylith::faults::FaultCohesiveDynL::updateStateVars(
-				      const double t,
-				      topology::SolutionFields* const fields)
-{ // updateStateVars
-  assert(0 != fields);
-  assert(0 != _fields);
-
-} // updateStateVars
-
-// ----------------------------------------------------------------------
-// Constrain solution based on friction.
-void
-pylith::faults::FaultCohesiveDynL::constrainSolnSpace(
-				    topology::SolutionFields* const fields,
-				    const double t,
-				    const topology::Jacobian& jacobian)
-{ // constrainSolnSpace
-  assert(0 != fields);
-  assert(0 != _quadrature);
-  assert(0 != _fields);
-  assert(0 != _friction);
-
-  const int spaceDim = _quadrature->spaceDim();
-
-  // Allocate arrays for vertex values
-  double_array tractionTVertex(spaceDim);
-  double_array tractionTpdtVertex(spaceDim);
-  double_array slipTpdtVertex(spaceDim);
-  double_array lagrangeTpdtVertex(spaceDim);
-  double_array dLagrangeTpdtVertex(spaceDim);
-
-  // Get domain mesh and fault mesh
-  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-
-  // Get sections
-  double_array slipVertex(spaceDim);
-  const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
-  assert(!slipSection.isNull());
-
-  _updateSlipRate(*fields);
-  double_array slipRateVertex(spaceDim);
-  const ALE::Obj<RealSection>& slipRateSection =
-      _fields->get("slip rate").section();
-  assert(!slipRateSection.isNull());
-
-  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
-  assert(!areaSection.isNull());
-
-  double_array orientationVertex(spaceDim * spaceDim);
-  const ALE::Obj<RealSection>& orientationSection =
-      _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
-
-  double_array tractionInitialVertex(spaceDim);
-  const ALE::Obj<RealSection>& tractionInitialSection =
-      (0 != _dbInitialTract) ? _fields->get("initial traction").section() : 0;
-
-  double_array lagrangeTVertex(spaceDim);
-  const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
-  assert(!dispTSection.isNull());
-
-  double_array lagrangeTIncrVertex(spaceDim);
-  const ALE::Obj<RealSection>& dispTIncrSection = fields->get(
-    "dispIncr(t->t+dt)").section();
-  assert(!dispTIncrSection.isNull());
-
-  double_array jacobianVertex(2 * spaceDim);
-  const ALE::Obj<RealSection>& jacobianSection = _fields->get(
-    "Jacobian diagonal").section();
-  assert(!jacobianSection.isNull());
-  _updateJacobianDiagonal(*fields);
-
-  slipSection->view("SLIP");
-  areaSection->view("AREA");
-  if (0 != _dbInitialTract)
-    tractionInitialSection->view("INITIAL TRACTION");
-  dispTSection->view("DISP (t)");
-  dispTIncrSection->view("DISP INCR (t->t+dt)");
-
-  // Get mesh and fault vertices and renumbering
-  const ALE::Obj<SieveMesh::label_sequence>& vertices =
-      sieveMesh->depthStratum(0);
-  assert(!vertices.isNull());
-  const SieveSubMesh::label_sequence::iterator verticesBegin =
-      vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-  SieveSubMesh::renumbering_type& renumbering =
-      faultSieveMesh->getRenumbering();
-  const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
-      renumbering.end();
-
-  for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-      != verticesEnd; ++v_iter)
-    if (renumbering.find(*v_iter) != renumberingEnd) {
-      const int vertexFault = renumbering[*v_iter];
-      const int vertexMesh = *v_iter;
-
-      // Get slip
-      slipSection->restrictPoint(vertexFault, &slipVertex[0], slipVertex.size());
-
-      // Get slip rate
-      slipRateSection->restrictPoint(vertexFault, &slipRateVertex[0],
-        slipRateVertex.size());
-
-      // Get total fault area asssociated with vertex (assembled over all cells)
-      const double* areaVertex = areaSection->restrictPoint(vertexFault);
-      assert(0 != areaVertex);
-      assert(1 == areaSection->getFiberDimension(vertexFault));
-
-      // Get fault orientation
-      orientationSection->restrictPoint(vertexFault, &orientationVertex[0],
-        orientationVertex.size());
-
-      // Get diagonal of Jacobian at conventional vertices i and j
-      // associated with Lagrange vertex k
-      jacobianSection->restrictPoint(vertexFault, &jacobianVertex[0],
-        jacobianVertex.size());
-
-      // Get initial fault tractions
-      if (0 != _dbInitialTract) {
-        assert(!tractionInitialSection.isNull());
-        tractionInitialSection->restrictPoint(vertexFault,
-          &tractionInitialVertex[0], tractionInitialVertex.size());
-      } // if
-
-      // Get Lagrange multiplier values from disp(t), and dispIncr(t->t+dt)
-      dispTSection->restrictPoint(vertexMesh, &lagrangeTVertex[0],
-        lagrangeTVertex.size());
-      dispTIncrSection->restrictPoint(vertexMesh, &lagrangeTIncrVertex[0],
-        lagrangeTIncrVertex.size());
-
-      // Compute Lagrange multiplier at time t+dt
-      lagrangeTpdtVertex = lagrangeTVertex + lagrangeTIncrVertex;
-      dLagrangeTpdtVertex = 0.0;
-
-      // :KLUDGE: Solution at Lagrange constraint vertices is the
-      // Lagrange multiplier value, which is currently the force.
-      // Compute traction by dividing force by area
-      assert(*areaVertex > 0);
-      tractionTVertex = lagrangeTVertex / (*areaVertex);
-      tractionTpdtVertex = lagrangeTpdtVertex / (*areaVertex);
-
-      // Get friction properties and state variables.
-      _friction->retrievePropsAndVars(vertexFault);
-
-      // Use fault constitutive model to compute traction associated with
-      // friction.
-      switch (spaceDim) { // switch
-      case 1: { // case 1
-        // Sensitivity of slip to changes in the Lagrange multipliers
-        // Aixjx = 1.0/Aix + 1.0/Ajx
-        const double Aixjx = 1.0 / jacobianVertex[0] + 1.0
-            / jacobianVertex[spaceDim + 0];
-        const double Spp = 1.0;
-
-        if (tractionTpdtVertex[0] + tractionInitialVertex[0] < 0) {
-          // if compression, then no changes to solution
-        } else {
-          // if tension, then traction is zero.
-
-          // Update slip based on value required to stick versus
-          // zero traction
-          dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
-          slipVertex[0] += Spp * dLagrangeTpdtVertex[0];
-
-          // Set traction to zero.
-          tractionTpdtVertex[0] = 0.0;
-        } // else
-        break;
-      } // case 1
-      case 2: { // case 2
-        std::cout << "Normal traction:" << tractionTpdtVertex[1]
-            + tractionInitialVertex[1] << std::endl;
-
-        // Sensitivity of slip to changes in the Lagrange multipliers
-        // Aixjx = 1.0/Aix + 1.0/Ajx
-        assert(jacobianVertex[0] > 0.0);
-        assert(jacobianVertex[spaceDim+0] > 0.0);
-        const double Aixjx = 1.0 / jacobianVertex[0] + 1.0
-            / jacobianVertex[spaceDim + 0];
-        // Aiyjy = 1.0/Aiy + 1.0/Ajy
-        assert(jacobianVertex[1] > 0.0);
-        assert(jacobianVertex[spaceDim+1] > 0.0);
-        const double Aiyjy = 1.0 / jacobianVertex[1] + 1.0
-            / jacobianVertex[spaceDim + 1];
-        const double Cpx = orientationVertex[0];
-        const double Cpy = orientationVertex[1];
-        const double Cqx = orientationVertex[2];
-        const double Cqy = orientationVertex[3];
-        const double Spp = Cpx * Cpx * Aixjx + Cpy * Cpy * Aiyjy;
-        const double Spq = Cpx * Cqx * Aixjx + Cpy * Cqy * Aiyjy;
-        const double Sqq = Cqx * Cqx * Aixjx + Cqy * Cqy * Aiyjy;
-
-        const double tractionNormal = tractionTpdtVertex[1]
-            + tractionInitialVertex[1];
-        const double slip = slipVertex[0];
-        const double slipRate = slipRateVertex[0];
-
-        if (tractionTpdtVertex[1] + tractionInitialVertex[1] < 0 && 0
-            == slipVertex[1]) {
-          // if in compression and no opening
-          std::cout << "FAULT IN COMPRESSION" << std::endl;
-          const double frictionStress = _friction->calcFriction(slip, slipRate,
-            tractionNormal);
-          std::cout << "frictionStress: " << frictionStress << std::endl;
-          if (tractionTpdtVertex[0] > frictionStress || (tractionTpdtVertex[0]
-              < frictionStress && slipVertex[0] > 0.0)) {
-            // traction is limited by friction, so have sliding
-            std::cout << "LIMIT TRACTION, HAVE SLIDING" << std::endl;
-
-            // Update slip based on value required to stick versus friction
-            dLagrangeTpdtVertex[0] = (tractionTpdtVertex[0] - frictionStress)
-                * (*areaVertex);
-            slipVertex[0] += Spp * dLagrangeTpdtVertex[0];
-            std::cout << "Estimated slip: " << slipVertex[0] << std::endl;
-            // Limit traction
-            tractionTpdtVertex[0] = frictionStress;
-          } else {
-            // else friction exceeds value necessary, so stick
-            std::cout << "STICK" << std::endl;
-            // no changes to solution
-          } // if/else
-        } else {
-          // if in tension, then traction is zero.
-          std::cout << "FAULT IN TENSION" << std::endl;
-
-          // Update slip based on value required to stick versus
-          // zero traction
-          dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
-          dLagrangeTpdtVertex[1] = tractionTpdtVertex[1] * (*areaVertex);
-          slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
-              * dLagrangeTpdtVertex[1];
-          slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
-              * dLagrangeTpdtVertex[1];
-
-          // Set traction to zero
-          tractionTpdtVertex = 0.0;
-        } // else
-        break;
-      } // case 2
-      case 3: { // case 3
-        std::cout << "Normal traction:" << tractionTpdtVertex[2]
-            + tractionInitialVertex[2] << std::endl;
-
-        // Sensitivity of slip to changes in the Lagrange multipliers
-        // Aixjx = 1.0/Aix + 1.0/Ajx
-        assert(jacobianVertex[0] > 0.0);
-        assert(jacobianVertex[spaceDim+0] > 0.0);
-        const double Aixjx = 1.0 / jacobianVertex[0] + 1.0
-            / jacobianVertex[spaceDim + 0];
-        // Aiyjy = 1.0/Aiy + 1.0/Ajy
-        assert(jacobianVertex[1] > 0.0);
-        assert(jacobianVertex[spaceDim+1] > 0.0);
-        const double Aiyjy = 1.0 / jacobianVertex[1] + 1.0
-            / jacobianVertex[spaceDim + 1];
-        // Aizjz = 1.0/Aiz + 1.0/Ajz
-        assert(jacobianVertex[2] > 0.0);
-        assert(jacobianVertex[spaceDim+2] > 0.0);
-        const double Aizjz = 1.0 / jacobianVertex[2] + 1.0
-            / jacobianVertex[spaceDim + 2];
-        const double Cpx = orientationVertex[0];
-        const double Cpy = orientationVertex[1];
-        const double Cpz = orientationVertex[2];
-        const double Cqx = orientationVertex[3];
-        const double Cqy = orientationVertex[4];
-        const double Cqz = orientationVertex[5];
-        const double Crx = orientationVertex[6];
-        const double Cry = orientationVertex[7];
-        const double Crz = orientationVertex[8];
-        const double Spp = Cpx * Cpx * Aixjx + Cpy * Cpy * Aiyjy + Cpz * Cpz
-            * Aizjz;
-        const double Spq = Cpx * Cqx * Aixjx + Cpy * Cqy * Aiyjy + Cpz * Cqz
-            * Aizjz;
-        const double Spr = Cpx * Crx * Aixjx + Cpy * Cry * Aiyjy + Cpz * Crz
-            * Aizjz;
-        const double Sqq = Cqx * Cqx * Aixjx + Cqy * Cqy * Aiyjy + Cqz * Cqz
-            * Aizjz;
-        const double Sqr = Cqx * Crx * Aixjx + Cqy * Cry * Aiyjy + Cqz * Crz
-            * Aizjz;
-        const double Srr = Crx * Crx * Aixjx + Cry * Cry * Aiyjy + Crz * Crz
-            * Aizjz;
-
-        double slip = sqrt(pow(slipVertex[1], 2) + pow(slipVertex[0], 2));
-        double slipRate = sqrt(pow(slipRateVertex[1], 2) + pow(
-          slipRateVertex[0], 2));
-
-        double tractionNormalVertex;
-        double tractionShearVertex;
-        double slipShearVertex;
-
-        tractionNormalVertex = tractionTpdtVertex[2] + tractionInitialVertex[2];
-        tractionShearVertex = sqrt(pow(tractionTpdtVertex[1], 2) + pow(
-          tractionTpdtVertex[0], 2));
-        slipShearVertex = sqrt(pow(slipVertex[1], 2) + pow(slipVertex[0], 2));
-
-        if (tractionNormalVertex < 0 && 0 == slipVertex[2]) {
-          // if in compression and no opening
-          std::cout << "FAULT IN COMPRESSION" << std::endl;
-          const double frictionStress = _friction->calcFriction(slip, slipRate,
-            tractionNormalVertex);
-          std::cout << "frictionStress: " << frictionStress << std::endl;
-          if (tractionShearVertex > frictionStress || (tractionShearVertex
-              < frictionStress && slipShearVertex > 0.0)) {
-            // traction is limited by friction, so have sliding
-            std::cout << "LIMIT TRACTION, HAVE SLIDING" << std::endl;
-
-            // Update slip based on value required to stick versus friction
-            dLagrangeTpdtVertex[0] = (tractionShearVertex - frictionStress)
-                * tractionTpdtVertex[0] / tractionShearVertex * (*areaVertex);
-            dLagrangeTpdtVertex[1] = (tractionShearVertex - frictionStress)
-                * tractionTpdtVertex[1] / tractionShearVertex * (*areaVertex);
-            slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
-                * dLagrangeTpdtVertex[1];
-
-            slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
-                * dLagrangeTpdtVertex[1];
-
-            std::cout << "Estimated slip: " << "  " << slipVertex[0] << "  "
-                << slipVertex[1] << "  " << slipVertex[2] << std::endl;
-
-            // Limit traction
-            tractionTpdtVertex[0] = frictionStress * tractionTpdtVertex[0]
-                / tractionShearVertex;
-            tractionTpdtVertex[1] = frictionStress * tractionTpdtVertex[1]
-                / tractionShearVertex;
-          } else {
-            // else friction exceeds value necessary, so stick
-            std::cout << "STICK" << std::endl;
-            // no changes to solution
-          } // if/else
-        } else {
-          // if in tension, then traction is zero.
-          std::cout << "FAULT IN TENSION" << std::endl;
-
-          // Update slip based on value required to stick versus
-          // zero traction
-          dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
-          dLagrangeTpdtVertex[1] = tractionTpdtVertex[1] * (*areaVertex);
-          dLagrangeTpdtVertex[2] = tractionTpdtVertex[2] * (*areaVertex);
-          slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
-              * dLagrangeTpdtVertex[1] + Spr * dLagrangeTpdtVertex[2];
-          slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
-              * dLagrangeTpdtVertex[1] + Sqr * dLagrangeTpdtVertex[2];
-          slipVertex[2] += Spr * dLagrangeTpdtVertex[0] + Sqr
-              * dLagrangeTpdtVertex[1] + Srr * dLagrangeTpdtVertex[2];
-
-          std::cout << "Estimated slip: " << "  " << slipVertex[0] << "  "
-              << slipVertex[1] << "  " << slipVertex[2] << std::endl;
-
-          // Set traction to zero
-          tractionTpdtVertex = 0.0;
-        } // else
-        break;
-      } // case 3
-      default:
-        assert(0);
-      } // switch
-      // TEMPORARY END
-
-      // Update Lagrange multiplier values.
-      // :KLUDGE: (TEMPORARY) Solution at Lagrange constraint vertices
-      // is the Lagrange multiplier value, which is currently the
-      // force.  Compute force by multipling traction by area
-      lagrangeTIncrVertex = (tractionTpdtVertex - tractionTVertex)
-          * (*areaVertex);
-      assert(lagrangeTIncrVertex.size() ==
-          dispTIncrSection->getFiberDimension(vertexMesh));
-      dispTIncrSection->updatePoint(vertexMesh, &lagrangeTIncrVertex[0]);
-
-      // Update the slip estimate based on adjustment to the Lagrange
-      // multiplier values.
-      assert(slipVertex.size() ==
-          slipSection->getFiberDimension(vertexFault));
-      slipSection->updatePoint(vertexFault, &slipVertex[0]);
-    } // if
-
-  dispTIncrSection->view("AFTER DISP INCR (t->t+dt)");
-  slipSection->view("AFTER SLIP");
-
-  // FIX THIS
-  PetscLogFlops(0);
-} // constrainSolnSpace
-
-// ----------------------------------------------------------------------
-// Verify configuration is acceptable.
-void
-pylith::faults::FaultCohesiveDynL::verifyConfiguration(const topology::Mesh& mesh) const
-{ // verifyConfiguration
-  assert(0 != _quadrature);
-
-  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
-  assert(!sieveMesh.isNull());
-
-  if (!sieveMesh->hasIntSection(label())) {
-    std::ostringstream msg;
-    msg << "Mesh missing group of vertices '" << label()
-        << " for boundary condition.";
-    throw std::runtime_error(msg.str());
-  } // if
-
-  // check compatibility of mesh and quadrature scheme
-  const int dimension = mesh.dimension() - 1;
-  if (_quadrature->cellDim() != dimension) {
-    std::ostringstream msg;
-    msg << "Dimension of reference cell in quadrature scheme ("
-        << _quadrature->cellDim()
-        << ") does not match dimension of cells in mesh (" << dimension
-        << ") for fault '" << label() << "'.";
-    throw std::runtime_error(msg.str());
-  } // if
-
-  const int numCorners = _quadrature->refGeometry().numCorners();
-  const ALE::Obj<SieveMesh::label_sequence>& cells =
-      sieveMesh->getLabelStratum("material-id", id());
-  assert(!cells.isNull());
-  const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
-  const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
-  for (SieveMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
-      != cellsEnd; ++c_iter) {
-    const int cellNumCorners = sieveMesh->getNumCellCorners(*c_iter);
-    if (3 * numCorners != cellNumCorners) {
-      std::ostringstream msg;
-      msg << "Number of vertices in reference cell (" << numCorners
-          << ") is not compatible with number of vertices (" << cellNumCorners
-          << ") in cohesive cell " << *c_iter << " for fault '" << label()
-          << "'.";
-      throw std::runtime_error(msg.str());
-    } // if
-  } // for
-} // verifyConfiguration
-
-// ----------------------------------------------------------------------
-// Get vertex field associated with integrator.
-const pylith::topology::Field<pylith::topology::SubMesh>&
-pylith::faults::FaultCohesiveDynL::vertexField(const char* name,
-                                               const topology::SolutionFields* fields)
-{ // vertexField
-  assert(0 != _faultMesh);
-  assert(0 != _quadrature);
-  assert(0 != _normalizer);
-  assert(0 != _fields);
-  assert(0 != _friction);
-
-  const int cohesiveDim = _faultMesh->dimension();
-  const int spaceDim = _quadrature->spaceDim();
-
-  const int slipStrLen = strlen("final_slip");
-  const int timeStrLen = strlen("slip_time");
-
-  double scale = 0.0;
-  int fiberDim = 0;
-  if (0 == strcasecmp("slip", name)) {
-    const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-    return slip;
-
-  } else if (cohesiveDim > 0 && 0 == strcasecmp("strike_dir", name)) {
-    const ALE::Obj<RealSection>& orientationSection = _fields->get(
-      "orientation").section();
-    assert(!orientationSection.isNull());
-    const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
-      0);
-    assert(!dirSection.isNull());
-    _allocateBufferVertexVectorField();
-    topology::Field<topology::SubMesh>& buffer =
-        _fields->get("buffer (vector)");
-    buffer.copy(dirSection);
-    buffer.label("strike_dir");
-    buffer.scale(1.0);
-    return buffer;
-
-  } else if (2 == cohesiveDim && 0 == strcasecmp("dip_dir", name)) {
-    const ALE::Obj<RealSection>& orientationSection = _fields->get(
-      "orientation").section();
-    assert(!orientationSection.isNull());
-    const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
-      1);
-    _allocateBufferVertexVectorField();
-    topology::Field<topology::SubMesh>& buffer =
-        _fields->get("buffer (vector)");
-    buffer.copy(dirSection);
-    buffer.label("dip_dir");
-    buffer.scale(1.0);
-    return buffer;
-
-  } else if (0 == strcasecmp("normal_dir", name)) {
-    const ALE::Obj<RealSection>& orientationSection = _fields->get(
-      "orientation").section();
-    assert(!orientationSection.isNull());
-    const int space = (0 == cohesiveDim) ? 0 : (1 == cohesiveDim) ? 1 : 2;
-    const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
-      space);
-    assert(!dirSection.isNull());
-    _allocateBufferVertexVectorField();
-    topology::Field<topology::SubMesh>& buffer =
-        _fields->get("buffer (vector)");
-    buffer.copy(dirSection);
-    buffer.label("normal_dir");
-    buffer.scale(1.0);
-    return buffer;
-
-  } else if (0 == strncasecmp("initial_traction", name, slipStrLen)) {
-    assert(0 != _dbInitialTract);
-    const topology::Field<topology::SubMesh>& initialTraction = _fields->get(
-      "initial traction");
-    return initialTraction;
-
-  } else if (0 == strcasecmp("traction", name)) {
-    assert(0 != fields);
-    const topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
-    _allocateBufferVertexVectorField();
-    topology::Field<topology::SubMesh>& buffer =
-        _fields->get("buffer (vector)");
-    _calcTractions(&buffer, dispT);
-    return buffer;
-
-  } else {
-    std::ostringstream msg;
-    msg << "Request for unknown vertex field '" << name << "' for fault '"
-        << label() << "'.";
-    throw std::runtime_error(msg.str());
-  } // else
-
-
-  // Satisfy return values
-  assert(0 != _fields);
-  const topology::Field<topology::SubMesh>& buffer = _fields->get(
-    "buffer (vector)");
-  return buffer;
-} // vertexField
-
-// ----------------------------------------------------------------------
-// Get cell field associated with integrator.
-const pylith::topology::Field<pylith::topology::SubMesh>&
-pylith::faults::FaultCohesiveDynL::cellField(const char* name,
-                                             const topology::SolutionFields* fields) { // cellField
-  // Should not reach this point if requested field was found
-  std::ostringstream msg;
-  msg << "Request for unknown cell field '" << name << "' for fault '"
-      << label() << ".";
-  throw std::runtime_error(msg.str());
-
-  // Satisfy return values
-  assert(0 != _fields);
-  const topology::Field<topology::SubMesh>& buffer = _fields->get(
-    "buffer (vector)");
-  return buffer;
-} // cellField
-
-// ----------------------------------------------------------------------
-// Calculate orientation at fault vertices.
-void
-pylith::faults::FaultCohesiveDynL::_calcOrientation(const double upDir[3],
-                                                         const double normalDir[3])
-{ // _calcOrientation
-  assert(0 != upDir);
-  assert(0 != normalDir);
-  assert(0 != _faultMesh);
-  assert(0 != _fields);
-
-  double_array upDirArray(upDir, 3);
-
-  // Get vertices in fault mesh.
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-      faultSieveMesh->depthStratum(0);
-  const SieveSubMesh::label_sequence::iterator verticesBegin =
-      vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-  // Containers for orientation information.
-  const int cohesiveDim = _faultMesh->dimension();
-  const int numBasis = _quadrature->numBasis();
-  const int spaceDim = _quadrature->spaceDim();
-  const int orientationSize = spaceDim * spaceDim;
-  const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
-  const double_array& verticesRef = cellGeometry.vertices();
-  const int jacobianSize = (cohesiveDim > 0) ? spaceDim * cohesiveDim : 1;
-  const double_array& quadWts = _quadrature->quadWts();
-  double_array jacobian(jacobianSize);
-  double jacobianDet = 0;
-  double_array orientationVertex(orientationSize);
-  double_array coordinatesCell(numBasis * spaceDim);
-  double_array refCoordsVertex(cohesiveDim);
-
-  // Allocate orientation field.
-  _fields->add("orientation", "orientation");
-  topology::Field<topology::SubMesh>& orientation = _fields->get("orientation");
-  const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  orientation.newSection(slip, orientationSize);
-  const ALE::Obj<RealSection>& orientationSection = orientation.section();
-  assert(!orientationSection.isNull());
-  // Create subspaces for along-strike, up-dip, and normal directions
-  for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
-    orientationSection->addSpace();
-  for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
-    orientationSection->setFiberDimension(vertices, spaceDim, iDim);
-  orientation.allocate();
-  orientation.zero();
-
-  // Get fault cells.
-  const ALE::Obj<SieveSubMesh::label_sequence>& cells =
-      faultSieveMesh->heightStratum(0);
-  assert(!cells.isNull());
-  const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
-  const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
-
-  // Compute orientation of fault at constraint vertices
-
-  // Get section containing coordinates of vertices
-  const ALE::Obj<RealSection>& coordinatesSection =
-      faultSieveMesh->getRealSection("coordinates");
-  assert(!coordinatesSection.isNull());
-  topology::Mesh::RestrictVisitor coordinatesVisitor(*coordinatesSection,
-    coordinatesCell.size(), &coordinatesCell[0]);
-
-  // Set orientation function
-  assert(cohesiveDim == _quadrature->cellDim());
-  assert(spaceDim == _quadrature->spaceDim());
-
-  // Loop over cohesive cells, computing orientation weighted by
-  // jacobian at constraint vertices
-
-  const ALE::Obj<SieveSubMesh::sieve_type>& sieve = faultSieveMesh->getSieve();
-  assert(!sieve.isNull());
-  typedef ALE::SieveAlg<SieveSubMesh> SieveAlg;
-
-  ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type>
-      ncV(*sieve, (size_t) pow(sieve->getMaxConeSize(), std::max(0,
-        faultSieveMesh->depth())));
-
-  for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
-      != cellsEnd; ++c_iter) {
-    // Get orientations at fault cell's vertices.
-    coordinatesVisitor.clear();
-    faultSieveMesh->restrictClosure(*c_iter, coordinatesVisitor);
-
-    ncV.clear();
-    ALE::ISieveTraversal<SieveSubMesh::sieve_type>::orientedClosure(*sieve,
-      *c_iter, ncV);
-    const int coneSize = ncV.getSize();
-    const Mesh::point_type *cone = ncV.getPoints();
-
-    for (int v = 0; v < coneSize; ++v) {
-      // Compute Jacobian and determinant of Jacobian at vertex
-      memcpy(&refCoordsVertex[0], &verticesRef[v * cohesiveDim], cohesiveDim
-          * sizeof(double));
-      cellGeometry.jacobian(&jacobian, &jacobianDet, coordinatesCell,
-        refCoordsVertex);
-
-      // Compute orientation
-      cellGeometry.orientation(&orientationVertex, jacobian, jacobianDet,
-        upDirArray);
-
-      // Update orientation
-      orientationSection->updateAddPoint(cone[v], &orientationVertex[0]);
-    } // for
-  } // for
-
-  //orientation.view("ORIENTATION BEFORE COMPLETE");
-
-  // Assemble orientation information
-  orientation.complete();
-
-  // Loop over vertices, make orientation information unit magnitude
-  double_array vertexDir(orientationSize);
-  int count = 0;
-  for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-      != verticesEnd; ++v_iter, ++count) {
-    orientationVertex = 0.0;
-    orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
-      orientationVertex.size());
-    for (int iDim = 0; iDim < spaceDim; ++iDim) {
-      double mag = 0;
-      for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
-        mag += pow(orientationVertex[index + jDim], 2);
-      mag = sqrt(mag);
-      assert(mag > 0.0);
-      for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
-        orientationVertex[index + jDim] /= mag;
-    } // for
-
-    orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
-  } // for
-  PetscLogFlops(count * orientationSize * 4);
-
-  if (2 == cohesiveDim && vertices->size() > 0) {
-    // Check orientation of first vertex, if dot product of fault
-    // normal with preferred normal is negative, flip up/down dip
-    // direction.
-    //
-    // If the user gives the correct normal direction (points from
-    // footwall to ahanging wall), we should end up with
-    // left-lateral-slip, reverse-slip, and fault-opening for positive
-    // slip values.
-    //
-    // When we flip the up/down dip direction, we create a left-handed
-    // strike/dip/normal coordinate system, but it gives the correct
-    // sense of slip. In reality the strike/dip/normal directions that
-    // are used are the opposite of what we would want, but we cannot
-    // flip the fault normal direction because it is tied to how the
-    // cohesive cells are created.
-
-    assert(vertices->size() > 0);
-    orientationSection->restrictPoint(*vertices->begin(),
-      &orientationVertex[0], orientationVertex.size());
-
-    assert(3 == spaceDim);
-    double_array normalDirVertex(&orientationVertex[6], 3);
-    const double normalDot = normalDir[0] * normalDirVertex[0] + normalDir[1]
-        * normalDirVertex[1] + normalDir[2] * normalDirVertex[2];
-
-    const int istrike = 0;
-    const int idip = 3;
-    const int inormal = 6;
-    if (normalDot < 0.0) {
-      // Flip dip direction
-      for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-          != verticesEnd; ++v_iter) {
-        orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
-          orientationVertex.size());
-        assert(9 == orientationSection->getFiberDimension(*v_iter));
-        for (int iDim = 0; iDim < 3; ++iDim) // flip dip
-          orientationVertex[idip + iDim] *= -1.0;
-
-        // Update direction
-        orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
-      } // for
-      PetscLogFlops(5 + count * 3);
-    } // if
-  } // if
-
-  //orientation.view("ORIENTATION");
-} // _calcOrientation
-
-// ----------------------------------------------------------------------
-void pylith::faults::FaultCohesiveDynL::_calcArea(void) { // _calcArea
-  assert(0 != _faultMesh);
-  assert(0 != _fields);
-
-  // Containers for area information
-  const int cellDim = _quadrature->cellDim();
-  const int numBasis = _quadrature->numBasis();
-  const int numQuadPts = _quadrature->numQuadPts();
-  const int spaceDim = _quadrature->spaceDim();
-  const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
-  const double_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
-  double jacobianDet = 0;
-  double_array areaCell(numBasis);
-
-  // Get vertices in fault mesh.
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-      faultSieveMesh->depthStratum(0);
-  const SieveSubMesh::label_sequence::iterator verticesBegin =
-      vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-  // Allocate area field.
-  _fields->add("area", "area");
-
-  topology::Field<topology::SubMesh>& area = _fields->get("area");
-  const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  area.newSection(slip, 1);
-  area.allocate();
-  area.zero();
-  const ALE::Obj<RealSection>& areaSection = area.section();
-  assert(!areaSection.isNull());
-  topology::Mesh::UpdateAddVisitor areaVisitor(*areaSection, &areaCell[0]);
-
-  double_array coordinatesCell(numBasis * spaceDim);
-  const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
-    "coordinates");
-  assert(!coordinates.isNull());
-  topology::Mesh::RestrictVisitor coordsVisitor(*coordinates,
-    coordinatesCell.size(), &coordinatesCell[0]);
-
-  const ALE::Obj<SieveSubMesh::label_sequence>& cells =
-      faultSieveMesh->heightStratum(0);
-  assert(!cells.isNull());
-  const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
-  const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
-
-  // Loop over cells in fault mesh, compute area
-  for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
-      != cellsEnd; ++c_iter) {
-    areaCell = 0.0;
-
-    // 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
-
-    // Get cell geometry information that depends on cell
-    const double_array& basis = _quadrature->basis();
-    const double_array& jacobianDet = _quadrature->jacobianDet();
-
-    // Compute area
-    for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
-      const double wt = quadWts[iQuad] * jacobianDet[iQuad];
-      for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
-        const double dArea = wt * basis[iQuad * numBasis + iBasis];
-        areaCell[iBasis] += dArea;
-      } // for
-    } // for
-    areaVisitor.clear();
-    faultSieveMesh->updateClosure(*c_iter, areaVisitor);
-
-    PetscLogFlops( numQuadPts*(1+numBasis*2) );
-  } // for
-
-  // Assemble area information
-  area.complete();
-
-#if 0 // DEBUGGING
-  area.view("AREA");
-  //_faultMesh->getSendOverlap()->view("Send fault overlap");
-  //_faultMesh->getRecvOverlap()->view("Receive fault overlap");
-#endif
-} // _calcArea
-
-// ----------------------------------------------------------------------
-// Compute change in tractions on fault surface using solution.
-// NOTE: We must convert vertex labels to fault vertex labels
-void
-pylith::faults::FaultCohesiveDynL::_calcTractions(topology::Field<
-    topology::SubMesh>* tractions, const topology::Field<topology::Mesh>& dispT)
-{ // _calcTractionsChange
-  assert(0 != tractions);
-  assert(0 != _faultMesh);
-  assert(0 != _fields);
-  assert(0 != _normalizer);
-
-  // Get vertices from mesh of domain.
-  const ALE::Obj<SieveMesh>& sieveMesh = dispT.mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& vertices =
-      sieveMesh->depthStratum(0);
-  assert(!vertices.isNull());
-  const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
-  const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-  // Get fault vertices
-  const ALE::Obj<SieveMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<SieveSubMesh::label_sequence>& fvertices =
-      faultSieveMesh->depthStratum(0);
-  const SieveSubMesh::label_sequence::iterator fverticesBegin =
-      fvertices->begin();
-  const SieveSubMesh::label_sequence::iterator fverticesEnd = fvertices->end();
-
-  // Get sections.
-  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
-  assert(!areaSection.isNull());
-  const ALE::Obj<RealSection>& dispTSection = dispT.section();
-  assert(!dispTSection.isNull());
-
-  // Fiber dimension of tractions matches spatial dimension.
-  const int fiberDim = _quadrature->spaceDim();
-  double_array tractionsVertex(fiberDim);
-
-  // Allocate buffer for tractions field (if nec.).
-  const ALE::Obj<RealSection>& tractionsSection = tractions->section();
-  if (tractionsSection.isNull()) {
-    ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
-    //logger.stagePush("Fault");
-
-    const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-    tractions->newSection(slip, fiberDim);
-    tractions->allocate();
-
-    //logger.stagePop();
-  } // if
-  assert(!tractionsSection.isNull());
-  const double pressureScale = _normalizer->pressureScale();
-  tractions->label("traction");
-  tractions->scale(pressureScale);
-  tractions->zero();
-
-  // Set tractions to initial tractions if they exist
-  if (0 != _dbInitialTract) {
-    const ALE::Obj<RealSection>& initialTractionSection = _fields->get(
-      "initial traction").section();
-    assert(!initialTractionSection.isNull());
-    for (SubMesh::label_sequence::iterator v_iter = fverticesBegin; v_iter
-        != fverticesEnd; ++v_iter) {
-      initialTractionSection->restrictPoint(*v_iter, &tractionsVertex[0],
-        tractionsVertex.size());
-      assert(fiberDim == tractionsSection->getFiberDimension(*v_iter));
-      tractionsSection->updatePoint(*v_iter, &tractionsVertex[0]);
-    } // for
-  } // if
-
-  const int numFaultVertices = fvertices->size();
-  Mesh::renumbering_type& renumbering = faultSieveMesh->getRenumbering();
-  const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
-      renumbering.end();
-
-#if 0 // DEBUGGING, MOVE TO SEPARATE CHECK METHOD
-  // Check fault mesh and volume mesh coordinates
-  const ALE::Obj<RealSection>& coordinates = mesh->getRealSection("coordinates");
-  const ALE::Obj<RealSection>& fCoordinates = _faultMesh->getRealSection("coordinates");
-
-  for (Mesh::label_sequence::iterator v_iter = verticesBegin;
-      v_iter != verticesEnd;
-      ++v_iter) {
-    if (renumbering.find(*v_iter) != renumberingEnd) {
-      const int v = *v_iter;
-      const int dim = coordinates->getFiberDimension(*v_iter);
-      const double *a = coordinates->restrictPoint(*v_iter);
-      const int fv = renumbering[*v_iter];
-      const int fDim = fCoordinates->getFiberDimension(fv);
-      const double *fa = fCoordinates->restrictPoint(fv);
-
-      if (dim != fDim) throw ALE::Exception("Coordinate fiber dimensions do not match");
-      for(int d = 0; d < dim; ++d) {
-        if (a[d] != fa[d]) throw ALE::Exception("Coordinate values do not match");
-      }
-    }
-  }
-#endif
-
-  for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-      != verticesEnd; ++v_iter)
-    if (renumbering.find(*v_iter) != renumberingEnd) {
-      const int vertexMesh = *v_iter;
-      const int vertexFault = renumbering[*v_iter];
-      assert(fiberDim == dispTSection->getFiberDimension(vertexMesh));
-      assert(fiberDim == tractionsSection->getFiberDimension(vertexFault));
-      assert(1 == areaSection->getFiberDimension(vertexFault));
-
-      const double* dispTVertex = dispTSection->restrictPoint(vertexMesh);
-      assert(0 != dispTVertex);
-      const double* areaVertex = areaSection->restrictPoint(vertexFault);
-      assert(0 != areaVertex);
-
-      for (int i = 0; i < fiberDim; ++i)
-        tractionsVertex[i] = dispTVertex[i] / areaVertex[0];
-
-      tractionsSection->updatePointAllAdd(vertexFault, &tractionsVertex[0]);
-    } // if
-
-  PetscLogFlops(numFaultVertices * (1 + fiberDim) );
-
-#if 0 // DEBUGGING
-  tractions->view("TRACTIONS");
-#endif
-} // _calcTractions
-
-// ----------------------------------------------------------------------
-void
-pylith::faults::FaultCohesiveDynL::_getInitialTractions(void)
-{ // _getInitialTractions
-  assert(0 != _normalizer);
-  assert(0 != _quadrature);
-
-  const double pressureScale = _normalizer->pressureScale();
-  const double lengthScale = _normalizer->lengthScale();
-
-  const int spaceDim = _quadrature->spaceDim();
-  const int numQuadPts = _quadrature->numQuadPts();
-
-  if (0 != _dbInitialTract) { // Setup initial values, if provided.
-    // Create section to hold initial tractions.
-    _fields->add("initial traction", "initial_traction");
-    topology::Field<topology::SubMesh>& traction = _fields->get(
-      "initial traction");
-    topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-    traction.cloneSection(slip);
-    traction.scale(pressureScale);
-    const ALE::Obj<RealSection>& tractionSection = traction.section();
-    assert(!tractionSection.isNull());
-
-    _dbInitialTract->open();
-    switch (spaceDim) { // switch
-    case 1: {
-      const char* valueNames[] = { "traction-normal" };
-      _dbInitialTract->queryVals(valueNames, 1);
-      break;
-    } // case 1
-    case 2: {
-      const char* valueNames[] = { "traction-shear", "traction-normal" };
-      _dbInitialTract->queryVals(valueNames, 2);
-      break;
-    } // case 2
-    case 3: {
-      const char* valueNames[] = { "traction-shear-leftlateral",
-          "traction-shear-updip", "traction-normal" };
-      _dbInitialTract->queryVals(valueNames, 3);
-      break;
-    } // case 3
-    default:
-      std::cerr << "Bad spatial dimension '" << spaceDim << "'." << std::endl;
-      assert(0);
-      throw std::logic_error("Bad spatial dimension in Neumann.");
-    } // switch
-
-    // Get 'fault' vertices.
-    const ALE::Obj<SieveSubMesh>& faultSieveMesh = _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 int numBasis = _quadrature->numBasis();
-    const int spaceDim = _quadrature->spaceDim();
-
-    // Containers for database query results and quadrature coordinates in
-    // reference geometry.
-    double_array tractionVertex(spaceDim);
-    double_array coordsVertex(spaceDim);
-
-    // Get sections.
-    const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
-      "coordinates");
-    assert(!coordinates.isNull());
-    const spatialdata::geocoords::CoordSys* cs = _faultMesh->coordsys();
-
-    const double lengthScale = _normalizer->lengthScale();
-
-    // Loop over vertices in fault mesh and perform queries.
-    for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-        != verticesEnd; ++v_iter) {
-      coordinates->restrictPoint(*v_iter, &coordsVertex[0], coordsVertex.size());
-      // Dimensionalize coordinates
-      _normalizer->dimensionalize(&coordsVertex[0], coordsVertex.size(),
-        lengthScale);
-
-      tractionVertex = 0.0;
-      const int err = _dbInitialTract->query(&tractionVertex[0], spaceDim,
-        &coordsVertex[0], spaceDim, cs);
-      if (err) {
-        std::ostringstream msg;
-        msg << "Could not find initial tractions at (";
-        for (int i = 0; i < spaceDim; ++i)
-          msg << " " << coordsVertex[i];
-        msg << ") for dynamic fault interface " << label() << "\n"
-            << "using spatial database " << _dbInitialTract->label() << ".";
-        throw std::runtime_error(msg.str());
-      } // if
-
-      _normalizer->nondimensionalize(&tractionVertex[0], tractionVertex.size(),
-        pressureScale);
-
-      // Update section
-      assert(tractionVertex.size() == tractionSection->getFiberDimension(*v_iter));
-      tractionSection->updatePoint(*v_iter, &tractionVertex[0]);
-    } // for
-
-    _dbInitialTract->close();
-
-    //traction.view("INITIAL TRACTIONS"); // DEBUGGING
-  } // if
-} // _getInitialTractions
-
-// ----------------------------------------------------------------------
-// Update diagonal of Jacobian at conventional vertices i and j
-//  associated with Lagrange vertex k.
-void
-pylith::faults::FaultCohesiveDynL::_updateJacobianDiagonal(const topology::SolutionFields& fields)
-{ // _updateJacobianDiagonal
-  assert(0 != _fields);
-
-  // Get cohesive cells
-  const ALE::Obj<SieveMesh>& sieveMesh = fields.mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
-      sieveMesh->getLabelStratum("material-id", id());
-  assert(!cellsCohesive.isNull());
-  const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
-      cellsCohesive->begin();
-  const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
-      cellsCohesive->end();
-  const int cellsCohesiveSize = cellsCohesive->size();
-
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-
-  const int spaceDim = _quadrature->spaceDim();
-  const int numConstraintVert = _quadrature->numBasis();
-  const int numCorners = 3 * numConstraintVert; // cohesive cell
-
-  // Get section information
-  double_array jacobianDiagCell(numCorners * spaceDim);
-  const ALE::Obj<RealSection>& jacobianDiagSection = fields.get(
-    "Jacobian diagonal").section();
-  assert(!jacobianDiagSection.isNull());
-  topology::Mesh::RestrictVisitor jacobianDiagVisitor(*jacobianDiagSection,
-    jacobianDiagCell.size(), &jacobianDiagCell[0]);
-
-  double_array jacobianDiagFaultCell(numConstraintVert * 2 * spaceDim);
-  const ALE::Obj<RealSection>& jacobianDiagFaultSection = _fields->get(
-    "Jacobian diagonal").section();
-  topology::Mesh::UpdateAllVisitor jacobianDiagFaultVisitor(
-    *jacobianDiagFaultSection, &jacobianDiagFaultCell[0]);
-
-  for (SieveMesh::label_sequence::iterator c_iter = cellsCohesiveBegin; c_iter
-      != cellsCohesiveEnd; ++c_iter) {
-    const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-
-    jacobianDiagVisitor.clear();
-    sieveMesh->restrictClosure(*c_iter, jacobianDiagVisitor);
-
-    for (int iConstraint = 0, indexF = 0; iConstraint < numConstraintVert; ++iConstraint) {
-      // Blocks in cell matrix associated with normal cohesive
-      // vertices i and j and constraint vertex k
-      const int indexI = iConstraint;
-      const int indexJ = iConstraint + numConstraintVert;
-      const int indexK = iConstraint + 2 * numConstraintVert;
-
-      // Diagonal for vertex i
-      for (int iDim = 0; iDim < spaceDim; ++iDim) {
-        jacobianDiagFaultCell[indexF + iDim] = jacobianDiagCell[indexI
-            * spaceDim + iDim];
-        assert(jacobianDiagFaultCell[indexF+iDim] > 0.0);
-      } // for
-      indexF += spaceDim;
-
-      // Diagonal for vertex j
-      for (int iDim = 0; iDim < spaceDim; ++iDim) {
-        jacobianDiagFaultCell[indexF + iDim] = jacobianDiagCell[indexJ
-            * spaceDim + iDim];
-        assert(jacobianDiagFaultCell[indexF+iDim] > 0.0);
-      } // for
-      indexF += spaceDim;
-    } // for
-
-    // Insert cell contribution into
-    jacobianDiagFaultVisitor.clear();
-    faultSieveMesh->updateClosure(c_fault, jacobianDiagFaultVisitor);
-  } // for
-} // _updateJacobianDiagonal
-
-// ----------------------------------------------------------------------
-// Update slip rate associated with Lagrange vertex k corresponding
-// to diffential velocity between conventional vertices i and j.
-void
-pylith::faults::FaultCohesiveDynL::_updateSlipRate(const topology::SolutionFields& fields)
-{ // _updateSlipRate
-  assert(0 != _fields);
-
-  // Get cohesive cells
-  const ALE::Obj<SieveMesh>& sieveMesh = fields.mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
-      sieveMesh->getLabelStratum("material-id", id());
-  assert(!cellsCohesive.isNull());
-  const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
-      cellsCohesive->begin();
-  const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
-      cellsCohesive->end();
-  const int cellsCohesiveSize = cellsCohesive->size();
-
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-
-  const int spaceDim = _quadrature->spaceDim();
-  const int numConstraintVert = _quadrature->numBasis();
-  const int numCorners = 3 * numConstraintVert; // cohesive cell
-  const int orientationSize = spaceDim * spaceDim;
-
-  // Get section information
-  double_array velocityCell(numCorners * spaceDim);
-  const ALE::Obj<RealSection>& velocitySection =
-      fields.get("velocity(t)").section();
-  assert(!velocitySection.isNull());
-  topology::Mesh::RestrictVisitor velocityVisitor(*velocitySection,
-    velocityCell.size(), &velocityCell[0]);
-
-  double_array slipRateCell(numConstraintVert * spaceDim);
-  const ALE::Obj<RealSection>& slipRateSection =
-      _fields->get("slip rate").section();
-  topology::Mesh::UpdateAllVisitor slipRateVisitor(*slipRateSection,
-    &slipRateCell[0]);
-
-  // Get section information
-  double_array orientationCell(numConstraintVert * orientationSize);
-  const ALE::Obj<RealSection>& orientationSection =
-      _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
-  topology::Mesh::RestrictVisitor orientationVisitor(*orientationSection,
-    orientationCell.size(), &orientationCell[0]);
-
-  for (SieveMesh::label_sequence::iterator c_iter = cellsCohesiveBegin; c_iter
-      != cellsCohesiveEnd; ++c_iter) {
-    const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-    slipRateCell = 0.0;
-
-    velocityVisitor.clear();
-    sieveMesh->restrictClosure(*c_iter, velocityVisitor);
-
-    // Get orientations at fault cell's vertices.
-    orientationVisitor.clear();
-    faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
-
-    for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
-      // Blocks in cell matrix associated with normal cohesive
-      // vertices i and j and constraint vertex k
-      const int indexI = iConstraint;
-      const int indexJ = iConstraint + numConstraintVert;
-      const int indexK = iConstraint + 2 * numConstraintVert;
-
-      // Get orientation at constraint vertex
-      const double* orientationVertex = &orientationCell[iConstraint
-          * orientationSize];
-      assert(0 != orientationVertex);
-
-      // Velocity for vertex i.
-      for (int iDim = 0; iDim < spaceDim; ++iDim) {
-        for (int kDim = 0; kDim < spaceDim; ++kDim)
-          slipRateCell[iConstraint * spaceDim + iDim] -= velocityCell[indexI
-              * spaceDim + kDim] * -orientationVertex[kDim * spaceDim + iDim];
-      } // for
-
-      // Velocity for vertex j.
-      for (int iDim = 0; iDim < spaceDim; ++iDim) {
-        for (int kDim = 0; kDim < spaceDim; ++kDim)
-          slipRateCell[iConstraint * spaceDim + iDim] -= velocityCell[indexJ
-              * spaceDim + kDim] * +orientationVertex[kDim * spaceDim + iDim];
-      } // for
-
-    } // for
-
-    // Insert cell contribution into
-    slipRateVisitor.clear();
-    faultSieveMesh->updateClosure(c_fault, slipRateVisitor);
-  } // for
-
-  PetscLogFlops(cellsCohesiveSize*numConstraintVert*spaceDim*spaceDim*3);
-} // _updateSlipRate
-
-// ----------------------------------------------------------------------
-// Allocate buffer for vector field.
-void
-pylith::faults::FaultCohesiveDynL::_allocateBufferVertexVectorField(void)
-{ // _allocateBufferVertexVectorField
-  assert(0 != _fields);
-  if (_fields->hasField("buffer (vector)"))
-    return;
-
-  ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
-  logger.stagePush("Output");
-
-  // Create vector field; use same shape/chart as slip field.
-  assert(0 != _faultMesh);
-  _fields->add("buffer (vector)", "buffer");
-  topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (vector)");
-  const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  buffer.cloneSection(slip);
-  buffer.zero();
-
-  logger.stagePop();
-} // _allocateBufferVertexVectorField
-
-// ----------------------------------------------------------------------
-// Allocate buffer for scalar field.
-void
-pylith::faults::FaultCohesiveDynL::_allocateBufferVertexScalarField(void)
-{ // _allocateBufferVertexScalarField
-  assert(0 != _fields);
-  if (_fields->hasField("buffer (scalar)"))
-    return;
-
-  ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
-  logger.stagePush("Output");
-
-  // Create vector field; use same shape/chart as area field.
-  assert(0 != _faultMesh);
-  _fields->add("buffer (scalar)", "buffer");
-  topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (scalar)");
-  const topology::Field<topology::SubMesh>& area = _fields->get("area");
-  buffer.cloneSection(area);
-  buffer.zero();
-
-  logger.stagePop();
-} // _allocateBufferVertexScalarField
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,313 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/** @file libsrc/faults/FaultCohesiveDynL.hh
- *
- * @brief C++ implementation for a fault surface with spontaneous
- * (dynamic) slip implemented with cohesive elements.
- */
-
-#if !defined(pylith_faults_faultcohesivedynl_hh)
-#define pylith_faults_faultcohesivedynl_hh
-
-// Include directives ---------------------------------------------------
-#include "FaultCohesive.hh" // ISA FaultCohesive
-
-#include "pylith/friction/frictionfwd.hh" // HOLDSA Friction model
-
-#include "pylith/topology/SubMesh.hh" // ISA Integrator<Quadrature<SubMesh> >
-#include "pylith/feassemble/Quadrature.hh" // ISA Integrator<Quadrature>
-#include "pylith/feassemble/Integrator.hh" // ISA Integrator
-
-#include <string> // HASA std::string
-
-// FaultCohesiveDynL -----------------------------------------------------
-/**
- * @brief C++ implementation for a fault surface with spontaneous
- * (dynamic) slip implemented with cohesive elements.
- *
- * The fault constitutive model is implemented using Lagrange
- * multipliers. The constraints associated with stick/slip behavior
- * are associated with "constraint" vertices which sit between the
- * pair of vertices on each side of the fault.
- *
- * The ordering of vertices in a cohesive cell is the vertices on the
- * "negative" side of the fault, the corresponding entries on the
- * "positive" side of the fault, and then the corresponding constraint
- * vertices.
- *
- * The system without Lagrange multipliers is
- *
- * [A(t+dt)]{u(t+dt)} = {b(t+dt)}
- *
- * With Lagrange multipliers this system becomes
- *
- * [A(t+dt) C^T ]{ u(t+dt) } = {b(t+dt)}
- * [ C      0   ]{ L(t+dt) }   {D(t+dt)}
- *
- * where C is the matrix of Lagrange constraints, L is the vector of
- * Lagrange multiplies (internal forces in this case), and D is the
- * fault slip.
- *
- * We solve for the increment in the displacement field, so we rewrite
- * the system as
- *
- * [A(t+dt) C^T ]{ du(t) } = {b(t+dt)} - [A(t+dt) C^T ]{ u(t) }
- * [ C      0   ]{ dL(t) }   {D(t+dt)}   [ C      0   ]{ L(t) }
- * 
- * We form the residual as
- *
- * {r(t+dt)} = {b(t+dt)} - [A(t+dt) C^T ]{ u(t)+du(t) }
- *             {D(t+dt)}   [ C      0   ]{ L(t)+dL(t) }
- * 
- * The terms in the residual contributing to the DOF at the Lagrange
- * vertices are
- *
- * {r(t+dt)} = {D(t+dt)} - [C]{u(t)+dt(t)}
- *
- * The first term, {D(t+dt)}, does not involve integration over the
- * cohesive cells, so it does not require assembling over cohesive
- * cells or processors. We compute the term in
- * integrateResidualAssembled().
- *
- * The term in the residual contributing to the DOF at the
- * non-Lagrange vertices of the cohesive cells is
- *
- * {r(t+dt)} = -[C]^T{L(t)+dL(t)}
- *
- * We integrate the Lagrange multiplier term and the relative
- * displacement term over the cohesive cells, because this introduces
- * weighting of the orientation of the fault for the direction of slip
- * at the vertices of the cohesive cells.
- */
-class pylith::faults::FaultCohesiveDynL : public FaultCohesive
-{ // class FaultCohesiveDynL
-  friend class TestFaultCohesiveDynL; // unit testing
-
-  // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
-  /// Default constructor.
-  FaultCohesiveDynL(void);
-
-  /// Destructor.
-  virtual
-  ~FaultCohesiveDynL(void);
-
-  /// Deallocate PETSc and local data structures.
-  virtual
-  void deallocate(void);
-  
-  /** Sets the spatial database for the inital tractions.
-   *
-   * @param db spatial database for initial tractions
-   */
-  void dbInitialTract(spatialdata::spatialdb::SpatialDB* db);
-  
-  /** Set the friction (constitutive) model.
-   *
-   * @param model Fault constutive model.
-   */
-  void frictionModel(friction::FrictionModel* const model);
-
-  /** Initialize fault. Determine orientation and setup boundary
-   * condition parameters.
-   *
-   * @param mesh Finite-element mesh.
-   * @param upDir Direction perpendicular to along-strike direction that is 
-   *   not collinear with fault normal (usually "up" direction but could 
-   *   be up-dip direction; only applies to fault surfaces in a 3-D domain).
-   * @param normalDir General preferred direction for fault normal
-   *   (used to pick which of two possible normal directions for
-   *   interface; only applies to fault surfaces in a 3-D domain).
-   */
-  void initialize(const topology::Mesh& mesh,
-		  const double upDir[3],
-		  const double normalDir[3]);
-
-  /** Split solution field for separate preconditioning of normal DOF
-   * from DOF associated with Lagrange multipliers.
-   *
-   * @param field Solution field.
-   */
-  void splitField(topology::Field<topology::Mesh>* field);
-
-  /** Integrate contributions to residual term (r) for operator that
-   * require assembly across processors.
-   *
-   * @param residual Field containing values for residual
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  void integrateResidual(const topology::Field<topology::Mesh>& residual,
-			 const double t,
-			 topology::SolutionFields* const fields);
-
-  /** Integrate contributions to residual term (r) for operator that
-   * do not require assembly across cells, vertices, or processors.
-   *
-   * @param residual Field containing values for residual
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  void integrateResidualAssembled(const topology::Field<topology::Mesh>& residual,
-				  const double t,
-				  topology::SolutionFields* const fields);
-
-  /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator that do not require assembly across cells, vertices, or
-   * processors.
-   *
-   * @param jacobian Sparse matrix
-   * @param t Current time
-   * @param fields Solution fields
-   * @param mesh Finite-element mesh
-   */
-  void integrateJacobianAssembled(topology::Jacobian* jacobian,
-				  const double t,
-				  topology::SolutionFields* const fields);
-
-  /** Update state variables as needed.
-   *
-   * @param t Current time
-   * @param fields Solution fields
-   * @param mesh Finite-element mesh
-   */
-  void updateStateVars(const double t,
-		       topology::SolutionFields* const fields);
-
-  /** Constrain solution space based on friction.
-   *
-   * @param fields Solution fields.
-   * @param t Current time.
-   * @param jacobian Sparse matrix for system Jacobian.
-   */
-  void constrainSolnSpace(topology::SolutionFields* const fields,
-			  const double t,
-			  const topology::Jacobian& jacobian);
-
-  /** Verify configuration is acceptable.
-   *
-   * @param mesh Finite-element mesh
-   */
-  void verifyConfiguration(const topology::Mesh& mesh) const;
-
-  /** Get vertex field associated with integrator.
-   *
-   * @param name Name of cell field.
-   * @param fields Solution fields.
-   * @returns Vertex field.
-   */
-  const topology::Field<topology::SubMesh>&
-  vertexField(const char* name,
-	      const topology::SolutionFields* fields =0);
-
-  /** Get cell field associated with integrator.
-   *
-   * @param name Name of cell field.
-   * @param fields Solution fields.
-   * @returns Cell field.
-   */
-  const topology::Field<topology::SubMesh>&
-  cellField(const char* name,
-	    const topology::SolutionFields* fields =0);
-
-  /** Cohesive cells use Lagrange multiplier constraints?
-   *
-   * @returns True if implementation using Lagrange multiplier
-   * constraints, false otherwise.
-   */
-  bool useLagrangeConstraints(void) const;
-
-  /** Get fields associated with fault.
-   *
-   * @returns Fields associated with fault.
-   */
-  const topology::Fields<topology::Field<topology::SubMesh> >*
-  fields(void) const;
-
-  // PRIVATE METHODS ////////////////////////////////////////////////////
-private :
-
-  /** Calculate orientation at fault vertices.
-   *
-   * @param upDir Direction perpendicular to along-strike direction that is 
-   *   not collinear with fault normal (usually "up" direction but could 
-   *   be up-dip direction; only applies to fault surfaces in a 3-D domain).
-   * @param normalDir General preferred direction for fault normal
-   *   (used to pick which of two possible normal directions for
-   *   interface; only applies to fault surfaces in a 3-D domain).
-   */
-  void _calcOrientation(const double upDir[3],
-			const double normalDir[3]);
-
-  /// Calculate fault area field.
-  void _calcArea(void);
-
-  /** Get initial tractions using a spatial database.
-   */
-  void _getInitialTractions(void);
-
-  /** Update diagonal of Jacobian at conventional vertices i and j
-   *  associated with Lagrange vertex k.
-   *
-   * @param fields Solution fields.
-   */
-  void _updateJacobianDiagonal(const topology::SolutionFields& fields);
-
-  /** Update slip rate associated with Lagrange vertex k corresponding
-   * to diffential velocity between conventional vertices i and j.
-   *
-   * @param fields Solution fields.
-   */
-  void _updateSlipRate(const topology::SolutionFields& fields);
-
-  /** Compute change in tractions on fault surface using solution.
-   *
-   * @param tractions Field for tractions.
-   * @param solution Solution over domain
-   */
-  void _calcTractions(topology::Field<topology::SubMesh>* tractions,
-		      const topology::Field<topology::Mesh>& solution);
-
-  /// Allocate buffer for vector field.
-  void _allocateBufferVertexVectorField(void);
-
-  /// Allocate buffer for scalar field.
-  void _allocateBufferVertexScalarField(void);
-
-  // PRIVATE MEMBERS ////////////////////////////////////////////////////
-private :
-
-  /// Database for initial tractions.
-  spatialdata::spatialdb::SpatialDB* _dbInitialTract;
-
-  /// To identify constitutive model
-  friction::FrictionModel* _friction;
-
-  // NOT IMPLEMENTED ////////////////////////////////////////////////////
-private :
-
-  /// Not implemented
-  FaultCohesiveDynL(const FaultCohesiveDynL&);
-
-  /// Not implemented
-  const FaultCohesiveDynL& operator=(const FaultCohesiveDynL&);
-
-}; // class FaultCohesiveDynL
-
-#include "FaultCohesiveDynL.icc" // inline methods
-
-#endif // pylith_faults_faultcohesivedynl_hh
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.icc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.icc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,32 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#if !defined(pylith_faults_faultcohesivedynl_hh)
-#error "FaultCohesiveDynL.icc can only be included from FaultCohesiveDynL.hh"
-#endif
-
-// Cohesive cells use Lagrange multiplier constraints?
-inline
-bool
-pylith::faults::FaultCohesiveDynL::useLagrangeConstraints(void) const {
-  return true;
-} // useLagrangeConstraints
-
-// Get fields associated with fault.
-inline
-const pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> >*
-pylith::faults::FaultCohesiveDynL::fields(void) const {
-  return _fields;
-} // fields
-
-
-// End of file 

Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -13,8 +13,10 @@
 #include <portinfo>
 
 #include "FaultCohesiveKin.hh" // implementation of object methods
+
 #include "EqKinSrc.hh" // USES EqKinSrc
 #include "CohesiveTopology.hh" // USES CohesiveTopology
+
 #include "pylith/feassemble/Quadrature.hh" // USES Quadrature
 #include "pylith/feassemble/CellGeometry.hh" // USES CellGeometry
 #include "pylith/topology/Mesh.hh" // USES Mesh
@@ -23,8 +25,10 @@
 #include "pylith/topology/Fields.hh" // USES Fields
 #include "pylith/topology/Jacobian.hh" // USES Jacobian
 #include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+
 #include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
 #include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
+
 #include <cmath> // USES pow(), sqrt()
 #include <strings.h> // USES strcasecmp()
 #include <cstring> // USES strlen()
@@ -45,7 +49,6 @@
 // Default constructor.
 pylith::faults::FaultCohesiveKin::FaultCohesiveKin(void)
 { // constructor
-  _useLagrangeConstraints = true;
 } // constructor
 
 // ----------------------------------------------------------------------
@@ -60,7 +63,7 @@
 void
 pylith::faults::FaultCohesiveKin::deallocate(void)
 { // deallocate
-  FaultCohesive::deallocate();
+  FaultCohesiveLagrange::deallocate();
 
   // :TODO: Use shared pointers for earthquake sources
 } // deallocate
@@ -96,91 +99,17 @@
   assert(0 != _quadrature);
   assert(0 != _normalizer);
 
-  _initializeLogger();
+  FaultCohesiveLagrange::initialize(mesh, upDir, normalDir);
 
-  const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
-  assert(0 != cs);
-
-  delete _faultMesh;
-  _faultMesh = new topology::SubMesh();
-  CohesiveTopology::createFaultParallel(_faultMesh, &_cohesiveToFault, mesh, id(), useLagrangeConstraints());
-
-  _initializeCohesiveInfo(mesh);
-
-  delete _fields;
-  _fields = new topology::Fields<topology::Field<topology::SubMesh> >(
-    *_faultMesh);
-
   const srcs_type::const_iterator srcsEnd = _eqSrcs.end();
   for (srcs_type::iterator s_iter = _eqSrcs.begin(); s_iter != srcsEnd; ++s_iter) {
     EqKinSrc* src = s_iter->second;
     assert(0 != src);
     src->initialize(*_faultMesh, *_normalizer);
   } // for
-
-  ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
-  //logger.stagePush("Fault");
-
-  // Allocate slip field
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-      faultSieveMesh->depthStratum(0);
-  assert(!vertices.isNull());
-  _fields->add("slip", "slip");
-  topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  slip.newSection(vertices, cs->spaceDim());
-  slip.allocate();
-  slip.vectorFieldType(topology::FieldBase::VECTOR);
-  slip.scale(_normalizer->lengthScale());
-
-  const ALE::Obj<SieveSubMesh::label_sequence>& cells =
-      faultSieveMesh->heightStratum(0);
-  assert(!cells.isNull());
-  const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
-  const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
-  _quadrature->initializeGeometry();
-#if defined(PRECOMPUTE_GEOMETRY)
-  _quadrature->computeGeometry(*_faultMesh, cells);
-#endif
-
-  // Compute orientation at vertices in fault mesh.
-  _calcOrientation(upDir, normalDir);
-
-  // Compute tributary area for each vertex in fault mesh.
-  _calcArea();
-
-  //logger.stagePop();
 } // initialize
 
 // ----------------------------------------------------------------------
-void
-pylith::faults::FaultCohesiveKin::splitField(topology::Field<
-    topology::Mesh>* field)
-{ // splitField
-  assert(0 != field);
-
-  const ALE::Obj<RealSection>& section = field->section();
-  assert(!section.isNull());
-  if (0 == section->getNumSpaces())
-    return; // Return if there are no fibrations
-
-  const int spaceDim = field->mesh().dimension();
-  const int fibrationLagrange = spaceDim;
-
-  const int numVertices = _cohesiveVertices.size();
-  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
-    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
-    assert(spaceDim == section->getFiberDimension(v_lagrange));
-    // Reset displacement fibration fiber dimension to zero.
-    for (int fibration=0; fibration < spaceDim; ++fibration)
-      section->setFiberDimension(v_lagrange, 0, fibration);
-    // Set Lagrange fibration fiber dimension.
-    section->setFiberDimension(v_lagrange, spaceDim, fibrationLagrange);
-  } // for
-} // splitField
-
-// ----------------------------------------------------------------------
 // Integrate contribution of cohesive cells to residual term that do
 // not require assembly across cells, vertices, or processors.
 void
@@ -192,20 +121,7 @@
   assert(0 != _fields);
   assert(0 != _logger);
 
-  // Cohesive cells with normal vertices i and j, and constraint
-  // vertex k make contributions to the assembled residual:
-  //
-  //   * DOF i and j: internal forces in soln field associated with
-  //                  slip  -[C]^T{L(t)+dL(t)}
-  //   * DOF k: slip values  -[C]{u(t)+dt(t)}
-  //   * DOF k: slip values {D(t+dt)}
-
-  const int setupEvent = _logger->eventId("FkIR setup");
-  const int geometryEvent = _logger->eventId("FkIR geometry");
-  const int computeEvent = _logger->eventId("FkIR compute");
-  const int restrictEvent = _logger->eventId("FkIR restrict");
-  const int updateEvent = _logger->eventId("FkIR update");
-
+  const int setupEvent = _logger->eventId("FaIR setup");
   _logger->eventBegin(setupEvent);
 
   topology::Field<topology::SubMesh>& slip = _fields->get("slip");
@@ -219,726 +135,13 @@
       src->slip(&slip, t);
   } // for
 
-  // Get cell information and setup storage for cell data
-  const int spaceDim = _quadrature->spaceDim();
-  const int orientationSize = spaceDim * spaceDim;
-
-  // Allocate vectors for vertex values
-  double_array slipVertex(spaceDim);
-  double_array orientationVertex(orientationSize);
-  double_array dispTVertexN(spaceDim);
-  double_array dispTVertexP(spaceDim);
-  double_array dispTVertexL(spaceDim);
-  double_array dispTIncrVertexN(spaceDim);
-  double_array dispTIncrVertexP(spaceDim);
-  double_array dispTIncrVertexL(spaceDim);
-  double_array dispTpdtVertexN(spaceDim);
-  double_array dispTpdtVertexP(spaceDim);
-  double_array dispTpdtVertexL(spaceDim);
-  double_array residualVertexN(spaceDim);
-  double_array residualVertexP(spaceDim);
-  double_array residualVertexL(spaceDim);
-
-  // Get sections
-  const ALE::Obj<RealSection>& slipSection = slip.section();
-  assert(!slipSection.isNull());
-
-  const ALE::Obj<RealSection>& residualSection = residual.section();
-  assert(!residualSection.isNull());
-
-  const ALE::Obj<RealSection>& orientationSection =
-      _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
-
-  topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
-  const ALE::Obj<RealSection>& dispTSection = dispT.section();
-  assert(!dispTSection.isNull());
-
-  topology::Field<topology::Mesh>& dispTIncr = fields->get("dispIncr(t->t+dt)");
-  const ALE::Obj<RealSection>& dispTIncrSection = dispTIncr.section();
-  assert(!dispTIncrSection.isNull());
-
   _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventBegin(computeEvent);
-#endif
 
-  const int numVertices = _cohesiveVertices.size();
-  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
-    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
-    const int v_fault = _cohesiveVertices[iVertex].fault;
-    const int v_negative = _cohesiveVertices[iVertex].negative;
-    const int v_positive = _cohesiveVertices[iVertex].positive;
+  FaultCohesiveLagrange::integrateResidualAssembled(residual, t, fields);
 
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(restrictEvent);
-#endif
-
-    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
-
-    // Get orientations at fault cell's vertices.
-    orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
-
-    // Get disp(t) at conventional vertices and Lagrange vertex.
-    dispTSection->restrictPoint(v_negative, &dispTVertexN[0], dispTVertexN.size());
-    dispTSection->restrictPoint(v_positive, &dispTVertexP[0], dispTVertexP.size());
-    dispTSection->restrictPoint(v_lagrange, &dispTVertexL[0], dispTVertexL.size());
-
-    // Get dispIncr(t->t+dt) at conventional vertices and Lagrange vertex.
-    dispTIncrSection->restrictPoint(v_negative, &dispTIncrVertexN[0], dispTIncrVertexN.size());
-    dispTIncrSection->restrictPoint(v_positive, &dispTIncrVertexP[0], dispTIncrVertexP.size());
-    dispTIncrSection->restrictPoint(v_lagrange, &dispTIncrVertexL[0], dispTIncrVertexL.size());
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(restrictEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    // Compute current estimate of displacement at time t+dt using
-    // solution increment.
-    dispTpdtVertexN = dispTVertexN + dispTIncrVertexN;
-    dispTpdtVertexP = dispTVertexP + dispTIncrVertexP;
-    dispTpdtVertexL = dispTVertexL + dispTIncrVertexL;
-
-    // Entries associated with constraint forces applied at negative vertex
-    residualVertexN = 0.0;
-    for (int iDim = 0; iDim < spaceDim; ++iDim)
-      for (int kDim = 0; kDim < spaceDim; ++kDim)
-        residualVertexN[iDim] -= dispTpdtVertexL[kDim] * -orientationVertex[kDim*spaceDim+iDim];
-
-    // Entries associated with constraint forces applied at positive vertex
-    residualVertexP = -residualVertexN;
-
-    // Entries associated with relative displacements between positive
-    // and negative vertices for Lagrange vertex.
-    residualVertexL = slipVertex;
-    for (int kDim = 0; kDim < spaceDim; ++kDim)
-      for (int iDim = 0; iDim < spaceDim; ++iDim)
-        residualVertexL[kDim] -= (dispTpdtVertexP[iDim] - dispTpdtVertexN[iDim])
-            * orientationVertex[kDim*spaceDim+iDim];
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(updateEvent);
-#endif
-
-    assert(residualVertexN.size() == residualSection->getFiberDimension(v_negative));
-    residualSection->updateAddPoint(v_negative, &residualVertexN[0]);
-
-    assert(residualVertexP.size() == residualSection->getFiberDimension(v_positive));
-    residualSection->updateAddPoint(v_positive, &residualVertexP[0]);
-
-    assert(residualVertexL.size() == residualSection->getFiberDimension(v_lagrange));
-    residualSection->updateAddPoint(v_lagrange, &residualVertexL[0]);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(updateEvent);
-#endif
-  } // for
-  PetscLogFlops(numVertices*spaceDim*spaceDim*8);
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventEnd(computeEvent);
-#endif
 } // integrateResidualAssembled
 
 // ----------------------------------------------------------------------
-// Compute Jacobian matrix (A) associated with operator that do not
-// require assembly across cells, vertices, or processors.
-void
-pylith::faults::FaultCohesiveKin::integrateJacobianAssembled(topology::Jacobian* jacobian,
-                                                                  const double t,
-                                                                  topology::SolutionFields* const fields)
-{ // integrateJacobianAssembled
-  assert(0 != jacobian);
-  assert(0 != fields);
-  assert(0 != _fields);
-  assert(0 != _logger);
-
-  const int setupEvent = _logger->eventId("FkIJ setup");
-  const int geometryEvent = _logger->eventId("FkIJ geometry");
-  const int computeEvent = _logger->eventId("FkIJ compute");
-  const int restrictEvent = _logger->eventId("FkIJ restrict");
-  const int updateEvent = _logger->eventId("FkIJ update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Add constraint information to Jacobian matrix; these are the
-  // direction cosines. Entries are associated with vertices ik, jk,
-  // ki, and kj.
-
-  // Get cohesive cells
-  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
-      sieveMesh->getLabelStratum("material-id", id());
-  assert(!cellsCohesive.isNull());
-  const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
-      cellsCohesive->begin();
-  const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
-      cellsCohesive->end();
-  const int cellsCohesiveSize = cellsCohesive->size();
-
-  const int spaceDim = _quadrature->spaceDim();
-  const int orientationSize = spaceDim * spaceDim;
-
-  const int numConstraintVert = _quadrature->numBasis();
-  const int numCorners = 3 * numConstraintVert; // cohesive cell
-  double_array matrixCell(numCorners * spaceDim * numCorners * spaceDim);
-  double_array orientationCell(numConstraintVert * orientationSize);
-
-  // Get section information
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<RealSection>& solutionSection = fields->solution().section();
-  assert(!solutionSection.isNull());
-  const ALE::Obj<RealSection>& orientationSection =
-      _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
-  topology::Mesh::RestrictVisitor orientationVisitor(*orientationSection,
-    orientationCell.size(), &orientationCell[0]);
-
-#if 0 // DEBUGGING
-  // Check that fault cells match cohesive cells
-  ALE::ISieveVisitor::PointRetriever<sieve_type> cV(std::max(1, mesh->getSieve()->getMaxConeSize()));
-  ALE::ISieveVisitor::PointRetriever<sieve_type> cV2(std::max(1, _faultMesh->getSieve()->getMaxConeSize()));
-  Mesh::renumbering_type& fRenumbering = _faultMesh->getRenumbering();
-  const int rank = mesh->commRank();
-
-  for (Mesh::label_sequence::iterator c_iter = cellsCohesiveBegin;
-      c_iter != cellsCohesiveEnd;
-      ++c_iter) {
-    mesh->getSieve()->cone(*c_iter, cV);
-    const int coneSize = cV.getSize();
-    const Mesh::point_type *cone = cV.getPoints();
-    const int faceSize = coneSize / 3;
-    const Mesh::point_type face = _cohesiveToFault[*c_iter];
-    _faultMesh->getSieve()->cone(face, cV2);
-    const int fConeSize = cV2.getSize();
-    const Mesh::point_type *fCone = cV2.getPoints();
-
-    assert(0 == coneSize % faceSize);
-    assert(faceSize == fConeSize);
-    // Use last vertices (contraints) for fault mesh
-    for(int i = 2*faceSize, j = 0; i < 3*faceSize; ++i, ++j) {
-      assert(fRenumbering[cone[i]] == fCone[j]);
-    }
-    cV.clear();
-    cV2.clear();
-  }
-#endif
-
-  const PetscMat jacobianMatrix = jacobian->matrix();
-  assert(0 != jacobianMatrix);
-  const ALE::Obj<SieveMesh::order_type>& globalOrder =
-      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
-        solutionSection);
-  assert(!globalOrder.isNull());
-  // We would need to request unique points here if we had an interpolated mesh
-  topology::Mesh::IndicesVisitor jacobianVisitor(*solutionSection,
-    *globalOrder, (int) pow(sieveMesh->getSieve()->getMaxConeSize(),
-      sieveMesh->depth()) * spaceDim);
-
-  _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventBegin(computeEvent);
-#endif
-
-  for (SieveMesh::label_sequence::iterator c_iter = cellsCohesiveBegin; c_iter
-      != cellsCohesiveEnd; ++c_iter) {
-    const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(restrictEvent);
-#endif
-
-    matrixCell = 0.0;
-    // Get orientations at fault cell's vertices.
-    orientationVisitor.clear();
-    faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(restrictEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
-      // Blocks in cell matrix associated with normal cohesive
-      // vertices i and j and constraint vertex k
-      const int indexI = iConstraint;
-      const int indexJ = iConstraint + numConstraintVert;
-      const int indexK = iConstraint + 2 * numConstraintVert;
-
-      // Get orientation at constraint vertex
-      const double* orientationVertex = &orientationCell[iConstraint
-          * orientationSize];
-      assert(0 != orientationVertex);
-
-      // Entries associated with constraint forces applied at node i
-      for (int iDim = 0; iDim < spaceDim; ++iDim)
-        for (int kDim = 0; kDim < spaceDim; ++kDim) {
-          const int row = indexI * spaceDim + iDim;
-          const int col = indexK * spaceDim + kDim;
-          matrixCell[row * numCorners * spaceDim + col]
-              = -orientationVertex[kDim * spaceDim + iDim];
-          matrixCell[col * numCorners * spaceDim + row]
-              = -orientationVertex[kDim * spaceDim + iDim];
-        } // for
-
-      // Entries associated with constraint forces applied at node j
-      for (int jDim = 0; jDim < spaceDim; ++jDim)
-        for (int kDim = 0; kDim < spaceDim; ++kDim) {
-          const int row = indexJ * spaceDim + jDim;
-          const int col = indexK * spaceDim + kDim;
-          matrixCell[row * numCorners * spaceDim + col]
-              = orientationVertex[kDim * spaceDim + jDim];
-          matrixCell[col * numCorners * spaceDim + row]
-              = orientationVertex[kDim * spaceDim + jDim];
-        } // for
-    } // for
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(updateEvent);
-#endif
-
-    // Insert cell contribution into PETSc Matrix
-    jacobianVisitor.clear();
-    PetscErrorCode err = updateOperator(jacobianMatrix, *sieveMesh->getSieve(),
-      jacobianVisitor, *c_iter, &matrixCell[0], INSERT_VALUES);
-    CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(updateEvent);
-#endif
-  } // for
-  PetscLogFlops(cellsCohesiveSize*numConstraintVert*spaceDim*spaceDim*4);
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventEnd(computeEvent);
-#endif
-
-  _needNewJacobian = false;
-} // integrateJacobianAssembled
-
-// ----------------------------------------------------------------------
-// Compute Jacobian matrix (A) associated with operator that do not
-// require assembly across cells, vertices, or processors.
-void
-pylith::faults::FaultCohesiveKin::integrateJacobianAssembled(topology::Field<
-                                                                      topology::Mesh>* jacobian,
-                                                                  const double t,
-                                                                  topology::SolutionFields* const fields)
-{ // integrateJacobianAssembled
-  assert(0 != jacobian);
-  assert(0 != fields);
-  assert(0 != _fields);
-  assert(0 != _logger);
-
-  const int setupEvent = _logger->eventId("FkIJ setup");
-  const int geometryEvent = _logger->eventId("FkIJ geometry");
-  const int computeEvent = _logger->eventId("FkIJ compute");
-  const int restrictEvent = _logger->eventId("FkIJ restrict");
-  const int updateEvent = _logger->eventId("FkIJ update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Add ones to diagonal Jacobian matrix (as field) for
-  // convenience. Instead of including the constraints in the Jacobian
-  // matrix, we adjust the solution to account for the Lagrange
-  // multipliers as part of the solve.
-
-  const int spaceDim = _quadrature->spaceDim();
-  double_array jacobianVertex(spaceDim);
-  jacobianVertex = 1.0;
-  const ALE::Obj<RealSection>& jacobianSection = jacobian->section();
-  assert(!jacobianSection.isNull());
-
-  _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventBegin(computeEvent);
-#endif
-
-  const int numVertices = _cohesiveVertices.size();
-  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
-    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
-
-    assert(jacobianSection->getFiberDimension(v_lagrange) == spaceDim);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(updateEvent);
-#endif
-    jacobianSection->updatePoint(v_lagrange, &jacobianVertex[0]);
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(updateEvent);
-#endif
-  } // for
-  PetscLogFlops(0);
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventEnd(computeEvent);
-#endif
-
-  _needNewJacobian = false;
-} // integrateJacobianAssembled
-
-// ----------------------------------------------------------------------
-// Update state variables as needed.
-void
-pylith::faults::FaultCohesiveKin::updateStateVars(const double t,
-                                                       topology::SolutionFields* const fields)
-{ // updateStateVars
-  assert(0 != fields);
-  assert(0 != _fields);
-
-} // updateStateVars
-
-// ----------------------------------------------------------------------
-// Adjust solution from solver with lumped Jacobian to match Lagrange
-// multiplier constraints.
-void
-pylith::faults::FaultCohesiveKin::adjustSolnLumped(topology::SolutionFields* const fields,
-                                                        const topology::Field<
-                                                            topology::Mesh>& jacobian)
-{ // adjustSolnLumped
-  assert(0 != fields);
-  assert(0 != _quadrature);
-
-  // Cohesive cells with conventional vertices i and j, and constraint
-  // vertex k require 2 adjustments to the solution:
-  //
-  //   * DOF k: Compute increment in Lagrange multipliers
-  //            dl_k = S^{-1} (-C_ki (A_i^{-1} r_i - C_kj A_j^{-1} r_j + u_i - u_j) - d_k)
-  //            S = C_ki (A_i^{-1} + A_j^{-1}) C_ki^T
-  //   * DOF i and j: Adjust displacement increment (solution) to account
-  //            for Lagrange multiplier constraints
-  //            du_i = +A_i^-1 C_ki^T dlk
-  //            du_j = -A_j^-1 C_kj^T dlk
-
-  const int setupEvent = _logger->eventId("FkAS setup");
-  const int geometryEvent = _logger->eventId("FkAS geometry");
-  const int computeEvent = _logger->eventId("FkAS compute");
-  const int restrictEvent = _logger->eventId("FkAS restrict");
-  const int updateEvent = _logger->eventId("FkAS update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Get cell information and setup storage for cell data
-  const int spaceDim = _quadrature->spaceDim();
-  const int orientationSize = spaceDim * spaceDim;
-
-  // Get section information
-  double_array orientationVertex(orientationSize);
-  const ALE::Obj<RealSection>& orientationSection =
-      _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
-
-  double_array slipVertex(spaceDim);
-  const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
-  assert(!slipSection.isNull());
-
-  double_array jacobianVertexN(spaceDim);
-  double_array jacobianVertexP(spaceDim);
-  const ALE::Obj<RealSection>& jacobianSection = jacobian.section();
-  assert(!jacobianSection.isNull());
-
-  double_array residualVertexN(spaceDim);
-  double_array residualVertexP(spaceDim);
-  const ALE::Obj<RealSection>& residualSection =
-      fields->get("residual").section();
-
-  double_array dispTVertexN(spaceDim);
-  double_array dispTVertexP(spaceDim);
-  const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
-
-  double_array solutionVertexN(spaceDim);
-  double_array solutionVertexP(spaceDim);
-  double_array solutionVertexL(spaceDim);
-  const ALE::Obj<RealSection>& solutionSection = fields->get(
-    "dispIncr(t->t+dt)").section();
-
-  _logger->eventEnd(setupEvent);
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventBegin(computeEvent);
-#endif
-
-  const int numVertices = _cohesiveVertices.size();
-  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
-    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
-    const int v_fault = _cohesiveVertices[iVertex].fault;
-    const int v_negative = _cohesiveVertices[iVertex].negative;
-    const int v_positive = _cohesiveVertices[iVertex].positive;
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(restrictEvent);
-#endif
-
-    // Get orientations at fault cell's vertices.
-    orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
-
-    // Get slip at fault cell's vertices.
-    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
-
-    // Get residual at cohesive cell's vertices.
-    residualSection->restrictPoint(v_negative, &residualVertexN[0], residualVertexN.size());
-    residualSection->restrictPoint(v_positive, &residualVertexP[0], residualVertexP.size());
-
-    // Get jacobian at cohesive cell's vertices.
-    jacobianSection->restrictPoint(v_negative, &jacobianVertexN[0], jacobianVertexN.size());
-    jacobianSection->restrictPoint(v_positive, &jacobianVertexP[0], jacobianVertexP.size());
-
-    // Get disp(t) at cohesive cell's vertices.
-    dispTSection->restrictPoint(v_negative, &dispTVertexN[0], dispTVertexN.size());
-    dispTSection->restrictPoint(v_positive, &dispTVertexP[0], dispTVertexP.size());
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(restrictEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-      switch (spaceDim) { // switch
-    case 1: {
-      assert(jacobianVertexN[0] > 0.0);
-      assert(jacobianVertexP[0] > 0.0);
-
-      const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
-          / (jacobianVertexN[0] + jacobianVertexP[0]);
-
-      // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
-      const double Aru = residualVertexN[0] / jacobianVertexN[0]
-          - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
-          - dispTVertexP[0];
-
-      // dl_k = D^{-1}( - C_{ki} Aru - d_k)
-      const double Aruslip = -Aru - slipVertex[0];
-      const double dlp = Sinv * Aruslip;
-
-      // Update displacements at negative vertex
-      solutionVertexN[0] = +1.0 / jacobianVertexN[0] * dlp;
-
-      // Update displacements at positive vertex
-      solutionVertexP[0] = -1.0 / jacobianVertexP[0] * dlp;
-
-      // Update Lagrange multiplier.
-      solutionVertexL[0] = dlp;
-
-      break;
-    } // case 1
-    case 2: {
-      assert(jacobianVertexN[0] > 0.0);
-      assert(jacobianVertexN[1] > 0.0);
-      assert(jacobianVertexP[0] > 0.0);
-      assert(jacobianVertexP[1] > 0.0);
-
-      const double Cpx = orientationVertex[0];
-      const double Cpy = orientationVertex[1];
-      const double Cqx = orientationVertex[2];
-      const double Cqy = orientationVertex[3];
-
-      // Check to make sure Jacobian is same at all DOF for
-      // vertices i and j (means S is diagonal with equal enties).
-      assert(jacobianVertexN[0] == jacobianVertexN[1]);
-      assert(jacobianVertexP[0] == jacobianVertexP[1]);
-
-      const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
-          / (jacobianVertexN[0] + jacobianVertexP[0]);
-
-      // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
-      const double Arux = residualVertexN[0] / jacobianVertexN[0]
-          - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
-          - dispTVertexP[0];
-      const double Aruy = residualVertexN[1] / jacobianVertexN[1]
-          - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
-          - dispTVertexP[1];
-
-      // dl_k = S^{-1}(-C_{ki} Aru - d_k)
-      const double Arup = Cpx * Arux + Cpy * Aruy;
-      const double Aruq = Cqx * Arux + Cqy * Aruy;
-      const double Arupslip = -Arup - slipVertex[0];
-      const double Aruqslip = -Aruq - slipVertex[1];
-      const double dlp = Sinv * Arupslip;
-      const double dlq = Sinv * Aruqslip;
-
-      const double dlx = Cpx * dlp + Cqx * dlq;
-      const double dly = Cpy * dlp + Cqy * dlq;
-
-      // Update displacements at negative vertex.
-      solutionVertexN[0] = dlx / jacobianVertexN[0];
-      solutionVertexN[1] = dly / jacobianVertexN[1];
-
-      // Update displacements at positive vertex.
-      solutionVertexP[0] = -dlx / jacobianVertexP[0];
-      solutionVertexP[1] = -dly / jacobianVertexP[0];
-
-      // Update Lagrange multiplier.
-      solutionVertexL[0] = dlp;
-      solutionVertexL[1] = dlq;
-
-      break;
-    } // case 2
-    case 3: {
-      assert(jacobianVertexN[0] > 0.0);
-      assert(jacobianVertexN[1] > 0.0);
-      assert(jacobianVertexN[2] > 0.0);
-      assert(jacobianVertexP[0] > 0.0);
-      assert(jacobianVertexP[1] > 0.0);
-      assert(jacobianVertexP[2] > 0.0);
-
-      const double Cpx = orientationVertex[0];
-      const double Cpy = orientationVertex[1];
-      const double Cpz = orientationVertex[2];
-      const double Cqx = orientationVertex[3];
-      const double Cqy = orientationVertex[4];
-      const double Cqz = orientationVertex[5];
-      const double Crx = orientationVertex[6];
-      const double Cry = orientationVertex[7];
-      const double Crz = orientationVertex[8];
-
-      // Check to make sure Jacobian is same at all DOF for
-      // vertices i and j (means S is diagonal with equal enties).
-      assert(jacobianVertexN[0] == jacobianVertexN[1] && jacobianVertexN[0] == jacobianVertexN[2]);
-      assert(jacobianVertexP[0] == jacobianVertexP[1] && jacobianVertexP[0] == jacobianVertexP[2]);
-
-      const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
-          / (jacobianVertexN[0] + jacobianVertexP[0]);
-
-      // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
-      const double Arux = residualVertexN[0] / jacobianVertexN[0]
-          - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
-          - dispTVertexP[0];
-      const double Aruy = residualVertexN[1] / jacobianVertexN[1]
-          - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
-          - dispTVertexP[1];
-      const double Aruz = residualVertexN[2] / jacobianVertexN[2]
-          - residualVertexP[2] / jacobianVertexP[2] + dispTVertexN[2]
-          - dispTVertexP[2];
-
-      // dl_k = D^{-1}( -C_{ki} Aru - d_k)
-      const double Arup = Cpx * Arux + Cpy * Aruy + Cpz * Aruz;
-      const double Aruq = Cqx * Arux + Cqy * Aruy + Cqz * Aruz;
-      const double Arur = Crx * Arux + Cry * Aruy + Crz * Aruz;
-      const double Arupslip = -Arup - slipVertex[0];
-      const double Aruqslip = -Aruq - slipVertex[1];
-      const double Arurslip = -Arur - slipVertex[2];
-      const double dlp = Sinv * Arupslip;
-      const double dlq = Sinv * Aruqslip;
-      const double dlr = Sinv * Arurslip;
-
-      const double dlx = Cpx * dlp + Cqx * dlq + Crx * dlr;
-      const double dly = Cpy * dlp + Cqy * dlq + Cry * dlr;
-      const double dlz = Cpz * dlp + Cqz * dlq + Crz * dlr;
-
-      // Update displacements at negative vertex.
-      solutionVertexN[0] = dlx / jacobianVertexN[0];
-      solutionVertexN[1] = dly / jacobianVertexN[1];
-      solutionVertexN[2] = dlz / jacobianVertexN[2];
-
-      // Update displacements at positive vertex.
-      solutionVertexP[0] = -dlx / jacobianVertexP[0];
-      solutionVertexP[1] = -dly / jacobianVertexP[1];
-      solutionVertexP[2] = -dlz / jacobianVertexP[2];
-
-      // Update Lagrange multiplier.
-      solutionVertexL[0] = dlp;
-      solutionVertexL[1] = dlq;
-      solutionVertexL[2] = dlr;
-
-      break;
-    } // case 3
-    default:
-      assert(0);
-      throw std::logic_error("Unknown spatial dimension.");
-    } // switch
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(updateEvent);
-#endif
-
-    assert(solutionVertexN.size() == solutionSection->getFiberDimension(v_negative));
-    solutionSection->updateAddPoint(v_negative, &solutionVertexN[0]);
-
-    assert(solutionVertexP.size() == solutionSection->getFiberDimension(v_positive));
-    solutionSection->updateAddPoint(v_positive, &solutionVertexP[0]);
-
-    assert(solutionVertexL.size() == solutionSection->getFiberDimension(v_lagrange));
-    solutionSection->updateAddPoint(v_lagrange, &solutionVertexL[0]);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(updateEvent);
-#endif
-  } // for
-
-  switch(spaceDim) {
-  case 1:
-    PetscLogFlops(numVertices*17);
-    break;
-  case 2:
-    PetscLogFlops(numVertices*41);
-    break;
-  case 3:
-    PetscLogFlops(numVertices*72);
-    break;
-  default:
-    assert(0);
-    throw std::logic_error("Unknown spatial dimension.");
-  } // switch
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventEnd(computeEvent);
-#endif
-} // adjustSolnLumped
-
-// ----------------------------------------------------------------------
-// Verify configuration is acceptable.
-void
-pylith::faults::FaultCohesiveKin::verifyConfiguration(const topology::Mesh& mesh) const
-{ // verifyConfiguration
-  assert(0 != _quadrature);
-
-  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
-  assert(!sieveMesh.isNull());
-
-  if (!sieveMesh->hasIntSection(label())) {
-    std::ostringstream msg;
-    msg << "Mesh missing group of vertices '" << label()
-        << " for boundary condition.";
-    throw std::runtime_error(msg.str());
-  } // if  
-
-  // check compatibility of mesh and quadrature scheme
-  const int dimension = mesh.dimension() - 1;
-  if (_quadrature->cellDim() != dimension) {
-    std::ostringstream msg;
-    msg << "Dimension of reference cell in quadrature scheme ("
-        << _quadrature->cellDim()
-        << ") does not match dimension of cells in mesh (" << dimension
-        << ") for fault '" << label() << "'.";
-    throw std::runtime_error(msg.str());
-  } // if
-
-  const int numCorners = _quadrature->refGeometry().numCorners();
-  const ALE::Obj<SieveMesh::label_sequence>& cells =
-      sieveMesh->getLabelStratum("material-id", id());
-  assert(!cells.isNull());
-  const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
-  const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
-  for (SieveMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
-      != cellsEnd; ++c_iter) {
-    const int cellNumCorners = sieveMesh->getNumCellCorners(*c_iter);
-    if (3 * numCorners != cellNumCorners) {
-      std::ostringstream msg;
-      msg << "Number of vertices in reference cell (" << numCorners
-          << ") is not compatible with number of vertices (" << cellNumCorners
-          << ") in cohesive cell " << *c_iter << " for fault '" << label()
-          << "'.";
-      throw std::runtime_error(msg.str());
-    } // if
-  } // for
-} // verifyConfiguration
-
-// ----------------------------------------------------------------------
 // Get vertex field associated with integrator.
 const pylith::topology::Field<pylith::topology::SubMesh>&
 pylith::faults::FaultCohesiveKin::vertexField(const char* name,
@@ -1062,513 +265,5 @@
   return buffer;
 } // cellField
 
-// ----------------------------------------------------------------------
-// Initialize auxiliary cohesive cell information.
-void pylith::faults::FaultCohesiveKin::_initializeCohesiveInfo(const topology::Mesh& mesh)
-{ // _initializeCohesiveInfo
-  assert(0 != _quadrature);
 
-  // Get cohesive cells
-  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& cells =
-      sieveMesh->getLabelStratum("material-id", id());
-  assert(!cells.isNull());
-  const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
-  const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
-
-  const int numConstraintVert = _quadrature->numBasis();
-  const int numCorners = 3 * numConstraintVert; // cohesive cell
-
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  SubMesh::renumbering_type& renumbering = faultSieveMesh->getRenumbering();
-  const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
-    renumbering.end();
-  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-      faultSieveMesh->depthStratum(0);
-
-  typedef std::map<int, int> indexmap_type;
-  indexmap_type indexMap;
-  _cohesiveVertices.resize(vertices->size());
-  int index = 0;
-
-  const ALE::Obj<SieveMesh::sieve_type>& sieve = mesh.sieveMesh()->getSieve();
-  assert(!sieve.isNull());
-  typedef ALE::SieveAlg<SieveMesh> SieveAlg;
-
-  ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type> ncV(*sieve,
-      (size_t) pow(sieve->getMaxConeSize(), std::max(0, sieveMesh->depth())));
-
-  for (SieveMesh::label_sequence::iterator c_iter=cellsBegin;
-      c_iter != cellsEnd;
-      ++c_iter) {
-    // Get oriented closure
-    ncV.clear();
-    ALE::ISieveTraversal<SieveMesh::sieve_type>::orientedClosure(*sieve, *c_iter, ncV);
-    const int coneSize = ncV.getSize();
-    assert(coneSize == numCorners);
-    const Mesh::point_type *cone = ncV.getPoints();
-    assert(0 != cone);
-
-    for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
-      // normal cohesive vertices i and j and constraint vertex k
-      const int indexI = iConstraint;
-      const int indexJ = iConstraint + numConstraintVert;
-      const int indexK = iConstraint + 2 * numConstraintVert;
-
-      const int v_lagrange = cone[indexK];
-      const int v_negative = cone[indexI];
-      const int v_positive = cone[indexJ];
-      const int v_fault = renumbering[v_lagrange];
-
-      if (indexMap.end() == indexMap.find(v_lagrange)) {
-        _cohesiveVertices[index].lagrange = v_lagrange;
-        _cohesiveVertices[index].positive = v_positive;
-        _cohesiveVertices[index].negative = v_negative;
-        _cohesiveVertices[index].fault = v_fault;
-#if 0
-	std::cout << "cohesiveVertices[" << index << "]: "
-		  << "l: " << v_lagrange
-		  << ", p: " << v_positive
-		  << ", n: " << v_negative
-		  << ", f: " << v_fault
-		  << std::endl;
-#endif
-        indexMap[v_lagrange] = index; // add index to map
-        ++index;
-      } // if
-    } // for
-  } // for
-} // _initializeCohesiveInfo
-
-// ----------------------------------------------------------------------
-// Initialize logger.
-void
-pylith::faults::FaultCohesiveKin::_initializeLogger(void)
-{ // initializeLogger
-  delete _logger;
-  _logger = new utils::EventLogger;
-  assert(0 != _logger);
-  _logger->className("FaultCohesiveKin");
-  _logger->initialize();
-
-  _logger->registerEvent("FkAS setup");
-  _logger->registerEvent("FkAS geometry");
-  _logger->registerEvent("FkAS compute");
-  _logger->registerEvent("FkAS restrict");
-  _logger->registerEvent("FkAS update");
-
-  _logger->registerEvent("FkIR setup");
-  _logger->registerEvent("FkIR geometry");
-  _logger->registerEvent("FkIR compute");
-  _logger->registerEvent("FkIR restrict");
-  _logger->registerEvent("FkIR update");
-
-  _logger->registerEvent("FkIJ setup");
-  _logger->registerEvent("FkIJ geometry");
-  _logger->registerEvent("FkIJ compute");
-  _logger->registerEvent("FkIJ restrict");
-  _logger->registerEvent("FkIJ update");
-} // initializeLogger
-
-// ----------------------------------------------------------------------
-// Calculate orientation at fault vertices.
-void
-pylith::faults::FaultCohesiveKin::_calcOrientation(const double upDir[3],
-						   const double normalDir[3])
-{ // _calcOrientation
-  assert(0 != upDir);
-  assert(0 != normalDir);
-  assert(0 != _faultMesh);
-  assert(0 != _fields);
-
-  double_array upDirArray(upDir, 3);
-
-  // Get vertices in fault mesh.
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-      faultSieveMesh->depthStratum(0);
-  const SieveSubMesh::label_sequence::iterator verticesBegin =
-      vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-  // Containers for orientation information.
-  const int cohesiveDim = _faultMesh->dimension();
-  const int numBasis = _quadrature->numBasis();
-  const int spaceDim = _quadrature->spaceDim();
-  const int orientationSize = spaceDim * spaceDim;
-  const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
-  const double_array& verticesRef = cellGeometry.vertices();
-  const int jacobianSize = (cohesiveDim > 0) ? spaceDim * cohesiveDim : 1;
-  const double_array& quadWts = _quadrature->quadWts();
-  double_array jacobian(jacobianSize);
-  double jacobianDet = 0;
-  double_array orientationVertex(orientationSize);
-  double_array coordinatesCell(numBasis * spaceDim);
-  double_array refCoordsVertex(cohesiveDim);
-
-  // Allocate orientation field.
-  _fields->add("orientation", "orientation");
-  topology::Field<topology::SubMesh>& orientation = _fields->get("orientation");
-  const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  orientation.newSection(slip, orientationSize);
-  const ALE::Obj<RealSection>& orientationSection = orientation.section();
-  assert(!orientationSection.isNull());
-  // Create subspaces for along-strike, up-dip, and normal directions
-  for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
-    orientationSection->addSpace();
-  for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
-    orientationSection->setFiberDimension(vertices, spaceDim, iDim);
-  orientation.allocate();
-  orientation.zero();
-
-  // Get fault cells.
-  const ALE::Obj<SieveSubMesh::label_sequence>& cells =
-      faultSieveMesh->heightStratum(0);
-  assert(!cells.isNull());
-  const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
-  const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
-
-  // Compute orientation of fault at constraint vertices
-
-  // Get section containing coordinates of vertices
-  const ALE::Obj<RealSection>& coordinatesSection =
-      faultSieveMesh->getRealSection("coordinates");
-  assert(!coordinatesSection.isNull());
-  topology::Mesh::RestrictVisitor coordinatesVisitor(*coordinatesSection,
-    coordinatesCell.size(), &coordinatesCell[0]);
-
-  // Set orientation function
-  assert(cohesiveDim == _quadrature->cellDim());
-  assert(spaceDim == _quadrature->spaceDim());
-
-  // Loop over cohesive cells, computing orientation weighted by
-  // jacobian at constraint vertices
-
-  const ALE::Obj<SieveSubMesh::sieve_type>& sieve = faultSieveMesh->getSieve();
-  assert(!sieve.isNull());
-  typedef ALE::SieveAlg<SieveSubMesh> SieveAlg;
-
-  ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type>
-      ncV(*sieve, (size_t) pow(sieve->getMaxConeSize(), std::max(0,
-        faultSieveMesh->depth())));
-
-  for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
-      != cellsEnd; ++c_iter) {
-    // Get orientations at fault cell's vertices.
-    coordinatesVisitor.clear();
-    faultSieveMesh->restrictClosure(*c_iter, coordinatesVisitor);
-
-    ncV.clear();
-    ALE::ISieveTraversal<SieveSubMesh::sieve_type>::orientedClosure(*sieve,
-      *c_iter, ncV);
-    const int coneSize = ncV.getSize();
-    const Mesh::point_type *cone = ncV.getPoints();
-
-    for (int v = 0; v < coneSize; ++v) {
-      // Compute Jacobian and determinant of Jacobian at vertex
-      memcpy(&refCoordsVertex[0], &verticesRef[v * cohesiveDim], cohesiveDim
-          * sizeof(double));
-      cellGeometry.jacobian(&jacobian, &jacobianDet, coordinatesCell,
-        refCoordsVertex);
-
-      // Compute orientation
-      cellGeometry.orientation(&orientationVertex, jacobian, jacobianDet,
-        upDirArray);
-
-      // Update orientation
-      orientationSection->updateAddPoint(cone[v], &orientationVertex[0]);
-    } // for
-  } // for
-
-  //orientation.view("ORIENTATION BEFORE COMPLETE");
-
-  // Assemble orientation information
-  orientation.complete();
-
-  // Loop over vertices, make orientation information unit magnitude
-  double_array vertexDir(orientationSize);
-  int count = 0;
-  for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-      != verticesEnd; ++v_iter, ++count) {
-    orientationVertex = 0.0;
-    orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
-      orientationVertex.size());
-    for (int iDim = 0; iDim < spaceDim; ++iDim) {
-      double mag = 0;
-      for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
-        mag += pow(orientationVertex[index + jDim], 2);
-      mag = sqrt(mag);
-      assert(mag > 0.0);
-      for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
-        orientationVertex[index + jDim] /= mag;
-    } // for
-
-    orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
-  } // for
-  PetscLogFlops(count * orientationSize * 4);
-
-  if (2 == cohesiveDim && vertices->size() > 0) {
-    // Check orientation of first vertex, if dot product of fault
-    // normal with preferred normal is negative, flip up/down dip
-    // direction.
-    //
-    // If the user gives the correct normal direction (points from
-    // footwall to ahanging wall), we should end up with
-    // left-lateral-slip, reverse-slip, and fault-opening for positive
-    // slip values.
-    //
-    // When we flip the up/down dip direction, we create a left-handed
-    // strike/dip/normal coordinate system, but it gives the correct
-    // sense of slip. In reality the strike/dip/normal directions that
-    // are used are the opposite of what we would want, but we cannot
-    // flip the fault normal direction because it is tied to how the
-    // cohesive cells are created.
-
-    assert(vertices->size() > 0);
-    orientationSection->restrictPoint(*vertices->begin(),
-      &orientationVertex[0], orientationVertex.size());
-
-    assert(3 == spaceDim);
-    double_array normalDirVertex(&orientationVertex[6], 3);
-    const double normalDot = normalDir[0] * normalDirVertex[0] + normalDir[1]
-        * normalDirVertex[1] + normalDir[2] * normalDirVertex[2];
-
-    const int istrike = 0;
-    const int idip = 3;
-    const int inormal = 6;
-    if (normalDot < 0.0) {
-      // Flip dip direction
-      for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-          != verticesEnd; ++v_iter) {
-        orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
-          orientationVertex.size());
-        assert(9 == orientationSection->getFiberDimension(*v_iter));
-        for (int iDim = 0; iDim < 3; ++iDim) // flip dip
-          orientationVertex[idip + iDim] *= -1.0;
-
-        // Update direction
-        orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
-      } // for
-      PetscLogFlops(5 + count * 3);
-    } // if
-  } // if
-
-  //orientation.view("ORIENTATION");
-} // _calcOrientation
-
-// ----------------------------------------------------------------------
-void
-pylith::faults::FaultCohesiveKin::_calcArea(void)
-{ // _calcArea
-  assert(0 != _faultMesh);
-  assert(0 != _fields);
-
-  // Containers for area information
-  const int cellDim = _quadrature->cellDim();
-  const int numBasis = _quadrature->numBasis();
-  const int numQuadPts = _quadrature->numQuadPts();
-  const int spaceDim = _quadrature->spaceDim();
-  const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
-  const double_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
-  double jacobianDet = 0;
-  double_array areaCell(numBasis);
-
-  // Get vertices in fault mesh.
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-      faultSieveMesh->depthStratum(0);
-  const SieveSubMesh::label_sequence::iterator verticesBegin =
-      vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-  // Allocate area field.
-  _fields->add("area", "area");
-
-  topology::Field<topology::SubMesh>& area = _fields->get("area");
-  const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  area.newSection(slip, 1);
-  area.allocate();
-  area.zero();
-  const ALE::Obj<RealSection>& areaSection = area.section();
-  assert(!areaSection.isNull());
-  topology::Mesh::UpdateAddVisitor areaVisitor(*areaSection, &areaCell[0]);
-
-  double_array coordinatesCell(numBasis * spaceDim);
-  const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
-    "coordinates");
-  assert(!coordinates.isNull());
-  topology::Mesh::RestrictVisitor coordsVisitor(*coordinates,
-    coordinatesCell.size(), &coordinatesCell[0]);
-
-  const ALE::Obj<SieveSubMesh::label_sequence>& cells =
-      faultSieveMesh->heightStratum(0);
-  assert(!cells.isNull());
-  const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
-  const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
-
-  // Loop over cells in fault mesh, compute area
-  for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
-      != cellsEnd; ++c_iter) {
-    areaCell = 0.0;
-
-    // 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
-
-    // Get cell geometry information that depends on cell
-    const double_array& basis = _quadrature->basis();
-    const double_array& jacobianDet = _quadrature->jacobianDet();
-
-    // Compute area
-    for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
-      const double wt = quadWts[iQuad] * jacobianDet[iQuad];
-      for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
-        const double dArea = wt * basis[iQuad * numBasis + iBasis];
-        areaCell[iBasis] += dArea;
-      } // for
-    } // for
-    areaVisitor.clear();
-    faultSieveMesh->updateClosure(*c_iter, areaVisitor);
-
-    PetscLogFlops( numQuadPts*(1+numBasis*2) );
-  } // for
-
-  // Assemble area information
-  area.complete();
-
-#if 0 // DEBUGGING
-  area.view("AREA");
-  //_faultMesh->getSendOverlap()->view("Send fault overlap");
-  //_faultMesh->getRecvOverlap()->view("Receive fault overlap");
-#endif
-} // _calcArea
-
-// ----------------------------------------------------------------------
-// Compute change in tractions on fault surface using solution.
-// NOTE: We must convert vertex labels to fault vertex labels
-void
-pylith::faults::FaultCohesiveKin::_calcTractionsChange(
-    topology::Field<topology::SubMesh>* tractions,
-    const topology::Field<topology::Mesh>& dispT)
-{ // _calcTractionsChange
-  assert(0 != tractions);
-  assert(0 != _faultMesh);
-  assert(0 != _fields);
-  assert(0 != _normalizer);
-
-  tractions->label("traction_change");
-  tractions->scale(_normalizer->pressureScale());
-
-  // Fiber dimension of tractions matches spatial dimension.
-  const int fiberDim = _quadrature->spaceDim();
-  double_array tractionsVertex(fiberDim);
-
-  // Get sections.
-  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
-  assert(!areaSection.isNull());
-  const ALE::Obj<RealSection>& dispTSection = dispT.section();
-  assert(!dispTSection.isNull());
-
-  // Allocate buffer for tractions field (if necessary).
-  const ALE::Obj<RealSection>& tractionsSection = tractions->section();
-  if (tractionsSection.isNull()) {
-    ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
-    //logger.stagePush("Fault");
-
-    const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-    tractions->newSection(slip, fiberDim);
-    tractions->allocate();
-
-    //logger.stagePop();
-  } // if
-  assert(!tractionsSection.isNull());
-  tractions->zero();
-
-  const double pressureScale = tractions->scale();
-
-  const int numVertices = _cohesiveVertices.size();
-  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
-    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
-    const int v_fault = _cohesiveVertices[iVertex].fault;
-
-    assert(fiberDim == dispTSection->getFiberDimension(v_lagrange));
-    assert(fiberDim == tractionsSection->getFiberDimension(v_fault));
-    assert(1 == areaSection->getFiberDimension(v_fault));
-
-    const double* dispTVertex = dispTSection->restrictPoint(v_lagrange);
-    assert(0 != dispTVertex);
-    const double* areaVertex = areaSection->restrictPoint(v_fault);
-    assert(0 != areaVertex);
-
-    for (int i = 0; i < fiberDim; ++i)
-      tractionsVertex[i] = dispTVertex[i] / areaVertex[0];
-
-    assert(tractionsVertex.size() == tractionsSection->getFiberDimension(v_fault));
-    tractionsSection->updatePoint(v_fault, &tractionsVertex[0]);
-  } // for
-
-  PetscLogFlops(numVertices * (1 + fiberDim) );
-
-#if 0 // DEBUGGING
-  tractions->view("TRACTIONS");
-#endif
-} // _calcTractionsChange
-
-// ----------------------------------------------------------------------
-// Allocate buffer for vector field.
-void
-pylith::faults::FaultCohesiveKin::_allocateBufferVectorField(void)
-{ // _allocateBufferVectorField
-  assert(0 != _fields);
-  if (_fields->hasField("buffer (vector)"))
-    return;
-
-  ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
-  logger.stagePush("Output");
-
-  // Create vector field; use same shape/chart as slip field.
-  assert(0 != _faultMesh);
-  _fields->add("buffer (vector)", "buffer");
-  topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (vector)");
-  const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  buffer.cloneSection(slip);
-  buffer.zero();
-
-  logger.stagePop();
-} // _allocateBufferVectorField
-
-// ----------------------------------------------------------------------
-// Allocate buffer for scalar field.
-void
-pylith::faults::FaultCohesiveKin::_allocateBufferScalarField(void)
-{ // _allocateBufferScalarField
-  assert(0 != _fields);
-  if (_fields->hasField("buffer (scalar)"))
-    return;
-
-  ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
-  logger.stagePush("Output");
-
-  // Create vector field; use same shape/chart as area field.
-  assert(0 != _faultMesh);
-  _fields->add("buffer (scalar)", "buffer");
-  topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (scalar)");
-  const topology::Field<topology::SubMesh>& area = _fields->get("area");
-  buffer.cloneSection(area);
-  buffer.zero();
-
-  logger.stagePop();
-} // _allocateBufferScalarField
-
-
 // End of file 

Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -20,74 +20,17 @@
 #define pylith_faults_faultcohesivekin_hh
 
 // Include directives ---------------------------------------------------
-#include "FaultCohesive.hh" // ISA FaultCohesive
+#include "FaultCohesiveLagrange.hh" // ISA FaultCohesive
 
-#include "pylith/topology/SubMesh.hh" // ISA Integrator<Quadrature<SubMesh> >
-#include "pylith/feassemble/Quadrature.hh" // ISA Integrator<Quadrature>
-#include "pylith/feassemble/Integrator.hh" // ISA Integrator
-
 #include <string> // HASA std::string
+#include <map> // HASA std::map
 
 // FaultCohesiveKin -----------------------------------------------------
 /**
  * @brief C++ implementation for a fault surface with kinematic
  * (prescribed) slip implemented with cohesive elements.
- *
- * Fault boundary condition is specified using Lagrange
- * multipliers. The constraints are associated with "constraint"
- * vertices which sit between the pair of vertices on each side of the
- * fault. 
- *
- * The ordering of vertices in a cohesive cell is the vertices on the
- * "negative" side of the fault, the corresponding entries on the
- * "positive" side of the fault, and then the corresponding constraint
- * vertices.
- *
- * The system without Lagrange multipliers is
- *
- * [A(t+dt)]{u(t+dt)} = {b(t+dt)}
- *
- * With Lagrange multipliers this system becomes
- *
- * [A(t+dt) C^T ]{ u(t+dt) } = {b(t+dt)}
- * [ C      0   ]{ L(t+dt) }   {D(t+dt)}
- *
- * where C is the matrix of Lagrange constraints, L is the vector of
- * Lagrange multiplies (internal forces in this case), and D is the
- * fault slip.
- *
- * We solve for the increment in the displacement field, so we rewrite
- * the system as
- *
- * [A(t+dt) C^T ]{ du(t) } = {b(t+dt)} - [A(t+dt) C^T ]{ u(t) }
- * [ C      0   ]{ dL(t) }   {D(t+dt)}   [ C      0   ]{ L(t) }
- * 
- * We form the residual as
- *
- * {r(t+dt)} = {b(t+dt)} - [A(t+dt) C^T ]{ u(t)+du(t) }
- *             {D(t+dt)}   [ C      0   ]{ L(t)+dL(t) }
- * 
- * The terms in the residual contributing to the DOF at the Lagrange
- * vertices are
- *
- * {r(t+dt)} = {D(t+dt)} - [C]{u(t)+dt(t)}
- *
- * The first term, {D(t+dt)}, does not involve integration over the
- * cohesive cells, so it does not require assembling over cohesive
- * cells or processors. We compute the term in
- * integrateResidualAssembled().
- *
- * The term in the residual contributing to the DOF at the
- * non-Lagrange vertices of the cohesive cells is
- *
- * {r(t+dt)} = -[C]^T{L(t)+dL(t)}
- *
- * We integrate the Lagrange multiplier term and the relative
- * displacement term over the cohesive cells, because this introduces
- * weighting of the orientation of the fault for the direction of slip
- * at the vertices of the cohesive cells.
  */
-class pylith::faults::FaultCohesiveKin : public FaultCohesive
+class pylith::faults::FaultCohesiveKin : public FaultCohesiveLagrange
 { // class FaultCohesiveKin
   friend class TestFaultCohesiveKin; // unit testing
 
@@ -98,11 +41,9 @@
   FaultCohesiveKin(void);
 
   /// Destructor.
-  virtual
   ~FaultCohesiveKin(void);
 
   /// Deallocate PETSc and local data structures.
-  virtual
   void deallocate(void);
   
   /** Set kinematic earthquake sources.
@@ -132,12 +73,6 @@
 		  const double upDir[3],
 		  const double normalDir[3]);
 
-  /** Split solution field for separate preconditioning.
-   *
-   * @param field Solution field.
-   */
-  void splitField(topology::Field<topology::Mesh>* field);
-
   /** Integrate contributions to residual term (r) for operator that
    * do not require assembly across cells, vertices, or processors.
    *
@@ -149,55 +84,6 @@
 				  const double t,
 				  topology::SolutionFields* const fields);
 
-  /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator that do not require assembly across cells, vertices, or
-   * processors.
-   *
-   * @param jacobian Sparse matrix
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  void integrateJacobianAssembled(topology::Jacobian* jacobian,
-				  const double t,
-				  topology::SolutionFields* const fields);
-
-  /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator that do not require assembly across cells, vertices, or
-   * processors.
-   *
-   * @param jacobian Diagonal Jacobian matrix as a field.
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  void integrateJacobianAssembled(topology::Field<topology::Mesh>* jacobian,
-				  const double t,
-				  topology::SolutionFields* const fields);
-
-  /** Update state variables as needed.
-   *
-   * @param t Current time
-   * @param fields Solution fields
-   * @param mesh Finite-element mesh
-   */
-  void updateStateVars(const double t,
-		       topology::SolutionFields* const fields);
-
-  /** Adjust solution from solver with lumped Jacobian to match Lagrange
-   *  multiplier constraints.
-   *
-   * @param solution Solution field.
-   * @param jacobian Jacobian of the system.
-   * @param residual Residual field.
-   */
-  void adjustSolnLumped(topology::SolutionFields* fields,
-			const topology::Field<topology::Mesh>& jacobian);
-
-  /** Verify configuration is acceptable.
-   *
-   * @param mesh Finite-element mesh
-   */
-  void verifyConfiguration(const topology::Mesh& mesh) const;
-
   /** Get vertex field associated with integrator.
    *
    * @param name Name of cell field.
@@ -218,85 +104,11 @@
   cellField(const char* name,
 	    const topology::SolutionFields* fields =0);
 
-  /** Get fields associated with fault.
-   *
-   * @returns Fields associated with fault.
-   */
-  const topology::Fields<topology::Field<topology::SubMesh> >*
-  fields(void) const;
-
-  // PROTECTED STRUCTS //////////////////////////////////////////////////
-protected :
-
-  /** Data structure to hold relations between vertices in cohesive cell
-   *  in mesh of domain and cell of fault mesh.
-   */
-  struct CohesiveInfo {
-    int lagrange; ///< Vertex associated with Lagrange multiplier.
-    int positive; ///< Vertex on positive side of the fault.
-    int negative; ///< Vertex on negative side of the fault.
-    int fault; ///< Vertex in fault mesh.
-  };
-
-  // PROTECTED METHODS //////////////////////////////////////////////////
-protected :
-
-  /** Initialize auxiliary cohesive cell information.
-   *
-   * @param mesh Finite-element mesh of the domain.
-   */
-  void _initializeCohesiveInfo(const topology::Mesh& mesh);
-
-  // PROTECTED MEMBERS //////////////////////////////////////////////////
-protected :
-
-  /// Array of cohesive vertex information.
-  std::vector<CohesiveInfo> _cohesiveVertices;
-
-  // PRIVATE METHODS ////////////////////////////////////////////////////
-private :
-
-  /// Initialize logger.
-  void _initializeLogger(void);
-  
-  /** Calculate orientation at fault vertices.
-   *
-   * @param upDir Direction perpendicular to along-strike direction that is 
-   *   not collinear with fault normal (usually "up" direction but could 
-   *   be up-dip direction; only applies to fault surfaces in a 3-D domain).
-   * @param normalDir General preferred direction for fault normal
-   *   (used to pick which of two possible normal directions for
-   *   interface; only applies to fault surfaces in a 3-D domain).
-   */
-  void _calcOrientation(const double upDir[3],
-			const double normalDir[3]);
-
-  /// Calculate fault area field.
-  void _calcArea(void);
-
-  /** Compute change in tractions on fault surface using solution.
-   *
-   * @param tractions Field for tractions.
-   * @param mesh Finite-element mesh for domain
-   * @param solution Solution over domain
-   */
-  void _calcTractionsChange(topology::Field<topology::SubMesh>* tractions,
-			    const topology::Field<topology::Mesh>& solution);
-
-  /// Allocate buffer for vector field.
-  void _allocateBufferVectorField(void);
-
-  /// Allocate buffer for scalar field.
-  void _allocateBufferScalarField(void);
-
   // PRIVATE TYPEDEFS ///////////////////////////////////////////////////
 private :
 
   typedef std::map<std::string, EqKinSrc*> srcs_type;
 
-  // PRIVATE STRUCTS ////////////////////////////////////////////////////
-private :
-
   // PRIVATE MEMBERS ////////////////////////////////////////////////////
 private :
 
@@ -313,8 +125,6 @@
 
 }; // class FaultCohesiveKin
 
-#include "FaultCohesiveKin.icc" // inline methods
-
 #endif // pylith_faults_faultcohesivekin_hh
 
 

Deleted: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.icc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.icc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,25 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#if !defined(pylith_faults_faultcohesivekin_hh)
-#error "FaultCohesiveKin.icc can only be included from FaultCohesiveKin.hh"
-#endif
-
-// Get fields associated with fault.
-inline
-const pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> >*
-pylith::faults::FaultCohesiveKin::fields(void) const {
-  return _fields;
-} // fields
-
-
-// End of file 

Added: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,1372 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "FaultCohesiveLagrange.hh" // implementation of object methods
+
+#include "CohesiveTopology.hh" // USES CohesiveTopology
+
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
+#include "pylith/feassemble/CellGeometry.hh" // USES CellGeometry
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/topology/Field.hh" // USES Field
+#include "pylith/topology/Fields.hh" // USES Fields
+#include "pylith/topology/Jacobian.hh" // USES Jacobian
+#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+
+#include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
+#include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
+
+#include <cmath> // USES pow(), sqrt()
+#include <strings.h> // USES strcasecmp()
+#include <cstring> // USES strlen()
+#include <cstdlib> // USES atoi()
+#include <cassert> // USES assert()
+#include <sstream> // USES std::ostringstream
+#include <stdexcept> // USES std::runtime_error
+
+//#define PRECOMPUTE_GEOMETRY
+//#define DETAILED_EVENT_LOGGING
+
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
+
+// ----------------------------------------------------------------------
+// Default constructor.
+pylith::faults::FaultCohesiveLagrange::FaultCohesiveLagrange(void)
+{ // constructor
+  _useLagrangeConstraints = true;
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor.
+pylith::faults::FaultCohesiveLagrange::~FaultCohesiveLagrange(void)
+{ // destructor
+  deallocate();
+} // destructor
+
+// ----------------------------------------------------------------------
+// Deallocate PETSc and local data structures.
+void
+pylith::faults::FaultCohesiveLagrange::deallocate(void)
+{ // deallocate
+  FaultCohesive::deallocate();
+
+} // deallocate
+
+// ----------------------------------------------------------------------
+// Initialize fault. Determine orientation and setup boundary
+void
+pylith::faults::FaultCohesiveLagrange::initialize(const topology::Mesh& mesh,
+					     const double upDir[3],
+					     const double normalDir[3])
+{ // initialize
+  assert(0 != upDir);
+  assert(0 != normalDir);
+  assert(0 != _quadrature);
+  assert(0 != _normalizer);
+
+  _initializeLogger();
+
+  const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
+  assert(0 != cs);
+
+  delete _faultMesh;
+  _faultMesh = new topology::SubMesh();
+  CohesiveTopology::createFaultParallel(_faultMesh, mesh, id(), 
+					_useLagrangeConstraints);
+  _initializeCohesiveInfo(mesh);
+
+  delete _fields;
+  _fields = new topology::Fields<topology::Field<topology::SubMesh> >(
+    *_faultMesh);
+
+  ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+  //logger.stagePush("Fault");
+
+  // Allocate slip field
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+  assert(!faultSieveMesh.isNull());
+  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+      faultSieveMesh->depthStratum(0);
+  assert(!vertices.isNull());
+  _fields->add("slip", "slip");
+  topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+  slip.newSection(vertices, cs->spaceDim());
+  slip.allocate();
+  slip.vectorFieldType(topology::FieldBase::VECTOR);
+  slip.scale(_normalizer->lengthScale());
+
+  const ALE::Obj<SieveSubMesh::label_sequence>& cells =
+      faultSieveMesh->heightStratum(0);
+  assert(!cells.isNull());
+  const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
+  const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
+  _quadrature->initializeGeometry();
+#if defined(PRECOMPUTE_GEOMETRY)
+  _quadrature->computeGeometry(*_faultMesh, cells);
+#endif
+
+  // Compute orientation at vertices in fault mesh.
+  _calcOrientation(upDir, normalDir);
+
+  // Compute tributary area for each vertex in fault mesh.
+  _calcArea();
+
+  //logger.stagePop();
+} // initialize
+
+// ----------------------------------------------------------------------
+void
+pylith::faults::FaultCohesiveLagrange::splitField(topology::Field<
+    topology::Mesh>* field)
+{ // splitField
+  assert(0 != field);
+
+  const ALE::Obj<RealSection>& section = field->section();
+  assert(!section.isNull());
+  if (0 == section->getNumSpaces())
+    return; // Return if there are no fibrations
+
+  const int spaceDim = field->mesh().dimension();
+  const int fibrationLagrange = spaceDim;
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    assert(spaceDim == section->getFiberDimension(v_lagrange));
+    // Reset displacement fibration fiber dimension to zero.
+    for (int fibration=0; fibration < spaceDim; ++fibration)
+      section->setFiberDimension(v_lagrange, 0, fibration);
+    // Set Lagrange fibration fiber dimension.
+    section->setFiberDimension(v_lagrange, spaceDim, fibrationLagrange);
+  } // for
+} // splitField
+
+// ----------------------------------------------------------------------
+// Integrate contribution of cohesive cells to residual term that do
+// not require assembly across cells, vertices, or processors.
+void
+pylith::faults::FaultCohesiveLagrange::integrateResidualAssembled(const topology::Field<
+                                                                      topology::Mesh>& residual,
+                                                                  const double t,
+                                                                  topology::SolutionFields* const fields) { // integrateResidualAssembled
+  assert(0 != fields);
+  assert(0 != _fields);
+  assert(0 != _logger);
+
+  // Cohesive cells with normal vertices i and j, and constraint
+  // vertex k make contributions to the assembled residual:
+  //
+  //   * DOF i and j: internal forces in soln field associated with
+  //                  slip  -[C]^T{L(t)+dL(t)}
+  //   * DOF k: slip values  -[C]{u(t)+dt(t)}
+  //   * DOF k: slip values {D(t+dt)}
+
+  const int setupEvent = _logger->eventId("FaIR setup");
+  const int geometryEvent = _logger->eventId("FaIR geometry");
+  const int computeEvent = _logger->eventId("FaIR compute");
+  const int restrictEvent = _logger->eventId("FaIR restrict");
+  const int updateEvent = _logger->eventId("FaIR update");
+
+  _logger->eventBegin(setupEvent);
+
+  // Get cell information and setup storage for cell data
+  const int spaceDim = _quadrature->spaceDim();
+  const int orientationSize = spaceDim * spaceDim;
+
+  // Allocate vectors for vertex values
+  double_array slipVertex(spaceDim);
+  double_array orientationVertex(orientationSize);
+  double_array dispTVertexN(spaceDim);
+  double_array dispTVertexP(spaceDim);
+  double_array dispTVertexL(spaceDim);
+  double_array dispTIncrVertexN(spaceDim);
+  double_array dispTIncrVertexP(spaceDim);
+  double_array dispTIncrVertexL(spaceDim);
+  double_array dispTpdtVertexN(spaceDim);
+  double_array dispTpdtVertexP(spaceDim);
+  double_array dispTpdtVertexL(spaceDim);
+  double_array residualVertexN(spaceDim);
+  double_array residualVertexP(spaceDim);
+  double_array residualVertexL(spaceDim);
+
+  // Get sections
+  topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+  const ALE::Obj<RealSection>& slipSection = slip.section();
+  assert(!slipSection.isNull());
+
+  const ALE::Obj<RealSection>& residualSection = residual.section();
+  assert(!residualSection.isNull());
+
+  const ALE::Obj<RealSection>& orientationSection =
+      _fields->get("orientation").section();
+  assert(!orientationSection.isNull());
+
+  topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
+  const ALE::Obj<RealSection>& dispTSection = dispT.section();
+  assert(!dispTSection.isNull());
+
+  topology::Field<topology::Mesh>& dispTIncr = fields->get("dispIncr(t->t+dt)");
+  const ALE::Obj<RealSection>& dispTIncrSection = dispTIncr.section();
+  assert(!dispTIncrSection.isNull());
+
+  _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    const int v_fault = _cohesiveVertices[iVertex].fault;
+    const int v_negative = _cohesiveVertices[iVertex].negative;
+    const int v_positive = _cohesiveVertices[iVertex].positive;
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(restrictEvent);
+#endif
+
+    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+
+    // Get orientations at fault cell's vertices.
+    orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
+
+    // Get disp(t) at conventional vertices and Lagrange vertex.
+    dispTSection->restrictPoint(v_negative, &dispTVertexN[0], dispTVertexN.size());
+    dispTSection->restrictPoint(v_positive, &dispTVertexP[0], dispTVertexP.size());
+    dispTSection->restrictPoint(v_lagrange, &dispTVertexL[0], dispTVertexL.size());
+
+    // Get dispIncr(t->t+dt) at conventional vertices and Lagrange vertex.
+    dispTIncrSection->restrictPoint(v_negative, &dispTIncrVertexN[0], dispTIncrVertexN.size());
+    dispTIncrSection->restrictPoint(v_positive, &dispTIncrVertexP[0], dispTIncrVertexP.size());
+    dispTIncrSection->restrictPoint(v_lagrange, &dispTIncrVertexL[0], dispTIncrVertexL.size());
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(restrictEvent);
+    _logger->eventBegin(computeEvent);
+#endif
+
+    // Compute current estimate of displacement at time t+dt using
+    // solution increment.
+    dispTpdtVertexN = dispTVertexN + dispTIncrVertexN;
+    dispTpdtVertexP = dispTVertexP + dispTIncrVertexP;
+    dispTpdtVertexL = dispTVertexL + dispTIncrVertexL;
+
+    // Entries associated with constraint forces applied at negative vertex
+    residualVertexN = 0.0;
+    for (int iDim = 0; iDim < spaceDim; ++iDim)
+      for (int kDim = 0; kDim < spaceDim; ++kDim)
+        residualVertexN[iDim] -= dispTpdtVertexL[kDim] * -orientationVertex[kDim*spaceDim+iDim];
+
+    // Entries associated with constraint forces applied at positive vertex
+    residualVertexP = -residualVertexN;
+
+    // Entries associated with relative displacements between positive
+    // and negative vertices for Lagrange vertex.
+    residualVertexL = slipVertex;
+    for (int kDim = 0; kDim < spaceDim; ++kDim)
+      for (int iDim = 0; iDim < spaceDim; ++iDim)
+        residualVertexL[kDim] -= (dispTpdtVertexP[iDim] - dispTpdtVertexN[iDim])
+            * orientationVertex[kDim*spaceDim+iDim];
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(computeEvent);
+    _logger->eventBegin(updateEvent);
+#endif
+
+    assert(residualVertexN.size() == residualSection->getFiberDimension(v_negative));
+    residualSection->updateAddPoint(v_negative, &residualVertexN[0]);
+
+    assert(residualVertexP.size() == residualSection->getFiberDimension(v_positive));
+    residualSection->updateAddPoint(v_positive, &residualVertexP[0]);
+
+    assert(residualVertexL.size() == residualSection->getFiberDimension(v_lagrange));
+    residualSection->updateAddPoint(v_lagrange, &residualVertexL[0]);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(updateEvent);
+#endif
+  } // for
+  PetscLogFlops(numVertices*spaceDim*spaceDim*8);
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventEnd(computeEvent);
+#endif
+} // integrateResidualAssembled
+
+// ----------------------------------------------------------------------
+// Compute Jacobian matrix (A) associated with operator that do not
+// require assembly across cells, vertices, or processors.
+void
+pylith::faults::FaultCohesiveLagrange::integrateJacobianAssembled(topology::Jacobian* jacobian,
+                                                                  const double t,
+                                                                  topology::SolutionFields* const fields)
+{ // integrateJacobianAssembled
+  assert(0 != jacobian);
+  assert(0 != fields);
+  assert(0 != _fields);
+  assert(0 != _logger);
+
+  const int setupEvent = _logger->eventId("FaIJ setup");
+  const int geometryEvent = _logger->eventId("FaIJ geometry");
+  const int computeEvent = _logger->eventId("FaIJ compute");
+  const int restrictEvent = _logger->eventId("FaIJ restrict");
+  const int updateEvent = _logger->eventId("FaIJ update");
+
+  _logger->eventBegin(setupEvent);
+
+  // Add constraint information to Jacobian matrix; these are the
+  // direction cosines. Entries are associated with vertices ik, jk,
+  // ki, and kj.
+
+  // Get cell information and setup storage for cell data
+  const int spaceDim = _quadrature->spaceDim();
+  const int orientationSize = spaceDim * spaceDim;
+
+  // Allocate vectors for vertex values
+  double_array orientationVertex(orientationSize);
+  double_array jacobianVertex(spaceDim*spaceDim);
+  int_array indicesL(spaceDim);
+  int_array indicesN(spaceDim);
+  int_array indicesP(spaceDim);
+  int_array indicesRel(spaceDim);
+  for (int i=0; i < spaceDim; ++i)
+    indicesRel[i] = i;
+
+  // Get sections
+  const ALE::Obj<RealSection>& solutionSection = fields->solution().section();
+  assert(!solutionSection.isNull());
+
+  const ALE::Obj<RealSection>& orientationSection =
+      _fields->get("orientation").section();
+  assert(!orientationSection.isNull());
+
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::order_type>& globalOrder =
+      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
+        solutionSection);
+  assert(!globalOrder.isNull());
+
+  const PetscMat jacobianMatrix = jacobian->matrix();
+  assert(0 != jacobianMatrix);
+
+  _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    const int v_fault = _cohesiveVertices[iVertex].fault;
+    const int v_negative = _cohesiveVertices[iVertex].negative;
+    const int v_positive = _cohesiveVertices[iVertex].positive;
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(restrictEvent);
+#endif
+
+    // Get orientations at fault cell's vertices.
+    orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
+
+    // Set global order indices
+    indicesL = indicesRel + globalOrder->getIndex(v_lagrange);
+    indicesN = indicesRel + globalOrder->getIndex(v_negative);
+    indicesP = indicesRel + globalOrder->getIndex(v_positive);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(restrictEvent);
+    _logger->eventBegin(updateEvent);
+#endif
+
+    // Values associated with [C]
+    // Values at positive vertex, entry L,P in Jacobian
+    jacobianVertex = orientationVertex;
+    MatSetValues(jacobianMatrix,
+                 indicesL.size(), &indicesL[0],
+                 indicesP.size(), &indicesP[0],
+                 &jacobianVertex[0],
+                 INSERT_VALUES);
+
+    // Values at negative vertex, entry L,N in Jacobian
+    jacobianVertex *= -1.0;
+    MatSetValues(jacobianMatrix,
+                 indicesL.size(), &indicesL[0],
+                 indicesN.size(), &indicesN[0],
+                 &jacobianVertex[0],
+                 INSERT_VALUES);
+
+    // Values associated with [C]^T
+    // Transpose orientation matrix
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      for (int jDim=0; jDim < spaceDim; ++jDim)
+        jacobianVertex[iDim*spaceDim+jDim] = orientationVertex[jDim*spaceDim+iDim];
+    // Values at positive vertex, entry P,L in Jacobian
+    MatSetValues(jacobianMatrix,
+                 indicesP.size(), &indicesP[0],
+                 indicesL.size(), &indicesL[0],
+                 &jacobianVertex[0],
+                 INSERT_VALUES);
+
+    // Values at negative vertex, entry L,N in Jacobian
+    jacobianVertex *= -1.0;
+    MatSetValues(jacobianMatrix,
+                 indicesN.size(), &indicesN[0],
+                 indicesL.size(), &indicesL[0],
+                 &jacobianVertex[0],
+                 INSERT_VALUES);
+
+    // Values at Lagrange vertex, entry L,L in Jacobian
+    jacobianVertex = 0.0;
+    MatSetValues(jacobianMatrix,
+                 indicesL.size(), &indicesL[0],
+                 indicesL.size(), &indicesL[0],
+                 &jacobianVertex[0],
+                 INSERT_VALUES);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    PetscLogFlops(numVertices*(spaceDim*spaceDim*2));
+    _logger->eventBegin(updateEvent);
+#endif
+
+  } // for
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  PetscLogFlops(numVertices*(spaceDim*spaceDim*2));
+  _logger->eventEnd(computeEvent);
+#endif
+
+  _needNewJacobian = false;
+} // integrateJacobianAssembled
+
+// ----------------------------------------------------------------------
+// Compute Jacobian matrix (A) associated with operator that do not
+// require assembly across cells, vertices, or processors.
+void
+pylith::faults::FaultCohesiveLagrange::integrateJacobianAssembled(
+	                  topology::Field<topology::Mesh>* jacobian,
+			  const double t,
+			  topology::SolutionFields* const fields)
+{ // integrateJacobianAssembled
+  assert(0 != jacobian);
+  assert(0 != fields);
+  assert(0 != _fields);
+  assert(0 != _logger);
+
+  const int setupEvent = _logger->eventId("FaIJ setup");
+  const int geometryEvent = _logger->eventId("FaIJ geometry");
+  const int computeEvent = _logger->eventId("FaIJ compute");
+  const int restrictEvent = _logger->eventId("FaIJ restrict");
+  const int updateEvent = _logger->eventId("FaIJ update");
+
+  _logger->eventBegin(setupEvent);
+
+  // Add ones to diagonal Jacobian matrix (as field) for
+  // convenience. Instead of including the constraints in the Jacobian
+  // matrix, we adjust the solution to account for the Lagrange
+  // multipliers as part of the solve.
+
+  const int spaceDim = _quadrature->spaceDim();
+  double_array jacobianVertex(spaceDim);
+  jacobianVertex = 1.0;
+  const ALE::Obj<RealSection>& jacobianSection = jacobian->section();
+  assert(!jacobianSection.isNull());
+
+  _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+
+    assert(jacobianSection->getFiberDimension(v_lagrange) == spaceDim);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(updateEvent);
+#endif
+    jacobianSection->updatePoint(v_lagrange, &jacobianVertex[0]);
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(updateEvent);
+#endif
+  } // for
+  PetscLogFlops(0);
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventEnd(computeEvent);
+#endif
+
+  _needNewJacobian = false;
+} // integrateJacobianAssembled
+
+// ----------------------------------------------------------------------
+// Adjust solution from solver with lumped Jacobian to match Lagrange
+// multiplier constraints.
+void
+pylith::faults::FaultCohesiveLagrange::adjustSolnLumped(topology::SolutionFields* const fields,
+                                                        const topology::Field<
+							topology::Mesh>& jacobian)
+{ // adjustSolnLumped
+  assert(0 != fields);
+  assert(0 != _quadrature);
+
+  // Cohesive cells with conventional vertices i and j, and constraint
+  // vertex k require 2 adjustments to the solution:
+  //
+  //   * DOF k: Compute increment in Lagrange multipliers
+  //            dl_k = S^{-1} (-C_ki (A_i^{-1} r_i - C_kj A_j^{-1} r_j + u_i - u_j) - d_k)
+  //            S = C_ki (A_i^{-1} + A_j^{-1}) C_ki^T
+  //   * DOF i and j: Adjust displacement increment (solution) to account
+  //            for Lagrange multiplier constraints
+  //            du_i = +A_i^-1 C_ki^T dlk
+  //            du_j = -A_j^-1 C_kj^T dlk
+
+  const int setupEvent = _logger->eventId("FaAS setup");
+  const int geometryEvent = _logger->eventId("FaAS geometry");
+  const int computeEvent = _logger->eventId("FaAS compute");
+  const int restrictEvent = _logger->eventId("FaAS restrict");
+  const int updateEvent = _logger->eventId("FaAS update");
+
+  _logger->eventBegin(setupEvent);
+
+  // Get cell information and setup storage for cell data
+  const int spaceDim = _quadrature->spaceDim();
+  const int orientationSize = spaceDim * spaceDim;
+
+  // Get section information
+  double_array orientationVertex(orientationSize);
+  const ALE::Obj<RealSection>& orientationSection =
+      _fields->get("orientation").section();
+  assert(!orientationSection.isNull());
+
+  double_array slipVertex(spaceDim);
+  const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
+  assert(!slipSection.isNull());
+
+  double_array jacobianVertexN(spaceDim);
+  double_array jacobianVertexP(spaceDim);
+  const ALE::Obj<RealSection>& jacobianSection = jacobian.section();
+  assert(!jacobianSection.isNull());
+
+  double_array residualVertexN(spaceDim);
+  double_array residualVertexP(spaceDim);
+  const ALE::Obj<RealSection>& residualSection =
+      fields->get("residual").section();
+
+  double_array dispTVertexN(spaceDim);
+  double_array dispTVertexP(spaceDim);
+  const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
+
+  double_array solutionVertexN(spaceDim);
+  double_array solutionVertexP(spaceDim);
+  double_array solutionVertexL(spaceDim);
+  const ALE::Obj<RealSection>& solutionSection = fields->get(
+    "dispIncr(t->t+dt)").section();
+
+  _logger->eventEnd(setupEvent);
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    const int v_fault = _cohesiveVertices[iVertex].fault;
+    const int v_negative = _cohesiveVertices[iVertex].negative;
+    const int v_positive = _cohesiveVertices[iVertex].positive;
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(restrictEvent);
+#endif
+
+    // Get orientations at fault cell's vertices.
+    orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
+
+    // Get slip at fault cell's vertices.
+    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+
+    // Get residual at cohesive cell's vertices.
+    residualSection->restrictPoint(v_negative, &residualVertexN[0], residualVertexN.size());
+    residualSection->restrictPoint(v_positive, &residualVertexP[0], residualVertexP.size());
+
+    // Get jacobian at cohesive cell's vertices.
+    jacobianSection->restrictPoint(v_negative, &jacobianVertexN[0], jacobianVertexN.size());
+    jacobianSection->restrictPoint(v_positive, &jacobianVertexP[0], jacobianVertexP.size());
+
+    // Get disp(t) at cohesive cell's vertices.
+    dispTSection->restrictPoint(v_negative, &dispTVertexN[0], dispTVertexN.size());
+    dispTSection->restrictPoint(v_positive, &dispTVertexP[0], dispTVertexP.size());
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(restrictEvent);
+    _logger->eventBegin(computeEvent);
+#endif
+
+      switch (spaceDim) { // switch
+    case 1: {
+      assert(jacobianVertexN[0] > 0.0);
+      assert(jacobianVertexP[0] > 0.0);
+
+      const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+          / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+      // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+      const double Aru = residualVertexN[0] / jacobianVertexN[0]
+          - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+          - dispTVertexP[0];
+
+      // dl_k = D^{-1}( - C_{ki} Aru - d_k)
+      const double Aruslip = -Aru - slipVertex[0];
+      const double dlp = Sinv * Aruslip;
+
+      // Update displacements at negative vertex
+      solutionVertexN[0] = +1.0 / jacobianVertexN[0] * dlp;
+
+      // Update displacements at positive vertex
+      solutionVertexP[0] = -1.0 / jacobianVertexP[0] * dlp;
+
+      // Update Lagrange multiplier.
+      solutionVertexL[0] = dlp;
+
+      break;
+    } // case 1
+    case 2: {
+      assert(jacobianVertexN[0] > 0.0);
+      assert(jacobianVertexN[1] > 0.0);
+      assert(jacobianVertexP[0] > 0.0);
+      assert(jacobianVertexP[1] > 0.0);
+
+      const double Cpx = orientationVertex[0];
+      const double Cpy = orientationVertex[1];
+      const double Cqx = orientationVertex[2];
+      const double Cqy = orientationVertex[3];
+
+      // Check to make sure Jacobian is same at all DOF for
+      // vertices i and j (means S is diagonal with equal enties).
+      assert(jacobianVertexN[0] == jacobianVertexN[1]);
+      assert(jacobianVertexP[0] == jacobianVertexP[1]);
+
+      const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+          / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+      // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+      const double Arux = residualVertexN[0] / jacobianVertexN[0]
+          - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+          - dispTVertexP[0];
+      const double Aruy = residualVertexN[1] / jacobianVertexN[1]
+          - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
+          - dispTVertexP[1];
+
+      // dl_k = S^{-1}(-C_{ki} Aru - d_k)
+      const double Arup = Cpx * Arux + Cpy * Aruy;
+      const double Aruq = Cqx * Arux + Cqy * Aruy;
+      const double Arupslip = -Arup - slipVertex[0];
+      const double Aruqslip = -Aruq - slipVertex[1];
+      const double dlp = Sinv * Arupslip;
+      const double dlq = Sinv * Aruqslip;
+
+      const double dlx = Cpx * dlp + Cqx * dlq;
+      const double dly = Cpy * dlp + Cqy * dlq;
+
+      // Update displacements at negative vertex.
+      solutionVertexN[0] = dlx / jacobianVertexN[0];
+      solutionVertexN[1] = dly / jacobianVertexN[1];
+
+      // Update displacements at positive vertex.
+      solutionVertexP[0] = -dlx / jacobianVertexP[0];
+      solutionVertexP[1] = -dly / jacobianVertexP[0];
+
+      // Update Lagrange multiplier.
+      solutionVertexL[0] = dlp;
+      solutionVertexL[1] = dlq;
+
+      break;
+    } // case 2
+    case 3: {
+      assert(jacobianVertexN[0] > 0.0);
+      assert(jacobianVertexN[1] > 0.0);
+      assert(jacobianVertexN[2] > 0.0);
+      assert(jacobianVertexP[0] > 0.0);
+      assert(jacobianVertexP[1] > 0.0);
+      assert(jacobianVertexP[2] > 0.0);
+
+      const double Cpx = orientationVertex[0];
+      const double Cpy = orientationVertex[1];
+      const double Cpz = orientationVertex[2];
+      const double Cqx = orientationVertex[3];
+      const double Cqy = orientationVertex[4];
+      const double Cqz = orientationVertex[5];
+      const double Crx = orientationVertex[6];
+      const double Cry = orientationVertex[7];
+      const double Crz = orientationVertex[8];
+
+      // Check to make sure Jacobian is same at all DOF for
+      // vertices i and j (means S is diagonal with equal enties).
+      assert(jacobianVertexN[0] == jacobianVertexN[1] && jacobianVertexN[0] == jacobianVertexN[2]);
+      assert(jacobianVertexP[0] == jacobianVertexP[1] && jacobianVertexP[0] == jacobianVertexP[2]);
+
+      const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+          / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+      // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+      const double Arux = residualVertexN[0] / jacobianVertexN[0]
+          - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+          - dispTVertexP[0];
+      const double Aruy = residualVertexN[1] / jacobianVertexN[1]
+          - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
+          - dispTVertexP[1];
+      const double Aruz = residualVertexN[2] / jacobianVertexN[2]
+          - residualVertexP[2] / jacobianVertexP[2] + dispTVertexN[2]
+          - dispTVertexP[2];
+
+      // dl_k = D^{-1}( -C_{ki} Aru - d_k)
+      const double Arup = Cpx * Arux + Cpy * Aruy + Cpz * Aruz;
+      const double Aruq = Cqx * Arux + Cqy * Aruy + Cqz * Aruz;
+      const double Arur = Crx * Arux + Cry * Aruy + Crz * Aruz;
+      const double Arupslip = -Arup - slipVertex[0];
+      const double Aruqslip = -Aruq - slipVertex[1];
+      const double Arurslip = -Arur - slipVertex[2];
+      const double dlp = Sinv * Arupslip;
+      const double dlq = Sinv * Aruqslip;
+      const double dlr = Sinv * Arurslip;
+
+      const double dlx = Cpx * dlp + Cqx * dlq + Crx * dlr;
+      const double dly = Cpy * dlp + Cqy * dlq + Cry * dlr;
+      const double dlz = Cpz * dlp + Cqz * dlq + Crz * dlr;
+
+      // Update displacements at negative vertex.
+      solutionVertexN[0] = dlx / jacobianVertexN[0];
+      solutionVertexN[1] = dly / jacobianVertexN[1];
+      solutionVertexN[2] = dlz / jacobianVertexN[2];
+
+      // Update displacements at positive vertex.
+      solutionVertexP[0] = -dlx / jacobianVertexP[0];
+      solutionVertexP[1] = -dly / jacobianVertexP[1];
+      solutionVertexP[2] = -dlz / jacobianVertexP[2];
+
+      // Update Lagrange multiplier.
+      solutionVertexL[0] = dlp;
+      solutionVertexL[1] = dlq;
+      solutionVertexL[2] = dlr;
+
+      break;
+    } // case 3
+    default:
+      assert(0);
+      throw std::logic_error("Unknown spatial dimension.");
+    } // switch
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(computeEvent);
+    _logger->eventBegin(updateEvent);
+#endif
+
+    assert(solutionVertexN.size() == solutionSection->getFiberDimension(v_negative));
+    solutionSection->updateAddPoint(v_negative, &solutionVertexN[0]);
+
+    assert(solutionVertexP.size() == solutionSection->getFiberDimension(v_positive));
+    solutionSection->updateAddPoint(v_positive, &solutionVertexP[0]);
+
+    assert(solutionVertexL.size() == solutionSection->getFiberDimension(v_lagrange));
+    solutionSection->updateAddPoint(v_lagrange, &solutionVertexL[0]);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(updateEvent);
+#endif
+  } // for
+
+  switch(spaceDim) {
+  case 1:
+    PetscLogFlops(numVertices*17);
+    break;
+  case 2:
+    PetscLogFlops(numVertices*41);
+    break;
+  case 3:
+    PetscLogFlops(numVertices*72);
+    break;
+  default:
+    assert(0);
+    throw std::logic_error("Unknown spatial dimension.");
+  } // switch
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventEnd(computeEvent);
+#endif
+} // adjustSolnLumped
+
+// ----------------------------------------------------------------------
+// Verify configuration is acceptable.
+void
+pylith::faults::FaultCohesiveLagrange::verifyConfiguration(const topology::Mesh& mesh) const
+{ // verifyConfiguration
+  assert(0 != _quadrature);
+
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  assert(!sieveMesh.isNull());
+
+  if (!sieveMesh->hasIntSection(label())) {
+    std::ostringstream msg;
+    msg << "Mesh missing group of vertices '" << label()
+        << " for boundary condition.";
+    throw std::runtime_error(msg.str());
+  } // if  
+
+  // check compatibility of mesh and quadrature scheme
+  const int dimension = mesh.dimension() - 1;
+  if (_quadrature->cellDim() != dimension) {
+    std::ostringstream msg;
+    msg << "Dimension of reference cell in quadrature scheme ("
+        << _quadrature->cellDim()
+        << ") does not match dimension of cells in mesh (" << dimension
+        << ") for fault '" << label() << "'.";
+    throw std::runtime_error(msg.str());
+  } // if
+
+  const int numCorners = _quadrature->refGeometry().numCorners();
+  const ALE::Obj<SieveMesh::label_sequence>& cells =
+      sieveMesh->getLabelStratum("material-id", id());
+  assert(!cells.isNull());
+  const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
+  const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
+  for (SieveMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
+      != cellsEnd; ++c_iter) {
+    const int cellNumCorners = sieveMesh->getNumCellCorners(*c_iter);
+    if (3 * numCorners != cellNumCorners) {
+      std::ostringstream msg;
+      msg << "Number of vertices in reference cell (" << numCorners
+          << ") is not compatible with number of vertices (" << cellNumCorners
+          << ") in cohesive cell " << *c_iter << " for fault '" << label()
+          << "'.";
+      throw std::runtime_error(msg.str());
+    } // if
+  } // for
+} // verifyConfiguration
+
+// ----------------------------------------------------------------------
+// Initialize auxiliary cohesive cell information.
+void pylith::faults::FaultCohesiveLagrange::_initializeCohesiveInfo(const topology::Mesh& mesh)
+{ // _initializeCohesiveInfo
+  assert(0 != _quadrature);
+
+  // Get cohesive cells
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cells =
+      sieveMesh->getLabelStratum("material-id", id());
+  assert(!cells.isNull());
+  const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
+  const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
+
+  const int numConstraintVert = _quadrature->numBasis();
+  const int numCorners = 3 * numConstraintVert; // cohesive cell
+
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+  assert(!faultSieveMesh.isNull());
+  SubMesh::renumbering_type& renumbering = faultSieveMesh->getRenumbering();
+  const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
+    renumbering.end();
+  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+      faultSieveMesh->depthStratum(0);
+
+  typedef std::map<int, int> indexmap_type;
+  indexmap_type indexMap;
+  _cohesiveVertices.resize(vertices->size());
+  int index = 0;
+
+  const ALE::Obj<SieveMesh::sieve_type>& sieve = mesh.sieveMesh()->getSieve();
+  assert(!sieve.isNull());
+  typedef ALE::SieveAlg<SieveMesh> SieveAlg;
+
+  ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type> ncV(*sieve,
+      (size_t) pow(sieve->getMaxConeSize(), std::max(0, sieveMesh->depth())));
+
+  for (SieveMesh::label_sequence::iterator c_iter=cellsBegin;
+      c_iter != cellsEnd;
+      ++c_iter) {
+    // Get oriented closure
+    ncV.clear();
+    ALE::ISieveTraversal<SieveMesh::sieve_type>::orientedClosure(*sieve, *c_iter, ncV);
+    const int coneSize = ncV.getSize();
+    assert(coneSize == numCorners);
+    const Mesh::point_type *cone = ncV.getPoints();
+    assert(0 != cone);
+
+    for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
+      // normal cohesive vertices i and j and constraint vertex k
+      const int indexI = iConstraint;
+      const int indexJ = iConstraint + numConstraintVert;
+      const int indexK = iConstraint + 2 * numConstraintVert;
+
+      const int v_lagrange = cone[indexK];
+      const int v_negative = cone[indexI];
+      const int v_positive = cone[indexJ];
+      const int v_fault = renumbering[v_lagrange];
+
+      if (indexMap.end() == indexMap.find(v_lagrange)) {
+        _cohesiveVertices[index].lagrange = v_lagrange;
+        _cohesiveVertices[index].positive = v_positive;
+        _cohesiveVertices[index].negative = v_negative;
+        _cohesiveVertices[index].fault = v_fault;
+#if 0
+	std::cout << "cohesiveVertices[" << index << "]: "
+		  << "l: " << v_lagrange
+		  << ", p: " << v_positive
+		  << ", n: " << v_negative
+		  << ", f: " << v_fault
+		  << std::endl;
+#endif
+        indexMap[v_lagrange] = index; // add index to map
+        ++index;
+      } // if
+    } // for
+  } // for
+} // _initializeCohesiveInfo
+
+// ----------------------------------------------------------------------
+// Initialize logger.
+void
+pylith::faults::FaultCohesiveLagrange::_initializeLogger(void)
+{ // initializeLogger
+  delete _logger;
+  _logger = new utils::EventLogger;
+  assert(0 != _logger);
+  _logger->className("FaultCohesiveLagrange");
+  _logger->initialize();
+
+  _logger->registerEvent("FaAS setup");
+  _logger->registerEvent("FaAS geometry");
+  _logger->registerEvent("FaAS compute");
+  _logger->registerEvent("FaAS restrict");
+  _logger->registerEvent("FaAS update");
+
+  _logger->registerEvent("FaIR setup");
+  _logger->registerEvent("FaIR geometry");
+  _logger->registerEvent("FaIR compute");
+  _logger->registerEvent("FaIR restrict");
+  _logger->registerEvent("FaIR update");
+
+  _logger->registerEvent("FaIJ setup");
+  _logger->registerEvent("FaIJ geometry");
+  _logger->registerEvent("FaIJ compute");
+  _logger->registerEvent("FaIJ restrict");
+  _logger->registerEvent("FaIJ update");
+} // initializeLogger
+
+// ----------------------------------------------------------------------
+// Calculate orientation at fault vertices.
+void
+pylith::faults::FaultCohesiveLagrange::_calcOrientation(const double upDir[3],
+						   const double normalDir[3])
+{ // _calcOrientation
+  assert(0 != upDir);
+  assert(0 != normalDir);
+  assert(0 != _faultMesh);
+  assert(0 != _fields);
+
+  double_array upDirArray(upDir, 3);
+
+  // Get vertices in fault mesh.
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+  assert(!faultSieveMesh.isNull());
+  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+      faultSieveMesh->depthStratum(0);
+  const SieveSubMesh::label_sequence::iterator verticesBegin =
+      vertices->begin();
+  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+  // Containers for orientation information.
+  const int cohesiveDim = _faultMesh->dimension();
+  const int numBasis = _quadrature->numBasis();
+  const int spaceDim = _quadrature->spaceDim();
+  const int orientationSize = spaceDim * spaceDim;
+  const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
+  const double_array& verticesRef = cellGeometry.vertices();
+  const int jacobianSize = (cohesiveDim > 0) ? spaceDim * cohesiveDim : 1;
+  const double_array& quadWts = _quadrature->quadWts();
+  double_array jacobian(jacobianSize);
+  double jacobianDet = 0;
+  double_array orientationVertex(orientationSize);
+  double_array coordinatesCell(numBasis * spaceDim);
+  double_array refCoordsVertex(cohesiveDim);
+
+  // Allocate orientation field.
+  _fields->add("orientation", "orientation");
+  topology::Field<topology::SubMesh>& orientation = _fields->get("orientation");
+  const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+  orientation.newSection(slip, orientationSize);
+  const ALE::Obj<RealSection>& orientationSection = orientation.section();
+  assert(!orientationSection.isNull());
+  // Create subspaces for along-strike, up-dip, and normal directions
+  for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
+    orientationSection->addSpace();
+  for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
+    orientationSection->setFiberDimension(vertices, spaceDim, iDim);
+  orientation.allocate();
+  orientation.zero();
+
+  // Get fault cells.
+  const ALE::Obj<SieveSubMesh::label_sequence>& cells =
+      faultSieveMesh->heightStratum(0);
+  assert(!cells.isNull());
+  const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
+  const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
+
+  // Compute orientation of fault at constraint vertices
+
+  // Get section containing coordinates of vertices
+  const ALE::Obj<RealSection>& coordinatesSection =
+      faultSieveMesh->getRealSection("coordinates");
+  assert(!coordinatesSection.isNull());
+  topology::Mesh::RestrictVisitor coordinatesVisitor(*coordinatesSection,
+    coordinatesCell.size(), &coordinatesCell[0]);
+
+  // Set orientation function
+  assert(cohesiveDim == _quadrature->cellDim());
+  assert(spaceDim == _quadrature->spaceDim());
+
+  // Loop over cohesive cells, computing orientation weighted by
+  // jacobian at constraint vertices
+
+  const ALE::Obj<SieveSubMesh::sieve_type>& sieve = faultSieveMesh->getSieve();
+  assert(!sieve.isNull());
+  typedef ALE::SieveAlg<SieveSubMesh> SieveAlg;
+
+  ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type>
+      ncV(*sieve, (size_t) pow(sieve->getMaxConeSize(), std::max(0,
+        faultSieveMesh->depth())));
+
+  for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
+      != cellsEnd; ++c_iter) {
+    // Get orientations at fault cell's vertices.
+    coordinatesVisitor.clear();
+    faultSieveMesh->restrictClosure(*c_iter, coordinatesVisitor);
+
+    ncV.clear();
+    ALE::ISieveTraversal<SieveSubMesh::sieve_type>::orientedClosure(*sieve,
+      *c_iter, ncV);
+    const int coneSize = ncV.getSize();
+    const Mesh::point_type *cone = ncV.getPoints();
+
+    for (int v = 0; v < coneSize; ++v) {
+      // Compute Jacobian and determinant of Jacobian at vertex
+      memcpy(&refCoordsVertex[0], &verticesRef[v * cohesiveDim], cohesiveDim
+          * sizeof(double));
+      cellGeometry.jacobian(&jacobian, &jacobianDet, coordinatesCell,
+        refCoordsVertex);
+
+      // Compute orientation
+      cellGeometry.orientation(&orientationVertex, jacobian, jacobianDet,
+        upDirArray);
+
+      // Update orientation
+      orientationSection->updateAddPoint(cone[v], &orientationVertex[0]);
+    } // for
+  } // for
+
+  //orientation.view("ORIENTATION BEFORE COMPLETE");
+
+  // Assemble orientation information
+  orientation.complete();
+
+  // Loop over vertices, make orientation information unit magnitude
+  double_array vertexDir(orientationSize);
+  int count = 0;
+  for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+      != verticesEnd; ++v_iter, ++count) {
+    orientationVertex = 0.0;
+    orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
+      orientationVertex.size());
+    for (int iDim = 0; iDim < spaceDim; ++iDim) {
+      double mag = 0;
+      for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
+        mag += pow(orientationVertex[index + jDim], 2);
+      mag = sqrt(mag);
+      assert(mag > 0.0);
+      for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
+        orientationVertex[index + jDim] /= mag;
+    } // for
+
+    orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
+  } // for
+  PetscLogFlops(count * orientationSize * 4);
+
+  if (2 == cohesiveDim && vertices->size() > 0) {
+    // Check orientation of first vertex, if dot product of fault
+    // normal with preferred normal is negative, flip up/down dip
+    // direction.
+    //
+    // If the user gives the correct normal direction (points from
+    // footwall to ahanging wall), we should end up with
+    // left-lateral-slip, reverse-slip, and fault-opening for positive
+    // slip values.
+    //
+    // When we flip the up/down dip direction, we create a left-handed
+    // strike/dip/normal coordinate system, but it gives the correct
+    // sense of slip. In reality the strike/dip/normal directions that
+    // are used are the opposite of what we would want, but we cannot
+    // flip the fault normal direction because it is tied to how the
+    // cohesive cells are created.
+
+    assert(vertices->size() > 0);
+    orientationSection->restrictPoint(*vertices->begin(),
+      &orientationVertex[0], orientationVertex.size());
+
+    assert(3 == spaceDim);
+    double_array normalDirVertex(&orientationVertex[6], 3);
+    const double normalDot = normalDir[0] * normalDirVertex[0] + normalDir[1]
+        * normalDirVertex[1] + normalDir[2] * normalDirVertex[2];
+
+    const int istrike = 0;
+    const int idip = 3;
+    const int inormal = 6;
+    if (normalDot < 0.0) {
+      // Flip dip direction
+      for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+          != verticesEnd; ++v_iter) {
+        orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
+          orientationVertex.size());
+        assert(9 == orientationSection->getFiberDimension(*v_iter));
+        for (int iDim = 0; iDim < 3; ++iDim) // flip dip
+          orientationVertex[idip + iDim] *= -1.0;
+
+        // Update direction
+        orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
+      } // for
+      PetscLogFlops(5 + count * 3);
+    } // if
+  } // if
+
+  //orientation.view("ORIENTATION");
+} // _calcOrientation
+
+// ----------------------------------------------------------------------
+void
+pylith::faults::FaultCohesiveLagrange::_calcArea(void)
+{ // _calcArea
+  assert(0 != _faultMesh);
+  assert(0 != _fields);
+
+  // Containers for area information
+  const int cellDim = _quadrature->cellDim();
+  const int numBasis = _quadrature->numBasis();
+  const int numQuadPts = _quadrature->numQuadPts();
+  const int spaceDim = _quadrature->spaceDim();
+  const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
+  const double_array& quadWts = _quadrature->quadWts();
+  assert(quadWts.size() == numQuadPts);
+  double jacobianDet = 0;
+  double_array areaCell(numBasis);
+
+  // Get vertices in fault mesh.
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+  assert(!faultSieveMesh.isNull());
+  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+      faultSieveMesh->depthStratum(0);
+  const SieveSubMesh::label_sequence::iterator verticesBegin =
+      vertices->begin();
+  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+  // Allocate area field.
+  _fields->add("area", "area");
+
+  topology::Field<topology::SubMesh>& area = _fields->get("area");
+  const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+  area.newSection(slip, 1);
+  area.allocate();
+  area.zero();
+  const ALE::Obj<RealSection>& areaSection = area.section();
+  assert(!areaSection.isNull());
+  topology::Mesh::UpdateAddVisitor areaVisitor(*areaSection, &areaCell[0]);
+
+  double_array coordinatesCell(numBasis * spaceDim);
+  const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
+    "coordinates");
+  assert(!coordinates.isNull());
+  topology::Mesh::RestrictVisitor coordsVisitor(*coordinates,
+    coordinatesCell.size(), &coordinatesCell[0]);
+
+  const ALE::Obj<SieveSubMesh::label_sequence>& cells =
+      faultSieveMesh->heightStratum(0);
+  assert(!cells.isNull());
+  const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
+  const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
+
+  // Loop over cells in fault mesh, compute area
+  for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
+      != cellsEnd; ++c_iter) {
+    areaCell = 0.0;
+
+    // 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
+
+    // Get cell geometry information that depends on cell
+    const double_array& basis = _quadrature->basis();
+    const double_array& jacobianDet = _quadrature->jacobianDet();
+
+    // Compute area
+    for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
+      const double wt = quadWts[iQuad] * jacobianDet[iQuad];
+      for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
+        const double dArea = wt * basis[iQuad * numBasis + iBasis];
+        areaCell[iBasis] += dArea;
+      } // for
+    } // for
+    areaVisitor.clear();
+    faultSieveMesh->updateClosure(*c_iter, areaVisitor);
+
+    PetscLogFlops( numQuadPts*(1+numBasis*2) );
+  } // for
+
+  // Assemble area information
+  area.complete();
+
+#if 0 // DEBUGGING
+  area.view("AREA");
+  //_faultMesh->getSendOverlap()->view("Send fault overlap");
+  //_faultMesh->getRecvOverlap()->view("Receive fault overlap");
+#endif
+} // _calcArea
+
+// ----------------------------------------------------------------------
+// Compute change in tractions on fault surface using solution.
+// NOTE: We must convert vertex labels to fault vertex labels
+void
+pylith::faults::FaultCohesiveLagrange::_calcTractionsChange(
+    topology::Field<topology::SubMesh>* tractions,
+    const topology::Field<topology::Mesh>& dispT)
+{ // _calcTractionsChange
+  assert(0 != tractions);
+  assert(0 != _faultMesh);
+  assert(0 != _fields);
+  assert(0 != _normalizer);
+
+  tractions->label("traction_change");
+  tractions->scale(_normalizer->pressureScale());
+
+  // Fiber dimension of tractions matches spatial dimension.
+  const int fiberDim = _quadrature->spaceDim();
+  double_array tractionsVertex(fiberDim);
+
+  // Get sections.
+  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+  assert(!areaSection.isNull());
+  const ALE::Obj<RealSection>& dispTSection = dispT.section();
+  assert(!dispTSection.isNull());
+
+  // Allocate buffer for tractions field (if necessary).
+  const ALE::Obj<RealSection>& tractionsSection = tractions->section();
+  if (tractionsSection.isNull()) {
+    ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+    //logger.stagePush("Fault");
+
+    const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+    tractions->newSection(slip, fiberDim);
+    tractions->allocate();
+
+    //logger.stagePop();
+  } // if
+  assert(!tractionsSection.isNull());
+  tractions->zero();
+
+  const double pressureScale = tractions->scale();
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    const int v_fault = _cohesiveVertices[iVertex].fault;
+
+    assert(fiberDim == dispTSection->getFiberDimension(v_lagrange));
+    assert(fiberDim == tractionsSection->getFiberDimension(v_fault));
+    assert(1 == areaSection->getFiberDimension(v_fault));
+
+    const double* dispTVertex = dispTSection->restrictPoint(v_lagrange);
+    assert(0 != dispTVertex);
+    const double* areaVertex = areaSection->restrictPoint(v_fault);
+    assert(0 != areaVertex);
+
+    for (int i = 0; i < fiberDim; ++i)
+      tractionsVertex[i] = dispTVertex[i] / areaVertex[0];
+
+    assert(tractionsVertex.size() == tractionsSection->getFiberDimension(v_fault));
+    tractionsSection->updatePoint(v_fault, &tractionsVertex[0]);
+  } // for
+
+  PetscLogFlops(numVertices * (1 + fiberDim) );
+
+#if 0 // DEBUGGING
+  tractions->view("TRACTIONS");
+#endif
+} // _calcTractionsChange
+
+// ----------------------------------------------------------------------
+// Allocate buffer for vector field.
+void
+pylith::faults::FaultCohesiveLagrange::_allocateBufferVectorField(void)
+{ // _allocateBufferVectorField
+  assert(0 != _fields);
+  if (_fields->hasField("buffer (vector)"))
+    return;
+
+  ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+  logger.stagePush("Output");
+
+  // Create vector field; use same shape/chart as slip field.
+  assert(0 != _faultMesh);
+  _fields->add("buffer (vector)", "buffer");
+  topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (vector)");
+  const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+  buffer.cloneSection(slip);
+  buffer.zero();
+
+  logger.stagePop();
+} // _allocateBufferVectorField
+
+// ----------------------------------------------------------------------
+// Allocate buffer for scalar field.
+void
+pylith::faults::FaultCohesiveLagrange::_allocateBufferScalarField(void)
+{ // _allocateBufferScalarField
+  assert(0 != _fields);
+  if (_fields->hasField("buffer (scalar)"))
+    return;
+
+  ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+  logger.stagePush("Output");
+
+  // Create vector field; use same shape/chart as area field.
+  assert(0 != _faultMesh);
+  _fields->add("buffer (scalar)", "buffer");
+  topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (scalar)");
+  const topology::Field<topology::SubMesh>& area = _fields->get("area");
+  buffer.cloneSection(area);
+  buffer.zero();
+
+  logger.stagePop();
+} // _allocateBufferScalarField
+
+
+// End of file 

Added: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,251 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file libsrc/faults/FaultCohesiveLagrange.hh
+ *
+ * @brief C++ abstract base class for implementing fault slip using
+ * Lagrange multipliers and cohesive cells.
+ */
+
+#if !defined(pylith_faults_faultcohesivelagrange_hh)
+#define pylith_faults_faultcohesivelagrange_hh
+
+// Include directives ---------------------------------------------------
+#include "FaultCohesive.hh" // ISA FaultCohesive
+
+// FaultCohesiveLagrange -----------------------------------------------------
+/**
+ * @brief C++ abstract base class for implementing falt slip using
+ * Lagrange multipliers and cohesive cells.
+ *
+ * Fault boundary condition is specified using Lagrange
+ * multipliers. The constraints are associated with "constraint"
+ * vertices which sit between the pair of vertices on each side of the
+ * fault. 
+ *
+ * The ordering of vertices in a cohesive cell is the vertices on the
+ * "negative" side of the fault, the corresponding entries on the
+ * "positive" side of the fault, and then the corresponding constraint
+ * vertices.
+ *
+ * The system without Lagrange multipliers is
+ *
+ * [A(t+dt)]{u(t+dt)} = {b(t+dt)}
+ *
+ * With Lagrange multipliers this system becomes
+ *
+ * [A(t+dt) C^T ]{ u(t+dt) } = {b(t+dt)}
+ * [ C      0   ]{ L(t+dt) }   {D(t+dt)}
+ *
+ * where C is the matrix of Lagrange constraints, L is the vector of
+ * Lagrange multiplies (internal forces in this case), and D is the
+ * fault slip.
+ *
+ * We solve for the increment in the displacement field, so we rewrite
+ * the system as
+ *
+ * [A(t+dt) C^T ]{ du(t) } = {b(t+dt)} - [A(t+dt) C^T ]{ u(t) }
+ * [ C      0   ]{ dL(t) }   {D(t+dt)}   [ C      0   ]{ L(t) }
+ * 
+ * We form the residual as
+ *
+ * {r(t+dt)} = {b(t+dt)} - [A(t+dt) C^T ]{ u(t)+du(t) }
+ *             {D(t+dt)}   [ C      0   ]{ L(t)+dL(t) }
+ * 
+ * The terms in the residual contributing to the DOF at the Lagrange
+ * vertices are
+ *
+ * {r(t+dt)} = {D(t+dt)} - [C]{u(t)+dt(t)}
+ *
+ * The term in the residual contributing to the DOF at the
+ * non-Lagrange vertices of the cohesive cells is
+ *
+ * {r(t+dt)} = -[C]^T{L(t)+dL(t)}
+ *
+ * We integrate the Lagrange multiplier term and the relative
+ * displacement term over the cohesive cells, because this introduces
+ * weighting of the orientation of the fault for the direction of slip
+ * at the vertices of the cohesive cells.
+ */
+class pylith::faults::FaultCohesiveLagrange : public FaultCohesive
+{ // class FaultCohesiveLagrange
+  friend class TestFaultCohesiveLagrange; // unit testing
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /// Default constructor.
+  FaultCohesiveLagrange(void);
+
+  /// Destructor.
+  virtual
+  ~FaultCohesiveLagrange(void);
+
+  /// Deallocate PETSc and local data structures.
+  virtual
+  void deallocate(void);
+  
+  /** Initialize fault. Determine orientation and setup boundary
+   * condition parameters.
+   *
+   * @param mesh Finite-element mesh.
+   * @param upDir Direction perpendicular to along-strike direction that is 
+   *   not collinear with fault normal (usually "up" direction but could 
+   *   be up-dip direction; only applies to fault surfaces in a 3-D domain).
+   * @param normalDir General preferred direction for fault normal
+   *   (used to pick which of two possible normal directions for
+   *   interface; only applies to fault surfaces in a 3-D domain).
+   */
+  virtual
+  void initialize(const topology::Mesh& mesh,
+		  const double upDir[3],
+		  const double normalDir[3]);
+
+  /** Split solution field for separate preconditioning.
+   *
+   * @param field Solution field.
+   */
+  void splitField(topology::Field<topology::Mesh>* field);
+
+  /** Integrate contributions to residual term (r) for operator that
+   * do not require assembly across cells, vertices, or processors.
+   *
+   * @param residual Field containing values for residual
+   * @param t Current time
+   * @param fields Solution fields
+   */
+  virtual
+  void integrateResidualAssembled(const topology::Field<topology::Mesh>& residual,
+				  const double t,
+				  topology::SolutionFields* const fields);
+
+  /** Integrate contributions to Jacobian matrix (A) associated with
+   * operator that do not require assembly across cells, vertices, or
+   * processors.
+   *
+   * @param jacobian Sparse matrix
+   * @param t Current time
+   * @param fields Solution fields
+   */
+  virtual
+  void integrateJacobianAssembled(topology::Jacobian* jacobian,
+				  const double t,
+				  topology::SolutionFields* const fields);
+
+  /** Integrate contributions to Jacobian matrix (A) associated with
+   * operator that do not require assembly across cells, vertices, or
+   * processors.
+   *
+   * @param jacobian Diagonal Jacobian matrix as a field.
+   * @param t Current time
+   * @param fields Solution fields
+   */
+  virtual
+  void integrateJacobianAssembled(topology::Field<topology::Mesh>* jacobian,
+				  const double t,
+				  topology::SolutionFields* const fields);
+
+  /** Adjust solution from solver with lumped Jacobian to match Lagrange
+   *  multiplier constraints.
+   *
+   * @param fields Solution fields
+   * @param jacobian Jacobian of the system.
+   */
+  virtual
+  void adjustSolnLumped(topology::SolutionFields* fields,
+			const topology::Field<topology::Mesh>& jacobian);
+
+  /** Verify configuration is acceptable.
+   *
+   * @param mesh Finite-element mesh
+   */
+  virtual
+  void verifyConfiguration(const topology::Mesh& mesh) const;
+
+  // PROTECTED STRUCTS //////////////////////////////////////////////////
+protected :
+
+  /** Data structure to hold relations between vertices in cohesive cell
+   *  in mesh of domain and cell of fault mesh.
+   */
+  struct CohesiveInfo {
+    int lagrange; ///< Vertex associated with Lagrange multiplier.
+    int positive; ///< Vertex on positive side of the fault.
+    int negative; ///< Vertex on negative side of the fault.
+    int fault; ///< Vertex in fault mesh.
+  };
+
+  // PROTECTED METHODS //////////////////////////////////////////////////
+protected :
+
+  /** Initialize auxiliary cohesive cell information.
+   *
+   * @param mesh Finite-element mesh of the domain.
+   */
+  void _initializeCohesiveInfo(const topology::Mesh& mesh);
+
+  /** Compute change in tractions on fault surface using solution.
+   *
+   * @param tractions Field for tractions.
+   * @param solution Solution over domain
+   */
+  void _calcTractionsChange(topology::Field<topology::SubMesh>* tractions,
+          const topology::Field<topology::Mesh>& solution);
+
+  /// Allocate buffer for vector field.
+  void _allocateBufferVectorField(void);
+
+  /// Allocate buffer for scalar field.
+  void _allocateBufferScalarField(void);
+
+  // PROTECTED MEMBERS //////////////////////////////////////////////////
+protected :
+
+  /// Array of cohesive vertex information.
+  std::vector<CohesiveInfo> _cohesiveVertices;
+
+  // PRIVATE METHODS ////////////////////////////////////////////////////
+private :
+
+  /// Initialize logger.
+  void _initializeLogger(void);
+  
+  /** Calculate orientation at fault vertices.
+   *
+   * @param upDir Direction perpendicular to along-strike direction that is 
+   *   not collinear with fault normal (usually "up" direction but could 
+   *   be up-dip direction; only applies to fault surfaces in a 3-D domain).
+   * @param normalDir General preferred direction for fault normal
+   *   (used to pick which of two possible normal directions for
+   *   interface; only applies to fault surfaces in a 3-D domain).
+   */
+  void _calcOrientation(const double upDir[3],
+			const double normalDir[3]);
+
+  /// Calculate fault area field.
+  void _calcArea(void);
+
+  // NOT IMPLEMENTED ////////////////////////////////////////////////////
+private :
+
+  /// Not implemented
+  FaultCohesiveLagrange(const FaultCohesiveLagrange&);
+
+  /// Not implemented
+  const FaultCohesiveLagrange& operator=(const FaultCohesiveLagrange&);
+
+}; // class FaultCohesiveLagrange
+
+#endif // pylith_faults_faultcohesivelagrange_hh
+
+
+// End of file 

Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveTract.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveTract.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveTract.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -70,8 +70,8 @@
   assert(0 != _quadrature);
 
   delete _faultMesh; _faultMesh = new topology::SubMesh();
-  CohesiveTopology::createFaultParallel(_faultMesh, &_cohesiveToFault, 
-					mesh, id(), useLagrangeConstraints());
+  CohesiveTopology::createFaultParallel(_faultMesh, mesh, id(),
+    useLagrangeConstraints());
 
   // Reset fields.
   delete _fields; 
@@ -99,330 +99,7 @@
 			   const double t,
 			   topology::SolutionFields* const fields)
 { // integrateResidual
-  assert(0 != _quadrature);
-  assert(0 != _faultMesh);
-  assert(0 != _fields);
-
-  // debugging
-  residual.view("RESIDUAL BEFORE FRICTION");
-
-  // Get cell geometry information that doesn't depend on cell
-  const int numQuadPts = _quadrature->numQuadPts();
-  const double_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
-  const int numBasis = _quadrature->numBasis();
-  const int spaceDim = _quadrature->spaceDim();
-  const int numCornersCohesive = 2*numBasis;
-  const int orientationSize = spaceDim*spaceDim;
-
-  // Get cohesive cells.
-  const ALE::Obj<SieveMesh>& sieveMesh = residual.mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive = 
-    sieveMesh->getLabelStratum("material-id", id());
-  assert(!cellsCohesive.isNull());
-  const SieveSubMesh::label_sequence::iterator cellsBegin = cellsCohesive->begin();
-  const SieveSubMesh::label_sequence::iterator cellsEnd = cellsCohesive->end();
-
-  // Get fault mesh.
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-
-  // Get sections.
-
-  // Get residual.
-  const ALE::Obj<RealSection>& residualSection = residual.section();
-  assert(!residualSection.isNull());
-  double_array residualCell(numCornersCohesive*spaceDim);
-  topology::Mesh::UpdateAddVisitor residualVisitor(*residualSection,
-						   &residualCell[0]);
-  double_array forcesCurrentCell(numCornersCohesive*spaceDim);
-  RestrictVisitor forcesCurrentVisitor(*residualSection,
-				       forcesCurrentCell.size(), &forcesCurrentCell[0]);
-  
-  // Get displacements.
-  double_array dispCell(numCornersCohesive*spaceDim);
-  const ALE::Obj<RealSection>& dispSection = fields->get("disp(t)").section();
-  assert(!dispSection.isNull());
-  RestrictVisitor dispVisitor(*dispSection,
-			      dispCell.size(), &dispCell[0]);
-  double_array dispIncrCell(numCornersCohesive*spaceDim);
-  const ALE::Obj<RealSection>& dispIncrSection = fields->get("dispIncr(t->t+dt)").section();
-  assert(!dispIncrSection.isNull());
-  RestrictVisitor dispIncrVisitor(*dispIncrSection,
-				  dispIncrCell.size(), &dispIncrCell[0]);
-  double_array dispTpdtCell(numCornersCohesive*spaceDim);
-  
-  // Get initial tractions (if exist).
-  double_array tractionInitialFault(numQuadPts*spaceDim);
-  const ALE::Obj<RealSection>& tractionInitialSection = (0 != _dbInitial) ?
-    _fields->get("initial traction").section() : 0;
-
-  // Get orientation.
-  double_array orientationCell(numQuadPts*orientationSize);
-  const ALE::Obj<RealSection>& orientationSection = _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
-
-  // Values defined at quadrature points.
-  double_array tractionsCurrentCell(numQuadPts*spaceDim);
-  double_array tractionCell(numQuadPts*spaceDim); // friction
-  double_array slip(spaceDim); // slip at quad pt
-  double_array tractionsCurrentFault(spaceDim); // current tractions at quad pt
-  double_array tractionFault(spaceDim); // friction at quad pt
-
-#if !defined(PRECOMPUTE_GEOMETRY)
-  double_array coordinatesCell(numBasis*spaceDim);
-  const ALE::Obj<RealSection>& coordinates = 
-    faultSieveMesh->getRealSection("coordinates");
-  RestrictVisitor coordsVisitor(*coordinates,
-				coordinatesCell.size(), &coordinatesCell[0]);
-#endif
-
-  // Loop over faces and integrate contribution from each face
-  for (SieveSubMesh::label_sequence::iterator c_iter=cellsBegin;
-       c_iter != cellsEnd;
-       ++c_iter) {
-    const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-    residualCell = 0.0;
-
-#if defined(PRECOMPUTE_GEOMETRY)
-    _quadrature->retrieveGeometry(*c_iter);
-#else
-    coordsVisitor.clear();
-    faultSieveMesh->restrictClosure(c_fault, coordsVisitor);
-    _quadrature->computeGeometry(coordinatesCell, c_fault);
-#endif
-
-    // Get cell geometry information that depends on cell
-    const double_array& basis = _quadrature->basis();
-    const double_array& jacobianDet = _quadrature->jacobianDet();
-
-    // Get displacements at vertices of cohesive cell.
-    dispVisitor.clear();
-    sieveMesh->restrictClosure(*c_iter, dispVisitor);
-    dispIncrVisitor.clear();
-    sieveMesh->restrictClosure(*c_iter, dispIncrVisitor);
-
-    // Compute current estimate of displacement at time t+dt using
-    // solution increment.
-    dispTpdtCell = dispCell + dispIncrCell;
-
-    // Get current forces at vertices of cohesive cell (current residual).
-    forcesCurrentVisitor.clear();
-    sieveMesh->restrictClosure(*c_iter, forcesCurrentVisitor);
-
-    // Get initial tractions for fault cell.
-    if (0 != _dbInitial) {
-      assert(!tractionInitialSection.isNull());
-      tractionInitialSection->restrictPoint(c_fault, &tractionInitialFault[0],
-					    tractionInitialFault.size());
-    } // if
-
-    // Get fault orientation at quadrature points.
-    orientationSection->restrictPoint(c_fault, &orientationCell[0],
-				      orientationCell.size());
-
-    tractionCell = 0.0;
-    for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
-      // wt is also area associated with quadrature point
-      const double wt = quadWts[iQuad] * jacobianDet[iQuad];
-
-      // Compute slip at current quad pt in global coordinate system.
-      // In: dispTpdtCell [2*numBasis*spaceDim] (negative side then positive side??)
-      //     basis [numQuadpts*numBasis]
-      // Out: slipGlobal [spaceDim]
-      // Use basis functions to compute displacement at quadrature point and
-      // then difference displacements to get slip.
-      // ADD STUFF HERE
-      double_array dispQuadPt(spaceDim*2);
-      double_array slipGlobal(spaceDim);
-      for (int iBasis=0; iBasis < numBasis; ++iBasis) {
-	for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
-	  dispQuadPt[iSpace] += basis[iQuad*numBasis+iBasis]
-	    *dispTpdtCell[iBasis*spaceDim+iSpace];
-	  dispQuadPt[spaceDim+iSpace] += basis[iQuad*numBasis+iBasis]
-	    *dispTpdtCell[(iBasis+numBasis)*spaceDim+iSpace];
-	}
-      }
-      for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
-	slipGlobal[iSpace] = dispQuadPt[spaceDim+iSpace]
-	  -dispQuadPt[iSpace];
-      }
-	 
-      // Compute slip in fault orientation.
-      // In: slipGlobal [spaceDim]
-      //     orientationCell [numQuadPts*spaceDim*spaceDim, iQuadPt*spaceDim*spaceDim+iDim*spaceDim+jDim]
-      // Out: slipFault [spaceDim]
-      // Use orientation to rotate from global to fault orientation.
-      // ADD STUFF HERE
-      double_array slipFault(spaceDim);
-      for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
-	for (int jSpace=0; jSpace < spaceDim; ++jSpace) {
-	  slipFault[iSpace] += slipGlobal[jSpace]
-	    *orientationCell[iQuad*spaceDim*spaceDim+iSpace*spaceDim+jSpace];
-	}
-      }
-	       
-
-      // Compute traction from current deformation in global coordinate system. (tractionCurrentGlobal)
-      // In: forcesCurrentCell [2*numBasis*spaceDim] (negative side then positive side)
-      // Out: tractionCurrentGlobal [spaceDim]
-      // Use basis functions to compute forces at quadrature point, then difference to get relative forces,
-      // and divide by area to get traction vector.
-      // ADD STUFF HERE
-      double_array forcesQuadPt(2*spaceDim);
-      double_array tractionCurrentGlobal(spaceDim);
-      for (int iBasis=0; iBasis < numBasis; ++iBasis) {
-	for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
-	  forcesQuadPt[iSpace] += basis[iQuad*numBasis+iBasis]
-	    *forcesCurrentCell[iBasis*spaceDim+iSpace];
-	  forcesQuadPt[spaceDim+iSpace] += basis[iQuad*numBasis+iBasis]
-	    *forcesCurrentCell[(iBasis+numBasis)*spaceDim+iSpace];
-	}
-      }
-      for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
-	tractionCurrentGlobal[iSpace] = forcesQuadPt[spaceDim+iSpace]
-	  -forcesQuadPt[iSpace];
-	tractionCurrentGlobal[iSpace] /= wt;
-      }
-      
-
-      // Compute traction in fault orientation.
-      // In: tractionCurrentGlobal [spaceDim]
-      // Out: tractionCurrentFault [spaceDim]
-      // Use orientation to rotate from global to fault orientation.
-      // ADD STUFF HERE
-      double_array tractionCurrentFault(spaceDim);
-      for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
-	for (int jSpace=0; jSpace < spaceDim; ++jSpace) {
-	  tractionCurrentFault[iSpace] += tractionCurrentGlobal[jSpace]
-	    *orientationCell[iQuad*spaceDim*spaceDim+iSpace*spaceDim+jSpace];
-	}
-      }
-
-      // Compute total traction (initial + current).
-      // In: tractionCurrentFault [spaceDim]
-      //     tractionInitialFault [numQuadPts*spaceDim]
-      // Out: tractionTotalFault [spaceDim]
-      // ADD STUFF HERE
-      double_array tractionTotalFault(spaceDim); 
-      for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
-	tractionTotalFault[iSpace] += tractionCurrentFault[iSpace]
-	  +tractionInitialFault[iQuad*spaceDim+iSpace];
-      }
-
-      // Compute traction ("friction") using fault constitutive model in fault orientation.
-      // In: slipFault [spaceDim]
-      //     tractionCurrentFault [spaceDim]
-      //     tractionTotalFault [spaceDim]
-      // Out: frictionFault [spaceDim]
-      // BEGIN TEMPORARY
-      // Simple fault constitutive model with static friction.
-      const double mu = 0.7;
-      // ADD STUFF HERE
-      double_array frictionFault(spaceDim);
-      frictionFault = 0.0;
-    switch (spaceDim)
-      { // switch
-      case 1 : {
-	if (tractionTotalFault[0] < 0) {
-	  frictionFault[0] = tractionCurrentFault[0];
-	    }
-	break;
-      } // case 1
-      case 2 : {
-	if (tractionTotalFault[1] < 0) {
-	  frictionFault[1] = tractionCurrentFault[1];
-	  frictionFault[0] = -mu * tractionTotalFault[1];
-	  if (frictionFault[0] > tractionCurrentFault[0])
-	    frictionFault[0] = tractionCurrentFault[0];
-	}
-	break;
-      } // case 2
-      case 3 : {
-	if (tractionTotalFault[2] < 0) {
-	  frictionFault[2] = tractionCurrentFault[2];
-	  frictionFault[1] = -mu * tractionTotalFault[2] * tractionTotalFault[1] / sqrt(pow(tractionTotalFault[1],2) +pow(tractionTotalFault[0],2));
-	  frictionFault[0] = -mu * tractionTotalFault[2] * tractionTotalFault[0] / sqrt(pow(tractionTotalFault[1],2) +pow(tractionTotalFault[0],2));
-	
-	  if (frictionFault[0] > tractionCurrentFault[0])
-	    frictionFault[0] = tractionCurrentFault[0];
-	
-	  if (frictionFault[1] > tractionCurrentFault[1])
-	    frictionFault[1] = tractionCurrentFault[1];
-	}
-	break;
-      } // case 3
-      default :
-	std::cerr << "Bad spatial dimension '" << spaceDim << "'." << std::endl;
-	assert(0);
-	throw std::logic_error("Bad spatial dimension in Friction.");
-      } // switch
-
-      
-      // END TEMPORARY
-
-      // If normal traction is negative (compression), prevent
-      // interpenetration by setting traction to exactly counteract
-      // current forces acting normal to fault.
-
-      // Compute traction associated with "friction" in global coordinate system. (tractionCell)
-      // In: frictionFault [spaceDim]
-      // Out: tractionCell [numQuadPts*spaceDim]
-      // Use orientation to rotate from global to fault orientation.
-      // ADD STUFF HERE
-      for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
-	for (int jSpace=0; jSpace < spaceDim; ++jSpace) {
-	  tractionCell[iQuad*spaceDim+iSpace] += frictionFault[jSpace]
-	    *orientationCell[iQuad*spaceDim*spaceDim+iSpace*spaceDim+jSpace];
-	}
-      }
-      tractionCell /= 2.0;
-      
-    std::cout << " wt: " << wt
-	      << " dispTpdtCell (-): (" << dispTpdtCell[0*spaceDim+0] << "," << dispTpdtCell[0*spaceDim+1] << ")\n"
-	      << "                   (" << dispTpdtCell[1*spaceDim+0] << "," << dispTpdtCell[1*spaceDim+1] << ")\n"
-	      << " dispTpdtCell (+): (" << dispTpdtCell[2*spaceDim+0] << "," << dispTpdtCell[2*spaceDim+1] << ")\n"
-	      << "                   (" << dispTpdtCell[3*spaceDim+0] << "," << dispTpdtCell[3*spaceDim+1] << ")\n"
-	      << " dispQuadPt (-): (" << dispQuadPt[0] << "," << dispQuadPt[1] << ")\n"
-	      << " dispQuadPt (+): (" << dispQuadPt[spaceDim+0] << "," << dispQuadPt[spaceDim+1] << ")\n"
-	      << " slipGlobal: (" << slipGlobal[0] << "," << slipGlobal[1] << ")\n"
-	      << " slipFault:  (" << slipFault[0] << "," << slipFault[1] << ")\n"
-	      << " forcesQuadPt (-): (" << forcesQuadPt[0] << "," << forcesQuadPt[1] << ")\n"
-	      << " forcesQuadPt (+): (" << forcesQuadPt[spaceDim+0] << "," << forcesQuadPt[spaceDim+1] << ")\n"
-	      << " tractionCurrentGlobal: (" << tractionCurrentGlobal[0] << "," << tractionCurrentGlobal[1] << ")\n"
-	      << " tractionCurrentFault: (" << tractionCurrentFault[0] << "," << tractionCurrentFault[1] << ")\n"
-	      << " tractionTotalFault: (" << tractionTotalFault[0] << "," << tractionTotalFault[1] << ")\n"
-	      << " frictionFault: (" << frictionFault[0] << "," << frictionFault[1] << ")\n"
-	      << " tractionCell: (" << tractionCell[iQuad*spaceDim+0] << "," << tractionCell[iQuad*spaceDim+1] << ")\n"
-	      << std::endl;
-
-
-      // Compute action for dynamic fault term
-      for (int iBasis=0; iBasis < numBasis; ++iBasis) {
-        const double valI = wt*basis[iQuad*numBasis+iBasis];
-        for (int jBasis=0; jBasis < numBasis; ++jBasis) {
-          const double valIJ = valI * basis[iQuad*numBasis+jBasis];
-          for (int iDim=0; iDim < spaceDim; ++iDim) {
-	    // :TODO: action for each side of the fault
-            residualCell[iBasis*spaceDim+iDim] += 
-	      tractionCell[iQuad*spaceDim+iDim] * valIJ;
-	  residualCell[(iBasis+numBasis)*spaceDim+iDim] += 
-	      -tractionCell[iQuad*spaceDim+iDim] * valIJ;
-	  } // for
-        } // for
-      } // for
-    } // for
-
-    // Assemble cell contribution into field
-    residualVisitor.clear();
-    sieveMesh->updateClosure(*c_iter, residualVisitor);
-
-    PetscLogFlops(numQuadPts*(0)); // :TODO: Count number of operations
-  } // for
-
-  // debugging
-  residual.view("RESIDUAL AFTER FRICTION");
+  throw std::logic_error("FaultCohesiveTract::integrateResidual() not implemented.");
 } // integrateResidual
 
 // ----------------------------------------------------------------------
@@ -433,6 +110,8 @@
 				   const double t,
 				   topology::SolutionFields* const fields)
 { // integrateJacobian
+  throw std::logic_error("FaultCohesiveTract::integrateJacobian() not implemented.");
+
   _needNewJacobian = false;
 } // integrateJacobian
   

Modified: short/3D/PyLith/trunk/libsrc/faults/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/Makefile.am	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/Makefile.am	2010-02-19 20:08:42 UTC (rev 16280)
@@ -24,11 +24,10 @@
 	Fault.icc \
 	FaultCohesive.hh \
 	FaultCohesive.icc \
+	FaultCohesiveLagrange.hh \
 	FaultCohesiveTract.hh \
-	FaultCohesiveDynL.hh \
-	FaultCohesiveDynL.icc \
+	FaultCohesiveDyn.hh \
 	FaultCohesiveKin.hh \
-	FaultCohesiveKin.icc \
 	LiuCosSlipFn.hh \
 	LiuCosSlipFn.icc \
 	SlipTimeFn.hh \

Modified: short/3D/PyLith/trunk/libsrc/faults/faultsfwd.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/faultsfwd.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/faultsfwd.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -28,8 +28,9 @@
 
     class Fault;
     class FaultCohesive;
-    class FaultCohesiveDynL;
+    class FaultCohesiveLagrange;
     class FaultCohesiveKin;
+    class FaultCohesiveDyn;
     class FaultCohesiveTract;
 
     class EqKinSrc;

Modified: short/3D/PyLith/trunk/modulesrc/faults/FaultCohesive.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/FaultCohesive.i	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/modulesrc/faults/FaultCohesive.i	2010-02-19 20:08:42 UTC (rev 16280)
@@ -39,13 +39,20 @@
       /** Set flag for using fault mesh or group of vertices to define
        * fault surface.
        *
+       * This method is part of a KLUDGE to allow creation of cohesive
+       * cells in cases where domain cells have more than one face
+       * (edge for 2-D problems) on the fault.
+       *
        * @param flag True if using fault mesh, false if using vertices.
        */
       void useFaultMesh(const bool flag);
       
-      // TEMPORARY
       /** Set filename of UCD file for fault mesh.
        *
+       * This method is part of a KLUDGE to allow creation of cohesive
+       * cells in cases where domain cells have more than one face
+       * (edge for 2-D problems) on the fault.
+       *
        * @param filename Filename for UCD file.
        */
       void faultMeshFilename(const char* filename);
@@ -75,9 +82,15 @@
        * @returns True if implementation using Lagrange multiplier
        * constraints, false otherwise.
        */
-      virtual
-      bool useLagrangeConstraints(void) const = 0;
+      bool useLagrangeConstraints(void) const;
       
+      /** Get fields associated with fault.
+       *
+       * @returns Fields associated with fault.
+       */
+      const pylith::topology::Fields<topology::Field<pylith::topology::SubMesh> >*
+      fields(void) const;
+
     }; // class FaultCohesive
 
   } // faults

Copied: short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDyn.i (from rev 16277, short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDynL.i)
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDyn.i	                        (rev 0)
+++ short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDyn.i	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,125 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file modulesrc/faults/FaultCohesiveDyn.i
+ *
+ * @brief Python interface to C++ FaultCohesiveDyn object.
+ */
+
+namespace pylith {
+  namespace faults {
+
+    class FaultCohesiveDyn : public FaultCohesiveLagrange
+    { // class FaultCohesiveDyn
+
+      // PUBLIC METHODS /////////////////////////////////////////////////
+    public :
+
+      /// Default constructor.
+      FaultCohesiveDyn(void);
+      
+      /// Destructor.
+      virtual
+      ~FaultCohesiveDyn(void);
+      
+      /// Deallocate PETSc and local data structures.
+      virtual
+      void deallocate(void);
+      
+      /** Sets the spatial database for the inital tractions.
+       *
+       * @param db spatial database for initial tractions
+       */
+      void dbInitialTract(spatialdata::spatialdb::SpatialDB* db);
+  
+      /** Set the friction (constitutive) model.
+       *
+       * @param model Fault constutive model.
+       */
+      void frictionModel(pylith::friction::FrictionModel* const model);
+
+      /** Initialize fault. Determine orientation and setup boundary
+       * condition parameters.
+       *
+       * @param mesh Finite-element mesh.
+       * @param upDir Direction perpendicular to along-strike direction that is 
+       *   not collinear with fault normal (usually "up" direction but could 
+       *   be up-dip direction; only applies to fault surfaces in a 3-D domain).
+       * @param normalDir General preferred direction for fault normal
+       *   (used to pick which of two possible normal directions for
+       *   interface; only applies to fault surfaces in a 3-D domain).
+       */
+      void initialize(const pylith::topology::Mesh& mesh,
+		      const double upDir[3],
+		      const double normalDir[3]);
+      
+      /** Update state variables as needed.
+       *
+       * @param t Current time
+       * @param fields Solution fields
+       * @param mesh Finite-element mesh
+       */
+      void updateStateVars(const double t,
+			   pylith::topology::SolutionFields* const fields);
+      
+      /** Constrain solution space based on friction.
+       *
+       * @param fields Solution fields.
+       * @param t Current time.
+       * @param jacobian Sparse matrix for system Jacobian.
+       */
+      void constrainSolnSpace(pylith::topology::SolutionFields* const fields,
+			      const double t,
+			      const pylith::topology::Jacobian& jacobian);
+
+      /** Adjust solution from solver with lumped Jacobian to match Lagrange
+       *  multiplier constraints.
+       *
+       * @param fields Solution fields.
+       * @param jacobian Jacobian of the system.
+       */
+      void adjustSolnLumped(pylith::topology::SolutionFields* fields,
+			    const pylith::topology::Field<pylith::topology::Mesh>& jacobian);
+
+      /** Verify configuration is acceptable.
+       *
+       * @param mesh Finite-element mesh
+       */
+      void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
+      
+      /** Get vertex field associated with integrator.
+       *
+       * @param name Name of cell field.
+       * @param fields Solution fields.
+       * @returns Vertex field.
+       */
+      const pylith::topology::Field<pylith::topology::SubMesh>&
+      vertexField(const char* name,
+		  const pylith::topology::SolutionFields* fields =0);
+      
+      /** Get cell field associated with integrator.
+       *
+       * @param name Name of cell field.
+       * @param fields Solution fields.
+       * @returns Cell field.
+       */
+      const pylith::topology::Field<pylith::topology::SubMesh>&
+      cellField(const char* name,
+		const pylith::topology::SolutionFields* fields =0);
+
+    }; // class FaultCohesiveDyn
+
+  } // faults
+} // pylith
+
+
+// End of file 

Deleted: short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDynL.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDynL.i	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDynL.i	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,171 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/** @file modulesrc/faults/FaultCohesiveDynL.i
- *
- * @brief Python interface to C++ FaultCohesiveDynL object.
- */
-
-namespace pylith {
-  namespace faults {
-
-    class FaultCohesiveDynL : public FaultCohesive
-    { // class FaultCohesiveDynL
-
-      // PUBLIC METHODS /////////////////////////////////////////////////
-    public :
-
-      /// Default constructor.
-      FaultCohesiveDynL(void);
-      
-      /// Destructor.
-      virtual
-      ~FaultCohesiveDynL(void);
-      
-      /// Deallocate PETSc and local data structures.
-      virtual
-      void deallocate(void);
-      
-      /** Sets the spatial database for the inital tractions.
-       *
-       * @param db spatial database for initial tractions
-       */
-      void dbInitialTract(spatialdata::spatialdb::SpatialDB* db);
-  
-      /** Set the friction (constitutive) model.
-       *
-       * @param model Fault constutive model.
-       */
-      void frictionModel(pylith::friction::FrictionModel* const model);
-
-      /** Initialize fault. Determine orientation and setup boundary
-       * condition parameters.
-       *
-       * @param mesh Finite-element mesh.
-       * @param upDir Direction perpendicular to along-strike direction that is 
-       *   not collinear with fault normal (usually "up" direction but could 
-       *   be up-dip direction; only applies to fault surfaces in a 3-D domain).
-       * @param normalDir General preferred direction for fault normal
-       *   (used to pick which of two possible normal directions for
-       *   interface; only applies to fault surfaces in a 3-D domain).
-       */
-      void initialize(const pylith::topology::Mesh& mesh,
-		      const double upDir[3],
-		      const double normalDir[3]);
-      
-      /** Split solution field for separate preconditioning.
-       *
-       * @param field Solution field.
-       */
-      void splitField(pylith::topology::Field<pylith::topology::Mesh>* field);
-
-      /** Integrate contributions to residual term (r) for operator that
-       * require assembly across processors.
-       *
-       * @param residual Field containing values for residual
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateResidual(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-			     const double t,
-			     pylith::topology::SolutionFields* const fields);
-
-      /** Integrate contributions to residual term (r) for operator that
-       * do not require assembly across cells, vertices, or processors.
-       *
-       * @param residual Field containing values for residual
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateResidualAssembled(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
-
-      /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator that do not require assembly across cells, vertices, or
-       * processors.
-       *
-       * @param mat Sparse matrix
-       * @param t Current time
-       * @param fields Solution fields
-       * @param mesh Finite-element mesh
-       */
-      void integrateJacobianAssembled(pylith::topology::Jacobian* jacobian,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
-      
-      /** Update state variables as needed.
-       *
-       * @param t Current time
-       * @param fields Solution fields
-       * @param mesh Finite-element mesh
-       */
-      void updateStateVars(const double t,
-			   pylith::topology::SolutionFields* const fields);
-      
-      /** Constrain solution space based on friction.
-       *
-       * @param fields Solution fields.
-       * @param t Current time.
-       * @param jacobian Sparse matrix for system Jacobian.
-       */
-      void constrainSolnSpace(pylith::topology::SolutionFields* const fields,
-			      const double t,
-			      const pylith::topology::Jacobian& jacobian);
-
-      /** Verify configuration is acceptable.
-       *
-       * @param mesh Finite-element mesh
-       */
-      void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
-      
-      /** Get vertex field associated with integrator.
-       *
-       * @param name Name of cell field.
-       * @param fields Solution fields.
-       * @returns Vertex field.
-       */
-      const pylith::topology::Field<pylith::topology::SubMesh>&
-      vertexField(const char* name,
-		  const pylith::topology::SolutionFields* fields =0);
-      
-      /** Get cell field associated with integrator.
-       *
-       * @param name Name of cell field.
-       * @param fields Solution fields.
-       * @returns Cell field.
-       */
-      const pylith::topology::Field<pylith::topology::SubMesh>&
-      cellField(const char* name,
-		const pylith::topology::SolutionFields* fields =0);
-
-      /** Cohesive cells use Lagrange multiplier constraints?
-       *
-       * @returns True if implementation using Lagrange multiplier
-       * constraints, false otherwise.
-       */
-      bool useLagrangeConstraints(void) const;
-
-      /** Get fields associated with fault.
-       *
-       * @returns Fields associated with fault.
-       */
-      const pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> >*
-      fields(void) const;
-
-    }; // class FaultCohesiveDynL
-
-  } // faults
-} // pylith
-
-
-// End of file 

Modified: short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveKin.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveKin.i	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveKin.i	2010-02-19 20:08:42 UTC (rev 16280)
@@ -18,7 +18,7 @@
 namespace pylith {
   namespace faults {
 
-    class FaultCohesiveKin : public FaultCohesive
+    class FaultCohesiveKin : public FaultCohesiveLagrange
     { // class FaultCohesiveKin
 
       // PUBLIC METHODS /////////////////////////////////////////////////
@@ -67,24 +67,7 @@
 		      const double upDir[3],
 		      const double normalDir[3]);
       
-      /** Split solution field for separate preconditioning.
-       *
-       * @param field Solution field.
-       */
-      void splitField(pylith::topology::Field<pylith::topology::Mesh>* field);
-
       /** Integrate contributions to residual term (r) for operator that
-       * require assembly across processors.
-       *
-       * @param residual Field containing values for residual
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateResidual(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-			     const double t,
-			     pylith::topology::SolutionFields* const fields);
-
-      /** Integrate contributions to residual term (r) for operator that
        * do not require assembly across cells, vertices, or processors.
        *
        * @param residual Field containing values for residual
@@ -95,46 +78,6 @@
 				      const double t,
 				      pylith::topology::SolutionFields* const fields);
 
-      /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator that do not require assembly across cells, vertices, or
-       * processors.
-       *
-       * @param jacobian Sparse matrix
-       * @param t Current time
-       * @param fields Solution fields
-       * @param mesh Finite-element mesh
-       */
-      void integrateJacobianAssembled(pylith::topology::Jacobian* jacobian,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
-      
-      /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator that do not require assembly across cells, vertices, or
-       * processors.
-       *
-       * @param jacobian Diagonal Jacobian matrix as a field.
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateJacobianAssembled(pylith::topology::Field<pylith::topology::Mesh>* jacobian,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
-
-      /** Update state variables as needed.
-       *
-       * @param t Current time
-       * @param fields Solution fields
-       * @param mesh Finite-element mesh
-       */
-      void updateStateVars(const double t,
-			   pylith::topology::SolutionFields* const fields);
-      
-      /** Verify configuration is acceptable.
-       *
-       * @param mesh Finite-element mesh
-       */
-      void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
-      
       /** Get vertex field associated with integrator.
        *
        * @param name Name of cell field.
@@ -155,20 +98,6 @@
       cellField(const char* name,
 		const pylith::topology::SolutionFields* fields =0);
 
-      /** Cohesive cells use Lagrange multiplier constraints?
-       *
-       * @returns True if implementation using Lagrange multiplier
-       * constraints, false otherwise.
-       */
-      bool useLagrangeConstraints(void) const;
-
-      /** Get fields associated with fault.
-       *
-       * @returns Fields associated with fault.
-       */
-      const pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> >*
-      fields(void) const;
-
     }; // class FaultCohesiveKin
 
   } // faults

Added: short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveLagrange.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveLagrange.i	                        (rev 0)
+++ short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveLagrange.i	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,119 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file modulesrc/faults/FaultCohesiveLagrange.i
+ *
+ * @brief Python interface to C++ FaultCohesiveLagrange object.
+ */
+
+namespace pylith {
+  namespace faults {
+
+    class FaultCohesiveLagrange : public FaultCohesive
+    { // class FaultCohesiveLagrange
+
+      // PUBLIC METHODS /////////////////////////////////////////////////
+    public :
+
+      /// Default constructor.
+      FaultCohesiveLagrange(void);
+      
+      /// Destructor.
+      virtual
+      ~FaultCohesiveLagrange(void);
+      
+      /// Deallocate PETSc and local data structures.
+      virtual
+      void deallocate(void);
+  
+      /** Initialize fault. Determine orientation and setup boundary
+       * condition parameters.
+       *
+       * @param mesh Finite-element mesh.
+       * @param upDir Direction perpendicular to along-strike direction that is 
+       *   not collinear with fault normal (usually "up" direction but could 
+       *   be up-dip direction; only applies to fault surfaces in a 3-D domain).
+       * @param normalDir General preferred direction for fault normal
+       *   (used to pick which of two possible normal directions for
+       *   interface; only applies to fault surfaces in a 3-D domain).
+       */
+      virtual
+      void initialize(const pylith::topology::Mesh& mesh,
+		      const double upDir[3],
+		      const double normalDir[3]);
+      
+      /** Split solution field for separate preconditioning.
+       *
+       * @param field Solution field.
+       */
+      void splitField(pylith::topology::Field<pylith::topology::Mesh>* field);
+
+      /** Integrate contributions to residual term (r) for operator that
+       * do not require assembly across cells, vertices, or processors.
+       *
+       * @param residual Field containing values for residual
+       * @param t Current time
+       * @param fields Solution fields
+       */
+      virtual
+      void integrateResidualAssembled(const pylith::topology::Field<pylith::topology::Mesh>& residual,
+				      const double t,
+				      pylith::topology::SolutionFields* const fields);
+
+      /** Integrate contributions to Jacobian matrix (A) associated with
+       * operator that do not require assembly across cells, vertices, or
+       * processors.
+       *
+       * @param jacobian Sparse matrix
+       * @param t Current time
+       * @param fields Solution fields
+       * @param mesh Finite-element mesh
+       */
+      void integrateJacobianAssembled(pylith::topology::Jacobian* jacobian,
+				      const double t,
+				      pylith::topology::SolutionFields* const fields);
+      
+      /** Integrate contributions to Jacobian matrix (A) associated with
+       * operator that do not require assembly across cells, vertices, or
+       * processors.
+       *
+       * @param jacobian Diagonal Jacobian matrix as a field.
+       * @param t Current time
+       * @param fields Solution fields
+       */
+      void integrateJacobianAssembled(pylith::topology::Field<pylith::topology::Mesh>* jacobian,
+				      const double t,
+				      pylith::topology::SolutionFields* const fields);
+
+      /** Adjust solution from solver with lumped Jacobian to match Lagrange
+       *  multiplier constraints.
+       *
+       * @param fields Solution fields
+       * @param jacobian Jacobian of the system.
+       */
+      virtual
+      void adjustSolnLumped(pylith::topology::SolutionFields* fields,
+			    const pylith::topology::Field<pylith::topology::Mesh>& jacobian);
+
+      /** Verify configuration is acceptable.
+       *
+       * @param mesh Finite-element mesh
+       */
+      void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
+      
+    }; // class FaultCohesiveLagrange
+
+  } // faults
+} // pylith
+
+
+// End of file 

Modified: short/3D/PyLith/trunk/modulesrc/faults/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/Makefile.am	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/modulesrc/faults/Makefile.am	2010-02-19 20:08:42 UTC (rev 16280)
@@ -27,8 +27,9 @@
 	EqKinSrc.i \
 	Fault.i \
 	FaultCohesive.i \
-	FaultCohesiveDynL.i \
+	FaultCohesiveLagrange.i \
 	FaultCohesiveKin.i \
+	FaultCohesiveDyn.i \
 	FaultCohesiveTract.i \
 	../topology/SubMesh.i \
 	../feassemble/Quadrature.i \

Modified: short/3D/PyLith/trunk/modulesrc/faults/faults.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/faults.i	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/modulesrc/faults/faults.i	2010-02-19 20:08:42 UTC (rev 16280)
@@ -24,8 +24,9 @@
 #include "pylith/faults/EqKinSrc.hh"
 #include "pylith/faults/Fault.hh"
 #include "pylith/faults/FaultCohesive.hh"
-#include "pylith/faults/FaultCohesiveDynL.hh"
+#include "pylith/faults/FaultCohesiveLagrange.hh"
 #include "pylith/faults/FaultCohesiveKin.hh"
+#include "pylith/faults/FaultCohesiveDyn.hh"
 #include "pylith/faults/FaultCohesiveTract.hh"
 
 #include "pylith/topology/SubMesh.hh"
@@ -73,8 +74,9 @@
 %include "EqKinSrc.i"
 %include "Fault.i"
 %include "FaultCohesive.i"
-%include "FaultCohesiveDynL.i"
+%include "FaultCohesiveLagrange.i"
 %include "FaultCohesiveKin.i"
+%include "FaultCohesiveDyn.i"
 %include "FaultCohesiveTract.i"
 
 // End of file

Modified: short/3D/PyLith/trunk/playpen/friction/twohex8/compression.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twohex8/compression.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twohex8/compression.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -125,7 +125,7 @@
 # faults
 # ----------------------------------------------------------------------
 [pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 [pylithapp.timedependent.interfaces.fault]
 

Modified: short/3D/PyLith/trunk/playpen/friction/twohex8/opening.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twohex8/opening.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twohex8/opening.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -103,7 +103,7 @@
 # faults
 # ----------------------------------------------------------------------
 [pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 [pylithapp.timedependent.interfaces.fault]
 

Modified: short/3D/PyLith/trunk/playpen/friction/twohex8/shear-sliding.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twohex8/shear-sliding.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twohex8/shear-sliding.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -185,7 +185,7 @@
 # faults
 # ----------------------------------------------------------------------
 [pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 [pylithapp.timedependent.interfaces.fault]
 

Modified: short/3D/PyLith/trunk/playpen/friction/twohex8/shear-stick.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twohex8/shear-stick.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twohex8/shear-stick.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -202,7 +202,7 @@
 # faults
 # ----------------------------------------------------------------------
 [pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 [pylithapp.timedependent.interfaces.fault]
 

Modified: short/3D/PyLith/trunk/playpen/friction/twoquad4/compression.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twoquad4/compression.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twoquad4/compression.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -120,7 +120,7 @@
 # Provide information on the fault (interface).
 [pylithapp.timedependent.interfaces]
 
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 # Define fault properties.
 [pylithapp.timedependent.interfaces.fault]

Modified: short/3D/PyLith/trunk/playpen/friction/twoquad4/opening.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twoquad4/opening.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twoquad4/opening.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -134,7 +134,7 @@
 # Provide information on the fault (interface).
 [pylithapp.timedependent.interfaces]
 
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 # Define fault properties.
 [pylithapp.timedependent.interfaces.fault]

Modified: short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-sliding.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-sliding.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-sliding.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -170,7 +170,7 @@
 # Provide information on the fault (interface).
 [pylithapp.timedependent.interfaces]
 
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 # Define fault properties.
 [pylithapp.timedependent.interfaces.fault]

Modified: short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-stick.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-stick.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-stick.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -184,7 +184,7 @@
 # Provide information on the fault (interface).
 [pylithapp.timedependent.interfaces]
 
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 # Define fault properties.
 [pylithapp.timedependent.interfaces.fault]

Modified: short/3D/PyLith/trunk/playpen/friction/twotet4/compression.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotet4/compression.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotet4/compression.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -125,7 +125,7 @@
 # faults
 # ----------------------------------------------------------------------
 [pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 [pylithapp.timedependent.interfaces.fault]
 

Modified: short/3D/PyLith/trunk/playpen/friction/twotet4/opening.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotet4/opening.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotet4/opening.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -103,7 +103,7 @@
 # faults
 # ----------------------------------------------------------------------
 [pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 [pylithapp.timedependent.interfaces.fault]
 

Modified: short/3D/PyLith/trunk/playpen/friction/twotet4/shear-sliding.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotet4/shear-sliding.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotet4/shear-sliding.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -187,7 +187,7 @@
 # faults
 # ----------------------------------------------------------------------
 [pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 [pylithapp.timedependent.interfaces.fault]
 

Modified: short/3D/PyLith/trunk/playpen/friction/twotet4/shear-stick.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotet4/shear-stick.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotet4/shear-stick.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -202,7 +202,7 @@
 # faults
 # ----------------------------------------------------------------------
 [pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 [pylithapp.timedependent.interfaces.fault]
 

Modified: short/3D/PyLith/trunk/playpen/friction/twotri3/compression.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotri3/compression.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotri3/compression.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -120,7 +120,7 @@
 # Provide information on the fault (interface).
 [pylithapp.timedependent.interfaces]
 
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 # Define fault properties.
 [pylithapp.timedependent.interfaces.fault]

Modified: short/3D/PyLith/trunk/playpen/friction/twotri3/opening.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotri3/opening.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotri3/opening.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -134,7 +134,7 @@
 # Provide information on the fault (interface).
 [pylithapp.timedependent.interfaces]
 
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 # Define fault properties.
 [pylithapp.timedependent.interfaces.fault]

Modified: short/3D/PyLith/trunk/playpen/friction/twotri3/shear-sliding.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotri3/shear-sliding.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotri3/shear-sliding.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -170,7 +170,7 @@
 # Provide information on the fault (interface).
 [pylithapp.timedependent.interfaces]
 
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 # Define fault properties.
 [pylithapp.timedependent.interfaces.fault]

Modified: short/3D/PyLith/trunk/playpen/friction/twotri3/shear-stick.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotri3/shear-stick.cfg	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotri3/shear-stick.cfg	2010-02-19 20:08:42 UTC (rev 16280)
@@ -184,7 +184,7 @@
 # Provide information on the fault (interface).
 [pylithapp.timedependent.interfaces]
 
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
 
 # Define fault properties.
 [pylithapp.timedependent.interfaces.fault]

Modified: short/3D/PyLith/trunk/pylith/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/pylith/Makefile.am	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/pylith/Makefile.am	2010-02-19 20:08:42 UTC (rev 16280)
@@ -33,7 +33,7 @@
 	faults/Fault.py \
 	faults/FaultCohesive.py \
 	faults/FaultCohesiveKin.py \
-	faults/FaultCohesiveDynL.py \
+	faults/FaultCohesiveDyn.py \
 	faults/FaultCohesiveTract.py \
 	faults/LiuCosSlipFn.py \
 	faults/SingleRupture.py \

Copied: short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDyn.py (from rev 16277, short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDynL.py)
===================================================================
--- short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDyn.py	                        (rev 0)
+++ short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDyn.py	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,225 @@
+#!/usr/bin/env python
+#
+# ----------------------------------------------------------------------
+#
+#                           Brad T. Aagaard
+#                        U.S. Geological Survey
+#
+# <LicenseText>
+#
+# ----------------------------------------------------------------------
+#
+
+## @file pylith/faults/FaultCohesiveDyn.py
+##
+
+## @brief Python object for a fault surface with dynamic
+## (friction) fault implemented with cohesive elements.
+##
+## Factory: fault
+
+from FaultCohesive import FaultCohesive
+from pylith.feassemble.Integrator import Integrator
+from faults import FaultCohesiveDyn as ModuleFaultCohesiveDyn
+
+from pylith.utils.NullComponent import NullComponent
+
+# FaultCohesiveDyn class
+class FaultCohesiveDyn(FaultCohesive, Integrator, ModuleFaultCohesiveDyn):
+  """
+  Python object for a fault surface with kinematic (prescribed) slip
+  implemented with cohesive elements.
+
+  Inventory
+
+  @class Inventory
+  Python object for managing FaultCohesiveDyn facilities and properties.
+  
+  \b Properties
+  @li None
+  
+  \b Facilities
+  @li \b db_initial_tractions Spatial database for initial tractions.
+  @li \b friction Fault constitutive model.
+  @li \b output Output manager associated with fault data.
+
+  Factory: fault
+  """
+
+  # INVENTORY //////////////////////////////////////////////////////////
+
+  import pyre.inventory
+
+  db = pyre.inventory.facility("db_initial_tractions", family="spatial_database",
+                               factory=NullComponent)
+  db.meta['tip'] = "Spatial database for initial tractions."
+
+  from pylith.friction.StaticFriction import StaticFriction
+  friction = pyre.inventory.facility("friction", family="friction_model",
+                                     factory=StaticFriction)
+
+  from pylith.meshio.OutputFaultDyn import OutputFaultDyn
+  output = pyre.inventory.facility("output", family="output_manager",
+                                   factory=OutputFaultDyn)
+  output.meta['tip'] = "Output manager associated with fault data."
+  
+
+  # PUBLIC METHODS /////////////////////////////////////////////////////
+
+  def __init__(self, name="faultcohesivedynl"):
+    """
+    Initialize configuration.
+    """
+    FaultCohesive.__init__(self, name)
+    Integrator.__init__(self)
+    self._loggingPrefix = "CoDy "
+
+    self.availableFields = \
+        {'vertex': \
+           {'info': ["normal_dir"],
+            'data': ["slip",
+                     "traction"]},
+         'cell': \
+           {'info': [],
+            'data': []}}
+    return
+
+
+  def preinitialize(self, mesh):
+    """
+    Do pre-initialization setup.
+    """
+    self._info.log("Pre-initializing fault '%s'." % self.label())
+    FaultCohesive.preinitialize(self, mesh)
+    Integrator.preinitialize(self, mesh)
+
+    ModuleFaultCohesiveDyn.quadrature(self, self.faultQuadrature)
+
+    if mesh.dimension() == 2:
+      self.availableFields['vertex']['info'] += ["strike_dir"]
+    elif mesh.dimension() == 3:
+      self.availableFields['vertex']['info'] += ["strike_dir",
+                                                 "dip_dir"]
+
+    if not isinstance(self.inventory.db, NullComponent):
+      self.availableFields['vertex']['info'] += ["initial_traction"]
+    return
+  
+
+  def verifyConfiguration(self):
+    """
+    Verify compatibility of configuration.
+    """
+    logEvent = "%sverify" % self._loggingPrefix
+    self._eventLogger.eventBegin(logEvent)
+
+    FaultCohesive.verifyConfiguration(self)
+    Integrator.verifyConfiguration(self)
+    ModuleFaultCohesiveDyn.verifyConfiguration(self, self.mesh)
+
+    self._eventLogger.eventEnd(logEvent)
+    return
+
+
+  def initialize(self, totalTime, numTimeSteps, normalizer):
+    """
+    Initialize cohesive elements.
+    """
+    logEvent = "%sinit" % self._loggingPrefix
+    self._eventLogger.eventBegin(logEvent)
+    self._info.log("Initializing fault '%s'." % self.label())
+
+    Integrator.initialize(self, totalTime, numTimeSteps, normalizer)
+    
+    FaultCohesive.initialize(self, totalTime, numTimeSteps, normalizer)
+
+    self._eventLogger.eventEnd(logEvent)
+    return
+
+
+  def poststep(self, t, dt, totalTime, fields):
+    """
+    Hook for doing stuff after advancing time step.
+    """
+    logEvent = "%spoststep" % self._loggingPrefix
+    self._eventLogger.eventBegin(logEvent)
+
+    Integrator.poststep(self, t, dt, totalTime, fields)
+    FaultCohesive.poststep(self, t, dt, totalTime, fields)
+
+    self._eventLogger.eventEnd(logEvent)
+    return
+
+
+  def getVertexField(self, name, fields=None):
+    """
+    Get vertex field.
+    """
+    if None == fields:
+      field = ModuleFaultCohesiveDyn.vertexField(self, name)
+    else:
+      field = ModuleFaultCohesiveDyn.vertexField(self, name, fields)
+    return field
+
+
+  def getCellField(self, name, fields=None):
+    """
+    Get cell field.
+    """
+    if None == fields:
+      field = ModuleFaultCohesiveDyn.cellField(self, name)
+    else:
+      field = ModuleFaultCohesiveDyn.cellField(self, name, fields)
+    return field
+
+
+  def finalize(self):
+    """
+    Cleanup.
+    """
+    FaultCohesive.finalize(self)
+    Integrator.finalize(self)
+    return
+  
+
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _configure(self):
+    """
+    Setup members using inventory.
+    """
+    FaultCohesive._configure(self)
+    if not isinstance(self.inventory.db, NullComponent):
+      ModuleFaultCohesiveDyn.dbInitialTract(self, self.inventory.db)
+    ModuleFaultCohesiveDyn.frictionModel(self, self.inventory.friction)
+    self.output = self.inventory.output
+    return
+
+
+  def _createModuleObj(self):
+    """
+    Create handle to C++ FaultCohesiveDyn.
+    """
+    ModuleFaultCohesiveDyn.__init__(self)
+    return
+    
+  
+  def _modelMemoryUse(self):
+    """
+    Model memory allocation.
+    """
+    self.perfLogger.logFault("Fault", self)
+    self.perfLogger.logFields("Fault", self.fields())
+    return
+
+
+# FACTORIES ////////////////////////////////////////////////////////////
+
+def fault():
+  """
+  Factory associated with FaultCohesiveDyn.
+  """
+  return FaultCohesiveDyn()
+
+
+# End of file 

Deleted: short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDynL.py
===================================================================
--- short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDynL.py	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDynL.py	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,225 +0,0 @@
-#!/usr/bin/env python
-#
-# ----------------------------------------------------------------------
-#
-#                           Brad T. Aagaard
-#                        U.S. Geological Survey
-#
-# <LicenseText>
-#
-# ----------------------------------------------------------------------
-#
-
-## @file pylith/faults/FaultCohesiveDynL.py
-##
-
-## @brief Python object for a fault surface with dynamic
-## (friction) fault implemented with cohesive elements.
-##
-## Factory: fault
-
-from FaultCohesive import FaultCohesive
-from pylith.feassemble.Integrator import Integrator
-from faults import FaultCohesiveDynL as ModuleFaultCohesiveDynL
-
-from pylith.utils.NullComponent import NullComponent
-
-# FaultCohesiveDynL class
-class FaultCohesiveDynL(FaultCohesive, Integrator, ModuleFaultCohesiveDynL):
-  """
-  Python object for a fault surface with kinematic (prescribed) slip
-  implemented with cohesive elements.
-
-  Inventory
-
-  @class Inventory
-  Python object for managing FaultCohesiveDynL facilities and properties.
-  
-  \b Properties
-  @li None
-  
-  \b Facilities
-  @li \b db_initial_tractions Spatial database for initial tractions.
-  @li \b friction Fault constitutive model.
-  @li \b output Output manager associated with fault data.
-
-  Factory: fault
-  """
-
-  # INVENTORY //////////////////////////////////////////////////////////
-
-  import pyre.inventory
-
-  db = pyre.inventory.facility("db_initial_tractions", family="spatial_database",
-                               factory=NullComponent)
-  db.meta['tip'] = "Spatial database for initial tractions."
-
-  from pylith.friction.StaticFriction import StaticFriction
-  friction = pyre.inventory.facility("friction", family="friction_model",
-                                     factory=StaticFriction)
-
-  from pylith.meshio.OutputFaultDyn import OutputFaultDyn
-  output = pyre.inventory.facility("output", family="output_manager",
-                                   factory=OutputFaultDyn)
-  output.meta['tip'] = "Output manager associated with fault data."
-  
-
-  # PUBLIC METHODS /////////////////////////////////////////////////////
-
-  def __init__(self, name="faultcohesivedynl"):
-    """
-    Initialize configuration.
-    """
-    FaultCohesive.__init__(self, name)
-    Integrator.__init__(self)
-    self._loggingPrefix = "CoDy "
-
-    self.availableFields = \
-        {'vertex': \
-           {'info': ["normal_dir"],
-            'data': ["slip",
-                     "traction"]},
-         'cell': \
-           {'info': [],
-            'data': []}}
-    return
-
-
-  def preinitialize(self, mesh):
-    """
-    Do pre-initialization setup.
-    """
-    self._info.log("Pre-initializing fault '%s'." % self.label())
-    FaultCohesive.preinitialize(self, mesh)
-    Integrator.preinitialize(self, mesh)
-
-    ModuleFaultCohesiveDynL.quadrature(self, self.faultQuadrature)
-
-    if mesh.dimension() == 2:
-      self.availableFields['vertex']['info'] += ["strike_dir"]
-    elif mesh.dimension() == 3:
-      self.availableFields['vertex']['info'] += ["strike_dir",
-                                                 "dip_dir"]
-
-    if not isinstance(self.inventory.db, NullComponent):
-      self.availableFields['vertex']['info'] += ["initial_traction"]
-    return
-  
-
-  def verifyConfiguration(self):
-    """
-    Verify compatibility of configuration.
-    """
-    logEvent = "%sverify" % self._loggingPrefix
-    self._eventLogger.eventBegin(logEvent)
-
-    FaultCohesive.verifyConfiguration(self)
-    Integrator.verifyConfiguration(self)
-    ModuleFaultCohesiveDynL.verifyConfiguration(self, self.mesh)
-
-    self._eventLogger.eventEnd(logEvent)
-    return
-
-
-  def initialize(self, totalTime, numTimeSteps, normalizer):
-    """
-    Initialize cohesive elements.
-    """
-    logEvent = "%sinit" % self._loggingPrefix
-    self._eventLogger.eventBegin(logEvent)
-    self._info.log("Initializing fault '%s'." % self.label())
-
-    Integrator.initialize(self, totalTime, numTimeSteps, normalizer)
-    
-    FaultCohesive.initialize(self, totalTime, numTimeSteps, normalizer)
-
-    self._eventLogger.eventEnd(logEvent)
-    return
-
-
-  def poststep(self, t, dt, totalTime, fields):
-    """
-    Hook for doing stuff after advancing time step.
-    """
-    logEvent = "%spoststep" % self._loggingPrefix
-    self._eventLogger.eventBegin(logEvent)
-
-    Integrator.poststep(self, t, dt, totalTime, fields)
-    FaultCohesive.poststep(self, t, dt, totalTime, fields)
-
-    self._eventLogger.eventEnd(logEvent)
-    return
-
-
-  def getVertexField(self, name, fields=None):
-    """
-    Get vertex field.
-    """
-    if None == fields:
-      field = ModuleFaultCohesiveDynL.vertexField(self, name)
-    else:
-      field = ModuleFaultCohesiveDynL.vertexField(self, name, fields)
-    return field
-
-
-  def getCellField(self, name, fields=None):
-    """
-    Get cell field.
-    """
-    if None == fields:
-      field = ModuleFaultCohesiveDynL.cellField(self, name)
-    else:
-      field = ModuleFaultCohesiveDynL.cellField(self, name, fields)
-    return field
-
-
-  def finalize(self):
-    """
-    Cleanup.
-    """
-    FaultCohesive.finalize(self)
-    Integrator.finalize(self)
-    return
-  
-
-  # PRIVATE METHODS ////////////////////////////////////////////////////
-
-  def _configure(self):
-    """
-    Setup members using inventory.
-    """
-    FaultCohesive._configure(self)
-    if not isinstance(self.inventory.db, NullComponent):
-      ModuleFaultCohesiveDynL.dbInitialTract(self, self.inventory.db)
-    ModuleFaultCohesiveDynL.frictionModel(self, self.inventory.friction)
-    self.output = self.inventory.output
-    return
-
-
-  def _createModuleObj(self):
-    """
-    Create handle to C++ FaultCohesiveDynL.
-    """
-    ModuleFaultCohesiveDynL.__init__(self)
-    return
-    
-  
-  def _modelMemoryUse(self):
-    """
-    Model memory allocation.
-    """
-    self.perfLogger.logFault("Fault", self)
-    self.perfLogger.logFields("Fault", self.fields())
-    return
-
-
-# FACTORIES ////////////////////////////////////////////////////////////
-
-def fault():
-  """
-  Factory associated with FaultCohesiveDynL.
-  """
-  return FaultCohesiveDynL()
-
-
-# End of file 

Modified: short/3D/PyLith/trunk/pylith/faults/__init__.py
===================================================================
--- short/3D/PyLith/trunk/pylith/faults/__init__.py	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/pylith/faults/__init__.py	2010-02-19 20:08:42 UTC (rev 16280)
@@ -17,9 +17,10 @@
 __all__ = ['BruneSlipFn',
            'ConstRateSlipFn',
            'EqKinSrc',
+           'Fault',
+           'FaultCohesive',
            'FaultCohesiveKin',
-           'FaultCohesive',
-           'Fault',
+           'FaultCohesiveDyn',
            'SlipTimeFn',
            'SingleRupture',
            'StepSlipFn',

Modified: short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am	2010-02-19 20:08:42 UTC (rev 16280)
@@ -45,11 +45,11 @@
 	TestFaultCohesiveKinSrcsQuad4.cc \
 	TestFaultCohesiveKinSrcsTet4.cc \
 	TestFaultCohesiveKinSrcsHex8.cc \
-	TestFaultCohesiveDynL.cc \
-	TestFaultCohesiveDynLTri3.cc \
-	TestFaultCohesiveDynLQuad4.cc \
-	TestFaultCohesiveDynLHex8.cc \
-	TestFaultCohesiveDynLTet4.cc \
+	TestFaultCohesiveDyn.cc \
+	TestFaultCohesiveDynTri3.cc \
+	TestFaultCohesiveDynQuad4.cc \
+	TestFaultCohesiveDynHex8.cc \
+	TestFaultCohesiveDynTet4.cc \
 	test_faults.cc
 
 
@@ -77,11 +77,11 @@
 	TestFaultCohesiveKinSrcsQuad4.hh \
 	TestFaultCohesiveKinSrcsTet4.hh \
 	TestFaultCohesiveKinSrcsHex8.hh \
-	TestFaultCohesiveDynL.hh \
-	TestFaultCohesiveDynLTri3.hh \
-	TestFaultCohesiveDynLQuad4.hh \
-	TestFaultCohesiveDynLHex8.hh \
-	TestFaultCohesiveDynLTet4.hh
+	TestFaultCohesiveDyn.hh \
+	TestFaultCohesiveDynTri3.hh \
+	TestFaultCohesiveDynQuad4.hh \
+	TestFaultCohesiveDynHex8.hh \
+	TestFaultCohesiveDynTet4.hh
 
 # Source files associated with testing data
 testfaults_SOURCES += \
@@ -139,11 +139,11 @@
 	data/CohesiveKinSrcsDataQuad4.cc \
 	data/CohesiveKinSrcsDataTet4.cc \
 	data/CohesiveKinSrcsDataHex8.cc \
-	data/CohesiveDynLData.cc \
-	data/CohesiveDynLDataTri3.cc \
-	data/CohesiveDynLDataQuad4.cc \
-	data/CohesiveDynLDataHex8.cc \
-	data/CohesiveDynLDataTet4.cc
+	data/CohesiveDynData.cc \
+	data/CohesiveDynDataTri3.cc \
+	data/CohesiveDynDataQuad4.cc \
+	data/CohesiveDynDataHex8.cc \
+	data/CohesiveDynDataTet4.cc
 
 noinst_HEADERS += \
 	data/CohesiveData.hh \
@@ -200,11 +200,11 @@
 	data/CohesiveKinSrcsDataQuad4.hh \
 	data/CohesiveKinSrcsDataTet4.hh \
 	data/CohesiveKinSrcsDataHex8.hh \
-	data/CohesiveDynLData.hh \
-	data/CohesiveDynLDataTri3.hh \
-	data/CohesiveDynLDataQuad4.hh \
-	data/CohesiveDynLDataHex8.hh \
-	data/CohesiveDynLDataTet4.hh
+	data/CohesiveDynData.hh \
+	data/CohesiveDynDataTri3.hh \
+	data/CohesiveDynDataQuad4.hh \
+	data/CohesiveDynDataHex8.hh \
+	data/CohesiveDynDataTet4.hh
 
 AM_CPPFLAGS = \
 	$(PYTHON_EGG_CPPFLAGS) -I$(PYTHON_INCDIR) \

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,851 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultCohesiveDyn.hh" // Implementation of class methods
+
+#include "pylith/faults/FaultCohesiveDyn.hh" // USES FaultCohesiveDyn
+
+#include "data/CohesiveDynData.hh" // USES CohesiveDynData
+
+#include "pylith/faults/EqKinSrc.hh" // USES EqKinSrc
+#include "pylith/faults/BruneSlipFn.hh" // USES BruneSlipFn
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
+#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+#include "pylith/topology/Jacobian.hh" // USES Jacobian
+#include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
+#include "pylith/friction/StaticFriction.hh" // USES StaticFriction
+
+#include "spatialdata/geocoords/CSCart.hh" // USES CSCart
+#include "spatialdata/spatialdb/SimpleDB.hh" // USES SimpleDB
+#include "spatialdata/spatialdb/SimpleIOAscii.hh" // USES SimpleIOAscii
+
+#include <stdexcept> // USES runtime_error
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDyn );
+
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::faults::TestFaultCohesiveDyn::setUp(void)
+{ // setUp
+  _data = 0;
+  _quadrature = new feassemble::Quadrature<topology::SubMesh>();
+  CPPUNIT_ASSERT(0 != _quadrature);
+  _dbInitialTract = 0;
+  _friction = 0;
+  _dbFriction = 0;
+  _flipFault = false;
+} // setUp
+
+// ----------------------------------------------------------------------
+// Tear down testing data.
+void
+pylith::faults::TestFaultCohesiveDyn::tearDown(void)
+{ // tearDown
+  delete _data; _data = 0;
+  delete _quadrature; _quadrature = 0;
+  delete _dbInitialTract; _dbInitialTract = 0;
+  delete _friction; _friction = 0;
+  delete _dbFriction; _dbFriction = 0;
+} // tearDown
+
+// ----------------------------------------------------------------------
+// Test constructor.
+void
+pylith::faults::TestFaultCohesiveDyn::testConstructor(void)
+{ // testConstructor
+  FaultCohesiveDyn fault;
+} // testConstructor
+
+// ----------------------------------------------------------------------
+// Test needJacobianDiag().
+void
+pylith::faults::TestFaultCohesiveDyn::testNeedJacobianDiag(void)
+{ // testNeedJacobianDiag
+  FaultCohesiveDyn fault;
+
+  CPPUNIT_ASSERT_EQUAL(true, fault.needJacobianDiag());
+} // testNeedJacobianDiag
+
+// ----------------------------------------------------------------------
+// Test needVelocity().
+void
+pylith::faults::TestFaultCohesiveDyn::testNeedVelocity(void)
+{ // testNeedVelocity
+  FaultCohesiveDyn fault;
+
+  CPPUNIT_ASSERT_EQUAL(true, fault.needVelocity());
+} // testNeedVelocity
+
+// ----------------------------------------------------------------------
+// Test dbInitialTract().
+void
+pylith::faults::TestFaultCohesiveDyn::testDBInitialTract(void)
+{ // testDBInitialTract
+  FaultCohesiveDyn fault;
+
+  const std::string& label = "test database";
+  spatialdata::spatialdb::SimpleDB db;
+  db.label(label.c_str());
+  fault.dbInitialTract(&db);
+  CPPUNIT_ASSERT(0 != fault._dbInitialTract);
+  CPPUNIT_ASSERT_EQUAL(label, std::string(fault._dbInitialTract->label()));
+ } // testDBInitialTract
+
+// ----------------------------------------------------------------------
+// Test initialize().
+void
+pylith::faults::TestFaultCohesiveDyn::testInitialize(void)
+{ // testInitialize
+  CPPUNIT_ASSERT(0 != _data);
+
+  topology::Mesh mesh;
+  FaultCohesiveDyn fault;
+  topology::SolutionFields fields(mesh);
+  _initialize(&mesh, &fault, &fields);
+
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+  SieveSubMesh::renumbering_type& renumbering = 
+    faultSieveMesh->getRenumbering();
+  const ALE::Obj<SieveSubMesh::label_sequence>& vertices = 
+    faultSieveMesh->depthStratum(0);
+  CPPUNIT_ASSERT(!vertices.isNull());
+  const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
+  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+  int iVertex = 0;
+  for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
+       v_iter != verticesEnd;
+       ++v_iter, ++iVertex) {
+    CPPUNIT_ASSERT(renumbering.find(_data->constraintVertices[iVertex]) !=
+		   renumbering.end());
+    CPPUNIT_ASSERT_EQUAL(renumbering[_data->constraintVertices[iVertex]],
+			 *v_iter);
+  } // for
+  CPPUNIT_ASSERT_EQUAL(_data->numConstraintVert, iVertex);
+
+  // Check orientation
+  //fault._fields->get("orientation").view("ORIENTATION"); // DEBUGGING
+  const ALE::Obj<RealSection>& orientationSection = 
+    fault._fields->get("orientation").section();
+  CPPUNIT_ASSERT(!orientationSection.isNull());
+  const int spaceDim = _data->spaceDim;
+  const int orientationSize = spaceDim*spaceDim;
+  iVertex = 0;
+  for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
+       v_iter != verticesEnd;
+       ++v_iter, ++iVertex) {
+    const int fiberDim = orientationSection->getFiberDimension(*v_iter);
+    CPPUNIT_ASSERT_EQUAL(orientationSize, fiberDim);
+    const double* orientationVertex =
+      orientationSection->restrictPoint(*v_iter);
+    CPPUNIT_ASSERT(0 != orientationVertex);
+
+    const double tolerance = 1.0e-06;
+    for (int i=0; i < orientationSize; ++i) {
+      const int index = iVertex*orientationSize+i;
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->orientation[index],
+				   orientationVertex[i], tolerance);
+    } // for
+  } // for
+
+  // Check area
+  const ALE::Obj<RealSection>& areaSection =
+    fault._fields->get("area").section();
+  CPPUNIT_ASSERT(!areaSection.isNull());
+  iVertex = 0;
+  for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
+       v_iter != verticesEnd;
+       ++v_iter, ++iVertex) {
+    const int fiberDim = areaSection->getFiberDimension(*v_iter);
+    CPPUNIT_ASSERT_EQUAL(1, fiberDim);
+    const double* areaVertex = areaSection->restrictPoint(*v_iter);
+    CPPUNIT_ASSERT(0 != areaVertex);
+
+    const double tolerance = 1.0e-06;
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->area[iVertex], areaVertex[0],
+				 tolerance);
+  } // for
+
+  // Initial tractions
+  if (0 != fault._dbInitialTract) {
+    //fault._fields->get("initial traction").view("INITIAL TRACTIONS"); // DEBUGGING
+    const ALE::Obj<RealSection>& tractionSection = fault._fields->get(
+        "initial traction").section();
+    CPPUNIT_ASSERT(!tractionSection.isNull());
+    const int spaceDim = _data->spaceDim;
+    iVertex = 0;
+    for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin;
+        v_iter != verticesEnd;
+        ++v_iter, ++iVertex) {
+      const int fiberDim = tractionSection->getFiberDimension(*v_iter);
+      CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
+      const double* tractionVertex = tractionSection->restrictPoint(*v_iter);
+      CPPUNIT_ASSERT(0 != tractionVertex);
+
+      const double tolerance = 1.0e-06;
+      for (int i = 0; i < spaceDim; ++i) {
+        const int index = iVertex * spaceDim + i;
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->initialTractions[index],
+            tractionVertex[i], tolerance);
+      } // for
+    } // for
+  } // if
+} // testInitialize
+
+// ----------------------------------------------------------------------
+// Test constrainSolnSpace() for sticking case.
+void
+pylith::faults::TestFaultCohesiveDyn::testConstrainSolnSpaceStick(void)
+{ // testConstrainSolnSpaceStick
+  assert(0 != _data);
+
+  topology::Mesh mesh;
+  FaultCohesiveDyn fault;
+  topology::SolutionFields fields(mesh);
+  _initialize(&mesh, &fault, &fields);
+  topology::Jacobian jacobian(fields, "seqdense");
+  _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrStick);
+
+  const int spaceDim = _data->spaceDim;
+
+  const double t = 2.134;
+  const double dt = 0.01;
+  fault.timeStep(dt);
+  fault.constrainSolnSpace(&fields, t, jacobian);
+
+  { // Check solution values
+    // No change to Lagrange multipliers for stick case.
+    const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+    CPPUNIT_ASSERT(!sieveMesh.isNull());
+    const ALE::Obj<SieveMesh::label_sequence>& vertices =
+      sieveMesh->depthStratum(0);
+    CPPUNIT_ASSERT(!vertices.isNull());
+    const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
+    const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+    // Get section containing solution (disp + Lagrange multipliers)
+    const ALE::Obj<RealSection>& dispIncrSection =
+      fields.get("dispIncr(t->t+dt)").section();
+    CPPUNIT_ASSERT(!dispIncrSection.isNull());
+
+    //dispIncrSection->view("DISP INCREMENT"); // DEBUGGING
+
+    // Get expected values
+    const double* valsE = _data->fieldIncrStick; // No change in dispIncr
+    int iVertex = 0; // variable to use as index into valsE array
+    const int fiberDimE = spaceDim; // number of values per point
+    const double tolerance = 1.0e-06;
+    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
+	 v_iter != verticesEnd;
+	 ++v_iter, ++iVertex) { // loop over all vertices in mesh
+      // Check fiber dimension (number of values at point)
+      const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
+      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+      const double* vals = dispIncrSection->restrictPoint(*v_iter);
+      CPPUNIT_ASSERT(0 != vals);
+
+      // Check values at point
+      for (int i = 0; i < fiberDimE; ++i) {
+        const int index = iVertex * spaceDim + i;
+        const double valE = valsE[index];
+        if (fabs(valE) > tolerance)
+          CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
+        else
+          CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+      } // for
+    } // for
+  } // Check solution values
+
+  { // Check slip values
+    // Slip should be zero for the stick case.
+
+    // Get fault vertex info
+    const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+    CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+    SieveSubMesh::renumbering_type& renumbering =
+      faultSieveMesh->getRenumbering();
+    const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+      faultSieveMesh->depthStratum(0);
+    CPPUNIT_ASSERT(!vertices.isNull());
+    const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
+    const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+    // Get section containing slip
+    const ALE::Obj<RealSection>& slipSection =
+      fault._fields->get("slip").section();
+    CPPUNIT_ASSERT(!slipSection.isNull());
+
+    const double valE = 0.0; // slip should be zero
+    int iVertex = 0; // variable to use as index into valsE array
+    const int fiberDimE = spaceDim; // number of values per point
+    const double tolerance = 1.0e-06;
+    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+	   != verticesEnd;
+	 ++v_iter, ++iVertex) { // loop over fault vertices
+      // Check fiber dimension (number of values at point)
+      const int fiberDim = slipSection->getFiberDimension(*v_iter);
+      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+      const double* vals = slipSection->restrictPoint(*v_iter);
+      CPPUNIT_ASSERT(0 != vals);
+
+      // Check values at point
+      for (int i = 0; i < fiberDimE; ++i) {
+        const int index = iVertex * spaceDim + i;
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+      } // for
+    } // for
+  } // Check slip values
+
+} // testConstrainSolnSpaceStick
+
+// ----------------------------------------------------------------------
+// Test constrainSolnSpace() for slipping case.
+void
+pylith::faults::TestFaultCohesiveDyn::testConstrainSolnSpaceSlip(void)
+{ // testConstrainSolnSpaceSlip
+  assert(0 != _data);
+
+  topology::Mesh mesh;
+  FaultCohesiveDyn fault;
+  topology::SolutionFields fields(mesh);
+  _initialize(&mesh, &fault, &fields);
+  topology::Jacobian jacobian(fields, "seqdense");
+  _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrSlip);
+
+  const int spaceDim = _data->spaceDim;
+
+  const double t = 2.134;
+  const double dt = 0.01;
+  fault.timeStep(dt);
+  fault.constrainSolnSpace(&fields, t, jacobian);
+
+  //residual.view("RESIDUAL"); // DEBUGGING
+
+  { // Check solution values
+    // Lagrange multipliers should be adjusted according to friction
+    // as reflected in the fieldIncrSlipE data member.
+    const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+    CPPUNIT_ASSERT(!sieveMesh.isNull());
+    const ALE::Obj<SieveMesh::label_sequence>& vertices =
+      sieveMesh->depthStratum(0);
+    CPPUNIT_ASSERT(!vertices.isNull());
+    const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
+    const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+    // Get section containing solution (disp + Lagrange multipliers)
+    const ALE::Obj<RealSection>& dispIncrSection =
+      fields.get("dispIncr(t->t+dt)").section();
+    CPPUNIT_ASSERT(!dispIncrSection.isNull());
+
+    // Get expected values
+    const double* valsE = _data->fieldIncrSlipE; // Expected values for dispIncr
+    int iVertex = 0; // variable to use as index into valsE array
+    const int fiberDimE = spaceDim; // number of values per point
+    const double tolerance = 1.0e-06;
+    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
+	 v_iter != verticesEnd;
+	 ++v_iter, ++iVertex) { // loop over all vertices in mesh
+      // Check fiber dimension (number of values at point)
+      const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
+      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+      const double* vals = dispIncrSection->restrictPoint(*v_iter);
+      CPPUNIT_ASSERT(0 != vals);
+
+      // Check values at point
+      for (int i = 0; i < fiberDimE; ++i) {
+        const int index = iVertex * spaceDim + i;
+        const double valE = valsE[index];
+	std::cout << "valE: " << valE
+		  << ", val: " << vals[i]
+		  << std::endl;
+        if (fabs(valE) > tolerance)
+          CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
+        else
+          CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+      } // for
+    } // for
+  } // Check solution values
+
+  { // Check slip values
+    // Slip values should be adjusted based on the change in the
+    // Lagrange multipliers as reflected in the slipSlipE data member.
+
+    // Get fault vertex info
+    const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+    CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+    SieveSubMesh::renumbering_type& renumbering =
+      faultSieveMesh->getRenumbering();
+    const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+      faultSieveMesh->depthStratum(0);
+    CPPUNIT_ASSERT(!vertices.isNull());
+    const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
+    const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+    // Get section containing slip
+    const ALE::Obj<RealSection>& slipSection =
+      fault._fields->get("slip").section();
+    CPPUNIT_ASSERT(!slipSection.isNull());
+
+    // Get expected values
+    const double* valsE = _data->slipSlipE;
+    int iVertex = 0; // variable to use as index into valsE array
+    const int fiberDimE = spaceDim; // number of values per point
+    const double tolerance = 1.0e-06;
+    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+	   != verticesEnd;
+	 ++v_iter, ++iVertex) { // loop over fault vertices
+      // Check fiber dimension (number of values at point)
+      const int fiberDim = slipSection->getFiberDimension(*v_iter);
+      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+      const double* vals = slipSection->restrictPoint(*v_iter);
+      CPPUNIT_ASSERT(0 != vals);
+
+      // Check values at point
+      for (int i = 0; i < fiberDimE; ++i) {
+        const int index = iVertex * spaceDim + i;
+        const double valE = valsE[index];
+	std::cout << "valE: " << valE
+		  << ", val: " << vals[i]
+		  << std::endl;
+        if (fabs(valE) > tolerance)
+          CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
+        else
+          CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+      } // for
+    } // for
+  } // Check slip values
+
+} // testConstrainSolnSpaceSlip
+
+// ----------------------------------------------------------------------
+// Test constrainSolnSpace() for opening case.
+void
+pylith::faults::TestFaultCohesiveDyn::testConstrainSolnSpaceOpen(void)
+{ // testConstrainSolnSpaceOpen
+  assert(0 != _data);
+
+  topology::Mesh mesh;
+  FaultCohesiveDyn fault;
+  topology::SolutionFields fields(mesh);
+  _initialize(&mesh, &fault, &fields);
+  topology::Jacobian jacobian(fields, "seqdense");
+  _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrOpen);
+
+  const int spaceDim = _data->spaceDim;
+
+  const double t = 2.134;
+  const double dt = 0.01;
+  fault.timeStep(dt);
+  fault.constrainSolnSpace(&fields, t, jacobian);
+
+  //residual.view("RESIDUAL"); // DEBUGGING
+
+  { // Check solution values
+    // Lagrange multipliers should be set to zero as reflected in the
+    // fieldIncrOpenE data member.
+    const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+    CPPUNIT_ASSERT(!sieveMesh.isNull());
+    const ALE::Obj<SieveMesh::label_sequence>& vertices =
+      sieveMesh->depthStratum(0);
+    CPPUNIT_ASSERT(!vertices.isNull());
+    const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
+    const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+    // Get section containing solution (disp + Lagrange multipliers)
+    const ALE::Obj<RealSection>& dispIncrSection =
+      fields.get("dispIncr(t->t+dt)").section();
+    CPPUNIT_ASSERT(!dispIncrSection.isNull());
+
+    // Get expected values
+    const double* valsE = _data->fieldIncrOpenE; // Expected values for dispIncr
+    int iVertex = 0; // variable to use as index into valsE array
+    const int fiberDimE = spaceDim; // number of values per point
+    const double tolerance = 1.0e-06;
+    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
+	 v_iter != verticesEnd;
+	 ++v_iter, ++iVertex) { // loop over all vertices in mesh
+      // Check fiber dimension (number of values at point)
+      const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
+      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+      const double* vals = dispIncrSection->restrictPoint(*v_iter);
+      CPPUNIT_ASSERT(0 != vals);
+
+      // Check values at point
+      for (int i = 0; i < fiberDimE; ++i) {
+        const int index = iVertex * spaceDim + i;
+        const double valE = valsE[index];
+	std::cout << "valE: " << valE
+		  << ", val: " << vals[i]
+		  << std::endl;
+        if (fabs(valE) > tolerance)
+          CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
+        else
+          CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+      } // for
+    } // for
+  } // Check solution values
+
+  { // Check slip values
+    // Slip values should be adjusted based on the change in the
+    // Lagrange multipliers as reflected in the slipOpenE data member.
+
+    // Get fault vertex info
+    const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+    CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+    SieveSubMesh::renumbering_type& renumbering =
+      faultSieveMesh->getRenumbering();
+    const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+      faultSieveMesh->depthStratum(0);
+    CPPUNIT_ASSERT(!vertices.isNull());
+    const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
+    const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+    // Get section containing slip
+    const ALE::Obj<RealSection>& slipSection =
+      fault._fields->get("slip").section();
+    CPPUNIT_ASSERT(!slipSection.isNull());
+
+    // Get expected values
+    const double* valsE = _data->slipOpenE;
+    int iVertex = 0; // variable to use as index into valsE array
+    const int fiberDimE = spaceDim; // number of values per point
+    const double tolerance = 1.0e-06;
+    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+	   != verticesEnd;
+	 ++v_iter, ++iVertex) { // loop over fault vertices
+      // Check fiber dimension (number of values at point)
+      const int fiberDim = slipSection->getFiberDimension(*v_iter);
+      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+      const double* vals = slipSection->restrictPoint(*v_iter);
+      CPPUNIT_ASSERT(0 != vals);
+
+      // Check values at point
+      for (int i = 0; i < fiberDimE; ++i) {
+        const int index = iVertex * spaceDim + i;
+        const double valE = valsE[index];
+	std::cout << "valE: " << valE
+		  << ", val: " << vals[i]
+		  << std::endl;
+        if (fabs(valE) > tolerance)
+          CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
+        else
+          CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+      } // for
+    } // for
+  } // Check slip values
+
+} // testConstrainSolnSpaceOpen
+
+// ----------------------------------------------------------------------
+// Test updateStateVars().
+void
+pylith::faults::TestFaultCohesiveDyn::testUpdateStateVars(void)
+{ // testUpdateStateVars
+  // :TODO: Need to verify that fault constitutive updateStateVars is called.
+} // testUpdateStateVars
+
+// ----------------------------------------------------------------------
+// Test calcTractions().
+void
+pylith::faults::TestFaultCohesiveDyn::testCalcTractions(void)
+{ // testCalcTractions
+  CPPUNIT_ASSERT(0 != _data);
+
+  topology::Mesh mesh;
+  FaultCohesiveDyn fault;
+  topology::SolutionFields fields(mesh);
+  _initialize(&mesh, &fault, &fields);
+  topology::Jacobian jacobian(fields, "seqdense");
+  _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrStick);
+  
+  CPPUNIT_ASSERT(0 != fault._faultMesh);
+  const int spaceDim = _data->spaceDim;
+  topology::Field<topology::SubMesh> tractions(*fault._faultMesh);
+  tractions.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
+  tractions.allocate();
+  tractions.zero();
+  const ALE::Obj<RealSection>& tractionsSection = tractions.section();
+  CPPUNIT_ASSERT(!tractionsSection.isNull());
+
+  const double t = 0;
+  fault.updateStateVars(t, &fields);
+  fault._calcTractions(&tractions, fields.get("disp(t)"));
+
+  //tractions.view("TRACTIONS"); // DEBUGGING
+
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& vertices =
+    faultSieveMesh->depthStratum(0);
+  CPPUNIT_ASSERT(!vertices.isNull());
+  const SieveSubMesh::label_sequence::iterator verticesBegin =
+    vertices->begin();
+  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+  SieveSubMesh::renumbering_type& renumbering =
+    faultSieveMesh->getRenumbering();
+  const SieveMesh::renumbering_type::const_iterator renumberingBegin =
+    renumbering.begin();
+  const SieveMesh::renumbering_type::const_iterator renumberingEnd =
+    renumbering.end();
+
+  const ALE::Obj<RealSection>& dispSection = fields.get("disp(t)").section();
+  CPPUNIT_ASSERT(!dispSection.isNull());
+
+  int iVertex = 0;
+  const double tolerance = 1.0e-06;
+  for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
+       v_iter != verticesEnd;
+       ++v_iter, ++iVertex) {
+    SieveMesh::point_type meshVertex = -1;
+    bool found = false;
+
+    // Test with dbInitialTract
+    for (SieveMesh::renumbering_type::const_iterator r_iter = renumberingBegin;
+      r_iter != renumberingEnd;
+      ++r_iter) {
+      if (r_iter->second == *v_iter) {
+        meshVertex = r_iter->first;
+        found = true;
+        break;
+      } // if
+    } // for
+    CPPUNIT_ASSERT(found);
+    int fiberDim = tractionsSection->getFiberDimension(*v_iter);
+    CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
+    const double* tractionsVertex = tractionsSection->restrictPoint(*v_iter);
+    CPPUNIT_ASSERT(0 != tractionsVertex);
+
+    fiberDim = dispSection->getFiberDimension(meshVertex);
+    CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
+    const double* dispVertex = dispSection->restrictPoint(meshVertex);
+    CPPUNIT_ASSERT(0 != dispVertex);
+
+    const double scale = 1.0 / _data->area[iVertex];
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      const double tractionE =
+        _data->initialTractions[iVertex*spaceDim+iDim] + 
+	dispVertex[iDim] * scale;
+      if (tractionE != 0.0)
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, tractionsVertex[iDim]/tractionE,
+             tolerance);
+      else
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(tractionE, tractionsVertex[iDim],
+             tolerance);
+    } // for
+  } // for
+
+  // Test without dbInitialTract
+  // :TODO: STUFF GOES HERE (Brad)
+} // testCalcTractions
+
+// ----------------------------------------------------------------------
+// Initialize FaultCohesiveDyn interface condition.
+void
+pylith::faults::TestFaultCohesiveDyn::_initialize(
+					topology::Mesh* const mesh,
+					FaultCohesiveDyn* const fault,
+					topology::SolutionFields* const fields)
+{ // _initialize
+  CPPUNIT_ASSERT(0 != mesh);
+  CPPUNIT_ASSERT(0 != fault);
+  CPPUNIT_ASSERT(0 != fields);
+  CPPUNIT_ASSERT(0 != _data);
+  CPPUNIT_ASSERT(0 != _quadrature);
+
+  meshio::MeshIOAscii iohandler;
+  iohandler.filename(_data->meshFilename);
+  iohandler.read(mesh);
+  
+  //mesh->debug(true); // DEBUGGING
+  
+  spatialdata::geocoords::CSCart cs;
+  spatialdata::units::Nondimensional normalizer;
+  cs.setSpaceDim(mesh->dimension());
+  cs.initialize();
+  mesh->coordsys(&cs);
+  mesh->nondimensionalize(normalizer);
+  
+  _quadrature->initialize(_data->basis, _data->numQuadPts, _data->numBasis,
+			  _data->basisDeriv,
+			  _data->numQuadPts, _data->numBasis, _data->cellDim,
+			  _data->quadPts, _data->numQuadPts, _data->cellDim,
+			  _data->quadWts, _data->numQuadPts,
+			  _data->spaceDim);
+  
+  // Setup initial tractions
+  spatialdata::spatialdb::SimpleDB* db =
+      new spatialdata::spatialdb::SimpleDB("initial tractions");
+  CPPUNIT_ASSERT(0 != db);
+  spatialdata::spatialdb::SimpleIOAscii ioInitialTract;
+  ioInitialTract.filename(_data->initialTractFilename);
+  db->ioHandler(&ioInitialTract);
+  delete _dbInitialTract; _dbInitialTract = db;
+  fault->dbInitialTract(db);
+
+  // Setup friction
+  spatialdata::spatialdb::SimpleDB* dbFriction =
+      new spatialdata::spatialdb::SimpleDB("static friction");
+  CPPUNIT_ASSERT(0 != dbFriction);
+  spatialdata::spatialdb::SimpleIOAscii ioFriction;
+  if (2 == _data->spaceDim)
+    ioFriction.filename("data/static_friction_2d.spatialdb");
+  else if (3 == _data->spaceDim)
+    ioFriction.filename("data/static_friction_3d.spatialdb");
+  dbFriction->ioHandler(&ioFriction);
+  delete _dbFriction; _dbFriction = dbFriction;
+  friction::StaticFriction* friction = new pylith::friction::StaticFriction();
+  CPPUNIT_ASSERT(0 != friction);
+  friction->label("static friction");
+  friction->dbProperties(dbFriction);
+  _friction = friction;
+  fault->frictionModel(friction);
+
+  int firstFaultVertex    = 0;
+  int firstLagrangeVertex = mesh->sieveMesh()->getIntSection(_data->label)->size();
+  int firstFaultCell      = mesh->sieveMesh()->getIntSection(_data->label)->size();
+  if (fault->useLagrangeConstraints())
+    firstFaultCell += mesh->sieveMesh()->getIntSection(_data->label)->size();
+  fault->id(_data->id);
+  fault->label(_data->label);
+  fault->quadrature(_quadrature);
+  
+  fault->adjustTopology(mesh, &firstFaultVertex, &firstLagrangeVertex,
+			&firstFaultCell, _flipFault);
+  
+  const double upDir[] = { 0.0, 0.0, 1.0 };
+  const double normalDir[] = { 1.0, 0.0, 0.0 };
+  
+  fault->initialize(*mesh, upDir, normalDir);
+  
+  // Setup fields
+  fields->add("disp(t)", "displacement");
+  fields->add("dispIncr(t->t+dt)", "displacement_increment");
+  fields->add("velocity(t)", "velocity");
+  fields->solutionName("dispIncr(t->t+dt)");
+  
+  const int spaceDim = _data->spaceDim;
+  topology::Field<topology::Mesh>& disp = fields->get("disp(t)");
+  disp.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
+  disp.allocate();
+  fields->copyLayout("disp(t)");
+} // _initialize
+
+// ----------------------------------------------------------------------
+// Set values for fields and Jacobian.
+void
+pylith::faults::TestFaultCohesiveDyn::_setFieldsJacobian(
+          topology::Mesh* const mesh,
+          FaultCohesiveDyn* const fault,
+          topology::SolutionFields* const fields,
+          topology::Jacobian* const jacobian,
+          const double* const fieldIncr)
+{ // _initialize
+  CPPUNIT_ASSERT(0 != mesh);
+  CPPUNIT_ASSERT(0 != fault);
+  CPPUNIT_ASSERT(0 != fields);
+  CPPUNIT_ASSERT(0 != jacobian);
+  CPPUNIT_ASSERT(0 != _data);
+  CPPUNIT_ASSERT(0 != fieldIncr);
+
+  const int spaceDim = _data->spaceDim;
+
+  // Get vertices in mesh
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh->sieveMesh();
+  CPPUNIT_ASSERT(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& vertices =
+    sieveMesh->depthStratum(0);
+  CPPUNIT_ASSERT(!vertices.isNull());
+  const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
+  const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+  // Set displacement values
+  const ALE::Obj<RealSection>& dispSection =
+    fields->get("disp(t)").section();
+  CPPUNIT_ASSERT(!dispSection.isNull());
+  int iVertex = 0;
+  for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
+       v_iter != verticesEnd;
+       ++v_iter, ++iVertex)
+    dispSection->updatePoint(*v_iter, &_data->fieldT[iVertex*spaceDim]);
+
+  // Set increment values
+  const ALE::Obj<RealSection>& dispIncrSection =
+    fields->get("dispIncr(t->t+dt)").section();
+  CPPUNIT_ASSERT(!dispIncrSection.isNull());
+  iVertex = 0;
+  for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
+       v_iter != verticesEnd;
+       ++v_iter, ++iVertex)
+    dispIncrSection->updatePoint(*v_iter, &fieldIncr[iVertex*spaceDim]);
+
+  // Setup Jacobian matrix
+  const int nrows = dispIncrSection->sizeWithBC();
+  const int ncols = nrows;
+  int nrowsM = 0;
+  int ncolsM = 0;
+  PetscMat jacobianMat = jacobian->matrix();
+  MatGetSize(jacobianMat, &nrowsM, &ncolsM);
+  CPPUNIT_ASSERT_EQUAL(nrows, nrowsM);
+  CPPUNIT_ASSERT_EQUAL(ncols, ncolsM);
+
+  int_array rows(nrows);
+  int_array cols(ncols);
+  for (int iRow=0; iRow < nrows; ++iRow)
+    rows[iRow] = iRow;
+  for (int iCol=0; iCol < ncols; ++iCol)
+    cols[iCol] = iCol;
+  MatSetValues(jacobianMat, nrows, &rows[0], ncols, &cols[0], _data->jacobian, INSERT_VALUES);
+  jacobian->assemble("final_assembly");
+
+  // Set Jacobian diagonal
+  fields->add("Jacobian diagonal", "jacobian_diagonal");
+  topology::Field<topology::Mesh>& jacobianDiag =
+    fields->get("Jacobian diagonal");
+  const topology::Field<topology::Mesh>& disp =
+    fields->get("disp(t)");
+  jacobianDiag.cloneSection(disp);
+  jacobianDiag.createVector();
+  jacobianDiag.createScatter();
+  MatGetDiagonal(jacobian->matrix(), jacobianDiag.vector());
+  jacobianDiag.scatterVectorToSection();
+} // _setFieldsJacobian
+
+// ----------------------------------------------------------------------
+// Determine if vertex is a Lagrange multiplier constraint vertex.
+bool
+pylith::faults::TestFaultCohesiveDyn::_isConstraintVertex(const int vertex) const
+{ // _isConstraintVertex
+  assert(0 != _data);
+
+  const int numConstraintVert = _data->numConstraintVert;
+  bool isFound = false;
+  for (int i=0; i < _data->numConstraintVert; ++i)
+    if (_data->constraintVertices[i] == vertex) {
+      isFound = true;
+      break;
+    } // if
+  return isFound;
+} // _isConstraintVertex
+
+
+// End of file 

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,155 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultCohesiveDyn.hh
+ *
+ * @brief C++ TestFaultCohesiveDyn object
+ *
+ * C++ unit testing for FaultCohesiveDyn.
+ */
+
+#if !defined(pylith_faults_testfaultcohesivedyn_hh)
+#define pylith_faults_testfaultcohesivedyn_hh
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include "pylith/faults/faultsfwd.hh" // forward declarations
+#include "pylith/topology/topologyfwd.hh" // USES Mesh, SubMesh
+#include "pylith/feassemble/feassemblefwd.hh" // HOLDSA Quadrature
+#include "pylith/friction/frictionfwd.hh" // HOLDSA FrictionModel
+#include "spatialdata/spatialdb/spatialdbfwd.hh" // HOLDSA SpatialDB
+#include <vector> // HASA std::vector
+/// Namespace for pylith package
+namespace pylith {
+  namespace faults {
+    class TestFaultCohesiveDyn;
+
+    class CohesiveDynData;
+  } // faults
+} // pylith
+
+/// C++ unit testing for FaultCohesiveDyn
+class pylith::faults::TestFaultCohesiveDyn: public CppUnit::TestFixture
+{ // class TestFaultCohesiveDyn
+
+  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+  CPPUNIT_TEST_SUITE( TestFaultCohesiveDyn );
+
+  CPPUNIT_TEST( testConstructor );
+  CPPUNIT_TEST( testNeedJacobianDiag );
+  CPPUNIT_TEST( testNeedVelocity );
+  CPPUNIT_TEST( testDBInitialTract );
+
+  // Tests in derived classes:
+  // testInitialize()
+  // testConstrainSolnSpaceStick()
+  // testConstrainSolnSpaceSlip()
+  // testConstrainSolnSpaceOpen()
+  // testUpdateStateVars()
+  // testCalcTractions()
+
+  CPPUNIT_TEST_SUITE_END();
+
+  // PROTECTED MEMBERS //////////////////////////////////////////////////
+protected:
+
+  CohesiveDynData* _data; ///< Data for testing
+  feassemble::Quadrature<topology::SubMesh>* _quadrature; ///< Fault quad.
+  spatialdata::spatialdb::SpatialDB* _dbInitialTract; ///< Initial tractions.
+  friction::FrictionModel* _friction; ///< Friction model
+  spatialdata::spatialdb::SpatialDB* _dbFriction; ///< Friction parameters.
+  bool _flipFault; ///< If true, flip fault orientation.
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public:
+
+  /// Setup testing data.
+  void setUp(void);
+
+  /// Tear down testing data.
+  void tearDown(void);
+
+  /// Test constructor.
+  void testConstructor(void);
+
+  /// Test needJacobianDiag().
+  void testNeedJacobianDiag(void);
+
+  /// Test needVelocity().
+  void testNeedVelocity(void);
+
+  /// Test dbInitialTract().
+  void testDBInitialTract(void);
+
+  /// Test initialize().
+  void testInitialize(void);
+
+  /// Test constrainSolnSpace() for sticking case.
+  void testConstrainSolnSpaceStick(void);
+
+  /// Test constrainSolnSpace() for slipping case.
+  void testConstrainSolnSpaceSlip(void);
+
+  /// Test constrainSolnSpace for fault opening case().
+  void testConstrainSolnSpaceOpen(void);
+
+  /// Test updateStateVars().
+  void testUpdateStateVars(void);
+
+  /// Test _calcTractions().
+  void testCalcTractions(void);
+
+  // PRIVATE METHODS ////////////////////////////////////////////////////
+private:
+
+  /** Initialize FaultCohesiveDyn interface condition.
+   *
+   * @param mesh PETSc mesh to initialize
+   * @param fault Cohesive fault interface condition to initialize.
+   * @param fields Solution fields.
+   */
+  void _initialize(topology::Mesh* const mesh,
+      FaultCohesiveDyn* const fault,
+      topology::SolutionFields* const fields);
+
+  /** Set values for fields and Jacobian.
+   *
+   * @pre Must call _initialize() before _setFieldsJacobian to set solution
+   * field. Note: Call to Jacobian constructor should be after call to
+   * _initialize() so that the solution field is setup.
+   *
+   * @param mesh PETSc mesh to initialize
+   * @param fault Cohesive fault interface condition to initialize.
+   * @param fields Solution fields.
+   * @param jacobian Jacobian sparse matrix.
+   * @param fieldIncrVals Values for solution increment field.
+   */
+  void _setFieldsJacobian(topology::Mesh* const mesh,
+      FaultCohesiveDyn* const fault,
+      topology::SolutionFields* const fields,
+      topology::Jacobian* const jacobian,
+      const double* const fieldIncrVals);
+
+  /** Determine if vertex is a Lagrange multiplier constraint vertex.
+   *
+   * @param vertex Label of vertex.
+   *
+   * @returns True if vertex is a constraint vertex, false otherwise.
+   */
+  bool _isConstraintVertex(const int vertex) const;
+
+}; // class TestFaultCohesiveDyn
+
+#endif // pylith_faults_testfaultcohesivedyn_hh
+
+// End of file 

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultCohesiveDynHex8.hh" // Implementation of class methods
+
+#include "data/CohesiveDynDataHex8.hh" // USES CohesiveDynLDataHex8
+
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
+#include "pylith/feassemble/GeometryQuad3D.hh" // USES GeometryQuad3D
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynHex8 );
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::faults::TestFaultCohesiveDynHex8::setUp(void)
+{ // setUp
+  TestFaultCohesiveDyn::setUp();
+  _data = new CohesiveDynDataHex8();
+
+  CPPUNIT_ASSERT(0 != _quadrature);
+  feassemble::GeometryQuad3D geometry;
+  _quadrature->refGeometry(&geometry);
+  
+  _flipFault = true;
+} // setUp
+
+
+// End of file 

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultCohesiveDynHex8.hh
+ *
+ * @brief C++ TestFaultCohesiveDynHex8 object.
+ *
+ * C++ unit testing for FaultCohesiveDyn for mesh with 3-D quadrilateral cells.
+ */
+
+#if !defined(pylith_faults_testfaultcohesivedynhex8_hh)
+#define pylith_faults_testfaultcohesivedynhex8_hh
+
+#include "TestFaultCohesiveDyn.hh" // ISA TestFaultCohesiveDyn
+
+/// Namespace for pylith package
+namespace pylith {
+  namespace faults {
+    class TestFaultCohesiveDynHex8;
+  } // bc
+} // pylith
+
+/// C++ unit testing for FaultCohesiveDyn for mesh with 3-D quadrilateral cells.
+class pylith::faults::TestFaultCohesiveDynHex8 : public TestFaultCohesiveDyn
+{ // class TestFaultCohesiveDynHex8
+
+  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+  CPPUNIT_TEST_SUITE( TestFaultCohesiveDynHex8 );
+
+  CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testConstrainSolnSpaceStick );
+  CPPUNIT_TEST( testConstrainSolnSpaceSlip );
+  CPPUNIT_TEST( testConstrainSolnSpaceOpen );
+  CPPUNIT_TEST( testUpdateStateVars );
+  CPPUNIT_TEST( testCalcTractions );
+
+  CPPUNIT_TEST_SUITE_END();
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /// Setup testing data.
+  void setUp(void);
+
+}; // class TestFaultCohesiveDynHex8
+
+#endif // pylith_faults_testfaultcohesivedynhex8_hh
+
+
+// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,851 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFaultCohesiveDynL.hh" // Implementation of class methods
-
-#include "pylith/faults/FaultCohesiveDynL.hh" // USES FaultCohesiveDynL
-
-#include "data/CohesiveDynLData.hh" // USES CohesiveDynLData
-
-#include "pylith/faults/EqKinSrc.hh" // USES EqKinSrc
-#include "pylith/faults/BruneSlipFn.hh" // USES BruneSlipFn
-#include "pylith/topology/Mesh.hh" // USES Mesh
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
-#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
-#include "pylith/topology/Jacobian.hh" // USES Jacobian
-#include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
-#include "pylith/friction/StaticFriction.hh" // USES StaticFriction
-
-#include "spatialdata/geocoords/CSCart.hh" // USES CSCart
-#include "spatialdata/spatialdb/SimpleDB.hh" // USES SimpleDB
-#include "spatialdata/spatialdb/SimpleIOAscii.hh" // USES SimpleIOAscii
-
-#include <stdexcept> // USES runtime_error
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynL );
-
-// ----------------------------------------------------------------------
-typedef pylith::topology::Mesh::SieveMesh SieveMesh;
-typedef pylith::topology::Mesh::RealSection RealSection;
-typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
-
-// ----------------------------------------------------------------------
-// Setup testing data.
-void
-pylith::faults::TestFaultCohesiveDynL::setUp(void)
-{ // setUp
-  _data = 0;
-  _quadrature = new feassemble::Quadrature<topology::SubMesh>();
-  CPPUNIT_ASSERT(0 != _quadrature);
-  _dbInitialTract = 0;
-  _friction = 0;
-  _dbFriction = 0;
-  _flipFault = false;
-} // setUp
-
-// ----------------------------------------------------------------------
-// Tear down testing data.
-void
-pylith::faults::TestFaultCohesiveDynL::tearDown(void)
-{ // tearDown
-  delete _data; _data = 0;
-  delete _quadrature; _quadrature = 0;
-  delete _dbInitialTract; _dbInitialTract = 0;
-  delete _friction; _friction = 0;
-  delete _dbFriction; _dbFriction = 0;
-} // tearDown
-
-// ----------------------------------------------------------------------
-// Test constructor.
-void
-pylith::faults::TestFaultCohesiveDynL::testConstructor(void)
-{ // testConstructor
-  FaultCohesiveDynL fault;
-} // testConstructor
-
-// ----------------------------------------------------------------------
-// Test needJacobianDiag().
-void
-pylith::faults::TestFaultCohesiveDynL::testNeedJacobianDiag(void)
-{ // testNeedJacobianDiag
-  FaultCohesiveDynL fault;
-
-  CPPUNIT_ASSERT_EQUAL(true, fault.needJacobianDiag());
-} // testNeedJacobianDiag
-
-// ----------------------------------------------------------------------
-// Test needVelocity().
-void
-pylith::faults::TestFaultCohesiveDynL::testNeedVelocity(void)
-{ // testNeedVelocity
-  FaultCohesiveDynL fault;
-
-  CPPUNIT_ASSERT_EQUAL(true, fault.needVelocity());
-} // testNeedVelocity
-
-// ----------------------------------------------------------------------
-// Test dbInitialTract().
-void
-pylith::faults::TestFaultCohesiveDynL::testDBInitialTract(void)
-{ // testDBInitialTract
-  FaultCohesiveDynL fault;
-
-  const std::string& label = "test database";
-  spatialdata::spatialdb::SimpleDB db;
-  db.label(label.c_str());
-  fault.dbInitialTract(&db);
-  CPPUNIT_ASSERT(0 != fault._dbInitialTract);
-  CPPUNIT_ASSERT_EQUAL(label, std::string(fault._dbInitialTract->label()));
- } // testDBInitialTract
-
-// ----------------------------------------------------------------------
-// Test initialize().
-void
-pylith::faults::TestFaultCohesiveDynL::testInitialize(void)
-{ // testInitialize
-  CPPUNIT_ASSERT(0 != _data);
-
-  topology::Mesh mesh;
-  FaultCohesiveDynL fault;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &fault, &fields);
-
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
-  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
-  SieveSubMesh::renumbering_type& renumbering = 
-    faultSieveMesh->getRenumbering();
-  const ALE::Obj<SieveSubMesh::label_sequence>& vertices = 
-    faultSieveMesh->depthStratum(0);
-  CPPUNIT_ASSERT(!vertices.isNull());
-  const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-  int iVertex = 0;
-  for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
-       v_iter != verticesEnd;
-       ++v_iter, ++iVertex) {
-    CPPUNIT_ASSERT(renumbering.find(_data->constraintVertices[iVertex]) !=
-		   renumbering.end());
-    CPPUNIT_ASSERT_EQUAL(renumbering[_data->constraintVertices[iVertex]],
-			 *v_iter);
-  } // for
-  CPPUNIT_ASSERT_EQUAL(_data->numConstraintVert, iVertex);
-
-  // Check orientation
-  //fault._fields->get("orientation").view("ORIENTATION"); // DEBUGGING
-  const ALE::Obj<RealSection>& orientationSection = 
-    fault._fields->get("orientation").section();
-  CPPUNIT_ASSERT(!orientationSection.isNull());
-  const int spaceDim = _data->spaceDim;
-  const int orientationSize = spaceDim*spaceDim;
-  iVertex = 0;
-  for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
-       v_iter != verticesEnd;
-       ++v_iter, ++iVertex) {
-    const int fiberDim = orientationSection->getFiberDimension(*v_iter);
-    CPPUNIT_ASSERT_EQUAL(orientationSize, fiberDim);
-    const double* orientationVertex =
-      orientationSection->restrictPoint(*v_iter);
-    CPPUNIT_ASSERT(0 != orientationVertex);
-
-    const double tolerance = 1.0e-06;
-    for (int i=0; i < orientationSize; ++i) {
-      const int index = iVertex*orientationSize+i;
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->orientation[index],
-				   orientationVertex[i], tolerance);
-    } // for
-  } // for
-
-  // Check area
-  const ALE::Obj<RealSection>& areaSection =
-    fault._fields->get("area").section();
-  CPPUNIT_ASSERT(!areaSection.isNull());
-  iVertex = 0;
-  for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
-       v_iter != verticesEnd;
-       ++v_iter, ++iVertex) {
-    const int fiberDim = areaSection->getFiberDimension(*v_iter);
-    CPPUNIT_ASSERT_EQUAL(1, fiberDim);
-    const double* areaVertex = areaSection->restrictPoint(*v_iter);
-    CPPUNIT_ASSERT(0 != areaVertex);
-
-    const double tolerance = 1.0e-06;
-    CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->area[iVertex], areaVertex[0],
-				 tolerance);
-  } // for
-
-  // Initial tractions
-  if (0 != fault._dbInitialTract) {
-    //fault._fields->get("initial traction").view("INITIAL TRACTIONS"); // DEBUGGING
-    const ALE::Obj<RealSection>& tractionSection = fault._fields->get(
-        "initial traction").section();
-    CPPUNIT_ASSERT(!tractionSection.isNull());
-    const int spaceDim = _data->spaceDim;
-    iVertex = 0;
-    for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin;
-        v_iter != verticesEnd;
-        ++v_iter, ++iVertex) {
-      const int fiberDim = tractionSection->getFiberDimension(*v_iter);
-      CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
-      const double* tractionVertex = tractionSection->restrictPoint(*v_iter);
-      CPPUNIT_ASSERT(0 != tractionVertex);
-
-      const double tolerance = 1.0e-06;
-      for (int i = 0; i < spaceDim; ++i) {
-        const int index = iVertex * spaceDim + i;
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->initialTractions[index],
-            tractionVertex[i], tolerance);
-      } // for
-    } // for
-  } // if
-} // testInitialize
-
-// ----------------------------------------------------------------------
-// Test constrainSolnSpace() for sticking case.
-void
-pylith::faults::TestFaultCohesiveDynL::testConstrainSolnSpaceStick(void)
-{ // testConstrainSolnSpaceStick
-  assert(0 != _data);
-
-  topology::Mesh mesh;
-  FaultCohesiveDynL fault;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &fault, &fields);
-  topology::Jacobian jacobian(fields, "seqdense");
-  _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrStick);
-
-  const int spaceDim = _data->spaceDim;
-
-  const double t = 2.134;
-  const double dt = 0.01;
-  fault.timeStep(dt);
-  fault.constrainSolnSpace(&fields, t, jacobian);
-
-  { // Check solution values
-    // No change to Lagrange multipliers for stick case.
-    const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
-    CPPUNIT_ASSERT(!sieveMesh.isNull());
-    const ALE::Obj<SieveMesh::label_sequence>& vertices =
-      sieveMesh->depthStratum(0);
-    CPPUNIT_ASSERT(!vertices.isNull());
-    const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
-    const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-    // Get section containing solution (disp + Lagrange multipliers)
-    const ALE::Obj<RealSection>& dispIncrSection =
-      fields.get("dispIncr(t->t+dt)").section();
-    CPPUNIT_ASSERT(!dispIncrSection.isNull());
-
-    //dispIncrSection->view("DISP INCREMENT"); // DEBUGGING
-
-    // Get expected values
-    const double* valsE = _data->fieldIncrStick; // No change in dispIncr
-    int iVertex = 0; // variable to use as index into valsE array
-    const int fiberDimE = spaceDim; // number of values per point
-    const double tolerance = 1.0e-06;
-    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
-	 v_iter != verticesEnd;
-	 ++v_iter, ++iVertex) { // loop over all vertices in mesh
-      // Check fiber dimension (number of values at point)
-      const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
-      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
-      const double* vals = dispIncrSection->restrictPoint(*v_iter);
-      CPPUNIT_ASSERT(0 != vals);
-
-      // Check values at point
-      for (int i = 0; i < fiberDimE; ++i) {
-        const int index = iVertex * spaceDim + i;
-        const double valE = valsE[index];
-        if (fabs(valE) > tolerance)
-          CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
-        else
-          CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
-      } // for
-    } // for
-  } // Check solution values
-
-  { // Check slip values
-    // Slip should be zero for the stick case.
-
-    // Get fault vertex info
-    const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
-    CPPUNIT_ASSERT(!faultSieveMesh.isNull());
-    SieveSubMesh::renumbering_type& renumbering =
-      faultSieveMesh->getRenumbering();
-    const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-      faultSieveMesh->depthStratum(0);
-    CPPUNIT_ASSERT(!vertices.isNull());
-    const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
-    const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-    // Get section containing slip
-    const ALE::Obj<RealSection>& slipSection =
-      fault._fields->get("slip").section();
-    CPPUNIT_ASSERT(!slipSection.isNull());
-
-    const double valE = 0.0; // slip should be zero
-    int iVertex = 0; // variable to use as index into valsE array
-    const int fiberDimE = spaceDim; // number of values per point
-    const double tolerance = 1.0e-06;
-    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-	   != verticesEnd;
-	 ++v_iter, ++iVertex) { // loop over fault vertices
-      // Check fiber dimension (number of values at point)
-      const int fiberDim = slipSection->getFiberDimension(*v_iter);
-      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
-      const double* vals = slipSection->restrictPoint(*v_iter);
-      CPPUNIT_ASSERT(0 != vals);
-
-      // Check values at point
-      for (int i = 0; i < fiberDimE; ++i) {
-        const int index = iVertex * spaceDim + i;
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
-      } // for
-    } // for
-  } // Check slip values
-
-} // testConstrainSolnSpaceStick
-
-// ----------------------------------------------------------------------
-// Test constrainSolnSpace() for slipping case.
-void
-pylith::faults::TestFaultCohesiveDynL::testConstrainSolnSpaceSlip(void)
-{ // testConstrainSolnSpaceSlip
-  assert(0 != _data);
-
-  topology::Mesh mesh;
-  FaultCohesiveDynL fault;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &fault, &fields);
-  topology::Jacobian jacobian(fields, "seqdense");
-  _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrSlip);
-
-  const int spaceDim = _data->spaceDim;
-
-  const double t = 2.134;
-  const double dt = 0.01;
-  fault.timeStep(dt);
-  fault.constrainSolnSpace(&fields, t, jacobian);
-
-  //residual.view("RESIDUAL"); // DEBUGGING
-
-  { // Check solution values
-    // Lagrange multipliers should be adjusted according to friction
-    // as reflected in the fieldIncrSlipE data member.
-    const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
-    CPPUNIT_ASSERT(!sieveMesh.isNull());
-    const ALE::Obj<SieveMesh::label_sequence>& vertices =
-      sieveMesh->depthStratum(0);
-    CPPUNIT_ASSERT(!vertices.isNull());
-    const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
-    const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-    // Get section containing solution (disp + Lagrange multipliers)
-    const ALE::Obj<RealSection>& dispIncrSection =
-      fields.get("dispIncr(t->t+dt)").section();
-    CPPUNIT_ASSERT(!dispIncrSection.isNull());
-
-    // Get expected values
-    const double* valsE = _data->fieldIncrSlipE; // Expected values for dispIncr
-    int iVertex = 0; // variable to use as index into valsE array
-    const int fiberDimE = spaceDim; // number of values per point
-    const double tolerance = 1.0e-06;
-    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
-	 v_iter != verticesEnd;
-	 ++v_iter, ++iVertex) { // loop over all vertices in mesh
-      // Check fiber dimension (number of values at point)
-      const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
-      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
-      const double* vals = dispIncrSection->restrictPoint(*v_iter);
-      CPPUNIT_ASSERT(0 != vals);
-
-      // Check values at point
-      for (int i = 0; i < fiberDimE; ++i) {
-        const int index = iVertex * spaceDim + i;
-        const double valE = valsE[index];
-	std::cout << "valE: " << valE
-		  << ", val: " << vals[i]
-		  << std::endl;
-        if (fabs(valE) > tolerance)
-          CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
-        else
-          CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
-      } // for
-    } // for
-  } // Check solution values
-
-  { // Check slip values
-    // Slip values should be adjusted based on the change in the
-    // Lagrange multipliers as reflected in the slipSlipE data member.
-
-    // Get fault vertex info
-    const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
-    CPPUNIT_ASSERT(!faultSieveMesh.isNull());
-    SieveSubMesh::renumbering_type& renumbering =
-      faultSieveMesh->getRenumbering();
-    const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-      faultSieveMesh->depthStratum(0);
-    CPPUNIT_ASSERT(!vertices.isNull());
-    const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
-    const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-    // Get section containing slip
-    const ALE::Obj<RealSection>& slipSection =
-      fault._fields->get("slip").section();
-    CPPUNIT_ASSERT(!slipSection.isNull());
-
-    // Get expected values
-    const double* valsE = _data->slipSlipE;
-    int iVertex = 0; // variable to use as index into valsE array
-    const int fiberDimE = spaceDim; // number of values per point
-    const double tolerance = 1.0e-06;
-    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-	   != verticesEnd;
-	 ++v_iter, ++iVertex) { // loop over fault vertices
-      // Check fiber dimension (number of values at point)
-      const int fiberDim = slipSection->getFiberDimension(*v_iter);
-      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
-      const double* vals = slipSection->restrictPoint(*v_iter);
-      CPPUNIT_ASSERT(0 != vals);
-
-      // Check values at point
-      for (int i = 0; i < fiberDimE; ++i) {
-        const int index = iVertex * spaceDim + i;
-        const double valE = valsE[index];
-	std::cout << "valE: " << valE
-		  << ", val: " << vals[i]
-		  << std::endl;
-        if (fabs(valE) > tolerance)
-          CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
-        else
-          CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
-      } // for
-    } // for
-  } // Check slip values
-
-} // testConstrainSolnSpaceSlip
-
-// ----------------------------------------------------------------------
-// Test constrainSolnSpace() for opening case.
-void
-pylith::faults::TestFaultCohesiveDynL::testConstrainSolnSpaceOpen(void)
-{ // testConstrainSolnSpaceOpen
-  assert(0 != _data);
-
-  topology::Mesh mesh;
-  FaultCohesiveDynL fault;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &fault, &fields);
-  topology::Jacobian jacobian(fields, "seqdense");
-  _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrOpen);
-
-  const int spaceDim = _data->spaceDim;
-
-  const double t = 2.134;
-  const double dt = 0.01;
-  fault.timeStep(dt);
-  fault.constrainSolnSpace(&fields, t, jacobian);
-
-  //residual.view("RESIDUAL"); // DEBUGGING
-
-  { // Check solution values
-    // Lagrange multipliers should be set to zero as reflected in the
-    // fieldIncrOpenE data member.
-    const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
-    CPPUNIT_ASSERT(!sieveMesh.isNull());
-    const ALE::Obj<SieveMesh::label_sequence>& vertices =
-      sieveMesh->depthStratum(0);
-    CPPUNIT_ASSERT(!vertices.isNull());
-    const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
-    const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-    // Get section containing solution (disp + Lagrange multipliers)
-    const ALE::Obj<RealSection>& dispIncrSection =
-      fields.get("dispIncr(t->t+dt)").section();
-    CPPUNIT_ASSERT(!dispIncrSection.isNull());
-
-    // Get expected values
-    const double* valsE = _data->fieldIncrOpenE; // Expected values for dispIncr
-    int iVertex = 0; // variable to use as index into valsE array
-    const int fiberDimE = spaceDim; // number of values per point
-    const double tolerance = 1.0e-06;
-    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
-	 v_iter != verticesEnd;
-	 ++v_iter, ++iVertex) { // loop over all vertices in mesh
-      // Check fiber dimension (number of values at point)
-      const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
-      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
-      const double* vals = dispIncrSection->restrictPoint(*v_iter);
-      CPPUNIT_ASSERT(0 != vals);
-
-      // Check values at point
-      for (int i = 0; i < fiberDimE; ++i) {
-        const int index = iVertex * spaceDim + i;
-        const double valE = valsE[index];
-	std::cout << "valE: " << valE
-		  << ", val: " << vals[i]
-		  << std::endl;
-        if (fabs(valE) > tolerance)
-          CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
-        else
-          CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
-      } // for
-    } // for
-  } // Check solution values
-
-  { // Check slip values
-    // Slip values should be adjusted based on the change in the
-    // Lagrange multipliers as reflected in the slipOpenE data member.
-
-    // Get fault vertex info
-    const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
-    CPPUNIT_ASSERT(!faultSieveMesh.isNull());
-    SieveSubMesh::renumbering_type& renumbering =
-      faultSieveMesh->getRenumbering();
-    const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
-      faultSieveMesh->depthStratum(0);
-    CPPUNIT_ASSERT(!vertices.isNull());
-    const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
-    const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-    // Get section containing slip
-    const ALE::Obj<RealSection>& slipSection =
-      fault._fields->get("slip").section();
-    CPPUNIT_ASSERT(!slipSection.isNull());
-
-    // Get expected values
-    const double* valsE = _data->slipOpenE;
-    int iVertex = 0; // variable to use as index into valsE array
-    const int fiberDimE = spaceDim; // number of values per point
-    const double tolerance = 1.0e-06;
-    for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
-	   != verticesEnd;
-	 ++v_iter, ++iVertex) { // loop over fault vertices
-      // Check fiber dimension (number of values at point)
-      const int fiberDim = slipSection->getFiberDimension(*v_iter);
-      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
-      const double* vals = slipSection->restrictPoint(*v_iter);
-      CPPUNIT_ASSERT(0 != vals);
-
-      // Check values at point
-      for (int i = 0; i < fiberDimE; ++i) {
-        const int index = iVertex * spaceDim + i;
-        const double valE = valsE[index];
-	std::cout << "valE: " << valE
-		  << ", val: " << vals[i]
-		  << std::endl;
-        if (fabs(valE) > tolerance)
-          CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
-        else
-          CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
-      } // for
-    } // for
-  } // Check slip values
-
-} // testConstrainSolnSpaceOpen
-
-// ----------------------------------------------------------------------
-// Test updateStateVars().
-void
-pylith::faults::TestFaultCohesiveDynL::testUpdateStateVars(void)
-{ // testUpdateStateVars
-  // :TODO: Need to verify that fault constitutive updateStateVars is called.
-} // testUpdateStateVars
-
-// ----------------------------------------------------------------------
-// Test calcTractions().
-void
-pylith::faults::TestFaultCohesiveDynL::testCalcTractions(void)
-{ // testCalcTractions
-  CPPUNIT_ASSERT(0 != _data);
-
-  topology::Mesh mesh;
-  FaultCohesiveDynL fault;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &fault, &fields);
-  topology::Jacobian jacobian(fields, "seqdense");
-  _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrStick);
-  
-  CPPUNIT_ASSERT(0 != fault._faultMesh);
-  const int spaceDim = _data->spaceDim;
-  topology::Field<topology::SubMesh> tractions(*fault._faultMesh);
-  tractions.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
-  tractions.allocate();
-  tractions.zero();
-  const ALE::Obj<RealSection>& tractionsSection = tractions.section();
-  CPPUNIT_ASSERT(!tractionsSection.isNull());
-
-  const double t = 0;
-  fault.updateStateVars(t, &fields);
-  fault._calcTractions(&tractions, fields.get("disp(t)"));
-
-  //tractions.view("TRACTIONS"); // DEBUGGING
-
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
-  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& vertices =
-    faultSieveMesh->depthStratum(0);
-  CPPUNIT_ASSERT(!vertices.isNull());
-  const SieveSubMesh::label_sequence::iterator verticesBegin =
-    vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-  SieveSubMesh::renumbering_type& renumbering =
-    faultSieveMesh->getRenumbering();
-  const SieveMesh::renumbering_type::const_iterator renumberingBegin =
-    renumbering.begin();
-  const SieveMesh::renumbering_type::const_iterator renumberingEnd =
-    renumbering.end();
-
-  const ALE::Obj<RealSection>& dispSection = fields.get("disp(t)").section();
-  CPPUNIT_ASSERT(!dispSection.isNull());
-
-  int iVertex = 0;
-  const double tolerance = 1.0e-06;
-  for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
-       v_iter != verticesEnd;
-       ++v_iter, ++iVertex) {
-    SieveMesh::point_type meshVertex = -1;
-    bool found = false;
-
-    // Test with dbInitialTract
-    for (SieveMesh::renumbering_type::const_iterator r_iter = renumberingBegin;
-      r_iter != renumberingEnd;
-      ++r_iter) {
-      if (r_iter->second == *v_iter) {
-        meshVertex = r_iter->first;
-        found = true;
-        break;
-      } // if
-    } // for
-    CPPUNIT_ASSERT(found);
-    int fiberDim = tractionsSection->getFiberDimension(*v_iter);
-    CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
-    const double* tractionsVertex = tractionsSection->restrictPoint(*v_iter);
-    CPPUNIT_ASSERT(0 != tractionsVertex);
-
-    fiberDim = dispSection->getFiberDimension(meshVertex);
-    CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
-    const double* dispVertex = dispSection->restrictPoint(meshVertex);
-    CPPUNIT_ASSERT(0 != dispVertex);
-
-    const double scale = 1.0 / _data->area[iVertex];
-    for (int iDim=0; iDim < spaceDim; ++iDim) {
-      const double tractionE =
-        _data->initialTractions[iVertex*spaceDim+iDim] + 
-	dispVertex[iDim] * scale;
-      if (tractionE != 0.0)
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, tractionsVertex[iDim]/tractionE,
-             tolerance);
-      else
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(tractionE, tractionsVertex[iDim],
-             tolerance);
-    } // for
-  } // for
-
-  // Test without dbInitialTract
-  // :TODO: STUFF GOES HERE (Brad)
-} // testCalcTractions
-
-// ----------------------------------------------------------------------
-// Initialize FaultCohesiveDynL interface condition.
-void
-pylith::faults::TestFaultCohesiveDynL::_initialize(
-					topology::Mesh* const mesh,
-					FaultCohesiveDynL* const fault,
-					topology::SolutionFields* const fields)
-{ // _initialize
-  CPPUNIT_ASSERT(0 != mesh);
-  CPPUNIT_ASSERT(0 != fault);
-  CPPUNIT_ASSERT(0 != fields);
-  CPPUNIT_ASSERT(0 != _data);
-  CPPUNIT_ASSERT(0 != _quadrature);
-
-  meshio::MeshIOAscii iohandler;
-  iohandler.filename(_data->meshFilename);
-  iohandler.read(mesh);
-  
-  //mesh->debug(true); // DEBUGGING
-  
-  spatialdata::geocoords::CSCart cs;
-  spatialdata::units::Nondimensional normalizer;
-  cs.setSpaceDim(mesh->dimension());
-  cs.initialize();
-  mesh->coordsys(&cs);
-  mesh->nondimensionalize(normalizer);
-  
-  _quadrature->initialize(_data->basis, _data->numQuadPts, _data->numBasis,
-			  _data->basisDeriv,
-			  _data->numQuadPts, _data->numBasis, _data->cellDim,
-			  _data->quadPts, _data->numQuadPts, _data->cellDim,
-			  _data->quadWts, _data->numQuadPts,
-			  _data->spaceDim);
-  
-  // Setup initial tractions
-  spatialdata::spatialdb::SimpleDB* db =
-      new spatialdata::spatialdb::SimpleDB("initial tractions");
-  CPPUNIT_ASSERT(0 != db);
-  spatialdata::spatialdb::SimpleIOAscii ioInitialTract;
-  ioInitialTract.filename(_data->initialTractFilename);
-  db->ioHandler(&ioInitialTract);
-  delete _dbInitialTract; _dbInitialTract = db;
-  fault->dbInitialTract(db);
-
-  // Setup friction
-  spatialdata::spatialdb::SimpleDB* dbFriction =
-      new spatialdata::spatialdb::SimpleDB("static friction");
-  CPPUNIT_ASSERT(0 != dbFriction);
-  spatialdata::spatialdb::SimpleIOAscii ioFriction;
-  if (2 == _data->spaceDim)
-    ioFriction.filename("data/static_friction_2d.spatialdb");
-  else if (3 == _data->spaceDim)
-    ioFriction.filename("data/static_friction_3d.spatialdb");
-  dbFriction->ioHandler(&ioFriction);
-  delete _dbFriction; _dbFriction = dbFriction;
-  friction::StaticFriction* friction = new pylith::friction::StaticFriction();
-  CPPUNIT_ASSERT(0 != friction);
-  friction->label("static friction");
-  friction->dbProperties(dbFriction);
-  _friction = friction;
-  fault->frictionModel(friction);
-
-  int firstFaultVertex    = 0;
-  int firstLagrangeVertex = mesh->sieveMesh()->getIntSection(_data->label)->size();
-  int firstFaultCell      = mesh->sieveMesh()->getIntSection(_data->label)->size();
-  if (fault->useLagrangeConstraints())
-    firstFaultCell += mesh->sieveMesh()->getIntSection(_data->label)->size();
-  fault->id(_data->id);
-  fault->label(_data->label);
-  fault->quadrature(_quadrature);
-  
-  fault->adjustTopology(mesh, &firstFaultVertex, &firstLagrangeVertex,
-			&firstFaultCell, _flipFault);
-  
-  const double upDir[] = { 0.0, 0.0, 1.0 };
-  const double normalDir[] = { 1.0, 0.0, 0.0 };
-  
-  fault->initialize(*mesh, upDir, normalDir);
-  
-  // Setup fields
-  fields->add("disp(t)", "displacement");
-  fields->add("dispIncr(t->t+dt)", "displacement_increment");
-  fields->add("velocity(t)", "velocity");
-  fields->solutionName("dispIncr(t->t+dt)");
-  
-  const int spaceDim = _data->spaceDim;
-  topology::Field<topology::Mesh>& disp = fields->get("disp(t)");
-  disp.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
-  disp.allocate();
-  fields->copyLayout("disp(t)");
-} // _initialize
-
-// ----------------------------------------------------------------------
-// Set values for fields and Jacobian.
-void
-pylith::faults::TestFaultCohesiveDynL::_setFieldsJacobian(
-          topology::Mesh* const mesh,
-          FaultCohesiveDynL* const fault,
-          topology::SolutionFields* const fields,
-          topology::Jacobian* const jacobian,
-          const double* const fieldIncr)
-{ // _initialize
-  CPPUNIT_ASSERT(0 != mesh);
-  CPPUNIT_ASSERT(0 != fault);
-  CPPUNIT_ASSERT(0 != fields);
-  CPPUNIT_ASSERT(0 != jacobian);
-  CPPUNIT_ASSERT(0 != _data);
-  CPPUNIT_ASSERT(0 != fieldIncr);
-
-  const int spaceDim = _data->spaceDim;
-
-  // Get vertices in mesh
-  const ALE::Obj<SieveMesh>& sieveMesh = mesh->sieveMesh();
-  CPPUNIT_ASSERT(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& vertices =
-    sieveMesh->depthStratum(0);
-  CPPUNIT_ASSERT(!vertices.isNull());
-  const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
-  const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-
-  // Set displacement values
-  const ALE::Obj<RealSection>& dispSection =
-    fields->get("disp(t)").section();
-  CPPUNIT_ASSERT(!dispSection.isNull());
-  int iVertex = 0;
-  for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
-       v_iter != verticesEnd;
-       ++v_iter, ++iVertex)
-    dispSection->updatePoint(*v_iter, &_data->fieldT[iVertex*spaceDim]);
-
-  // Set increment values
-  const ALE::Obj<RealSection>& dispIncrSection =
-    fields->get("dispIncr(t->t+dt)").section();
-  CPPUNIT_ASSERT(!dispIncrSection.isNull());
-  iVertex = 0;
-  for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
-       v_iter != verticesEnd;
-       ++v_iter, ++iVertex)
-    dispIncrSection->updatePoint(*v_iter, &fieldIncr[iVertex*spaceDim]);
-
-  // Setup Jacobian matrix
-  const int nrows = dispIncrSection->sizeWithBC();
-  const int ncols = nrows;
-  int nrowsM = 0;
-  int ncolsM = 0;
-  PetscMat jacobianMat = jacobian->matrix();
-  MatGetSize(jacobianMat, &nrowsM, &ncolsM);
-  CPPUNIT_ASSERT_EQUAL(nrows, nrowsM);
-  CPPUNIT_ASSERT_EQUAL(ncols, ncolsM);
-
-  int_array rows(nrows);
-  int_array cols(ncols);
-  for (int iRow=0; iRow < nrows; ++iRow)
-    rows[iRow] = iRow;
-  for (int iCol=0; iCol < ncols; ++iCol)
-    cols[iCol] = iCol;
-  MatSetValues(jacobianMat, nrows, &rows[0], ncols, &cols[0], _data->jacobian, INSERT_VALUES);
-  jacobian->assemble("final_assembly");
-
-  // Set Jacobian diagonal
-  fields->add("Jacobian diagonal", "jacobian_diagonal");
-  topology::Field<topology::Mesh>& jacobianDiag =
-    fields->get("Jacobian diagonal");
-  const topology::Field<topology::Mesh>& disp =
-    fields->get("disp(t)");
-  jacobianDiag.cloneSection(disp);
-  jacobianDiag.createVector();
-  jacobianDiag.createScatter();
-  MatGetDiagonal(jacobian->matrix(), jacobianDiag.vector());
-  jacobianDiag.scatterVectorToSection();
-} // _setFieldsJacobian
-
-// ----------------------------------------------------------------------
-// Determine if vertex is a Lagrange multiplier constraint vertex.
-bool
-pylith::faults::TestFaultCohesiveDynL::_isConstraintVertex(const int vertex) const
-{ // _isConstraintVertex
-  assert(0 != _data);
-
-  const int numConstraintVert = _data->numConstraintVert;
-  bool isFound = false;
-  for (int i=0; i < _data->numConstraintVert; ++i)
-    if (_data->constraintVertices[i] == vertex) {
-      isFound = true;
-      break;
-    } // if
-  return isFound;
-} // _isConstraintVertex
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,155 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/faults/TestFaultCohesiveDynL.hh
- *
- * @brief C++ TestFaultCohesiveDynL object
- *
- * C++ unit testing for FaultCohesiveDynL.
- */
-
-#if !defined(pylith_faults_testfaultcohesivedynl_hh)
-#define pylith_faults_testfaultcohesivedynl_hh
-
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "pylith/faults/faultsfwd.hh" // forward declarations
-#include "pylith/topology/topologyfwd.hh" // USES Mesh, SubMesh
-#include "pylith/feassemble/feassemblefwd.hh" // HOLDSA Quadrature
-#include "pylith/friction/frictionfwd.hh" // HOLDSA FrictionModel
-#include "spatialdata/spatialdb/spatialdbfwd.hh" // HOLDSA SpatialDB
-#include <vector> // HASA std::vector
-/// Namespace for pylith package
-namespace pylith {
-  namespace faults {
-    class TestFaultCohesiveDynL;
-
-    class CohesiveDynLData;
-  } // faults
-} // pylith
-
-/// C++ unit testing for FaultCohesiveDynL
-class pylith::faults::TestFaultCohesiveDynL: public CppUnit::TestFixture
-{ // class TestFaultCohesiveDynL
-
-  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
-  CPPUNIT_TEST_SUITE( TestFaultCohesiveDynL );
-
-  CPPUNIT_TEST( testConstructor );
-  CPPUNIT_TEST( testNeedJacobianDiag );
-  CPPUNIT_TEST( testNeedVelocity );
-  CPPUNIT_TEST( testDBInitialTract );
-
-  // Tests in derived classes:
-  // testInitialize()
-  // testConstrainSolnSpaceStick()
-  // testConstrainSolnSpaceSlip()
-  // testConstrainSolnSpaceOpen()
-  // testUpdateStateVars()
-  // testCalcTractions()
-
-  CPPUNIT_TEST_SUITE_END();
-
-  // PROTECTED MEMBERS //////////////////////////////////////////////////
-protected:
-
-  CohesiveDynLData* _data; ///< Data for testing
-  feassemble::Quadrature<topology::SubMesh>* _quadrature; ///< Fault quad.
-  spatialdata::spatialdb::SpatialDB* _dbInitialTract; ///< Initial tractions.
-  friction::FrictionModel* _friction; ///< Friction model
-  spatialdata::spatialdb::SpatialDB* _dbFriction; ///< Friction parameters.
-  bool _flipFault; ///< If true, flip fault orientation.
-
-  // PUBLIC METHODS /////////////////////////////////////////////////////
-public:
-
-  /// Setup testing data.
-  void setUp(void);
-
-  /// Tear down testing data.
-  void tearDown(void);
-
-  /// Test constructor.
-  void testConstructor(void);
-
-  /// Test needJacobianDiag().
-  void testNeedJacobianDiag(void);
-
-  /// Test needVelocity().
-  void testNeedVelocity(void);
-
-  /// Test dbInitialTract().
-  void testDBInitialTract(void);
-
-  /// Test initialize().
-  void testInitialize(void);
-
-  /// Test constrainSolnSpace() for sticking case.
-  void testConstrainSolnSpaceStick(void);
-
-  /// Test constrainSolnSpace() for slipping case.
-  void testConstrainSolnSpaceSlip(void);
-
-  /// Test constrainSolnSpace for fault opening case().
-  void testConstrainSolnSpaceOpen(void);
-
-  /// Test updateStateVars().
-  void testUpdateStateVars(void);
-
-  /// Test _calcTractions().
-  void testCalcTractions(void);
-
-  // PRIVATE METHODS ////////////////////////////////////////////////////
-private:
-
-  /** Initialize FaultCohesiveDynL interface condition.
-   *
-   * @param mesh PETSc mesh to initialize
-   * @param fault Cohesive fault interface condition to initialize.
-   * @param fields Solution fields.
-   */
-  void _initialize(topology::Mesh* const mesh,
-      FaultCohesiveDynL* const fault,
-      topology::SolutionFields* const fields);
-
-  /** Set values for fields and Jacobian.
-   *
-   * @pre Must call _initialize() before _setFieldsJacobian to set solution
-   * field. Note: Call to Jacobian constructor should be after call to
-   * _initialize() so that the solution field is setup.
-   *
-   * @param mesh PETSc mesh to initialize
-   * @param fault Cohesive fault interface condition to initialize.
-   * @param fields Solution fields.
-   * @param jacobian Jacobian sparse matrix.
-   * @param fieldIncrVals Values for solution increment field.
-   */
-  void _setFieldsJacobian(topology::Mesh* const mesh,
-      FaultCohesiveDynL* const fault,
-      topology::SolutionFields* const fields,
-      topology::Jacobian* const jacobian,
-      const double* const fieldIncrVals);
-
-  /** Determine if vertex is a Lagrange multiplier constraint vertex.
-   *
-   * @param vertex Label of vertex.
-   *
-   * @returns True if vertex is a constraint vertex, false otherwise.
-   */
-  bool _isConstraintVertex(const int vertex) const;
-
-}; // class TestFaultCohesiveDynL
-
-#endif // pylith_faults_testfaultcohesivedynl_hh
-
-// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,42 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFaultCohesiveDynLHex8.hh" // Implementation of class methods
-
-#include "data/CohesiveDynLDataHex8.hh" // USES CohesiveDynLDataHex8
-
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
-#include "pylith/feassemble/GeometryQuad3D.hh" // USES GeometryQuad3D
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynLHex8 );
-
-// ----------------------------------------------------------------------
-// Setup testing data.
-void
-pylith::faults::TestFaultCohesiveDynLHex8::setUp(void)
-{ // setUp
-  TestFaultCohesiveDynL::setUp();
-  _data = new CohesiveDynLDataHex8();
-
-  CPPUNIT_ASSERT(0 != _quadrature);
-  feassemble::GeometryQuad3D geometry;
-  _quadrature->refGeometry(&geometry);
-  
-  _flipFault = true;
-} // setUp
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,60 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh
- *
- * @brief C++ TestFaultCohesiveDynLHex8 object.
- *
- * C++ unit testing for FaultCohesiveDynL for mesh with 3-D quadrilateral cells.
- */
-
-#if !defined(pylith_faults_testfaultcohesivedynlhex8_hh)
-#define pylith_faults_testfaultcohesivedynlhex8_hh
-
-#include "TestFaultCohesiveDynL.hh" // ISA TestFaultCohesiveDynL
-
-/// Namespace for pylith package
-namespace pylith {
-  namespace faults {
-    class TestFaultCohesiveDynLHex8;
-  } // bc
-} // pylith
-
-/// C++ unit testing for FaultCohesiveDynL for mesh with 3-D quadrilateral cells.
-class pylith::faults::TestFaultCohesiveDynLHex8 : public TestFaultCohesiveDynL
-{ // class TestFaultCohesiveDynLHex8
-
-  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
-  CPPUNIT_TEST_SUITE( TestFaultCohesiveDynLHex8 );
-
-  CPPUNIT_TEST( testInitialize );
-  CPPUNIT_TEST( testConstrainSolnSpaceStick );
-  CPPUNIT_TEST( testConstrainSolnSpaceSlip );
-  CPPUNIT_TEST( testConstrainSolnSpaceOpen );
-  CPPUNIT_TEST( testUpdateStateVars );
-  CPPUNIT_TEST( testCalcTractions );
-
-  CPPUNIT_TEST_SUITE_END();
-
-  // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
-  /// Setup testing data.
-  void setUp(void);
-
-}; // class TestFaultCohesiveDynLHex8
-
-#endif // pylith_faults_testfaultcohesivedynlhex8_hh
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,42 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFaultCohesiveDynLQuad4.hh" // Implementation of class methods
-
-#include "data/CohesiveDynLDataQuad4.hh" // USES CohesiveDynLDataQuad4
-
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
-#include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynLQuad4 );
-
-// ----------------------------------------------------------------------
-// Setup testing data.
-void
-pylith::faults::TestFaultCohesiveDynLQuad4::setUp(void)
-{ // setUp
-  TestFaultCohesiveDynL::setUp();
-  _data = new CohesiveDynLDataQuad4();
-
-  CPPUNIT_ASSERT(0 != _quadrature);
-  feassemble::GeometryLine2D geometry;
-  _quadrature->refGeometry(&geometry);
-  
-  _flipFault = true;
-} // setUp
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,60 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh
- *
- * @brief C++ TestFaultCohesiveDynLQuad4 object.
- *
- * C++ unit testing for FaultCohesiveDynL for mesh with 2-D quadrilateral cells.
- */
-
-#if !defined(pylith_faults_testfaultcohesivedynlquad4_hh)
-#define pylith_faults_testfaultcohesivedynlquad4_hh
-
-#include "TestFaultCohesiveDynL.hh" // ISA TestFaultCohesiveDynL
-
-/// Namespace for pylith package
-namespace pylith {
-  namespace faults {
-    class TestFaultCohesiveDynLQuad4;
-  } // bc
-} // pylith
-
-/// C++ unit testing for FaultCohesiveDynL for mesh with 2-D quadrilateral cells.
-class pylith::faults::TestFaultCohesiveDynLQuad4 : public TestFaultCohesiveDynL
-{ // class TestFaultCohesiveDynLQuad4
-
-  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
-  CPPUNIT_TEST_SUITE( TestFaultCohesiveDynLQuad4 );
-
-  CPPUNIT_TEST( testInitialize );
-  CPPUNIT_TEST( testConstrainSolnSpaceStick );
-  CPPUNIT_TEST( testConstrainSolnSpaceSlip );
-  CPPUNIT_TEST( testConstrainSolnSpaceOpen );
-  CPPUNIT_TEST( testUpdateStateVars );
-  CPPUNIT_TEST( testCalcTractions );
-
-  CPPUNIT_TEST_SUITE_END();
-
-  // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
-  /// Setup testing data.
-  void setUp(void);
-
-}; // class TestFaultCohesiveDynLQuad4
-
-#endif // pylith_faults_testfaultcohesivedynlquad4_hh
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,42 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFaultCohesiveDynLTet4.hh" // Implementation of class methods
-
-#include "data/CohesiveDynLDataTet4.hh" // USES CohesiveDynLDataTet4
-
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
-#include "pylith/feassemble/GeometryTri3D.hh" // USES GeometryTri3D
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynLTet4 );
-
-// ----------------------------------------------------------------------
-// Setup testing data.
-void
-pylith::faults::TestFaultCohesiveDynLTet4::setUp(void)
-{ // setUp
-  TestFaultCohesiveDynL::setUp();
-  _data = new CohesiveDynLDataTet4();
-
-  CPPUNIT_ASSERT(0 != _quadrature);
-  feassemble::GeometryTri3D geometry;
-  _quadrature->refGeometry(&geometry);
-  
-  _flipFault = true;
-} // setUp
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,60 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh
- *
- * @brief C++ TestFaultCohesiveDynLTet4 object.
- *
- * C++ unit testing for FaultCohesiveDynL for mesh with 2-D quadrilateral cells.
- */
-
-#if !defined(pylith_faults_testfaultcohesivedynltet4_hh)
-#define pylith_faults_testfaultcohesivedynltet4_hh
-
-#include "TestFaultCohesiveDynL.hh" // ISA TestFaultCohesiveDynL
-
-/// Namespace for pylith package
-namespace pylith {
-  namespace faults {
-    class TestFaultCohesiveDynLTet4;
-  } // bc
-} // pylith
-
-/// C++ unit testing for FaultCohesiveDynL for mesh with 2-D quadrilateral cells.
-class pylith::faults::TestFaultCohesiveDynLTet4 : public TestFaultCohesiveDynL
-{ // class TestFaultCohesiveDynLTet4
-
-  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
-  CPPUNIT_TEST_SUITE( TestFaultCohesiveDynLTet4 );
-
-  CPPUNIT_TEST( testInitialize );
-  CPPUNIT_TEST( testConstrainSolnSpaceStick );
-  CPPUNIT_TEST( testConstrainSolnSpaceSlip );
-  CPPUNIT_TEST( testConstrainSolnSpaceOpen );
-  CPPUNIT_TEST( testUpdateStateVars );
-  CPPUNIT_TEST( testCalcTractions );
-
-  CPPUNIT_TEST_SUITE_END();
-
-  // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
-  /// Setup testing data.
-  void setUp(void);
-
-}; // class TestFaultCohesiveDynLTet4
-
-#endif // pylith_faults_testfaultcohesivedynltet4_hh
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,42 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFaultCohesiveDynLTri3.hh" // Implementation of class methods
-
-#include "data/CohesiveDynLDataTri3.hh" // USES CohesiveDynLDataTri3
-
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
-#include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynLTri3 );
-
-// ----------------------------------------------------------------------
-// Setup testing data.
-void
-pylith::faults::TestFaultCohesiveDynLTri3::setUp(void)
-{ // setUp
-  TestFaultCohesiveDynL::setUp();
-  _data = new CohesiveDynLDataTri3();
-
-  CPPUNIT_ASSERT(0 != _quadrature);
-  feassemble::GeometryLine2D geometry;
-  _quadrature->refGeometry(&geometry);
-  
-  _flipFault = true;
-} // setUp
-
-
-// End of file 

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,60 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh
- *
- * @brief C++ TestFaultCohesiveDynLTri3 object.
- *
- * C++ unit testing for FaultCohesiveDynL for mesh with 2-D triangular cells.
- */
-
-#if !defined(pylith_faults_testfaultcohesivedynltri3_hh)
-#define pylith_faults_testfaultcohesivedynltri3_hh
-
-#include "TestFaultCohesiveDynL.hh" // ISA TestFaultCohesiveDynL
-
-/// Namespace for pylith package
-namespace pylith {
-  namespace faults {
-    class TestFaultCohesiveDynLTri3;
-  } // bc
-} // pylith
-
-/// C++ unit testing for FaultCohesiveDynL for mesh with 2-D triangular cells.
-class pylith::faults::TestFaultCohesiveDynLTri3 : public TestFaultCohesiveDynL
-{ // class TestFaultCohesiveDynLTri3
-
-  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
-  CPPUNIT_TEST_SUITE( TestFaultCohesiveDynLTri3 );
-
-  CPPUNIT_TEST( testInitialize );
-  CPPUNIT_TEST( testConstrainSolnSpaceStick );
-  CPPUNIT_TEST( testConstrainSolnSpaceSlip );
-  CPPUNIT_TEST( testConstrainSolnSpaceOpen );
-  CPPUNIT_TEST( testUpdateStateVars );
-  CPPUNIT_TEST( testCalcTractions );
-
-  CPPUNIT_TEST_SUITE_END();
-
-  // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
-  /// Setup testing data.
-  void setUp(void);
-
-}; // class TestFaultCohesiveDynLTri3
-
-#endif // pylith_faults_testfaultcohesivedynltri3_hh
-
-
-// End of file 

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultCohesiveDynQuad4.hh" // Implementation of class methods
+
+#include "data/CohesiveDynDataQuad4.hh" // USES CohesiveDynDataQuad4
+
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
+#include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynQuad4 );
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::faults::TestFaultCohesiveDynQuad4::setUp(void)
+{ // setUp
+  TestFaultCohesiveDyn::setUp();
+  _data = new CohesiveDynDataQuad4();
+
+  CPPUNIT_ASSERT(0 != _quadrature);
+  feassemble::GeometryLine2D geometry;
+  _quadrature->refGeometry(&geometry);
+  
+  _flipFault = true;
+} // setUp
+
+
+// End of file 

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultCohesiveDynQuad4.hh
+ *
+ * @brief C++ TestFaultCohesiveDynQuad4 object.
+ *
+ * C++ unit testing for FaultCohesiveDyn for mesh with 2-D quadrilateral cells.
+ */
+
+#if !defined(pylith_faults_testfaultcohesivedynquad4_hh)
+#define pylith_faults_testfaultcohesivedynquad4_hh
+
+#include "TestFaultCohesiveDyn.hh" // ISA TestFaultCohesiveDyn
+
+/// Namespace for pylith package
+namespace pylith {
+  namespace faults {
+    class TestFaultCohesiveDynQuad4;
+  } // bc
+} // pylith
+
+/// C++ unit testing for FaultCohesiveDyn for mesh with 2-D quadrilateral cells.
+class pylith::faults::TestFaultCohesiveDynQuad4 : public TestFaultCohesiveDyn
+{ // class TestFaultCohesiveDynQuad4
+
+  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+  CPPUNIT_TEST_SUITE( TestFaultCohesiveDynQuad4 );
+
+  CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testConstrainSolnSpaceStick );
+  CPPUNIT_TEST( testConstrainSolnSpaceSlip );
+  CPPUNIT_TEST( testConstrainSolnSpaceOpen );
+  CPPUNIT_TEST( testUpdateStateVars );
+  CPPUNIT_TEST( testCalcTractions );
+
+  CPPUNIT_TEST_SUITE_END();
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /// Setup testing data.
+  void setUp(void);
+
+}; // class TestFaultCohesiveDynQuad4
+
+#endif // pylith_faults_testfaultcohesivedynquad4_hh
+
+
+// End of file 

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultCohesiveDynTet4.hh" // Implementation of class methods
+
+#include "data/CohesiveDynDataTet4.hh" // USES CohesiveDynDataTet4
+
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
+#include "pylith/feassemble/GeometryTri3D.hh" // USES GeometryTri3D
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynTet4 );
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::faults::TestFaultCohesiveDynTet4::setUp(void)
+{ // setUp
+  TestFaultCohesiveDyn::setUp();
+  _data = new CohesiveDynDataTet4();
+
+  CPPUNIT_ASSERT(0 != _quadrature);
+  feassemble::GeometryTri3D geometry;
+  _quadrature->refGeometry(&geometry);
+  
+  _flipFault = true;
+} // setUp
+
+
+// End of file 

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultCohesiveDynTet4.hh
+ *
+ * @brief C++ TestFaultCohesiveDynTet4 object.
+ *
+ * C++ unit testing for FaultCohesiveDyn for mesh with 2-D quadrilateral cells.
+ */
+
+#if !defined(pylith_faults_testfaultcohesivedyntet4_hh)
+#define pylith_faults_testfaultcohesivedyntet4_hh
+
+#include "TestFaultCohesiveDyn.hh" // ISA TestFaultCohesiveDyn
+
+/// Namespace for pylith package
+namespace pylith {
+  namespace faults {
+    class TestFaultCohesiveDynTet4;
+  } // bc
+} // pylith
+
+/// C++ unit testing for FaultCohesiveDyn for mesh with 2-D quadrilateral cells.
+class pylith::faults::TestFaultCohesiveDynTet4 : public TestFaultCohesiveDyn
+{ // class TestFaultCohesiveDynTet4
+
+  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+  CPPUNIT_TEST_SUITE( TestFaultCohesiveDynTet4 );
+
+  CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testConstrainSolnSpaceStick );
+  CPPUNIT_TEST( testConstrainSolnSpaceSlip );
+  CPPUNIT_TEST( testConstrainSolnSpaceOpen );
+  CPPUNIT_TEST( testUpdateStateVars );
+  CPPUNIT_TEST( testCalcTractions );
+
+  CPPUNIT_TEST_SUITE_END();
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /// Setup testing data.
+  void setUp(void);
+
+}; // class TestFaultCohesiveDynTet4
+
+#endif // pylith_faults_testfaultcohesivedyntet4_hh
+
+
+// End of file 

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultCohesiveDynTri3.hh" // Implementation of class methods
+
+#include "data/CohesiveDynDataTri3.hh" // USES CohesiveDynDataTri3
+
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
+#include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynTri3 );
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::faults::TestFaultCohesiveDynTri3::setUp(void)
+{ // setUp
+  TestFaultCohesiveDyn::setUp();
+  _data = new CohesiveDynDataTri3();
+
+  CPPUNIT_ASSERT(0 != _quadrature);
+  feassemble::GeometryLine2D geometry;
+  _quadrature->refGeometry(&geometry);
+  
+  _flipFault = true;
+} // setUp
+
+
+// End of file 

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultCohesiveDynTri3.hh
+ *
+ * @brief C++ TestFaultCohesiveDynTri3 object.
+ *
+ * C++ unit testing for FaultCohesiveDyn for mesh with 2-D triangular cells.
+ */
+
+#if !defined(pylith_faults_testfaultcohesivedyntri3_hh)
+#define pylith_faults_testfaultcohesivedyntri3_hh
+
+#include "TestFaultCohesiveDyn.hh" // ISA TestFaultCohesiveDyn
+
+/// Namespace for pylith package
+namespace pylith {
+  namespace faults {
+    class TestFaultCohesiveDynTri3;
+  } // bc
+} // pylith
+
+/// C++ unit testing for FaultCohesiveDyn for mesh with 2-D triangular cells.
+class pylith::faults::TestFaultCohesiveDynTri3 : public TestFaultCohesiveDyn
+{ // class TestFaultCohesiveDynTri3
+
+  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+  CPPUNIT_TEST_SUITE( TestFaultCohesiveDynTri3 );
+
+  CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testConstrainSolnSpaceStick );
+  CPPUNIT_TEST( testConstrainSolnSpaceSlip );
+  CPPUNIT_TEST( testConstrainSolnSpaceOpen );
+  CPPUNIT_TEST( testUpdateStateVars );
+  CPPUNIT_TEST( testCalcTractions );
+
+  CPPUNIT_TEST_SUITE_END();
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /// Setup testing data.
+  void setUp(void);
+
+}; // class TestFaultCohesiveDynTri3
+
+#endif // pylith_faults_testfaultcohesivedyntri3_hh
+
+
+// End of file 

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,55 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#include "CohesiveDynData.hh"
+
+// ----------------------------------------------------------------------
+// Constructor
+pylith::faults::CohesiveDynData::CohesiveDynData(void) :
+  meshFilename(0),
+  spaceDim(0),
+  cellDim(0),
+  numBasis(0),
+  numQuadPts(0),
+  quadPts(0),
+  quadWts(0),
+  basis(0),
+  basisDeriv(0),
+  verticesRef(0),
+  id(0),
+  label(0),
+  initialTractFilename(0),
+  fieldT(0),
+  fieldIncrStick(0),
+  fieldIncrSlip(0),
+  fieldIncrOpen(0),
+  jacobian(0),
+  orientation(0),
+  initialTractions(0),
+  area(0),
+  fieldIncrSlipE(0),
+  slipSlipE(0),
+  fieldIncrOpenE(0),
+  slipOpenE(0),
+  constraintVertices(0),
+  numConstraintVert(0)
+{ // constructor
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor
+pylith::faults::CohesiveDynData::~CohesiveDynData(void)
+{ // destructor
+} // destructor
+
+
+// End of file

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,86 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_faults_cohesivedynldata_hh)
+#define pylith_faults_cohesivedynldata_hh
+
+namespace pylith {
+  namespace faults {
+     class CohesiveDynData;
+  } // pylith
+} // faults
+
+class pylith::faults::CohesiveDynData
+{
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public :
+  
+  /// Constructor
+  CohesiveDynData(void);
+
+  /// Destructor
+  ~CohesiveDynData(void);
+
+// PUBLIC MEMBERS ///////////////////////////////////////////////////////
+public:
+
+  char* meshFilename; ///< Filename for input mesh
+
+  /// @name Quadrature information
+  //@{
+  int spaceDim; ///< Number of dimensions in vertex coordinates
+  int cellDim; ///< Number of dimensions associated with cell
+  int numBasis; ///< Number of vertices in cell
+  int numQuadPts; ///< Number of quadrature points
+  double* quadPts; ///< Coordinates of quad pts in ref cell
+  double* quadWts; ///< Weights of quadrature points
+  double* basis; ///< Basis fns at quadrature points
+  double* basisDeriv; ///< Derivatives of basis fns at quad pts
+  double* verticesRef; ///< Coordinates of vertices in ref cell (dual basis)
+  //@}
+
+  /// @name Fault information
+  //@{
+  int id; ///< Fault material identifier
+  char* label; ///< Label for fault
+  char* initialTractFilename; ///< Name of db for initial tractions.
+  //@}
+
+  /// @name Input fields
+  //@{
+  double* fieldT; ///< Solution field at time t.
+  double* fieldIncrStick; ///< Soln increment field at time t for stick case.
+  double* fieldIncrSlip; ///< Soln increment field at time t for slipping case.
+  double* fieldIncrOpen; ///< Soln increment field at time t for opening case.
+  double* jacobian; ///< Jacobian sparse matrix.
+  //@}
+
+  /// @name Calculated values.
+  //@{
+  double* orientation; ///< Expected values for fault orientation.
+  double* area; ///< Expected values for fault area.
+  double* initialTractions; ///< Expected values for initial tractions.
+  double* fieldIncrSlipE; ///< Expected values for solution increment for slipping case.
+  double* slipSlipE; ///< Expected values for slip for slipping case.
+  double* fieldIncrOpenE; ///< Expected values for solution increment for opening case.
+  double* slipOpenE; ///< Expected values for slip for opening case.
+
+  int* constraintVertices; ///< Expected points for constraint vertices
+  int numConstraintVert; ///< Number of constraint vertices
+  //@}
+
+};
+
+#endif // pylith_faults_cohesivedynldata_hh
+
+// End of file

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,1546 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+
+/* Original mesh
+ *
+ * Cells are 0-1 and vertices are 2-13.
+ *
+ *       2,3,4,5 -------- 6,7,8,9 -------- 10,11,12,13
+ *
+ *                        ^^^^^^^ Vertices forming fault
+ *
+ * After adding cohesive elements
+ *
+ * Cells are 0-1,16 and vertices are 4-15.
+ *
+ *       2,3,4,5 -------- 6,7,8,9 -- 14,15,16,17 -------- 10,11,12,13
+ *                                    18,19,20,21
+ *                        ^^^^^^^^^^^^^^^^^^^^^^ Cohesive element
+ *
+ */
+
+#include "CohesiveDynDataHex8.hh"
+
+const char* pylith::faults::CohesiveDynDataHex8::_meshFilename =
+  "data/hex8.mesh";
+
+const int pylith::faults::CohesiveDynDataHex8::_spaceDim = 3;
+
+const int pylith::faults::CohesiveDynDataHex8::_cellDim = 2;
+
+const int pylith::faults::CohesiveDynDataHex8::_numBasis = 4;
+
+const int pylith::faults::CohesiveDynDataHex8::_numQuadPts = 4;
+
+const double pylith::faults::CohesiveDynDataHex8::_quadPts[] = {
+  -0.57735027, -0.57735027,
+  +0.57735027, -0.57735027,
+  +0.57735027, +0.57735027,
+  -0.57735027, +0.57735027,
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_quadWts[] = {
+  1.0, 1.0, 1.0, 1.0
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_basis[] = {
+  0.62200847,  0.16666667,  0.16666667,  0.0446582,
+  0.16666667,  0.62200847,  0.0446582,   0.16666667,
+  0.16666667,  0.0446582,   0.62200847,  0.16666667,
+  0.0446582,   0.16666667,  0.16666667,  0.62200847,
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_basisDeriv[] = {
+  -0.39433757, -0.39433757,
+  +0.39433757, -0.10566243,
+  +0.10566243, +0.10566243,
+  -0.10566243, +0.39433757,
+
+  -0.39433757, -0.10566243,
+  +0.39433757, -0.39433757,
+  +0.10566243, +0.39433757,
+  -0.10566243, +0.10566243,
+
+  -0.10566243, -0.10566243,
+  +0.10566243, -0.39433757,
+  +0.39433757, +0.39433757,
+  -0.39433757, +0.10566243,
+
+  -0.10566243, -0.39433757,
+  +0.10566243, -0.10566243,
+  +0.39433757, +0.10566243,
+  -0.39433757, +0.39433757,
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_verticesRef[] = {
+  -1.0, -1.0,
+  +1.0, -1.0,
+  +1.0, +1.0,
+  -1.0, +1.0
+};
+
+const int pylith::faults::CohesiveDynDataHex8::_id = 10;
+
+const char* pylith::faults::CohesiveDynDataHex8::_label = "fault";
+
+const char* pylith::faults::CohesiveDynDataHex8::_initialTractFilename = 
+  "data/hex8_initialtract.spatialdb";
+
+const double pylith::faults::CohesiveDynDataHex8::_fieldT[] = {
+  4.1, 6.1, 8.1,
+  4.2, 6.2, 8.2,
+  4.3, 6.3, 8.3,
+  4.4, 6.4, 8.4,
+  4.5, 6.5, 8.5, // 6
+  4.6, 6.6, 8.6, // 7
+  4.7, 6.7, 8.7, // 8
+  4.8, 6.8, 8.8, // 9
+  4.9, 6.9, 8.9,
+  4.0, 6.0, 8.0,
+  5.1, 7.1, 9.1,
+  5.2, 7.2, 9.2,
+  5.3, 7.3, 9.3, // 14
+  5.5, 7.5, 9.5, // 15
+  5.7, 7.7, 9.7, // 16
+  5.9, 7.9, 9.9, // 17
+  5.4, 7.4, 9.4, // 18
+  5.6, 7.6, 9.6, // 19
+  5.8, 7.8, 9.8, // 20
+  5.0, 7.0, 9.0, // 21
+};
+
+// :TODO: Make sensible values for Jacobian for DOF on positive and
+// negative sides of the fault. Add semi-random values for other DOF.
+const double pylith::faults::CohesiveDynDataHex8::_jacobian[] = {
+    1,  0.1,  0.2,
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,    1,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,    2,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+    3,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,    4,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,    5,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+    6,    1,  6.1,
+  6.2,  6.3,  6.4,
+  6.5,  6.6,  6.7,
+  6.8,  6.9,    7,
+  7.1,  7.2,  7.3,
+  7.4,  7.5,  7.6,
+  7.7,  7.8,  7.9,
+    8,  8.1,  8.2,
+  8.3,  8.4,  8.5,
+  8.6,  8.7,  8.8,
+  8.9,    9,  9.1,
+  9.2,  9.3,  9.4,
+  9.5,  9.6,  9.7,
+  9.8,  9.9,   10,
+ 10.1, 10.2, 10.3,
+ 10.4, 10.5, 10.6,
+ 10.7, 10.8, 10.9,
+   11, 11.1, 11.2,
+ 11.3, 11.4, 11.5,
+ 11.6, 11.7, 11.8,
+ 11.9,   12,    1,
+ 12.1, 12.2, 12.3,
+ 12.4, 12.5, 12.6,
+ 12.7, 12.8, 12.9,
+   13, 13.1, 13.2,
+ 13.3, 13.4, 13.5,
+ 13.6, 13.7, 13.8,
+ 13.9,   14, 14.1,
+ 14.2, 14.3, 14.4,
+ 14.5, 14.6, 14.7,
+ 14.8, 14.9,   15,
+ 15.1, 15.2, 15.3,
+ 15.4, 15.5, 15.6,
+ 15.7, 15.8, 15.9,
+   16, 16.1, 16.2,
+ 16.3, 16.4, 16.5,
+ 16.6, 16.7, 16.8,
+ 16.9,   17, 17.1,
+ 17.2, 17.3, 17.4,
+ 17.5, 17.6, 17.7,
+ 17.8, 17.9,   18,
+    1, 18.1, 18.2,
+ 18.3, 18.4, 18.5,
+ 18.6, 18.7, 18.8,
+ 18.9,   19, 19.1,
+ 19.2, 19.3, 19.4,
+ 19.5, 19.6, 19.7,
+ 19.8, 19.9,   20,
+ 20.1, 20.2, 20.3,
+ 20.4, 20.5, 20.6,
+ 20.7, 20.8, 20.9,
+   21, 21.1, 21.2,
+ 21.3, 21.4, 21.5,
+ 21.6, 21.7, 21.8,
+ 21.9,   22, 22.1,
+ 22.2, 22.3, 22.4,
+ 22.5, 22.6, 22.7,
+ 22.8, 22.9,   23,
+ 23.1, 23.2, 23.3,
+ 23.4, 23.5, 23.6,
+ 23.7, 23.8, 23.9,
+   24,    1, 24.1,
+ 24.2, 24.3, 24.4,
+ 24.5, 24.6, 24.7,
+ 24.8, 24.9,   25,
+ 25.1, 25.2, 25.3,
+ 25.4, 25.5, 25.6,
+ 25.7, 25.8, 25.9,
+   26, 26.1, 26.2,
+ 26.3, 26.4, 26.5,
+ 26.6, 26.7, 26.8,
+ 26.9,   27, 27.1,
+ 27.2, 27.3, 27.4,
+ 27.5, 27.6, 27.7,
+ 27.8, 27.9,   28,
+ 28.1, 28.2, 28.3,
+ 28.4, 28.5, 28.6,
+ 28.7, 28.8, 28.9,
+   29, 29.1, 29.2,
+ 29.3, 29.4, 29.5,
+ 29.6, 29.7, 29.8,
+ 29.9,   30,    1,
+ 30.1, 30.2, 30.3,
+ 30.4, 30.5, 30.6,
+ 30.7, 30.8, 30.9,
+   31, 31.1, 31.2,
+ 31.3, 31.4, 31.5,
+ 31.6, 31.7, 31.8,
+ 31.9,   32, 32.1,
+ 32.2, 32.3, 32.4,
+ 32.5, 32.6, 32.7,
+ 32.8, 32.9,   33,
+ 33.1, 33.2, 33.3,
+ 33.4, 33.5, 33.6,
+ 33.7, 33.8, 33.9,
+   34, 34.1, 34.2,
+ 34.3, 34.4, 34.5,
+ 34.6, 34.7, 34.8,
+ 34.9,   35, 35.1,
+ 35.2, 35.3, 35.4,
+ 35.5, 35.6, 35.7,
+ 35.8, 35.9,   36,
+    1, 36.1, 36.2,
+ 36.3, 36.4, 36.5,
+ 36.6, 36.7, 36.8,
+ 36.9,   37, 37.1,
+ 37.2, 37.3, 37.4,
+ 37.5, 37.6, 37.7,
+ 37.8, 37.9,   38,
+ 38.1, 38.2, 38.3,
+ 38.4, 38.5, 38.6,
+ 38.7, 38.8, 38.9,
+   39, 39.1, 39.2,
+ 39.3, 39.4, 39.5,
+ 39.6, 39.7, 39.8,
+ 39.9,   40, 40.1,
+ 40.2, 40.3, 40.4,
+ 40.5, 40.6, 40.7,
+ 40.8, 40.9,   41,
+ 41.1, 41.2, 41.3,
+ 41.4, 41.5, 41.6,
+ 41.7, 41.8, 41.9,
+   42,    1, 42.1,
+ 42.2, 42.3, 42.4,
+ 42.5, 42.6, 42.7,
+ 42.8, 42.9,   43,
+ 43.1, 43.2, 43.3,
+ 43.4, 43.5, 43.6,
+ 43.7, 43.8, 43.9,
+   44, 44.1, 44.2,
+ 44.3, 44.4, 44.5,
+ 44.6, 44.7, 44.8,
+ 44.9,   45, 45.1,
+ 45.2, 45.3, 45.4,
+ 45.5, 45.6, 45.7,
+ 45.8, 45.9,   46,
+ 46.1, 46.2, 46.3,
+ 46.4, 46.5, 46.6,
+ 46.7, 46.8, 46.9,
+   47, 47.1, 47.2,
+ 47.3, 47.4, 47.5,
+ 47.6, 47.7, 47.8,
+ 47.9,   48,    1,
+ 48.1, 48.2, 48.3,
+ 48.4, 48.5, 48.6,
+ 48.7, 48.8, 48.9,
+   49, 49.1, 49.2,
+ 49.3, 49.4, 49.5,
+ 49.6, 49.7, 49.8,
+ 49.9,   50, 50.1,
+ 50.2, 50.3, 50.4,
+ 50.5, 50.6, 50.7,
+ 50.8, 50.9,   51,
+ 51.1, 51.2, 51.3,
+ 51.4, 51.5, 51.6,
+ 51.7, 51.8, 51.9,
+   52, 52.1, 52.2,
+ 52.3, 52.4, 52.5,
+ 52.6, 52.7, 52.8,
+ 52.9,   53, 53.1,
+ 53.2, 53.3, 53.4,
+ 53.5, 53.6, 53.7,
+ 53.8, 53.9,   54,
+    1, 54.1, 54.2,
+ 54.3, 54.4, 54.5,
+ 54.6, 54.7, 54.8,
+ 54.9,   55, 55.1,
+ 55.2, 55.3, 55.4,
+ 55.5, 55.6, 55.7,
+ 55.8, 55.9,   56,
+ 56.1, 56.2, 56.3,
+ 56.4, 56.5, 56.6,
+ 56.7, 56.8, 56.9,
+   57, 57.1, 57.2,
+ 57.3, 57.4, 57.5,
+ 57.6, 57.7, 57.8,
+ 57.9,   58, 58.1,
+ 58.2, 58.3, 58.4,
+ 58.5, 58.6, 58.7,
+ 58.8, 58.9,   59,
+ 59.1, 59.2, 59.3,
+ 59.4, 59.5, 59.6,
+ 59.7, 59.8, 59.9,
+   60,    1, 60.1,
+ 60.2, 60.3, 60.4,
+ 60.5, 60.6, 60.7,
+ 60.8, 60.9,   61,
+ 61.1, 61.2, 61.3,
+ 61.4, 61.5, 61.6,
+ 61.7, 61.8, 61.9,
+   62, 62.1, 62.2,
+ 62.3, 62.4, 62.5,
+ 62.6, 62.7, 62.8,
+ 62.9,   63, 63.1,
+ 63.2, 63.3, 63.4,
+ 63.5, 63.6, 63.7,
+ 63.8, 63.9,   64,
+ 64.1, 64.2, 64.3,
+ 64.4, 64.5, 64.6,
+ 64.7, 64.8, 64.9,
+   65, 65.1, 65.2,
+ 65.3, 65.4, 65.5,
+ 65.6, 65.7, 65.8,
+ 65.9,   66,    1,
+ 66.1, 66.2, 66.3,
+ 66.4, 66.5, 66.6,
+ 66.7, 66.8, 66.9,
+   67, 67.1, 67.2,
+ 67.3, 67.4, 67.5,
+ 67.6, 67.7, 67.8,
+ 67.9,   68, 68.1,
+ 68.2, 68.3, 68.4,
+ 68.5, 68.6, 68.7,
+ 68.8, 68.9,   69,
+ 69.1, 69.2, 69.3,
+ 69.4, 69.5, 69.6,
+ 69.7, 69.8, 69.9,
+   70, 70.1, 70.2,
+ 70.3, 70.4, 70.5,
+ 70.6, 70.7, 70.8,
+ 70.9,   71, 71.1,
+ 71.2, 71.3, 71.4,
+ 71.5, 71.6, 71.7,
+ 71.8, 71.9,   72,
+    1, 72.1, 72.2,
+ 72.3, 72.4, 72.5,
+ 72.6, 72.7, 72.8,
+ 72.9,   73, 73.1,
+ 73.2, 73.3, 73.4,
+ 73.5, 73.6, 73.7,
+ 73.8, 73.9,   74,
+ 74.1, 74.2, 74.3,
+ 74.4, 74.5, 74.6,
+ 74.7, 74.8, 74.9,
+   75, 75.1, 75.2,
+ 75.3, 75.4, 75.5,
+ 75.6, 75.7,    1,
+ 75.8, 75.9,   76,
+ 76.1, 76.2, 76.3,
+ 76.4, 76.5, 76.6,
+ 76.7, 76.8, 76.9,
+   77, 77.1, 77.2,
+ 77.3, 77.4, 77.5,
+ 77.6, 77.7, 77.8,
+ 77.9,    1,   78,
+ 78.1, 78.2, 78.3,
+ 78.4, 78.5, 78.6,
+ 78.7, 78.8, 78.9,
+   79, 79.1, 79.2,
+ 79.3, 79.4, 79.5,
+ 79.6, 79.7, 79.8,
+ 79.9,   80, 80.1,
+ 80.2, 80.3, 80.4,
+ 80.5, 80.6, 80.7,
+ 80.8, 80.9,   81,
+ 81.1, 81.2, 81.3,
+    1, 81.4, 81.5,
+ 81.6, 81.7, 81.8,
+ 81.9,   82, 82.1,
+ 82.2, 82.3, 82.4,
+ 82.5, 82.6, 82.7,
+ 82.8, 82.9,   83,
+ 83.1, 83.2, 83.3,
+ 83.4, 83.5, 83.6,
+ 83.7, 83.8,    1,
+ 83.9,   84, 84.1,
+ 84.2, 84.3, 84.4,
+ 84.5, 84.6, 84.7,
+ 84.8, 84.9,   85,
+ 85.1, 85.2, 85.3,
+ 85.4, 85.5, 85.6,
+ 85.7, 85.8, 85.9,
+   86, 86.1, 86.2,
+ 86.3, 86.4, 86.5,
+ 86.6, 86.7, 86.8,
+ 86.9,   87, 87.1,
+ 87.2,    1, 87.3,
+ 87.4, 87.5, 87.6,
+ 87.7, 87.8, 87.9,
+   88, 88.1, 88.2,
+ 88.3, 88.4, 88.5,
+ 88.6, 88.7, 88.8,
+ 88.9,   89, 89.1,
+ 89.2, 89.3, 89.4,
+ 89.5, 89.6, 89.7,
+    1, 89.8, 89.9,
+   90, 90.1, 90.2,
+ 90.3, 90.4, 90.5,
+ 90.6, 90.7, 90.8,
+ 90.9,   91, 91.1,
+ 91.2, 91.3, 91.4,
+ 91.5, 91.6, 91.7,
+ 91.8, 91.9,   92,
+ 92.1, 92.2, 92.3,
+ 92.4, 92.5, 92.6,
+ 92.7, 92.8, 92.9,
+   93, 93.1, 93.2,
+ 93.3, 93.4,    1,
+ 93.5, 93.6, 93.7,
+ 93.8, 93.9,   94,
+ 94.1, 94.2, 94.3,
+ 94.4, 94.5, 94.6,
+ 94.7, 94.8, 94.9,
+   95, 95.1, 95.2,
+ 95.3, 95.4, 95.5,
+ 95.6,    1, 95.7,
+ 95.8, 95.9,   96,
+ 96.1, 96.2, 96.3,
+ 96.4, 96.5, 96.6,
+ 96.7, 96.8, 96.9,
+   97, 97.1, 97.2,
+ 97.3, 97.4, 97.5,
+ 97.6, 97.7, 97.8,
+ 97.9,   98, 98.1,
+ 98.2, 98.3, 98.4,
+ 98.5, 98.6, 98.7,
+ 98.8, 98.9,   99,
+    1, 99.1, 99.2,
+ 99.3, 99.4, 99.5,
+ 99.6, 99.7, 99.8,
+ 99.9,  100,100.1,
+100.2,100.3,100.4,
+100.5,100.6,100.7,
+100.8,100.9,  101,
+101.1,101.2,101.3,
+101.4,101.5,    1,
+101.6,101.7,101.8,
+101.9,  102,102.1,
+102.2,102.3,102.4,
+102.5,102.6,102.7,
+102.8,102.9,  103,
+103.1,103.2,103.3,
+103.4,103.5,103.6,
+103.7,103.8,103.9,
+  104,104.1,104.2,
+104.3,104.4,104.5,
+104.6,104.7,104.8,
+104.9,    1,  105,
+105.1,105.2,105.3,
+105.4,105.5,105.6,
+105.7,105.8,105.9,
+  106,106.1,106.2,
+106.3,106.4,106.5,
+106.6,106.7,106.8,
+106.9,  107,107.1,
+107.2,107.3,107.4,
+    1,107.5,107.6,
+107.7,107.8,107.9,
+  108,108.1,108.2,
+108.3,108.4,108.5,
+108.6,108.7,108.8,
+108.9,  109,109.1,
+109.2,109.3,109.4,
+109.5,109.6,109.7,
+109.8,109.9,  110,
+110.1,110.2,110.3,
+110.4,110.5,110.6,
+110.7,110.8,110.9,
+  111,111.1,    1,
+111.2,111.3,111.4,
+111.5,111.6,111.7,
+111.8,111.9,  112,
+112.1,112.2,112.3,
+112.4,112.5,112.6,
+112.7,112.8,112.9,
+  113,113.1,113.2,
+113.3,    1,113.4,
+113.5,113.6,113.7,
+113.8,113.9,  114,
+114.1,114.2,114.3,
+114.4,114.5,114.6,
+114.7,114.8,114.9,
+  115,115.1,115.2,
+115.3,115.4,115.5,
+115.6,115.7,115.8,
+115.9,  116,116.1,
+116.2,116.3,116.4,
+116.5,116.6,116.7,
+    1,116.8,116.9,
+  117,117.1,117.2,
+117.3,117.4,117.5,
+117.6,117.7,117.8,
+117.9,  118,118.1,
+118.2,118.3,118.4,
+118.5,118.6,118.7,
+118.8,118.9,  119,
+119.1,119.2,    1,
+119.3,119.4,119.5,
+119.6,119.7,119.8,
+119.9,  120,120.1,
+120.2,120.3,120.4,
+120.5,120.6,120.7,
+120.8,120.9,  121,
+121.1,121.2,121.3,
+121.4,121.5,121.6,
+121.7,121.8,121.9,
+  122,122.1,122.2,
+122.3,122.4,122.5,
+122.6,    1,122.7,
+122.8,122.9,  123,
+123.1,123.2,123.3,
+123.4,123.5,123.6,
+123.7,123.8,123.9,
+  124,124.1,124.2,
+124.3,124.4,124.5,
+124.6,124.7,124.8,
+124.9,  125,125.1,
+    1,125.2,125.3,
+125.4,125.5,125.6,
+125.7,125.8,125.9,
+  126,126.1,126.2,
+126.3,126.4,126.5,
+126.6,126.7,126.8,
+126.9,  127,127.1,
+127.2,127.3,127.4,
+127.5,127.6,127.7,
+127.8,127.9,  128,
+128.1,128.2,128.3,
+128.4,128.5,128.6,
+128.7,128.8,    1,
+128.9,  129,129.1,
+129.2,129.3,129.4,
+129.5,129.6,129.7,
+129.8,129.9,  130,
+130.1,130.2,130.3,
+130.4,130.5,130.6,
+130.7,130.8,130.9,
+  131,    1,131.1,
+131.2,131.3,131.4,
+131.5,131.6,131.7,
+131.8,131.9,  132,
+132.1,132.2,132.3,
+132.4,132.5,132.6,
+132.7,132.8,132.9,
+  133,133.1,133.2,
+133.3,133.4,133.5,
+133.6,133.7,133.8,
+133.9,  134,134.1,
+134.2,134.3,134.4,
+    1,134.5,134.6,
+134.7,134.8,134.9,
+  135,135.1,135.2,
+135.3,135.4,135.5,
+135.6,135.7,135.8,
+135.9,  136,136.1,
+136.2,136.3,136.4,
+136.5,136.6,136.7,
+136.8,136.9,    1,
+  137,137.1,137.2,
+137.3,137.4,137.5,
+137.6,137.7,137.8,
+137.9,  138,138.1,
+138.2,138.3,138.4,
+138.5,138.6,138.7,
+138.8,138.9,  139,
+139.1,139.2,139.3,
+139.4,139.5,139.6,
+139.7,139.8,139.9,
+  140,140.1,140.2,
+140.3,    1,140.4,
+140.5,140.6,140.7,
+140.8,140.9,  141,
+141.1,141.2,141.3,
+141.4,141.5,141.6,
+141.7,141.8,141.9,
+  142,142.1,142.2,
+142.3,142.4,142.5,
+142.6,142.7,142.8,
+    1,142.9,  143,
+143.1,143.2,143.3,
+143.4,143.5,143.6,
+143.7,143.8,143.9,
+  144,144.1,144.2,
+144.3,144.4,144.5,
+144.6,144.7,144.8,
+144.9,  145,145.1,
+145.2,145.3,145.4,
+145.5,145.6,145.7,
+145.8,145.9,  146,
+146.1,146.2,146.3,
+146.4,146.5,146.6,
+146.7,146.8,146.9,
+  147,147.1,147.2,
+147.3,147.4,147.5,
+147.6,147.7,147.8,
+147.9,  148,148.1,
+148.2,148.3,148.4,
+148.5,148.6,148.7,
+148.8,    1,148.9,
+  149,149.1,149.2,
+149.3,149.4,149.5,
+149.6,149.7,149.8,
+149.9,  150,150.1,
+150.2,150.3,150.4,
+150.5,150.6,150.7,
+150.8,150.9,  151,
+151.1,151.2,151.3,
+151.4,151.5,151.6,
+151.7,151.8,151.9,
+  152,152.1,152.2,
+152.3,152.4,152.5,
+152.6,152.7,152.8,
+152.9,  153,153.1,
+153.2,153.3,153.4,
+153.5,153.6,153.7,
+153.8,153.9,  154,
+154.1,154.2,154.3,
+154.4,154.5,154.6,
+154.7,154.8,    1,
+154.9,  155,155.1,
+155.2,155.3,155.4,
+155.5,155.6,155.7,
+155.8,155.9,  156,
+156.1,156.2,156.3,
+156.4,156.5,156.6,
+156.7,156.8,156.9,
+  157,157.1,157.2,
+157.3,157.4,157.5,
+157.6,157.7,157.8,
+157.9,  158,158.1,
+158.2,158.3,158.4,
+158.5,158.6,158.7,
+158.8,158.9,  159,
+159.1,159.2,159.3,
+159.4,159.5,159.6,
+159.7,159.8,159.9,
+  160,160.1,160.2,
+160.3,160.4,160.5,
+160.6,160.7,160.8,
+    1,160.9,  161,
+161.1,161.2,161.3,
+161.4,161.5,161.6,
+161.7,161.8,161.9,
+  162,162.1,162.2,
+162.3,162.4,162.5,
+162.6,162.7,162.8,
+162.9,  163,163.1,
+163.2,163.3,163.4,
+163.5,163.6,163.7,
+163.8,163.9,  164,
+164.1,164.2,164.3,
+164.4,164.5,164.6,
+164.7,164.8,164.9,
+  165,165.1,165.2,
+165.3,165.4,165.5,
+165.6,165.7,165.8,
+165.9,  166,166.1,
+166.2,166.3,166.4,
+166.5,166.6,166.7,
+166.8,    1,166.9,
+  167,167.1,167.2,
+167.3,167.4,167.5,
+167.6,167.7,167.8,
+167.9,  168,168.1,
+168.2,168.3,168.4,
+168.5,168.6,168.7,
+168.8,168.9,  169,
+169.1,169.2,169.3,
+169.4,169.5,169.6,
+169.7,169.8,169.9,
+  170,170.1,170.2,
+170.3,170.4,170.5,
+170.6,170.7,170.8,
+170.9,  171,171.1,
+171.2,171.3,171.4,
+171.5,171.6,171.7,
+171.8,171.9,  172,
+172.1,172.2,172.3,
+172.4,172.5,172.6,
+172.7,172.8,    1,
+172.9,  173,173.1,
+173.2,173.3,173.4,
+173.5,173.6,173.7,
+173.8,173.9,  174,
+174.1,174.2,174.3,
+174.4,174.5,174.6,
+174.7,174.8,174.9,
+  175,175.1,175.2,
+175.3,175.4,175.5,
+175.6,175.7,175.8,
+175.9,  176,176.1,
+176.2,176.3,176.4,
+176.5,176.6,176.7,
+176.8,176.9,  177,
+177.1,177.2,177.3,
+177.4,177.5,177.6,
+177.7,177.8,177.9,
+  178,178.1,178.2,
+178.3,178.4,178.5,
+178.6,178.7,178.8,
+    1,178.9,  179,
+179.1,179.2,179.3,
+179.4,179.5,179.6,
+179.7,179.8,179.9,
+  180,180.1,180.2,
+180.3,180.4,180.5,
+180.6,180.7,180.8,
+180.9,  181,181.1,
+181.2,181.3,181.4,
+181.5,181.6,181.7,
+181.8,181.9,  182,
+182.1,182.2,182.3,
+182.4,182.5,182.6,
+182.7,182.8,182.9,
+  183,183.1,183.2,
+183.3,183.4,183.5,
+183.6,183.7,183.8,
+183.9,  184,184.1,
+184.2,184.3,184.4,
+184.5,184.6,184.7,
+184.8,    1,184.9,
+  185,185.1,185.2,
+185.3,185.4,185.5,
+185.6,185.7,185.8,
+185.9,  186,186.1,
+186.2,186.3,186.4,
+186.5,186.6,186.7,
+186.8,186.9,  187,
+187.1,187.2,187.3,
+187.4,187.5,187.6,
+187.7,187.8,187.9,
+  188,188.1,188.2,
+188.3,188.4,188.5,
+188.6,188.7,188.8,
+188.9,  189,189.1,
+189.2,189.3,189.4,
+189.5,189.6,189.7,
+189.8,189.9,  190,
+190.1,190.2,190.3,
+190.4,190.5,190.6,
+190.7,190.8,    1,
+190.9,  191,191.1,
+191.2,191.3,191.4,
+191.5,191.6,191.7,
+191.8,191.9,  192,
+192.1,192.2,192.3,
+192.4,192.5,192.6,
+192.7,192.8,192.9,
+  193,193.1,193.2,
+193.3,193.4,193.5,
+193.6,193.7,193.8,
+193.9,  194,194.1,
+194.2,194.3,194.4,
+194.5,194.6,194.7,
+194.8,194.9,  195,
+195.1,195.2,195.3,
+195.4,195.5,195.6,
+195.7,195.8,195.9,
+  196,196.1,196.2,
+196.3,196.4,196.5,
+196.6,196.7,196.8,
+    1,196.9,  197,
+197.1,197.2,197.3,
+197.4,197.5,197.6,
+197.7,197.8,197.9,
+  198,198.1,198.2,
+198.3,198.4,198.5,
+198.6,198.7,198.8,
+198.9,  199,199.1,
+199.2,199.3,199.4,
+199.5,199.6,199.7,
+199.8,199.9,  200,
+200.1,200.2,200.3,
+200.4,200.5,200.6,
+200.7,200.8,200.9,
+  201,201.1,201.2,
+201.3,201.4,201.5,
+201.6,201.7,201.8,
+201.9,  202,202.1,
+202.2,202.3,202.4,
+202.5,202.6,202.7,
+202.8,    1,202.9,
+  203,203.1,203.2,
+203.3,203.4,203.5,
+203.6,203.7,203.8,
+203.9,  204,204.1,
+204.2,204.3,204.4,
+204.5,204.6,204.7,
+204.8,204.9,  205,
+205.1,205.2,205.3,
+205.4,205.5,205.6,
+205.7,205.8,205.9,
+  206,206.1,206.2,
+206.3,206.4,206.5,
+206.6,206.7,206.8,
+206.9,  207,207.1,
+207.2,207.3,207.4,
+207.5,207.6,207.7,
+207.8,207.9,  208,
+208.1,208.2,208.3,
+208.4,208.5,208.6,
+208.7,208.8,    1,
+208.9,  209,209.1,
+209.2,209.3,209.4,
+209.5,209.6,209.7,
+209.8,209.9,  210,
+210.1,210.2,210.3,
+210.4,210.5,210.6,
+210.7,210.8,210.9,
+  211,211.1,211.2,
+211.3,211.4,211.5,
+211.6,211.7,211.8,
+211.9,  212,212.1,
+212.2,212.3,212.4,
+212.5,212.6,212.7,
+212.8,212.9,  213,
+213.1,213.2,213.3,
+213.4,213.5,213.6,
+213.7,213.8,213.9,
+  214,214.1,214.2,
+214.3,214.4,214.5,
+214.6,214.7,214.8,
+    1,214.9,  215,
+215.1,215.2,215.3,
+215.4,215.5,215.6,
+215.7,215.8,215.9,
+  216,216.1,   -1,
+216.2,216.3,216.4,
+216.5,216.6,216.7,
+216.8,216.9,  217,
+217.1,217.2,217.3,
+217.4,217.5,217.6,
+217.7,217.8,217.9,
+  218,218.1,218.2,
+218.3,218.4,218.5,
+218.6,218.7,218.8,
+218.9,  219,219.1,
+219.2,219.3,219.4,
+219.5,219.6,219.7,
+219.8,219.9,  220,
+220.1,220.2,220.3,
+220.4,220.5,220.6,
+220.7,    1,220.8,
+220.9,  221,221.1,
+221.2,221.3,221.4,
+221.5,221.6,221.7,
+   -1,221.8,221.9,
+  222,222.1,222.2,
+222.3,222.4,222.5,
+222.6,222.7,222.8,
+222.9,  223,223.1,
+223.2,223.3,223.4,
+223.5,223.6,223.7,
+223.8,223.9,  224,
+224.1,224.2,224.3,
+224.4,224.5,224.6,
+224.7,224.8,224.9,
+  225,225.1,225.2,
+225.3,225.4,225.5,
+225.6,225.7,225.8,
+225.9,  226,226.1,
+226.2,226.3,226.4,
+226.5,226.6,    1,
+226.7,226.8,226.9,
+  227,227.1,227.2,
+227.3,227.4,227.5,
+227.6,   -1,227.7,
+227.8,227.9,  228,
+228.1,228.2,228.3,
+228.4,228.5,228.6,
+228.7,228.8,228.9,
+  229,229.1,229.2,
+229.3,229.4,229.5,
+229.6,229.7,229.8,
+229.9,  230,230.1,
+230.2,230.3,230.4,
+230.5,230.6,230.7,
+230.8,230.9,  231,
+231.1,231.2,231.3,
+231.4,231.5,231.6,
+231.7,231.8,231.9,
+  232,232.1,232.2,
+232.3,232.4,232.5,
+    1,232.6,232.7,
+232.8,232.9,  233,
+233.1,233.2,233.3,
+233.4,233.5,233.6,
+233.7,233.8,   -1,
+233.9,  234,234.1,
+234.2,234.3,234.4,
+234.5,234.6,234.7,
+234.8,234.9,  235,
+235.1,235.2,235.3,
+235.4,235.5,235.6,
+235.7,235.8,235.9,
+  236,236.1,236.2,
+236.3,236.4,236.5,
+236.6,236.7,236.8,
+236.9,  237,237.1,
+237.2,237.3,237.4,
+237.5,237.6,237.7,
+237.8,237.9,  238,
+238.1,238.2,238.3,
+238.4,    1,238.5,
+238.6,238.7,238.8,
+238.9,  239,239.1,
+239.2,239.3,239.4,
+   -1,239.5,239.6,
+239.7,239.8,239.9,
+  240,240.1,240.2,
+240.3,240.4,240.5,
+240.6,240.7,240.8,
+240.9,  241,241.1,
+241.2,241.3,241.4,
+241.5,241.6,241.7,
+241.8,241.9,  242,
+242.1,242.2,242.3,
+242.4,242.5,242.6,
+242.7,242.8,242.9,
+  243,243.1,243.2,
+243.3,243.4,243.5,
+243.6,243.7,243.8,
+243.9,  244,244.1,
+244.2,244.3,    1,
+244.4,244.5,244.6,
+244.7,244.8,244.9,
+  245,245.1,245.2,
+245.3,   -1,245.4,
+245.5,245.6,245.7,
+245.8,245.9,  246,
+246.1,246.2,246.3,
+246.4,246.5,246.6,
+246.7,246.8,246.9,
+  247,247.1,247.2,
+247.3,247.4,247.5,
+247.6,247.7,247.8,
+247.9,  248,248.1,
+248.2,248.3,248.4,
+248.5,248.6,248.7,
+248.8,248.9,  249,
+249.1,249.2,249.3,
+249.4,249.5,249.6,
+249.7,249.8,249.9,
+  250,250.1,250.2,
+    1,250.3,250.4,
+250.5,250.6,250.7,
+250.8,250.9,  251,
+251.1,251.2,251.3,
+251.4,251.5,   -1,
+251.6,251.7,251.8,
+251.9,  252,252.1,
+252.2,252.3,252.4,
+252.5,252.6,252.7,
+252.8,252.9,  253,
+253.1,253.2,253.3,
+253.4,253.5,253.6,
+253.7,253.8,253.9,
+  254,254.1,254.2,
+254.3,254.4,254.5,
+254.6,254.7,254.8,
+254.9,  255,255.1,
+255.2,255.3,255.4,
+255.5,255.6,255.7,
+255.8,255.9,  256,
+256.1,    1,256.2,
+256.3,256.4,256.5,
+256.6,256.7,256.8,
+256.9,  257,257.1,
+   -1,257.2,257.3,
+257.4,257.5,257.6,
+257.7,257.8,257.9,
+  258,258.1,258.2,
+258.3,258.4,258.5,
+258.6,258.7,258.8,
+258.9,  259,259.1,
+259.2,259.3,259.4,
+259.5,259.6,259.7,
+259.8,259.9,  260,
+260.1,260.2,260.3,
+260.4,260.5,260.6,
+260.7,260.8,260.9,
+  261,261.1,261.2,
+261.3,261.4,261.5,
+261.6,261.7,261.8,
+261.9,  262,    1,
+262.1,262.2,262.3,
+262.4,262.5,262.6,
+262.7,262.8,262.9,
+  263,   -1,263.1,
+263.2,263.3,263.4,
+263.5,263.6,263.7,
+263.8,263.9,  264,
+264.1,264.2,264.3,
+264.4,264.5,264.6,
+264.7,264.8,264.9,
+  265,265.1,265.2,
+265.3,265.4,265.5,
+265.6,265.7,265.8,
+265.9,  266,266.1,
+266.2,266.3,266.4,
+266.5,266.6,266.7,
+266.8,266.9,  267,
+267.1,267.2,267.3,
+267.4,267.5,267.6,
+267.7,267.8,267.9,
+    1,  268,268.1,
+268.2,268.3,268.4,
+268.5,268.6,268.7,
+268.8,268.9,  269,
+269.1,269.2,   -1,
+269.3,269.4,269.5,
+269.6,269.7,269.8,
+269.9,  270,270.1,
+270.2,270.3,270.4,
+270.5,270.6,270.7,
+270.8,270.9,  271,
+271.1,271.2,271.3,
+271.4,271.5,271.6,
+271.7,271.8,271.9,
+  272,272.1,272.2,
+272.3,272.4,272.5,
+272.6,272.7,272.8,
+272.9,  273,273.1,
+273.2,273.3,273.4,
+273.5,273.6,273.7,
+273.8,    1,273.9,
+  274,274.1,274.2,
+274.3,274.4,274.5,
+274.6,274.7,274.8,
+   -1,274.9,  275,
+275.1,275.2,275.3,
+275.4,275.5,275.6,
+275.7,275.8,275.9,
+  276,276.1,276.2,
+276.3,276.4,276.5,
+276.6,276.7,276.8,
+276.9,  277,277.1,
+277.2,277.3,277.4,
+277.5,277.6,277.7,
+277.8,277.9,  278,
+278.1,278.2,278.3,
+278.4,278.5,278.6,
+278.7,278.8,278.9,
+  279,279.1,279.2,
+279.3,279.4,279.5,
+279.6,279.7,    1,
+279.8,279.9,  280,
+280.1,280.2,280.3,
+280.4,280.5,280.6,
+280.7,   -1,280.8,
+280.9,  281,281.1,
+281.2,281.3,281.4,
+281.5,281.6,281.7,
+281.8,281.9,  282,
+282.1,    1,282.2,
+282.3,282.4,282.5,
+282.6,282.7,282.8,
+282.9,  283,283.1,
+283.2,283.3,283.4,
+283.5,283.6,283.7,
+283.8,283.9,  284,
+284.1,284.2,284.3,
+284.4,   -1,284.5,
+284.6,284.7,284.8,
+284.9,  285,285.1,
+285.2,285.3,285.4,
+285.5,285.6,285.7,
+285.8,285.9,  286,
+286.1,286.2,286.3,
+286.4,286.5,286.6,
+286.7,286.8,286.9,
+  287,287.1,287.2,
+287.3,287.4,287.5,
+287.6,287.7,287.8,
+287.9,  288,    1,
+288.1,288.2,288.3,
+288.4,288.5,288.6,
+288.7,288.8,288.9,
+  289,289.1,289.2,
+289.3,289.4,289.5,
+289.6,289.7,289.8,
+289.9,  290,290.1,
+290.2,290.3,   -1,
+290.4,290.5,290.6,
+290.7,290.8,290.9,
+  291,291.1,291.2,
+291.3,291.4,291.5,
+291.6,291.7,291.8,
+291.9,  292,292.1,
+292.2,292.3,292.4,
+292.5,292.6,292.7,
+292.8,292.9,  293,
+293.1,293.2,293.3,
+293.4,293.5,293.6,
+    1,293.7,293.8,
+293.9,  294,294.1,
+294.2,294.3,294.4,
+294.5,294.6,294.7,
+294.8,294.9,  295,
+295.1,295.2,295.3,
+295.4,295.5,295.6,
+295.7,295.8,295.9,
+   -1,  296,296.1,
+296.2,296.3,296.4,
+296.5,296.6,296.7,
+296.8,296.9,  297,
+297.1,297.2,297.3,
+297.4,297.5,297.6,
+297.7,297.8,297.9,
+  298,298.1,298.2,
+298.3,298.4,298.5,
+298.6,298.7,298.8,
+298.9,  299,299.1,
+299.2,299.3,299.4,
+299.5,299.6,299.7,
+299.8,    1,299.9,
+  300,300.1,300.2,
+300.3,300.4,300.5,
+300.6,300.7,300.8,
+300.9,  301,301.1,
+301.2,301.3,301.4,
+301.5,301.6,301.7,
+301.8,301.9,  302,
+302.1,   -1,302.2,
+302.3,302.4,302.5,
+302.6,302.7,302.8,
+302.9,  303,303.1,
+303.2,303.3,303.4,
+303.5,303.6,303.7,
+303.8,303.9,  304,
+304.1,304.2,304.3,
+304.4,304.5,304.6,
+304.7,304.8,304.9,
+  305,305.1,305.2,
+305.3,305.4,305.5,
+305.6,305.7,    1,
+305.8,305.9,  306,
+306.1,306.2,306.3,
+306.4,306.5,306.6,
+306.7,306.8,306.9,
+  307,307.1,307.2,
+307.3,307.4,307.5,
+307.6,307.7,307.8,
+307.9,  308,   -1,
+308.1,308.2,308.3,
+308.4,308.5,308.6,
+308.7,308.8,308.9,
+  309,309.1,309.2,
+309.3,309.4,309.5,
+309.6,309.7,309.8,
+309.9,  310,310.1,
+310.2,310.3,310.4,
+310.5,310.6,310.7,
+310.8,310.9,  311,
+311.1,311.2,311.3,
+    1,311.4,311.5,
+311.6,311.7,311.8,
+311.9,  312,312.1,
+312.2,312.3,312.4,
+312.5,312.6,312.7,
+312.8,312.9,  313,
+313.1,313.2,313.3,
+313.4,313.5,313.6,
+   -1,313.7,313.8,
+313.9,  314,314.1,
+314.2,314.3,314.4,
+314.5,314.6,314.7,
+314.8,314.9,  315,
+315.1,315.2,315.3,
+315.4,315.5,315.6,
+315.7,315.8,315.9,
+  316,316.1,316.2,
+316.3,316.4,316.5,
+316.6,316.7,316.8,
+316.9,  317,317.1,
+317.2,317.3,317.4,
+317.5,    1,317.6,
+317.7,317.8,317.9,
+  318,318.1,318.2,
+318.3,318.4,318.5,
+318.6,318.7,318.8,
+318.9,  319,319.1,
+319.2,319.3,319.4,
+319.5,319.6,319.7,
+319.8,   -1,319.9,
+  320,320.1,320.2,
+320.3,320.4,320.5,
+320.6,320.7,320.8,
+320.9,  321,321.1,
+321.2,321.3,321.4,
+321.5,321.6,321.7,
+321.8,321.9,  322,
+322.1,322.2,322.3,
+322.4,322.5,322.6,
+322.7,322.8,322.9,
+  323,323.1,323.2,
+323.3,323.4,    1,
+323.5,323.6,323.7,
+323.8,323.9,  324,
+324.1,324.2,324.3,
+324.4,324.5,324.6,
+324.7,324.8,324.9,
+  325,325.1,325.2,
+325.3,325.4,325.5,
+325.6,325.7,   -1,
+325.8,325.9,  326,
+326.1,326.2,326.3,
+326.4,326.5,326.6,
+326.7,326.8,326.9,
+  327,327.1,327.2,
+327.3,327.4,327.5,
+327.6,327.7,327.8,
+327.9,  328,328.1,
+328.2,328.3,328.4,
+328.5,328.6,328.7,
+328.8,328.9,  329,
+    1,329.1,329.2,
+329.3,329.4,329.5,
+329.6,329.7,329.8,
+329.9,  330,330.1,
+330.2,330.3,330.4,
+330.5,330.6,330.7,
+330.8,330.9,  331,
+331.1,331.2,331.3,
+   -1,331.4,331.5,
+331.6,331.7,331.8,
+331.9,  332,332.1,
+332.2,332.3,332.4,
+332.5,332.6,332.7,
+332.8,332.9,  333,
+333.1,333.2,333.3,
+333.4,333.5,333.6,
+333.7,333.8,333.9,
+  334,334.1,334.2,
+334.3,334.4,334.5,
+334.6,334.7,334.8,
+334.9,  335,335.1,
+335.2,    1,335.3,
+335.4,335.5,335.6,
+335.7,335.8,335.9,
+  336,336.1,336.2,
+336.3,336.4,336.5,
+336.6,336.7,336.8,
+336.9,  337,337.1,
+337.2,337.3,337.4,
+337.5,   -1,337.6,
+337.7,337.8,337.9,
+  338,338.1,338.2,
+338.3,338.4,338.5,
+338.6,338.7,338.8,
+338.9,  339,339.1,
+339.2,339.3,339.4,
+339.5,339.6,339.7,
+339.8,339.9,  340,
+340.1,340.2,340.3,
+340.4,340.5,340.6,
+340.7,340.8,340.9,
+  341,341.1,    1,
+341.2,341.3,341.4,
+341.5,341.6,341.7,
+341.8,341.9,  342,
+342.1,342.2,342.3,
+342.4,342.5,342.6,
+342.7,342.8,342.9,
+  343,343.1,343.2,
+343.3,343.4,   -1,
+343.5,343.6,343.7,
+343.8,343.9,  344,
+344.1,344.2,344.3,
+344.4,344.5,344.6,
+344.7,344.8,344.9,
+  345,345.1,345.2,
+345.3,345.4,345.5,
+345.6,345.7,345.8,
+345.9,  346,346.1,
+346.2,346.3,346.4,
+346.5,346.6,346.7,
+    1,346.8,346.9,
+  347,347.1,347.2,
+347.3,347.4,347.5,
+347.6,347.7,347.8,
+347.9,  348,348.1,
+348.2,348.3,348.4,
+348.5,348.6,348.7,
+348.8,348.9,  349,
+   -1,349.1,349.2,
+349.3,349.4,349.5,
+349.6,349.7,349.8,
+349.9,  350,350.1,
+350.2,350.3,350.4,
+};
+
+// ----------------------------------------------------------------------
+// Computed values
+// ----------------------------------------------------------------------
+
+const double pylith::faults::CohesiveDynDataHex8::_orientation[] = {
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_area[] = {
+  1.0, 1.0, 1.0, 1.0
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_initialTractions[] = {
+  1.0, 2.0, -3.0,
+  1.1, 2.1, -3.1,
+  1.2, 2.2, -3.2,
+  1.3, 2.3, -3.3,
+};
+
+
+const int pylith::faults::CohesiveDynDataHex8::_numConstraintVert = 4;
+const int pylith::faults::CohesiveDynDataHex8::_constraintVertices[] = {
+  18, 19, 20, 21
+};
+// ----------------------------------------------------------------------
+// Stick case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataHex8::_fieldIncrStick[] = {
+  0.1, 2.1, 28.1,
+  0.2, 2.2, 28.2,
+  0.3, 2.3, 28.3,
+  0.4, 2.4, 28.4,
+  0.5, 2.5, 28.5, // 6
+  0.6, 2.6, 28.6, // 7
+  0.7, 2.7, 28.7, // 8
+  0.8, 2.8, 28.8, // 9
+  0.9, 2.9, 28.9,
+  0.0, 2.0, 28.0,
+  1.1, 3.1, 29.1,
+  1.2, 3.2, 29.2,
+  1.3, 3.3, 29.3, // 14
+  1.5, 3.5, 29.5, // 15
+  1.7, 3.7, 29.7, // 16
+  1.9, 3.9, 29.9, // 17
+  1.4, 3.4, -29.4, // 18
+  1.6, 3.6, -29.6, // 19
+  1.8, 3.8, -29.8, // 20
+  1.0, 3.0, -29.0, // 21
+};
+
+// No change in fieldIncr
+// Zero slip
+
+// ----------------------------------------------------------------------
+// Slip case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataHex8::_fieldIncrSlip[] = {
+  5.1, 7.1, 9.1,
+  5.2, 7.2, 9.2,
+  5.3, 7.3, 9.3,
+  5.4, 7.4, 9.4,
+  5.5, 7.5, 9.5, // 6
+  5.6, 7.6, 9.6, // 7
+  5.7, 7.7, 9.7, // 8
+  5.8, 7.8, 9.8, // 9
+  5.9, 7.9, 9.9,
+  5.0, 7.0, 9.0,
+  6.1, 8.1, 10.1,
+  6.2, 8.2, 10.2,
+  6.3, 8.3, 10.3, // 14
+  6.5, 8.5, 10.5, // 15
+  6.7, 8.7, 10.7, // 16
+  6.9, 8.9, 10.9, // 17
+  6.4, 8.4, -10.4, // 18
+  6.6, 8.6, -10.6, // 19
+  6.8, 8.8, -10.8, // 20
+  6.0, 8.0, -10.0, // 21
+};
+
+// Output
+// :TODO: Update Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataHex8::_fieldIncrSlipE[] = {
+  5.1, 7.1, 9.1,
+  5.2, 7.2, 9.2,
+  5.3, 7.3, 9.3,
+  5.4, 7.4, 9.4,
+  5.5, 7.5, 9.5, // 6
+  5.6, 7.6, 9.6, // 7
+  5.7, 7.7, 9.7, // 8
+  5.8, 7.8, 9.8, // 9
+  5.9, 7.9, 9.9,
+  5.0, 7.0, 9.0,
+  6.1, 8.1, 10.1,
+  6.2, 8.2, 10.2,
+  6.3, 8.3, 10.3, // 14
+  6.5, 8.5, 10.5, // 15
+  6.7, 8.7, 10.7, // 16
+  6.9, 8.9, 10.9, // 17
+  -3.963897477671262,  -5.477083063322538,  -10.4, // 18
+  -4.120121221785221,  -5.634915064993491,  -10.6, // 19
+  -4.276416812742042,  -5.792739610437928,  -10.8, // 20 
+  -3.474281747841006,  -4.919475110692280,  -10.0, // 21
+};
+
+// :TODO: Update slip values based on changes in Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataHex8::_slipSlipE[] = {
+  20.727794955342528,  27.754166126645078,                   0.0,
+  21.440242443570444,  28.469830129986981,                   0.0,
+  22.152833625484085,  29.185479220875859,                   0.0,
+  18.948563495682009,  25.838950221384557,                   0.0,
+};
+
+// ----------------------------------------------------------------------
+// Open case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataHex8::_fieldIncrOpen[] = {
+  5.1, 7.1, 9.1,
+  5.2, 7.2, 9.2,
+  5.3, 7.3, 9.3,
+  5.4, 7.4, 9.4,
+  5.5, 7.5, 9.5, // 6
+  5.6, 7.6, 9.6, // 7
+  5.7, 7.7, 9.7, // 8
+  5.8, 7.8, 9.8, // 9
+  5.9, 7.9, 9.9,
+  5.0, 7.0, 9.0,
+  6.1, 8.1, 10.1,
+  6.2, 8.2, 10.2,
+  6.3, 8.3, 10.3, // 14
+  6.5, 8.5, 10.5, // 15
+  6.7, 8.7, 10.7, // 16
+  6.9, 8.9, 10.9, // 17
+  6.4, 8.4, 10.4, // 18
+  6.6, 8.6, 10.6, // 19
+  6.8, 8.8, 10.8, // 20
+  6.0, 8.0, 10.0, // 21
+};
+
+// Output
+const double pylith::faults::CohesiveDynDataHex8::_fieldIncrOpenE[] = {
+  5.1, 7.1, 9.1,
+  5.2, 7.2, 9.2,
+  5.3, 7.3, 9.3,
+  5.4, 7.4, 9.4,
+  5.5, 7.5, 9.5, // 6
+  5.6, 7.6, 9.6, // 7
+  5.7, 7.7, 9.7, // 8
+  5.8, 7.8, 9.8, // 9
+  5.9, 7.9, 9.9,
+  5.0, 7.0, 9.0,
+  6.1, 8.1, 10.1,
+  6.2, 8.2, 10.2,
+  6.3, 8.3, 10.3, // 14
+  6.5, 8.5, 10.5, // 15
+  6.7, 8.7, 10.7, // 16
+  6.9, 8.9, 10.9, // 17
+  -5.4, -7.4, -9.4, // 18
+  -5.6, -7.6, -9.6, // 19
+  -5.8, -7.8, -9.8, // 20
+  -5.0, -7.0, -9.0, // 21
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_slipOpenE[] = {
+  23.6, 31.6, 39.6,
+  24.4, 32.4, 40.4,
+  25.2, 33.2, 41.2,
+  22.0, 30.0, 38.0,
+};
+
+// ----------------------------------------------------------------------
+pylith::faults::CohesiveDynDataHex8::CohesiveDynDataHex8(void)
+{ // constructor
+  meshFilename = const_cast<char*>(_meshFilename);
+  spaceDim = _spaceDim;
+  cellDim = _cellDim;
+  numBasis = _numBasis;
+  numQuadPts = _numQuadPts;
+  quadPts = const_cast<double*>(_quadPts);
+  quadWts = const_cast<double*>(_quadWts);
+  basis = const_cast<double*>(_basis);
+  basisDeriv = const_cast<double*>(_basisDeriv);
+  verticesRef = const_cast<double*>(_verticesRef);
+  id = _id;
+  label = const_cast<char*>(_label);
+  initialTractFilename = const_cast<char*>(_initialTractFilename);
+
+  fieldT = const_cast<double*>(_fieldT);
+  jacobian = const_cast<double*>(_jacobian);
+  orientation = const_cast<double*>(_orientation);
+  area = const_cast<double*>(_area);
+  initialTractions = const_cast<double*>(_initialTractions);
+
+  constraintVertices = const_cast<int*>(_constraintVertices);
+  numConstraintVert = _numConstraintVert;  
+
+  // Stick
+  fieldIncrStick = const_cast<double*>(_fieldIncrStick);
+
+  // Slip
+  fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
+  fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
+  slipSlipE = const_cast<double*>(_slipSlipE);
+
+  // Open
+  fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
+  fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
+  slipOpenE = const_cast<double*>(_slipOpenE);
+} // constructor
+
+pylith::faults::CohesiveDynDataHex8::~CohesiveDynDataHex8(void)
+{}
+
+
+// End of file

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_faults_cohesivedynldatahex8_hh)
+#define pylith_faults_cohesivedynldatahex8_hh
+
+#include "CohesiveDynData.hh"
+
+namespace pylith {
+  namespace faults {
+     class CohesiveDynDataHex8;
+  } // pylith
+} // faults
+
+class pylith::faults::CohesiveDynDataHex8 : public CohesiveDynData
+{
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public: 
+
+  /// Constructor
+  CohesiveDynDataHex8(void);
+
+  /// Destructor
+  ~CohesiveDynDataHex8(void);
+
+// PRIVATE MEMBERS //////////////////////////////////////////////////////
+private:
+
+  static const char* _meshFilename; ///< Filename of input mesh
+
+  static const int _spaceDim; ///< Number of dimensions in vertex coordinates
+  static const int _cellDim; ///< Number of dimensions associated with cell
+
+  static const int _numBasis; ///< Number of vertices in cell
+  static const int _numQuadPts; ///< Number of quadrature points
+  static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
+  static const double _quadWts[]; ///< Weights of quadrature points
+  static const double _basis[]; ///< Basis fns at quadrature points
+  static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
+  static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
+
+  static const int _id; ///< Fault material identifier
+  static const char* _label; ///< Label for fault
+  static const char* _initialTractFilename; ///< Name of db for initial tractions.
+
+  static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
+  static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
+  static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
+  static const double _jacobian[]; ///< Jacobian sparse matrix.
+
+  static const double _orientation[]; ///< Expected values for fault orientation.
+  static const double _area[]; ///< Expected values for fault area.
+  static const double _initialTractions[]; ///< Expected values for initial tractions.
+  static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
+  static const double _slipSlipE[]; ///< Expected values for slip for slip case.
+  static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
+  static const double _slipOpenE[]; ///< Expected values for slip for opening case.
+  static const int _constraintVertices[]; ///< Expected points for constraint vertices
+  static const int _numConstraintVert; ///< Number of constraint vertices
+
+};
+
+#endif // pylith_faults_cohesivedynldatahex8_hh
+
+
+// End of file

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,468 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+
+/* Original mesh
+ *
+ * Cells are 0-1, vertices are 2-7.
+ *
+ *       3 -------- 5 -------- 7
+ *       |          |          |
+ *       |          |          |
+ *       |          |          |
+ *       |          |          |
+ *       |          |          |
+ *       |          |          |
+ *       |          |          |
+ *       |          |          |
+ *       2 -------- 4 -------- 6
+ *
+ * After adding cohesive elements
+ *
+ * Cells are 0-1,10 vertices are 2-9.
+ *
+ *       3 -------- 5 -11-- 9 -------- 7
+ *       |          |       |          |
+ *       |          |       |          |
+ *       |          |       |          |
+ *       |          |       |          |
+ *       |          |       |          |
+ *       |          |       |          |
+ *       |          |       |          |
+ *       |          |       |          |
+ *       2 -------- 4 -10-- 8 -------- 6
+ */
+
+#include "CohesiveDynDataQuad4.hh"
+
+const char* pylith::faults::CohesiveDynDataQuad4::_meshFilename =
+  "data/quad4.mesh";
+
+const int pylith::faults::CohesiveDynDataQuad4::_spaceDim = 2;
+
+const int pylith::faults::CohesiveDynDataQuad4::_cellDim = 1;
+
+const int pylith::faults::CohesiveDynDataQuad4::_numBasis = 2;
+
+const int pylith::faults::CohesiveDynDataQuad4::_numQuadPts = 1;
+
+const double pylith::faults::CohesiveDynDataQuad4::_quadPts[] = {
+  0.0,
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_quadWts[] = {
+  2.0,
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_basis[] = {
+  0.5,
+  0.5
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_basisDeriv[] = {
+  -0.5,
+   0.5
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_verticesRef[] = {
+  -1.0, 1.0
+};
+
+const int pylith::faults::CohesiveDynDataQuad4::_id = 10;
+
+const char* pylith::faults::CohesiveDynDataQuad4::_label = "fault";
+
+const char* pylith::faults::CohesiveDynDataQuad4::_initialTractFilename = 
+  "data/quad4_initialtract.spatialdb";
+
+const double pylith::faults::CohesiveDynDataQuad4::_fieldT[] = {
+  8.1, 9.1,
+  8.2, 9.2,
+  8.3, 9.3, // 4
+  8.4, 9.4, // 5
+  8.5, 9.5,
+  8.6, 9.6,
+  8.7, 9.7, // 8
+  8.9, 9.9, // 9
+  8.8, 9.8, // 10
+  8.0, 9.0, // 11
+};
+
+// :TODO: Make sensible values for Jacobian for DOF on positive and
+// negative sides of the fault. Add semi-random values for other DOF.
+const double pylith::faults::CohesiveDynDataQuad4::_jacobian[] = {
+   1, 0.1,
+ 0.2, 0.3,
+ 0.4, 0.5,
+ 0.6, 0.7,
+ 0.8, 0.9,
+   1, 1.1,
+ 1.2, 1.3,
+ 1.4, 1.5,
+ 1.6, 1.7,
+ 1.8, 1.9,
+   2,   1,
+ 2.1, 2.2,
+ 2.3, 2.4,
+ 2.5, 2.6,
+ 2.7, 2.8,
+ 2.9,   3,
+ 3.1, 3.2,
+ 3.3, 3.4,
+ 3.5, 3.6,
+ 3.7, 3.8,
+ 3.9,   4,
+   1, 4.1,
+ 4.2, 4.3,
+ 4.4, 4.5,
+ 4.6, 4.7,
+ 4.8, 4.9,
+   5, 5.1,
+ 5.2, 5.3,
+ 5.4, 5.5,
+ 5.6, 5.7,
+ 5.8, 5.9,
+   6,   1,
+ 6.1, 6.2,
+ 6.3, 6.4,
+ 6.5, 6.6,
+ 6.7, 6.8,
+ 6.9,   7,
+ 7.1, 7.2,
+ 7.3, 7.4,
+ 7.5, 7.6,
+ 7.7, 7.8,
+ 7.9,   8,
+   1, 8.1,
+ 8.2, 8.3,
+ 8.4, 8.5,
+ 8.6, 8.7,
+ 8.8, 8.9,
+   9, 9.1,
+ 9.2,  -1,
+ 9.3, 9.4,
+ 9.5, 9.6,
+ 9.7, 9.8,
+ 9.9,   1,
+  10,10.1,
+10.2,10.3,
+10.4,10.5,
+10.6,10.7,
+10.8,10.9,
+  -1,  11,
+11.1,11.2,
+11.3,11.4,
+11.5,11.6,
+11.7,11.8,
+   1,11.9,
+  12,12.1,
+12.2,12.3,
+12.4,12.5,
+12.6,12.7,
+12.8,12.9,
+  13,  -1,
+13.1,13.2,
+13.3,13.4,
+13.5,13.6,
+13.7,   1,
+13.8,13.9,
+  14,14.1,
+14.2,14.3,
+14.4,14.5,
+14.6,14.7,
+  -1,14.8,
+14.9,  15,
+15.1,15.2,
+15.3,15.4,
+15.5,15.6,
+   1,15.7,
+15.8,15.9,
+  16,16.1,
+16.2,16.3,
+16.4,16.5,
+16.6,16.7,
+16.8,16.9,
+  17,17.1,
+17.2,17.3,
+17.4,17.5,
+17.6,   1,
+17.7,17.8,
+17.9,  18,
+18.1,18.2,
+18.3,18.4,
+18.5,18.6,
+18.7,18.8,
+18.9,  19,
+19.1,19.2,
+19.3,19.4,
+19.5,19.6,
+   1,19.7,
+19.8,19.9,
+  20,20.1,
+20.2,20.3,
+20.4,20.5,
+20.6,20.7,
+20.8,20.9,
+  21,21.1,
+21.2,21.3,
+21.4,21.5,
+21.6,   1,
+21.7,21.8,
+21.9,  22,
+22.1,22.2,
+22.3,22.4,
+22.5,22.6,
+22.7,22.8,
+22.9,  23,
+23.1,23.2,
+23.3,23.4,
+23.5,23.6,
+   1,23.7,
+23.8,23.9,
+  24,   1,
+24.1,24.2,
+24.3,24.4,
+24.5,24.6,
+24.7,24.8,
+24.9,  25,
+25.1,25.2,
+25.3,25.4,
+25.5,   1,
+25.6,25.7,
+   1,25.8,
+25.9,  26,
+26.1,26.2,
+26.3,26.4,
+26.5,26.6,
+26.7,26.8,
+26.9,  27,
+27.1,27.2,
+27.3,27.4,
+   1,27.5,
+27.6,27.7,
+27.8,   1,
+27.9,  28,
+28.1,28.2,
+28.3,28.4,
+28.5,28.6,
+28.7,28.8,
+28.9,  29,
+29.1,29.2,
+29.3,   1,
+29.4,29.5,
+   1,29.6,
+29.7,29.8,
+29.9,  30,
+30.1,  -1,
+30.2,30.3,
+30.4,30.5,
+30.6,30.7,
+30.8,   1,
+30.9,  31,
+31.1,31.2,
+31.3,31.4,
+31.5,31.6,
+31.7,31.8,
+  -1,31.9,
+  32,32.1,
+32.2,32.3,
+32.4,32.5,
+   1,32.6,
+32.7,32.8,
+32.9,  33,
+33.1,33.2,
+33.3,33.4,
+33.5,33.6,
+33.7,33.8,
+33.9,  -1,
+  34,34.1,
+34.2,34.3,
+34.4,34.5,
+34.6,   1,
+34.7,34.8,
+34.9,  35,
+35.1,35.2,
+35.3,35.4,
+35.5,35.6,
+  -1,35.7,
+35.8,35.9,
+  36,36.1,
+36.2,36.3,
+   1,36.4,
+36.5,36.6,
+36.7,36.8,
+};
+
+// ----------------------------------------------------------------------
+// Computed values
+// ----------------------------------------------------------------------
+
+const double pylith::faults::CohesiveDynDataQuad4::_orientation[] = {
+  0.0,  -1.0,  -1.0, 0.0,
+  0.0,  -1.0,  -1.0, 0.0
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_area[] = {
+  1.0,
+  1.0,
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_initialTractions[] = {
+  1.0, -2.0,
+  1.1, -2.1,
+};
+
+
+const int pylith::faults::CohesiveDynDataQuad4::_numConstraintVert = 2;
+const int pylith::faults::CohesiveDynDataQuad4::_constraintVertices[] = {
+  10, 11
+};
+
+// ----------------------------------------------------------------------
+// Stick case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrStick[] = {
+  1.1, 29.1,
+  1.2, 29.2,
+  1.3, 29.3, // 4
+  1.4, 29.4, // 5
+  1.5, 29.5,
+  1.6, 29.6,
+  1.7, 29.7, // 8
+  1.9, 29.9, // 9
+  1.8, -29.8, // 10
+  1.0, -29.0, // 11
+};
+
+// No change in fieldIncr
+// Zero slip
+
+// ----------------------------------------------------------------------
+// Slip case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrSlip[] = {
+  9.1, 10.1,
+  9.2, 10.2,
+  9.3, 10.3, // 4
+  9.4, 10.4, // 5
+  9.5, 10.5,
+  9.6, 10.6,
+  9.7, 10.7, // 8
+  9.9, 10.9, // 9
+  9.8, -10.8, // 10
+  9.0, -10.0, // 11
+};
+
+// Output
+// :TODO: Update Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrSlipE[] = {
+  9.1, 10.1,
+  9.2, 10.2,
+  9.3, 10.3, // 4
+  9.4, 10.4, // 5
+  9.5, 10.5,
+  9.6, 10.6,
+  9.7, 10.7, // 8
+  9.9, 10.9, // 9
+  -7.0, -10.8, // 10
+  -6.14, -10.0, // 11
+};
+
+// :TODO: Update slip values based on changes in Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataQuad4::_slipSlipE[] = {
+  33.6, 0.0,
+  30.28, 0.0,
+};
+
+// ----------------------------------------------------------------------
+// Open case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrOpen[] = {
+  9.1, 10.1,
+  9.2, 10.2,
+  9.3, 10.3, // 4
+  9.4, 10.4, // 5
+  9.5, 10.5,
+  9.6, 10.6,
+  9.7, 10.7, // 8
+  9.9, 10.9, // 9
+  9.8, 10.8, // 10
+  9.0, 10.0, // 11
+};
+
+// Output
+const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrOpenE[] = {
+  9.1, 10.1,
+  9.2, 10.2,
+  9.3, 10.3, // 4
+  9.4, 10.4, // 5
+  9.5, 10.5,
+  9.6, 10.6,
+  9.7, 10.7, // 8
+  9.9, 10.9, // 9
+  -8.8, -9.8, // 10
+  -8.0, -9.0, // 11
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_slipOpenE[] = {
+  37.2, 41.2,
+  34.0, 38.0,
+};
+
+// ----------------------------------------------------------------------
+pylith::faults::CohesiveDynDataQuad4::CohesiveDynDataQuad4(void)
+{ // constructor
+  meshFilename = const_cast<char*>(_meshFilename);
+  spaceDim = _spaceDim;
+  cellDim = _cellDim;
+  numBasis = _numBasis;
+  numQuadPts = _numQuadPts;
+  quadPts = const_cast<double*>(_quadPts);
+  quadWts = const_cast<double*>(_quadWts);
+  basis = const_cast<double*>(_basis);
+  basisDeriv = const_cast<double*>(_basisDeriv);
+  verticesRef = const_cast<double*>(_verticesRef);
+  id = _id;
+  label = const_cast<char*>(_label);
+  initialTractFilename = const_cast<char*>(_initialTractFilename);
+
+  fieldT = const_cast<double*>(_fieldT);
+  jacobian = const_cast<double*>(_jacobian);
+  orientation = const_cast<double*>(_orientation);
+  area = const_cast<double*>(_area);
+  initialTractions = const_cast<double*>(_initialTractions);
+
+  constraintVertices = const_cast<int*>(_constraintVertices);
+  numConstraintVert = _numConstraintVert;  
+
+  // Stick
+  fieldIncrStick = const_cast<double*>(_fieldIncrStick);
+
+  // Slip
+  fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
+  fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
+  slipSlipE = const_cast<double*>(_slipSlipE);
+
+  // Open
+  fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
+  fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
+  slipOpenE = const_cast<double*>(_slipOpenE);
+} // constructor
+
+pylith::faults::CohesiveDynDataQuad4::~CohesiveDynDataQuad4(void)
+{}
+
+
+// End of file

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_faults_cohesivedynldataquad4_hh)
+#define pylith_faults_cohesivedynldataquad4_hh
+
+#include "CohesiveDynData.hh"
+
+namespace pylith {
+  namespace faults {
+     class CohesiveDynDataQuad4;
+  } // pylith
+} // faults
+
+class pylith::faults::CohesiveDynDataQuad4 : public CohesiveDynData
+{
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public: 
+
+  /// Constructor
+  CohesiveDynDataQuad4(void);
+
+  /// Destructor
+  ~CohesiveDynDataQuad4(void);
+
+// PRIVATE MEMBERS //////////////////////////////////////////////////////
+private:
+
+  static const char* _meshFilename; ///< Filename of input mesh
+
+  static const int _spaceDim; ///< Number of dimensions in vertex coordinates
+  static const int _cellDim; ///< Number of dimensions associated with cell
+
+  static const int _numBasis; ///< Number of vertices in cell
+  static const int _numQuadPts; ///< Number of quadrature points
+  static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
+  static const double _quadWts[]; ///< Weights of quadrature points
+  static const double _basis[]; ///< Basis fns at quadrature points
+  static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
+  static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
+
+  static const int _id; ///< Fault material identifier
+  static const char* _label; ///< Label for fault
+  static const char* _initialTractFilename; ///< Name of db for initial tractions.
+
+  static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
+  static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
+  static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
+  static const double _jacobian[]; ///< Jacobian sparse matrix.
+
+  static const double _orientation[]; ///< Expected values for fault orientation.
+  static const double _area[]; ///< Expected values for fault area.
+  static const double _initialTractions[]; ///< Expected values for initial tractions.
+  static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
+  static const double _slipSlipE[]; ///< Expected values for slip for slip case.
+  static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
+  static const double _slipOpenE[]; ///< Expected values for slip for opening case.
+  static const int _constraintVertices[]; ///< Expected points for constraint vertices
+  static const int _numConstraintVert; ///< Number of constraint vertices
+
+};
+
+#endif // pylith_faults_cohesivedynldataquad4_hh
+
+
+// End of file

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,630 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+
+/* Original mesh
+ *
+ * Cells are 0-1, vertices are 2-6.
+ *
+ * 2   3,4,5  6
+ *
+ *     ^^^^^ Face in x-y plane
+ *
+ * After adding cohesive elements
+ *
+ * Cells are 0-1,10, vertices are 2-9.
+ *
+ * 2   3,4,5  7,8,9   6
+ *             10,11,12
+ *     ^^^^^^^^^^^^ Cohesive element in x-y plane.
+ */
+
+#include "CohesiveDynDataTet4.hh"
+
+const char* pylith::faults::CohesiveDynDataTet4::_meshFilename =
+  "data/tet4.mesh";
+
+const int pylith::faults::CohesiveDynDataTet4::_spaceDim = 3;
+
+const int pylith::faults::CohesiveDynDataTet4::_cellDim = 2;
+
+const int pylith::faults::CohesiveDynDataTet4::_numBasis = 3;
+
+const int pylith::faults::CohesiveDynDataTet4::_numQuadPts = 1;
+
+const double pylith::faults::CohesiveDynDataTet4::_quadPts[] = {
+  3.33333333e-01,  3.33333333e-01,
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_quadWts[] = {
+  5.00000000e-01,
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_basis[] = {
+  3.33333333e-01,  3.33333333e-01,
+  3.33333333e-01,};
+
+const double pylith::faults::CohesiveDynDataTet4::_basisDeriv[] = {
+ -1.00000000e+00, -1.00000000e+00,
+  1.00000000e+00,  0.00000000e+00,
+  0.00000000e+00,  1.00000000e+00,
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_verticesRef[] = {
+ -1.00000000e+00, -1.00000000e+00,
+  1.00000000e+00, -1.00000000e+00,
+ -1.00000000e+00,  1.00000000e+00,
+};
+
+const int pylith::faults::CohesiveDynDataTet4::_id = 10;
+
+const char* pylith::faults::CohesiveDynDataTet4::_label = "fault";
+
+const char* pylith::faults::CohesiveDynDataTet4::_initialTractFilename = 
+  "data/tet4_initialtract.spatialdb";
+
+const double pylith::faults::CohesiveDynDataTet4::_fieldT[] = {
+  7.1, 8.1, 9.1,
+  7.2, 8.2, 9.2, // 3
+  7.3, 8.3, 9.3, // 4
+  7.4, 8.4, 9.4, // 5
+  7.5, 8.5, 9.5,
+  7.6, 8.6, 9.6, // 7
+  7.8, 8.8, 9.8, // 8
+  7.0, 8.0, 9.0, // 9
+  7.7, 8.7, 9.7, // 10
+  7.9, 8.9, 9.9, // 11
+  7.1, 8.1, 9.1, // 12
+};
+
+// :TODO: Make sensible values for Jacobian for DOF on positive and
+// negative sides of the fault. Add semi-random values for other DOF.
+const double pylith::faults::CohesiveDynDataTet4::_jacobian[] = {
+    1,  0.1,  0.2,
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,    1,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,    2,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+    3,  3.1,  3.2,
+  3.3,    1,  3.4,
+  3.5,  3.6,  3.7,
+  3.8,  3.9,    4,
+  4.1,  4.2,  4.3,
+  4.4,  4.5,  4.6,
+  4.7,  4.8,  4.9,
+    5,  5.1,  5.2,
+  5.3,  5.4,  5.5,
+  5.6,  5.7,  5.8,
+  5.9,    6,  6.1,
+  6.2,  6.3,  6.4,
+  6.5,  6.6,    1,
+  6.7,  6.8,  6.9,
+    7,  7.1,  7.2,
+  7.3,  7.4,  7.5,
+  7.6,  7.7,  7.8,
+  7.9,    8,  8.1,
+  8.2,  8.3,  8.4,
+  8.5,  8.6,  8.7,
+  8.8,  8.9,    9,
+  9.1,  9.2,  9.3,
+  9.4,  9.5,  9.6,
+  9.7,  9.8,  9.9,
+    1,   10, 10.1,
+ 10.2, 10.3, 10.4,
+ 10.5, 10.6, 10.7,
+ 10.8, 10.9,   11,
+ 11.1, 11.2, 11.3,
+ 11.4, 11.5, 11.6,
+ 11.7, 11.8, 11.9,
+   12, 12.1,   -1,
+ 12.2, 12.3, 12.4,
+ 12.5, 12.6, 12.7,
+ 12.8, 12.9,   13,
+ 13.1,    1, 13.2,
+ 13.3, 13.4, 13.5,
+ 13.6, 13.7, 13.8,
+ 13.9,   14, 14.1,
+ 14.2, 14.3, 14.4,
+ 14.5, 14.6, 14.7,
+ 14.8, 14.9,   15,
+   -1, 15.1, 15.2,
+ 15.3, 15.4, 15.5,
+ 15.6, 15.7, 15.8,
+ 15.9,   16, 16.1,
+ 16.2, 16.3,    1,
+ 16.4, 16.5, 16.6,
+ 16.7, 16.8, 16.9,
+   17, 17.1, 17.2,
+ 17.3, 17.4, 17.5,
+ 17.6, 17.7, 17.8,
+ 17.9,   18, 18.1,
+ 18.2,   -1, 18.3,
+ 18.4, 18.5, 18.6,
+ 18.7, 18.8, 18.9,
+   19, 19.1, 19.2,
+ 19.3, 19.4, 19.5,
+    1, 19.6, 19.7,
+ 19.8, 19.9,   20,
+ 20.1, 20.2, 20.3,
+ 20.4, 20.5, 20.6,
+ 20.7, 20.8, 20.9,
+   21, 21.1, 21.2,
+ 21.3, 21.4, 21.5,
+ 21.6, 21.7,   -1,
+ 21.8, 21.9,   22,
+ 22.1, 22.2, 22.3,
+ 22.4, 22.5, 22.6,
+ 22.7,    1, 22.8,
+ 22.9,   23, 23.1,
+ 23.2, 23.3, 23.4,
+ 23.5, 23.6, 23.7,
+ 23.8, 23.9,   24,
+ 24.1, 24.2, 24.3,
+ 24.4, 24.5, 24.6,
+   -1, 24.7, 24.8,
+ 24.9,   25, 25.1,
+ 25.2, 25.3, 25.4,
+ 25.5, 25.6, 25.7,
+ 25.8, 25.9,    1,
+   26, 26.1, 26.2,
+ 26.3, 26.4, 26.5,
+ 26.6, 26.7, 26.8,
+ 26.9,   27, 27.1,
+ 27.2, 27.3, 27.4,
+ 27.5, 27.6, 27.7,
+ 27.8,   -1, 27.9,
+   28, 28.1, 28.2,
+ 28.3, 28.4, 28.5,
+ 28.6, 28.7, 28.8,
+ 28.9,   29, 29.1,
+    1, 29.2, 29.3,
+ 29.4, 29.5, 29.6,
+ 29.7, 29.8, 29.9,
+   30, 30.1, 30.2,
+ 30.3, 30.4, 30.5,
+ 30.6, 30.7, 30.8,
+ 30.9,   31, 31.1,
+ 31.2, 31.3,   -1,
+ 31.4, 31.5, 31.6,
+ 31.7, 31.8, 31.9,
+   32, 32.1, 32.2,
+ 32.3,    1, 32.4,
+ 32.5, 32.6, 32.7,
+ 32.8, 32.9,   33,
+ 33.1, 33.2, 33.3,
+ 33.4, 33.5, 33.6,
+ 33.7, 33.8, 33.9,
+   34, 34.1, 34.2,
+   -1, 34.3, 34.4,
+ 34.5, 34.6, 34.7,
+ 34.8, 34.9,   35,
+ 35.1, 35.2, 35.3,
+ 35.4, 35.5,    1,
+ 35.6, 35.7, 35.8,
+ 35.9,   36, 36.1,
+ 36.2, 36.3, 36.4,
+ 36.5, 36.6, 36.7,
+ 36.8, 36.9,   37,
+ 37.1, 37.2, 37.3,
+ 37.4,   -1, 37.5,
+ 37.6, 37.7, 37.8,
+ 37.9,   38, 38.1,
+ 38.2, 38.3, 38.4,
+ 38.5, 38.6, 38.7,
+    1, 38.8, 38.9,
+   39, 39.1, 39.2,
+ 39.3, 39.4, 39.5,
+ 39.6, 39.7, 39.8,
+ 39.9,   40, 40.1,
+ 40.2, 40.3, 40.4,
+ 40.5, 40.6, 40.7,
+ 40.8, 40.9,   41,
+ 41.1, 41.2, 41.3,
+ 41.4, 41.5, 41.6,
+ 41.7, 41.8, 41.9,
+   42,    1, 42.1,
+ 42.2, 42.3, 42.4,
+ 42.5, 42.6, 42.7,
+ 42.8, 42.9,   43,
+ 43.1, 43.2, 43.3,
+ 43.4, 43.5, 43.6,
+ 43.7, 43.8, 43.9,
+   44, 44.1, 44.2,
+ 44.3, 44.4, 44.5,
+ 44.6, 44.7, 44.8,
+ 44.9,   45, 45.1,
+ 45.2, 45.3,    1,
+ 45.4, 45.5, 45.6,
+ 45.7, 45.8, 45.9,
+   46, 46.1, 46.2,
+ 46.3, 46.4, 46.5,
+ 46.6, 46.7, 46.8,
+ 46.9,   47, 47.1,
+ 47.2, 47.3, 47.4,
+ 47.5, 47.6, 47.7,
+ 47.8, 47.9,   48,
+ 48.1, 48.2, 48.3,
+ 48.4, 48.5, 48.6,
+    1, 48.7, 48.8,
+ 48.9,   49, 49.1,
+ 49.2, 49.3, 49.4,
+ 49.5, 49.6,    1,
+ 49.7, 49.8, 49.9,
+   50, 50.1, 50.2,
+ 50.3, 50.4, 50.5,
+ 50.6, 50.7, 50.8,
+ 50.9,   51, 51.1,
+ 51.2, 51.3, 51.4,
+ 51.5, 51.6, 51.7,
+ 51.8,    1, 51.9,
+   52, 52.1, 52.2,
+ 52.3, 52.4, 52.5,
+    1, 52.6, 52.7,
+ 52.8, 52.9,   53,
+ 53.1, 53.2, 53.3,
+ 53.4, 53.5, 53.6,
+ 53.7, 53.8, 53.9,
+   54, 54.1, 54.2,
+ 54.3, 54.4, 54.5,
+ 54.6, 54.7, 54.8,
+ 54.9,   55,    1,
+ 55.1, 55.2, 55.3,
+ 55.4, 55.5, 55.6,
+ 55.7,    1, 55.8,
+ 55.9,   56, 56.1,
+ 56.2, 56.3, 56.4,
+ 56.5, 56.6, 56.7,
+ 56.8, 56.9,   57,
+ 57.1, 57.2, 57.3,
+ 57.4, 57.5, 57.6,
+ 57.7, 57.8, 57.9,
+   58, 58.1, 58.2,
+    1, 58.3, 58.4,
+ 58.5, 58.6, 58.7,
+ 58.8, 58.9,   59,
+ 59.1, 59.2,    1,
+ 59.3, 59.4, 59.5,
+ 59.6, 59.7, 59.8,
+ 59.9,   60, 60.1,
+ 60.2, 60.3, 60.4,
+ 60.5, 60.6, 60.7,
+ 60.8, 60.9,   61,
+ 61.1, 61.2, 61.3,
+ 61.4,    1, 61.5,
+ 61.6, 61.7, 61.8,
+ 61.9,   62, 62.1,
+    1, 62.2, 62.3,
+ 62.4, 62.5, 62.6,
+ 62.7, 62.8, 62.9,
+   63, 63.1, 63.2,
+ 63.3, 63.4, 63.5,
+ 63.6, 63.7, 63.8,
+ 63.9,   64, 64.1,
+ 64.2, 64.3, 64.4,
+ 64.5, 64.6,    1,
+ 64.7, 64.8, 64.9,
+   65, 65.1, 65.2,
+ 65.3,    1, 65.4,
+ 65.5, 65.6, 65.7,
+ 65.8, 65.9,   66,
+ 66.1, 66.2, 66.3,
+ 66.4, 66.5, 66.6,
+ 66.7, 66.8, 66.9,
+   67, 67.1, 67.2,
+ 67.3, 67.4, 67.5,
+ 67.6, 67.7, 67.8,
+    1, 67.9,   68,
+ 68.1, 68.2, 68.3,
+ 68.4, 68.5, 68.6,
+ 68.7, 68.8,    1,
+ 68.9,   69, 69.1,
+ 69.2, 69.3, 69.4,
+ 69.5, 69.6, 69.7,
+ 69.8, 69.9,   70,
+ 70.1, 70.2, 70.3,
+ 70.4, 70.5, 70.6,
+ 70.7, 70.8, 70.9,
+   71,    1, 71.1,
+ 71.2, 71.3, 71.4,
+ 71.5, 71.6, 71.7,
+    1, 71.8, 71.9,
+   72, 72.1, 72.2,
+ 72.3, 72.4, 72.5,
+ 72.6, 72.7, 72.8,
+ 72.9,   73, 73.1,
+ 73.2, 73.3, 73.4,
+ 73.5, 73.6, 73.7,
+ 73.8, 73.9,   74,
+ 74.1, 74.2,    1,
+ 74.3, 74.4, 74.5,
+ 74.6, 74.7, 74.8,
+ 74.9,    1,   75,
+ 75.1, 75.2, 75.3,
+ 75.4,   -1, 75.5,
+ 75.6, 75.7, 75.8,
+ 75.9,   76, 76.1,
+ 76.2, 76.3, 76.4,
+ 76.5,    1, 76.6,
+ 76.7, 76.8, 76.9,
+   77, 77.1, 77.2,
+ 77.3, 77.4, 77.5,
+ 77.6, 77.7, 77.8,
+ 77.9,   78, 78.1,
+ 78.2, 78.3, 78.4,
+ 78.5, 78.6,   -1,
+ 78.7, 78.8, 78.9,
+   79, 79.1, 79.2,
+ 79.3, 79.4, 79.5,
+ 79.6, 79.7,    1,
+ 79.8, 79.9,   80,
+ 80.1, 80.2, 80.3,
+ 80.4, 80.5, 80.6,
+ 80.7, 80.8, 80.9,
+   81, 81.1, 81.2,
+ 81.3, 81.4, 81.5,
+   -1, 81.6, 81.7,
+ 81.8, 81.9,   82,
+ 82.1, 82.2, 82.3,
+ 82.4, 82.5, 82.6,
+    1, 82.7, 82.8,
+ 82.9,   83, 83.1,
+ 83.2, 83.3, 83.4,
+ 83.5, 83.6, 83.7,
+ 83.8, 83.9,   84,
+ 84.1, 84.2, 84.3,
+ 84.4, 84.5, 84.6,
+ 84.7, 84.8, 84.9,
+   85,   -1, 85.1,
+ 85.2, 85.3, 85.4,
+ 85.5, 85.6, 85.7,
+ 85.8, 85.9,   86,
+ 86.1,    1, 86.2,
+ 86.3, 86.4, 86.5,
+ 86.6, 86.7, 86.8,
+ 86.9,   87, 87.1,
+ 87.2, 87.3, 87.4,
+ 87.5, 87.6, 87.7,
+ 87.8, 87.9,   88,
+ 88.1, 88.2,   -1,
+ 88.3, 88.4, 88.5,
+ 88.6, 88.7, 88.8,
+ 88.9,   89, 89.1,
+ 89.2, 89.3,    1,
+ 89.4, 89.5, 89.6,
+ 89.7, 89.8, 89.9,
+   90, 90.1, 90.2,
+ 90.3, 90.4, 90.5,
+ 90.6, 90.7, 90.8,
+ 90.9,   91, 91.1,
+   -1, 91.2, 91.3,
+ 91.4, 91.5, 91.6,
+ 91.7, 91.8, 91.9,
+   92, 92.1, 92.2,
+    1, 92.3, 92.4,
+ 92.5, 92.6, 92.7,
+ 92.8, 92.9,   93,
+ 93.1, 93.2, 93.3,
+ 93.4, 93.5, 93.6,
+ 93.7, 93.8, 93.9,
+   94, 94.1, 94.2,
+ 94.3, 94.4, 94.5,
+ 94.6,   -1, 94.7,
+ 94.8, 94.9,   95,
+ 95.1, 95.2, 95.3,
+ 95.4, 95.5, 95.6,
+ 95.7,    1, 95.8,
+ 95.9,   96, 96.1,
+ 96.2, 96.3, 96.4,
+ 96.5, 96.6, 96.7,
+ 96.8, 96.9,   97,
+ 97.1, 97.2, 97.3,
+ 97.4, 97.5, 97.6,
+ 97.7, 97.8,   -1,
+ 97.9,   98, 98.1,
+ 98.2, 98.3, 98.4,
+ 98.5, 98.6, 98.7,
+ 98.8, 98.9,    1,
+   99, 99.1, 99.2,
+ 99.3, 99.4, 99.5,
+ 99.6, 99.7, 99.8,
+ 99.9,  100,100.1,
+100.2,100.3,100.4,
+100.5,100.6,100.7,
+   -1,100.8,100.9,
+  101,101.1,101.2,
+101.3,101.4,101.5,
+101.6,101.7,101.8,
+    1,101.9,  102,
+102.1,102.2,102.3,
+102.4,102.5,102.6,
+102.7,102.8,102.9,
+};
+
+// ----------------------------------------------------------------------
+// Computed values
+// ----------------------------------------------------------------------
+
+const double pylith::faults::CohesiveDynDataTet4::_orientation[] = {
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_area[] = {
+  1.0/3.0, 
+  1.0/3.0, 
+  1.0/3.0,
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_initialTractions[] = {
+  1.0, 2.0, -3.0,
+  1.1, 2.1, -3.1,
+  1.2, 2.2, -3.2,
+};
+
+
+const int pylith::faults::CohesiveDynDataTet4::_numConstraintVert = 3;
+const int pylith::faults::CohesiveDynDataTet4::_constraintVertices[] = {
+  10, 11, 12
+};
+
+// ----------------------------------------------------------------------
+// Stick case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTet4::_fieldIncrStick[] = {
+  1.1, 2.1, 35.1,
+  1.2, 2.2, 35.2, // 3
+  1.3, 2.3, 35.3, // 4
+  1.4, 2.4, 35.4, // 5
+  1.5, 2.5, 35.5,
+  1.6, 2.6, 35.6, // 7
+  1.8, 2.8, 35.8, // 8
+  1.0, 2.0, 35.0, // 9
+  1.7, 2.7, -35.7, // 10
+  1.9, 2.9, -35.9, // 11
+  1.1, 2.1, -35.1, // 12
+};
+
+// No change in fieldIncr
+// Zero slip
+
+// ----------------------------------------------------------------------
+// Slip case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTet4::_fieldIncrSlip[] = {
+  8.1, 9.1, 10.1,
+  8.2, 9.2, 10.2, // 3
+  8.3, 9.3, 10.3, // 4
+  8.4, 9.4, 10.4, // 5
+  8.5, 9.5, 10.5,
+  8.6, 9.6, 10.6, // 7
+  8.8, 9.8, 10.8, // 8
+  8.0, 9.0, 10.0, // 9
+  8.7, 9.7, -10.7, // 10
+  8.9, 9.9, -10.9, // 11
+  8.1, 9.1, -10.1, // 12
+};
+
+// Output
+// :TODO: Update Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataTet4::_fieldIncrSlipE[] = {
+  8.1, 9.1, 10.1,
+  8.2, 9.2, 10.2, // 3
+  8.3, 9.3, 10.3, // 4
+  8.4, 9.4, 10.4, // 5
+  8.5, 9.5, 10.5,
+  8.6, 9.6, 10.6, // 7
+  8.8, 9.8, 10.8, // 8
+  8.0, 9.0, 10.0, // 9
+  -6.90156, -7.80418, -10.7, // 10
+  -7.08708, -7.9903, -10.9, // 11
+  -6.27887, -7.17083, -10.1, // 12
+};
+
+// :TODO: Update slip values based on changes in Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataTet4::_slipSlipE[] = {
+  31.203110740589327,  35.008368147978267,                   0.0,
+  31.974152400186210,  35.780599114494088,                   0.0,
+  28.757749464750159,  32.541663868006758,                   0.0,
+};
+
+// ----------------------------------------------------------------------
+// Open case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTet4::_fieldIncrOpen[] = {
+  8.1, 9.1, 10.1,
+  8.2, 9.2, 10.2, // 3
+  8.3, 9.3, 10.3, // 4
+  8.4, 9.4, 10.4, // 5
+  8.5, 9.5, 10.5,
+  8.6, 9.6, 10.6, // 7
+  8.8, 9.8, 10.8, // 8
+  8.0, 9.0, 10.0, // 9
+  8.7, 9.7, 10.7, // 10
+  8.9, 9.9, 10.9, // 11
+  8.1, 9.1, 10.1, // 12
+};
+
+// Output
+const double pylith::faults::CohesiveDynDataTet4::_fieldIncrOpenE[] = {
+  8.1, 9.1, 10.1,
+  8.2, 9.2, 10.2, // 3
+  8.3, 9.3, 10.3, // 4
+  8.4, 9.4, 10.4, // 5
+  8.5, 9.5, 10.5,
+  8.6, 9.6, 10.6, // 7
+  8.8, 9.8, 10.8, // 8
+  8.0, 9.0, 10.0, // 9
+  -7.7, -8.7, -9.7, // 10
+  -7.9, -8.9, -9.9, // 11
+  -7.1, -8.1, -9.1, // 12
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_slipOpenE[] = {
+  32.8, 36.8, 40.8,
+  33.6, 37.6, 41.6,
+  30.4, 34.4, 38.4,
+};
+
+// ----------------------------------------------------------------------
+pylith::faults::CohesiveDynDataTet4::CohesiveDynDataTet4(void)
+{ // constructor
+  meshFilename = const_cast<char*>(_meshFilename);
+  spaceDim = _spaceDim;
+  cellDim = _cellDim;
+  numBasis = _numBasis;
+  numQuadPts = _numQuadPts;
+  quadPts = const_cast<double*>(_quadPts);
+  quadWts = const_cast<double*>(_quadWts);
+  basis = const_cast<double*>(_basis);
+  basisDeriv = const_cast<double*>(_basisDeriv);
+  verticesRef = const_cast<double*>(_verticesRef);
+  id = _id;
+  label = const_cast<char*>(_label);
+  initialTractFilename = const_cast<char*>(_initialTractFilename);
+
+  fieldT = const_cast<double*>(_fieldT);
+  jacobian = const_cast<double*>(_jacobian);
+  orientation = const_cast<double*>(_orientation);
+  area = const_cast<double*>(_area);
+  initialTractions = const_cast<double*>(_initialTractions);
+
+  constraintVertices = const_cast<int*>(_constraintVertices);
+  numConstraintVert = _numConstraintVert;  
+
+  // Stick
+  fieldIncrStick = const_cast<double*>(_fieldIncrStick);
+
+  // Slip
+  fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
+  fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
+  slipSlipE = const_cast<double*>(_slipSlipE);
+
+  // Open
+  fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
+  fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
+  slipOpenE = const_cast<double*>(_slipOpenE);
+} // constructor
+
+pylith::faults::CohesiveDynDataTet4::~CohesiveDynDataTet4(void)
+{}
+
+
+// End of file

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_faults_cohesivedynldatatet4_hh)
+#define pylith_faults_cohesivedynldatatet4_hh
+
+#include "CohesiveDynData.hh"
+
+namespace pylith {
+  namespace faults {
+     class CohesiveDynDataTet4;
+  } // pylith
+} // faults
+
+class pylith::faults::CohesiveDynDataTet4 : public CohesiveDynData
+{
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public: 
+
+  /// Constructor
+  CohesiveDynDataTet4(void);
+
+  /// Destructor
+  ~CohesiveDynDataTet4(void);
+
+// PRIVATE MEMBERS //////////////////////////////////////////////////////
+private:
+
+  static const char* _meshFilename; ///< Filename of input mesh
+
+  static const int _spaceDim; ///< Number of dimensions in vertex coordinates
+  static const int _cellDim; ///< Number of dimensions associated with cell
+
+  static const int _numBasis; ///< Number of vertices in cell
+  static const int _numQuadPts; ///< Number of quadrature points
+  static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
+  static const double _quadWts[]; ///< Weights of quadrature points
+  static const double _basis[]; ///< Basis fns at quadrature points
+  static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
+  static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
+
+  static const int _id; ///< Fault material identifier
+  static const char* _label; ///< Label for fault
+  static const char* _initialTractFilename; ///< Name of db for initial tractions.
+
+  static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
+  static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
+  static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
+  static const double _jacobian[]; ///< Jacobian sparse matrix.
+
+  static const double _orientation[]; ///< Expected values for fault orientation.
+  static const double _area[]; ///< Expected values for fault area.
+  static const double _initialTractions[]; ///< Expected values for initial tractions.
+  static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
+  static const double _slipSlipE[]; ///< Expected values for slip for slip case.
+  static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
+  static const double _slipOpenE[]; ///< Expected values for slip for opening case.
+  static const int _constraintVertices[]; ///< Expected points for constraint vertices
+  static const int _numConstraintVert; ///< Number of constraint vertices
+
+};
+
+#endif // pylith_faults_cohesivedynldatatet4_hh
+
+
+// End of file

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,388 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+/* Original mesh using Sieve labels.
+ *
+ * Cells are 0-1, vertices are 2-5.
+ *
+ *              3
+ *             /|\
+ *            / | \
+ *           /  |  \
+ *          /   |   \
+ *         2    |    5
+ *          \   |   /
+ *           \  |  /
+ *            \ | /
+ *             \|/
+ *              4
+ *
+ *
+ * After adding cohesive elements using Sieve labels.
+ *
+ * Cells are 0-1, 8, vertices are 2-7.
+ *
+ *              6 -8- 3
+ *             /|     |\
+ *            / |     | \
+ *           /  |     |  \
+ *          /   |     |   \
+ *         2    |     |    5
+ *          \   |     |   /
+ *           \  |     |  /
+ *            \ |     | /
+ *             \|     |/
+ *              7 -9- 4
+ */
+
+#include "CohesiveDynDataTri3.hh"
+
+const char* pylith::faults::CohesiveDynDataTri3::_meshFilename =
+  "data/tri3.mesh";
+
+const int pylith::faults::CohesiveDynDataTri3::_spaceDim = 2;
+
+const int pylith::faults::CohesiveDynDataTri3::_cellDim = 1;
+
+const int pylith::faults::CohesiveDynDataTri3::_numBasis = 2;
+
+const int pylith::faults::CohesiveDynDataTri3::_numQuadPts = 1;
+
+const double pylith::faults::CohesiveDynDataTri3::_quadPts[] = {
+  0.0,
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_quadWts[] = {
+  2.0,
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_basis[] = {
+  0.5,
+  0.5
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_basisDeriv[] = {
+  -0.5,
+   0.5
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_verticesRef[] = {
+  -1.0, 1.0
+};
+
+const int pylith::faults::CohesiveDynDataTri3::_id = 10;
+
+const char* pylith::faults::CohesiveDynDataTri3::_label = "fault";
+
+const char* pylith::faults::CohesiveDynDataTri3::_initialTractFilename = 
+  "data/tri3_initialtract.spatialdb";
+
+const double pylith::faults::CohesiveDynDataTri3::_fieldT[] = {
+  8.1, 9.1,
+  8.2, 9.2, // 3
+  8.3, 9.3, // 4
+  8.4, 9.4,
+  8.5, 9.5, // 6
+  8.7, 9.7, // 7
+  8.6, 9.6, // 8
+  8.8, 9.8, // 9
+};
+
+// :TODO: Make sensible values for Jacobian for DOF on positive and
+// negative sides of the fault. Add semi-random values for other DOF.
+const double pylith::faults::CohesiveDynDataTri3::_jacobian[] = {
+  1.0, 1.1, // 2x (values for row associated with vertex with label 2, x DOF)
+  0.1, 1.2,
+  0.2, 1.3,
+  0.3, 1.4,
+  0.4, 1.5,
+  0.5, 1.6,
+  0.6, 1.7,
+  0.7, 1.8,
+  2.1, 1.0, // 2y
+  2.2, 3.1,
+  2.3, 3.2,
+  2.4, 3.3,
+  2.5, 3.4,
+  2.6, 3.5,
+  2.7, 3.6,
+  2.8, 3.7,
+  4.1, 5.1, // 3x (values for row associated with vertex label 3, x DOF)
+  1.0, 5.2,
+  4.2, 5.3,
+  4.3, 5.4,
+  4.4, 5.5,
+  4.5, 5.6,
+  4.6,+1.0, // 8 (column for DOF associated with vertex label 8)
+  4.7, 5.7,
+  6.1, 7.1, // 3y
+  6.2, 1.0,
+  6.3, 7.2,
+  6.4, 7.3,
+  6.5, 7.4,
+  6.6, 7.5,
+ +1.0, 7.6, //  8
+  6.7, 7.7,
+  8.1, 9.1, // 4x
+  8.2, 9.2,
+  1.0, 9.3,
+  8.3, 9.4,
+  8.4, 9.5,
+  8.5, 9.6,
+  8.6, 9.7,
+  8.7,+1.0, //  9
+  10.1, 11.1, // 4y
+  10.2, 11.2,
+  10.3, 1.0,
+  10.4, 11.3,
+  10.5, 11.4,
+  10.6, 11.5,
+  10.7, 11.6,
+ +1.0, 11.7, //  9
+  12.1, 13.1, // 5x
+  12.2, 13.2,
+  12.3, 13.3,
+  1.0, 13.4,
+  12.4, 13.5,
+  12.5, 13.6,
+  12.6, 13.7,
+  12.7, 13.8,
+  14.1, 15.1, // 5y
+  14.2, 15.2,
+  14.3, 15.3,
+  14.4, 1.0,
+  14.5, 15.4,
+  14.6, 15.5,
+  14.7, 15.6,
+  14.8, 15.7,
+  16.1, 17.1, // 6x
+  16.2, 17.2,
+  16.3, 17.3,
+  16.4, 17.4,
+  1.0, 17.5,
+  16.5, 17.6,
+  16.6,-1.0, //  8
+  16.7, 17.7,
+  18.1, 19.1, // 6y
+  18.2, 19.2,
+  18.3, 19.3,
+  18.4, 19.4,
+  18.5, 1.0,
+  18.6, 19.5,
+ -1.0, 19.6, //  8
+  18.7, 19.7,
+  20.1, 21.1, // 7x
+  20.2, 21.2,
+  20.3, 21.3,
+  20.4, 21.4,
+  20.5, 21.5,
+  1.0, 21.6,
+  20.6, 21.7,
+  20.7,-1.0, //  9
+  22.1, 23.1, // 7y
+  22.2, 23.2,
+  22.3, 23.3,
+  22.4, 23.4,
+  22.5, 23.5,
+  22.6, 1.0,
+  22.7, 23.6,
+ -1.0, 23.7, //  9
+
+  24.1, 25.1, // 8x (rows associated with Lagrange multiplier vertex label 8)
+  24.2,+1.0, //  3
+  24.3, 25.2,
+  24.4, 25.3,
+  24.5,-1.0, //  6
+  24.6, 25.4,
+  24.7, 25.5,
+  24.8, 25.6,
+  26.1, 27.1, // 8y
+ +1.0, 27.2, //  3
+  26.2, 27.3,
+  26.3, 27.4,
+ -1.0, 27.5, //  6
+  26.4, 27.6,
+  26.5, 27.7,
+  26.6, 27.8,
+
+  29.1, 30.1, // 9x
+  29.2, 30.2,
+  29.3,+1.0, //  4
+  29.4, 30.3,
+  29.5, 30.4,
+  29.6,-1.0, //  7
+  29.7, 30.5,
+  29.8, 30.6,
+  31.1, 32.1, // 9y
+  31.2, 32.2,
+ +1.0, 32.3, //  4
+  31.3, 32.4,
+  31.4, 32.5,
+ -1.0, 32.6, //  7
+  31.5, 32.7,
+  31.6, 32.8,
+};
+
+// ----------------------------------------------------------------------
+// Computed values
+// ----------------------------------------------------------------------
+
+const double pylith::faults::CohesiveDynDataTri3::_orientation[] = {
+  0.0, -1.0,  -1.0, 0.0,
+  0.0, -1.0,  -1.0, 0.0
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_area[] = {
+  1.0,
+  1.0,
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_initialTractions[] = {
+  1.0, -2.0,
+  1.1, -2.1,
+};
+
+
+const int pylith::faults::CohesiveDynDataTri3::_numConstraintVert = 2;
+const int pylith::faults::CohesiveDynDataTri3::_constraintVertices[] = {
+  8, 9
+};
+
+// ----------------------------------------------------------------------
+// Stick case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTri3::_fieldIncrStick[] = {
+  1.1, 29.1,
+  1.2, 29.2, // 3
+  1.3, 29.3, // 4
+  1.4, 29.4,
+  1.5, 29.5, // 6
+  1.7, 29.7, // 7
+  1.6, -29.6, // 8
+  1.8, -29.8, // 9
+};
+
+// No change in fieldIncr
+// Zero slip
+
+// ----------------------------------------------------------------------
+// Slip case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTri3::_fieldIncrSlip[] = {
+  9.1, 10.1,
+  9.2, 10.2, // 3
+  9.3, 10.3, // 4
+  9.4, 10.4,
+  9.5, 10.5, // 6
+  9.7, 10.7, // 7
+  9.6, -10.6, // 8
+  9.8, -10.8, // 9
+};
+
+// Output
+// :TODO: Update Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataTri3::_fieldIncrSlipE[] = {
+  9.1, 10.1,
+  9.2, 10.2, // 3
+  9.3, 10.3, // 4
+  9.4, 10.4,
+  9.5, 10.5, // 6
+  9.7, 10.7, // 7
+  -6.8, -10.6, // 8
+  -6.94, -10.8, // 9
+};
+
+// :TODO: Update slip values based on changes in Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataTri3::_slipSlipE[] = {
+  32.8, 0.0,
+  33.48, 0.0,
+};
+
+// ----------------------------------------------------------------------
+// Open case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTri3::_fieldIncrOpen[] = {
+  9.1, 10.1,
+  9.2, 10.2, // 3
+  9.3, 10.3, // 4
+  9.4, 10.4,
+  9.5, 10.5, // 6
+  9.7, 10.7, // 7
+  9.6, 10.6, // 8
+  9.8, 10.8, // 9
+};
+
+// Output
+const double pylith::faults::CohesiveDynDataTri3::_fieldIncrOpenE[] = {
+  9.1, 10.1,
+  9.2, 10.2, // 3
+  9.3, 10.3, // 4
+  9.4, 10.4,
+  9.5, 10.5, // 6
+  9.7, 10.7, // 7
+  -8.6, -9.6, // 8
+  -8.8, -9.8, // 9
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_slipOpenE[] = {
+  36.4, 40.4,
+  37.2, 41.2,
+};
+
+// ----------------------------------------------------------------------
+pylith::faults::CohesiveDynDataTri3::CohesiveDynDataTri3(void)
+{ // constructor
+  meshFilename = const_cast<char*>(_meshFilename);
+  spaceDim = _spaceDim;
+  cellDim = _cellDim;
+  numBasis = _numBasis;
+  numQuadPts = _numQuadPts;
+  quadPts = const_cast<double*>(_quadPts);
+  quadWts = const_cast<double*>(_quadWts);
+  basis = const_cast<double*>(_basis);
+  basisDeriv = const_cast<double*>(_basisDeriv);
+  verticesRef = const_cast<double*>(_verticesRef);
+  id = _id;
+  label = const_cast<char*>(_label);
+  initialTractFilename = const_cast<char*>(_initialTractFilename);
+
+  fieldT = const_cast<double*>(_fieldT);
+  jacobian = const_cast<double*>(_jacobian);
+  orientation = const_cast<double*>(_orientation);
+  area = const_cast<double*>(_area);
+  initialTractions = const_cast<double*>(_initialTractions);
+
+  constraintVertices = const_cast<int*>(_constraintVertices);
+  numConstraintVert = _numConstraintVert;  
+
+  // Stick
+  fieldIncrStick = const_cast<double*>(_fieldIncrStick);
+
+  // Slip
+  fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
+  fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
+  slipSlipE = const_cast<double*>(_slipSlipE);
+
+  // Open
+  fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
+  fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
+  slipOpenE = const_cast<double*>(_slipOpenE);
+} // constructor
+
+pylith::faults::CohesiveDynDataTri3::~CohesiveDynDataTri3(void)
+{}
+
+
+// End of file

Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.hh	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_faults_cohesivedynldatatri3_hh)
+#define pylith_faults_cohesivedynldatatri3_hh
+
+#include "CohesiveDynData.hh"
+
+namespace pylith {
+  namespace faults {
+     class CohesiveDynDataTri3;
+  } // pylith
+} // faults
+
+class pylith::faults::CohesiveDynDataTri3 : public CohesiveDynData
+{
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public: 
+
+  /// Constructor
+  CohesiveDynDataTri3(void);
+
+  /// Destructor
+  ~CohesiveDynDataTri3(void);
+
+// PRIVATE MEMBERS //////////////////////////////////////////////////////
+private:
+
+  static const char* _meshFilename; ///< Filename of input mesh
+
+  static const int _spaceDim; ///< Number of dimensions in vertex coordinates
+  static const int _cellDim; ///< Number of dimensions associated with cell
+
+  static const int _numBasis; ///< Number of vertices in cell
+  static const int _numQuadPts; ///< Number of quadrature points
+  static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
+  static const double _quadWts[]; ///< Weights of quadrature points
+  static const double _basis[]; ///< Basis fns at quadrature points
+  static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
+  static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
+
+  static const int _id; ///< Fault material identifier
+  static const char* _label; ///< Label for fault
+  static const char* _initialTractFilename; ///< Name of db for initial tractions.
+
+  static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
+  static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
+  static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
+  static const double _jacobian[]; ///< Jacobian sparse matrix.
+
+  static const double _orientation[]; ///< Expected values for fault orientation.
+  static const double _area[]; ///< Expected values for fault area.
+  static const double _initialTractions[]; ///< Expected values for initial tractions.
+  static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
+  static const double _slipSlipE[]; ///< Expected values for slip for slip case.
+  static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
+  static const double _slipOpenE[]; ///< Expected values for slip for opening case.
+  static const int _constraintVertices[]; ///< Expected points for constraint vertices
+  static const int _numConstraintVert; ///< Number of constraint vertices
+
+};
+
+#endif // pylith_faults_cohesivedynldatatri3_hh
+
+
+// End of file

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,55 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#include "CohesiveDynLData.hh"
-
-// ----------------------------------------------------------------------
-// Constructor
-pylith::faults::CohesiveDynLData::CohesiveDynLData(void) :
-  meshFilename(0),
-  spaceDim(0),
-  cellDim(0),
-  numBasis(0),
-  numQuadPts(0),
-  quadPts(0),
-  quadWts(0),
-  basis(0),
-  basisDeriv(0),
-  verticesRef(0),
-  id(0),
-  label(0),
-  initialTractFilename(0),
-  fieldT(0),
-  fieldIncrStick(0),
-  fieldIncrSlip(0),
-  fieldIncrOpen(0),
-  jacobian(0),
-  orientation(0),
-  initialTractions(0),
-  area(0),
-  fieldIncrSlipE(0),
-  slipSlipE(0),
-  fieldIncrOpenE(0),
-  slipOpenE(0),
-  constraintVertices(0),
-  numConstraintVert(0)
-{ // constructor
-} // constructor
-
-// ----------------------------------------------------------------------
-// Destructor
-pylith::faults::CohesiveDynLData::~CohesiveDynLData(void)
-{ // destructor
-} // destructor
-
-
-// End of file

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,86 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#if !defined(pylith_faults_cohesivedynldata_hh)
-#define pylith_faults_cohesivedynldata_hh
-
-namespace pylith {
-  namespace faults {
-     class CohesiveDynLData;
-  } // pylith
-} // faults
-
-class pylith::faults::CohesiveDynLData
-{
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public :
-  
-  /// Constructor
-  CohesiveDynLData(void);
-
-  /// Destructor
-  ~CohesiveDynLData(void);
-
-// PUBLIC MEMBERS ///////////////////////////////////////////////////////
-public:
-
-  char* meshFilename; ///< Filename for input mesh
-
-  /// @name Quadrature information
-  //@{
-  int spaceDim; ///< Number of dimensions in vertex coordinates
-  int cellDim; ///< Number of dimensions associated with cell
-  int numBasis; ///< Number of vertices in cell
-  int numQuadPts; ///< Number of quadrature points
-  double* quadPts; ///< Coordinates of quad pts in ref cell
-  double* quadWts; ///< Weights of quadrature points
-  double* basis; ///< Basis fns at quadrature points
-  double* basisDeriv; ///< Derivatives of basis fns at quad pts
-  double* verticesRef; ///< Coordinates of vertices in ref cell (dual basis)
-  //@}
-
-  /// @name Fault information
-  //@{
-  int id; ///< Fault material identifier
-  char* label; ///< Label for fault
-  char* initialTractFilename; ///< Name of db for initial tractions.
-  //@}
-
-  /// @name Input fields
-  //@{
-  double* fieldT; ///< Solution field at time t.
-  double* fieldIncrStick; ///< Soln increment field at time t for stick case.
-  double* fieldIncrSlip; ///< Soln increment field at time t for slipping case.
-  double* fieldIncrOpen; ///< Soln increment field at time t for opening case.
-  double* jacobian; ///< Jacobian sparse matrix.
-  //@}
-
-  /// @name Calculated values.
-  //@{
-  double* orientation; ///< Expected values for fault orientation.
-  double* area; ///< Expected values for fault area.
-  double* initialTractions; ///< Expected values for initial tractions.
-  double* fieldIncrSlipE; ///< Expected values for solution increment for slipping case.
-  double* slipSlipE; ///< Expected values for slip for slipping case.
-  double* fieldIncrOpenE; ///< Expected values for solution increment for opening case.
-  double* slipOpenE; ///< Expected values for slip for opening case.
-
-  int* constraintVertices; ///< Expected points for constraint vertices
-  int numConstraintVert; ///< Number of constraint vertices
-  //@}
-
-};
-
-#endif // pylith_faults_cohesivedynldata_hh
-
-// End of file

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,1546 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-
-/* Original mesh
- *
- * Cells are 0-1 and vertices are 2-13.
- *
- *       2,3,4,5 -------- 6,7,8,9 -------- 10,11,12,13
- *
- *                        ^^^^^^^ Vertices forming fault
- *
- * After adding cohesive elements
- *
- * Cells are 0-1,16 and vertices are 4-15.
- *
- *       2,3,4,5 -------- 6,7,8,9 -- 14,15,16,17 -------- 10,11,12,13
- *                                    18,19,20,21
- *                        ^^^^^^^^^^^^^^^^^^^^^^ Cohesive element
- *
- */
-
-#include "CohesiveDynLDataHex8.hh"
-
-const char* pylith::faults::CohesiveDynLDataHex8::_meshFilename =
-  "data/hex8.mesh";
-
-const int pylith::faults::CohesiveDynLDataHex8::_spaceDim = 3;
-
-const int pylith::faults::CohesiveDynLDataHex8::_cellDim = 2;
-
-const int pylith::faults::CohesiveDynLDataHex8::_numBasis = 4;
-
-const int pylith::faults::CohesiveDynLDataHex8::_numQuadPts = 4;
-
-const double pylith::faults::CohesiveDynLDataHex8::_quadPts[] = {
-  -0.57735027, -0.57735027,
-  +0.57735027, -0.57735027,
-  +0.57735027, +0.57735027,
-  -0.57735027, +0.57735027,
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_quadWts[] = {
-  1.0, 1.0, 1.0, 1.0
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_basis[] = {
-  0.62200847,  0.16666667,  0.16666667,  0.0446582,
-  0.16666667,  0.62200847,  0.0446582,   0.16666667,
-  0.16666667,  0.0446582,   0.62200847,  0.16666667,
-  0.0446582,   0.16666667,  0.16666667,  0.62200847,
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_basisDeriv[] = {
-  -0.39433757, -0.39433757,
-  +0.39433757, -0.10566243,
-  +0.10566243, +0.10566243,
-  -0.10566243, +0.39433757,
-
-  -0.39433757, -0.10566243,
-  +0.39433757, -0.39433757,
-  +0.10566243, +0.39433757,
-  -0.10566243, +0.10566243,
-
-  -0.10566243, -0.10566243,
-  +0.10566243, -0.39433757,
-  +0.39433757, +0.39433757,
-  -0.39433757, +0.10566243,
-
-  -0.10566243, -0.39433757,
-  +0.10566243, -0.10566243,
-  +0.39433757, +0.10566243,
-  -0.39433757, +0.39433757,
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_verticesRef[] = {
-  -1.0, -1.0,
-  +1.0, -1.0,
-  +1.0, +1.0,
-  -1.0, +1.0
-};
-
-const int pylith::faults::CohesiveDynLDataHex8::_id = 10;
-
-const char* pylith::faults::CohesiveDynLDataHex8::_label = "fault";
-
-const char* pylith::faults::CohesiveDynLDataHex8::_initialTractFilename = 
-  "data/hex8_initialtract.spatialdb";
-
-const double pylith::faults::CohesiveDynLDataHex8::_fieldT[] = {
-  4.1, 6.1, 8.1,
-  4.2, 6.2, 8.2,
-  4.3, 6.3, 8.3,
-  4.4, 6.4, 8.4,
-  4.5, 6.5, 8.5, // 6
-  4.6, 6.6, 8.6, // 7
-  4.7, 6.7, 8.7, // 8
-  4.8, 6.8, 8.8, // 9
-  4.9, 6.9, 8.9,
-  4.0, 6.0, 8.0,
-  5.1, 7.1, 9.1,
-  5.2, 7.2, 9.2,
-  5.3, 7.3, 9.3, // 14
-  5.5, 7.5, 9.5, // 15
-  5.7, 7.7, 9.7, // 16
-  5.9, 7.9, 9.9, // 17
-  5.4, 7.4, 9.4, // 18
-  5.6, 7.6, 9.6, // 19
-  5.8, 7.8, 9.8, // 20
-  5.0, 7.0, 9.0, // 21
-};
-
-// :TODO: Make sensible values for Jacobian for DOF on positive and
-// negative sides of the fault. Add semi-random values for other DOF.
-const double pylith::faults::CohesiveDynLDataHex8::_jacobian[] = {
-    1,  0.1,  0.2,
-  0.3,  0.4,  0.5,
-  0.6,  0.7,  0.8,
-  0.9,    1,  1.1,
-  1.2,  1.3,  1.4,
-  1.5,  1.6,  1.7,
-  1.8,  1.9,    2,
-  2.1,  2.2,  2.3,
-  2.4,  2.5,  2.6,
-  2.7,  2.8,  2.9,
-    3,  3.1,  3.2,
-  3.3,  3.4,  3.5,
-  3.6,  3.7,  3.8,
-  3.9,    4,  4.1,
-  4.2,  4.3,  4.4,
-  4.5,  4.6,  4.7,
-  4.8,  4.9,    5,
-  5.1,  5.2,  5.3,
-  5.4,  5.5,  5.6,
-  5.7,  5.8,  5.9,
-    6,    1,  6.1,
-  6.2,  6.3,  6.4,
-  6.5,  6.6,  6.7,
-  6.8,  6.9,    7,
-  7.1,  7.2,  7.3,
-  7.4,  7.5,  7.6,
-  7.7,  7.8,  7.9,
-    8,  8.1,  8.2,
-  8.3,  8.4,  8.5,
-  8.6,  8.7,  8.8,
-  8.9,    9,  9.1,
-  9.2,  9.3,  9.4,
-  9.5,  9.6,  9.7,
-  9.8,  9.9,   10,
- 10.1, 10.2, 10.3,
- 10.4, 10.5, 10.6,
- 10.7, 10.8, 10.9,
-   11, 11.1, 11.2,
- 11.3, 11.4, 11.5,
- 11.6, 11.7, 11.8,
- 11.9,   12,    1,
- 12.1, 12.2, 12.3,
- 12.4, 12.5, 12.6,
- 12.7, 12.8, 12.9,
-   13, 13.1, 13.2,
- 13.3, 13.4, 13.5,
- 13.6, 13.7, 13.8,
- 13.9,   14, 14.1,
- 14.2, 14.3, 14.4,
- 14.5, 14.6, 14.7,
- 14.8, 14.9,   15,
- 15.1, 15.2, 15.3,
- 15.4, 15.5, 15.6,
- 15.7, 15.8, 15.9,
-   16, 16.1, 16.2,
- 16.3, 16.4, 16.5,
- 16.6, 16.7, 16.8,
- 16.9,   17, 17.1,
- 17.2, 17.3, 17.4,
- 17.5, 17.6, 17.7,
- 17.8, 17.9,   18,
-    1, 18.1, 18.2,
- 18.3, 18.4, 18.5,
- 18.6, 18.7, 18.8,
- 18.9,   19, 19.1,
- 19.2, 19.3, 19.4,
- 19.5, 19.6, 19.7,
- 19.8, 19.9,   20,
- 20.1, 20.2, 20.3,
- 20.4, 20.5, 20.6,
- 20.7, 20.8, 20.9,
-   21, 21.1, 21.2,
- 21.3, 21.4, 21.5,
- 21.6, 21.7, 21.8,
- 21.9,   22, 22.1,
- 22.2, 22.3, 22.4,
- 22.5, 22.6, 22.7,
- 22.8, 22.9,   23,
- 23.1, 23.2, 23.3,
- 23.4, 23.5, 23.6,
- 23.7, 23.8, 23.9,
-   24,    1, 24.1,
- 24.2, 24.3, 24.4,
- 24.5, 24.6, 24.7,
- 24.8, 24.9,   25,
- 25.1, 25.2, 25.3,
- 25.4, 25.5, 25.6,
- 25.7, 25.8, 25.9,
-   26, 26.1, 26.2,
- 26.3, 26.4, 26.5,
- 26.6, 26.7, 26.8,
- 26.9,   27, 27.1,
- 27.2, 27.3, 27.4,
- 27.5, 27.6, 27.7,
- 27.8, 27.9,   28,
- 28.1, 28.2, 28.3,
- 28.4, 28.5, 28.6,
- 28.7, 28.8, 28.9,
-   29, 29.1, 29.2,
- 29.3, 29.4, 29.5,
- 29.6, 29.7, 29.8,
- 29.9,   30,    1,
- 30.1, 30.2, 30.3,
- 30.4, 30.5, 30.6,
- 30.7, 30.8, 30.9,
-   31, 31.1, 31.2,
- 31.3, 31.4, 31.5,
- 31.6, 31.7, 31.8,
- 31.9,   32, 32.1,
- 32.2, 32.3, 32.4,
- 32.5, 32.6, 32.7,
- 32.8, 32.9,   33,
- 33.1, 33.2, 33.3,
- 33.4, 33.5, 33.6,
- 33.7, 33.8, 33.9,
-   34, 34.1, 34.2,
- 34.3, 34.4, 34.5,
- 34.6, 34.7, 34.8,
- 34.9,   35, 35.1,
- 35.2, 35.3, 35.4,
- 35.5, 35.6, 35.7,
- 35.8, 35.9,   36,
-    1, 36.1, 36.2,
- 36.3, 36.4, 36.5,
- 36.6, 36.7, 36.8,
- 36.9,   37, 37.1,
- 37.2, 37.3, 37.4,
- 37.5, 37.6, 37.7,
- 37.8, 37.9,   38,
- 38.1, 38.2, 38.3,
- 38.4, 38.5, 38.6,
- 38.7, 38.8, 38.9,
-   39, 39.1, 39.2,
- 39.3, 39.4, 39.5,
- 39.6, 39.7, 39.8,
- 39.9,   40, 40.1,
- 40.2, 40.3, 40.4,
- 40.5, 40.6, 40.7,
- 40.8, 40.9,   41,
- 41.1, 41.2, 41.3,
- 41.4, 41.5, 41.6,
- 41.7, 41.8, 41.9,
-   42,    1, 42.1,
- 42.2, 42.3, 42.4,
- 42.5, 42.6, 42.7,
- 42.8, 42.9,   43,
- 43.1, 43.2, 43.3,
- 43.4, 43.5, 43.6,
- 43.7, 43.8, 43.9,
-   44, 44.1, 44.2,
- 44.3, 44.4, 44.5,
- 44.6, 44.7, 44.8,
- 44.9,   45, 45.1,
- 45.2, 45.3, 45.4,
- 45.5, 45.6, 45.7,
- 45.8, 45.9,   46,
- 46.1, 46.2, 46.3,
- 46.4, 46.5, 46.6,
- 46.7, 46.8, 46.9,
-   47, 47.1, 47.2,
- 47.3, 47.4, 47.5,
- 47.6, 47.7, 47.8,
- 47.9,   48,    1,
- 48.1, 48.2, 48.3,
- 48.4, 48.5, 48.6,
- 48.7, 48.8, 48.9,
-   49, 49.1, 49.2,
- 49.3, 49.4, 49.5,
- 49.6, 49.7, 49.8,
- 49.9,   50, 50.1,
- 50.2, 50.3, 50.4,
- 50.5, 50.6, 50.7,
- 50.8, 50.9,   51,
- 51.1, 51.2, 51.3,
- 51.4, 51.5, 51.6,
- 51.7, 51.8, 51.9,
-   52, 52.1, 52.2,
- 52.3, 52.4, 52.5,
- 52.6, 52.7, 52.8,
- 52.9,   53, 53.1,
- 53.2, 53.3, 53.4,
- 53.5, 53.6, 53.7,
- 53.8, 53.9,   54,
-    1, 54.1, 54.2,
- 54.3, 54.4, 54.5,
- 54.6, 54.7, 54.8,
- 54.9,   55, 55.1,
- 55.2, 55.3, 55.4,
- 55.5, 55.6, 55.7,
- 55.8, 55.9,   56,
- 56.1, 56.2, 56.3,
- 56.4, 56.5, 56.6,
- 56.7, 56.8, 56.9,
-   57, 57.1, 57.2,
- 57.3, 57.4, 57.5,
- 57.6, 57.7, 57.8,
- 57.9,   58, 58.1,
- 58.2, 58.3, 58.4,
- 58.5, 58.6, 58.7,
- 58.8, 58.9,   59,
- 59.1, 59.2, 59.3,
- 59.4, 59.5, 59.6,
- 59.7, 59.8, 59.9,
-   60,    1, 60.1,
- 60.2, 60.3, 60.4,
- 60.5, 60.6, 60.7,
- 60.8, 60.9,   61,
- 61.1, 61.2, 61.3,
- 61.4, 61.5, 61.6,
- 61.7, 61.8, 61.9,
-   62, 62.1, 62.2,
- 62.3, 62.4, 62.5,
- 62.6, 62.7, 62.8,
- 62.9,   63, 63.1,
- 63.2, 63.3, 63.4,
- 63.5, 63.6, 63.7,
- 63.8, 63.9,   64,
- 64.1, 64.2, 64.3,
- 64.4, 64.5, 64.6,
- 64.7, 64.8, 64.9,
-   65, 65.1, 65.2,
- 65.3, 65.4, 65.5,
- 65.6, 65.7, 65.8,
- 65.9,   66,    1,
- 66.1, 66.2, 66.3,
- 66.4, 66.5, 66.6,
- 66.7, 66.8, 66.9,
-   67, 67.1, 67.2,
- 67.3, 67.4, 67.5,
- 67.6, 67.7, 67.8,
- 67.9,   68, 68.1,
- 68.2, 68.3, 68.4,
- 68.5, 68.6, 68.7,
- 68.8, 68.9,   69,
- 69.1, 69.2, 69.3,
- 69.4, 69.5, 69.6,
- 69.7, 69.8, 69.9,
-   70, 70.1, 70.2,
- 70.3, 70.4, 70.5,
- 70.6, 70.7, 70.8,
- 70.9,   71, 71.1,
- 71.2, 71.3, 71.4,
- 71.5, 71.6, 71.7,
- 71.8, 71.9,   72,
-    1, 72.1, 72.2,
- 72.3, 72.4, 72.5,
- 72.6, 72.7, 72.8,
- 72.9,   73, 73.1,
- 73.2, 73.3, 73.4,
- 73.5, 73.6, 73.7,
- 73.8, 73.9,   74,
- 74.1, 74.2, 74.3,
- 74.4, 74.5, 74.6,
- 74.7, 74.8, 74.9,
-   75, 75.1, 75.2,
- 75.3, 75.4, 75.5,
- 75.6, 75.7,    1,
- 75.8, 75.9,   76,
- 76.1, 76.2, 76.3,
- 76.4, 76.5, 76.6,
- 76.7, 76.8, 76.9,
-   77, 77.1, 77.2,
- 77.3, 77.4, 77.5,
- 77.6, 77.7, 77.8,
- 77.9,    1,   78,
- 78.1, 78.2, 78.3,
- 78.4, 78.5, 78.6,
- 78.7, 78.8, 78.9,
-   79, 79.1, 79.2,
- 79.3, 79.4, 79.5,
- 79.6, 79.7, 79.8,
- 79.9,   80, 80.1,
- 80.2, 80.3, 80.4,
- 80.5, 80.6, 80.7,
- 80.8, 80.9,   81,
- 81.1, 81.2, 81.3,
-    1, 81.4, 81.5,
- 81.6, 81.7, 81.8,
- 81.9,   82, 82.1,
- 82.2, 82.3, 82.4,
- 82.5, 82.6, 82.7,
- 82.8, 82.9,   83,
- 83.1, 83.2, 83.3,
- 83.4, 83.5, 83.6,
- 83.7, 83.8,    1,
- 83.9,   84, 84.1,
- 84.2, 84.3, 84.4,
- 84.5, 84.6, 84.7,
- 84.8, 84.9,   85,
- 85.1, 85.2, 85.3,
- 85.4, 85.5, 85.6,
- 85.7, 85.8, 85.9,
-   86, 86.1, 86.2,
- 86.3, 86.4, 86.5,
- 86.6, 86.7, 86.8,
- 86.9,   87, 87.1,
- 87.2,    1, 87.3,
- 87.4, 87.5, 87.6,
- 87.7, 87.8, 87.9,
-   88, 88.1, 88.2,
- 88.3, 88.4, 88.5,
- 88.6, 88.7, 88.8,
- 88.9,   89, 89.1,
- 89.2, 89.3, 89.4,
- 89.5, 89.6, 89.7,
-    1, 89.8, 89.9,
-   90, 90.1, 90.2,
- 90.3, 90.4, 90.5,
- 90.6, 90.7, 90.8,
- 90.9,   91, 91.1,
- 91.2, 91.3, 91.4,
- 91.5, 91.6, 91.7,
- 91.8, 91.9,   92,
- 92.1, 92.2, 92.3,
- 92.4, 92.5, 92.6,
- 92.7, 92.8, 92.9,
-   93, 93.1, 93.2,
- 93.3, 93.4,    1,
- 93.5, 93.6, 93.7,
- 93.8, 93.9,   94,
- 94.1, 94.2, 94.3,
- 94.4, 94.5, 94.6,
- 94.7, 94.8, 94.9,
-   95, 95.1, 95.2,
- 95.3, 95.4, 95.5,
- 95.6,    1, 95.7,
- 95.8, 95.9,   96,
- 96.1, 96.2, 96.3,
- 96.4, 96.5, 96.6,
- 96.7, 96.8, 96.9,
-   97, 97.1, 97.2,
- 97.3, 97.4, 97.5,
- 97.6, 97.7, 97.8,
- 97.9,   98, 98.1,
- 98.2, 98.3, 98.4,
- 98.5, 98.6, 98.7,
- 98.8, 98.9,   99,
-    1, 99.1, 99.2,
- 99.3, 99.4, 99.5,
- 99.6, 99.7, 99.8,
- 99.9,  100,100.1,
-100.2,100.3,100.4,
-100.5,100.6,100.7,
-100.8,100.9,  101,
-101.1,101.2,101.3,
-101.4,101.5,    1,
-101.6,101.7,101.8,
-101.9,  102,102.1,
-102.2,102.3,102.4,
-102.5,102.6,102.7,
-102.8,102.9,  103,
-103.1,103.2,103.3,
-103.4,103.5,103.6,
-103.7,103.8,103.9,
-  104,104.1,104.2,
-104.3,104.4,104.5,
-104.6,104.7,104.8,
-104.9,    1,  105,
-105.1,105.2,105.3,
-105.4,105.5,105.6,
-105.7,105.8,105.9,
-  106,106.1,106.2,
-106.3,106.4,106.5,
-106.6,106.7,106.8,
-106.9,  107,107.1,
-107.2,107.3,107.4,
-    1,107.5,107.6,
-107.7,107.8,107.9,
-  108,108.1,108.2,
-108.3,108.4,108.5,
-108.6,108.7,108.8,
-108.9,  109,109.1,
-109.2,109.3,109.4,
-109.5,109.6,109.7,
-109.8,109.9,  110,
-110.1,110.2,110.3,
-110.4,110.5,110.6,
-110.7,110.8,110.9,
-  111,111.1,    1,
-111.2,111.3,111.4,
-111.5,111.6,111.7,
-111.8,111.9,  112,
-112.1,112.2,112.3,
-112.4,112.5,112.6,
-112.7,112.8,112.9,
-  113,113.1,113.2,
-113.3,    1,113.4,
-113.5,113.6,113.7,
-113.8,113.9,  114,
-114.1,114.2,114.3,
-114.4,114.5,114.6,
-114.7,114.8,114.9,
-  115,115.1,115.2,
-115.3,115.4,115.5,
-115.6,115.7,115.8,
-115.9,  116,116.1,
-116.2,116.3,116.4,
-116.5,116.6,116.7,
-    1,116.8,116.9,
-  117,117.1,117.2,
-117.3,117.4,117.5,
-117.6,117.7,117.8,
-117.9,  118,118.1,
-118.2,118.3,118.4,
-118.5,118.6,118.7,
-118.8,118.9,  119,
-119.1,119.2,    1,
-119.3,119.4,119.5,
-119.6,119.7,119.8,
-119.9,  120,120.1,
-120.2,120.3,120.4,
-120.5,120.6,120.7,
-120.8,120.9,  121,
-121.1,121.2,121.3,
-121.4,121.5,121.6,
-121.7,121.8,121.9,
-  122,122.1,122.2,
-122.3,122.4,122.5,
-122.6,    1,122.7,
-122.8,122.9,  123,
-123.1,123.2,123.3,
-123.4,123.5,123.6,
-123.7,123.8,123.9,
-  124,124.1,124.2,
-124.3,124.4,124.5,
-124.6,124.7,124.8,
-124.9,  125,125.1,
-    1,125.2,125.3,
-125.4,125.5,125.6,
-125.7,125.8,125.9,
-  126,126.1,126.2,
-126.3,126.4,126.5,
-126.6,126.7,126.8,
-126.9,  127,127.1,
-127.2,127.3,127.4,
-127.5,127.6,127.7,
-127.8,127.9,  128,
-128.1,128.2,128.3,
-128.4,128.5,128.6,
-128.7,128.8,    1,
-128.9,  129,129.1,
-129.2,129.3,129.4,
-129.5,129.6,129.7,
-129.8,129.9,  130,
-130.1,130.2,130.3,
-130.4,130.5,130.6,
-130.7,130.8,130.9,
-  131,    1,131.1,
-131.2,131.3,131.4,
-131.5,131.6,131.7,
-131.8,131.9,  132,
-132.1,132.2,132.3,
-132.4,132.5,132.6,
-132.7,132.8,132.9,
-  133,133.1,133.2,
-133.3,133.4,133.5,
-133.6,133.7,133.8,
-133.9,  134,134.1,
-134.2,134.3,134.4,
-    1,134.5,134.6,
-134.7,134.8,134.9,
-  135,135.1,135.2,
-135.3,135.4,135.5,
-135.6,135.7,135.8,
-135.9,  136,136.1,
-136.2,136.3,136.4,
-136.5,136.6,136.7,
-136.8,136.9,    1,
-  137,137.1,137.2,
-137.3,137.4,137.5,
-137.6,137.7,137.8,
-137.9,  138,138.1,
-138.2,138.3,138.4,
-138.5,138.6,138.7,
-138.8,138.9,  139,
-139.1,139.2,139.3,
-139.4,139.5,139.6,
-139.7,139.8,139.9,
-  140,140.1,140.2,
-140.3,    1,140.4,
-140.5,140.6,140.7,
-140.8,140.9,  141,
-141.1,141.2,141.3,
-141.4,141.5,141.6,
-141.7,141.8,141.9,
-  142,142.1,142.2,
-142.3,142.4,142.5,
-142.6,142.7,142.8,
-    1,142.9,  143,
-143.1,143.2,143.3,
-143.4,143.5,143.6,
-143.7,143.8,143.9,
-  144,144.1,144.2,
-144.3,144.4,144.5,
-144.6,144.7,144.8,
-144.9,  145,145.1,
-145.2,145.3,145.4,
-145.5,145.6,145.7,
-145.8,145.9,  146,
-146.1,146.2,146.3,
-146.4,146.5,146.6,
-146.7,146.8,146.9,
-  147,147.1,147.2,
-147.3,147.4,147.5,
-147.6,147.7,147.8,
-147.9,  148,148.1,
-148.2,148.3,148.4,
-148.5,148.6,148.7,
-148.8,    1,148.9,
-  149,149.1,149.2,
-149.3,149.4,149.5,
-149.6,149.7,149.8,
-149.9,  150,150.1,
-150.2,150.3,150.4,
-150.5,150.6,150.7,
-150.8,150.9,  151,
-151.1,151.2,151.3,
-151.4,151.5,151.6,
-151.7,151.8,151.9,
-  152,152.1,152.2,
-152.3,152.4,152.5,
-152.6,152.7,152.8,
-152.9,  153,153.1,
-153.2,153.3,153.4,
-153.5,153.6,153.7,
-153.8,153.9,  154,
-154.1,154.2,154.3,
-154.4,154.5,154.6,
-154.7,154.8,    1,
-154.9,  155,155.1,
-155.2,155.3,155.4,
-155.5,155.6,155.7,
-155.8,155.9,  156,
-156.1,156.2,156.3,
-156.4,156.5,156.6,
-156.7,156.8,156.9,
-  157,157.1,157.2,
-157.3,157.4,157.5,
-157.6,157.7,157.8,
-157.9,  158,158.1,
-158.2,158.3,158.4,
-158.5,158.6,158.7,
-158.8,158.9,  159,
-159.1,159.2,159.3,
-159.4,159.5,159.6,
-159.7,159.8,159.9,
-  160,160.1,160.2,
-160.3,160.4,160.5,
-160.6,160.7,160.8,
-    1,160.9,  161,
-161.1,161.2,161.3,
-161.4,161.5,161.6,
-161.7,161.8,161.9,
-  162,162.1,162.2,
-162.3,162.4,162.5,
-162.6,162.7,162.8,
-162.9,  163,163.1,
-163.2,163.3,163.4,
-163.5,163.6,163.7,
-163.8,163.9,  164,
-164.1,164.2,164.3,
-164.4,164.5,164.6,
-164.7,164.8,164.9,
-  165,165.1,165.2,
-165.3,165.4,165.5,
-165.6,165.7,165.8,
-165.9,  166,166.1,
-166.2,166.3,166.4,
-166.5,166.6,166.7,
-166.8,    1,166.9,
-  167,167.1,167.2,
-167.3,167.4,167.5,
-167.6,167.7,167.8,
-167.9,  168,168.1,
-168.2,168.3,168.4,
-168.5,168.6,168.7,
-168.8,168.9,  169,
-169.1,169.2,169.3,
-169.4,169.5,169.6,
-169.7,169.8,169.9,
-  170,170.1,170.2,
-170.3,170.4,170.5,
-170.6,170.7,170.8,
-170.9,  171,171.1,
-171.2,171.3,171.4,
-171.5,171.6,171.7,
-171.8,171.9,  172,
-172.1,172.2,172.3,
-172.4,172.5,172.6,
-172.7,172.8,    1,
-172.9,  173,173.1,
-173.2,173.3,173.4,
-173.5,173.6,173.7,
-173.8,173.9,  174,
-174.1,174.2,174.3,
-174.4,174.5,174.6,
-174.7,174.8,174.9,
-  175,175.1,175.2,
-175.3,175.4,175.5,
-175.6,175.7,175.8,
-175.9,  176,176.1,
-176.2,176.3,176.4,
-176.5,176.6,176.7,
-176.8,176.9,  177,
-177.1,177.2,177.3,
-177.4,177.5,177.6,
-177.7,177.8,177.9,
-  178,178.1,178.2,
-178.3,178.4,178.5,
-178.6,178.7,178.8,
-    1,178.9,  179,
-179.1,179.2,179.3,
-179.4,179.5,179.6,
-179.7,179.8,179.9,
-  180,180.1,180.2,
-180.3,180.4,180.5,
-180.6,180.7,180.8,
-180.9,  181,181.1,
-181.2,181.3,181.4,
-181.5,181.6,181.7,
-181.8,181.9,  182,
-182.1,182.2,182.3,
-182.4,182.5,182.6,
-182.7,182.8,182.9,
-  183,183.1,183.2,
-183.3,183.4,183.5,
-183.6,183.7,183.8,
-183.9,  184,184.1,
-184.2,184.3,184.4,
-184.5,184.6,184.7,
-184.8,    1,184.9,
-  185,185.1,185.2,
-185.3,185.4,185.5,
-185.6,185.7,185.8,
-185.9,  186,186.1,
-186.2,186.3,186.4,
-186.5,186.6,186.7,
-186.8,186.9,  187,
-187.1,187.2,187.3,
-187.4,187.5,187.6,
-187.7,187.8,187.9,
-  188,188.1,188.2,
-188.3,188.4,188.5,
-188.6,188.7,188.8,
-188.9,  189,189.1,
-189.2,189.3,189.4,
-189.5,189.6,189.7,
-189.8,189.9,  190,
-190.1,190.2,190.3,
-190.4,190.5,190.6,
-190.7,190.8,    1,
-190.9,  191,191.1,
-191.2,191.3,191.4,
-191.5,191.6,191.7,
-191.8,191.9,  192,
-192.1,192.2,192.3,
-192.4,192.5,192.6,
-192.7,192.8,192.9,
-  193,193.1,193.2,
-193.3,193.4,193.5,
-193.6,193.7,193.8,
-193.9,  194,194.1,
-194.2,194.3,194.4,
-194.5,194.6,194.7,
-194.8,194.9,  195,
-195.1,195.2,195.3,
-195.4,195.5,195.6,
-195.7,195.8,195.9,
-  196,196.1,196.2,
-196.3,196.4,196.5,
-196.6,196.7,196.8,
-    1,196.9,  197,
-197.1,197.2,197.3,
-197.4,197.5,197.6,
-197.7,197.8,197.9,
-  198,198.1,198.2,
-198.3,198.4,198.5,
-198.6,198.7,198.8,
-198.9,  199,199.1,
-199.2,199.3,199.4,
-199.5,199.6,199.7,
-199.8,199.9,  200,
-200.1,200.2,200.3,
-200.4,200.5,200.6,
-200.7,200.8,200.9,
-  201,201.1,201.2,
-201.3,201.4,201.5,
-201.6,201.7,201.8,
-201.9,  202,202.1,
-202.2,202.3,202.4,
-202.5,202.6,202.7,
-202.8,    1,202.9,
-  203,203.1,203.2,
-203.3,203.4,203.5,
-203.6,203.7,203.8,
-203.9,  204,204.1,
-204.2,204.3,204.4,
-204.5,204.6,204.7,
-204.8,204.9,  205,
-205.1,205.2,205.3,
-205.4,205.5,205.6,
-205.7,205.8,205.9,
-  206,206.1,206.2,
-206.3,206.4,206.5,
-206.6,206.7,206.8,
-206.9,  207,207.1,
-207.2,207.3,207.4,
-207.5,207.6,207.7,
-207.8,207.9,  208,
-208.1,208.2,208.3,
-208.4,208.5,208.6,
-208.7,208.8,    1,
-208.9,  209,209.1,
-209.2,209.3,209.4,
-209.5,209.6,209.7,
-209.8,209.9,  210,
-210.1,210.2,210.3,
-210.4,210.5,210.6,
-210.7,210.8,210.9,
-  211,211.1,211.2,
-211.3,211.4,211.5,
-211.6,211.7,211.8,
-211.9,  212,212.1,
-212.2,212.3,212.4,
-212.5,212.6,212.7,
-212.8,212.9,  213,
-213.1,213.2,213.3,
-213.4,213.5,213.6,
-213.7,213.8,213.9,
-  214,214.1,214.2,
-214.3,214.4,214.5,
-214.6,214.7,214.8,
-    1,214.9,  215,
-215.1,215.2,215.3,
-215.4,215.5,215.6,
-215.7,215.8,215.9,
-  216,216.1,   -1,
-216.2,216.3,216.4,
-216.5,216.6,216.7,
-216.8,216.9,  217,
-217.1,217.2,217.3,
-217.4,217.5,217.6,
-217.7,217.8,217.9,
-  218,218.1,218.2,
-218.3,218.4,218.5,
-218.6,218.7,218.8,
-218.9,  219,219.1,
-219.2,219.3,219.4,
-219.5,219.6,219.7,
-219.8,219.9,  220,
-220.1,220.2,220.3,
-220.4,220.5,220.6,
-220.7,    1,220.8,
-220.9,  221,221.1,
-221.2,221.3,221.4,
-221.5,221.6,221.7,
-   -1,221.8,221.9,
-  222,222.1,222.2,
-222.3,222.4,222.5,
-222.6,222.7,222.8,
-222.9,  223,223.1,
-223.2,223.3,223.4,
-223.5,223.6,223.7,
-223.8,223.9,  224,
-224.1,224.2,224.3,
-224.4,224.5,224.6,
-224.7,224.8,224.9,
-  225,225.1,225.2,
-225.3,225.4,225.5,
-225.6,225.7,225.8,
-225.9,  226,226.1,
-226.2,226.3,226.4,
-226.5,226.6,    1,
-226.7,226.8,226.9,
-  227,227.1,227.2,
-227.3,227.4,227.5,
-227.6,   -1,227.7,
-227.8,227.9,  228,
-228.1,228.2,228.3,
-228.4,228.5,228.6,
-228.7,228.8,228.9,
-  229,229.1,229.2,
-229.3,229.4,229.5,
-229.6,229.7,229.8,
-229.9,  230,230.1,
-230.2,230.3,230.4,
-230.5,230.6,230.7,
-230.8,230.9,  231,
-231.1,231.2,231.3,
-231.4,231.5,231.6,
-231.7,231.8,231.9,
-  232,232.1,232.2,
-232.3,232.4,232.5,
-    1,232.6,232.7,
-232.8,232.9,  233,
-233.1,233.2,233.3,
-233.4,233.5,233.6,
-233.7,233.8,   -1,
-233.9,  234,234.1,
-234.2,234.3,234.4,
-234.5,234.6,234.7,
-234.8,234.9,  235,
-235.1,235.2,235.3,
-235.4,235.5,235.6,
-235.7,235.8,235.9,
-  236,236.1,236.2,
-236.3,236.4,236.5,
-236.6,236.7,236.8,
-236.9,  237,237.1,
-237.2,237.3,237.4,
-237.5,237.6,237.7,
-237.8,237.9,  238,
-238.1,238.2,238.3,
-238.4,    1,238.5,
-238.6,238.7,238.8,
-238.9,  239,239.1,
-239.2,239.3,239.4,
-   -1,239.5,239.6,
-239.7,239.8,239.9,
-  240,240.1,240.2,
-240.3,240.4,240.5,
-240.6,240.7,240.8,
-240.9,  241,241.1,
-241.2,241.3,241.4,
-241.5,241.6,241.7,
-241.8,241.9,  242,
-242.1,242.2,242.3,
-242.4,242.5,242.6,
-242.7,242.8,242.9,
-  243,243.1,243.2,
-243.3,243.4,243.5,
-243.6,243.7,243.8,
-243.9,  244,244.1,
-244.2,244.3,    1,
-244.4,244.5,244.6,
-244.7,244.8,244.9,
-  245,245.1,245.2,
-245.3,   -1,245.4,
-245.5,245.6,245.7,
-245.8,245.9,  246,
-246.1,246.2,246.3,
-246.4,246.5,246.6,
-246.7,246.8,246.9,
-  247,247.1,247.2,
-247.3,247.4,247.5,
-247.6,247.7,247.8,
-247.9,  248,248.1,
-248.2,248.3,248.4,
-248.5,248.6,248.7,
-248.8,248.9,  249,
-249.1,249.2,249.3,
-249.4,249.5,249.6,
-249.7,249.8,249.9,
-  250,250.1,250.2,
-    1,250.3,250.4,
-250.5,250.6,250.7,
-250.8,250.9,  251,
-251.1,251.2,251.3,
-251.4,251.5,   -1,
-251.6,251.7,251.8,
-251.9,  252,252.1,
-252.2,252.3,252.4,
-252.5,252.6,252.7,
-252.8,252.9,  253,
-253.1,253.2,253.3,
-253.4,253.5,253.6,
-253.7,253.8,253.9,
-  254,254.1,254.2,
-254.3,254.4,254.5,
-254.6,254.7,254.8,
-254.9,  255,255.1,
-255.2,255.3,255.4,
-255.5,255.6,255.7,
-255.8,255.9,  256,
-256.1,    1,256.2,
-256.3,256.4,256.5,
-256.6,256.7,256.8,
-256.9,  257,257.1,
-   -1,257.2,257.3,
-257.4,257.5,257.6,
-257.7,257.8,257.9,
-  258,258.1,258.2,
-258.3,258.4,258.5,
-258.6,258.7,258.8,
-258.9,  259,259.1,
-259.2,259.3,259.4,
-259.5,259.6,259.7,
-259.8,259.9,  260,
-260.1,260.2,260.3,
-260.4,260.5,260.6,
-260.7,260.8,260.9,
-  261,261.1,261.2,
-261.3,261.4,261.5,
-261.6,261.7,261.8,
-261.9,  262,    1,
-262.1,262.2,262.3,
-262.4,262.5,262.6,
-262.7,262.8,262.9,
-  263,   -1,263.1,
-263.2,263.3,263.4,
-263.5,263.6,263.7,
-263.8,263.9,  264,
-264.1,264.2,264.3,
-264.4,264.5,264.6,
-264.7,264.8,264.9,
-  265,265.1,265.2,
-265.3,265.4,265.5,
-265.6,265.7,265.8,
-265.9,  266,266.1,
-266.2,266.3,266.4,
-266.5,266.6,266.7,
-266.8,266.9,  267,
-267.1,267.2,267.3,
-267.4,267.5,267.6,
-267.7,267.8,267.9,
-    1,  268,268.1,
-268.2,268.3,268.4,
-268.5,268.6,268.7,
-268.8,268.9,  269,
-269.1,269.2,   -1,
-269.3,269.4,269.5,
-269.6,269.7,269.8,
-269.9,  270,270.1,
-270.2,270.3,270.4,
-270.5,270.6,270.7,
-270.8,270.9,  271,
-271.1,271.2,271.3,
-271.4,271.5,271.6,
-271.7,271.8,271.9,
-  272,272.1,272.2,
-272.3,272.4,272.5,
-272.6,272.7,272.8,
-272.9,  273,273.1,
-273.2,273.3,273.4,
-273.5,273.6,273.7,
-273.8,    1,273.9,
-  274,274.1,274.2,
-274.3,274.4,274.5,
-274.6,274.7,274.8,
-   -1,274.9,  275,
-275.1,275.2,275.3,
-275.4,275.5,275.6,
-275.7,275.8,275.9,
-  276,276.1,276.2,
-276.3,276.4,276.5,
-276.6,276.7,276.8,
-276.9,  277,277.1,
-277.2,277.3,277.4,
-277.5,277.6,277.7,
-277.8,277.9,  278,
-278.1,278.2,278.3,
-278.4,278.5,278.6,
-278.7,278.8,278.9,
-  279,279.1,279.2,
-279.3,279.4,279.5,
-279.6,279.7,    1,
-279.8,279.9,  280,
-280.1,280.2,280.3,
-280.4,280.5,280.6,
-280.7,   -1,280.8,
-280.9,  281,281.1,
-281.2,281.3,281.4,
-281.5,281.6,281.7,
-281.8,281.9,  282,
-282.1,    1,282.2,
-282.3,282.4,282.5,
-282.6,282.7,282.8,
-282.9,  283,283.1,
-283.2,283.3,283.4,
-283.5,283.6,283.7,
-283.8,283.9,  284,
-284.1,284.2,284.3,
-284.4,   -1,284.5,
-284.6,284.7,284.8,
-284.9,  285,285.1,
-285.2,285.3,285.4,
-285.5,285.6,285.7,
-285.8,285.9,  286,
-286.1,286.2,286.3,
-286.4,286.5,286.6,
-286.7,286.8,286.9,
-  287,287.1,287.2,
-287.3,287.4,287.5,
-287.6,287.7,287.8,
-287.9,  288,    1,
-288.1,288.2,288.3,
-288.4,288.5,288.6,
-288.7,288.8,288.9,
-  289,289.1,289.2,
-289.3,289.4,289.5,
-289.6,289.7,289.8,
-289.9,  290,290.1,
-290.2,290.3,   -1,
-290.4,290.5,290.6,
-290.7,290.8,290.9,
-  291,291.1,291.2,
-291.3,291.4,291.5,
-291.6,291.7,291.8,
-291.9,  292,292.1,
-292.2,292.3,292.4,
-292.5,292.6,292.7,
-292.8,292.9,  293,
-293.1,293.2,293.3,
-293.4,293.5,293.6,
-    1,293.7,293.8,
-293.9,  294,294.1,
-294.2,294.3,294.4,
-294.5,294.6,294.7,
-294.8,294.9,  295,
-295.1,295.2,295.3,
-295.4,295.5,295.6,
-295.7,295.8,295.9,
-   -1,  296,296.1,
-296.2,296.3,296.4,
-296.5,296.6,296.7,
-296.8,296.9,  297,
-297.1,297.2,297.3,
-297.4,297.5,297.6,
-297.7,297.8,297.9,
-  298,298.1,298.2,
-298.3,298.4,298.5,
-298.6,298.7,298.8,
-298.9,  299,299.1,
-299.2,299.3,299.4,
-299.5,299.6,299.7,
-299.8,    1,299.9,
-  300,300.1,300.2,
-300.3,300.4,300.5,
-300.6,300.7,300.8,
-300.9,  301,301.1,
-301.2,301.3,301.4,
-301.5,301.6,301.7,
-301.8,301.9,  302,
-302.1,   -1,302.2,
-302.3,302.4,302.5,
-302.6,302.7,302.8,
-302.9,  303,303.1,
-303.2,303.3,303.4,
-303.5,303.6,303.7,
-303.8,303.9,  304,
-304.1,304.2,304.3,
-304.4,304.5,304.6,
-304.7,304.8,304.9,
-  305,305.1,305.2,
-305.3,305.4,305.5,
-305.6,305.7,    1,
-305.8,305.9,  306,
-306.1,306.2,306.3,
-306.4,306.5,306.6,
-306.7,306.8,306.9,
-  307,307.1,307.2,
-307.3,307.4,307.5,
-307.6,307.7,307.8,
-307.9,  308,   -1,
-308.1,308.2,308.3,
-308.4,308.5,308.6,
-308.7,308.8,308.9,
-  309,309.1,309.2,
-309.3,309.4,309.5,
-309.6,309.7,309.8,
-309.9,  310,310.1,
-310.2,310.3,310.4,
-310.5,310.6,310.7,
-310.8,310.9,  311,
-311.1,311.2,311.3,
-    1,311.4,311.5,
-311.6,311.7,311.8,
-311.9,  312,312.1,
-312.2,312.3,312.4,
-312.5,312.6,312.7,
-312.8,312.9,  313,
-313.1,313.2,313.3,
-313.4,313.5,313.6,
-   -1,313.7,313.8,
-313.9,  314,314.1,
-314.2,314.3,314.4,
-314.5,314.6,314.7,
-314.8,314.9,  315,
-315.1,315.2,315.3,
-315.4,315.5,315.6,
-315.7,315.8,315.9,
-  316,316.1,316.2,
-316.3,316.4,316.5,
-316.6,316.7,316.8,
-316.9,  317,317.1,
-317.2,317.3,317.4,
-317.5,    1,317.6,
-317.7,317.8,317.9,
-  318,318.1,318.2,
-318.3,318.4,318.5,
-318.6,318.7,318.8,
-318.9,  319,319.1,
-319.2,319.3,319.4,
-319.5,319.6,319.7,
-319.8,   -1,319.9,
-  320,320.1,320.2,
-320.3,320.4,320.5,
-320.6,320.7,320.8,
-320.9,  321,321.1,
-321.2,321.3,321.4,
-321.5,321.6,321.7,
-321.8,321.9,  322,
-322.1,322.2,322.3,
-322.4,322.5,322.6,
-322.7,322.8,322.9,
-  323,323.1,323.2,
-323.3,323.4,    1,
-323.5,323.6,323.7,
-323.8,323.9,  324,
-324.1,324.2,324.3,
-324.4,324.5,324.6,
-324.7,324.8,324.9,
-  325,325.1,325.2,
-325.3,325.4,325.5,
-325.6,325.7,   -1,
-325.8,325.9,  326,
-326.1,326.2,326.3,
-326.4,326.5,326.6,
-326.7,326.8,326.9,
-  327,327.1,327.2,
-327.3,327.4,327.5,
-327.6,327.7,327.8,
-327.9,  328,328.1,
-328.2,328.3,328.4,
-328.5,328.6,328.7,
-328.8,328.9,  329,
-    1,329.1,329.2,
-329.3,329.4,329.5,
-329.6,329.7,329.8,
-329.9,  330,330.1,
-330.2,330.3,330.4,
-330.5,330.6,330.7,
-330.8,330.9,  331,
-331.1,331.2,331.3,
-   -1,331.4,331.5,
-331.6,331.7,331.8,
-331.9,  332,332.1,
-332.2,332.3,332.4,
-332.5,332.6,332.7,
-332.8,332.9,  333,
-333.1,333.2,333.3,
-333.4,333.5,333.6,
-333.7,333.8,333.9,
-  334,334.1,334.2,
-334.3,334.4,334.5,
-334.6,334.7,334.8,
-334.9,  335,335.1,
-335.2,    1,335.3,
-335.4,335.5,335.6,
-335.7,335.8,335.9,
-  336,336.1,336.2,
-336.3,336.4,336.5,
-336.6,336.7,336.8,
-336.9,  337,337.1,
-337.2,337.3,337.4,
-337.5,   -1,337.6,
-337.7,337.8,337.9,
-  338,338.1,338.2,
-338.3,338.4,338.5,
-338.6,338.7,338.8,
-338.9,  339,339.1,
-339.2,339.3,339.4,
-339.5,339.6,339.7,
-339.8,339.9,  340,
-340.1,340.2,340.3,
-340.4,340.5,340.6,
-340.7,340.8,340.9,
-  341,341.1,    1,
-341.2,341.3,341.4,
-341.5,341.6,341.7,
-341.8,341.9,  342,
-342.1,342.2,342.3,
-342.4,342.5,342.6,
-342.7,342.8,342.9,
-  343,343.1,343.2,
-343.3,343.4,   -1,
-343.5,343.6,343.7,
-343.8,343.9,  344,
-344.1,344.2,344.3,
-344.4,344.5,344.6,
-344.7,344.8,344.9,
-  345,345.1,345.2,
-345.3,345.4,345.5,
-345.6,345.7,345.8,
-345.9,  346,346.1,
-346.2,346.3,346.4,
-346.5,346.6,346.7,
-    1,346.8,346.9,
-  347,347.1,347.2,
-347.3,347.4,347.5,
-347.6,347.7,347.8,
-347.9,  348,348.1,
-348.2,348.3,348.4,
-348.5,348.6,348.7,
-348.8,348.9,  349,
-   -1,349.1,349.2,
-349.3,349.4,349.5,
-349.6,349.7,349.8,
-349.9,  350,350.1,
-350.2,350.3,350.4,
-};
-
-// ----------------------------------------------------------------------
-// Computed values
-// ----------------------------------------------------------------------
-
-const double pylith::faults::CohesiveDynLDataHex8::_orientation[] = {
-  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
-  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
-  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
-  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_area[] = {
-  1.0, 1.0, 1.0, 1.0
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_initialTractions[] = {
-  1.0, 2.0, -3.0,
-  1.1, 2.1, -3.1,
-  1.2, 2.2, -3.2,
-  1.3, 2.3, -3.3,
-};
-
-
-const int pylith::faults::CohesiveDynLDataHex8::_numConstraintVert = 4;
-const int pylith::faults::CohesiveDynLDataHex8::_constraintVertices[] = {
-  18, 19, 20, 21
-};
-// ----------------------------------------------------------------------
-// Stick case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrStick[] = {
-  0.1, 2.1, 28.1,
-  0.2, 2.2, 28.2,
-  0.3, 2.3, 28.3,
-  0.4, 2.4, 28.4,
-  0.5, 2.5, 28.5, // 6
-  0.6, 2.6, 28.6, // 7
-  0.7, 2.7, 28.7, // 8
-  0.8, 2.8, 28.8, // 9
-  0.9, 2.9, 28.9,
-  0.0, 2.0, 28.0,
-  1.1, 3.1, 29.1,
-  1.2, 3.2, 29.2,
-  1.3, 3.3, 29.3, // 14
-  1.5, 3.5, 29.5, // 15
-  1.7, 3.7, 29.7, // 16
-  1.9, 3.9, 29.9, // 17
-  1.4, 3.4, -29.4, // 18
-  1.6, 3.6, -29.6, // 19
-  1.8, 3.8, -29.8, // 20
-  1.0, 3.0, -29.0, // 21
-};
-
-// No change in fieldIncr
-// Zero slip
-
-// ----------------------------------------------------------------------
-// Slip case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrSlip[] = {
-  5.1, 7.1, 9.1,
-  5.2, 7.2, 9.2,
-  5.3, 7.3, 9.3,
-  5.4, 7.4, 9.4,
-  5.5, 7.5, 9.5, // 6
-  5.6, 7.6, 9.6, // 7
-  5.7, 7.7, 9.7, // 8
-  5.8, 7.8, 9.8, // 9
-  5.9, 7.9, 9.9,
-  5.0, 7.0, 9.0,
-  6.1, 8.1, 10.1,
-  6.2, 8.2, 10.2,
-  6.3, 8.3, 10.3, // 14
-  6.5, 8.5, 10.5, // 15
-  6.7, 8.7, 10.7, // 16
-  6.9, 8.9, 10.9, // 17
-  6.4, 8.4, -10.4, // 18
-  6.6, 8.6, -10.6, // 19
-  6.8, 8.8, -10.8, // 20
-  6.0, 8.0, -10.0, // 21
-};
-
-// Output
-// :TODO: Update Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrSlipE[] = {
-  5.1, 7.1, 9.1,
-  5.2, 7.2, 9.2,
-  5.3, 7.3, 9.3,
-  5.4, 7.4, 9.4,
-  5.5, 7.5, 9.5, // 6
-  5.6, 7.6, 9.6, // 7
-  5.7, 7.7, 9.7, // 8
-  5.8, 7.8, 9.8, // 9
-  5.9, 7.9, 9.9,
-  5.0, 7.0, 9.0,
-  6.1, 8.1, 10.1,
-  6.2, 8.2, 10.2,
-  6.3, 8.3, 10.3, // 14
-  6.5, 8.5, 10.5, // 15
-  6.7, 8.7, 10.7, // 16
-  6.9, 8.9, 10.9, // 17
-  -3.963897477671262,  -5.477083063322538,  -10.4, // 18
-  -4.120121221785221,  -5.634915064993491,  -10.6, // 19
-  -4.276416812742042,  -5.792739610437928,  -10.8, // 20 
-  -3.474281747841006,  -4.919475110692280,  -10.0, // 21
-};
-
-// :TODO: Update slip values based on changes in Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataHex8::_slipSlipE[] = {
-  20.727794955342528,  27.754166126645078,                   0.0,
-  21.440242443570444,  28.469830129986981,                   0.0,
-  22.152833625484085,  29.185479220875859,                   0.0,
-  18.948563495682009,  25.838950221384557,                   0.0,
-};
-
-// ----------------------------------------------------------------------
-// Open case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrOpen[] = {
-  5.1, 7.1, 9.1,
-  5.2, 7.2, 9.2,
-  5.3, 7.3, 9.3,
-  5.4, 7.4, 9.4,
-  5.5, 7.5, 9.5, // 6
-  5.6, 7.6, 9.6, // 7
-  5.7, 7.7, 9.7, // 8
-  5.8, 7.8, 9.8, // 9
-  5.9, 7.9, 9.9,
-  5.0, 7.0, 9.0,
-  6.1, 8.1, 10.1,
-  6.2, 8.2, 10.2,
-  6.3, 8.3, 10.3, // 14
-  6.5, 8.5, 10.5, // 15
-  6.7, 8.7, 10.7, // 16
-  6.9, 8.9, 10.9, // 17
-  6.4, 8.4, 10.4, // 18
-  6.6, 8.6, 10.6, // 19
-  6.8, 8.8, 10.8, // 20
-  6.0, 8.0, 10.0, // 21
-};
-
-// Output
-const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrOpenE[] = {
-  5.1, 7.1, 9.1,
-  5.2, 7.2, 9.2,
-  5.3, 7.3, 9.3,
-  5.4, 7.4, 9.4,
-  5.5, 7.5, 9.5, // 6
-  5.6, 7.6, 9.6, // 7
-  5.7, 7.7, 9.7, // 8
-  5.8, 7.8, 9.8, // 9
-  5.9, 7.9, 9.9,
-  5.0, 7.0, 9.0,
-  6.1, 8.1, 10.1,
-  6.2, 8.2, 10.2,
-  6.3, 8.3, 10.3, // 14
-  6.5, 8.5, 10.5, // 15
-  6.7, 8.7, 10.7, // 16
-  6.9, 8.9, 10.9, // 17
-  -5.4, -7.4, -9.4, // 18
-  -5.6, -7.6, -9.6, // 19
-  -5.8, -7.8, -9.8, // 20
-  -5.0, -7.0, -9.0, // 21
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_slipOpenE[] = {
-  23.6, 31.6, 39.6,
-  24.4, 32.4, 40.4,
-  25.2, 33.2, 41.2,
-  22.0, 30.0, 38.0,
-};
-
-// ----------------------------------------------------------------------
-pylith::faults::CohesiveDynLDataHex8::CohesiveDynLDataHex8(void)
-{ // constructor
-  meshFilename = const_cast<char*>(_meshFilename);
-  spaceDim = _spaceDim;
-  cellDim = _cellDim;
-  numBasis = _numBasis;
-  numQuadPts = _numQuadPts;
-  quadPts = const_cast<double*>(_quadPts);
-  quadWts = const_cast<double*>(_quadWts);
-  basis = const_cast<double*>(_basis);
-  basisDeriv = const_cast<double*>(_basisDeriv);
-  verticesRef = const_cast<double*>(_verticesRef);
-  id = _id;
-  label = const_cast<char*>(_label);
-  initialTractFilename = const_cast<char*>(_initialTractFilename);
-
-  fieldT = const_cast<double*>(_fieldT);
-  jacobian = const_cast<double*>(_jacobian);
-  orientation = const_cast<double*>(_orientation);
-  area = const_cast<double*>(_area);
-  initialTractions = const_cast<double*>(_initialTractions);
-
-  constraintVertices = const_cast<int*>(_constraintVertices);
-  numConstraintVert = _numConstraintVert;  
-
-  // Stick
-  fieldIncrStick = const_cast<double*>(_fieldIncrStick);
-
-  // Slip
-  fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
-  fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
-  slipSlipE = const_cast<double*>(_slipSlipE);
-
-  // Open
-  fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
-  fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
-  slipOpenE = const_cast<double*>(_slipOpenE);
-} // constructor
-
-pylith::faults::CohesiveDynLDataHex8::~CohesiveDynLDataHex8(void)
-{}
-
-
-// End of file

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,77 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#if !defined(pylith_faults_cohesivedynldatahex8_hh)
-#define pylith_faults_cohesivedynldatahex8_hh
-
-#include "CohesiveDynLData.hh"
-
-namespace pylith {
-  namespace faults {
-     class CohesiveDynLDataHex8;
-  } // pylith
-} // faults
-
-class pylith::faults::CohesiveDynLDataHex8 : public CohesiveDynLData
-{
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public: 
-
-  /// Constructor
-  CohesiveDynLDataHex8(void);
-
-  /// Destructor
-  ~CohesiveDynLDataHex8(void);
-
-// PRIVATE MEMBERS //////////////////////////////////////////////////////
-private:
-
-  static const char* _meshFilename; ///< Filename of input mesh
-
-  static const int _spaceDim; ///< Number of dimensions in vertex coordinates
-  static const int _cellDim; ///< Number of dimensions associated with cell
-
-  static const int _numBasis; ///< Number of vertices in cell
-  static const int _numQuadPts; ///< Number of quadrature points
-  static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
-  static const double _quadWts[]; ///< Weights of quadrature points
-  static const double _basis[]; ///< Basis fns at quadrature points
-  static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
-  static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
-
-  static const int _id; ///< Fault material identifier
-  static const char* _label; ///< Label for fault
-  static const char* _initialTractFilename; ///< Name of db for initial tractions.
-
-  static const double _fieldT[]; ///< Solution field at time t.
-  static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
-  static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
-  static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
-  static const double _jacobian[]; ///< Jacobian sparse matrix.
-
-  static const double _orientation[]; ///< Expected values for fault orientation.
-  static const double _area[]; ///< Expected values for fault area.
-  static const double _initialTractions[]; ///< Expected values for initial tractions.
-  static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
-  static const double _slipSlipE[]; ///< Expected values for slip for slip case.
-  static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
-  static const double _slipOpenE[]; ///< Expected values for slip for opening case.
-  static const int _constraintVertices[]; ///< Expected points for constraint vertices
-  static const int _numConstraintVert; ///< Number of constraint vertices
-
-};
-
-#endif // pylith_faults_cohesivedynldatahex8_hh
-
-
-// End of file

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,468 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-
-/* Original mesh
- *
- * Cells are 0-1, vertices are 2-7.
- *
- *       3 -------- 5 -------- 7
- *       |          |          |
- *       |          |          |
- *       |          |          |
- *       |          |          |
- *       |          |          |
- *       |          |          |
- *       |          |          |
- *       |          |          |
- *       2 -------- 4 -------- 6
- *
- * After adding cohesive elements
- *
- * Cells are 0-1,10 vertices are 2-9.
- *
- *       3 -------- 5 -11-- 9 -------- 7
- *       |          |       |          |
- *       |          |       |          |
- *       |          |       |          |
- *       |          |       |          |
- *       |          |       |          |
- *       |          |       |          |
- *       |          |       |          |
- *       |          |       |          |
- *       2 -------- 4 -10-- 8 -------- 6
- */
-
-#include "CohesiveDynLDataQuad4.hh"
-
-const char* pylith::faults::CohesiveDynLDataQuad4::_meshFilename =
-  "data/quad4.mesh";
-
-const int pylith::faults::CohesiveDynLDataQuad4::_spaceDim = 2;
-
-const int pylith::faults::CohesiveDynLDataQuad4::_cellDim = 1;
-
-const int pylith::faults::CohesiveDynLDataQuad4::_numBasis = 2;
-
-const int pylith::faults::CohesiveDynLDataQuad4::_numQuadPts = 1;
-
-const double pylith::faults::CohesiveDynLDataQuad4::_quadPts[] = {
-  0.0,
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_quadWts[] = {
-  2.0,
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_basis[] = {
-  0.5,
-  0.5
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_basisDeriv[] = {
-  -0.5,
-   0.5
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_verticesRef[] = {
-  -1.0, 1.0
-};
-
-const int pylith::faults::CohesiveDynLDataQuad4::_id = 10;
-
-const char* pylith::faults::CohesiveDynLDataQuad4::_label = "fault";
-
-const char* pylith::faults::CohesiveDynLDataQuad4::_initialTractFilename = 
-  "data/quad4_initialtract.spatialdb";
-
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldT[] = {
-  8.1, 9.1,
-  8.2, 9.2,
-  8.3, 9.3, // 4
-  8.4, 9.4, // 5
-  8.5, 9.5,
-  8.6, 9.6,
-  8.7, 9.7, // 8
-  8.9, 9.9, // 9
-  8.8, 9.8, // 10
-  8.0, 9.0, // 11
-};
-
-// :TODO: Make sensible values for Jacobian for DOF on positive and
-// negative sides of the fault. Add semi-random values for other DOF.
-const double pylith::faults::CohesiveDynLDataQuad4::_jacobian[] = {
-   1, 0.1,
- 0.2, 0.3,
- 0.4, 0.5,
- 0.6, 0.7,
- 0.8, 0.9,
-   1, 1.1,
- 1.2, 1.3,
- 1.4, 1.5,
- 1.6, 1.7,
- 1.8, 1.9,
-   2,   1,
- 2.1, 2.2,
- 2.3, 2.4,
- 2.5, 2.6,
- 2.7, 2.8,
- 2.9,   3,
- 3.1, 3.2,
- 3.3, 3.4,
- 3.5, 3.6,
- 3.7, 3.8,
- 3.9,   4,
-   1, 4.1,
- 4.2, 4.3,
- 4.4, 4.5,
- 4.6, 4.7,
- 4.8, 4.9,
-   5, 5.1,
- 5.2, 5.3,
- 5.4, 5.5,
- 5.6, 5.7,
- 5.8, 5.9,
-   6,   1,
- 6.1, 6.2,
- 6.3, 6.4,
- 6.5, 6.6,
- 6.7, 6.8,
- 6.9,   7,
- 7.1, 7.2,
- 7.3, 7.4,
- 7.5, 7.6,
- 7.7, 7.8,
- 7.9,   8,
-   1, 8.1,
- 8.2, 8.3,
- 8.4, 8.5,
- 8.6, 8.7,
- 8.8, 8.9,
-   9, 9.1,
- 9.2,  -1,
- 9.3, 9.4,
- 9.5, 9.6,
- 9.7, 9.8,
- 9.9,   1,
-  10,10.1,
-10.2,10.3,
-10.4,10.5,
-10.6,10.7,
-10.8,10.9,
-  -1,  11,
-11.1,11.2,
-11.3,11.4,
-11.5,11.6,
-11.7,11.8,
-   1,11.9,
-  12,12.1,
-12.2,12.3,
-12.4,12.5,
-12.6,12.7,
-12.8,12.9,
-  13,  -1,
-13.1,13.2,
-13.3,13.4,
-13.5,13.6,
-13.7,   1,
-13.8,13.9,
-  14,14.1,
-14.2,14.3,
-14.4,14.5,
-14.6,14.7,
-  -1,14.8,
-14.9,  15,
-15.1,15.2,
-15.3,15.4,
-15.5,15.6,
-   1,15.7,
-15.8,15.9,
-  16,16.1,
-16.2,16.3,
-16.4,16.5,
-16.6,16.7,
-16.8,16.9,
-  17,17.1,
-17.2,17.3,
-17.4,17.5,
-17.6,   1,
-17.7,17.8,
-17.9,  18,
-18.1,18.2,
-18.3,18.4,
-18.5,18.6,
-18.7,18.8,
-18.9,  19,
-19.1,19.2,
-19.3,19.4,
-19.5,19.6,
-   1,19.7,
-19.8,19.9,
-  20,20.1,
-20.2,20.3,
-20.4,20.5,
-20.6,20.7,
-20.8,20.9,
-  21,21.1,
-21.2,21.3,
-21.4,21.5,
-21.6,   1,
-21.7,21.8,
-21.9,  22,
-22.1,22.2,
-22.3,22.4,
-22.5,22.6,
-22.7,22.8,
-22.9,  23,
-23.1,23.2,
-23.3,23.4,
-23.5,23.6,
-   1,23.7,
-23.8,23.9,
-  24,   1,
-24.1,24.2,
-24.3,24.4,
-24.5,24.6,
-24.7,24.8,
-24.9,  25,
-25.1,25.2,
-25.3,25.4,
-25.5,   1,
-25.6,25.7,
-   1,25.8,
-25.9,  26,
-26.1,26.2,
-26.3,26.4,
-26.5,26.6,
-26.7,26.8,
-26.9,  27,
-27.1,27.2,
-27.3,27.4,
-   1,27.5,
-27.6,27.7,
-27.8,   1,
-27.9,  28,
-28.1,28.2,
-28.3,28.4,
-28.5,28.6,
-28.7,28.8,
-28.9,  29,
-29.1,29.2,
-29.3,   1,
-29.4,29.5,
-   1,29.6,
-29.7,29.8,
-29.9,  30,
-30.1,  -1,
-30.2,30.3,
-30.4,30.5,
-30.6,30.7,
-30.8,   1,
-30.9,  31,
-31.1,31.2,
-31.3,31.4,
-31.5,31.6,
-31.7,31.8,
-  -1,31.9,
-  32,32.1,
-32.2,32.3,
-32.4,32.5,
-   1,32.6,
-32.7,32.8,
-32.9,  33,
-33.1,33.2,
-33.3,33.4,
-33.5,33.6,
-33.7,33.8,
-33.9,  -1,
-  34,34.1,
-34.2,34.3,
-34.4,34.5,
-34.6,   1,
-34.7,34.8,
-34.9,  35,
-35.1,35.2,
-35.3,35.4,
-35.5,35.6,
-  -1,35.7,
-35.8,35.9,
-  36,36.1,
-36.2,36.3,
-   1,36.4,
-36.5,36.6,
-36.7,36.8,
-};
-
-// ----------------------------------------------------------------------
-// Computed values
-// ----------------------------------------------------------------------
-
-const double pylith::faults::CohesiveDynLDataQuad4::_orientation[] = {
-  0.0,  -1.0,  -1.0, 0.0,
-  0.0,  -1.0,  -1.0, 0.0
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_area[] = {
-  1.0,
-  1.0,
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_initialTractions[] = {
-  1.0, -2.0,
-  1.1, -2.1,
-};
-
-
-const int pylith::faults::CohesiveDynLDataQuad4::_numConstraintVert = 2;
-const int pylith::faults::CohesiveDynLDataQuad4::_constraintVertices[] = {
-  10, 11
-};
-
-// ----------------------------------------------------------------------
-// Stick case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldIncrStick[] = {
-  1.1, 29.1,
-  1.2, 29.2,
-  1.3, 29.3, // 4
-  1.4, 29.4, // 5
-  1.5, 29.5,
-  1.6, 29.6,
-  1.7, 29.7, // 8
-  1.9, 29.9, // 9
-  1.8, -29.8, // 10
-  1.0, -29.0, // 11
-};
-
-// No change in fieldIncr
-// Zero slip
-
-// ----------------------------------------------------------------------
-// Slip case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldIncrSlip[] = {
-  9.1, 10.1,
-  9.2, 10.2,
-  9.3, 10.3, // 4
-  9.4, 10.4, // 5
-  9.5, 10.5,
-  9.6, 10.6,
-  9.7, 10.7, // 8
-  9.9, 10.9, // 9
-  9.8, -10.8, // 10
-  9.0, -10.0, // 11
-};
-
-// Output
-// :TODO: Update Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldIncrSlipE[] = {
-  9.1, 10.1,
-  9.2, 10.2,
-  9.3, 10.3, // 4
-  9.4, 10.4, // 5
-  9.5, 10.5,
-  9.6, 10.6,
-  9.7, 10.7, // 8
-  9.9, 10.9, // 9
-  -7.0, -10.8, // 10
-  -6.14, -10.0, // 11
-};
-
-// :TODO: Update slip values based on changes in Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataQuad4::_slipSlipE[] = {
-  33.6, 0.0,
-  30.28, 0.0,
-};
-
-// ----------------------------------------------------------------------
-// Open case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldIncrOpen[] = {
-  9.1, 10.1,
-  9.2, 10.2,
-  9.3, 10.3, // 4
-  9.4, 10.4, // 5
-  9.5, 10.5,
-  9.6, 10.6,
-  9.7, 10.7, // 8
-  9.9, 10.9, // 9
-  9.8, 10.8, // 10
-  9.0, 10.0, // 11
-};
-
-// Output
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldIncrOpenE[] = {
-  9.1, 10.1,
-  9.2, 10.2,
-  9.3, 10.3, // 4
-  9.4, 10.4, // 5
-  9.5, 10.5,
-  9.6, 10.6,
-  9.7, 10.7, // 8
-  9.9, 10.9, // 9
-  -8.8, -9.8, // 10
-  -8.0, -9.0, // 11
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_slipOpenE[] = {
-  37.2, 41.2,
-  34.0, 38.0,
-};
-
-// ----------------------------------------------------------------------
-pylith::faults::CohesiveDynLDataQuad4::CohesiveDynLDataQuad4(void)
-{ // constructor
-  meshFilename = const_cast<char*>(_meshFilename);
-  spaceDim = _spaceDim;
-  cellDim = _cellDim;
-  numBasis = _numBasis;
-  numQuadPts = _numQuadPts;
-  quadPts = const_cast<double*>(_quadPts);
-  quadWts = const_cast<double*>(_quadWts);
-  basis = const_cast<double*>(_basis);
-  basisDeriv = const_cast<double*>(_basisDeriv);
-  verticesRef = const_cast<double*>(_verticesRef);
-  id = _id;
-  label = const_cast<char*>(_label);
-  initialTractFilename = const_cast<char*>(_initialTractFilename);
-
-  fieldT = const_cast<double*>(_fieldT);
-  jacobian = const_cast<double*>(_jacobian);
-  orientation = const_cast<double*>(_orientation);
-  area = const_cast<double*>(_area);
-  initialTractions = const_cast<double*>(_initialTractions);
-
-  constraintVertices = const_cast<int*>(_constraintVertices);
-  numConstraintVert = _numConstraintVert;  
-
-  // Stick
-  fieldIncrStick = const_cast<double*>(_fieldIncrStick);
-
-  // Slip
-  fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
-  fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
-  slipSlipE = const_cast<double*>(_slipSlipE);
-
-  // Open
-  fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
-  fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
-  slipOpenE = const_cast<double*>(_slipOpenE);
-} // constructor
-
-pylith::faults::CohesiveDynLDataQuad4::~CohesiveDynLDataQuad4(void)
-{}
-
-
-// End of file

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,77 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#if !defined(pylith_faults_cohesivedynldataquad4_hh)
-#define pylith_faults_cohesivedynldataquad4_hh
-
-#include "CohesiveDynLData.hh"
-
-namespace pylith {
-  namespace faults {
-     class CohesiveDynLDataQuad4;
-  } // pylith
-} // faults
-
-class pylith::faults::CohesiveDynLDataQuad4 : public CohesiveDynLData
-{
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public: 
-
-  /// Constructor
-  CohesiveDynLDataQuad4(void);
-
-  /// Destructor
-  ~CohesiveDynLDataQuad4(void);
-
-// PRIVATE MEMBERS //////////////////////////////////////////////////////
-private:
-
-  static const char* _meshFilename; ///< Filename of input mesh
-
-  static const int _spaceDim; ///< Number of dimensions in vertex coordinates
-  static const int _cellDim; ///< Number of dimensions associated with cell
-
-  static const int _numBasis; ///< Number of vertices in cell
-  static const int _numQuadPts; ///< Number of quadrature points
-  static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
-  static const double _quadWts[]; ///< Weights of quadrature points
-  static const double _basis[]; ///< Basis fns at quadrature points
-  static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
-  static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
-
-  static const int _id; ///< Fault material identifier
-  static const char* _label; ///< Label for fault
-  static const char* _initialTractFilename; ///< Name of db for initial tractions.
-
-  static const double _fieldT[]; ///< Solution field at time t.
-  static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
-  static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
-  static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
-  static const double _jacobian[]; ///< Jacobian sparse matrix.
-
-  static const double _orientation[]; ///< Expected values for fault orientation.
-  static const double _area[]; ///< Expected values for fault area.
-  static const double _initialTractions[]; ///< Expected values for initial tractions.
-  static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
-  static const double _slipSlipE[]; ///< Expected values for slip for slip case.
-  static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
-  static const double _slipOpenE[]; ///< Expected values for slip for opening case.
-  static const int _constraintVertices[]; ///< Expected points for constraint vertices
-  static const int _numConstraintVert; ///< Number of constraint vertices
-
-};
-
-#endif // pylith_faults_cohesivedynldataquad4_hh
-
-
-// End of file

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,630 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-
-/* Original mesh
- *
- * Cells are 0-1, vertices are 2-6.
- *
- * 2   3,4,5  6
- *
- *     ^^^^^ Face in x-y plane
- *
- * After adding cohesive elements
- *
- * Cells are 0-1,10, vertices are 2-9.
- *
- * 2   3,4,5  7,8,9   6
- *             10,11,12
- *     ^^^^^^^^^^^^ Cohesive element in x-y plane.
- */
-
-#include "CohesiveDynLDataTet4.hh"
-
-const char* pylith::faults::CohesiveDynLDataTet4::_meshFilename =
-  "data/tet4.mesh";
-
-const int pylith::faults::CohesiveDynLDataTet4::_spaceDim = 3;
-
-const int pylith::faults::CohesiveDynLDataTet4::_cellDim = 2;
-
-const int pylith::faults::CohesiveDynLDataTet4::_numBasis = 3;
-
-const int pylith::faults::CohesiveDynLDataTet4::_numQuadPts = 1;
-
-const double pylith::faults::CohesiveDynLDataTet4::_quadPts[] = {
-  3.33333333e-01,  3.33333333e-01,
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_quadWts[] = {
-  5.00000000e-01,
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_basis[] = {
-  3.33333333e-01,  3.33333333e-01,
-  3.33333333e-01,};
-
-const double pylith::faults::CohesiveDynLDataTet4::_basisDeriv[] = {
- -1.00000000e+00, -1.00000000e+00,
-  1.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.00000000e+00,
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_verticesRef[] = {
- -1.00000000e+00, -1.00000000e+00,
-  1.00000000e+00, -1.00000000e+00,
- -1.00000000e+00,  1.00000000e+00,
-};
-
-const int pylith::faults::CohesiveDynLDataTet4::_id = 10;
-
-const char* pylith::faults::CohesiveDynLDataTet4::_label = "fault";
-
-const char* pylith::faults::CohesiveDynLDataTet4::_initialTractFilename = 
-  "data/tet4_initialtract.spatialdb";
-
-const double pylith::faults::CohesiveDynLDataTet4::_fieldT[] = {
-  7.1, 8.1, 9.1,
-  7.2, 8.2, 9.2, // 3
-  7.3, 8.3, 9.3, // 4
-  7.4, 8.4, 9.4, // 5
-  7.5, 8.5, 9.5,
-  7.6, 8.6, 9.6, // 7
-  7.8, 8.8, 9.8, // 8
-  7.0, 8.0, 9.0, // 9
-  7.7, 8.7, 9.7, // 10
-  7.9, 8.9, 9.9, // 11
-  7.1, 8.1, 9.1, // 12
-};
-
-// :TODO: Make sensible values for Jacobian for DOF on positive and
-// negative sides of the fault. Add semi-random values for other DOF.
-const double pylith::faults::CohesiveDynLDataTet4::_jacobian[] = {
-    1,  0.1,  0.2,
-  0.3,  0.4,  0.5,
-  0.6,  0.7,  0.8,
-  0.9,    1,  1.1,
-  1.2,  1.3,  1.4,
-  1.5,  1.6,  1.7,
-  1.8,  1.9,    2,
-  2.1,  2.2,  2.3,
-  2.4,  2.5,  2.6,
-  2.7,  2.8,  2.9,
-    3,  3.1,  3.2,
-  3.3,    1,  3.4,
-  3.5,  3.6,  3.7,
-  3.8,  3.9,    4,
-  4.1,  4.2,  4.3,
-  4.4,  4.5,  4.6,
-  4.7,  4.8,  4.9,
-    5,  5.1,  5.2,
-  5.3,  5.4,  5.5,
-  5.6,  5.7,  5.8,
-  5.9,    6,  6.1,
-  6.2,  6.3,  6.4,
-  6.5,  6.6,    1,
-  6.7,  6.8,  6.9,
-    7,  7.1,  7.2,
-  7.3,  7.4,  7.5,
-  7.6,  7.7,  7.8,
-  7.9,    8,  8.1,
-  8.2,  8.3,  8.4,
-  8.5,  8.6,  8.7,
-  8.8,  8.9,    9,
-  9.1,  9.2,  9.3,
-  9.4,  9.5,  9.6,
-  9.7,  9.8,  9.9,
-    1,   10, 10.1,
- 10.2, 10.3, 10.4,
- 10.5, 10.6, 10.7,
- 10.8, 10.9,   11,
- 11.1, 11.2, 11.3,
- 11.4, 11.5, 11.6,
- 11.7, 11.8, 11.9,
-   12, 12.1,   -1,
- 12.2, 12.3, 12.4,
- 12.5, 12.6, 12.7,
- 12.8, 12.9,   13,
- 13.1,    1, 13.2,
- 13.3, 13.4, 13.5,
- 13.6, 13.7, 13.8,
- 13.9,   14, 14.1,
- 14.2, 14.3, 14.4,
- 14.5, 14.6, 14.7,
- 14.8, 14.9,   15,
-   -1, 15.1, 15.2,
- 15.3, 15.4, 15.5,
- 15.6, 15.7, 15.8,
- 15.9,   16, 16.1,
- 16.2, 16.3,    1,
- 16.4, 16.5, 16.6,
- 16.7, 16.8, 16.9,
-   17, 17.1, 17.2,
- 17.3, 17.4, 17.5,
- 17.6, 17.7, 17.8,
- 17.9,   18, 18.1,
- 18.2,   -1, 18.3,
- 18.4, 18.5, 18.6,
- 18.7, 18.8, 18.9,
-   19, 19.1, 19.2,
- 19.3, 19.4, 19.5,
-    1, 19.6, 19.7,
- 19.8, 19.9,   20,
- 20.1, 20.2, 20.3,
- 20.4, 20.5, 20.6,
- 20.7, 20.8, 20.9,
-   21, 21.1, 21.2,
- 21.3, 21.4, 21.5,
- 21.6, 21.7,   -1,
- 21.8, 21.9,   22,
- 22.1, 22.2, 22.3,
- 22.4, 22.5, 22.6,
- 22.7,    1, 22.8,
- 22.9,   23, 23.1,
- 23.2, 23.3, 23.4,
- 23.5, 23.6, 23.7,
- 23.8, 23.9,   24,
- 24.1, 24.2, 24.3,
- 24.4, 24.5, 24.6,
-   -1, 24.7, 24.8,
- 24.9,   25, 25.1,
- 25.2, 25.3, 25.4,
- 25.5, 25.6, 25.7,
- 25.8, 25.9,    1,
-   26, 26.1, 26.2,
- 26.3, 26.4, 26.5,
- 26.6, 26.7, 26.8,
- 26.9,   27, 27.1,
- 27.2, 27.3, 27.4,
- 27.5, 27.6, 27.7,
- 27.8,   -1, 27.9,
-   28, 28.1, 28.2,
- 28.3, 28.4, 28.5,
- 28.6, 28.7, 28.8,
- 28.9,   29, 29.1,
-    1, 29.2, 29.3,
- 29.4, 29.5, 29.6,
- 29.7, 29.8, 29.9,
-   30, 30.1, 30.2,
- 30.3, 30.4, 30.5,
- 30.6, 30.7, 30.8,
- 30.9,   31, 31.1,
- 31.2, 31.3,   -1,
- 31.4, 31.5, 31.6,
- 31.7, 31.8, 31.9,
-   32, 32.1, 32.2,
- 32.3,    1, 32.4,
- 32.5, 32.6, 32.7,
- 32.8, 32.9,   33,
- 33.1, 33.2, 33.3,
- 33.4, 33.5, 33.6,
- 33.7, 33.8, 33.9,
-   34, 34.1, 34.2,
-   -1, 34.3, 34.4,
- 34.5, 34.6, 34.7,
- 34.8, 34.9,   35,
- 35.1, 35.2, 35.3,
- 35.4, 35.5,    1,
- 35.6, 35.7, 35.8,
- 35.9,   36, 36.1,
- 36.2, 36.3, 36.4,
- 36.5, 36.6, 36.7,
- 36.8, 36.9,   37,
- 37.1, 37.2, 37.3,
- 37.4,   -1, 37.5,
- 37.6, 37.7, 37.8,
- 37.9,   38, 38.1,
- 38.2, 38.3, 38.4,
- 38.5, 38.6, 38.7,
-    1, 38.8, 38.9,
-   39, 39.1, 39.2,
- 39.3, 39.4, 39.5,
- 39.6, 39.7, 39.8,
- 39.9,   40, 40.1,
- 40.2, 40.3, 40.4,
- 40.5, 40.6, 40.7,
- 40.8, 40.9,   41,
- 41.1, 41.2, 41.3,
- 41.4, 41.5, 41.6,
- 41.7, 41.8, 41.9,
-   42,    1, 42.1,
- 42.2, 42.3, 42.4,
- 42.5, 42.6, 42.7,
- 42.8, 42.9,   43,
- 43.1, 43.2, 43.3,
- 43.4, 43.5, 43.6,
- 43.7, 43.8, 43.9,
-   44, 44.1, 44.2,
- 44.3, 44.4, 44.5,
- 44.6, 44.7, 44.8,
- 44.9,   45, 45.1,
- 45.2, 45.3,    1,
- 45.4, 45.5, 45.6,
- 45.7, 45.8, 45.9,
-   46, 46.1, 46.2,
- 46.3, 46.4, 46.5,
- 46.6, 46.7, 46.8,
- 46.9,   47, 47.1,
- 47.2, 47.3, 47.4,
- 47.5, 47.6, 47.7,
- 47.8, 47.9,   48,
- 48.1, 48.2, 48.3,
- 48.4, 48.5, 48.6,
-    1, 48.7, 48.8,
- 48.9,   49, 49.1,
- 49.2, 49.3, 49.4,
- 49.5, 49.6,    1,
- 49.7, 49.8, 49.9,
-   50, 50.1, 50.2,
- 50.3, 50.4, 50.5,
- 50.6, 50.7, 50.8,
- 50.9,   51, 51.1,
- 51.2, 51.3, 51.4,
- 51.5, 51.6, 51.7,
- 51.8,    1, 51.9,
-   52, 52.1, 52.2,
- 52.3, 52.4, 52.5,
-    1, 52.6, 52.7,
- 52.8, 52.9,   53,
- 53.1, 53.2, 53.3,
- 53.4, 53.5, 53.6,
- 53.7, 53.8, 53.9,
-   54, 54.1, 54.2,
- 54.3, 54.4, 54.5,
- 54.6, 54.7, 54.8,
- 54.9,   55,    1,
- 55.1, 55.2, 55.3,
- 55.4, 55.5, 55.6,
- 55.7,    1, 55.8,
- 55.9,   56, 56.1,
- 56.2, 56.3, 56.4,
- 56.5, 56.6, 56.7,
- 56.8, 56.9,   57,
- 57.1, 57.2, 57.3,
- 57.4, 57.5, 57.6,
- 57.7, 57.8, 57.9,
-   58, 58.1, 58.2,
-    1, 58.3, 58.4,
- 58.5, 58.6, 58.7,
- 58.8, 58.9,   59,
- 59.1, 59.2,    1,
- 59.3, 59.4, 59.5,
- 59.6, 59.7, 59.8,
- 59.9,   60, 60.1,
- 60.2, 60.3, 60.4,
- 60.5, 60.6, 60.7,
- 60.8, 60.9,   61,
- 61.1, 61.2, 61.3,
- 61.4,    1, 61.5,
- 61.6, 61.7, 61.8,
- 61.9,   62, 62.1,
-    1, 62.2, 62.3,
- 62.4, 62.5, 62.6,
- 62.7, 62.8, 62.9,
-   63, 63.1, 63.2,
- 63.3, 63.4, 63.5,
- 63.6, 63.7, 63.8,
- 63.9,   64, 64.1,
- 64.2, 64.3, 64.4,
- 64.5, 64.6,    1,
- 64.7, 64.8, 64.9,
-   65, 65.1, 65.2,
- 65.3,    1, 65.4,
- 65.5, 65.6, 65.7,
- 65.8, 65.9,   66,
- 66.1, 66.2, 66.3,
- 66.4, 66.5, 66.6,
- 66.7, 66.8, 66.9,
-   67, 67.1, 67.2,
- 67.3, 67.4, 67.5,
- 67.6, 67.7, 67.8,
-    1, 67.9,   68,
- 68.1, 68.2, 68.3,
- 68.4, 68.5, 68.6,
- 68.7, 68.8,    1,
- 68.9,   69, 69.1,
- 69.2, 69.3, 69.4,
- 69.5, 69.6, 69.7,
- 69.8, 69.9,   70,
- 70.1, 70.2, 70.3,
- 70.4, 70.5, 70.6,
- 70.7, 70.8, 70.9,
-   71,    1, 71.1,
- 71.2, 71.3, 71.4,
- 71.5, 71.6, 71.7,
-    1, 71.8, 71.9,
-   72, 72.1, 72.2,
- 72.3, 72.4, 72.5,
- 72.6, 72.7, 72.8,
- 72.9,   73, 73.1,
- 73.2, 73.3, 73.4,
- 73.5, 73.6, 73.7,
- 73.8, 73.9,   74,
- 74.1, 74.2,    1,
- 74.3, 74.4, 74.5,
- 74.6, 74.7, 74.8,
- 74.9,    1,   75,
- 75.1, 75.2, 75.3,
- 75.4,   -1, 75.5,
- 75.6, 75.7, 75.8,
- 75.9,   76, 76.1,
- 76.2, 76.3, 76.4,
- 76.5,    1, 76.6,
- 76.7, 76.8, 76.9,
-   77, 77.1, 77.2,
- 77.3, 77.4, 77.5,
- 77.6, 77.7, 77.8,
- 77.9,   78, 78.1,
- 78.2, 78.3, 78.4,
- 78.5, 78.6,   -1,
- 78.7, 78.8, 78.9,
-   79, 79.1, 79.2,
- 79.3, 79.4, 79.5,
- 79.6, 79.7,    1,
- 79.8, 79.9,   80,
- 80.1, 80.2, 80.3,
- 80.4, 80.5, 80.6,
- 80.7, 80.8, 80.9,
-   81, 81.1, 81.2,
- 81.3, 81.4, 81.5,
-   -1, 81.6, 81.7,
- 81.8, 81.9,   82,
- 82.1, 82.2, 82.3,
- 82.4, 82.5, 82.6,
-    1, 82.7, 82.8,
- 82.9,   83, 83.1,
- 83.2, 83.3, 83.4,
- 83.5, 83.6, 83.7,
- 83.8, 83.9,   84,
- 84.1, 84.2, 84.3,
- 84.4, 84.5, 84.6,
- 84.7, 84.8, 84.9,
-   85,   -1, 85.1,
- 85.2, 85.3, 85.4,
- 85.5, 85.6, 85.7,
- 85.8, 85.9,   86,
- 86.1,    1, 86.2,
- 86.3, 86.4, 86.5,
- 86.6, 86.7, 86.8,
- 86.9,   87, 87.1,
- 87.2, 87.3, 87.4,
- 87.5, 87.6, 87.7,
- 87.8, 87.9,   88,
- 88.1, 88.2,   -1,
- 88.3, 88.4, 88.5,
- 88.6, 88.7, 88.8,
- 88.9,   89, 89.1,
- 89.2, 89.3,    1,
- 89.4, 89.5, 89.6,
- 89.7, 89.8, 89.9,
-   90, 90.1, 90.2,
- 90.3, 90.4, 90.5,
- 90.6, 90.7, 90.8,
- 90.9,   91, 91.1,
-   -1, 91.2, 91.3,
- 91.4, 91.5, 91.6,
- 91.7, 91.8, 91.9,
-   92, 92.1, 92.2,
-    1, 92.3, 92.4,
- 92.5, 92.6, 92.7,
- 92.8, 92.9,   93,
- 93.1, 93.2, 93.3,
- 93.4, 93.5, 93.6,
- 93.7, 93.8, 93.9,
-   94, 94.1, 94.2,
- 94.3, 94.4, 94.5,
- 94.6,   -1, 94.7,
- 94.8, 94.9,   95,
- 95.1, 95.2, 95.3,
- 95.4, 95.5, 95.6,
- 95.7,    1, 95.8,
- 95.9,   96, 96.1,
- 96.2, 96.3, 96.4,
- 96.5, 96.6, 96.7,
- 96.8, 96.9,   97,
- 97.1, 97.2, 97.3,
- 97.4, 97.5, 97.6,
- 97.7, 97.8,   -1,
- 97.9,   98, 98.1,
- 98.2, 98.3, 98.4,
- 98.5, 98.6, 98.7,
- 98.8, 98.9,    1,
-   99, 99.1, 99.2,
- 99.3, 99.4, 99.5,
- 99.6, 99.7, 99.8,
- 99.9,  100,100.1,
-100.2,100.3,100.4,
-100.5,100.6,100.7,
-   -1,100.8,100.9,
-  101,101.1,101.2,
-101.3,101.4,101.5,
-101.6,101.7,101.8,
-    1,101.9,  102,
-102.1,102.2,102.3,
-102.4,102.5,102.6,
-102.7,102.8,102.9,
-};
-
-// ----------------------------------------------------------------------
-// Computed values
-// ----------------------------------------------------------------------
-
-const double pylith::faults::CohesiveDynLDataTet4::_orientation[] = {
-  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
-  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
-  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_area[] = {
-  1.0/3.0, 
-  1.0/3.0, 
-  1.0/3.0,
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_initialTractions[] = {
-  1.0, 2.0, -3.0,
-  1.1, 2.1, -3.1,
-  1.2, 2.2, -3.2,
-};
-
-
-const int pylith::faults::CohesiveDynLDataTet4::_numConstraintVert = 3;
-const int pylith::faults::CohesiveDynLDataTet4::_constraintVertices[] = {
-  10, 11, 12
-};
-
-// ----------------------------------------------------------------------
-// Stick case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrStick[] = {
-  1.1, 2.1, 35.1,
-  1.2, 2.2, 35.2, // 3
-  1.3, 2.3, 35.3, // 4
-  1.4, 2.4, 35.4, // 5
-  1.5, 2.5, 35.5,
-  1.6, 2.6, 35.6, // 7
-  1.8, 2.8, 35.8, // 8
-  1.0, 2.0, 35.0, // 9
-  1.7, 2.7, -35.7, // 10
-  1.9, 2.9, -35.9, // 11
-  1.1, 2.1, -35.1, // 12
-};
-
-// No change in fieldIncr
-// Zero slip
-
-// ----------------------------------------------------------------------
-// Slip case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrSlip[] = {
-  8.1, 9.1, 10.1,
-  8.2, 9.2, 10.2, // 3
-  8.3, 9.3, 10.3, // 4
-  8.4, 9.4, 10.4, // 5
-  8.5, 9.5, 10.5,
-  8.6, 9.6, 10.6, // 7
-  8.8, 9.8, 10.8, // 8
-  8.0, 9.0, 10.0, // 9
-  8.7, 9.7, -10.7, // 10
-  8.9, 9.9, -10.9, // 11
-  8.1, 9.1, -10.1, // 12
-};
-
-// Output
-// :TODO: Update Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrSlipE[] = {
-  8.1, 9.1, 10.1,
-  8.2, 9.2, 10.2, // 3
-  8.3, 9.3, 10.3, // 4
-  8.4, 9.4, 10.4, // 5
-  8.5, 9.5, 10.5,
-  8.6, 9.6, 10.6, // 7
-  8.8, 9.8, 10.8, // 8
-  8.0, 9.0, 10.0, // 9
-  -6.90156, -7.80418, -10.7, // 10
-  -7.08708, -7.9903, -10.9, // 11
-  -6.27887, -7.17083, -10.1, // 12
-};
-
-// :TODO: Update slip values based on changes in Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataTet4::_slipSlipE[] = {
-  31.203110740589327,  35.008368147978267,                   0.0,
-  31.974152400186210,  35.780599114494088,                   0.0,
-  28.757749464750159,  32.541663868006758,                   0.0,
-};
-
-// ----------------------------------------------------------------------
-// Open case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrOpen[] = {
-  8.1, 9.1, 10.1,
-  8.2, 9.2, 10.2, // 3
-  8.3, 9.3, 10.3, // 4
-  8.4, 9.4, 10.4, // 5
-  8.5, 9.5, 10.5,
-  8.6, 9.6, 10.6, // 7
-  8.8, 9.8, 10.8, // 8
-  8.0, 9.0, 10.0, // 9
-  8.7, 9.7, 10.7, // 10
-  8.9, 9.9, 10.9, // 11
-  8.1, 9.1, 10.1, // 12
-};
-
-// Output
-const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrOpenE[] = {
-  8.1, 9.1, 10.1,
-  8.2, 9.2, 10.2, // 3
-  8.3, 9.3, 10.3, // 4
-  8.4, 9.4, 10.4, // 5
-  8.5, 9.5, 10.5,
-  8.6, 9.6, 10.6, // 7
-  8.8, 9.8, 10.8, // 8
-  8.0, 9.0, 10.0, // 9
-  -7.7, -8.7, -9.7, // 10
-  -7.9, -8.9, -9.9, // 11
-  -7.1, -8.1, -9.1, // 12
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_slipOpenE[] = {
-  32.8, 36.8, 40.8,
-  33.6, 37.6, 41.6,
-  30.4, 34.4, 38.4,
-};
-
-// ----------------------------------------------------------------------
-pylith::faults::CohesiveDynLDataTet4::CohesiveDynLDataTet4(void)
-{ // constructor
-  meshFilename = const_cast<char*>(_meshFilename);
-  spaceDim = _spaceDim;
-  cellDim = _cellDim;
-  numBasis = _numBasis;
-  numQuadPts = _numQuadPts;
-  quadPts = const_cast<double*>(_quadPts);
-  quadWts = const_cast<double*>(_quadWts);
-  basis = const_cast<double*>(_basis);
-  basisDeriv = const_cast<double*>(_basisDeriv);
-  verticesRef = const_cast<double*>(_verticesRef);
-  id = _id;
-  label = const_cast<char*>(_label);
-  initialTractFilename = const_cast<char*>(_initialTractFilename);
-
-  fieldT = const_cast<double*>(_fieldT);
-  jacobian = const_cast<double*>(_jacobian);
-  orientation = const_cast<double*>(_orientation);
-  area = const_cast<double*>(_area);
-  initialTractions = const_cast<double*>(_initialTractions);
-
-  constraintVertices = const_cast<int*>(_constraintVertices);
-  numConstraintVert = _numConstraintVert;  
-
-  // Stick
-  fieldIncrStick = const_cast<double*>(_fieldIncrStick);
-
-  // Slip
-  fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
-  fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
-  slipSlipE = const_cast<double*>(_slipSlipE);
-
-  // Open
-  fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
-  fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
-  slipOpenE = const_cast<double*>(_slipOpenE);
-} // constructor
-
-pylith::faults::CohesiveDynLDataTet4::~CohesiveDynLDataTet4(void)
-{}
-
-
-// End of file

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,77 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#if !defined(pylith_faults_cohesivedynldatatet4_hh)
-#define pylith_faults_cohesivedynldatatet4_hh
-
-#include "CohesiveDynLData.hh"
-
-namespace pylith {
-  namespace faults {
-     class CohesiveDynLDataTet4;
-  } // pylith
-} // faults
-
-class pylith::faults::CohesiveDynLDataTet4 : public CohesiveDynLData
-{
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public: 
-
-  /// Constructor
-  CohesiveDynLDataTet4(void);
-
-  /// Destructor
-  ~CohesiveDynLDataTet4(void);
-
-// PRIVATE MEMBERS //////////////////////////////////////////////////////
-private:
-
-  static const char* _meshFilename; ///< Filename of input mesh
-
-  static const int _spaceDim; ///< Number of dimensions in vertex coordinates
-  static const int _cellDim; ///< Number of dimensions associated with cell
-
-  static const int _numBasis; ///< Number of vertices in cell
-  static const int _numQuadPts; ///< Number of quadrature points
-  static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
-  static const double _quadWts[]; ///< Weights of quadrature points
-  static const double _basis[]; ///< Basis fns at quadrature points
-  static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
-  static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
-
-  static const int _id; ///< Fault material identifier
-  static const char* _label; ///< Label for fault
-  static const char* _initialTractFilename; ///< Name of db for initial tractions.
-
-  static const double _fieldT[]; ///< Solution field at time t.
-  static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
-  static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
-  static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
-  static const double _jacobian[]; ///< Jacobian sparse matrix.
-
-  static const double _orientation[]; ///< Expected values for fault orientation.
-  static const double _area[]; ///< Expected values for fault area.
-  static const double _initialTractions[]; ///< Expected values for initial tractions.
-  static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
-  static const double _slipSlipE[]; ///< Expected values for slip for slip case.
-  static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
-  static const double _slipOpenE[]; ///< Expected values for slip for opening case.
-  static const int _constraintVertices[]; ///< Expected points for constraint vertices
-  static const int _numConstraintVert; ///< Number of constraint vertices
-
-};
-
-#endif // pylith_faults_cohesivedynldatatet4_hh
-
-
-// End of file

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,388 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-/* Original mesh using Sieve labels.
- *
- * Cells are 0-1, vertices are 2-5.
- *
- *              3
- *             /|\
- *            / | \
- *           /  |  \
- *          /   |   \
- *         2    |    5
- *          \   |   /
- *           \  |  /
- *            \ | /
- *             \|/
- *              4
- *
- *
- * After adding cohesive elements using Sieve labels.
- *
- * Cells are 0-1, 8, vertices are 2-7.
- *
- *              6 -8- 3
- *             /|     |\
- *            / |     | \
- *           /  |     |  \
- *          /   |     |   \
- *         2    |     |    5
- *          \   |     |   /
- *           \  |     |  /
- *            \ |     | /
- *             \|     |/
- *              7 -9- 4
- */
-
-#include "CohesiveDynLDataTri3.hh"
-
-const char* pylith::faults::CohesiveDynLDataTri3::_meshFilename =
-  "data/tri3.mesh";
-
-const int pylith::faults::CohesiveDynLDataTri3::_spaceDim = 2;
-
-const int pylith::faults::CohesiveDynLDataTri3::_cellDim = 1;
-
-const int pylith::faults::CohesiveDynLDataTri3::_numBasis = 2;
-
-const int pylith::faults::CohesiveDynLDataTri3::_numQuadPts = 1;
-
-const double pylith::faults::CohesiveDynLDataTri3::_quadPts[] = {
-  0.0,
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_quadWts[] = {
-  2.0,
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_basis[] = {
-  0.5,
-  0.5
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_basisDeriv[] = {
-  -0.5,
-   0.5
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_verticesRef[] = {
-  -1.0, 1.0
-};
-
-const int pylith::faults::CohesiveDynLDataTri3::_id = 10;
-
-const char* pylith::faults::CohesiveDynLDataTri3::_label = "fault";
-
-const char* pylith::faults::CohesiveDynLDataTri3::_initialTractFilename = 
-  "data/tri3_initialtract.spatialdb";
-
-const double pylith::faults::CohesiveDynLDataTri3::_fieldT[] = {
-  8.1, 9.1,
-  8.2, 9.2, // 3
-  8.3, 9.3, // 4
-  8.4, 9.4,
-  8.5, 9.5, // 6
-  8.7, 9.7, // 7
-  8.6, 9.6, // 8
-  8.8, 9.8, // 9
-};
-
-// :TODO: Make sensible values for Jacobian for DOF on positive and
-// negative sides of the fault. Add semi-random values for other DOF.
-const double pylith::faults::CohesiveDynLDataTri3::_jacobian[] = {
-  1.0, 1.1, // 2x (values for row associated with vertex with label 2, x DOF)
-  0.1, 1.2,
-  0.2, 1.3,
-  0.3, 1.4,
-  0.4, 1.5,
-  0.5, 1.6,
-  0.6, 1.7,
-  0.7, 1.8,
-  2.1, 1.0, // 2y
-  2.2, 3.1,
-  2.3, 3.2,
-  2.4, 3.3,
-  2.5, 3.4,
-  2.6, 3.5,
-  2.7, 3.6,
-  2.8, 3.7,
-  4.1, 5.1, // 3x (values for row associated with vertex label 3, x DOF)
-  1.0, 5.2,
-  4.2, 5.3,
-  4.3, 5.4,
-  4.4, 5.5,
-  4.5, 5.6,
-  4.6,+1.0, // 8 (column for DOF associated with vertex label 8)
-  4.7, 5.7,
-  6.1, 7.1, // 3y
-  6.2, 1.0,
-  6.3, 7.2,
-  6.4, 7.3,
-  6.5, 7.4,
-  6.6, 7.5,
- +1.0, 7.6, //  8
-  6.7, 7.7,
-  8.1, 9.1, // 4x
-  8.2, 9.2,
-  1.0, 9.3,
-  8.3, 9.4,
-  8.4, 9.5,
-  8.5, 9.6,
-  8.6, 9.7,
-  8.7,+1.0, //  9
-  10.1, 11.1, // 4y
-  10.2, 11.2,
-  10.3, 1.0,
-  10.4, 11.3,
-  10.5, 11.4,
-  10.6, 11.5,
-  10.7, 11.6,
- +1.0, 11.7, //  9
-  12.1, 13.1, // 5x
-  12.2, 13.2,
-  12.3, 13.3,
-  1.0, 13.4,
-  12.4, 13.5,
-  12.5, 13.6,
-  12.6, 13.7,
-  12.7, 13.8,
-  14.1, 15.1, // 5y
-  14.2, 15.2,
-  14.3, 15.3,
-  14.4, 1.0,
-  14.5, 15.4,
-  14.6, 15.5,
-  14.7, 15.6,
-  14.8, 15.7,
-  16.1, 17.1, // 6x
-  16.2, 17.2,
-  16.3, 17.3,
-  16.4, 17.4,
-  1.0, 17.5,
-  16.5, 17.6,
-  16.6,-1.0, //  8
-  16.7, 17.7,
-  18.1, 19.1, // 6y
-  18.2, 19.2,
-  18.3, 19.3,
-  18.4, 19.4,
-  18.5, 1.0,
-  18.6, 19.5,
- -1.0, 19.6, //  8
-  18.7, 19.7,
-  20.1, 21.1, // 7x
-  20.2, 21.2,
-  20.3, 21.3,
-  20.4, 21.4,
-  20.5, 21.5,
-  1.0, 21.6,
-  20.6, 21.7,
-  20.7,-1.0, //  9
-  22.1, 23.1, // 7y
-  22.2, 23.2,
-  22.3, 23.3,
-  22.4, 23.4,
-  22.5, 23.5,
-  22.6, 1.0,
-  22.7, 23.6,
- -1.0, 23.7, //  9
-
-  24.1, 25.1, // 8x (rows associated with Lagrange multiplier vertex label 8)
-  24.2,+1.0, //  3
-  24.3, 25.2,
-  24.4, 25.3,
-  24.5,-1.0, //  6
-  24.6, 25.4,
-  24.7, 25.5,
-  24.8, 25.6,
-  26.1, 27.1, // 8y
- +1.0, 27.2, //  3
-  26.2, 27.3,
-  26.3, 27.4,
- -1.0, 27.5, //  6
-  26.4, 27.6,
-  26.5, 27.7,
-  26.6, 27.8,
-
-  29.1, 30.1, // 9x
-  29.2, 30.2,
-  29.3,+1.0, //  4
-  29.4, 30.3,
-  29.5, 30.4,
-  29.6,-1.0, //  7
-  29.7, 30.5,
-  29.8, 30.6,
-  31.1, 32.1, // 9y
-  31.2, 32.2,
- +1.0, 32.3, //  4
-  31.3, 32.4,
-  31.4, 32.5,
- -1.0, 32.6, //  7
-  31.5, 32.7,
-  31.6, 32.8,
-};
-
-// ----------------------------------------------------------------------
-// Computed values
-// ----------------------------------------------------------------------
-
-const double pylith::faults::CohesiveDynLDataTri3::_orientation[] = {
-  0.0, -1.0,  -1.0, 0.0,
-  0.0, -1.0,  -1.0, 0.0
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_area[] = {
-  1.0,
-  1.0,
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_initialTractions[] = {
-  1.0, -2.0,
-  1.1, -2.1,
-};
-
-
-const int pylith::faults::CohesiveDynLDataTri3::_numConstraintVert = 2;
-const int pylith::faults::CohesiveDynLDataTri3::_constraintVertices[] = {
-  8, 9
-};
-
-// ----------------------------------------------------------------------
-// Stick case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTri3::_fieldIncrStick[] = {
-  1.1, 29.1,
-  1.2, 29.2, // 3
-  1.3, 29.3, // 4
-  1.4, 29.4,
-  1.5, 29.5, // 6
-  1.7, 29.7, // 7
-  1.6, -29.6, // 8
-  1.8, -29.8, // 9
-};
-
-// No change in fieldIncr
-// Zero slip
-
-// ----------------------------------------------------------------------
-// Slip case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTri3::_fieldIncrSlip[] = {
-  9.1, 10.1,
-  9.2, 10.2, // 3
-  9.3, 10.3, // 4
-  9.4, 10.4,
-  9.5, 10.5, // 6
-  9.7, 10.7, // 7
-  9.6, -10.6, // 8
-  9.8, -10.8, // 9
-};
-
-// Output
-// :TODO: Update Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataTri3::_fieldIncrSlipE[] = {
-  9.1, 10.1,
-  9.2, 10.2, // 3
-  9.3, 10.3, // 4
-  9.4, 10.4,
-  9.5, 10.5, // 6
-  9.7, 10.7, // 7
-  -6.8, -10.6, // 8
-  -6.94, -10.8, // 9
-};
-
-// :TODO: Update slip values based on changes in Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataTri3::_slipSlipE[] = {
-  32.8, 0.0,
-  33.48, 0.0,
-};
-
-// ----------------------------------------------------------------------
-// Open case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTri3::_fieldIncrOpen[] = {
-  9.1, 10.1,
-  9.2, 10.2, // 3
-  9.3, 10.3, // 4
-  9.4, 10.4,
-  9.5, 10.5, // 6
-  9.7, 10.7, // 7
-  9.6, 10.6, // 8
-  9.8, 10.8, // 9
-};
-
-// Output
-const double pylith::faults::CohesiveDynLDataTri3::_fieldIncrOpenE[] = {
-  9.1, 10.1,
-  9.2, 10.2, // 3
-  9.3, 10.3, // 4
-  9.4, 10.4,
-  9.5, 10.5, // 6
-  9.7, 10.7, // 7
-  -8.6, -9.6, // 8
-  -8.8, -9.8, // 9
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_slipOpenE[] = {
-  36.4, 40.4,
-  37.2, 41.2,
-};
-
-// ----------------------------------------------------------------------
-pylith::faults::CohesiveDynLDataTri3::CohesiveDynLDataTri3(void)
-{ // constructor
-  meshFilename = const_cast<char*>(_meshFilename);
-  spaceDim = _spaceDim;
-  cellDim = _cellDim;
-  numBasis = _numBasis;
-  numQuadPts = _numQuadPts;
-  quadPts = const_cast<double*>(_quadPts);
-  quadWts = const_cast<double*>(_quadWts);
-  basis = const_cast<double*>(_basis);
-  basisDeriv = const_cast<double*>(_basisDeriv);
-  verticesRef = const_cast<double*>(_verticesRef);
-  id = _id;
-  label = const_cast<char*>(_label);
-  initialTractFilename = const_cast<char*>(_initialTractFilename);
-
-  fieldT = const_cast<double*>(_fieldT);
-  jacobian = const_cast<double*>(_jacobian);
-  orientation = const_cast<double*>(_orientation);
-  area = const_cast<double*>(_area);
-  initialTractions = const_cast<double*>(_initialTractions);
-
-  constraintVertices = const_cast<int*>(_constraintVertices);
-  numConstraintVert = _numConstraintVert;  
-
-  // Stick
-  fieldIncrStick = const_cast<double*>(_fieldIncrStick);
-
-  // Slip
-  fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
-  fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
-  slipSlipE = const_cast<double*>(_slipSlipE);
-
-  // Open
-  fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
-  fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
-  slipOpenE = const_cast<double*>(_slipOpenE);
-} // constructor
-
-pylith::faults::CohesiveDynLDataTri3::~CohesiveDynLDataTri3(void)
-{}
-
-
-// End of file

Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,77 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-//                           Brad T. Aagaard
-//                        U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#if !defined(pylith_faults_cohesivedynldatatri3_hh)
-#define pylith_faults_cohesivedynldatatri3_hh
-
-#include "CohesiveDynLData.hh"
-
-namespace pylith {
-  namespace faults {
-     class CohesiveDynLDataTri3;
-  } // pylith
-} // faults
-
-class pylith::faults::CohesiveDynLDataTri3 : public CohesiveDynLData
-{
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public: 
-
-  /// Constructor
-  CohesiveDynLDataTri3(void);
-
-  /// Destructor
-  ~CohesiveDynLDataTri3(void);
-
-// PRIVATE MEMBERS //////////////////////////////////////////////////////
-private:
-
-  static const char* _meshFilename; ///< Filename of input mesh
-
-  static const int _spaceDim; ///< Number of dimensions in vertex coordinates
-  static const int _cellDim; ///< Number of dimensions associated with cell
-
-  static const int _numBasis; ///< Number of vertices in cell
-  static const int _numQuadPts; ///< Number of quadrature points
-  static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
-  static const double _quadWts[]; ///< Weights of quadrature points
-  static const double _basis[]; ///< Basis fns at quadrature points
-  static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
-  static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
-
-  static const int _id; ///< Fault material identifier
-  static const char* _label; ///< Label for fault
-  static const char* _initialTractFilename; ///< Name of db for initial tractions.
-
-  static const double _fieldT[]; ///< Solution field at time t.
-  static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
-  static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
-  static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
-  static const double _jacobian[]; ///< Jacobian sparse matrix.
-
-  static const double _orientation[]; ///< Expected values for fault orientation.
-  static const double _area[]; ///< Expected values for fault area.
-  static const double _initialTractions[]; ///< Expected values for initial tractions.
-  static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
-  static const double _slipSlipE[]; ///< Expected values for slip for slip case.
-  static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
-  static const double _slipOpenE[]; ///< Expected values for slip for opening case.
-  static const int _constraintVertices[]; ///< Expected points for constraint vertices
-  static const int _numConstraintVert; ///< Number of constraint vertices
-
-};
-
-#endif // pylith_faults_cohesivedynldatatri3_hh
-
-
-// End of file

Modified: short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -20,7 +20,7 @@
 #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/faults/FaultCohesiveDyn.hh" // USES FaultCohesiveDyn
 #include "pylith/feassemble/Quadrature.hh" // USES Quadrature
 #include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
 
@@ -124,7 +124,7 @@
   const int numProperties = 1;
 
   topology::Mesh mesh;
-  faults::FaultCohesiveDynL fault;
+  faults::FaultCohesiveDyn fault;
   StaticFriction friction;
   StaticFrictionData data;
   _initialize(&mesh, &fault, &friction, &data);
@@ -178,7 +178,7 @@
   const int fiberDim = 1;
 
   topology::Mesh mesh;
-  faults::FaultCohesiveDynL fault;
+  faults::FaultCohesiveDyn fault;
   StaticFriction friction;
   StaticFrictionData data;
   _initialize(&mesh, &fault, &friction, &data);
@@ -226,7 +226,7 @@
   const int vertex = 2;
 
   topology::Mesh mesh;
-  faults::FaultCohesiveDynL fault;
+  faults::FaultCohesiveDyn fault;
   StaticFriction friction;
   StaticFrictionData data;
   _initialize(&mesh, &fault, &friction, &data);
@@ -274,7 +274,7 @@
   const int vertex = 2;
 
   topology::Mesh mesh;
-  faults::FaultCohesiveDynL fault;
+  faults::FaultCohesiveDyn fault;
   StaticFriction friction;
   StaticFrictionData data;
   _initialize(&mesh, &fault, &friction, &data);
@@ -630,7 +630,7 @@
 void
 pylith::friction::TestFrictionModel::_initialize(
 					  topology::Mesh* mesh,
-            faults::FaultCohesiveDynL* fault,
+            faults::FaultCohesiveDyn* fault,
 					  StaticFriction* friction,
 					  const StaticFrictionData* data)
 { // _initialize

Modified: short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh	2010-02-19 20:08:42 UTC (rev 16280)
@@ -149,7 +149,7 @@
    * @param data Data with properties for friction model.
    */
   void _initialize(topology::Mesh* mesh,
-                   faults::FaultCohesiveDynL* fault,
+                   faults::FaultCohesiveDyn* fault,
                    StaticFriction* friction,
                    const StaticFrictionData* data);
 

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterVTKFaultMesh.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterVTKFaultMesh.cc	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterVTKFaultMesh.cc	2010-02-19 20:08:42 UTC (rev 16280)
@@ -221,9 +221,7 @@
   fault.label(_data->faultLabel);
   fault.id(_data->faultId);
   fault.adjustTopology(_mesh, &firstFaultVertex, &firstLagrangeVertex, &firstFaultCell, _flipFault);
-  std::map<Mesh::point_type, Mesh::point_type> cohesiveToFault;
-  faults::CohesiveTopology::createFaultParallel(_faultMesh, &cohesiveToFault,
-						*_mesh, _data->faultId,
+  faults::CohesiveTopology::createFaultParallel(_faultMesh, *_mesh, _data->faultId,
 						constraintCell);
 } // _initialize
 

Copied: short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py (from rev 16277, short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDynL.py)
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py	2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,339 @@
+#!/usr/bin/env python
+#
+# ======================================================================
+#
+#                           Brad T. Aagaard
+#                        U.S. Geological Survey
+#
+# {LicenseText}
+#
+# ======================================================================
+#
+
+## @file unittests/pytests/faults/TestFaultCohesiveDyn.py
+
+## @brief Unit testing of FaultCohesiveDyn object.
+
+import unittest
+
+from pylith.faults.FaultCohesiveDyn import FaultCohesiveDyn
+
+from spatialdata.geocoords.CSCart import CSCart
+from pyre.units.time import second
+
+# ----------------------------------------------------------------------
+class TestFaultCohesiveDyn(unittest.TestCase):
+  """
+  Unit testing of Fault object.
+  """
+
+  def test_constructor(self):
+    """
+    Test constructor.
+    """
+    fault = FaultCohesiveDyn()
+    return
+
+
+  def test_configure(self):
+    """
+    Test _configure().
+    """
+    fault = FaultCohesiveDyn()
+    fault._configure()
+    return
+
+
+  def test_implementsIntegrator(self):
+    """
+    Test to make sure FaultCohesiveDyn satisfies integrator requirements.
+    """
+    fault = FaultCohesiveDyn()
+    from pylith.feassemble.Integrator import implementsIntegrator
+    self.failUnless(implementsIntegrator(fault))
+    return
+    
+
+  def test_adjustTopology(self):
+    """
+    Test adjustTopology().
+
+    WARNING: This is not a rigorous test of adjustTopology() because we
+    neither set the input fields or verify the results.
+    """
+    cs = CSCart()
+    cs.inventory.spaceDim = 2
+    cs._configure()
+    
+    from spatialdata.units.Nondimensional import Nondimensional
+    normalizer = Nondimensional()
+    normalizer._configure()
+
+    from pylith.meshio.MeshIOAscii import MeshIOAscii
+    importer = MeshIOAscii()
+    importer.inventory.filename = "data/tri3.mesh"
+    importer.inventory.coordsys = cs
+    importer._configure()
+    mesh = importer.read(debug=False, interpolate=False)
+
+    fault = FaultCohesiveDyn()
+    fault.inventory.matId = 10
+    fault.inventory.faultLabel = "fault"
+    fault._configure()
+
+    nvertices = fault.numVertices(mesh)
+    firstFaultVertex = 0
+    firstLagrangeVertex = nvertices
+    firstFaultCell      = 2*nvertices
+    fault.adjustTopology(mesh, firstFaultVertex, firstLagrangeVertex,
+                         firstFaultCell)
+
+    # We should really add something here to check to make sure things
+    # actually initialized correctly    
+    return
+
+
+  def test_initialize(self):
+    """
+    Test initialize().
+
+    WARNING: This is not a rigorous test of initialize() because we
+    neither set the input fields or verify the results.
+    """
+    (mesh, fault, fields) = self._initialize()
+    
+    # We should really add something here to check to make sure things
+    # actually initialized correctly    
+    return
+
+
+  def test_timeStep(self):
+    """
+    Test timeStep().
+    """
+    dt = 2.4
+    (mesh, fault, fields) = self._initialize()
+    fault.timeStep(dt)
+
+    # No test of result
+    return
+
+  
+  def test_stableTimeStep(self):
+    """
+    Test stableTimeStep().
+    """
+    (mesh, fault, fields) = self._initialize()
+
+    self.assertEqual(1.0e+30, fault.stableTimeStep(mesh))
+    return
+
+  
+  def test_needNewJacobian(self):
+    """
+    Test needNewJacobian().
+    """
+    (mesh, fault, fields) = self._initialize()
+    self.assertEqual(True, fault.needNewJacobian())
+    return
+
+  
+  def test_useSolnIncr(self):
+    """
+    Test useSolnIncr().
+    """
+    (mesh, fault, fields) = self._initialize()
+    fault.useSolnIncr(True)
+
+    # We should really add something here to check to make sure things
+    # actually initialized correctly    
+    return
+
+  
+  def test_integrateResidual(self):
+    """
+    Test integrateResidual().
+
+    WARNING: This is not a rigorous test of integrateResidual() because we
+    neither set the input fields or verify the results.
+    """
+    (mesh, fault, fields) = self._initialize()
+
+    residual = fields.get("residual")
+    t = 1.0
+    fault.integrateResidual(residual, t, fields)
+
+    # We should really add something here to check to make sure things
+    # actually initialized correctly    
+    return
+
+  
+  def test_integrateJacobian(self):
+    """
+    Test integrateJacobian().
+
+    WARNING: This is not a rigorous test of integrateJacobian() because we
+    neither set the input fields or verify the results.
+    """
+    (mesh, fault, fields) = self._initialize()
+
+    from pylith.topology.Jacobian import Jacobian
+    jacobian = Jacobian(fields)
+    jacobian.zero()
+    t = 1.0
+    fault.integrateJacobian(jacobian, t, fields)
+    self.assertEqual(False, fault.needNewJacobian())
+
+    # We should really add something here to check to make sure things
+    # actually initialized correctly    
+    return
+
+  
+  def test_poststep(self):
+    """
+    Test poststep().
+
+    WARNING: This is not a rigorous test of poststep() because we
+    neither set the input fields or verify the results.
+    """
+    (mesh, fault, fields) = self._initialize()
+
+    t = 0.50
+    residual = fields.get("residual")
+    fault.integrateResidual(residual, t, fields)
+
+    dt = 0.1
+    totalTime = 5
+    fault.poststep(t, dt, totalTime, fields)
+
+    # We should really add something here to check to make sure things
+    # actually initialized correctly    
+    return
+  
+
+  def test_finalize(self):
+    """
+    Test finalize().
+
+    WARNING: This is not a rigorous test of finalize() because we
+    neither set the input fields or verify the results.
+    """
+    (mesh, fault, fields) = self._initialize()
+
+    fault.finalize()
+
+    # We should really add something here to check to make sure things
+    # actually initialized correctly.
+    return
+
+
+  def test_factory(self):
+    """
+    Test factory method.
+    """
+    from pylith.faults.FaultCohesiveDyn import fault
+    f = fault()
+    return
+
+
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _initialize(self):
+    """
+    Initialize fault.
+    """
+    dt = 2.4
+    
+    from spatialdata.units.Nondimensional import Nondimensional
+    normalizer = Nondimensional()
+    normalizer._configure()
+
+    # Setup mesh
+    cs = CSCart()
+    cs.inventory.spaceDim = 2
+    cs._configure()
+
+    from pylith.meshio.MeshIOAscii import MeshIOAscii
+    importer = MeshIOAscii()
+    importer.inventory.filename = "data/tri3.mesh"
+    importer.inventory.coordsys = cs
+    importer._configure()
+    mesh = importer.read(debug=False, interpolate=False)
+
+    # Setup quadrature
+    from pylith.feassemble.FIATSimplex import FIATSimplex
+    cell = FIATSimplex()
+    cell.inventory.shape = "line"
+    cell.inventory.degree = 1
+    cell.inventory.order = 1
+    cell._configure()
+    from pylith.feassemble.Quadrature import SubMeshQuadrature
+    quadrature = SubMeshQuadrature()
+    quadrature.inventory.cell = cell
+    quadrature._configure()
+
+    # Setup earthquake source
+    from spatialdata.spatialdb.SimpleDB import SimpleDB
+    from spatialdata.spatialdb.SimpleIOAscii import SimpleIOAscii
+    ioTractions = SimpleIOAscii()
+    ioTractions.inventory.filename = "data/tri3_initialtractions.spatialdb"
+    ioTractions._configure()
+    dbTractions = SimpleDB()
+    dbTractions.inventory.iohandler = ioTractions
+    dbTractions.inventory.label = "initial tractions"
+    dbTractions._configure()
+    
+    ioFriction = SimpleIOAscii()
+    ioFriction.inventory.filename = "data/tri3_staticfriction.spatialdb"
+    ioFriction._configure()
+    dbFriction = SimpleDB()
+    dbFriction.inventory.iohandler = ioFriction
+    dbFriction.inventory.label = "friction"
+    dbFriction._configure()
+    
+    from pylith.friction.StaticFriction import StaticFriction
+    friction = StaticFriction()
+    friction.inventory.dbProperties = dbFriction
+    friction._configure()
+
+    # Setup fault
+    fault = FaultCohesiveDyn()
+    fault.inventory.output.inventory.writer._configure()
+    fault.inventory.output._configure()
+    fault.inventory.matId = 10
+    fault.inventory.faultLabel = "fault"
+    fault.inventory.upDir = [0, 0, 1]
+    fault.inventory.normalDir = [1, 0, 0]
+    fault.inventory.faultQuadrature = quadrature
+    fault.inventory.friction = friction
+    fault._configure()
+
+    nvertices = fault.numVertices(mesh)
+    firstFaultVertex = 0
+    firstLagrangeVertex = nvertices
+    firstFaultCell      = 2*nvertices
+    fault.adjustTopology(mesh, firstFaultVertex, firstLagrangeVertex,
+                         firstFaultCell)
+    fault.preinitialize(mesh)
+    fault.timeStep(dt)
+    fault.verifyConfiguration()
+    from pyre.units.time import s
+    fault.initialize(totalTime=0.0*s, numTimeSteps=1, normalizer=normalizer)
+
+    # Setup fields
+    from pylith.topology.SolutionFields import SolutionFields
+    fields = SolutionFields(mesh)
+    fields.add("residual", "residual")
+    fields.add("dispIncr(t->t+dt)", "displacement_increment")
+    fields.add("disp(t)", "displacement")
+    fields.solutionName("dispIncr(t->t+dt)")
+    residual = fields.get("residual")
+    residual.newSection(residual.VERTICES_FIELD, cs.spaceDim())
+    residual.allocate()
+    residual.zero()
+    fields.copyLayout("residual")
+    
+    return (mesh, fault, fields)
+
+
+# End of file 

Deleted: short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDynL.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDynL.py	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDynL.py	2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,339 +0,0 @@
-#!/usr/bin/env python
-#
-# ======================================================================
-#
-#                           Brad T. Aagaard
-#                        U.S. Geological Survey
-#
-# {LicenseText}
-#
-# ======================================================================
-#
-
-## @file unittests/pytests/faults/TestFaultCohesiveDynL.py
-
-## @brief Unit testing of FaultCohesiveDynL object.
-
-import unittest
-
-from pylith.faults.FaultCohesiveDynL import FaultCohesiveDynL
-
-from spatialdata.geocoords.CSCart import CSCart
-from pyre.units.time import second
-
-# ----------------------------------------------------------------------
-class TestFaultCohesiveDynL(unittest.TestCase):
-  """
-  Unit testing of Fault object.
-  """
-
-  def test_constructor(self):
-    """
-    Test constructor.
-    """
-    fault = FaultCohesiveDynL()
-    return
-
-
-  def test_configure(self):
-    """
-    Test _configure().
-    """
-    fault = FaultCohesiveDynL()
-    fault._configure()
-    return
-
-
-  def test_implementsIntegrator(self):
-    """
-    Test to make sure FaultCohesiveDynL satisfies integrator requirements.
-    """
-    fault = FaultCohesiveDynL()
-    from pylith.feassemble.Integrator import implementsIntegrator
-    self.failUnless(implementsIntegrator(fault))
-    return
-    
-
-  def test_adjustTopology(self):
-    """
-    Test adjustTopology().
-
-    WARNING: This is not a rigorous test of adjustTopology() because we
-    neither set the input fields or verify the results.
-    """
-    cs = CSCart()
-    cs.inventory.spaceDim = 2
-    cs._configure()
-    
-    from spatialdata.units.Nondimensional import Nondimensional
-    normalizer = Nondimensional()
-    normalizer._configure()
-
-    from pylith.meshio.MeshIOAscii import MeshIOAscii
-    importer = MeshIOAscii()
-    importer.inventory.filename = "data/tri3.mesh"
-    importer.inventory.coordsys = cs
-    importer._configure()
-    mesh = importer.read(debug=False, interpolate=False)
-
-    fault = FaultCohesiveDynL()
-    fault.inventory.matId = 10
-    fault.inventory.faultLabel = "fault"
-    fault._configure()
-
-    nvertices = fault.numVertices(mesh)
-    firstFaultVertex = 0
-    firstLagrangeVertex = nvertices
-    firstFaultCell      = 2*nvertices
-    fault.adjustTopology(mesh, firstFaultVertex, firstLagrangeVertex,
-                         firstFaultCell)
-
-    # We should really add something here to check to make sure things
-    # actually initialized correctly    
-    return
-
-
-  def test_initialize(self):
-    """
-    Test initialize().
-
-    WARNING: This is not a rigorous test of initialize() because we
-    neither set the input fields or verify the results.
-    """
-    (mesh, fault, fields) = self._initialize()
-    
-    # We should really add something here to check to make sure things
-    # actually initialized correctly    
-    return
-
-
-  def test_timeStep(self):
-    """
-    Test timeStep().
-    """
-    dt = 2.4
-    (mesh, fault, fields) = self._initialize()
-    fault.timeStep(dt)
-
-    # No test of result
-    return
-
-  
-  def test_stableTimeStep(self):
-    """
-    Test stableTimeStep().
-    """
-    (mesh, fault, fields) = self._initialize()
-
-    self.assertEqual(1.0e+30, fault.stableTimeStep(mesh))
-    return
-
-  
-  def test_needNewJacobian(self):
-    """
-    Test needNewJacobian().
-    """
-    (mesh, fault, fields) = self._initialize()
-    self.assertEqual(True, fault.needNewJacobian())
-    return
-
-  
-  def test_useSolnIncr(self):
-    """
-    Test useSolnIncr().
-    """
-    (mesh, fault, fields) = self._initialize()
-    fault.useSolnIncr(True)
-
-    # We should really add something here to check to make sure things
-    # actually initialized correctly    
-    return
-
-  
-  def test_integrateResidual(self):
-    """
-    Test integrateResidual().
-
-    WARNING: This is not a rigorous test of integrateResidual() because we
-    neither set the input fields or verify the results.
-    """
-    (mesh, fault, fields) = self._initialize()
-
-    residual = fields.get("residual")
-    t = 1.0
-    fault.integrateResidual(residual, t, fields)
-
-    # We should really add something here to check to make sure things
-    # actually initialized correctly    
-    return
-
-  
-  def test_integrateJacobian(self):
-    """
-    Test integrateJacobian().
-
-    WARNING: This is not a rigorous test of integrateJacobian() because we
-    neither set the input fields or verify the results.
-    """
-    (mesh, fault, fields) = self._initialize()
-
-    from pylith.topology.Jacobian import Jacobian
-    jacobian = Jacobian(fields)
-    jacobian.zero()
-    t = 1.0
-    fault.integrateJacobian(jacobian, t, fields)
-    self.assertEqual(False, fault.needNewJacobian())
-
-    # We should really add something here to check to make sure things
-    # actually initialized correctly    
-    return
-
-  
-  def test_poststep(self):
-    """
-    Test poststep().
-
-    WARNING: This is not a rigorous test of poststep() because we
-    neither set the input fields or verify the results.
-    """
-    (mesh, fault, fields) = self._initialize()
-
-    t = 0.50
-    residual = fields.get("residual")
-    fault.integrateResidual(residual, t, fields)
-
-    dt = 0.1
-    totalTime = 5
-    fault.poststep(t, dt, totalTime, fields)
-
-    # We should really add something here to check to make sure things
-    # actually initialized correctly    
-    return
-  
-
-  def test_finalize(self):
-    """
-    Test finalize().
-
-    WARNING: This is not a rigorous test of finalize() because we
-    neither set the input fields or verify the results.
-    """
-    (mesh, fault, fields) = self._initialize()
-
-    fault.finalize()
-
-    # We should really add something here to check to make sure things
-    # actually initialized correctly.
-    return
-
-
-  def test_factory(self):
-    """
-    Test factory method.
-    """
-    from pylith.faults.FaultCohesiveDynL import fault
-    f = fault()
-    return
-
-
-  # PRIVATE METHODS ////////////////////////////////////////////////////
-
-  def _initialize(self):
-    """
-    Initialize fault.
-    """
-    dt = 2.4
-    
-    from spatialdata.units.Nondimensional import Nondimensional
-    normalizer = Nondimensional()
-    normalizer._configure()
-
-    # Setup mesh
-    cs = CSCart()
-    cs.inventory.spaceDim = 2
-    cs._configure()
-
-    from pylith.meshio.MeshIOAscii import MeshIOAscii
-    importer = MeshIOAscii()
-    importer.inventory.filename = "data/tri3.mesh"
-    importer.inventory.coordsys = cs
-    importer._configure()
-    mesh = importer.read(debug=False, interpolate=False)
-
-    # Setup quadrature
-    from pylith.feassemble.FIATSimplex import FIATSimplex
-    cell = FIATSimplex()
-    cell.inventory.shape = "line"
-    cell.inventory.degree = 1
-    cell.inventory.order = 1
-    cell._configure()
-    from pylith.feassemble.Quadrature import SubMeshQuadrature
-    quadrature = SubMeshQuadrature()
-    quadrature.inventory.cell = cell
-    quadrature._configure()
-
-    # Setup earthquake source
-    from spatialdata.spatialdb.SimpleDB import SimpleDB
-    from spatialdata.spatialdb.SimpleIOAscii import SimpleIOAscii
-    ioTractions = SimpleIOAscii()
-    ioTractions.inventory.filename = "data/tri3_initialtractions.spatialdb"
-    ioTractions._configure()
-    dbTractions = SimpleDB()
-    dbTractions.inventory.iohandler = ioTractions
-    dbTractions.inventory.label = "initial tractions"
-    dbTractions._configure()
-    
-    ioFriction = SimpleIOAscii()
-    ioFriction.inventory.filename = "data/tri3_staticfriction.spatialdb"
-    ioFriction._configure()
-    dbFriction = SimpleDB()
-    dbFriction.inventory.iohandler = ioFriction
-    dbFriction.inventory.label = "friction"
-    dbFriction._configure()
-    
-    from pylith.friction.StaticFriction import StaticFriction
-    friction = StaticFriction()
-    friction.inventory.dbProperties = dbFriction
-    friction._configure()
-
-    # Setup fault
-    fault = FaultCohesiveDynL()
-    fault.inventory.output.inventory.writer._configure()
-    fault.inventory.output._configure()
-    fault.inventory.matId = 10
-    fault.inventory.faultLabel = "fault"
-    fault.inventory.upDir = [0, 0, 1]
-    fault.inventory.normalDir = [1, 0, 0]
-    fault.inventory.faultQuadrature = quadrature
-    fault.inventory.friction = friction
-    fault._configure()
-
-    nvertices = fault.numVertices(mesh)
-    firstFaultVertex = 0
-    firstLagrangeVertex = nvertices
-    firstFaultCell      = 2*nvertices
-    fault.adjustTopology(mesh, firstFaultVertex, firstLagrangeVertex,
-                         firstFaultCell)
-    fault.preinitialize(mesh)
-    fault.timeStep(dt)
-    fault.verifyConfiguration()
-    from pyre.units.time import s
-    fault.initialize(totalTime=0.0*s, numTimeSteps=1, normalizer=normalizer)
-
-    # Setup fields
-    from pylith.topology.SolutionFields import SolutionFields
-    fields = SolutionFields(mesh)
-    fields.add("residual", "residual")
-    fields.add("dispIncr(t->t+dt)", "displacement_increment")
-    fields.add("disp(t)", "displacement")
-    fields.solutionName("dispIncr(t->t+dt)")
-    residual = fields.get("residual")
-    residual.newSection(residual.VERTICES_FIELD, cs.spaceDim())
-    residual.allocate()
-    residual.zero()
-    fields.copyLayout("residual")
-    
-    return (mesh, fault, fields)
-
-
-# End of file 

Modified: short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py	2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py	2010-02-19 20:08:42 UTC (rev 16280)
@@ -77,8 +77,8 @@
     from TestFaultCohesiveKin import TestFaultCohesiveKin
     suite.addTest(unittest.makeSuite(TestFaultCohesiveKin))
 
-    from TestFaultCohesiveDynL import TestFaultCohesiveDynL
-    suite.addTest(unittest.makeSuite(TestFaultCohesiveDynL))
+    from TestFaultCohesiveDyn import TestFaultCohesiveDyn
+    suite.addTest(unittest.makeSuite(TestFaultCohesiveDyn))
 
     from TestSingleRupture import TestSingleRupture
     suite.addTest(unittest.makeSuite(TestSingleRupture))



More information about the CIG-COMMITS mailing list