[cig-commits] r19086 - in short/3D/PyLith/branches/v1.6-stable: examples/bar_shearwave/quad4 libsrc/pylith/faults libsrc/pylith/feassemble libsrc/pylith/friction libsrc/pylith/problems modulesrc/friction playpen playpen/faultpc pylith/faults tests/2d/faultstrip tests/2d/frictionslide tests/2d/slipdir tests/3d tests/3d/slipdir tests_auto/2d/quad4 unittests/libtests/faults unittests/libtests/faults/data

brad at geodynamics.org brad at geodynamics.org
Mon Oct 17 15:23:49 PDT 2011


Author: brad
Date: 2011-10-17 15:23:48 -0700 (Mon, 17 Oct 2011)
New Revision: 19086

Added:
   short/3D/PyLith/branches/v1.6-stable/tests/3d/cyclicfriction/
Removed:
   short/3D/PyLith/branches/v1.6-stable/playpen/friction/
Modified:
   short/3D/PyLith/branches/v1.6-stable/examples/bar_shearwave/quad4/dynamic.cfg
   short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveDyn.cc
   short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveDyn.hh
   short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveKin.cc
   short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveLagrange.cc
   short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveLagrange.hh
   short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/feassemble/ElasticityExplicit.cc
   short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/friction/FrictionModel.cc
   short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/friction/FrictionModel.hh
   short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/problems/SolverNonlinear.cc
   short/3D/PyLith/branches/v1.6-stable/modulesrc/friction/FrictionModel.i
   short/3D/PyLith/branches/v1.6-stable/playpen/faultpc/checkfaultpc.py
   short/3D/PyLith/branches/v1.6-stable/playpen/faultpc/notes.tex
   short/3D/PyLith/branches/v1.6-stable/pylith/faults/FaultCohesive.py
   short/3D/PyLith/branches/v1.6-stable/pylith/faults/FaultCohesiveKin.py
   short/3D/PyLith/branches/v1.6-stable/tests/2d/faultstrip/dynamic_timeweakening.cfg
   short/3D/PyLith/branches/v1.6-stable/tests/2d/faultstrip/pylithapp.cfg
   short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/plot_friction.py
   short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/pylithapp.cfg
   short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension.cfg
   short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension_axial.timedb
   short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension_shear.timedb
   short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/velocitysteps.timedb
   short/3D/PyLith/branches/v1.6-stable/tests/2d/slipdir/pylithapp.cfg
   short/3D/PyLith/branches/v1.6-stable/tests/3d/Makefile.am
   short/3D/PyLith/branches/v1.6-stable/tests/3d/slipdir/pylithapp.cfg
   short/3D/PyLith/branches/v1.6-stable/tests_auto/2d/quad4/friction_shear_stick.cfg
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveDyn.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKin.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKin.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinHex8.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinLine2.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinQuad4.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinQuad4e.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4e.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4f.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTri3.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTri3d.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynData.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynData.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataHex8.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataHex8.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTet4.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTet4.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3d.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3d.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataHex8.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataLine2.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4e.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4e.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4e.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4e.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4f.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4f.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3d.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3d.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.cc
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.hh
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/adjustsoln.py
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/cohesivedyn.py
   short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/hex8_initialtract.spatialdb
Log:
Merged revised fault implementation branch back into stable branch.

Modified: short/3D/PyLith/branches/v1.6-stable/examples/bar_shearwave/quad4/dynamic.cfg
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/examples/bar_shearwave/quad4/dynamic.cfg	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/examples/bar_shearwave/quad4/dynamic.cfg	2011-10-17 22:23:48 UTC (rev 19086)
@@ -43,7 +43,7 @@
 # output
 # ----------------------------------------------------------------------
 [pylithapp.timedependent.interfaces.fault.output]
-# Add slip rate to the default output fiels of slip and traction.
+vertex_info_fields=[initial_traction]
 vertex_data_fields=[slip,slip_rate,traction]
 skip = 1
 writer.time_format = %05.2f

Modified: short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveDyn.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveDyn.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveDyn.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -131,19 +131,20 @@
   assert(0 != _faultMesh);
   assert(0 != _fields);
   _friction->normalizer(*_normalizer);
-  _friction->initialize(*_faultMesh, _quadrature, _fields->get("area"));
+  _friction->initialize(*_faultMesh, _quadrature);
 
   const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
   assert(0 != cs);
 
+  // Create field for relative velocity associated with Lagrange vertex k
+  _fields->add("relative velocity", "relative_velocity");
+  topology::Field<topology::SubMesh>& velRel = 
+    _fields->get("relative velocity");
+  topology::Field<topology::SubMesh>& dispRel = _fields->get("relative disp");
+  velRel.cloneSection(dispRel);
+  velRel.vectorFieldType(topology::FieldBase::VECTOR);
+  velRel.scale(_normalizer->lengthScale() / _normalizer->timeScale());
 
-  // 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");
-  topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  slipRate.cloneSection(slip);
-  slipRate.vectorFieldType(topology::FieldBase::VECTOR);
-
   //logger.stagePop();
 } // initialize
 
@@ -157,6 +158,7 @@
 { // integrateResidual
   assert(0 != fields);
   assert(0 != _fields);
+  assert(0 != _logger);
 
   // Initial fault tractions have been assembled, so they do not need
   // assembling across processors.
@@ -167,32 +169,56 @@
   if (0 == _dbInitialTract)
     return;
 
+  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 geometry information that doesn't depend on cell
   const int spaceDim = _quadrature->spaceDim();
 
-  // Get sections
-  double_array forcesInitialVertex(spaceDim);
-  const ALE::Obj<RealSection>& forcesInitialSection = 
-    _fields->get("initial forces").section();
-  assert(!forcesInitialSection.isNull());
-
-  double_array residualVertex(spaceDim);
+  // Get sections associated with cohesive cells
+  double_array residualVertexN(spaceDim);
+  double_array residualVertexP(spaceDim);
   const ALE::Obj<RealSection>& residualSection = residual.section();
   assert(!residualSection.isNull());
 
-  const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
-  assert(!slipSection.isNull());
+  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+  assert(!areaSection.isNull());
 
+  const ALE::Obj<RealSection>& initialTractionsSection = 
+    _fields->get("initial traction").section();
+  assert(!initialTractionsSection.isNull());
+
+  const ALE::Obj<RealSection>& dispRelSection = 
+    _fields->get("relative disp").section();
+  assert(!dispRelSection.isNull());
+
+  const ALE::Obj<RealSection>& orientationSection = 
+    _fields->get("orientation").section();
+  assert(!orientationSection.isNull());
+
+  // Get fault information
   const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
   assert(!sieveMesh.isNull());
   const ALE::Obj<SieveMesh::order_type>& globalOrder =
-    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", 
-					    residualSection);
+      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
+					      residualSection);
   assert(!globalOrder.isNull());
 
+  _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  // Loop over fault vertices
   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_lagrange = _cohesiveVertices[iVertex].lagrange;
     const int v_negative = _cohesiveVertices[iVertex].negative;
     const int v_positive = _cohesiveVertices[iVertex].positive;
 
@@ -200,32 +226,82 @@
     if (!globalOrder->isLocal(v_lagrange))
       continue;
 
-    // Get initial forces at fault vertex. Forces are in the global
-    // coordinate system so no rotation is necessary.
-    forcesInitialSection->restrictPoint(v_fault, 
-					&forcesInitialVertex[0],
-					forcesInitialVertex.size());
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(restrictEvent);
+#endif
 
-    assert(spaceDim == slipSection->getFiberDimension(v_fault));
-    const double* slipVertex = slipSection->restrictPoint(v_fault);
-    assert(0 != slipVertex);
-    
-    // only apply initial tractions if there is no opening
-    if (0.0 == slipVertex[spaceDim-1]) {
-      residualVertex = forcesInitialVertex;
+    // Get initial tractions at fault vertex.
+    assert(spaceDim == initialTractionsSection->getFiberDimension(v_fault));
+    const double* initialTractionsVertex = 
+      initialTractionsSection->restrictPoint(v_fault);
+    assert(initialTractionsVertex);
 
-      assert(residualVertex.size() == 
-	     residualSection->getFiberDimension(v_positive));
-      residualSection->updateAddPoint(v_positive, &residualVertex[0]);
-      
-      residualVertex *= -1.0;
-      assert(residualVertex.size() == 
-	     residualSection->getFiberDimension(v_negative));
-      residualSection->updateAddPoint(v_negative, &residualVertex[0]);
+    // Get relative dislplacement at fault vertex.
+    assert(spaceDim == dispRelSection->getFiberDimension(v_fault));
+    const double* dispRelVertex = dispRelSection->restrictPoint(v_fault);
+    assert(dispRelVertex);
+
+    // Get area associated with fault vertex.
+    assert(1 == areaSection->getFiberDimension(v_fault));
+    assert(areaSection->restrictPoint(v_fault));
+    const double areaVertex = *areaSection->restrictPoint(v_fault);
+
+    // Get orientation associated with fault vertex.
+    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+    const double* orientationVertex = 
+      orientationSection->restrictPoint(v_fault);
+    assert(orientationVertex);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(restrictEvent);
+    _logger->eventBegin(computeEvent);
+#endif
+
+    // Initial (external) tractions oppose (internal) tractions
+    // associated with Lagrange multiplier, so these terms have the
+    // opposite sign as the integration of the Lagrange multipliers in
+    // FaultCohesiveLagrange.
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      residualVertexP[iDim] = areaVertex * initialTractionsVertex[iDim];
+    } // for
+    residualVertexN = -residualVertexP;
+
+    // Only apply initial tractions if there is no opening.
+    // If there is opening, zero out initial tractions
+    double slipNormal = 0.0;
+    const int indexN = spaceDim - 1;
+    for (int jDim=0; jDim < spaceDim; ++jDim) {
+      slipNormal += orientationVertex[indexN*spaceDim+jDim]*dispRelVertex[jDim];
+    } // for
+
+    if (slipNormal > _zeroTolerance) {
+      residualVertexN = 0.0;
+      residualVertexP = 0.0;
     } // if
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(computeEvent);
+    _logger->eventBegin(updateEvent);
+#endif
+
+    // Assemble contributions into field
+    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]);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(updateEvent);
+#endif
   } // for
+  PetscLogFlops(numVertices*spaceDim*(2+spaceDim*2));
 
-  PetscLogFlops(numVertices*spaceDim);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventEnd(computeEvent);
+#endif
 } // integrateResidual
 
 // ----------------------------------------------------------------------
@@ -238,38 +314,35 @@
   assert(0 != fields);
   assert(0 != _fields);
 
-  _updateSlipRate(*fields);
+  _updateVelRel(*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 tractionTpdtVertex(spaceDim); // Fault coordinate system
 
   // Get sections
   double_array slipVertex(spaceDim);
-  const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
-  assert(!slipSection.isNull());
+  const ALE::Obj<RealSection>& dispRelSection = 
+    _fields->get("relative disp").section();
+  assert(!dispRelSection.isNull());
 
   double_array slipRateVertex(spaceDim);
-  const ALE::Obj<RealSection>& slipRateSection =
-      _fields->get("slip rate").section();
-  assert(!slipRateSection.isNull());
+  const ALE::Obj<RealSection>& velRelSection =
+      _fields->get("relative velocity").section();
+  assert(!velRelSection.isNull());
 
-  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
-  assert(!areaSection.isNull());
-
-  double_array lagrangeTVertex(spaceDim);
   const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
   assert(!dispTSection.isNull());
 
-  double_array lagrangeTIncrVertex(spaceDim);
   const ALE::Obj<RealSection>& dispTIncrSection =
       fields->get("dispIncr(t->t+dt)").section();
   assert(!dispTIncrSection.isNull());
 
+  const 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;
@@ -277,34 +350,44 @@
     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 relative displacement
+    assert(spaceDim == dispRelSection->getFiberDimension(v_fault));
+    const double* dispRelVertex = dispRelSection->restrictPoint(v_fault);
+    assert(dispRelVertex);
 
-    // Get slip rate
-    slipRateSection->restrictPoint(v_fault, &slipRateVertex[0],
-      slipRateVertex.size());
+    // Get relative velocity
+    assert(spaceDim == velRelSection->getFiberDimension(v_fault));
+    const double* velRelVertex = velRelSection->restrictPoint(v_fault);
+    assert(velRelVertex);
 
-    // 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 orientation
+    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+    const double* orientationVertex = 
+      orientationSection->restrictPoint(v_fault);
 
     // 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());
+    assert(spaceDim == dispTSection->getFiberDimension(v_lagrange));
+    const double* lagrangeTVertex = dispTSection->restrictPoint(v_lagrange);
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_lagrange));
+    const double* lagrangeTIncrVertex = 
+      dispTIncrSection->restrictPoint(v_lagrange);
 
-    // Compute Lagrange multiplier at time t+dt
-    lagrangeTpdtVertex = lagrangeTVertex + lagrangeTIncrVertex;
+    // Compute slip, slip rate, and fault traction (Lagrange
+    // multiplier) at time t+dt in fault coordinate system.
+    slipVertex = 0.0;
+    slipRateVertex = 0.0;
+    tractionTpdtVertex = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      for (int jDim=0; jDim < spaceDim; ++jDim) {
+	slipVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] *
+	  dispRelVertex[jDim];
+	slipRateVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] *
+	  velRelVertex[jDim];
+	tractionTpdtVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] *
+	  (lagrangeTVertex[jDim]+lagrangeTIncrVertex[jDim]);
+      } // for
+    } // for
 
-    // :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->retrievePropsStateVars(v_fault);
 
@@ -356,15 +439,14 @@
     (double_array*,
      const double_array&,
      const double_array&,
-     const double_array&,
-     const double);
+     const double_array&);
 
   assert(0 != fields);
   assert(0 != _quadrature);
   assert(0 != _fields);
   assert(0 != _friction);
 
-  _updateSlipRate(*fields);
+  _updateVelRel(*fields);
   _sensitivitySetup(jacobian);
 
   // Update time step in friction (can vary).
@@ -373,44 +455,34 @@
   const int spaceDim = _quadrature->spaceDim();
 
   // Allocate arrays for vertex values
-  double_array tractionTVertex(spaceDim);
   double_array tractionTpdtVertex(spaceDim);
-  double_array slipTpdtVertex(spaceDim);
-  double_array lagrangeTpdtVertex(spaceDim);
 
   // Get sections
   double_array slipVertex(spaceDim);
-  double_array dSlipVertex(spaceDim);
-  const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
-  assert(!slipSection.isNull());
+  const ALE::Obj<RealSection>& dispRelSection = 
+    _fields->get("relative disp").section();
+  assert(!dispRelSection.isNull());
 
   double_array slipRateVertex(spaceDim);
-  const ALE::Obj<RealSection>& slipRateSection =
-      _fields->get("slip rate").section();
-  assert(!slipRateSection.isNull());
+  const ALE::Obj<RealSection>& velRelSection =
+      _fields->get("relative velocity").section();
+  assert(!velRelSection.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 lagrangeTVertex(spaceDim);
-  double_array dispTVertexN(spaceDim);
-  double_array dispTVertexP(spaceDim);
   const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
   assert(!dispTSection.isNull());
 
-  double_array lagrangeTIncrVertex(spaceDim);
-  double_array dispTIncrVertexN(spaceDim);
-  double_array dispTIncrVertexP(spaceDim);
+  double_array dDispTIncrVertexN(spaceDim);
+  double_array dDispTIncrVertexP(spaceDim);
   const ALE::Obj<RealSection>& dispTIncrSection =
       fields->get("dispIncr(t->t+dt)").section();
   assert(!dispTIncrSection.isNull());
 
   double_array dLagrangeTpdtVertex(spaceDim);
+  double_array dLagrangeTpdtVertexGlobal(spaceDim);
   const ALE::Obj<RealSection>& dLagrangeTpdtSection =
       _fields->get("sensitivity dLagrange").section();
   assert(!dLagrangeTpdtSection.isNull());
@@ -437,11 +509,8 @@
 
 
 #if 0 // DEBUGGING
-  slipSection->view("SLIP");
-  slipRateSection->view("SLIP RATE");
-  //areaSection->view("AREA");
-  //dispTSection->view("DISP (t)");
-  //dispTIncrSection->view("DISP INCR (t->t+dt)");
+  dispRelSection->view("BEFORE RELATIVE DISPLACEMENT");
+  dispTIncrSection->view("BEFORE DISP INCR (t->t+dt)");
 #endif
 
   const int numVertices = _cohesiveVertices.size();
@@ -449,48 +518,95 @@
     const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
     const int v_fault = _cohesiveVertices[iVertex].fault;
 
-    // Get slip
-    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+    // Get relative displacement
+    assert(spaceDim == dispRelSection->getFiberDimension(v_fault));
+    const double* dispRelVertex = dispRelSection->restrictPoint(v_fault);
+    assert(dispRelVertex);
 
-    // Get slip rate
-    slipRateSection->restrictPoint(v_fault, &slipRateVertex[0],
-      slipRateVertex.size());
+    // Get relative velocity
+    assert(spaceDim == velRelSection->getFiberDimension(v_fault));
+    const double* velRelVertex = velRelSection->restrictPoint(v_fault);
+    assert(velRelVertex);
 
-    // 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 orientation
+    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+    const double* orientationVertex = 
+      orientationSection->restrictPoint(v_fault);
 
     // 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());
+    assert(spaceDim == dispTSection->getFiberDimension(v_lagrange));
+    const double* lagrangeTVertex = dispTSection->restrictPoint(v_lagrange);
+    assert(lagrangeTVertex);
 
-    // Compute Lagrange multiplier at time t+dt
-    lagrangeTpdtVertex = lagrangeTVertex + lagrangeTIncrVertex;
-    dLagrangeTpdtVertex = 0.0;
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_lagrange));
+    const double* lagrangeTIncrVertex = 
+      dispTIncrSection->restrictPoint(v_lagrange);
+    assert(lagrangeTIncrVertex);
 
-    // :KLUDGE: Solution at Lagrange constraint vertices is the
-    // Lagrange multiplier value, which is currently the force.
-    // Compute traction by dividing force by area
-    assert(*areaVertex > 0);
-    tractionTVertex = lagrangeTVertex / (*areaVertex);
-    tractionTpdtVertex = lagrangeTpdtVertex / (*areaVertex);
+    // Compute slip, slip rate, and Lagrange multiplier at time t+dt
+    // in fault coordinate system.
+    slipVertex = 0.0;
+    slipRateVertex = 0.0;
+    tractionTpdtVertex = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      for (int jDim=0; jDim < spaceDim; ++jDim) {
+	slipVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] *
+	  dispRelVertex[jDim];
+	slipRateVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] *
+	  velRelVertex[jDim];
+	tractionTpdtVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] *
+	  (lagrangeTVertex[jDim] + lagrangeTIncrVertex[jDim]);
+      } // for
+    } // for
 
     // Get friction properties and state variables.
     _friction->retrievePropsStateVars(v_fault);
 
     // Use fault constitutive model to compute traction associated with
     // friction.
+    dLagrangeTpdtVertex = 0.0;
     CALL_MEMBER_FN(*this,
 		   constrainSolnSpaceFn)(&dLagrangeTpdtVertex,
 					 slipVertex, slipRateVertex,
-					 tractionTpdtVertex, *areaVertex);
+					 tractionTpdtVertex);
 
-    assert(dLagrangeTpdtVertex.size() ==
+    // Rotate traction back to global coordinate system.
+    dLagrangeTpdtVertexGlobal = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      for (int jDim=0; jDim < spaceDim; ++jDim) {
+	dLagrangeTpdtVertexGlobal[iDim] += 
+	  orientationVertex[jDim*spaceDim+iDim] * dLagrangeTpdtVertex[jDim];
+      } // for
+    } // for
+
+#if 0 // debugging
+    std::cout << "slipVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << slipVertex[iDim];
+    std::cout << ",  slipRateVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << slipRateVertex[iDim];
+    std::cout << ",  tractionVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << tractionTpdtVertex[iDim];
+    std::cout << ",  lagrangeTVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << lagrangeTVertex[iDim];
+    std::cout << ",  lagrangeTIncrVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << lagrangeTIncrVertex[iDim];
+    std::cout << ",  dLagrangeTpdtVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << dLagrangeTpdtVertex[iDim];
+    std::cout << ",  dLagrangeTpdtVertexGlobal: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << dLagrangeTpdtVertexGlobal[iDim];
+    std::cout << std::endl;
+#endif
+     
+    assert(dLagrangeTpdtVertexGlobal.size() ==
         dLagrangeTpdtSection->getFiberDimension(v_fault));
-    dLagrangeTpdtSection->updatePoint(v_fault, &dLagrangeTpdtVertex[0]);
+    dLagrangeTpdtSection->updatePoint(v_fault, &dLagrangeTpdtVertexGlobal[0]);
   } // for
 
   // Solve sensitivity problem for negative side of the fault.
@@ -507,99 +623,175 @@
   _sensitivitySolve();
   _sensitivityUpdateSoln(negativeSide);
 
+
+  double_array dSlipVertex(spaceDim);
+  double_array dDispRelVertex(spaceDim);
+  double_array dispRelVertex(spaceDim);
+
   // Update slip field based on solution of sensitivity problem and
   // increment in Lagrange multipliers.
-  const ALE::Obj<RealSection>& dispRelSection =
-    _fields->get("sensitivity dispRel").section();
+  const ALE::Obj<RealSection>& sensDispRelSection =
+    _fields->get("sensitivity relative disp").section();
   for (int iVertex=0; iVertex < numVertices; ++iVertex) {
     const int v_fault = _cohesiveVertices[iVertex].fault;
     const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
     const int v_negative = _cohesiveVertices[iVertex].negative;
     const int v_positive = _cohesiveVertices[iVertex].positive;
 
-    // Get fault orientation
-    orientationSection->restrictPoint(v_fault, &orientationVertex[0],
-    orientationVertex.size());
+    // Get change in relative displacement from sensitivity solve.
+    assert(spaceDim == sensDispRelSection->getFiberDimension(v_fault));
+    const double* sensDispRelVertex = 
+      sensDispRelSection->restrictPoint(v_fault);
+    assert(sensDispRelVertex);
 
-    // Get slip
-    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+    // Get current relative displacement for updating.
+    dispRelSection->restrictPoint(v_fault, &dispRelVertex[0],
+				  dispRelVertex.size());
 
-    // Get change in relative displacement.
-    const double* dispRelVertex = dispRelSection->restrictPoint(v_fault);
-    assert(0 != dispRelVertex);
-    assert(spaceDim == dispRelSection->getFiberDimension(v_fault));
+    // Get orientation.
+    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+    const double* orientationVertex = 
+      orientationSection->restrictPoint(v_fault);
+    assert(orientationVertex);
 
+    // Get displacements from disp(t) and dispIncr(t).
+    assert(spaceDim == dispTSection->getFiberDimension(v_negative));
+    const double* dispTVertexN = dispTSection->restrictPoint(v_negative);
+    assert(dispTVertexN);
+
+    assert(spaceDim == dispTSection->getFiberDimension(v_positive));
+    const double* dispTVertexP = dispTSection->restrictPoint(v_positive);
+    assert(dispTVertexP);
+
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_negative));
+    const double* dispTIncrVertexN = 
+      dispTIncrSection->restrictPoint(v_negative);
+    assert(dispTIncrVertexN);
+
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_positive));
+    const double* dispTIncrVertexP = 
+      dispTIncrSection->restrictPoint(v_positive);
+    assert(dispTIncrVertexP);
+
     // Get Lagrange multiplier at time t
-    dispTSection->restrictPoint(v_lagrange, &lagrangeTVertex[0],
-				lagrangeTVertex.size());
+    assert(spaceDim == dispTSection->getFiberDimension(v_lagrange));
+    const double* lagrangeTVertex = dispTSection->restrictPoint(v_lagrange);
+    assert(lagrangeTVertex);
 
     // Get Lagrange multiplier increment at time t
-    dispTIncrSection->restrictPoint(v_lagrange, &lagrangeTIncrVertex[0],
-				    lagrangeTIncrVertex.size());
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_lagrange));
+    const double* lagrangeTIncrVertex = 
+      dispTIncrSection->restrictPoint(v_lagrange);
+    assert(lagrangeTIncrVertex);
 
     // Get change in Lagrange multiplier.
     dLagrangeTpdtSection->restrictPoint(v_fault, &dLagrangeTpdtVertex[0],
 					dLagrangeTpdtVertex.size());
 
-    // Only update slip if Lagrange multiplier is changing
+    // Only update slip, disp, etc if Lagrange multiplier is
+    // changing. If Lagrange multiplier is the same, there is no slip
+    // so disp, etc should be unchanged.
     double dLagrangeMag = 0.0;
     for (int iDim=0; iDim < spaceDim; ++iDim)
       dLagrangeMag += dLagrangeTpdtVertex[iDim]*dLagrangeTpdtVertex[iDim];
-    if (0.0 == dLagrangeMag)
+    if (dLagrangeMag < _zeroTolerance) {
       continue; // No change, so continue
+    } // if
 
-    // Compute change in slip.
+    // Compute slip and change in slip in fault coordinates.
     dSlipVertex = 0.0;
-    for (int iDim = 0; iDim < spaceDim; ++iDim)
-      for (int kDim = 0; kDim < spaceDim; ++kDim)
-        dSlipVertex[iDim] += 
-	  orientationVertex[iDim*spaceDim+kDim] * dispRelVertex[kDim];
+    slipVertex = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      for (int jDim=0; jDim < spaceDim; ++jDim) {
+	dSlipVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] * 
+	  sensDispRelVertex[jDim];
+	slipVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] * 
+	  (dispTVertexP[jDim] - dispTVertexN[jDim] +
+	   dispTIncrVertexP[jDim] - dispTIncrVertexN[jDim]);
+      } // for
+    } // for
 
+    // Compute normal traction in fault coordinates.
+    double tractionNormal = 0.0;
+    const int indexN = spaceDim - 1;
+    for (int jDim=0; jDim < spaceDim; ++jDim) {
+      tractionNormal += orientationVertex[indexN*spaceDim+jDim] *
+	(lagrangeTVertex[jDim] + lagrangeTIncrVertex[jDim] + 
+	 dLagrangeTpdtVertex[jDim]);
+    } // for
+
     // Do not allow fault interpenetration and set fault opening to
     // zero if fault is under compression.
-    const int indexN = spaceDim - 1;
-    const double lagrangeTpdtNormal = lagrangeTVertex[indexN] + 
-      lagrangeTIncrVertex[indexN] + dLagrangeTpdtVertex[indexN];
-    if (lagrangeTpdtNormal < -_zeroTolerance || 
-	slipVertex[indexN] + dSlipVertex[indexN] < 0.0) {
+    if (tractionNormal < -_zeroTolerance || 
+	slipVertex[indexN] + dSlipVertex[indexN] < -_zeroTolerance) {
       dSlipVertex[indexN] = -slipVertex[indexN];
     } // if
 
-    // Set change in slip.
-    assert(dSlipVertex.size() ==
-        slipSection->getFiberDimension(v_fault));
-    slipSection->updateAddPoint(v_fault, &dSlipVertex[0]);
+    // Compute current estimate of slip.
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      const double value = slipVertex[iDim] + dSlipVertex[iDim];
+      slipVertex[iDim] = fabs(value) > _zeroTolerance ? value : 0.0;
+      dSlipVertex[iDim] = 
+	fabs(dSlipVertex[iDim]) > _zeroTolerance ? dSlipVertex[iDim] : 0.0;
+    } // for
+
+    // Update relative displacement from slip.
+    dispRelVertex = 0.0;
+    dDispRelVertex = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      for (int jDim=0; jDim < spaceDim; ++jDim) {
+	dispRelVertex[iDim] += orientationVertex[jDim*spaceDim+iDim] *
+	  slipVertex[jDim];
+	dDispRelVertex[iDim] += orientationVertex[jDim*spaceDim+iDim] *
+	  dSlipVertex[jDim];
+      } // for
+
+      dDispTIncrVertexN[iDim] = -0.5*dDispRelVertex[iDim];
+      dDispTIncrVertexP[iDim] = +0.5*dDispRelVertex[iDim];
+
+    } // for
+
+#if 0 // debugging
+    std::cout << "dLagrangeTpdtVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << dLagrangeTpdtVertex[iDim];
+    std::cout << ", slipVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << slipVertex[iDim];
+    std::cout << ",  dispRelVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << dispRelVertex[iDim];
+    std::cout << ",  dDispRelVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << dDispRelVertex[iDim];
+    std::cout << std::endl;
+#endif
+
+    // Set change in relative displacement.
+    assert(dispRelVertex.size() ==
+        dispRelSection->getFiberDimension(v_fault));
+    dispRelSection->updatePoint(v_fault, &dispRelVertex[0]);
     
     // Update Lagrange multiplier increment.
     assert(dLagrangeTpdtVertex.size() ==
 	   dispTIncrSection->getFiberDimension(v_lagrange));
     dispTIncrSection->updateAddPoint(v_lagrange, &dLagrangeTpdtVertex[0]);
 
-    // Compute change in displacement field.
-    dispTIncrVertexN = 0.0;
-    for (int iDim = 0; iDim < spaceDim; ++iDim)
-      for (int kDim = 0; kDim < spaceDim; ++kDim)
-        dispTIncrVertexN[iDim] += 
-	  orientationVertex[kDim*spaceDim+iDim] * dSlipVertex[kDim];
-    
     // Update displacement field
-    dispTIncrVertexN *= -0.5;
-    assert(dispTIncrVertexN.size() ==
+    assert(dDispTIncrVertexN.size() ==
 	   dispTIncrSection->getFiberDimension(v_negative));
-    dispTIncrSection->updateAddPoint(v_negative, &dispTIncrVertexN[0]);
+    dispTIncrSection->updateAddPoint(v_negative, &dDispTIncrVertexN[0]);
     
-    dispTIncrVertexP = -dispTIncrVertexN;
-    assert(dispTIncrVertexP.size() ==
+    assert(dDispTIncrVertexP.size() ==
 	   dispTIncrSection->getFiberDimension(v_positive));
-    dispTIncrSection->updateAddPoint(v_positive, &dispTIncrVertexP[0]);
+    dispTIncrSection->updateAddPoint(v_positive, &dDispTIncrVertexP[0]);
     
   } // for
 
 #if 0 // DEBUGGING
-  dLagrangeTpdtSection->view("AFTER dLagrange");
-  //dispTIncrSection->view("AFTER DISP INCR (t->t+dt)");
-  slipSection->view("AFTER SLIP");
-  slipRateSection->view("AFTER SLIP RATE");
+  //dLagrangeTpdtSection->view("AFTER dLagrange");
+  dispRelSection->view("AFTER RELATIVE DISPLACEMENT");
+  dispTIncrSection->view("AFTER DISP INCR (t->t+dt)");
 #endif
 } // constrainSolnSpace
 
@@ -616,25 +808,8 @@
     (double_array*,
      const double_array&,
      const double_array&,
-     const double_array&,
-     const double);
-
-  /// Member prototype for _sensitivitySolveLumpedXD()
-  typedef void (pylith::faults::FaultCohesiveDyn::*sensitivitySolveLumped_fn_type)
-    (double_array*,
-     const double_array&,
-     const double_array&,
      const double_array&);
 
-  /// Member prototype for _adjustSolnLumpedXD()
-  typedef void (pylith::faults::FaultCohesiveDyn::*adjustSolnLumped_fn_type)
-    (double_array*, double_array*, double_array*,
-     const double_array&, const double_array&,
-     const double_array&, const double_array&,
-     const double_array&, const double_array&,
-     const double_array&, const double_array&);
-
-
   assert(0 != fields);
   assert(0 != _quadrature);
 
@@ -662,39 +837,35 @@
 
   // Get cell information and setup storage for cell data
   const int spaceDim = _quadrature->spaceDim();
-  const int orientationSize = spaceDim * 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);
+  double_array dLagrangeTpdtVertexGlobal(spaceDim);
 
   // Update time step in friction (can vary).
   _friction->timeStep(_dt);
 
   // Get section information
+  double_array dispRelVertex(spaceDim);
   double_array slipVertex(spaceDim);
-  const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
-  assert(!slipSection.isNull());
+  const ALE::Obj<RealSection>& dispRelSection = 
+    _fields->get("relative disp").section();
+  assert(!dispRelSection.isNull());
 
   double_array slipRateVertex(spaceDim);
-  const ALE::Obj<RealSection>& slipRateSection =
-      _fields->get("slip rate").section();
-  assert(!slipRateSection.isNull());
+  const ALE::Obj<RealSection>& velRelSection =
+      _fields->get("relative velocity").section();
+  assert(!velRelSection.isNull());
 
-  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
-  assert(!areaSection.isNull());
-
-  double_array orientationVertex(orientationSize);
   const ALE::Obj<RealSection>& orientationSection =
       _fields->get("orientation").section();
   assert(!orientationSection.isNull());
 
-  double_array dispTVertexN(spaceDim);
-  double_array dispTVertexP(spaceDim);
-  double_array lagrangeTVertex(spaceDim);
+  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+  assert(!areaSection.isNull());
+
   const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
   assert(!dispTSection.isNull());
 
@@ -709,13 +880,9 @@
     "dispIncr adjust").section();
   assert(!dispTIncrAdjSection.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();
 
@@ -726,33 +893,19 @@
 					    jacobianSection);
   assert(!globalOrder.isNull());
 
-  adjustSolnLumped_fn_type adjustSolnLumpedFn;
   constrainSolnSpace_fn_type constrainSolnSpaceFn;
-  sensitivitySolveLumped_fn_type sensitivitySolveLumpedFn;
   switch (spaceDim) { // switch
   case 1:
-    adjustSolnLumpedFn = 
-      &pylith::faults::FaultCohesiveDyn::_adjustSolnLumped1D;
     constrainSolnSpaceFn = 
       &pylith::faults::FaultCohesiveDyn::_constrainSolnSpace1D;
-    sensitivitySolveLumpedFn =
-      &pylith::faults::FaultCohesiveDyn::_sensitivitySolveLumped1D;
     break;
   case 2: 
-    adjustSolnLumpedFn = 
-      &pylith::faults::FaultCohesiveDyn::_adjustSolnLumped2D;
     constrainSolnSpaceFn = 
       &pylith::faults::FaultCohesiveDyn::_constrainSolnSpace2D;
-    sensitivitySolveLumpedFn =
-      &pylith::faults::FaultCohesiveDyn::_sensitivitySolveLumped2D;
     break;
   case 3:
-    adjustSolnLumpedFn = 
-      &pylith::faults::FaultCohesiveDyn::_adjustSolnLumped3D;
     constrainSolnSpaceFn = 
       &pylith::faults::FaultCohesiveDyn::_constrainSolnSpace3D;
-    sensitivitySolveLumpedFn =
-      &pylith::faults::FaultCohesiveDyn::_sensitivitySolveLumped3D;
     break;
   default :
     assert(0);
@@ -777,189 +930,170 @@
     _logger->eventBegin(restrictEvent);
 #endif
 
-    // Get slip
-    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+    // Get residual at cohesive cell's vertices.
+    assert(spaceDim == residualSection->getFiberDimension(v_lagrange));
+    const double* residualVertexL = residualSection->restrictPoint(v_lagrange);
+    assert(residualVertexL);
 
-    // 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);
+    // Get jacobian at cohesive cell's vertices.
+    assert(spaceDim == jacobianSection->getFiberDimension(v_negative));
+    const double* jacobianVertexN = jacobianSection->restrictPoint(v_negative);
+    assert(jacobianVertexN);
+
+    assert(spaceDim == jacobianSection->getFiberDimension(v_positive));
+    const double* jacobianVertexP = jacobianSection->restrictPoint(v_positive);
+    assert(jacobianVertexP);
+
+    // Get area at fault vertex.
     assert(1 == areaSection->getFiberDimension(v_fault));
-    
-    // Get fault orientation
-    orientationSection->restrictPoint(v_fault, &orientationVertex[0],
-				      orientationVertex.size());
-    
-    // Get Jacobian at vertices on positive and negative sides of the fault.
-    jacobianSection->restrictPoint(v_negative, &jacobianVertexN[0],
-				   jacobianVertexN.size());
-    jacobianSection->restrictPoint(v_positive, &jacobianVertexP[0],
-				   jacobianVertexP.size());
-    
-    // Get residual at cohesive cell's vertices.
-    residualSection->restrictPoint(v_negative, &residualVertexN[0], 
-				   residualVertexN.size());
-    residualSection->restrictPoint(v_positive, &residualVertexP[0], 
-				   residualVertexP.size());
+    assert(areaSection->restrictPoint(v_fault));
+    const double areaVertex = *areaSection->restrictPoint(v_fault);
+    assert(areaVertex > 0.0);
 
-    // Get disp(t) at cohesive cell's vertices.
-    dispTSection->restrictPoint(v_negative, &dispTVertexN[0], 
-				dispTVertexN.size());
-    dispTSection->restrictPoint(v_positive, &dispTVertexP[0], 
-				dispTVertexP.size());
-    
-    // Get Lagrange multiplier values from disp(t), and dispIncr(t->t+dt)
-    dispTSection->restrictPoint(v_lagrange, &lagrangeTVertex[0],
-				lagrangeTVertex.size());
+    // Get disp(t) at Lagrange vertex.
+    assert(spaceDim == dispTSection->getFiberDimension(v_lagrange));
+    const double* lagrangeTVertex = dispTSection->restrictPoint(v_lagrange);
+    assert(lagrangeTVertex);
+
+    // Get dispIncr(t) at cohesive cell's vertices.
+    dispTIncrSection->restrictPoint(v_negative, &dispTIncrVertexN[0],
+				    dispTIncrVertexN.size());
+    dispTIncrSection->restrictPoint(v_positive, &dispTIncrVertexP[0],
+				    dispTIncrVertexP.size());
     dispTIncrSection->restrictPoint(v_lagrange, &lagrangeTIncrVertex[0],
 				    lagrangeTIncrVertex.size());
+
+    // Get relative displacement at fault vertex.
+    dispRelSection->restrictPoint(v_fault, &dispRelVertex[0], 
+				  dispRelVertex.size());
+
+    // Get relative velocity at fault vertex.
+    assert(spaceDim == velRelSection->getFiberDimension(v_fault));
+    const double* velRelVertex = velRelSection->restrictPoint(v_fault);
+    assert(velRelVertex);
     
+    // Get fault orientation at fault vertex.
+    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+    const double* orientationVertex = 
+      orientationSection->restrictPoint(v_fault);
+    assert(orientationVertex);
+    
 
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(restrictEvent);
     _logger->eventBegin(computeEvent);
 #endif
 
-    CALL_MEMBER_FN(*this,
-		   adjustSolnLumpedFn)(&lagrangeTIncrVertex,
-				       &dispTIncrVertexN,
-				       &dispTIncrVertexP,
-				       slipVertex,
-				       orientationVertex,
-				       dispTVertexN,
-				       dispTVertexP,
-				       residualVertexN,
-				       residualVertexP,
-				       jacobianVertexN,
-				       jacobianVertexP);
+    // Adjust solution as in prescribed rupture, updating the Lagrange
+    // multipliers and the corresponding displacment increments.
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      assert(jacobianVertexP[iDim] > 0.0);
+      assert(jacobianVertexN[iDim] > 0.0);
+      const double S = (1.0/jacobianVertexP[iDim] + 1.0/jacobianVertexN[iDim]) *
+	areaVertex * areaVertex;
+      assert(S > 0.0);
+      lagrangeTIncrVertex[iDim] = 1.0/S * 
+	(-residualVertexL[iDim] +
+	 areaVertex * (dispTIncrVertexP[iDim] - dispTIncrVertexN[iDim]));
 
+      assert(jacobianVertexN[iDim] > 0.0);
+      dispTIncrVertexN[iDim] = 
+	+areaVertex / jacobianVertexN[iDim]*lagrangeTIncrVertex[iDim];
+
+      assert(jacobianVertexP[iDim] > 0.0);
+      dispTIncrVertexP[iDim] = 
+	-areaVertex / jacobianVertexP[iDim]*lagrangeTIncrVertex[iDim];
+
+    } // for
+
+    // Compute slip, slip rate, and Lagrange multiplier at time t+dt
+    // in fault coordinate system.
+    slipVertex = 0.0;
+    slipRateVertex = 0.0;
+    tractionTpdtVertex = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      for (int jDim=0; jDim < spaceDim; ++jDim) {
+	slipVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] *
+	  dispRelVertex[jDim];
+	slipRateVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] *
+	  velRelVertex[jDim];
+	tractionTpdtVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] *
+	  (lagrangeTVertex[jDim] + lagrangeTIncrVertex[jDim]);
+      } // for
+    } // for
     
-    // 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->retrievePropsStateVars(v_fault);
 
+    // Use fault constitutive model to compute traction associated with
+    // friction.
+    dLagrangeTpdtVertex = 0.0;
     CALL_MEMBER_FN(*this,
 		   constrainSolnSpaceFn)(&dLagrangeTpdtVertex,
 					 slipVertex, slipRateVertex,
-					 tractionTpdtVertex, *areaVertex);
-    CALL_MEMBER_FN(*this,
-       sensitivitySolveLumpedFn)(&slipVertex,
-           dLagrangeTpdtVertex, jacobianVertexN, jacobianVertexP);
+					 tractionTpdtVertex);
 
-    lagrangeTIncrVertex += dLagrangeTpdtVertex;
+    // Rotate traction back to global coordinate system.
+    dLagrangeTpdtVertexGlobal = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      for (int jDim=0; jDim < spaceDim; ++jDim) {
+	dLagrangeTpdtVertexGlobal[iDim] += 
+	  orientationVertex[jDim*spaceDim+iDim] * dLagrangeTpdtVertex[jDim];
+      } // for
+    } // for
 
-    // :TODO: Refactor this into sensitivitySolveLumpedXD().
-    switch (spaceDim) { // switch
-    case 1: {
-      assert(jacobianVertexN[0] > 0.0);
-      assert(jacobianVertexP[0] > 0.0);
+#if 0 // debugging
+    std::cout << "dispTIncrP: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << dispTIncrVertexP[iDim];
+    std::cout << ", dispTIncrN: "; 
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << dispTIncrVertexN[iDim];
+    std::cout << ", slipVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << slipVertex[iDim];
+    std::cout << ",  slipRateVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << slipRateVertex[iDim];
+    std::cout << ", orientationVertex: ";
+    for (int iDim=0; iDim < spaceDim*spaceDim; ++iDim)
+      std::cout << "  " << orientationVertex[iDim];
+    std::cout << ",  tractionVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << tractionTpdtVertex[iDim];
+    std::cout << ",  lagrangeTVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << lagrangeTVertex[iDim];
+    std::cout << ",  lagrangeTIncrVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << lagrangeTIncrVertex[iDim];
+    std::cout << ",  dLagrangeTpdtVertex: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << dLagrangeTpdtVertex[iDim];
+    std::cout << ",  dLagrangeTpdtVertexGlobal: ";
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      std::cout << "  " << dLagrangeTpdtVertexGlobal[iDim];
+    std::cout << std::endl;
+#endif
 
-      const double dlp = lagrangeTIncrVertex[0];
+    // Compute change in displacement.
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      assert(jacobianVertexP[iDim] > 0.0);
+      assert(jacobianVertexN[iDim] > 0.0);
 
-      // Update displacements at negative vertex
-      dispTIncrVertexN[0] = +1.0 / jacobianVertexN[0] * dlp;
-  
-      // Update displacements at positive vertex
-      dispTIncrVertexP[0] = -1.0 / jacobianVertexP[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);
+      dispTIncrVertexN[iDim] += 
+	areaVertex * dLagrangeTpdtVertexGlobal[iDim] / jacobianVertexN[iDim];
+      dispTIncrVertexP[iDim] -= 
+	areaVertex * dLagrangeTpdtVertexGlobal[iDim] / jacobianVertexP[iDim];
 
-      // 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]);
+      // Set increment in relative displacement.
+      dispRelVertex[iDim] = -areaVertex * dLagrangeTpdtVertexGlobal[iDim] / 
+	(jacobianVertexN[iDim] + jacobianVertexP[iDim]);
 
-      const double Cpx = orientationVertex[0];
-      const double Cpy = orientationVertex[1];
-      const double Cqx = orientationVertex[2];
-      const double Cqy = orientationVertex[3];
+      // Update increment in Lagrange multiplier.
+      lagrangeTIncrVertex[iDim] += dLagrangeTpdtVertexGlobal[iDim];
+    } // for
 
-      const double dlp = lagrangeTIncrVertex[0];
-      const double dlq = lagrangeTIncrVertex[1];
-
-      const double dlx = Cpx * dlp + Cqx * dlq;
-      const double dly = Cpy * dlp + Cqy * dlq;
-  
-      // Update displacements at negative vertex.
-      dispTIncrVertexN[0] = dlx / jacobianVertexN[0];
-      dispTIncrVertexN[1] = dly / jacobianVertexN[0];
-  
-      // Update displacements at positive vertex.
-      dispTIncrVertexP[0] = -dlx / jacobianVertexP[0];
-      dispTIncrVertexP[1] = -dly / jacobianVertexP[0];
-
-      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);
-
-      // 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 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 dlp = lagrangeTIncrVertex[0];
-      const double dlq = lagrangeTIncrVertex[1];
-      const double dlr = lagrangeTIncrVertex[2];
-
-      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.
-      dispTIncrVertexN[0] = dlx / jacobianVertexN[0];
-      dispTIncrVertexN[1] = dly / jacobianVertexN[1];
-      dispTIncrVertexN[2] = dlz / jacobianVertexN[2];
-
-      // Update displacements at positive vertex.
-      dispTIncrVertexP[0] = -dlx / jacobianVertexP[0];
-      dispTIncrVertexP[1] = -dly / jacobianVertexP[1];
-      dispTIncrVertexP[2] = -dlz / jacobianVertexP[2];
-
-      break;
-    } // case 3
-    default:
-      assert(0);
-      throw std::logic_error("Unknown spatial dimension in "
-			     "FaultCohesiveDyn::adjustSolnLumped().");
-    } // switch
-
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(computeEvent);
     _logger->eventBegin(updateEvent);
@@ -969,7 +1103,7 @@
     // constraint is local (the adjustment is assembled across processors).
     if (globalOrder->isLocal(v_lagrange)) {
       // Adjust displacements to account for Lagrange multiplier values
-      // (assumed to be zero in perliminary solve).
+      // (assumed to be zero in preliminary solve).
       assert(dispTIncrVertexN.size() == 
 	     dispTIncrAdjSection->getFiberDimension(v_negative));
       dispTIncrAdjSection->updateAddPoint(v_negative, &dispTIncrVertexN[0]);
@@ -979,27 +1113,40 @@
       dispTIncrAdjSection->updateAddPoint(v_positive, &dispTIncrVertexP[0]);
     } // if
 
-    // The Lagrange multiplier and slip are NOT assembled across processors.
+    // The Lagrange multiplier and relative displacement are NOT
+    // assembled across processors.
 
     // Set Lagrange multiplier value. Value from preliminary solve is
-    // bogus due to artificial diagonal entry of 1.0.
+    // bogus due to artificial diagonal entry in Jacobian of 1.0.
     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]);
+    // Update the relative displacement estimate based on adjustment
+    // to the Lagrange multiplier values.
+    assert(dispRelVertex.size() ==
+	   dispRelSection->getFiberDimension(v_fault));
+    dispRelSection->updateAddPoint(v_fault, &dispRelVertex[0]);
+
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(updateEvent);
 #endif
-  } // for
+    } // for
+  PetscLogFlops(numVertices*spaceDim*(17 + // adjust solve
+				      9 + // updates
+				      spaceDim*9));
 
+
 #if !defined(DETAILED_EVENT_LOGGING)
   _logger->eventEnd(computeEvent);
 #endif
+
+#if 0 // DEBUGGING
+  //dLagrangeTpdtSection->view("AFTER dLagrange");
+  //dispTIncrSection->view("AFTER DISP INCR (t->t+dt)");
+  dispRelSection->view("AFTER RELATIVE DISPLACEMENT");
+  //velRelSection->view("AFTER RELATIVE VELOCITY");
+#endif
 } // adjustSolnLumped
 
 // ----------------------------------------------------------------------
@@ -1020,13 +1167,26 @@
   double scale = 0.0;
   int fiberDim = 0;
   if (0 == strcasecmp("slip", name)) {
-    const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-    return slip;
+    const topology::Field<topology::SubMesh>& dispRel = 
+      _fields->get("relative disp");
+    _allocateBufferVectorField();
+    topology::Field<topology::SubMesh>& buffer =
+        _fields->get("buffer (vector)");
+    buffer.copy(dispRel);
+    buffer.label("slip");
+    _globalToFault(&buffer);
+    return buffer;
 
   } else if (0 == strcasecmp("slip_rate", name)) {
-    const topology::Field<topology::SubMesh>& slipRate =
-      _fields->get("slip rate");
-    return slipRate;
+    const topology::Field<topology::SubMesh>& velRel = 
+      _fields->get("relative velocity");
+    _allocateBufferVectorField();
+    topology::Field<topology::SubMesh>& buffer =
+        _fields->get("buffer (vector)");
+    buffer.copy(velRel);
+    buffer.label("slip_rate");
+    _globalToFault(&buffer);
+    return buffer;
 
   } else if (cohesiveDim > 0 && 0 == strcasecmp("strike_dir", name)) {
     const ALE::Obj<RealSection>& orientationSection = _fields->get(
@@ -1078,7 +1238,10 @@
     _allocateBufferVectorField();
     topology::Field<topology::SubMesh>& buffer =
         _fields->get("buffer (vector)");
-    _getInitialTractions(&buffer);
+    topology::Field<topology::SubMesh>& tractions =
+        _fields->get("initial traction");
+    buffer.copy(tractions);
+    _globalToFault(&buffer);
     return buffer;
 
   } else if (0 == strcasecmp("traction", name)) {
@@ -1100,11 +1263,13 @@
     throw std::runtime_error(msg.str());
   } // else
 
+  // Should never get here.
+  throw std::logic_error("Unknown field in FaultCohesiveDyn::vertexField().");
+
   // Satisfy return values
   assert(0 != _fields);
   const topology::Field<topology::SubMesh>& buffer = _fields->get(
     "buffer (vector)");
-  throw std::logic_error("Internal error.");
 
   return buffer;
 } // vertexField
@@ -1114,7 +1279,6 @@
 pylith::faults::FaultCohesiveDyn::_setupInitialTractions(void)
 { // _setupInitialTractions
   assert(0 != _normalizer);
-  assert(0 != _quadrature);
 
   // If no initial tractions specified, leave method
   if (0 == _dbInitialTract)
@@ -1124,29 +1288,38 @@
   const double pressureScale = _normalizer->pressureScale();
   const double lengthScale = _normalizer->lengthScale();
 
-  // Get quadrature information
-  const int numQuadPts = _quadrature->numQuadPts();
-  const int numBasis = _quadrature->numBasis();
   const int spaceDim = _quadrature->spaceDim();
-  const double_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
 
-  double_array quadPtsGlobal(numQuadPts*spaceDim);
-
   // Create section to hold initial tractions.
-  _fields->add("initial forces", "initial_forces");
-  topology::Field<topology::SubMesh>& forcesInitial = 
-    _fields->get("initial forces");
-  topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  forcesInitial.cloneSection(slip);
-  forcesInitial.scale(pressureScale);
-  const ALE::Obj<RealSection>& forcesInitialSection = forcesInitial.section();
-  assert(!forcesInitialSection.isNull());
-  double_array forcesInitialCell(numBasis*spaceDim);
-  double_array tractionQuadPt(spaceDim);
-  UpdateAddVisitor forcesInitialVisitor(*forcesInitialSection,
-					&forcesInitialCell[0]);
+  _fields->add("initial traction", "initial_traction");
+  topology::Field<topology::SubMesh>& initialTractions = 
+    _fields->get("initial traction");
+  topology::Field<topology::SubMesh>& dispRel = _fields->get("relative disp");
+  initialTractions.cloneSection(dispRel);
+  initialTractions.scale(pressureScale);
 
+  double_array initialTractionsVertex(spaceDim);
+  double_array initialTractionsVertexGlobal(spaceDim);
+  const ALE::Obj<RealSection>& initialTractionsSection = 
+    initialTractions.section();
+  assert(!initialTractionsSection.isNull());
+
+  const ALE::Obj<RealSection>& orientationSection =
+    _fields->get("orientation").section();
+  assert(!orientationSection.isNull());
+
+  const spatialdata::geocoords::CoordSys* cs = _faultMesh->coordsys();
+  assert(0 != cs);
+
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+  assert(!faultSieveMesh.isNull());
+
+  double_array coordsVertex(spaceDim);
+  const ALE::Obj<RealSection>& coordsSection =
+    faultSieveMesh->getRealSection("coordinates");
+  assert(!coordsSection.isNull());
+
+
   assert(0 != _dbInitialTract);
   _dbInitialTract->open();
   switch (spaceDim) { // switch
@@ -1171,124 +1344,61 @@
     assert(0);
     throw std::logic_error("Bad spatial dimension in Neumann.");
   } // switch
-  
-  // Get cells associated with fault
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  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();
 
-  const spatialdata::geocoords::CoordSys* cs = _faultMesh->coordsys();
-  assert(0 != cs);
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_fault = _cohesiveVertices[iVertex].fault;
 
-#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
+    coordsSection->restrictPoint(v_fault, &coordsVertex[0], coordsVertex.size());
 
-  for (SieveSubMesh::label_sequence::iterator c_iter=cellsBegin;
-       c_iter != cellsEnd;
-       ++c_iter) {
-    // Compute geometry information for current cell
-#if defined(PRECOMPUTE_GEOMETRY)
-    _quadrature->retrieveGeometry(*c_iter);
-#else
-    coordsVisitor.clear();
-    faultSieveMesh->restrictClosure(*c_iter, coordsVisitor);
-    _quadrature->computeGeometry(coordinatesCell, *c_iter);
-#endif
+    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+    const double* orientationVertex = 
+      orientationSection->restrictPoint(v_fault);
+    assert(orientationVertex);
 
-    const double_array& quadPtsNonDim = _quadrature->quadPts();
-    quadPtsGlobal = quadPtsNonDim;
-    _normalizer->dimensionalize(&quadPtsGlobal[0], quadPtsGlobal.size(),
-        lengthScale);
-    forcesInitialCell = 0.0;
+    _normalizer->dimensionalize(&coordsVertex[0], coordsVertex.size(),
+				lengthScale);
 
-    // Loop over quadrature points in cell and query database
-    for (int iQuadPt=0, index=0;
-        iQuadPt < numQuadPts;
-        ++iQuadPt, index+=spaceDim) {
+    initialTractionsVertex = 0.0;
+    int err = _dbInitialTract->query(&initialTractionsVertex[0], 
+				     initialTractionsVertex.size(),
+				     &coordsVertex[0], coordsVertex.size(), cs);
+    if (err) {
+      std::ostringstream msg;
+      msg << "Could not find parameters for physical properties at \n" << "(";
+      for (int i = 0; i < spaceDim; ++i)
+	msg << "  " << coordsVertex[i];
+      msg << ") in friction model " << label() << "\n"
+	  << "using spatial database '" << _dbInitialTract->label() << "'.";
+      throw std::runtime_error(msg.str());
+    } // if
+    _normalizer->nondimensionalize(&initialTractionsVertex[0],
+				   initialTractionsVertex.size(), 
+				   pressureScale);
 
-      tractionQuadPt = 0.0;
-      int err = _dbInitialTract->query(&tractionQuadPt[0], spaceDim,
-          &quadPtsGlobal[index], spaceDim, cs);
-      if (err) {
-        std::ostringstream msg;
-        msg << "Could not find parameters for physical properties at \n" << "(";
-        for (int i = 0; i < spaceDim; ++i)
-          msg << "  " << quadPtsGlobal[index + i];
-        msg << ") in friction model " << label() << "\n"
-            << "using spatial database '" << _dbInitialTract->label() << "'.";
-        throw std::runtime_error(msg.str());
-      } // if
-      tractionQuadPt /= pressureScale;
-
-      // Get cell geometry information that depends on cell
-      const double_array& basis = _quadrature->basis();
-      const double_array& jacobianDet = _quadrature->jacobianDet();
-
-      // Integrate tractions over cell.
-      const double wt = quadWts[iQuadPt] * jacobianDet[iQuadPt];
-      for (int iBasis=0; iBasis < numBasis; ++iBasis) {
-	const double valI = wt*basis[iQuadPt*numBasis+iBasis];
-	for (int jBasis=0; jBasis < numBasis; ++jBasis) {
-	  const double valIJ = valI * basis[iQuadPt*numBasis+jBasis];
-	  for (int iDim=0; iDim < spaceDim; ++iDim)
-	    forcesInitialCell[iBasis*spaceDim+iDim] += 
-	      tractionQuadPt[iDim] * valIJ;
-	} // for
+    // Rotate tractions from fault coordinate system to global
+    // coordinate system
+    initialTractionsVertexGlobal = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      for (int jDim=0; jDim < spaceDim; ++jDim) {
+	initialTractionsVertexGlobal[iDim] += 
+	  orientationVertex[jDim*spaceDim+iDim] *
+	  initialTractionsVertex[jDim];
       } // for
     } // for
-    // Assemble cell contribution into field
-    forcesInitialVisitor.clear();
-    faultSieveMesh->updateClosure(*c_iter, forcesInitialVisitor);
+
+    assert(initialTractionsVertexGlobal.size() ==
+	   initialTractionsSection->getFiberDimension(v_fault));
+    initialTractionsSection->updatePoint(v_fault, 
+					 &initialTractionsVertexGlobal[0]);
   } // for
+
   // Close properties database
   _dbInitialTract->close();
 
-  forcesInitial.complete(); // Assemble contributions
+  initialTractions.complete(); // Assemble contributions
 
-  // Rotate forces from fault coordinate system to global coordinate system
-  const int orientationSize = spaceDim * spaceDim;
-  const ALE::Obj<RealSection>& orientationSection =
-    _fields->get("orientation").section();
-
-  double_array forcesInitialVertexFault(spaceDim);
-  double_array forcesInitialVertexGlobal(spaceDim);
-
-  const int numVertices = _cohesiveVertices.size();
-  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
-    const int v_fault = _cohesiveVertices[iVertex].fault;
-
-    assert(orientationSize == orientationSection->getFiberDimension(v_fault));
-    assert(spaceDim == forcesInitialSection->getFiberDimension(v_fault));
-
-    const double* orientationVertex = 
-      orientationSection->restrictPoint(v_fault);
-
-    forcesInitialSection->restrictPoint(v_fault, 
-					&forcesInitialVertexFault[0], 
-					forcesInitialVertexFault.size());
-
-    forcesInitialVertexGlobal = 0.0;
-    for (int iDim = 0; iDim < spaceDim; ++iDim)
-      for (int kDim = 0; kDim < spaceDim; ++kDim)
-        forcesInitialVertexGlobal[iDim] +=
-          forcesInitialVertexFault[kDim] * 
-	  orientationVertex[kDim*spaceDim+iDim];
-
-    assert(forcesInitialVertexGlobal.size() == 
-	   forcesInitialSection->getFiberDimension(v_fault));
-    forcesInitialSection->updatePoint(v_fault, &forcesInitialVertexGlobal[0]);
-  } // for
-
-  //forcesInitial.view("INITIAL FORCES"); // DEBUGGING
+  //initialTractions.view("INITIAL TRACTIONS"); // DEBUGGING
 } // _setupInitialTractions
 
 // ----------------------------------------------------------------------
@@ -1304,86 +1414,16 @@
   assert(0 != _normalizer);
 
   // Fiber dimension of tractions matches spatial dimension.
-  const int fiberDim = _quadrature->spaceDim();
-  double_array tractionsVertex(fiberDim);
+  const int spaceDim = _quadrature->spaceDim();
+  double_array tractionsVertex(spaceDim);
 
   // 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->cloneSection(slip);
-
-    //logger.stagePop();
-  } // if
-  const double pressureScale = _normalizer->pressureScale();
-  tractions->label("traction");
-  tractions->scale(pressureScale);
-  tractions->zero();
-
-  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
-
-} // _calcTractions
-
-// ----------------------------------------------------------------------
-// Compute initial tractions on fault surface.
-void
-pylith::faults::FaultCohesiveDyn::_getInitialTractions(
-    topology::Field<topology::SubMesh>* tractions)
-{ // _getInitialTractions
-  assert(0 != tractions);
-  assert(0 != _faultMesh);
-  assert(0 != _fields);
-  assert(0 != _normalizer);
-
-  // Fiber dimension of tractions matches spatial dimension.
-  const int spaceDim = _quadrature->spaceDim();
-  double_array tractionsVertexGlobal(spaceDim);
-  double_array tractionsVertexFault(spaceDim);
-
-  // Get sections.
-  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
-  assert(!areaSection.isNull());
   const ALE::Obj<RealSection>& orientationSection = 
     _fields->get("orientation").section();
   assert(!orientationSection.isNull());
-  const ALE::Obj<RealSection>& forcesInitialSection = 
-    _fields->get("initial forces").section();
-  assert(!forcesInitialSection.isNull());
 
   // Allocate buffer for tractions field (if necessary).
   const ALE::Obj<RealSection>& tractionsSection = tractions->section();
@@ -1391,82 +1431,73 @@
     ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
     //logger.stagePush("Fault");
 
-    const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-    tractions->cloneSection(slip);
+    const topology::Field<topology::SubMesh>& dispRel = 
+      _fields->get("relative disp");
+    tractions->cloneSection(dispRel);
 
     //logger.stagePop();
   } // if
   const double pressureScale = _normalizer->pressureScale();
-  tractions->label("initial_traction");
+  tractions->label("traction");
   tractions->scale(pressureScale);
   tractions->zero();
 
   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(spaceDim == forcesInitialSection->getFiberDimension(v_fault));
-    assert(spaceDim == tractionsSection->getFiberDimension(v_fault));
-    assert(1 == areaSection->getFiberDimension(v_fault));
+    assert(spaceDim == dispTSection->getFiberDimension(v_lagrange));
+    const double* dispTVertex = dispTSection->restrictPoint(v_lagrange);
+    assert(dispTVertex);
 
-    const double* forcesInitialVertex = 
-      forcesInitialSection->restrictPoint(v_fault);
-    assert(0 != forcesInitialVertex);
-    const double* areaVertex = areaSection->restrictPoint(v_fault);
-    assert(0 != areaVertex);
+    assert(spaceDim*spaceDim == 
+	   orientationSection->getFiberDimension(v_fault));
     const double* orientationVertex = 
       orientationSection->restrictPoint(v_fault);
-    assert(0 != orientationVertex);
+    assert(orientationVertex);
 
-    for (int i = 0; i < spaceDim; ++i)
-      tractionsVertexGlobal[i] = forcesInitialVertex[i] / areaVertex[0];
+    // Rotate tractions to fault coordinate system.
+    tractionsVertex = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      for (int jDim=0; jDim < spaceDim; ++jDim) {
+	tractionsVertex[iDim] += orientationVertex[iDim*spaceDim+jDim] *
+	  dispTVertex[jDim];
+      } // for
+    } // for
 
-    // Rotate from global coordinate system to local coordinate system
-    tractionsVertexFault = 0.0;
-    for (int iDim = 0; iDim < spaceDim; ++iDim)
-      for (int kDim = 0; kDim < spaceDim; ++kDim)
-        tractionsVertexFault[iDim] +=
-          tractionsVertexGlobal[kDim] * orientationVertex[iDim*spaceDim+kDim];
-    
-    assert(tractionsVertexFault.size() == 
+    assert(tractionsVertex.size() == 
 	   tractionsSection->getFiberDimension(v_fault));
-    tractionsSection->updatePoint(v_fault, &tractionsVertexFault[0]);
+    tractionsSection->updatePoint(v_fault, &tractionsVertex[0]);
   } // for
 
   PetscLogFlops(numVertices * (1 + spaceDim) );
 
 #if 0 // DEBUGGING
-  tractions->view("INITIAL TRACTIONS");
+  tractions->view("TRACTIONS");
 #endif
 
-} // _getInitialTractions
+} // _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
+pylith::faults::FaultCohesiveDyn::_updateVelRel(const topology::SolutionFields& fields)
+{ // _updateVelRel
   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 velRelVertex(spaceDim);
+  const ALE::Obj<RealSection>& velRelSection =
+      _fields->get("relative velocity").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;
@@ -1483,36 +1514,20 @@
     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));
+    // Compute relative velocity
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      const double value = velocityVertexP[iDim] - velocityVertexN[iDim];
+      velRelVertex[iDim] = fabs(value) > _zeroTolerance ? value : 0.0;
+    } // for
 
-    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[iDim*spaceDim+kDim];
-
-    // Velocity for positive vertex.
-    for (int iDim = 0; iDim < spaceDim; ++iDim)
-      for (int kDim = 0; kDim < spaceDim; ++kDim)
-        slipRateVertex[iDim] +=
-          velocityVertexP[kDim] * +orientationVertex[iDim*spaceDim+kDim];
-
-    // Limit velocity to resolvable range
-    for (int iDim = 0; iDim < spaceDim; ++iDim)
-      if (fabs(slipRateVertex[iDim]) < _zeroTolerance)
-	slipRateVertex[iDim] = 0.0;
-
     // Update slip rate field.
-    assert(slipRateVertex.size() == 
-	   slipRateSection->getFiberDimension(v_fault));
-    slipRateSection->updatePoint(v_fault, &slipRateVertex[0]);
+    assert(velRelVertex.size() == 
+	   velRelSection->getFiberDimension(v_fault));
+    velRelSection->updatePoint(v_fault, &velRelVertex[0]);
   } // for
 
   PetscLogFlops(numVertices*spaceDim*spaceDim*4);
-} // _updateSlipRate
+} // _updateVelRel
 
 // ----------------------------------------------------------------------
 // Setup sensitivity problem to compute change in slip given change in Lagrange multipliers.
@@ -1529,9 +1544,9 @@
     _fields->add("sensitivity solution", "sensitivity_soln");
     topology::Field<topology::SubMesh>& solution =
         _fields->get("sensitivity solution");
-    const topology::Field<topology::SubMesh>& slip =
-        _fields->get("slip");
-    solution.cloneSection(slip);
+    const topology::Field<topology::SubMesh>& dispRel =
+        _fields->get("relative disp");
+    solution.cloneSection(dispRel);
     solution.createScatter(solution.mesh());
   } // if
   const topology::Field<topology::SubMesh>& solution =
@@ -1545,14 +1560,14 @@
     residual.createScatter(solution.mesh());
   } // if
 
-  if (!_fields->hasField("sensitivity dispRel")) {
-    _fields->add("sensitivity dispRel", "sensitivity_disprel");
+  if (!_fields->hasField("sensitivity relative disp")) {
+    _fields->add("sensitivity relative disp", "sensitivity_relative_disp");
     topology::Field<topology::SubMesh>& dispRel =
-        _fields->get("sensitivity dispRel");
+        _fields->get("sensitivity relative disp");
     dispRel.cloneSection(solution);
   } // if
   topology::Field<topology::SubMesh>& dispRel =
-    _fields->get("sensitivity dispRel");
+    _fields->get("sensitivity relative disp");
   dispRel.zero();
 
   if (!_fields->hasField("sensitivity dLagrange")) {
@@ -1629,6 +1644,7 @@
     cellsCohesive->end();
 
   // Visitor for Jacobian matrix associated with domain.
+  double_array jacobianSubCell(submatrixSize);
   const PetscMat jacobianDomainMatrix = jacobian.matrix();
   assert(0 != jacobianDomainMatrix);
   const ALE::Obj<SieveMesh::order_type>& globalOrderDomain =
@@ -1650,7 +1666,6 @@
   assert(!solutionFaultSection.isNull());
 
   // Visitor for Jacobian matrix associated with fault.
-  double_array jacobianSubCell(submatrixSize);
   assert(0 != _jacobian);
   const PetscMat jacobianFaultMatrix = _jacobian->matrix();
   assert(0 != jacobianFaultMatrix);
@@ -1691,7 +1706,9 @@
 	else
 	  indicesGlobal[iB+iDim] = -1;
 
-	// Set matrix diagonal entries to 1.0 (used when vertex is not local).
+	// Set matrix diagonal entries to 1.0 (used when vertex is not
+	// local).  This happens if a vertex is not on the same
+	// processor as the cohesive cell.
 	jacobianSubCell[(iB+iDim)*numBasis*spaceDim+iB+iDim] = 1.0;
       } // for
     } // for
@@ -1720,50 +1737,106 @@
 void
 pylith::faults::FaultCohesiveDyn::_sensitivityReformResidual(const bool negativeSide)
 { // _sensitivityReformResidual
-  assert(0 != _fields);
-  assert(0 != _quadrature);
+  /** Compute residual -L^T dLagrange
+   *
+   * Note: We need all entries for L, even those on other processors,
+   * so we compute L rather than extract entries from the Jacoiab.
+   */
 
+  const double signFault = (negativeSide) ?  1.0 : -1.0;
+
+  // Get cell information
+  const int numQuadPts = _quadrature->numQuadPts();
+  const double_array& quadWts = _quadrature->quadWts();
+  assert(quadWts.size() == numQuadPts);
   const int spaceDim = _quadrature->spaceDim();
+  const int numBasis = _quadrature->numBasis();
 
-  // Compute residual -C^T dLagrange
-  double_array residualVertex(spaceDim);
+
+  double_array basisProducts(numBasis*numBasis);
+
+  // Get fault cell information
+  const ALE::Obj<SieveMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+  assert(!faultSieveMesh.isNull());
+  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();
+  const int numCells = cells->size();
+
+  // Get sections
+  double_array coordinatesCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& coordinates = 
+    faultSieveMesh->getRealSection("coordinates");
+  assert(!coordinates.isNull());
+  RestrictVisitor coordsVisitor(*coordinates, 
+				coordinatesCell.size(), &coordinatesCell[0]);
+
+  double_array dLagrangeCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& dLagrangeSection = 
+    _fields->get("sensitivity dLagrange").section();
+  assert(!dLagrangeSection.isNull());
+  RestrictVisitor dLagrangeVisitor(*dLagrangeSection, 
+				   dLagrangeCell.size(), &dLagrangeCell[0]);
+
+  double_array residualCell(numBasis*spaceDim);
   topology::Field<topology::SubMesh>& residual =
       _fields->get("sensitivity residual");
   const ALE::Obj<RealSection>& residualSection = residual.section();
+  UpdateAddVisitor residualVisitor(*residualSection, &residualCell[0]);
+
   residual.zero();
 
-  const ALE::Obj<RealSection>& dLagrangeSection =
-      _fields->get("sensitivity dLagrange").section();
+  // Loop over cells
+  for (SieveSubMesh::label_sequence::iterator c_iter=cellsBegin;
+       c_iter != cellsEnd;
+       ++c_iter) {
+    // Compute geometry
+    coordsVisitor.clear();
+    faultSieveMesh->restrictClosure(*c_iter, coordsVisitor);
+    _quadrature->computeGeometry(coordinatesCell, *c_iter);
 
-  const ALE::Obj<RealSection>& orientationSection =
-      _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
+    // Restrict input fields to cell
+    dLagrangeVisitor.clear();
+    faultSieveMesh->restrictClosure(*c_iter, dLagrangeVisitor);
 
-  const double sign = (negativeSide) ? -1.0 : 1.0;
+    // Get cell geometry information that depends on cell
+    const double_array& basis = _quadrature->basis();
+    const double_array& jacobianDet = _quadrature->jacobianDet();
 
-  const int numVertices = _cohesiveVertices.size();
-  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
-    const int v_fault = _cohesiveVertices[iVertex].fault;
+    // Compute product of basis functions.
+    // Want values summed over quadrature points
+    basisProducts = 0.0;
+    for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
+      const double wt = quadWts[iQuad] * jacobianDet[iQuad];
 
-    const double* dLagrangeVertex = dLagrangeSection->restrictPoint(v_fault);
-    assert(0 != dLagrangeVertex);
-    assert(spaceDim == dLagrangeSection->getFiberDimension(v_fault));
+      for (int iBasis=0, iQ=iQuad*numBasis; iBasis < numBasis; ++iBasis) {
+        const double valI = wt*basis[iQ+iBasis];
+	
+        for (int jBasis=0; jBasis < numBasis; ++jBasis) {
+	  
+	  basisProducts[iBasis*numBasis+jBasis] += valI*basis[iQ+jBasis];
+	} // for
+      } // for
+    } // for
 
-    const double* orientationVertex = orientationSection->restrictPoint(v_fault);
-    assert(0 != orientationVertex);
-    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+    residualCell = 0.0;
+    
+    for (int iBasis=0; iBasis < numBasis; ++iBasis) {
+      for (int jBasis=0; jBasis < numBasis; ++jBasis) {
+	const double l = signFault * basisProducts[iBasis*numBasis+jBasis];
+	for (int iDim=0; iDim < spaceDim; ++iDim) {
+	  residualCell[iBasis*spaceDim+iDim] += 
+	    l * dLagrangeCell[jBasis*spaceDim+iDim];
+	} // for
+      } // for
+    } // for
 
-    residualVertex = 0.0;
-    for (int iDim = 0; iDim < spaceDim; ++iDim)
-      for (int kDim = 0; kDim < spaceDim; ++kDim)
-        residualVertex[iDim] +=
-          sign * dLagrangeVertex[kDim] * -orientationVertex[kDim*spaceDim+iDim];
-
-    assert(residualVertex.size() == residualSection->getFiberDimension(v_fault));
-    residualSection->updatePoint(v_fault, &residualVertex[0]);
+    // Assemble cell contribution into field
+    residualVisitor.clear();
+    faultSieveMesh->updateClosure(*c_iter, residualVisitor);    
   } // for
-
-  PetscLogFlops(numVertices*spaceDim*spaceDim*4);
 } // _sensitivityReformResidual
 
 // ----------------------------------------------------------------------
@@ -1816,7 +1889,7 @@
   const ALE::Obj<RealSection>& solutionSection =
       _fields->get("sensitivity solution").section();
   const ALE::Obj<RealSection>& dispRelSection =
-    _fields->get("sensitivity dispRel").section();
+    _fields->get("sensitivity relative disp").section();
 
   const double sign = (negativeSide) ? -1.0 : 1.0;
 
@@ -1930,8 +2003,7 @@
 pylith::faults::FaultCohesiveDyn::_constrainSolnSpace1D(double_array* dLagrangeTpdt,
          const double_array& slip,
          const double_array& sliprate,
-         const double_array& tractionTpdt,
-         const double area)
+         const double_array& tractionTpdt)
 { // _constrainSolnSpace1D
   assert(0 != dLagrangeTpdt);
 
@@ -1940,7 +2012,11 @@
     } else {
       // if tension, then traction is zero.
 
+#if 0 // :TODO: FIX THIS
       const double dlp = -tractionTpdt[0] * area;
+#else
+      const double dlp = -tractionTpdt[0];
+#endif // 
       (*dLagrangeTpdt)[0] = dlp;
     } // else
 
@@ -1953,8 +2029,7 @@
 pylith::faults::FaultCohesiveDyn::_constrainSolnSpace2D(double_array* dLagrangeTpdt,
          const double_array& slip,
          const double_array& slipRate,
-         const double_array& tractionTpdt,
-         const double area)
+         const double_array& tractionTpdt)
 { // _constrainSolnSpace2D
   assert(0 != dLagrangeTpdt);
 
@@ -1975,7 +2050,7 @@
       if (tractionShearMag > 0.0) {
 	// Update traction increment based on value required to stick
 	// versus friction
-	const double dlp = -(tractionShearMag - frictionStress) * area *
+	const double dlp = -(tractionShearMag - frictionStress) *
 	  tractionTpdt[0] / tractionShearMag;
 	(*dLagrangeTpdt)[0] = dlp;
 	(*dLagrangeTpdt)[1] = 0.0;
@@ -1990,8 +2065,8 @@
     } // if/else
   } else {
     // if in tension, then traction is zero.
-    (*dLagrangeTpdt)[0] = -tractionTpdt[0] * area;
-    (*dLagrangeTpdt)[1] = -tractionTpdt[1] * area;
+    (*dLagrangeTpdt)[0] = -tractionTpdt[0];
+    (*dLagrangeTpdt)[1] = -tractionTpdt[1];
   } // else
 
   PetscLogFlops(8);
@@ -2003,8 +2078,7 @@
 pylith::faults::FaultCohesiveDyn::_constrainSolnSpace3D(double_array* dLagrangeTpdt,
          const double_array& slip,
          const double_array& slipRate,
-         const double_array& tractionTpdt,
-         const double area)
+         const double_array& tractionTpdt)
 { // _constrainSolnSpace3D
   assert(0 != dLagrangeTpdt);
 
@@ -2029,9 +2103,9 @@
       if (tractionShearMag > 0.0) {
 	// Update traction increment based on value required to stick
 	// versus friction
-	const double dlp = -(tractionShearMag - frictionStress) * area *
+	const double dlp = -(tractionShearMag - frictionStress) * 
 	  tractionTpdt[0] / tractionShearMag;
-	const double dlq = -(tractionShearMag - frictionStress) * area *
+	const double dlq = -(tractionShearMag - frictionStress) * 
 	  tractionTpdt[1] / tractionShearMag;
 	
 	(*dLagrangeTpdt)[0] = dlp;
@@ -2050,9 +2124,9 @@
     } // if/else
   } else {
     // if in tension, then traction is zero.
-    (*dLagrangeTpdt)[0] = -tractionTpdt[0] * area;
-    (*dLagrangeTpdt)[1] = -tractionTpdt[1] * area;
-    (*dLagrangeTpdt)[2] = -tractionTpdt[2] * area;
+    (*dLagrangeTpdt)[0] = -tractionTpdt[0];
+    (*dLagrangeTpdt)[1] = -tractionTpdt[1];
+    (*dLagrangeTpdt)[2] = -tractionTpdt[2];
   } // else
 
   PetscLogFlops(22);

Modified: short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveDyn.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveDyn.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveDyn.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -146,18 +146,13 @@
   void _calcTractions(topology::Field<topology::SubMesh>* tractions,
           const topology::Field<topology::Mesh>& solution);
 
-  /** Get initial tractions on fault surface.
+  /** Update relative velocity associated with Lagrange vertex k
+   * corresponding to diffential velocity between conventional
+   * vertices i and j.
    *
-   * @param tractions Field for tractions.
-   */
-  void _getInitialTractions(topology::Field<topology::SubMesh>* tractions);
-
-  /** 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);
+  void _updateVelRel(const topology::SolutionFields& fields);
 
   /** Setup sensitivity problem to compute change in slip given change
    * in Lagrange multipliers.
@@ -240,13 +235,11 @@
    * @param slip Slip assoc. w/Lagrange multiplier vertex.
    * @param slipRate Slip rate assoc. w/Lagrange multiplier vertex.
    * @param tractionTpdt Fault traction assoc. w/Lagrange multiplier vertex.
-   * @param area Fault area associated w/Lagrange multiplier vertex.
    */
   void _constrainSolnSpace1D(double_array* dLagrangeTpdt,
            const double_array& slip,
            const double_array& slipRate,
-           const double_array& tractionTpdt,
-           const double area);
+           const double_array& tractionTpdt);
 
   /** Constrain solution space with lumped Jacobian in 2-D.
    *
@@ -254,13 +247,11 @@
    * @param slip Slip assoc. w/Lagrange multiplier vertex.
    * @param slipRate Slip rate assoc. w/Lagrange multiplier vertex.
    * @param tractionTpdt Fault traction assoc. w/Lagrange multiplier vertex.
-   * @param area Fault area associated w/Lagrange multiplier vertex.
    */
   void _constrainSolnSpace2D(double_array* dLagrangeTpdt,
            const double_array& slip,
            const double_array& slipRate,
-           const double_array& tractionTpdt,
-           const double area);
+           const double_array& tractionTpdt);
 
   /** Constrain solution space with lumped Jacobian in 3-D.
    *
@@ -268,13 +259,11 @@
    * @param slip Slip assoc. w/Lagrange multiplier vertex.
    * @param slipRate Slip rate assoc. w/Lagrange multiplier vertex.
    * @param tractionTpdt Fault traction assoc. w/Lagrange multiplier vertex.
-   * @param area Fault area associated w/Lagrange multiplier vertex.
    */
   void _constrainSolnSpace3D(double_array* dLagrangeTpdt,
            const double_array& slip,
            const double_array& slipRate,
-           const double_array& tractionTpdt,
-           const double area);
+           const double_array& tractionTpdt);
 
   // PRIVATE MEMBERS ////////////////////////////////////////////////////
 private :

Modified: short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveKin.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveKin.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveKin.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -129,17 +129,21 @@
   const int setupEvent = _logger->eventId("FaIR setup");
   _logger->eventBegin(setupEvent);
 
-  topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-  slip.zero();
+  topology::Field<topology::SubMesh>& dispRel = _fields->get("relative disp");
+  dispRel.zero();
   // Compute slip field at current time step
   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);
     if (t >= src->originTime())
-      src->slip(&slip, t);
+      src->slip(&dispRel, t);
   } // for
 
+  // Transform slip from local (fault) coordinate system to relative
+  // displacement field in global coordinate system
+  _faultToGlobal(&dispRel);
+
   _logger->eventEnd(setupEvent);
 
   FaultCohesiveLagrange::integrateResidual(residual, t, fields);
@@ -166,8 +170,15 @@
   double scale = 0.0;
   int fiberDim = 0;
   if (0 == strcasecmp("slip", name)) {
-    const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-    return slip;
+    const topology::Field<topology::SubMesh>& dispRel = 
+      _fields->get("relative disp");
+    _allocateBufferVectorField();
+    topology::Field<topology::SubMesh>& buffer =
+        _fields->get("buffer (vector)");
+    buffer.copy(dispRel);
+    buffer.label("slip");
+    _globalToFault(&buffer);
+    return buffer;
 
   } else if (cohesiveDim > 0 && 0 == strcasecmp("strike_dir", name)) {
     const ALE::Obj<RealSection>& orientationSection = _fields->get(
@@ -268,6 +279,9 @@
   } // else
 
 
+  // Should never get here.
+  throw std::logic_error("Unknown field in FaultCohesiveKin::vertexField().");
+
   // Satisfy return values
   assert(0 != _fields);
   const topology::Field<topology::SubMesh>& buffer = _fields->get(

Modified: short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveLagrange.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveLagrange.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveLagrange.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -107,18 +107,18 @@
   ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
   //logger.stagePush("Fault");
 
-  // Allocate slip field
+  // Allocate dispRel 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());
+  _fields->add("relative disp", "relative_disp");
+  topology::Field<topology::SubMesh>& dispRel = _fields->get("relative disp");
+  dispRel.newSection(vertices, cs->spaceDim());
+  dispRel.allocate();
+  dispRel.vectorFieldType(topology::FieldBase::VECTOR);
+  dispRel.scale(_normalizer->lengthScale());
 
   const ALE::Obj<SieveSubMesh::label_sequence>& cells =
       faultSieveMesh->heightStratum(0);
@@ -137,11 +137,11 @@
   assert(!distSection.isNull());
   const double rank = (double) distSection->commRank();
 
-  // Loop over cells in fault mesh, compute area
+  // Loop over cells in fault mesh, set distribution
   for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
       != cellsEnd; ++c_iter) {
     distSection->updatePoint(*c_iter, &rank);
-  }
+  } // for
 
   // Compute orientation at vertices in fault mesh.
   _calcOrientation(upDir);
@@ -195,13 +195,14 @@
   assert(0 != _fields);
   assert(0 != _logger);
 
-  // Cohesive cells with normal vertices i and j, and constraint
-  // vertex k make contributions to the assembled residual:
+  // Cohesive cells with conventional vertices N and P, and constraint
+  // vertex L 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)}
+  // DOF P: \int_{S_f^+} \tensor{N}_m^T \cdot \tensor{N}_p \cdot \vec{l}_p dS
+  // DOF N: -\int_{S_f^+} \tensor{N}_m^T \cdot \tensor{N}_p \cdot \vec{l}_p dS
+  // DOF L: \int_S_f \tensor{N}_p^T ( \tensor{R} \cdot \vec{d} 
+  //                 -\tensor{N}_{n^+} \cdot \vec{u}_{n^+}
+  //                 +\tensor{N}_{n^-} \cdot \vec{u}_{n^-} dS
 
   const int setupEvent = _logger->eventId("FaIR setup");
   const int geometryEvent = _logger->eventId("FaIR geometry");
@@ -211,51 +212,40 @@
 
   _logger->eventBegin(setupEvent);
 
-  // Get cell information and setup storage for cell data
+  // Get cell geometry information that doesn't depend on cell
   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);
+  // Get sections associated with cohesive cells
   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();
+  const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
   assert(!dispTSection.isNull());
 
-  topology::Field<topology::Mesh>& dispTIncr = fields->get("dispIncr(t->t+dt)");
-  const ALE::Obj<RealSection>& dispTIncrSection = dispTIncr.section();
+  const ALE::Obj<RealSection>& dispTIncrSection = 
+    fields->get("dispIncr(t->t+dt)").section();
   assert(!dispTIncrSection.isNull());
 
+  double_array dispTpdtVertexN(spaceDim);
+  double_array dispTpdtVertexP(spaceDim);
+  double_array dispTpdtVertexL(spaceDim);
+
+  const ALE::Obj<RealSection>& dispRelSection = 
+    _fields->get("relative disp").section();
+  assert(!dispRelSection.isNull());
+
+  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+  assert(!areaSection.isNull());
+
+  // Get fault information
   const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
   assert(!sieveMesh.isNull());
   const ALE::Obj<SieveMesh::order_type>& globalOrder =
-    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", 
-					    residualSection);
+      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
+					      residualSection);
   assert(!globalOrder.isNull());
 
   _logger->eventEnd(setupEvent);
@@ -263,6 +253,7 @@
   _logger->eventBegin(computeEvent);
 #endif
 
+  // Loop over fault vertices
   const int numVertices = _cohesiveVertices.size();
   for (int iVertex=0; iVertex < numVertices; ++iVertex) {
     const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
@@ -278,29 +269,45 @@
     _logger->eventBegin(restrictEvent);
 #endif
 
-    // Get slip at fault vertex.
-    slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+    // Get relative dislplacement at fault vertex.
+    assert(spaceDim == dispRelSection->getFiberDimension(v_fault));
+    const double* dispRelVertex = dispRelSection->restrictPoint(v_fault);
+    assert(dispRelVertex);
 
-    // Get orientations at fault vertex.
-    orientationSection->restrictPoint(v_fault, &orientationVertex[0],
-				      orientationVertex.size());
+    // Get area associated with fault vertex.
+    assert(1 == areaSection->getFiberDimension(v_fault));
+    assert(areaSection->restrictPoint(v_fault));
+    const double areaVertex = *areaSection->restrictPoint(v_fault);
 
     // 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());
+    assert(spaceDim == dispTSection->getFiberDimension(v_negative));
+    const double* dispTVertexN = dispTSection->restrictPoint(v_negative);
+    assert(dispTVertexN);
 
+    assert(spaceDim == dispTSection->getFiberDimension(v_positive));
+    const double* dispTVertexP = dispTSection->restrictPoint(v_positive);
+    assert(dispTVertexP);
+
+    assert(spaceDim == dispTSection->getFiberDimension(v_lagrange));
+    const double* dispTVertexL = dispTSection->restrictPoint(v_lagrange);
+    assert(dispTVertexL);
+
     // 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());
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_negative));
+    const double* dispTIncrVertexN = 
+      dispTIncrSection->restrictPoint(v_negative);
+    assert(dispTIncrVertexN);
 
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_positive));
+    const double* dispTIncrVertexP = 
+      dispTIncrSection->restrictPoint(v_positive);
+    assert(dispTIncrVertexP);
+
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_lagrange));
+    const double* dispTIncrVertexL = 
+      dispTIncrSection->restrictPoint(v_lagrange);
+    assert(dispTIncrVertexL);
+
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(restrictEvent);
     _logger->eventBegin(computeEvent);
@@ -308,33 +315,27 @@
 
     // Compute current estimate of displacement at time t+dt using
     // solution increment.
-    dispTpdtVertexN = dispTVertexN + dispTIncrVertexN;
-    dispTpdtVertexP = dispTVertexP + dispTIncrVertexP;
-    dispTpdtVertexL = dispTVertexL + dispTIncrVertexL;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      dispTpdtVertexN[iDim] = dispTVertexN[iDim] + dispTIncrVertexN[iDim];
+      dispTpdtVertexP[iDim] = dispTVertexP[iDim] + dispTIncrVertexP[iDim];
+      dispTpdtVertexL[iDim] = dispTVertexL[iDim] + dispTIncrVertexL[iDim];
+    } // for
 
-    // 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
+    residualVertexN = areaVertex * dispTpdtVertexL;
     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];
+    residualVertexL = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      residualVertexL[iDim] = -areaVertex * 
+	(dispTpdtVertexP[iDim] - dispTpdtVertexN[iDim] - dispRelVertex[iDim]);
+    } // for
 
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(computeEvent);
     _logger->eventBegin(updateEvent);
 #endif
 
+    // Assemble contributions into field
     assert(residualVertexN.size() == 
 	   residualSection->getFiberDimension(v_negative));
     residualSection->updateAddPoint(v_negative, &residualVertexN[0]);
@@ -351,7 +352,7 @@
     _logger->eventEnd(updateEvent);
 #endif
   } // for
-  PetscLogFlops(numVertices*spaceDim*spaceDim*8);
+  PetscLogFlops(numVertices*spaceDim*8);
 
 #if !defined(DETAILED_EVENT_LOGGING)
   _logger->eventEnd(computeEvent);
@@ -379,39 +380,37 @@
 
   _logger->eventBegin(setupEvent);
 
-  // Add constraint information to Jacobian matrix; these are the
-  // direction cosines. Entries are associated with vertices ik, jk,
-  // ki, and kj.
+  // Add constraint information to Jacobian matrix; Entries are
+  // associated with vertices ik, jk, ki, and kj.
 
-  // Get cell information and setup storage for cell data
+  // Get cell geometry information that doesn't depend on cell
   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>& areaSection = _fields->get("area").section();
+  assert(!areaSection.isNull());
 
-  const ALE::Obj<RealSection>& orientationSection =
-      _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
+  const ALE::Obj<RealSection>& solnSection = fields->solution().section();
+  assert(!solnSection.isNull());
 
+  // Get fault information
   const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
   assert(!sieveMesh.isNull());
   const ALE::Obj<SieveMesh::order_type>& globalOrder =
       sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
-        solutionSection);
+        solnSection);
   assert(!globalOrder.isNull());
 
+  // Allocate vectors for vertex values
+  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 sparse matrix
   const PetscMat jacobianMatrix = jacobian->matrix();
   assert(0 != jacobianMatrix);
 
@@ -435,55 +434,51 @@
     _logger->eventBegin(restrictEvent);
 #endif
 
-    // Get orientations at fault cell's vertices.
-    orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
+    // Get area associated with fault vertex.
+    assert(1 == areaSection->getFiberDimension(v_fault));
+    assert(areaSection->restrictPoint(v_fault));
+    const double areaVertex = *areaSection->restrictPoint(v_fault);
 
     // Set global order indices
     indicesL = indicesRel + globalOrder->getIndex(v_lagrange);
     indicesN = indicesRel + globalOrder->getIndex(v_negative);
     indicesP = indicesRel + globalOrder->getIndex(v_positive);
-    assert(0 == solutionSection->getConstraintDimension(v_negative));
-    assert(0 == solutionSection->getConstraintDimension(v_positive));
+    assert(0 == solnSection->getConstraintDimension(v_negative));
+    assert(0 == solnSection->getConstraintDimension(v_positive));
 
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(restrictEvent);
     _logger->eventBegin(updateEvent);
 #endif
 
-    // Values associated with [C]
+    // Set diagonal entries of Jacobian at positive vertex to area
+    // associated with vertex.
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      jacobianVertex[iDim*spaceDim+iDim] = areaVertex;
+
     // Values at positive vertex, entry L,P in Jacobian
-    jacobianVertex = orientationVertex;
     MatSetValues(jacobianMatrix,
                  indicesL.size(), &indicesL[0],
                  indicesP.size(), &indicesP[0],
                  &jacobianVertex[0],
                  ADD_VALUES);
 
-    // Values at negative vertex, entry L,N in Jacobian
-    jacobianVertex *= -1.0;
+    // Values at positive vertex, entry P,L in Jacobian
     MatSetValues(jacobianMatrix,
+                 indicesP.size(), &indicesP[0],
                  indicesL.size(), &indicesL[0],
-                 indicesN.size(), &indicesN[0],
                  &jacobianVertex[0],
                  ADD_VALUES);
 
-    // Values associated with [C]^T
-    // Transpose orientation matrix
-    jacobianVertex = 0.0;
-    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
+    // Values at negative vertex, entry L,N in Jacobian
+    jacobianVertex *= -1.0;
     MatSetValues(jacobianMatrix,
-                 indicesP.size(), &indicesP[0],
                  indicesL.size(), &indicesL[0],
+                 indicesN.size(), &indicesN[0],
                  &jacobianVertex[0],
                  ADD_VALUES);
 
-    // Values at negative vertex, entry L,N in Jacobian
-    jacobianVertex *= -1.0;
+    // Values at negative vertex, entry N,L in Jacobian
     MatSetValues(jacobianMatrix,
                  indicesN.size(), &indicesN[0],
                  indicesL.size(), &indicesL[0],
@@ -500,14 +495,13 @@
                  ADD_VALUES);
 
 #if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(spaceDim*spaceDim*2);
-    _logger->eventBegin(updateEvent);
+    _logger->eventEnd(updateEvent);
 #endif
 
   } // for
+  PetscLogFlops(numVertices*spaceDim*2);
 
 #if !defined(DETAILED_EVENT_LOGGING)
-  PetscLogFlops(numVertices*(spaceDim*spaceDim*2));
   _logger->eventEnd(computeEvent);
 #endif
 
@@ -517,7 +511,6 @@
   sieveMesh->getSendOverlap()->view("Send domain overlap");
   sieveMesh->getRecvOverlap()->view("Receive domain overlap");
 #endif
-
 } // integrateJacobian
 
 // ----------------------------------------------------------------------
@@ -571,12 +564,13 @@
     if (!globalOrder->isLocal(v_lagrange))
       continue;
 
-    assert(jacobianSection->getFiberDimension(v_lagrange) == spaceDim);
-
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventBegin(updateEvent);
 #endif
+
+    assert(jacobianSection->getFiberDimension(v_lagrange) == spaceDim);
     jacobianSection->updatePoint(v_lagrange, &jacobianVertex[0]);
+
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(updateEvent);
 #endif
@@ -605,44 +599,22 @@
   assert(0 != _fields);
   assert(0 != _logger);
 
-  /** We have J = [A C^T]
-   *              [C   0]
+  /** We have A = [K L^T]
+   *              [L   0]
    *
-   * We want to approximate -( C A^(-1) C^T )
+   * Compute Pmat = -( [L] [K]^(-1) [L]^T ) using the diagonal of K to
+   * approximate [K]^(-1).
    *
-   * Consider Lagrange vertex L that constrains the relative
-   * displacement between vertex N on the negative side of the fault
-   * and vertex P on the positive side of the fault.
+   * Decompose [K] into [Kn] and [Kp], where [Kn] contains the terms
+   * for vertices on the negative side of the fault and [Kp] contains
+   * the terms for vertices on the positive side of the fault.
    *
-   * If we approximate A(-1) by 1/diag(A), then we can write 
-   * C A^(-1) C^T for a 2-D case as
+   * Pmat = L_{ik} (1.0/Kn_{kk} + 1.0/Kp{kk}) L_{ik}
    *
-   * [-R00 -R01  R00 R01][Ai_nx 0      0     0    ][-R00 -R10]
-   * [-R10 -R11  R10 R11][      Ai_ny  0     0    ][-R01 -R11]
-   *                     [      0      Ai_px 0    ][ R00  R10]
-   *                     [                   Ai_py][ R01  R11]
-   *
-   * where
-   *
-   * Ai_nx is the inverse of the diag(A) for DOF x of vertex N
-   * Ai_ny is the inverse of the diag(A) for DOF y of vertex N
-   * Ai_px is the inverse of the diag(A) for DOF x of vertex P
-   * Ai_py is the inverse of the diag(A) for DOF y of vertex P
-   *
-   * If Ai_nx == Ai_ny and Ai_px == Ai_py, then the result is
-   * diagonal. Otherwise, the off-diagonal terms will be nonzero,
-   * but we expect them to be small. Since we already approximate
-   * the inverse of A by the inverse of the diagonal, we drop the
-   * off-diagonal terms of C A^(-1) C^T:
-   *
-   * Term for DOF x of vertex L is: 
-   * -(R00^2 (Ai_nx + Ai_px) + R01^2 (Ai_ny + Ai_py))
-   *
-   * Term for DOF y of vertex L is: 
-   * -(R10^2 (Ai_nx + Ai_px) + R11^2 (Ai_ny + Ai_py))
+   * Because we use quadrature points located at the vertices,
+   * L_{ii} = area, L_{ij} = 0 if i != j
    */
 
-#if 1 // DIAGONAL PRECONDITIONER
   const int setupEvent = _logger->eventId("FaPr setup");
   const int computeEvent = _logger->eventId("FaPr compute");
   const int restrictEvent = _logger->eventId("FaPr restrict");
@@ -652,10 +624,8 @@
 
   // 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 jacobianVertexP(spaceDim*spaceDim);
   double_array jacobianVertexN(spaceDim*spaceDim);
   double_array jacobianInvVertexP(spaceDim);
@@ -668,13 +638,12 @@
     indicesRel[i] = i;
 
   // Get sections
+  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+  assert(!areaSection.isNull());
+
   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 =
@@ -711,10 +680,12 @@
 #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 area associated with fault vertex.
+    assert(1 == areaSection->getFiberDimension(v_fault));
+    assert(areaSection->restrictPoint(v_fault));
+    const double areaVertex = *areaSection->restrictPoint(v_fault);
+
     indicesN = 
       indicesRel + indicesMatToSubmat[globalOrder->getIndex(v_negative)];
     err = MatGetValues(jacobianNP,
@@ -739,18 +710,13 @@
       jacobianInvVertexP[iDim] = 1.0/jacobianVertexP[iDim*spaceDim+iDim];
     } // for
 
-    // Compute -[C] [Adiag]^(-1) [C]^T
-    //   C_{ij}          = orientationVertex[i*spaceDim+j]
-    //   C^T_{ij}        = orientationVertex[j*spaceDim+i]
+    // Compute -[L] [Adiag]^(-1) [L]^T
+    //   L_{ii} = L^T{ii} = areaVertex
     //   Adiag^{-1}_{ii} = jacobianInvVertexN[i] + jacobianInvVertexP[i]
-    //  \sum_{j} C_{ij} Adiag^{-1}_{jj} C^T_{ji}
     precondVertexL = 0.0;
-    for (int kDim=0; kDim < spaceDim; ++kDim) {
-      for (int iDim=0; iDim < spaceDim; ++iDim)
-	precondVertexL[kDim] -= 
-          orientationVertex[kDim*spaceDim+iDim] * 
-          orientationVertex[kDim*spaceDim+iDim] * 
-          (jacobianInvVertexN[iDim] + jacobianInvVertexP[iDim]);
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      precondVertexL[iDim] -= areaVertex * areaVertex * 
+	(jacobianInvVertexN[iDim] + jacobianInvVertexP[iDim]);
     } // for
     
 
@@ -759,7 +725,8 @@
     _logger->eventBegin(updateEvent);
 #endif
 
-    // Set global preconditioner index associated with Lagrange constraint vertex.
+    // Set global preconditioner index associated with Lagrange
+    // constraint vertex.
     const int indexLprecond = lagrangeGlobalOrder->getIndex(v_lagrange);
     
     // Set diagonal entries in preconditioned matrix.
@@ -769,371 +736,25 @@
 		  indexLprecond + iDim,
 		  precondVertexL[iDim],
 		  INSERT_VALUES);
+
+#if 0 // DEBUGGING
+    std::cout << "1/P_vertex " << *v_lagrange << std::endl;
+    for(int iDim = 0; iDim < spaceDim; ++iDim) {
+      std::cout << "  " << precondVertexL[iDim] << std::endl;
+    } // for
+#endif
+
     
 #if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(spaceDim*spaceDim*4);
     _logger->eventEnd(updateEvent);
 #endif
   } // for
   err = MatDestroy(&jacobianNP); CHECK_PETSC_ERROR(err);
+  PetscLogFlops(numVertices*spaceDim*6);
 
-
-#else // FULL PRECONDITIONER
-
-  // Compute -( [C] [A]^(-1) [C]^T ) for cell.
-  //
-  // numBasis = number of corners in fault cell
-  // spaceDim = spatial dimension
-  //
-  // For the cell, [A] is 2*numBasis*spaceDim x 2*numBasis*spaceDim,
-  // [C] is numBasis*spaceDim x 2*numBasis*spaceDim
-  //
-  // Decompose [A] into [An] and [Ap], where [An] contains the terms
-  // for vertices on the negative side of the fault and [Ap] contains
-  // the terms for vertices on the positive side of the fault.
-  //
-  // [An] and [Ap] are numBasis*spaceDim x numBasis*spaceDim
-  // 
-  // Let [CAC] = [C] [A]^(-1) [C]^T.
-  //
-  // CAiC_kl = Cij Ai_jk C_lk
-  //
-  // Cij: iLagrange, iDim, jBasis, jDim
-  // Ai_jk: jBasis, jDim, kBasis, kDim
-  // C_lk: lLagrange, lDim, kBasis, kDim
-  
-
-  const int setupEvent = _logger->eventId("FaPr setup");
-  const int computeEvent = _logger->eventId("FaPr compute");
-  const int restrictEvent = _logger->eventId("FaPr restrict");
-  const int updateEvent = _logger->eventId("FaPr update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Get cell information and setup storage for cell data
-  const int spaceDim = _quadrature->spaceDim();
-  const int numBasis = _quadrature->numBasis();
-  const int orientationSize = spaceDim * spaceDim;
-  const int nrowsF = numBasis*spaceDim; // number of rows/cols in fault matrix
-
-  // Size of fault preconditioner matrix for cell
-  const int matrixSizeF = nrowsF * nrowsF;
-  PetscBLASInt workSize = 6*nrowsF;
-
-  // Allocate vectors for vertex values
-  double_array preconditionerCell(matrixSizeF);
-  int_array indicesN(nrowsF);
-  int_array indicesP(nrowsF);
-  int_array indicesLagrange(nrowsF);
-  double_array jacobianCellP(matrixSizeF);
-  double_array jacobianCellN(matrixSizeF);
-  double_array jacobianInvCellP(matrixSizeF);
-  double_array jacobianInvCellN(matrixSizeF);
-  double_array UN(matrixSizeF);
-  double_array UP(matrixSizeF);
-  double_array VNt(matrixSizeF);
-  double_array VPt(matrixSizeF);
-  double_array singularValuesN(nrowsF);
-  double_array singularValuesP(nrowsF);
-  double_array work(workSize);
-
-  // Get sections
-  const ALE::Obj<RealSection>& solutionSection = fields->solution().section();
-  assert(!solutionSection.isNull());
-
-  double_array orientationCell(numBasis*orientationSize);
-  const ALE::Obj<RealSection>& orientationSection =
-      _fields->get("orientation").section();
-  assert(!orientationSection.isNull());
-  RestrictVisitor orientationVisitor(*orientationSection,
-				     orientationCell.size(), 
-				     &orientationCell[0]);
-
-  const int numConstraintVert = numBasis;
-  const int numCorners = 3 * numConstraintVert; // cohesive cell
-
-  // Get cohesive cells
-  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::order_type>& lagrangeGlobalOrder =
-      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "faultDefault",
-        solutionSection, spaceDim);
-  assert(!lagrangeGlobalOrder.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 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
-  IndicesVisitor jacobianVisitor(*solutionSection, *globalOrder,
-				 (int) pow(sieveMesh->getSieve()->getMaxConeSize(),
-					   sieveMesh->depth())*spaceDim);
-
-
-
-  const ALE::Obj<SieveMesh::sieve_type>& sieve = sieveMesh->getSieve();
-  assert(!sieve.isNull());
-  ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type> ncV(*sieve,
-      (size_t) pow(sieve->getMaxConeSize(), std::max(0, sieveMesh->depth())));
-
-
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
-  assert(!faultSieveMesh.isNull());
-  const ALE::Obj<SieveSubMesh::sieve_type>& faultSieve = faultSieveMesh->getSieve();
-  assert(!faultSieve.isNull());
-  ALE::ISieveVisitor::NConeRetriever<SieveSubMesh::sieve_type> fncV(*faultSieve,
-      (size_t) pow(faultSieve->getMaxConeSize(), std::max(0, faultSieveMesh->depth())));
-
-  _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) {
-    // Get cone for cohesive cell
-    ncV.clear();
-    ALE::ISieveTraversal<SieveMesh::sieve_type>::orientedClosure(*sieve,
-								 *c_iter, ncV);
-    const int coneSize = ncV.getSize();
-    assert(coneSize == numCorners);
-    const Mesh::point_type *cohesiveCone = ncV.getPoints();
-    assert(0 != cohesiveCone);
-
-    // Get cone for corresponding fault cell
-    const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-    fncV.clear();
-    ALE::ISieveTraversal<SieveMesh::sieve_type>::orientedClosure(*faultSieve,
-								 c_fault, fncV);
-    const int coneSizeFault = fncV.getSize();
-    assert(coneSizeFault == numBasis);
-    const Mesh::point_type *faultCone = fncV.getPoints();
-    assert(0 != faultCone);
-
-    jacobianCellP = 0.0;
-    jacobianCellN = 0.0;
-    preconditionerCell = 0.0;
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(restrictEvent);
-#endif
-
-    // Get indices
-    for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
-      // constraint vertex k
-      const int v_negative = cohesiveCone[0*numBasis+iBasis];
-      const int v_positive = cohesiveCone[1*numBasis+iBasis];
-      const int v_lagrange = cohesiveCone[2*numBasis+iBasis];
-      
-      for (int iDim=0, iB=iBasis*spaceDim; iDim < spaceDim; ++iDim) {
-	if (globalOrder->isLocal(v_negative))
-	  indicesN[iB+iDim] = globalOrder->getIndex(v_negative) + iDim;
-	else
-	  indicesN[iB+iDim] = -1;
-	if (globalOrder->isLocal(v_positive))
-	  indicesP[iB+iDim] = globalOrder->getIndex(v_positive) + iDim;
-	else
-	  indicesP[iB+iDim] = -1;
-	if (globalOrder->isLocal(v_lagrange))
-	  indicesLagrange[iB+iDim] = lagrangeGlobalOrder->getIndex(v_lagrange) + iDim;
-	else
-	  indicesLagrange[iB+iDim] = -1;
-
-	// Set matrix diagonal entries to 1.0 (used when vertex is not local).
-	jacobianCellN[iB+iDim] = 1.0;
-	jacobianCellP[iB+iDim] = 1.0;
-      } // for
-    } // for
-    
-    // Get values from Jacobian matrix.
-    PetscErrorCode err = 0;
-    err = MatGetValues(jacobianMatrix, 
-		       indicesN.size(), &indicesN[0],
-		       indicesN.size(), &indicesN[0],
-		       &jacobianCellN[0]);
-    CHECK_PETSC_ERROR_MSG(err, "Restrict from PETSc Mat failed.");
-    
-    err = MatGetValues(jacobianMatrix, 
-		       indicesP.size(), &indicesP[0],
-		       indicesP.size(), &indicesP[0],
-		       &jacobianCellP[0]);
-    CHECK_PETSC_ERROR_MSG(err, "Restrict from PETSc Mat failed.");
-   
-    // Get orientation at fault vertices.
-    orientationVisitor.clear();
-    faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
-
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(restrictEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    // Invert jacobianCellN and jacobianCellP, result goes in
-    // jacobianInvCellN and jacobianInvCellP if need separate place
-    // for result.
-    PetscBLASInt elemRows = nrowsF;
-    PetscScalar  one      = 1.0;
-    PetscBLASInt berr;
-
-#if 0
-    std::cout << "AN_cell " << *c_iter << std::endl;
-    for(int i = 0; i < nrowsF; ++i) {
-      for(int j = 0; j < nrowsF; ++j) {
-        std::cout << "  " << jacobianCellN[i*nrowsF+j];
-      }
-      std::cout << std::endl;
-    }
-#endif
-
-    // Transpose matrices so we can call LAPACK
-    for(int i = 0; i < nrowsF; ++i) {
-      for(int j = 0; j < i; ++j) {
-        PetscInt    k  = i*nrowsF+j;
-        PetscInt    kp = j*nrowsF+i;
-        PetscScalar tmp;
-        tmp               = jacobianCellN[k];
-        jacobianCellN[k]  = jacobianCellN[kp];
-        jacobianCellN[kp] = tmp;
-        tmp               = jacobianCellP[k];
-        jacobianCellP[k]  = jacobianCellP[kp];
-        jacobianCellP[kp] = tmp;
-      }
-    }
-    LAPACKgesvd_("A", "A", &elemRows, &elemRows, &jacobianCellN[0], &elemRows, &singularValuesN[0], &UN[0], &elemRows, &VNt[0], &elemRows, &work[0], &workSize, &berr);
-    CHECK_PETSC_ERROR_MSG(berr, "Inversion of negative-side element matrix failed.");
-    LAPACKgesvd_("A", "A", &elemRows, &elemRows, &jacobianCellP[0], &elemRows, &singularValuesP[0], &UP[0], &elemRows, &VPt[0], &elemRows, &work[0], &workSize, &berr);
-    CHECK_PETSC_ERROR_MSG(berr, "Inversion of positive-side element matrix failed.");
-
-#if 0
-    for(int i = 0; i < nrowsF; ++i) {
-      std::cout << "sigmaN["<<i<<"]: " << singularValuesN[i] << " sigmaP["<<i<<"]: " << singularValuesP[i] << std::endl;
-    }
-    std::cout << "UN_cell " << *c_iter << std::endl;
-    for(int i = 0; i < nrowsF; ++i) {
-      for(int j = 0; j < nrowsF; ++j) {
-        std::cout << "  " << UN[j*nrowsF+i];
-      }
-      std::cout << std::endl;
-    }
-    std::cout << "VNt_cell " << *c_iter << std::endl;
-    for(int i = 0; i < nrowsF; ++i) {
-      for(int j = 0; j < nrowsF; ++j) {
-        std::cout << "  " << VNt[j*nrowsF+i];
-      }
-      std::cout << std::endl;
-    }
-#endif
-
-    // Row scale Vt by the inverse of the singular values
-    for(int i = 0; i < nrowsF; ++i) {
-      const PetscReal invN = singularValuesN[i] > 1.0e-10 ? 1.0/singularValuesN[i] : 0.0;
-      const PetscReal invP = singularValuesP[i] > 1.0e-10 ? 1.0/singularValuesP[i] : 0.0;
-
-      for(int j = 0; j < nrowsF; ++j) {
-        VNt[j*nrowsF+i] *= invN;
-        VPt[j*nrowsF+i] *= invP;
-      }
-    }
-    BLASgemm_("N", "N", &elemRows, &elemRows, &elemRows, &one, &UN[0], &elemRows, &VNt[0], &elemRows, &one, &jacobianInvCellN[0], &elemRows);
-    BLASgemm_("N", "N", &elemRows, &elemRows, &elemRows, &one, &UP[0], &elemRows, &VPt[0], &elemRows, &one, &jacobianInvCellP[0], &elemRows);
-
-    // Transpose matrices from LAPACK
-    for(int i = 0; i < nrowsF; ++i) {
-      for(int j = 0; j < i; ++j) {
-        PetscInt    k  = i*nrowsF+j;
-        PetscInt    kp = j*nrowsF+i;
-        PetscScalar tmp;
-        tmp                  = jacobianInvCellN[k];
-        jacobianInvCellN[k]  = jacobianInvCellN[kp];
-        jacobianInvCellN[kp] = tmp;
-        tmp                  = jacobianInvCellP[k];
-        jacobianInvCellP[k]  = jacobianInvCellP[kp];
-        jacobianInvCellP[kp] = tmp;
-      }
-    }
-
-    // Combine Jacbian inverse terms with result in jacobianInvCellN
-    jacobianInvCellN += jacobianInvCellP;
-
-    for (int iLagrange=0; iLagrange < numBasis; ++iLagrange) {
-      // Exploit structure of C in matrix multiplication.
-      // C_ij Ai_jk C_lk - Structure of C means j == i;
-      const int jBasis = iLagrange;
-      
-      for (int lLagrange=0; lLagrange < numBasis; ++lLagrange) {
-	// Exploit structure of C in matrix multiplication.
-	// -C_ij Ai_jk C_lk - Structure of C means k == l;
-	const int kBasis = lLagrange;
-
-	for (int iDim=0; iDim < spaceDim; ++iDim) {
-	  const int iL = iLagrange*spaceDim + iDim;
-
-	  for (int lDim=0; lDim < spaceDim; ++lDim) {
-	    const int lL = lLagrange*spaceDim + lDim;
-
-	    for (int jDim=0; jDim < spaceDim; ++jDim) {
-	      const int jB = jBasis*spaceDim + jDim;
-
-	      for (int kDim=0; kDim < spaceDim; ++kDim) {
-		const int kB = kBasis*spaceDim + kDim;
-
-		preconditionerCell[iL*nrowsF+lL] -= 
-		  orientationCell[iLagrange*orientationSize+iDim*spaceDim+jDim] *
-		  jacobianInvCellN[jB*nrowsF+kB] *
-		  orientationCell[lLagrange*orientationSize+kDim*spaceDim+lDim];
-
-	      } // for
-	    } // for
-	  } // for
-	} // for
-      } // for
-    } // for
-
-#if 0
-    std::cout << "1/P_cell " << *c_iter << std::endl;
-    for(int i = 0; i < nrowsF; ++i) {
-      for(int j = 0; j < nrowsF; ++j) {
-        std::cout << "  " << preconditionerCell[i*nrowsF+j];
-      }
-      std::cout << std::endl;
-    }
-#endif
-
-#if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(computeEvent);
-    _logger->eventBegin(updateEvent);
 #endif
-
-    err = MatSetValues(*precondMatrix,
-                 indicesLagrange.size(), &indicesLagrange[0],
-                 indicesLagrange.size(), &indicesLagrange[0],
-                 &preconditionerCell[0],
-                 ADD_VALUES);
-    CHECK_PETSC_ERROR_MSG(err, "Setting values in fault preconditioner failed.");
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(updateEvent);
-#endif
-
-  } // for
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventEnd(computeEvent);
-#endif
-
-#endif
-
 } // calcPreconditioner
 
 // ----------------------------------------------------------------------
@@ -1144,28 +765,27 @@
                                                         const topology::Field<
 							topology::Mesh>& jacobian)
 { // adjustSolnLumped
-  /// Member prototype for _adjustSolnLumpedXD()
-  typedef void (pylith::faults::FaultCohesiveLagrange::*adjustSolnLumped_fn_type)
-    (double_array*, double_array*, double_array*,
-     const double_array&, const double_array&, 
-     const double_array&, const double_array&, 
-     const double_array&, const double_array&, 
-     const double_array&, const double_array&);
-
   assert(0 != fields);
   assert(0 != _quadrature);
 
-  // Cohesive cells with conventional vertices i and j, and constraint
-  // vertex k require 2 adjustments to the solution:
+  // Cohesive cells with conventional vertices N and P, and constraint
+  // vertex L 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 L: Compute increment in Lagrange multipliers
   //
+  //     d\vec{l}_p = \tensor{S}^{-1} \cdot (-\vec{r}_p^{*} + \tensor{L}_p 
+  //                   \cdot (d\vec{u}_{n+}^* - d\vec{u}_{n-}^*))
+  //     \tensor{S} = \tensor{L}_p \cdot 
+  //                   (\tensor{K}_{n+n+}{-1} + \tensor{K}_{n-n-})
+  //                   \cdot \tensor{L}_p^T
+  //
   //   * DOF i and j: Adjust displacement increment (solution) to create slip
   //     consistent with Lagrange multiplier constraints
-  //            du_i = +A_i^-1 C_ki^T dlk
-  //            du_j = -A_j^-1 C_kj^T dlk
+  //
+  //     d\vec{u}_{n+} = d\vec{u}_{n+}^{*} - \tensor{K}_{n+n+}^{-1} \cdot 
+  //                     \tensor{L}_p^T \cdot d\vec{l}_p
+  //     d\vec{u}_{n-} = d\vec{u}_{n-}^{*} + \tensor{K}_{n-n-}^{-1} \cdot 
+  //                     \tensor{L}_p^T \cdot d\vec{l}_p
 
   const int setupEvent = _logger->eventId("FaAS setup");
   const int geometryEvent = _logger->eventId("FaAS geometry");
@@ -1177,37 +797,21 @@
 
   // 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());
+  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+  assert(!areaSection.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();
   assert(!residualSection.isNull());
 
-  double_array dispTVertexN(spaceDim);
-  double_array dispTVertexP(spaceDim);
-  const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
-  assert(!dispTSection.isNull());
-
   double_array dispTIncrVertexN(spaceDim);
   double_array dispTIncrVertexP(spaceDim);
-  double_array lagrangeTIncrVertex(spaceDim);
+  double_array dispTIncrVertexL(spaceDim);
   const ALE::Obj<RealSection>& dispTIncrSection = fields->get(
     "dispIncr(t->t+dt)").section();
   assert(!dispTIncrSection.isNull());
@@ -1219,29 +823,10 @@
   const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
   assert(!sieveMesh.isNull());
   const ALE::Obj<SieveMesh::order_type>& globalOrder =
-    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", jacobianSection);
+    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", 
+					    jacobianSection);
   assert(!globalOrder.isNull());
 
-  adjustSolnLumped_fn_type adjustSolnLumpedFn;
-  switch (spaceDim) { // switch
-  case 1:
-    adjustSolnLumpedFn = 
-      &pylith::faults::FaultCohesiveLagrange::_adjustSolnLumped1D;
-    break;
-  case 2: 
-    adjustSolnLumpedFn = 
-      &pylith::faults::FaultCohesiveLagrange::_adjustSolnLumped2D;
-    break;
-  case 3:
-    adjustSolnLumpedFn = 
-      &pylith::faults::FaultCohesiveLagrange::_adjustSolnLumped3D;
-    break;
-  default :
-    assert(0);
-    throw std::logic_error("Unknown spatial dimension in "
-			   "FaultCohesiveLagrange::adjustSolnLumped.");
-  } // switch
-
   _logger->eventEnd(setupEvent);
 
 #if !defined(DETAILED_EVENT_LOGGING)
@@ -1263,44 +848,61 @@
     _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());
-    
+    assert(spaceDim == residualSection->getFiberDimension(v_lagrange));
+    const double* residualVertexL = residualSection->restrictPoint(v_lagrange);
+    assert(residualVertexL);
+
     // Get jacobian at cohesive cell's vertices.
-    jacobianSection->restrictPoint(v_negative, &jacobianVertexN[0], 
-				   jacobianVertexN.size());
-    jacobianSection->restrictPoint(v_positive, &jacobianVertexP[0], 
-				   jacobianVertexP.size());
+    assert(spaceDim == jacobianSection->getFiberDimension(v_negative));
+    const double* jacobianVertexN = jacobianSection->restrictPoint(v_negative);
+    assert(jacobianVertexN);
 
-    // Get disp(t) at cohesive cell's vertices.
-    dispTSection->restrictPoint(v_negative, &dispTVertexN[0],
-				dispTVertexN.size());
-    dispTSection->restrictPoint(v_positive, &dispTVertexP[0],
-				dispTVertexP.size());
+    assert(spaceDim == jacobianSection->getFiberDimension(v_positive));
+    const double* jacobianVertexP = jacobianSection->restrictPoint(v_positive);
+    assert(jacobianVertexP);
 
+    // Get area at fault vertex.
+    assert(1 == areaSection->getFiberDimension(v_fault));
+    assert(areaSection->restrictPoint(v_fault));
+    const double areaVertex = *areaSection->restrictPoint(v_fault);
+    assert(areaVertex > 0.0);
+
+    // Get dispIncr(t) at vertices.
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_negative));
+    dispTIncrSection->restrictPoint(v_negative, &dispTIncrVertexN[0],
+				    dispTIncrVertexN.size());
+
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_positive));
+    dispTIncrSection->restrictPoint(v_positive, &dispTIncrVertexP[0],
+				    dispTIncrVertexP.size());
+
+    assert(spaceDim == dispTIncrSection->getFiberDimension(v_lagrange));
+    dispTIncrSection->restrictPoint(v_lagrange, &dispTIncrVertexL[0],
+				    dispTIncrVertexL.size());
+
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(restrictEvent);
     _logger->eventBegin(computeEvent);
 #endif
 
-    CALL_MEMBER_FN(*this, 
-		   adjustSolnLumpedFn)(&lagrangeTIncrVertex, 
-				       &dispTIncrVertexN, &dispTIncrVertexP,
-				       slipVertex, orientationVertex, 
-				       dispTVertexN, dispTVertexP,
-				       residualVertexN, residualVertexP,
-				       jacobianVertexN, jacobianVertexP);
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      const double S = (1.0/jacobianVertexP[iDim] + 1.0/jacobianVertexN[iDim]) *
+	areaVertex * areaVertex;
+      dispTIncrVertexL[iDim] = 1.0/S * 
+	(-residualVertexL[iDim] +
+	 areaVertex * (dispTIncrVertexP[iDim] - dispTIncrVertexN[iDim]));
 
+      assert(jacobianVertexN[iDim] > 0.0);
+      dispTIncrVertexN[iDim] = 
+	+areaVertex / jacobianVertexN[iDim]*dispTIncrVertexL[iDim];
+
+      assert(jacobianVertexP[iDim] > 0.0);
+      dispTIncrVertexP[iDim] = 
+	-areaVertex / jacobianVertexP[iDim]*dispTIncrVertexL[iDim];
+
+    } // for
+
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(computeEvent);
     _logger->eventBegin(updateEvent);
@@ -1317,10 +919,10 @@
     dispTIncrAdjSection->updateAddPoint(v_positive, &dispTIncrVertexP[0]);
 
     // Set Lagrange multiplier value. Value from preliminary solve is
-    // bogus due to artificial diagonal entry of 1.0.
-    assert(lagrangeTIncrVertex.size() == 
+    // bogus due to artificial diagonal entry.
+    assert(dispTIncrVertexL.size() == 
 	   dispTIncrSection->getFiberDimension(v_lagrange));
-    dispTIncrSection->updatePoint(v_lagrange, &lagrangeTIncrVertex[0]);
+    dispTIncrSection->updatePoint(v_lagrange, &dispTIncrVertexL[0]);
 
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(updateEvent);
@@ -1349,6 +951,31 @@
     throw std::runtime_error(msg.str());
   } // if  
 
+  // Verify quadrature scheme is consistent with points collocated
+  // with verties. Expect basis functions to be 1.0 at one quadrature
+  // point and zero at all others.
+  const double_array basis = _quadrature->basis();
+  const int numBasis = _quadrature->numBasis();
+  const int numQuadPts = _quadrature->numQuadPts();
+  for (int iQuadPt=0; iQuadPt < numQuadPts; ++iQuadPt) {
+    int nonzero = 0;
+    const double tolerance = 1.0e-6;
+    for (int iBasis=0; iBasis < numBasis; ++iBasis) {
+      if (fabs(basis[iQuadPt*numBasis+iBasis]) > tolerance) 
+	++nonzero;
+    } // for
+    if (numBasis != numQuadPts || 1 != nonzero) {
+      std::ostringstream msg;
+      msg << "Quadrature scheme for fault " << label()
+	  << " is incompatible with fault implementation.\n"
+	  << "Expected quadrature points collocated with vertices, so that "
+	  << "basis functions are \n"
+	  << "1.0 at one quadrature point and zero at all other quadrature "
+	  << "points.";
+      throw std::runtime_error(msg.str());
+    } // if
+  } // for
+
   // check compatibility of mesh and quadrature scheme
   const int dimension = mesh.dimension() - 1;
   if (_quadrature->cellDim() != dimension) {
@@ -1582,8 +1209,9 @@
   // 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 topology::Field<topology::SubMesh>& dispRel = 
+    _fields->get("relative disp");
+  orientation.newSection(dispRel, orientationSize);
   const ALE::Obj<RealSection>& orientationSection = orientation.section();
   assert(!orientationSection.isNull());
   // Create subspaces for along-strike, up-dip, and normal directions
@@ -1824,8 +1452,9 @@
   // 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);
+  const topology::Field<topology::SubMesh>& dispRel = 
+    _fields->get("relative disp");
+  area.newSection(dispRel, 1);
   area.allocate();
   area.vectorFieldType(topology::FieldBase::SCALAR);
   area.zero();
@@ -1908,19 +1537,22 @@
   double_array tractionsVertex(spaceDim);
 
   // Get sections.
-  const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
-  assert(!areaSection.isNull());
   const ALE::Obj<RealSection>& dispTSection = dispT.section();
   assert(!dispTSection.isNull());
 
+  const ALE::Obj<RealSection>& orientationSection =
+    _fields->get("orientation").section();
+  assert(!orientationSection.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->cloneSection(slip);
+    const topology::Field<topology::SubMesh>& dispRel = 
+      _fields->get("relative disp");
+    tractions->cloneSection(dispRel);
 
     //logger.stagePop();
   } // if
@@ -1935,18 +1567,23 @@
     const int v_fault = _cohesiveVertices[iVertex].fault;
 
     assert(spaceDim == dispTSection->getFiberDimension(v_lagrange));
-    assert(spaceDim == 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 < spaceDim; ++i)
-      tractionsVertex[i] = dispTVertex[i] / areaVertex[0];
+    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+    const double* orientationVertex = 
+      orientationSection->restrictPoint(v_fault);
+    assert(orientationVertex);
 
-    assert(tractionsVertex.size() == tractionsSection->getFiberDimension(v_fault));
+    // Rotate from global coordinate system to fault (orientation)
+    tractionsVertex = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      for (int jDim=0; jDim < spaceDim; ++jDim)
+	tractionsVertex[iDim] += 
+	  orientationVertex[iDim*spaceDim+jDim] * dispTVertex[jDim];
+
+    assert(tractionsVertex.size() == 
+	   tractionsSection->getFiberDimension(v_fault));
     tractionsSection->updatePoint(v_fault, &tractionsVertex[0]);
   } // for
 
@@ -1958,6 +1595,112 @@
 } // _calcTractionsChange
 
 // ----------------------------------------------------------------------
+// Transform field from local (fault) coordinate system to
+// global coordinate system.
+void
+pylith::faults::FaultCohesiveLagrange::_faultToGlobal(topology::Field<topology::SubMesh>* field)
+{ // _faultToGlobal
+  assert(field);
+  assert(0 != _faultMesh);
+  assert(0 != _fields);
+
+  // Fiber dimension of vector field matches spatial dimension.
+  const int spaceDim = _quadrature->spaceDim();
+  double_array fieldVertexGlobal(spaceDim);
+
+  // Get sections.
+  const ALE::Obj<RealSection>& fieldSection = field->section();
+  assert(!fieldSection.isNull());
+
+  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_fault = _cohesiveVertices[iVertex].fault;
+
+    assert(spaceDim == fieldSection->getFiberDimension(v_fault));
+    const double* fieldVertexFault = fieldSection->restrictPoint(v_fault);
+    assert(fieldVertexFault);
+
+    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+    const double* orientationVertex = orientationSection->restrictPoint(v_fault);
+    assert(orientationVertex);
+
+    // Rotate from fault to global coordinate system (transpose orientation)
+    fieldVertexGlobal = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      for (int jDim=0; jDim < spaceDim; ++jDim)
+	fieldVertexGlobal[iDim] += 
+	  orientationVertex[jDim*spaceDim+iDim] * fieldVertexFault[jDim];
+
+    assert(fieldVertexGlobal.size() == 
+	   fieldSection->getFiberDimension(v_fault));
+    fieldSection->updatePoint(v_fault, &fieldVertexGlobal[0]);
+  } // for
+  
+  PetscLogFlops(numVertices * (2*spaceDim*spaceDim) );
+
+#if 0 // DEBUGGING
+  field->view("FIELD (GLOBAL)");
+#endif
+} // _faultToGlobal
+
+// ----------------------------------------------------------------------
+// Transform field from global coordinate system to local (fault)
+// coordinate system.
+void
+pylith::faults::FaultCohesiveLagrange::_globalToFault(topology::Field<topology::SubMesh>* field)
+{ // _globalToFault
+  assert(field);
+  assert(0 != _faultMesh);
+  assert(0 != _fields);
+
+  // Fiber dimension of vector field matches spatial dimension.
+  const int spaceDim = _quadrature->spaceDim();
+  double_array fieldVertexFault(spaceDim);
+
+  // Get sections.
+  const ALE::Obj<RealSection>& fieldSection = field->section();
+  assert(!fieldSection.isNull());
+
+  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_fault = _cohesiveVertices[iVertex].fault;
+
+    assert(spaceDim == fieldSection->getFiberDimension(v_fault));
+    const double* fieldVertexGlobal = fieldSection->restrictPoint(v_fault);
+    assert(fieldVertexGlobal);
+
+    assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+    const double* orientationVertex = orientationSection->restrictPoint(v_fault);
+    assert(orientationVertex);
+
+    // Rotate from global coordinate system to fault (orientation)
+    fieldVertexFault = 0.0;
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      for (int jDim=0; jDim < spaceDim; ++jDim)
+	fieldVertexFault[iDim] += 
+	  orientationVertex[iDim*spaceDim+jDim] * fieldVertexGlobal[jDim];
+
+    assert(fieldVertexFault.size() == 
+	   fieldSection->getFiberDimension(v_fault));
+    fieldSection->updatePoint(v_fault, &fieldVertexFault[0]);
+  } // for
+  
+  PetscLogFlops(numVertices * (2*spaceDim*spaceDim) );
+
+#if 0 // DEBUGGING
+  field->view("FIELD (FAULT)");
+#endif
+} // _faultToGlobal
+
+// ----------------------------------------------------------------------
 // Allocate buffer for vector field.
 void
 pylith::faults::FaultCohesiveLagrange::_allocateBufferVectorField(void)
@@ -1969,12 +1712,14 @@
   ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
   logger.stagePush("Output");
 
-  // Create vector field; use same shape/chart as slip field.
+  // Create vector field; use same shape/chart as relative
+  // displacement 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);
+  const topology::Field<topology::SubMesh>& dispRel = 
+    _fields->get("relative disp");
+  buffer.cloneSection(dispRel);
   buffer.zero();
   assert(buffer.vectorFieldType() == topology::FieldBase::VECTOR);
 
@@ -1997,8 +1742,15 @@
   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);
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+  assert(!faultSieveMesh.isNull());
+  const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+      faultSieveMesh->depthStratum(0);
+  assert(!vertices.isNull());
+  buffer.newSection(vertices, 1);
+  buffer.allocate();
+  buffer.vectorFieldType(topology::FieldBase::SCALAR);
+  buffer.scale(1.0);
   buffer.zero();
   assert(buffer.vectorFieldType() == topology::FieldBase::SCALAR);
 

Modified: short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveLagrange.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveLagrange.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/faults/FaultCohesiveLagrange.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -234,6 +234,20 @@
   void _calcTractionsChange(topology::Field<topology::SubMesh>* tractions,
           const topology::Field<topology::Mesh>& solution);
 
+  /** Transform field from local (fault) coordinate system to
+   * global coordinate system.
+   *
+   * @param field Field to transform.
+   */
+  void _faultToGlobal(topology::Field<topology::SubMesh>* field);
+
+  /** Transform field from global coordinate system to local (fault)
+   * coordinate system.
+   *
+   * @param field Field to transform.
+   */
+  void _globalToFault(topology::Field<topology::SubMesh>* field);
+
   /// Allocate buffer for vector field.
   void _allocateBufferVectorField(void);
 

Modified: short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/feassemble/ElasticityExplicit.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/feassemble/ElasticityExplicit.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/feassemble/ElasticityExplicit.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -691,7 +691,6 @@
   const int numBasis = _quadrature->numBasis();
   const int spaceDim = _quadrature->spaceDim();
   const int cellDim = _quadrature->cellDim();
-  const int tensorSize = _material->tensorSize();
   if (cellDim != spaceDim)
     throw std::logic_error("Don't know how to integrate elasticity " \
 			   "contribution to Jacobian matrix for cells with " \
@@ -851,7 +850,6 @@
   const int numBasis = _quadrature->numBasis();
   const int spaceDim = _quadrature->spaceDim();
   const int cellDim = _quadrature->cellDim();
-  const int tensorSize = _material->tensorSize();
   if (cellDim != spaceDim)
     throw std::logic_error("Don't know how to integrate elasticity " \
 			   "contribution to Jacobian matrix for cells with " \

Modified: short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/friction/FrictionModel.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/friction/FrictionModel.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/friction/FrictionModel.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -97,8 +97,7 @@
 void
 pylith::friction::FrictionModel::initialize(
 			const topology::SubMesh& faultMesh,
-			feassemble::Quadrature<topology::SubMesh>* quadrature,
-			const topology::Field<topology::SubMesh>& area)
+			feassemble::Quadrature<topology::SubMesh>* quadrature)
 { // initialize
   assert(0 != _dbProperties);
 

Modified: short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/friction/FrictionModel.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/friction/FrictionModel.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/friction/FrictionModel.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -116,12 +116,10 @@
    *
    * @param mesh Finite-element mesh of subdomain.
    * @param quadrature Quadrature for finite-element integration
-   * @param area Area at vertices of subdomain.
    */
   virtual
   void initialize(const topology::SubMesh& mesh,
-		  feassemble::Quadrature<topology::SubMesh>* quadrature,
-		  const topology::Field<topology::SubMesh>& area);
+		  feassemble::Quadrature<topology::SubMesh>* quadrature);
   
   /** Check whether friction model has a field as a property or state
    * variable.

Modified: short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/problems/SolverNonlinear.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/problems/SolverNonlinear.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/libsrc/pylith/problems/SolverNonlinear.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -361,7 +361,7 @@
 	ierr = PetscViewerASCIIPrintf(snes->ls_monitor,"    Line search: fnorm=%18.16e, gnorm=%18.16e, ynorm=%18.16e, minlambda=%18.16e, lambda=%18.16e, initial slope=%18.16e\n",(double)fnorm,(double)*gnorm,(double)*ynorm,(double)minlambda,(double)lambda,(double)initslope);CHKERRQ(ierr);
         ierr = PetscViewerASCIISubtractTab(snes->ls_monitor,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
       }
-      *flag = PETSC_FALSE; 
+      *flag = PETSC_FALSE; // DIVERGED_LINE_SEARCH
       break;
     }
     t1 = .5*((*gnorm)*(*gnorm) - fnorm*fnorm) - lambda*initslope;

Modified: short/3D/PyLith/branches/v1.6-stable/modulesrc/friction/FrictionModel.i
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/modulesrc/friction/FrictionModel.i	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/modulesrc/friction/FrictionModel.i	2011-10-17 22:23:48 UTC (rev 19086)
@@ -95,12 +95,10 @@
        *
        * @param mesh Finite-element mesh of subdomain.
        * @param quadrature Quadrature for finite-element integration
-       * @param area Area at vertices of subdomain.
        */
       virtual
       void initialize(const pylith::topology::SubMesh& mesh,
-		      pylith::feassemble::Quadrature<pylith::topology::SubMesh>* quadrature,
-		      const pylith::topology::Field<pylith::topology::SubMesh>& area);
+		      pylith::feassemble::Quadrature<pylith::topology::SubMesh>* quadrature);
   
       /** Check whether friction model has a field as a property or
        * state variable.

Modified: short/3D/PyLith/branches/v1.6-stable/playpen/faultpc/checkfaultpc.py
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/playpen/faultpc/checkfaultpc.py	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/playpen/faultpc/checkfaultpc.py	2011-10-17 22:23:48 UTC (rev 19086)
@@ -3,7 +3,7 @@
 import numpy
 import numpy.linalg as linalg
 
-A = numpy.array([[4/3.0, -0.5, 1/6.0, 0,   0,0,0,0],
+K = numpy.array([[4/3.0, -0.5, 1/6.0, 0,   0,0,0,0],
                  [-0.5, 4/3.0, 0, -5/6.0,  0,0,0,0],
                  [1/6.0, 0, 4/3.0, 0.5,    0,0,0,0],
                  [0, -5/6.0, 0.5, 4/3.0,   0,0,0,0],
@@ -12,47 +12,79 @@
                  [0,0,0,0, 1/6.0, 0, 4/3.0, -0.5],
                  [0,0,0,0, 0, -5/6.0, -0.5, 4/3.0]],
                 dtype=numpy.float64)
-Ai = linalg.inv(A)
+Ki = linalg.inv(K)
 
-C = numpy.array([[0,-1,  0,0,  0,1, 0,0],
-                 [-1,0,  0,0,  1,0, 0,0],
-                 [0,0,  0,-1,  0,0, 0,1],
-                 [0,0, -1,0,   0,0, 1,0]],
+# Gauss quadrature
+L = numpy.array([[-2/3.0,0.0, -1/3.0,0.0,  +2/3.0,0.0, +1/3.0,0.0],
+                 [0.0,-2/3.0, 0.0,-1/3.0,  0.0,+2/3.0, 0.0,+1/3.0],
+                 [-1/3.0,0.0, -2/3.0,0.0,  +1/3.0,0.0, +2/3.0,0.0],
+                 [0.0,-1/3.0, 0.0,-2/3.0,  0.0,+1/3.0, 0.0,+2/3.0]],
                 dtype=numpy.float64)
+
+# Collocated vertices and quadrature
+Lc = numpy.array([[-1.0,0.0, 0.0,0.0,  +1.0,0.0, 0.0,0.0],
+                  [0.0,-1.0, 0.0,0.0,  0.0,+1.0, 0.0,0.0],
+                  [0.0,0.0, -1.0,0.0,  0.0,0.0, +1.0,0.0],
+                  [0.0,0.0, 0.0,-1.0,  0.0,0.0, 0.0,+1.0]],
+                  dtype=numpy.float64)
+
 Z = numpy.zeros( (4,4), dtype=numpy.float64)
 
-J = numpy.vstack( (numpy.hstack( (A, C.transpose()) ),
-                   numpy.hstack( (C, Z) ) ) )
-Jinv = linalg.inv(J)
+A = numpy.vstack( (numpy.hstack( (K, L.transpose()) ),
+                   numpy.hstack( (L, Z) ) ) )
+Ainv = linalg.inv(A)
 
-# Compute [C] [A]^(-1) [C]^T and its inverse.
-CAC = numpy.dot(numpy.dot(C, Ai), C.transpose())
-CACi = numpy.linalg.inv(CAC)
+Ac = numpy.vstack( (numpy.hstack( (K, Lc.transpose()) ),
+                     numpy.hstack( (Lc, Z) ) ) )
+Acinv = linalg.inv(Ac)
 
-# Compute diagonal approximation of CAC and its inverse
-Aid = 1.0 / A.diagonal() * numpy.identity(A.shape[0])
-CACd = numpy.dot(numpy.dot(C, Aid), C.transpose())
-CACdi = 1.0 / CACd.diagonal() * numpy.identity(CACd.shape[0])
+# Compute [L] [K]^(-1) [L]^T and its inverse.
+LKiL = numpy.dot(numpy.dot(L, Ki), L.transpose())
+LKiLi = numpy.linalg.inv(LKiL)
 
+LKiLc = numpy.dot(numpy.dot(Lc, Ki), Lc.transpose())
+LKiLic = numpy.linalg.inv(LKiLc)
+
+# Compute diagonal approximation of LKiL and its inverse
+Kid = 1.0 / K.diagonal() * numpy.identity(K.shape[0])
+LKidL = numpy.dot(numpy.dot(L, Kid), L.transpose())
+LKidLd = LKidL.diagonal() * numpy.identity(LKidL.shape[0])
+
+LKidLc = numpy.dot(numpy.dot(Lc, Kid), Lc.transpose())
+LKidLdc = LKidLc.diagonal() * numpy.identity(LKidLc.shape[0])
+
 # Compute preconditioner using full matrices (no approximations)
-P = J
+P = A
 Pi = numpy.linalg.inv(P)
 
 # Compute condition number
-evals, evecs = numpy.linalg.eig(numpy.dot(J, Pi))
+evals, evecs = numpy.linalg.eig(numpy.dot(Pi, A))
 print numpy.abs(evals)
 print numpy.max(numpy.abs(evals))/numpy.min(numpy.abs(evals))
 
-# Compute preconditioner using diagonal approximations (but full A)
-Pd = numpy.zeros(J.shape)
-Pd[0:8,0:8] = A
+# Compute preconditioner using diagonal approximations for K
+Pd = numpy.zeros(A.shape)
+Pd[0:8,0:8] = K
 Pd[0:8,8:12] = 0.0
 Pd[8:12,0:8] = 0.0
-Pd[8:12,8:12] = -CACd
+Pd[8:12,8:12] = -LKidL
+print LKidL
 
-Pdi = numpy.linalg.inv(Pd)
+# Compute preconditioner using diagonal approximations for K
+Pdc = numpy.zeros(Ac.shape)
+Pdc[0:8,0:8] = K
+Pdc[0:8,8:12] = 0.0
+Pdc[8:12,0:8] = 0.0
+Pdc[8:12,8:12] = -LKidLc
+print LKidLc
 
 # Compute condition number for diagonal approximations
-evals, evecs = numpy.linalg.eig(numpy.dot(Pdi, J))
+Pdi = numpy.linalg.inv(Pd)
+evals, evecs = numpy.linalg.eig(numpy.dot(Pdi, A))
 print numpy.abs(evals)
 print numpy.max(numpy.abs(evals))/numpy.min(numpy.abs(evals))
+
+Pdci = numpy.linalg.inv(Pdc)
+evals, evecs = numpy.linalg.eig(numpy.dot(Pdci, Ac))
+print numpy.abs(evals)
+print numpy.max(numpy.abs(evals))/numpy.min(numpy.abs(evals))

Modified: short/3D/PyLith/branches/v1.6-stable/playpen/faultpc/notes.tex
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/playpen/faultpc/notes.tex	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/playpen/faultpc/notes.tex	2011-10-17 22:23:48 UTC (rev 19086)
@@ -35,57 +35,58 @@
 
 We have a Jacobian of the form
 \begin{equation}
-  J = \left( \begin{array}{cc}
-    A & C^T \\
-    C & 0
+  A = \left( \begin{array}{cc}
+    K & L^T \\
+    L & 0
   \end{array} \right).
 \end{equation}
-We use the Schur complement of block A to examine the form of $J^{-1}$,
+We use the Schur complement of block K to examine the form of $A^{-1}$,
 \begin{equation}
-  J^{-1} = \left( \begin{array}{cc}
-    A^{-1}+A^{-1} C^{T}(-C A^{-1} C^{T})^{-1} C A^{-1} & 
-    -A^{-1}C^{T}(-C A^{-1} C^{T})^{-1} \\
-    -(-C A^{-1} C^{T})^{-1} C A^{-1} & -(C A^{-1} C^T)^{-1}
+  A^{-1} = \left( \begin{array}{cc}
+    K^{-1}+K^{-1} L^{T}(-L K^{-1} L^{T})^{-1} L K^{-1} & 
+    -K^{-1}L^{T}(-L K^{-1} L^{T})^{-1} \\
+    -(-L K^{-1} L^{T})^{-1} L K^{-1} & -(L K^{-1} L^T)^{-1}
   \end{array} \right),
 \end{equation}
-A suitable block diagonal $P^{-1}$ is
+A suitable block diagonal approximation of $A^{-1}$ is
 \begin{equation}
   P^{-1} = \left( \begin{array}{cc}
-    A^{-1} & 0 \\
-    0 & -(C A^{-1} C^T)^{-1}
+    K^{-1} & 0 \\
+    0 & -(L K^{-1} L^T)^{-1}
   \end{array} \right),
 \end{equation}
 which leads to
 \begin{equation}
   P = \left( \begin{array}{cc}
-    A & 0 \\
-    0 & C A^{-1} C^T
+    K & 0 \\
+    0 & L K^{-1} L^T
   \end{array} \right).
 \end{equation}
 
-We provide PETSc with $P$ so that it can create $P^{-1}$. Using the
-field split preconditioner, we form
+We provide PETSc with preconditioning matrix $P$ so that it can create
+$P^{-1}$. Using the field split preconditioner, we form
 \begin{equation}
   P = \left( \begin{array}{cc}
-    A_\mathit{ml} & 0 \\
+    K_\mathit{ml} & 0 \\
     0 & P_f
   \end{array} \right),
 \end{equation}
-where we use the ML package to form $A_\mathit{ml}$ and we create a
-custom matrix for the portion of the preconditioner associated with
+where we use the ML package to form $K_\mathit{ml}$ and we create a
+custom matrix for the portion of the preconditioning matrix associated with
 the Lagrange constraints, $P_f$. Let $n$ be the number of conventional
 degrees of freedom and $l$ be the number of Lagrange constraints. This
-means $A$ and $P$ are $(n+l) \times (n+l)$, $A$ and $A_\mathit{ml}$
-are $n \times n$, $C$ is $l \times n$, and $P_f$ is $l \times l$.
-We let $P_f$ be the the diagonal approximation of $C A^{-1} C^T$,
+means $K$ and $P$ are $(n+l) \times (n+l)$, $K$ and $K_\mathit{ml}$
+are $n \times n$, $L$ is $l \times n$, and $P_f$ is $l \times l$.
+
+We let $P_f$ be the the diagonal approximation of $L K^{-1} L^T$,
 \begin{equation}
-  P_f = \text{diagonal}(C A_\mathit{diag}^{-1} C^T).
+  P_f = \text{diagonal}(L K_\mathit{diag}^{-1} L^T).
 \end{equation}
 Using the {\tt multiplicative} field split type, PETSc will form
 $P^{-1}$ as
 \begin{equation}
   P^{-1} = \left( \begin{array}{cc}
-    A_\mathit{ml}^{-1} & -A_\mathit{ml}^{-1} C^T ?? \\
+    K_\mathit{ml}^{-1} & -K_\mathit{ml}^{-1} L^T ?? \\
     0 & P_f^{-1}
   \end{array} \right).
 \end{equation}

Modified: short/3D/PyLith/branches/v1.6-stable/pylith/faults/FaultCohesive.py
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/pylith/faults/FaultCohesive.py	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/pylith/faults/FaultCohesive.py	2011-10-17 22:23:48 UTC (rev 19086)
@@ -92,6 +92,10 @@
     # TEMPORARY
     ModuleFaultCohesive.faultMeshFilename(self, 
                                           self.inventory.meshFilename)
+
+    # Hardwire collocated quadrature
+    self.faultQuadrature.cell.collocateQuad = True
+    self.faultQuadrature.cell.order = self.faultQuadrature.cell.degree
     return
 
   

Modified: short/3D/PyLith/branches/v1.6-stable/pylith/faults/FaultCohesiveKin.py
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/pylith/faults/FaultCohesiveKin.py	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/pylith/faults/FaultCohesiveKin.py	2011-10-17 22:23:48 UTC (rev 19086)
@@ -73,7 +73,6 @@
   output = pyre.inventory.facility("output", family="output_manager",
                                    factory=OutputFaultKin)
   output.meta['tip'] = "Output manager associated with fault data."
-  
 
   # PUBLIC METHODS /////////////////////////////////////////////////////
 

Modified: short/3D/PyLith/branches/v1.6-stable/tests/2d/faultstrip/dynamic_timeweakening.cfg
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/2d/faultstrip/dynamic_timeweakening.cfg	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/2d/faultstrip/dynamic_timeweakening.cfg	2011-10-17 22:23:48 UTC (rev 19086)
@@ -8,6 +8,7 @@
 
 # Use slip-weakening friction
 friction = pylith.friction.TimeWeakening
+friction.label = Time weakening
 
 friction.db_properties = spatialdata.spatialdb.UniformDB
 friction.db_properties.label = Time weakening

Modified: short/3D/PyLith/branches/v1.6-stable/tests/2d/faultstrip/pylithapp.cfg
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/2d/faultstrip/pylithapp.cfg	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/2d/faultstrip/pylithapp.cfg	2011-10-17 22:23:48 UTC (rev 19086)
@@ -46,10 +46,6 @@
 normalizer = spatialdata.units.NondimElasticDynamic
 normalizer.shear_wave_speed = 1.0*km/s
 
-bc = [y_pos,y_neg]
-interfaces = [fault]
-materials = [elastic]
-
 [pylithapp.timedependent.formulation.time_step]
 total_time = 10.0*s
 dt = 0.05*s
@@ -57,6 +53,9 @@
 # ----------------------------------------------------------------------
 # materials
 # ----------------------------------------------------------------------
+[pylithapp.timedependent]
+materials = [elastic]
+
 [pylithapp.timedependent.materials]
 elastic = pylith.materials.ElasticPlaneStrain
 
@@ -75,6 +74,9 @@
 # ----------------------------------------------------------------------
 # boundary conditions
 # ----------------------------------------------------------------------
+[pylithapp.timedependent]
+bc = [y_pos,y_neg]
+
 [pylithapp.timedependent.bc.y_pos]
 label = face_ypos
 bc_dof = [0, 1]
@@ -86,6 +88,9 @@
 # ----------------------------------------------------------------------
 # faults
 # ----------------------------------------------------------------------
+[pylithapp.timedependent]
+interfaces = [fault]
+
 [pylithapp.timedependent.interfaces]
 fault = pylith.faults.FaultCohesiveDyn
 

Modified: short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/plot_friction.py
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/plot_friction.py	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/plot_friction.py	2011-10-17 22:23:48 UTC (rev 19086)
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
-sim = "ratestate_stable"
+sim = "ratestate_weak"
 
 # ======================================================================
 import tables
@@ -10,7 +10,7 @@
 
 # ----------------------------------------------------------------------
 dt = 0.01
-t = numpy.arange(0.0, 12.001, dt)
+t = numpy.arange(0.0, 14.001, dt)
 mu0 = 0.6
 if sim == "ratestate_stable":
     a = 0.016
@@ -31,25 +31,33 @@
     return
 
 
-theta = L/V0*numpy.ones(t.shape)
 
 mask1 = t < 2.0
 V1 = 1.0e-6
+theta = L/V1*numpy.ones(t.shape)
 integrateStateVar(theta, V1, 0.0)
 
 mask2 = numpy.bitwise_and(t >= 2.0, t < 4.0)
-V2 = 2.0e-5
+V2 = 1.0e-5
 integrateStateVar(theta, V2, 2.0)
 
-mask3 = numpy.bitwise_and(t >= 4.0, t < 8.0)
-V3 = 5.0e-6
+mask3 = numpy.bitwise_and(t >= 4.0, t < 6.0)
+V3 = 4.0e-6
 integrateStateVar(theta, V3, 4.0)
 
-mask4 = numpy.bitwise_and(t >= 8.0, t < 12.0)
-V4 = 1.0e-7
-integrateStateVar(theta, V4, 8.0)
+mask4 = numpy.bitwise_and(t >= 6.0, t < 8.0)
+V4 = 2.0e-5
+integrateStateVar(theta, V4, 6.0)
 
-slipRateE = mask1*V1 + mask2*V2 + mask3*V3 + mask4*V4
+mask5 = numpy.bitwise_and(t >= 8.0, t < 12.0)
+V5 = 5.0e-6
+integrateStateVar(theta, V5, 8.0)
+
+mask6 = t >= 12.0
+V6 = 1.0e-6
+integrateStateVar(theta, V6, 12.0)
+
+slipRateE = mask1*V1 + mask2*V2 + mask3*V3 + mask4*V4 + mask5*V5 + mask6*V6
 stateVarE = theta
 
 muE = mu0 + a*numpy.log(slipRateE/V0) + b*numpy.log(V0*stateVarE/L)
@@ -69,7 +77,7 @@
 p = 2
 
 ax = pylab.subplot(1, 4, 1)
-ax.plot(time, slip[:,p,0])
+ax.plot(time, slip[:,p,0], 'r--')
 
 ax = pylab.subplot(1, 4, 2)
 ax.plot(t, numpy.log10(numpy.abs(slipRateE)), 'b-',

Modified: short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/pylithapp.cfg
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/pylithapp.cfg	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/pylithapp.cfg	2011-10-17 22:23:48 UTC (rev 19086)
@@ -40,14 +40,14 @@
 
 normalizer = spatialdata.units.NondimElasticQuasistatic
 normalizer.length_scale = 1.0*m
-normalizer.relaxation_time = 1.0*s
+normalizer.relaxation_time = 0.1*s
 
 [pylithapp.timedependent.implicit]
 solver = pylith.problems.SolverNonlinear
 
 [pylithapp.timedependent.implicit.time_step]
-total_time = 12.0*s
-dt = 0.1*s
+total_time = 14.0*s
+dt = 0.05*s
 
 # ----------------------------------------------------------------------
 # materials
@@ -111,11 +111,12 @@
 snes_max_it = 500
 
 snes_monitor = true
+snes_ls_monitor = true
 #snes_view = true
 snes_converged_reason = true
 
 #log_summary = true
-info =
+#info =
 
 # ----------------------------------------------------------------------
 # output

Modified: short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension.cfg
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension.cfg	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension.cfg	2011-10-17 22:23:48 UTC (rev 19086)
@@ -10,7 +10,7 @@
 normalizer.length_scale = 1.0*mm
 
 [pylithapp.timedependent.implicit.time_step]
-total_time = 4.0*s
+total_time = 5.0*s
 dt = 1.0*s
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension_axial.timedb
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension_axial.timedb	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension_axial.timedb	2011-10-17 22:23:48 UTC (rev 19086)
@@ -1,6 +1,6 @@
 #TIME HISTORY ascii
 TimeHistory {
-  num-points = 5
+  num-points = 6
   time-units = second
 }
  0.0  -5.0
@@ -8,3 +8,4 @@
  2.0  +7.0
  3.0  +9.0
  4.0  -5.0
+ 5.0  -5.0

Modified: short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension_shear.timedb
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension_shear.timedb	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/tension_shear.timedb	2011-10-17 22:23:48 UTC (rev 19086)
@@ -1,6 +1,6 @@
 #TIME HISTORY ascii
 TimeHistory {
-  num-points = 5
+  num-points = 6
   time-units = second
 }
  0.0  +8.0
@@ -8,3 +8,4 @@
  2.0  +4.0
  3.0  +4.0
  4.0  +4.0
+ 5.0  +5.0

Modified: short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/velocitysteps.timedb
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/velocitysteps.timedb	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/2d/frictionslide/velocitysteps.timedb	2011-10-17 22:23:48 UTC (rev 19086)
@@ -5,8 +5,8 @@
 }
  0.0  0.0
  2.0  2.0e-6 // slip rate = 1.0e-6
- 4.0  4.2e-5 // slip rate = 2.0e-5
- 8.0  6.2e-05 // slip rate = 5.0e-6
-12.0  6.28e-05 // slip rate = 2.0e-7
-16.0  6.244e-05 // slip rate = 1.0e-8
-99.9  6.244e-05 // slip rate = 0
+ 4.0  2.2e-5 // slip rate = 1.0e-5
+ 6.0  3.0e-05 // slip rate = 4.0e-6
+ 8.0  7.0e-05 // slip rate = 2.0e-5
+12.0  9.0e-05 // slip rate = 5.0e-6
+22.0  1.0e-04 // slip rate = 1.0e-6

Modified: short/3D/PyLith/branches/v1.6-stable/tests/2d/slipdir/pylithapp.cfg
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/2d/slipdir/pylithapp.cfg	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/2d/slipdir/pylithapp.cfg	2011-10-17 22:23:48 UTC (rev 19086)
@@ -29,11 +29,6 @@
 [pylithapp.timedependent]
 dimension = 2
 
-bc = [boundary]
-interfaces = [fault]
-
-materials = [elastic]
-
 [pylithapp.timedependent.formulation.time_step]
 total_time = 0.0*s
 dt = 1.0*s
@@ -41,14 +36,17 @@
 # ----------------------------------------------------------------------
 # materials
 # ----------------------------------------------------------------------
+[pylithapp.timedependent]
+materials = [elastic]
+
 [pylithapp.timedependent.materials]
 elastic = pylith.materials.ElasticPlaneStrain
 
 [pylithapp.timedependent.materials.elastic]
-
 label = Elastic material
 id = 1
 
+db_properties.label = Elastic properties
 db_properties.iohandler.filename = matprops.spatialdb
 
 quadrature.cell = pylith.feassemble.FIATLagrange
@@ -58,6 +56,9 @@
 # ----------------------------------------------------------------------
 # boundary conditions
 # ----------------------------------------------------------------------
+[pylithapp.timedependent]
+bc = [boundary]
+
 [pylithapp.timedependent.bc.boundary]
 
 bc_dof = [0,1]
@@ -66,6 +67,9 @@
 # ----------------------------------------------------------------------
 # faults
 # ----------------------------------------------------------------------
+[pylithapp.timedependent]
+interfaces = [fault]
+
 [pylithapp.timedependent.interfaces.fault]
 
 id = 100
@@ -79,7 +83,10 @@
 
 [pylithapp.timedependent.interfaces.fault.eq_srcs.rupture.slip_function]
 
+slip.label = Final slip
 slip.iohandler.filename = slip.spatialdb
+
+slip_time.label = Slip time
 slip_time.iohandler.filename = sliptime.spatialdb
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/v1.6-stable/tests/3d/Makefile.am
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/3d/Makefile.am	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/3d/Makefile.am	2011-10-17 22:23:48 UTC (rev 19086)
@@ -17,8 +17,10 @@
 #
 
 SUBDIRS = \
+	cyclicfriction \
 	matprops \
 	plasticity \
 	slipdir
 
+
 # End of file 

Copied: short/3D/PyLith/branches/v1.6-stable/tests/3d/cyclicfriction (from rev 19085, short/3D/PyLith/branches/v1.6-revisedfault/tests/3d/cyclicfriction)

Modified: short/3D/PyLith/branches/v1.6-stable/tests/3d/slipdir/pylithapp.cfg
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests/3d/slipdir/pylithapp.cfg	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests/3d/slipdir/pylithapp.cfg	2011-10-17 22:23:48 UTC (rev 19086)
@@ -20,19 +20,12 @@
 [pylithapp.mesh_generator]
 reader = pylith.meshio.MeshIOCubit
 
-[pylithapp.mesh_generator.reader]
-
 # ----------------------------------------------------------------------
 # problem
 # ----------------------------------------------------------------------
 [pylithapp.timedependent]
 dimension = 3
 
-bc = [boundary]
-interfaces = [fault]
-
-materials = [elastic]
-
 [pylithapp.timedependent.formulation.time_step]
 total_time = 0.0*s
 dt = 1.0*year
@@ -40,6 +33,9 @@
 # ----------------------------------------------------------------------
 # materials
 # ----------------------------------------------------------------------
+[pylithapp.timedependent]
+materials = [elastic]
+
 [pylithapp.timedependent.materials]
 elastic = pylith.materials.ElasticIsotropic3D
 
@@ -48,6 +44,7 @@
 label = Elastic material
 id = 1
 
+db_properties.label = Elastic properties
 db_properties.iohandler.filename = matprops.spatialdb
 
 quadrature.cell = pylith.feassemble.FIATSimplex
@@ -56,14 +53,20 @@
 # ----------------------------------------------------------------------
 # boundary conditions
 # ----------------------------------------------------------------------
+[pylithapp.timedependent]
+bc = [boundary]
+
 [pylithapp.timedependent.bc.boundary]
 
-bc_dof = [0,2]
+bc_dof = [0,1,2]
 label = boundary_nofault
 
 # ----------------------------------------------------------------------
 # faults
 # ----------------------------------------------------------------------
+[pylithapp.timedependent]
+interfaces = [fault]
+
 [pylithapp.timedependent.interfaces.fault]
 
 id = 100
@@ -71,12 +74,16 @@
 
 quadrature.cell = pylith.feassemble.FIATSimplex
 quadrature.cell.shape = triangle
+quadrature.cell.quad_order = 2
 
 eq_srcs.rupture.slip_function = pylith.faults.StepSlipFn
 
 [pylithapp.timedependent.interfaces.fault.eq_srcs.rupture.slip_function]
 
+slip.label = Final slip
 slip.iohandler.filename = slip.spatialdb
+
+slip_time.label = Slip time
 slip_time.iohandler.filename = sliptime.spatialdb
 
 # ----------------------------------------------------------------------
@@ -84,20 +91,39 @@
 # ----------------------------------------------------------------------
 [pylithapp.petsc]
 ksp_type = gmres
-pc_type = asm
 
-sub_pc_factor_shift_type = nonzero
-
 ksp_rtol = 1.0e-8
 ksp_atol = 1.0e-10
-ksp_max_it = 50
-ksp_gmres_restart = 25
+ksp_max_it = 100
+ksp_gmres_restart = 100
 
 ksp_monitor = true
 #ksp_view = true
 #log_summary = true
 
+[pylithapp.timedependent.formulation]
+split_fields = True
+matrix_type = aij
 
+[pylithapp.petsc]
+ksp_gmres_restart = 500
+fs_pc_type = fieldsplit
+fs_pc_fieldsplit_real_diagonal = 
+fs_pc_fieldsplit_type = multiplicative
+fs_fieldsplit_0_pc_type = ml
+fs_fieldsplit_1_pc_type = ml
+fs_fieldsplit_2_pc_type = ml
+fs_fieldsplit_3_pc_type = ml
+fs_fieldsplit_0_ksp_type = preonly
+fs_fieldsplit_1_ksp_type = preonly
+fs_fieldsplit_2_ksp_type = preonly
+fs_fieldsplit_3_ksp_type = preonly
+
+[pylithapp.timedependent.formulation]
+use_custom_constraint_pc = True
+
+
+
 # ----------------------------------------------------------------------
 # output
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/v1.6-stable/tests_auto/2d/quad4/friction_shear_stick.cfg
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/tests_auto/2d/quad4/friction_shear_stick.cfg	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/tests_auto/2d/quad4/friction_shear_stick.cfg	2011-10-17 22:23:48 UTC (rev 19086)
@@ -66,7 +66,6 @@
 db_properties.label = Elastic properties
 db_properties.iohandler.filename = matprops.spatialdb
 
-# Set cell type to quadrilateral (2-d Lagrange).
 quadrature.cell = pylith.feassemble.FIATLagrange
 quadrature.cell.dimension = 2
 
@@ -120,34 +119,19 @@
 # ----------------------------------------------------------------------
 # faults
 # ----------------------------------------------------------------------
-# Provide information on the fault (interface).
 [friction_shear_stick.timedependent.interfaces]
 
 fault = pylith.faults.FaultCohesiveDyn
 
 # Define fault properties.
 [friction_shear_stick.timedependent.interfaces.fault]
-
-# The nodes associated with this fault have the name 'fault' in the mesh file.
 label = 10
 
-# NOTE: It is possible to assign an ID number to a fault (e.g.,
-# 'id = 10').  Care must be taken when doing this, however, because the
-# assigned ID will become the material ID for the cohesive element.
-# This ID must not conflict with any of the material ID numbers for
-# volume elements.  The default ID for a fault is 100.  If you have a
-# fault in your mesh you must:
-# 1.  If you create your own fault ID, make sure it does not conflict
-#     with any of you material ID's.
-# 2.  If you use the default fault ID, make sure that none of your
-#     material ID's are equal to 100.
-
-# The quadrature for a 2D fault is 1D with a linear shape.
 quadrature.cell = pylith.feassemble.FIATLagrange
 quadrature.cell.dimension = 1
 
 db_initial_tractions = spatialdata.spatialdb.UniformDB
-db_initial_tractions.label = "Initial fault tractions"
+db_initial_tractions.label = Initial fault tractions
 db_initial_tractions.values = [traction-shear,traction-normal]
 db_initial_tractions.data = [0.0*Pa, -10.0*MPa]
 
@@ -163,7 +147,6 @@
 [friction_shear_stick.petsc]
 pc_type = asm
 
-# Change the preconditioner settings.
 sub_pc_factor_shift_type = nonzero
 
 ksp_rtol = 1.0e-8

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveDyn.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveDyn.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveDyn.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -155,46 +155,28 @@
     } // 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 forces/tractions
+  // Initial tractions
   if (0 != fault._dbInitialTract) {
-    //fault._fields->get("initial forces").view("INITIAL FORCES"); // DEBUGGING
-    const ALE::Obj<RealSection>& forcesInitialSection = 
-      fault._fields->get("initial forces").section();
-    CPPUNIT_ASSERT(!forcesInitialSection.isNull());
+    //fault._fields->get("initial traction").view("INITIAL TRACTIONS"); // DEBUGGING
+    const ALE::Obj<RealSection>& initialTractionsSection = 
+      fault._fields->get("initial traction").section();
+    CPPUNIT_ASSERT(!initialTractionsSection.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 = forcesInitialSection->getFiberDimension(*v_iter);
+      const int fiberDim = initialTractionsSection->getFiberDimension(*v_iter);
       CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
-      const double* forcesInitialVertex = 
-	forcesInitialSection->restrictPoint(*v_iter);
-      CPPUNIT_ASSERT(0 != forcesInitialVertex);
+      const double* initialTractionsVertex = 
+	initialTractionsSection->restrictPoint(*v_iter);
+      CPPUNIT_ASSERT(initialTractionsVertex);
 
       const double tolerance = 1.0e-06;
       for (int i = 0; i < spaceDim; ++i) {
         const int index = iVertex * spaceDim + i;
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->forcesInitial[index], 
-				     forcesInitialVertex[i], tolerance);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->initialTractions[index], 
+				     initialTractionsVertex[i], tolerance);
       } // for
     } // for
   } // if
@@ -270,8 +252,6 @@
     // 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());
@@ -280,7 +260,7 @@
 
     // Get section containing slip
     const ALE::Obj<RealSection>& slipSection =
-      fault._fields->get("slip").section();
+      fault.vertexField("slip").section();
     CPPUNIT_ASSERT(!slipSection.isNull());
 
     const double valE = 0.0; // slip should be zero
@@ -327,36 +307,38 @@
   fault.timeStep(dt);
   fault.constrainSolnSpace(&fields, t, jacobian);
 
-  //residual.view("RESIDUAL"); // DEBUGGING
+  { // Check slip values
+    // Slip values should be adjusted based on the change in the
+    // Lagrange multipliers as reflected in the slipSlipE data member.
 
-  { // 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);
+    // Get fault vertex info
+    const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+    CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+    const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+      faultSieveMesh->depthStratum(0);
     CPPUNIT_ASSERT(!vertices.isNull());
-    const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
-    const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+    const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
+    const SieveSubMesh::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 section containing slip
+    const ALE::Obj<RealSection>& slipSection =
+      fault.vertexField("slip").section();
+    CPPUNIT_ASSERT(!slipSection.isNull());
 
+    //slipSection->view("SLIP"); // DEBUGGING
+
     // Get expected values
-    const double* valsE = _data->fieldIncrSlipE; // Expected values for dispIncr
+    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 all vertices in mesh
+    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 = dispIncrSection->getFiberDimension(*v_iter);
+      const int fiberDim = slipSection->getFiberDimension(*v_iter);
       CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
-      const double* vals = dispIncrSection->restrictPoint(*v_iter);
+      const double* vals = slipSection->restrictPoint(*v_iter);
       CPPUNIT_ASSERT(0 != vals);
 
       // Check values at point
@@ -364,51 +346,47 @@
         const int index = iVertex * spaceDim + i;
         const double valE = valsE[index];
 #if 0 // DEBUGGING
-	std::cout << "SOLUTION valE: " << valE
+	std::cout << "SLIP valE: " << valE
 		  << ", val: " << vals[i]
 		  << ", error: " << fabs(1.0-vals[i]/valE)
 		  << std::endl;
 #endif // DEBUGGING
-	if (fabs(valE) > tolerance)
+        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
 
-  { // 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);
+  { // 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 SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
-    const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+    const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
+    const SieveMesh::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 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->slipSlipE;
+    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 fault vertices
+    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 = slipSection->getFiberDimension(*v_iter);
+      const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
       CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
-      const double* vals = slipSection->restrictPoint(*v_iter);
+      const double* vals = dispIncrSection->restrictPoint(*v_iter);
       CPPUNIT_ASSERT(0 != vals);
 
       // Check values at point
@@ -416,18 +394,18 @@
         const int index = iVertex * spaceDim + i;
         const double valE = valsE[index];
 #if 0 // DEBUGGING
-	std::cout << "SLIP valE: " << valE
+	std::cout << "SOLUTION valE: " << valE
 		  << ", val: " << vals[i]
 		  << ", error: " << fabs(1.0-vals[i]/valE)
 		  << std::endl;
 #endif // DEBUGGING
-        if (fabs(valE) > tolerance)
+	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
+  } // Check solution values
 
 } // testConstrainSolnSpaceSlip
 
@@ -508,8 +486,6 @@
     // 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());
@@ -518,7 +494,7 @@
 
     // Get section containing slip
     const ALE::Obj<RealSection>& slipSection =
-      fault._fields->get("slip").section();
+      fault.vertexField("slip").section();
     CPPUNIT_ASSERT(!slipSection.isNull());
 
     // Get expected values
@@ -647,22 +623,27 @@
     int fiberDim = tractionsSection->getFiberDimension(*v_iter);
     CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
     const double* tractionsVertex = tractionsSection->restrictPoint(*v_iter);
-    CPPUNIT_ASSERT(0 != tractionsVertex);
+    CPPUNIT_ASSERT(tractionsVertex);
 
-    fiberDim = dispSection->getFiberDimension(meshVertex);
-    CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
-    const double* dispVertex = dispSection->restrictPoint(meshVertex);
-    CPPUNIT_ASSERT(0 != dispVertex);
+    const double* tractionsVertexGlobalE = 
+      dispSection->restrictPoint(meshVertex);
+    CPPUNIT_ASSERT(tractionsVertexGlobalE);
+    const double* orientationVertex = 
+      &_data->orientation[iVertex*spaceDim*spaceDim];
+    CPPUNIT_ASSERT(orientationVertex);
 
-    const double scale = 1.0 / _data->area[iVertex];
     for (int iDim=0; iDim < spaceDim; ++iDim) {
-      const double tractionE = dispVertex[iDim] * scale;
+      double tractionE = 0.0;
+      for (int jDim=0; jDim < spaceDim; ++jDim) {
+	tractionE += 
+	  orientationVertex[iDim*spaceDim+jDim]*tractionsVertexGlobalE[jDim];
+      } // for
       if (tractionE != 0.0)
         CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, tractionsVertex[iDim]/tractionE,
 				     tolerance);
       else
         CPPUNIT_ASSERT_DOUBLES_EQUAL(tractionE, tractionsVertex[iDim],
-             tolerance);
+				     tolerance);
     } // for
   } // for
 } // testCalcTractions
@@ -756,6 +737,8 @@
   disp.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
   disp.allocate();
   fields->copyLayout("disp(t)");
+
+  fault->verifyConfiguration(*mesh);
 } // _initialize
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKin.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKin.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKin.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -143,6 +143,8 @@
 void
 pylith::faults::TestFaultCohesiveKin::testInitialize(void)
 { // testInitialize
+  CPPUNIT_ASSERT(_data);
+
   topology::Mesh mesh;
   FaultCohesiveKin fault;
   topology::SolutionFields fields(mesh);
@@ -248,6 +250,11 @@
 void
 pylith::faults::TestFaultCohesiveKin::testIntegrateResidual(void)
 { // testIntegrateResidual
+  CPPUNIT_ASSERT(_data);
+  CPPUNIT_ASSERT(_data->fieldT);
+  CPPUNIT_ASSERT(_data->residual);
+  CPPUNIT_ASSERT(_data->residualIncr);
+
   topology::Mesh mesh;
   FaultCohesiveKin fault;
   topology::SolutionFields fields(mesh);
@@ -344,6 +351,10 @@
 void
 pylith::faults::TestFaultCohesiveKin::testIntegrateJacobian(void)
 { // testIntegrateJacobian
+  CPPUNIT_ASSERT(_data);
+  CPPUNIT_ASSERT(_data->fieldT);
+  CPPUNIT_ASSERT(_data->jacobian);
+
   topology::Mesh mesh;
   FaultCohesiveKin fault;
   topology::SolutionFields fields(mesh);
@@ -427,6 +438,9 @@
 void
 pylith::faults::TestFaultCohesiveKin::testIntegrateJacobianLumped(void)
 { // testIntegrateJacobianLumped
+  CPPUNIT_ASSERT(_data);
+  CPPUNIT_ASSERT(_data->jacobianLumped);
+
   topology::Mesh mesh;
   FaultCohesiveKin fault;
   topology::SolutionFields fields(mesh);
@@ -443,51 +457,69 @@
   CPPUNIT_ASSERT_EQUAL(false, fault.needNewJacobian());
   jacobian.complete();
 
-  // jacobian.view("JACOBIAN"); // DEBUGGING
+  //jacobian.view("JACOBIAN"); // DEBUGGING
 
   const ALE::Obj<RealSection>& jacobianSection = jacobian.section();
   CPPUNIT_ASSERT(!jacobianSection.isNull());
 
+  // Only check Lagrange multiplier values
+
   int iVertex = 0;
   const double tolerance = 1.0e-06;
   const int spaceDim = _data->spaceDim;
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
-  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+
+  const ALE::Obj<SieveSubMesh>& sieveMesh = mesh.sieveMesh();
+  CPPUNIT_ASSERT(!sieveMesh.isNull());
   const ALE::Obj<SieveMesh::label_sequence>& vertices =
-    faultSieveMesh->depthStratum(0);
+    sieveMesh->depthStratum(0);
   CPPUNIT_ASSERT(!vertices.isNull());
-  const SieveSubMesh::label_sequence::iterator verticesBegin = 
-    vertices->begin();
-  const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+  const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
+  const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
   SieveSubMesh::renumbering_type& renumbering = 
     faultSieveMesh->getRenumbering();
   const SieveMesh::renumbering_type::const_iterator renumberingBegin = 
     renumbering.begin();
   const SieveMesh::renumbering_type::const_iterator renumberingEnd = 
     renumbering.end();
+
   for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
        v_iter != verticesEnd;
        ++v_iter, ++iVertex) {
-    SieveMesh::point_type meshVertex = -1;
     bool found = false;
 
     for (SieveMesh::renumbering_type::const_iterator r_iter = renumberingBegin;
 	 r_iter != renumberingEnd;
 	 ++r_iter) {
-      if (r_iter->second == *v_iter) {
-        meshVertex = r_iter->first;
+      if (r_iter->first == *v_iter) {
         found = true;
         break;
       } // if
     } // for
+    if (!found) // only check Lagrange multiplier values
+      continue;
+
     CPPUNIT_ASSERT(found);
-    int fiberDim = jacobianSection->getFiberDimension(meshVertex);
+    int fiberDim = jacobianSection->getFiberDimension(*v_iter);
     CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
-    const double* jacobianVertex = jacobianSection->restrictPoint(meshVertex);
-    CPPUNIT_ASSERT(0 != jacobianVertex);
-    for (int iDim=0; iDim < spaceDim; ++iDim)
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, jacobianVertex[iDim],
-				   tolerance);
+    const double* vals = jacobianSection->restrictPoint(*v_iter);
+    CPPUNIT_ASSERT(0 != vals);
+    
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      const double valE = _data->jacobianLumped[iVertex*spaceDim+iDim];
+#if 0 // debugging
+      std::cout << "vertex: " << *v_iter << ", iDim: " << iDim
+		<< ", valE: " << valE
+		<< ", val: " << vals[iDim]
+		<< std::endl;
+#endif
+      if (fabs(valE) > 1.0)
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[iDim]/valE, tolerance);
+      else
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[iDim], tolerance);
+    } // for
   } // for
 } // testIntegrateJacobianLumped
 
@@ -496,6 +528,12 @@
 void
 pylith::faults::TestFaultCohesiveKin::testAdjustSolnLumped(void)
 { // testAdjustSolnLumped
+  CPPUNIT_ASSERT(_data);
+  CPPUNIT_ASSERT(_data->fieldT);
+  CPPUNIT_ASSERT(_data->fieldIncr);
+  CPPUNIT_ASSERT(_data->fieldIncrAdjusted);
+  CPPUNIT_ASSERT(_data->jacobianLumped);
+
   topology::Mesh mesh;
   FaultCohesiveKin fault;
   topology::SolutionFields fields(mesh);
@@ -570,7 +608,7 @@
   CPPUNIT_ASSERT(!solutionSection.isNull());
 
   int i = 0;
-  const double tolerance = 1.0e-06;
+  const double tolerance = 2.0e-06;
   const double* solutionE = _data->fieldIncrAdjusted;
   for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
        v_iter != verticesEnd;
@@ -579,124 +617,25 @@
     CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
     const double* solutionVertex = solutionSection->restrictPoint(*v_iter);
     CPPUNIT_ASSERT(0 != solutionVertex);
-    for (int iDim=0; iDim < spaceDim; ++iDim, ++i)
+    for (int iDim=0; iDim < spaceDim; ++iDim, ++i) {
       if (0.0 != solutionE[i])
         CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, solutionVertex[iDim]/solutionE[i],
           tolerance);
       else
         CPPUNIT_ASSERT_DOUBLES_EQUAL(solutionE[i], solutionVertex[iDim],
 				     tolerance);
+    } // for
   } // for
 } // testAdjustSolnLumped
 
 // ----------------------------------------------------------------------
-// Test updateStateVars().
-void
-pylith::faults::TestFaultCohesiveKin::testUpdateStateVars(void)
-{ // testUpdateStateVars
-  topology::Mesh mesh;
-  FaultCohesiveKin fault;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &fault, &fields);
-
-  const int spaceDim = _data->spaceDim;
-  const ALE::Obj<RealSection>& dispSection = fields.get("disp(t)").section();
-  CPPUNIT_ASSERT(!dispSection.isNull());
-  { // setup disp
-    dispSection->zero();
-    
-    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();
-    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]);
-  } // setup disp
-  topology::Field<topology::Mesh>& residual = fields.get("residual");
-
-  const double t = 2.134;
-  const double dt = 0.01;
-  fault.useSolnIncr(false);
-  fault.timeStep(dt);
-  fault.integrateResidual(residual, t, &fields);
-  fault.updateStateVars(t, &fields);
-
-  CPPUNIT_ASSERT(0 != fault._faultMesh);
-  const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
-  CPPUNIT_ASSERT(!faultSieveMesh.isNull());
-  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();
-  SieveSubMesh::renumbering_type& renumbering = faultSieveMesh->getRenumbering();
-
-  // Compute expected slip using eqsrcs
-  topology::Field<topology::SubMesh> slipE(*fault._faultMesh);
-  slipE.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
-  slipE.allocate();
-  const ALE::Obj<RealSection> slipESection = slipE.section();
-  CPPUNIT_ASSERT(!slipESection.isNull());
-
-  const ALE::Obj<RealSection> slipSection =
-    fault._fields->get("slip").section();
-  CPPUNIT_ASSERT(!slipSection.isNull());
-
-  const FaultCohesiveKin::srcs_type::const_iterator srcsEnd = fault._eqSrcs.end();
-  for (FaultCohesiveKin::srcs_type::iterator s_iter=fault._eqSrcs.begin(); 
-       s_iter != srcsEnd; 
-       ++s_iter) {
-    EqKinSrc* src = s_iter->second;
-    assert(0 != src);
-    if (t >= src->originTime())
-      src->slip(&slipE, t);
-  } // for
-
-  int iVertex = 0;
-  const double tolerance = 1.0e-06;
-  for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
-       v_iter != verticesEnd;
-       ++v_iter, ++iVertex) {
-    const SieveSubMesh::point_type meshVertex = _data->verticesLagrange[iVertex];
-    bool found = false;
-    for(SieveSubMesh::renumbering_type::const_iterator r_iter = renumbering.begin();
-	r_iter != renumbering.end();
-	++r_iter) {
-      if (r_iter->second == *v_iter) {
-        found = true;
-        break;
-      } // if
-    } // for
-    CPPUNIT_ASSERT(found);
-
-    // Check _slip
-    int fiberDim = slipSection->getFiberDimension(*v_iter);
-    CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
-    const double* slipV = slipSection->restrictPoint(*v_iter);
-    CPPUNIT_ASSERT(0 != slipV);
-
-    const double* slipE = slipESection->restrictPoint(*v_iter);
-    CPPUNIT_ASSERT(0 != slipE);
-
-    for (int iDim=0; iDim < spaceDim; ++iDim) {
-      if (slipE[iDim] > 1.0) 
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, slipV[iDim]/slipE[iDim], tolerance);
-      else
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(slipE[iDim], slipV[iDim], tolerance);
-    } // for
-  } // for
-} // testUpdateStateVars
-
-// ----------------------------------------------------------------------
 // Test calcTractionsChange().
 void
 pylith::faults::TestFaultCohesiveKin::testCalcTractionsChange(void)
 { // testCalcTractionsChange
+  CPPUNIT_ASSERT(_data);
+  CPPUNIT_ASSERT(_data->fieldT);
+
   topology::Mesh mesh;
   FaultCohesiveKin fault;
   topology::SolutionFields fields(mesh);
@@ -775,9 +714,20 @@
     const double* dispVertex = dispSection->restrictPoint(meshVertex);
     CPPUNIT_ASSERT(0 != dispVertex);
 
-    const double scale = 1.0 / _data->area[iVertex];
+    const double* orientationVertex = 
+      &_data->orientation[iVertex*spaceDim*spaceDim];
+
     for (int iDim=0; iDim < spaceDim; ++iDim) {
-      const double tractionE = dispVertex[iDim] * scale;
+      double tractionE = 0.0;
+      for (int jDim=0; jDim < spaceDim; ++jDim)
+	tractionE += orientationVertex[iDim*spaceDim+jDim] * dispVertex[jDim];
+#if 0 // DEBUGGING
+      std::cout << "vertex: " << *v_iter
+		<< ", iDim: " << iDim
+		<< ", tractionE: " << tractionE
+		<< ", traction: " << tractionsVertex[iDim]
+		<< std::endl;
+#endif
       if (tractionE > 1.0) 
 	CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, tractionsVertex[iDim]/tractionE,
 				     tolerance);
@@ -793,7 +743,7 @@
 void
 pylith::faults::TestFaultCohesiveKin::testSplitField(void)
 { // testSplitField
-  assert(0 != _data);
+  CPPUNIT_ASSERT(_data);
 
   topology::Mesh mesh;
   FaultCohesiveKin fault;
@@ -950,6 +900,8 @@
   residual.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
   residual.allocate();
   fields->copyLayout("residual");
+
+  fault->verifyConfiguration(*mesh);
 } // _initialize
 
 // ----------------------------------------------------------------------
@@ -957,7 +909,7 @@
 bool
 pylith::faults::TestFaultCohesiveKin::_isLagrangeVertex(const int vertex) const
 { // _isLagrangeVertex
-  assert(0 != _data);
+  CPPUNIT_ASSERT(_data);
 
   const int numFaultVertices = _data->numFaultVertices;
   bool isFound = false;

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKin.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKin.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKin.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -107,9 +107,6 @@
   /// Test adjustSolnLumped().
   void testAdjustSolnLumped(void);
 
-  /// Test updateStateVars().
-  void testUpdateStateVars(void);
-
   /// Test _calcTractionsChange().
   void testCalcTractionsChange(void);
 

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinHex8.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinHex8.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinHex8.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -48,7 +48,6 @@
   CPPUNIT_TEST( testIntegrateJacobian );
   CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testAdjustSolnLumped );
-  CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );
 

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinLine2.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinLine2.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinLine2.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -48,7 +48,6 @@
   CPPUNIT_TEST( testIntegrateJacobian );
   CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testAdjustSolnLumped );
-  CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );
 

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinQuad4.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinQuad4.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinQuad4.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -48,7 +48,6 @@
   CPPUNIT_TEST( testIntegrateJacobian );
   CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testAdjustSolnLumped );
-  CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );
 

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinQuad4e.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinQuad4e.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinQuad4e.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -47,7 +47,6 @@
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
   CPPUNIT_TEST( testIntegrateJacobianLumped );
-  CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );
 

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -48,7 +48,6 @@
   CPPUNIT_TEST( testIntegrateJacobian );
   CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testAdjustSolnLumped );
-  CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );
 

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4e.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4e.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4e.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -47,7 +47,6 @@
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
   CPPUNIT_TEST( testIntegrateJacobianLumped );
-  CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );
 

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4f.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4f.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTet4f.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -47,7 +47,6 @@
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
   CPPUNIT_TEST( testIntegrateJacobianLumped );
-  CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );
 

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTri3.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTri3.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTri3.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -48,7 +48,6 @@
   CPPUNIT_TEST( testIntegrateJacobian );
   CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testAdjustSolnLumped );
-  CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );
 

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTri3d.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTri3d.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/TestFaultCohesiveKinTri3d.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -47,7 +47,6 @@
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
   CPPUNIT_TEST( testIntegrateJacobianLumped );
-  CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );
 

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynData.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynData.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynData.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -40,7 +40,7 @@
   fieldIncrOpen(0),
   jacobian(0),
   orientation(0),
-  forcesInitial(0),
+  initialTractions(0),
   area(0),
   fieldIncrSlipE(0),
   slipSlipE(0),

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynData.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynData.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynData.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -75,7 +75,7 @@
   //@{
   double* orientation; ///< Expected values for fault orientation.
   double* area; ///< Expected values for fault area.
-  double* forcesInitial; ///< Expected values for initial forces.
+  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.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataHex8.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataHex8.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataHex8.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -49,10 +49,10 @@
 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,
+  -1.0, -1.0,
+  +1.0, -1.0,
+  +1.0, +1.0,
+  -1.0, +1.0
 };
 
 const double pylith::faults::CohesiveDynDataHex8::_quadWts[] = {
@@ -60,10 +60,10 @@
 };
 
 const double pylith::faults::CohesiveDynDataHex8::_basis[] = {
-  0.62200847,  0.16666667,  0.0446582,   0.16666667,
-  0.16666667,  0.62200847,  0.16666667,   0.0446582,
-  0.0446582,   0.16666667,  0.62200847,  0.16666667,
-  0.16666667,   0.0446582,  0.16666667,  0.62200847,
+  1.0, 0.0, 0.0, 0.0,
+  0.0, 1.0, 0.0, 0.0,
+  0.0, 0.0, 1.0, 0.0,
+  0.0, 0.0, 0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveDynDataHex8::_basisDeriv[] = {
@@ -103,1237 +103,991 @@
   "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
+  4.1, 2.1, 3.1,
+  4.2, 2.2, 3.2,
+  4.3, 2.3, 3.3,
+  4.4, 2.4, 3.4,
+  4.5, 2.5, 3.5, // 6
+  4.6, 2.6, 3.6, // 7
+  4.7, 2.7, 3.7, // 8
+  4.8, 2.8, 3.8, // 9
+  4.9, 2.9, 3.9,
+  4.0, 2.0, 3.0,
+  4.1, 2.1, 3.1,
+  4.2, 2.2, 3.2,
+  4.5, 2.5, 3.5, // 14
+  4.6, 2.6, 3.6, // 15
+  4.7, 2.7, 3.7, // 16
+  4.8, 2.8, 3.8, // 17
+  4.4, 2.4, 3.4, // 18
+  4.6, 2.6, 3.6, // 19
+  4.8, 2.8, 3.8, // 20
+  4.0, 2.0, 3.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,
+  1.0,  0.1,  0.2, // 2x
   0.3,  0.4,  0.5,
   0.6,  0.7,  0.8,
-  0.9,    1,  1.1,
+  0.9,  1.0,  1.1,
   1.2,  1.3,  1.4,
   1.5,  1.6,  1.7,
-  1.8,  1.9,    2,
+  1.8,  1.9,  2.0,
   2.1,  2.2,  2.3,
   2.4,  2.5,  2.6,
   2.7,  2.8,  2.9,
-    3,  3.1,  3.2,
+  3.0,  3.1,  3.2,
   3.3,  3.4,  3.5,
   3.6,  3.7,  3.8,
-  3.9,    4,  4.1,
+  3.9,  4.0,  4.1,
   4.2,  4.3,  4.4,
   4.5,  4.6,  4.7,
-  4.8,  4.9,    5,
+  4.8,  4.9,  5.0,
   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,
+  3.0,  4.1,  1.2, // 2y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 2z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 3x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 3y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 3z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 4x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 4y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 4z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 5x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 5y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 5z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 6x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+ +6.0, -0.5, -0.6, // 6
+ -0.7, -0.8, -0.9, // 7
+ -1.0, -0.8, -0.7, // 8
+ -0.6, -0.5, -0.4, // 9
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 6y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+ -0.5, +6.1, -1.0, // 6
+ -1.1, -1.2, -1.3, // 7
+ -1.4, -1.3, -1.2, // 8
+ -1.1, -1.0, -0.9, // 9
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 6z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+ -0.6, -1.0, +6.2, // 6
+ -0.5, -0.6, -0.7, // 7
+ -0.8, -0.9, -0.8, // 8
+ -0.7, -0.6, -0.5, // 9
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 7x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+ -0.7, -1.1, -0.5, // 6
+ +6.3, -0.8, -0.7, // 7
+ -0.6, -0.5, -0.4, // 8
+ -0.3, -0.2, -0.1, // 9
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 7y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+ -0.8, -1.2, -0.6, // 6
+ -0.8, +6.4, -0.3, // 7
+ -0.4, -0.5, -0.6, // 8
+ -0.7, -0.8, -0.9, // 9
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 7z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+ -0.9, -1.3, -0.7, // 6
+ -0.7, -0.3, +6.5, // 7
+ -0.3, -0.8, -0.7, // 8
+ -0.6, -0.9, -0.7, // 9
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 8x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+ -1.0, -1.4, -0.8, // 6
+ -0.6, -0.4, -0.3, // 7
+ +6.6, -1.1, -0.8, // 8
+ -0.7, -0.6, -0.5, // 9
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 8y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+ -0.8, -1.3, -0.9, // 6
+ -0.5, -0.5, -0.8, // 7
+ -1.1, +6.7, -0.8, // 8
+ -0.9, -1.0, -1.1, // 9
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 8z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+ -0.7, -1.2, -0.8, // 6
+ -0.4, -0.6, -0.7, // 7
+ -0.8, -0.8, +6.8, // 8
+ -1.0, -1.1, -1.2, // 9
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 9x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+ -0.6, -1.1, -0.7, // 6
+ -0.3, -0.7, -0.6, // 7
+ -0.7, -0.9, -1.0, // 8
+ +6.9, -0.5, -0.4, // 9
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 9y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+ -0.5, -1.0, -0.6, // 6
+ -0.2, -0.8, -0.9, // 7
+ -0.6, -1.0, -1.1, // 8
+ -0.5, +6.0, -1.2, // 9
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 9z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+ -0.4, -0.9, -0.5, // 6
+ -0.1, -0.9, -0.7, // 7
+ -0.5, -1.1, -1.2, // 8
+ -0.4, -1.2, +6.1, // 9
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 10x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 10y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 10z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 11x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 11y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 11z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 12x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 12y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 12z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 13x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 13y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 13z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  3.2,  5.3,  3.4,
+  1.5,  4.6,  2.7,
+  2.8,  3.9,  2.0,
+  2.1,  6.2,  2.3,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 14x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+ +7.0, -0.5, -0.6, // 14
+ -0.7, -0.8, -0.9, // 15
+ -1.0, -0.8, -0.7, // 16
+ -0.6, -0.5, -0.4, // 17
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 14y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+ -0.5, +7.1, -1.0, // 14
+ -1.1, -1.2, -1.3, // 15
+ -1.4, -1.3, -1.2, // 16
+ -1.1, -1.0, -0.9, // 17
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 14z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+ -0.6, -1.0, +7.2, // 14
+ -0.5, -0.6, -0.7, // 15
+ -0.8, -0.9, -0.8, // 16
+ -0.7, -0.6, -0.5, // 17
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 15x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+ -0.7, -1.1, -0.5, // 14
+ +7.3, -0.8, -0.7, // 15
+ -0.6, -0.5, -0.4, // 16
+ -0.3, -0.2, -0.1, // 17
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 15y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+ -0.8, -1.2, -0.6, // 14
+ -0.8, +7.4, -0.3, // 15
+ -0.4, -0.5, -0.6, // 16
+ -0.7, -0.8, -0.9, // 17
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 15z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+ -0.9, -1.3, -0.7, // 14
+ -0.7, -0.3, +7.5, // 15
+ -0.3, -0.8, -0.7, // 16
+ -0.6, -0.9, -0.7, // 17
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 16x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+ -1.0, -1.4, -0.8, // 14
+ -0.6, -0.4, -0.3, // 15
+ +7.6, -1.1, -0.8, // 16
+ -0.7, -0.6, -0.5, // 17
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 16y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+ -0.8, -1.3, -0.9, // 14
+ -0.5, -0.5, -0.8, // 15
+ -1.1, +7.7, -0.8, // 16
+ -0.9, -1.0, -1.1, // 17
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 16z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+ -0.7, -1.2, -0.8, // 14
+ -0.4, -0.6, -0.7, // 15
+ -0.8, -0.8, +7.8, // 16
+ -1.0, -1.1, -1.2, // 17
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  1.0,  0.1,  0.2, // 17x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  3.3,  3.4,  3.5,
+  3.6,  3.7,  3.8,
+  3.9,  4.0,  4.1,
+  4.2,  4.3,  4.4,
+  4.5,  4.6,  4.7,
+ -0.6, -1.1, -0.7, // 14
+ -0.3, -0.7, -0.6, // 15
+ -0.7, -0.9, -1.0, // 16
+ +7.9, -0.5, -0.4, // 17
+  4.8,  4.9,  5.0,
+  5.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  5.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 17y
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+ -0.5, -1.0, -0.6, // 14
+ -0.2, -0.8, -0.9, // 15
+ -0.6, -1.0, -1.1, // 16
+ -0.5, +7.0, -1.2, // 17
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
+  3.0,  4.1,  1.2, // 17z
+  3.3,  6.4,  4.5,
+  3.6,  3.7,  6.8,
+  3.9,  7.0,  6.1,
+  1.4,  6.5,  2.6,
+  1.7,  9.8,  2.9,
+  1.0,  5.1,  3.2,
+  1.3,  3.4,  3.5,
+  2.6,  2.7,  3.8,
+  2.9,  4.0,  4.1,
+  2.2,  4.3,  4.4,
+  3.5,  4.6,  4.7,
+ -0.4, -0.9, -0.5, // 14
+ -0.1, -0.9, -0.7, // 15
+ -0.5, -1.1, -1.2, // 16
+ -0.4, -1.2, +7.1, // 17
+  3.8,  4.9,  5.0,
+  4.1,  5.2,  5.3,
+  5.4,  5.5,  5.6,
+  7.7,  5.8,  5.9,
 };
 
-// ----------------------------------------------------------------------
-// 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,
@@ -1345,11 +1099,11 @@
   1.0, 1.0, 1.0, 1.0
 };
 
-const double pylith::faults::CohesiveDynDataHex8::_forcesInitial[] = {
-  3.063397471, -1.063397471, +2.063397471, 
-  3.121132498, -1.121132498, +2.121132498, 
-  3.178867525, -1.178867525, +2.178867525,
-  3.236602552, -1.236602552, +2.236602552,
+const double pylith::faults::CohesiveDynDataHex8::_initialTractions[] = {
+  +3.0, -1.0, +2.0,
+  +3.1, -1.1, +2.1,
+  +3.2, -1.2, +2.2,
+  +3.3, -1.3, +2.3,
 };
 
 
@@ -1362,26 +1116,26 @@
 // ----------------------------------------------------------------------
 // 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, -89.4, // 18
-  1.6, 3.6, -89.6, // 19
-  1.8, 3.8, -89.8, // 20
-  1.0, 3.0, -89.0, // 21
+  0.1, 2.1, 1.1,
+  0.2, 2.2, 1.2,
+  0.3, 2.3, 1.3,
+  0.4, 2.4, 1.4,
+  0.5, 2.5, 1.5, // 6
+  0.6, 2.6, 1.6, // 7
+  0.7, 2.7, 1.7, // 8
+  0.8, 2.8, 1.8, // 9
+  0.9, 2.9, 1.9,
+  0.0, 2.0, 1.0,
+  1.1, 3.1, 2.1,
+  1.2, 3.2, 2.2,
+  1.3, 3.3, 2.3, // 14
+  1.5, 3.5, 2.5, // 15
+  1.7, 3.7, 2.7, // 16
+  1.9, 3.9, 2.9, // 17
+  41.4, 3.4, 2.4, // 18
+  41.6, 3.6, 2.6, // 19
+  41.8, 3.8, 2.8, // 20
+  41.0, 3.0, 2.0, // 21
 };
 
 // No change in fieldIncr
@@ -1392,57 +1146,57 @@
 // ----------------------------------------------------------------------
 // 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
+  1.1, 2.1, 0.1,
+  1.2, 2.2, 0.2,
+  1.3, 2.3, 0.3,
+  1.4, 2.4, 0.4,
+  1.5, 2.5, 0.5, // 6
+  1.6, 2.6, 0.6, // 7
+  1.7, 2.7, 0.7, // 8
+  1.8, 2.8, 0.8, // 9
+  1.9, 2.9, 0.9,
+  1.0, 2.0, 0.0,
+  1.1, 2.1, 0.1,
+  1.2, 2.2, 0.2,
+  1.5, 2.5, 0.5, // 14
+  1.6, 2.6, 0.6, // 15
+  1.7, 2.7, 0.7, // 16
+  1.8, 2.8, 0.8, // 17
+  1.4, 2.4, 0.4, // 18
+  1.6, 2.6, 0.6, // 19
+  1.8, 2.8, 0.8, // 20
+  1.0, 2.0, 0.2, // 21
 };
 
 // Output
 const double pylith::faults::CohesiveDynDataHex8::_fieldIncrSlipE[] = {
-   5.100000000000,   7.100000000000,   9.100000000000,
-   5.200000000000,   7.200000000000,   9.200000000000,
-   5.300000000000,   7.300000000000,   9.300000000000,
-   5.400000000000,   7.400000000000,   9.400000000000,
-   5.500000000000,   7.504978662071,   9.495178588558,
-   5.600000000000,   7.604183996601,   9.595885186290,
-   5.700000000000,   7.703622549597,   9.696395508868,
-   5.800000000000,   7.803201980792,   9.796783683690,
-   5.900000000000,   7.900000000000,   9.900000000000,
-   5.000000000000,   7.000000000000,   9.000000000000,
-   6.100000000000,   8.100000000000,  10.100000000000,
-   6.200000000000,   8.200000000000,  10.200000000000,
-   6.300000000000,   8.295021337929,  10.304821411442,
-   6.500000000000,   8.495816003399,  10.504114813710,
-   6.700000000000,   8.696377450403,  10.703604491132,
-   6.900000000000,   8.896798019208,  10.903216316310,
-  -5.824264068712,  -7.824264068712, -10.400000000000,
-  -6.024264068712,  -8.024264068712, -10.600000000000,
-  -6.224264068712,  -8.224264068712, -10.800000000000,
-  -5.424264068712,  -7.424264068712, -10.000000000000,
+   1.100000000000,   2.100000000000,   0.100000000000,
+   1.200000000000,   2.200000000000,   0.200000000000,
+   1.300000000000,   2.300000000000,   0.300000000000,
+   1.400000000000,   2.400000000000,   0.400000000000,
+   1.500000000000,   3.745293503266,   1.312227205500,
+   1.600000000000,   3.294980394575,   1.386664200491,
+   1.700000000000,   3.591763265955,   1.582543631245,
+   1.800000000000,   3.703107773803,   1.671356663600,
+   1.900000000000,   2.900000000000,   0.900000000000,
+   1.000000000000,   2.000000000000,   0.000000000000,
+   1.100000000000,   2.100000000000,   0.100000000000,
+   1.200000000000,   2.200000000000,   0.200000000000,
+   1.500000000000,   1.254706496734,  -0.312227205500,
+   1.600000000000,   1.905019605425,  -0.186664200491,
+   1.700000000000,   1.808236734045,  -0.182543631245,
+   1.800000000000,   1.896892226197,  -0.071356663600,
+   1.400000000000,   0.328479469127,  -1.239953753608,
+   1.600000000000,   0.293941190358,  -1.262585961634,
+   1.800000000000,   0.259995967920,  -1.286431883494,
+   1.000000000000,   0.342606428329,  -1.125914857337,
 };
 
 const double pylith::faults::CohesiveDynDataHex8::_slipSlipE[] = {
-   0.009957324142,   0.009642822884,   0.000000000000,
-   0.008367993202,   0.008229627421,   0.000000000000,
-   0.007245099193,   0.007208982264,   0.000000000000,
-   0.006403961584,   0.006432632620,   0.000000000000,
+   2.490587006532,  -1.624454410999,   0.000000000000,
+   1.389960789150,  -1.573328400983,   0.000000000000,
+   1.783526531910,  -1.765087262491,   0.000000000000,
+   1.806215547605,  -1.742713327201,   0.000000000000,
 };
 
 // ----------------------------------------------------------------------
@@ -1450,57 +1204,57 @@
 // ----------------------------------------------------------------------
 // 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
+  1.1, 2.1, 0.1,
+  1.2, 2.2, 0.2,
+  1.3, 2.3, 0.3,
+  1.4, 2.4, 0.4,
+  1.5, 2.5, 0.5, // 6
+  1.6, 2.6, 0.6, // 7
+  1.7, 2.7, 0.7, // 8
+  1.8, 2.8, 0.8, // 9
+  1.9, 2.9, 0.9,
+  1.0, 2.0, 0.0,
+  1.1, 2.1, 0.1,
+  1.2, 2.2, 0.2,
+  1.5, 2.5, 0.5, // 14
+  1.6, 2.6, 0.6, // 15
+  1.7, 2.7, 0.7, // 16
+  1.8, 2.8, 0.8, // 17
+ -10.4, 2.4, 0.4, // 18
+ -10.6, 2.6, 0.6, // 19
+ -10.8, 2.8, 0.8, // 20
+ -10.0, 2.0, 0.2, // 21
 };
 
 // Output
 const double pylith::faults::CohesiveDynDataHex8::_fieldIncrOpenE[] = {
-   5.100000000000,   7.100000000000,   9.100000000000,
-   5.200000000000,   7.200000000000,   9.200000000000,
-   5.300000000000,   7.300000000000,   9.300000000000,
-   5.400000000000,   7.400000000000,   9.400000000000,
-   5.500000000000,   7.442454974471,   9.676228188067,
-   5.600000000000,   7.555401305851,   9.759311696661,
-   5.700000000000,   7.664478333931,   9.847182893464,
-   5.800000000000,   7.782595639240,   9.927084810574,
-   5.900000000000,   7.900000000000,   9.900000000000,
-   5.000000000000,   7.000000000000,   9.000000000000,
-   6.100000000000,   8.100000000000,  10.100000000000,
-   6.200000000000,   8.200000000000,  10.200000000000,
-   6.300000000000,   8.357545025529,  10.123771811933,
-   6.500000000000,   8.544598694149,  10.340688303339,
-   6.700000000000,   8.735521666069,  10.552817106536,
-   6.900000000000,   8.917404360760,  10.772915189426,
-  -5.400000000000,  -7.400000000000,  -9.400000000000,
-  -5.600000000000,  -7.600000000000,  -9.600000000000,
-  -5.800000000000,  -7.800000000000,  -9.800000000000,
-  -5.000000000000,  -7.000000000000,  -9.000000000000,
+   1.100000000000,   2.100000000000,   0.100000000000,
+   1.200000000000,   2.200000000000,   0.200000000000,
+   1.300000000000,   2.300000000000,   0.300000000000,
+   1.400000000000,   2.400000000000,   0.400000000000,
+   3.473386524898,   3.450458773757,   1.061077907335,
+   3.302801176428,   2.966499592247,   1.097759351340,
+   3.627558189277,   3.252968860584,   1.264881344260,
+   3.475698668581,   3.241605816971,   1.233144951440,
+   1.900000000000,   2.900000000000,   0.900000000000,
+   1.000000000000,   2.000000000000,   0.000000000000,
+   1.100000000000,   2.100000000000,   0.100000000000,
+   1.200000000000,   2.200000000000,   0.200000000000,
+  -0.473386524898,   1.549541226243,  -0.061077907335,
+  -0.102801176428,   2.233500407753,   0.102240648660,
+  -0.227558189277,   2.147031139416,   0.135118655740,
+   0.124301331419,   2.358394183029,   0.366855048560,
+  -4.400000000000,  -2.400000000000,  -3.400000000000,
+  -4.600000000000,  -2.600000000000,  -3.600000000000,
+  -4.800000000000,  -2.800000000000,  -3.800000000000,
+  -4.000000000000,  -2.000000000000,  -3.000000000000,
 };
 
 const double pylith::faults::CohesiveDynDataHex8::_slipOpenE[] = {
-  -0.115090051058,  -0.352456376134,   0.000000000000,
-  -0.089197388297,  -0.318623393323,   0.000000000000,
-  -0.071043332138,  -0.294365786929,   0.000000000000,
-  -0.034808721519,  -0.254169621148,   0.000000000000,
+   1.900917547514,  -1.122155814671,   3.946773049797,
+   0.732999184495,  -0.995518702680,   3.405602352856,
+   1.105937721169,  -1.129762688519,   3.855116378553,
+   0.883211633942,  -0.866289902880,   3.351397337162,
 };
 
 // ----------------------------------------------------------------------
@@ -1524,7 +1278,7 @@
   jacobian = const_cast<double*>(_jacobian);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
-  forcesInitial = const_cast<double*>(_forcesInitial);
+  initialTractions = const_cast<double*>(_initialTractions);
 
   constraintVertices = const_cast<int*>(_constraintVertices);
   numConstraintVert = _numConstraintVert;  

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataHex8.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataHex8.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataHex8.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -67,7 +67,7 @@
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.
-  static const double _forcesInitial[]; ///< Expected values for initial forces.
+  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.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -59,24 +59,24 @@
 
 const int pylith::faults::CohesiveDynDataQuad4::_numBasis = 2;
 
-const int pylith::faults::CohesiveDynDataQuad4::_numQuadPts = 1;
+const int pylith::faults::CohesiveDynDataQuad4::_numQuadPts = 2;
 
 const double pylith::faults::CohesiveDynDataQuad4::_quadPts[] = {
-  0.0,
+  -1.0, 1.0,
 };
 
 const double pylith::faults::CohesiveDynDataQuad4::_quadWts[] = {
-  2.0,
+  1.0, 1.0
 };
 
 const double pylith::faults::CohesiveDynDataQuad4::_basis[] = {
-  0.5,
-  0.5
+  1.0, 0.0,
+  0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveDynDataQuad4::_basisDeriv[] = {
-  -0.5,
-   0.5
+  -0.5, 0.5,
+  -0.5, 0.5,
 };
 
 const double pylith::faults::CohesiveDynDataQuad4::_verticesRef[] = {
@@ -97,215 +97,173 @@
   8.4, 9.4, // 5
   8.5, 9.5,
   8.6, 9.6,
-  8.7, 9.7, // 8
-  8.9, 9.9, // 9
+  8.3, 9.3, // 8
+  8.4, 9.4, // 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.1, 0.1, // 2x
  0.2, 0.3,
  0.4, 0.5,
  0.6, 0.7,
  0.8, 0.9,
-   1, 1.1,
+ 1.0, 1.1,
  1.2, 1.3,
  1.4, 1.5,
  1.6, 1.7,
  1.8, 1.9,
-   2,   1,
+ 2.0, 2.1, // 2y
  2.1, 2.2,
  2.3, 2.4,
  2.5, 2.6,
  2.7, 2.8,
- 2.9,   3,
+ 2.9, 3.0,
  3.1, 3.2,
  3.3, 3.4,
  3.5, 3.6,
  3.7, 3.8,
- 3.9,   4,
-   1, 4.1,
+ 3.9, 4.0, // 3x
+ 4.0, 4.1,
  4.2, 4.3,
  4.4, 4.5,
  4.6, 4.7,
  4.8, 4.9,
-   5, 5.1,
+ 5.0, 5.1,
  5.2, 5.3,
  5.4, 5.5,
  5.6, 5.7,
- 5.8, 5.9,
-   6,   1,
+ 5.8, 5.9, // 3y
+ 6.0, 6.1,
  6.1, 6.2,
  6.3, 6.4,
  6.5, 6.6,
  6.7, 6.8,
- 6.9,   7,
+ 6.9, 7.0,
  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,
+ 7.7, 7.8, // 4x
+ 7.9, 8.0,
++4.0,-1.2, // 4
+-2.2,-2.3, // 5
  8.4, 8.5,
  8.6, 8.7,
  8.8, 8.9,
-   9, 9.1,
- 9.2,  -1,
+ 9.0, 9.1,
+ 9.2, 9.3,
  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,
+ 3.7, 4.8, // 4y
+ 3.9, 4.0,
+-1.2,+5.0, // 4
+-1.3,-3.2, // 5
+ 4.4, 5.5,
+ 4.6, 5.7,
+ 4.8, 5.9,
+ 4.0, 5.1,
+ 4.2, 5.3,
+ 4.3, 5.4,
+ 7.7, 7.8, // 5x
+ 7.9, 8.0,
+-2.2,-1.3, // 4
++4.1,-4.3, // 5
+ 8.4, 8.5,
+ 8.6, 8.7,
+ 8.8, 8.9,
+ 9.0, 9.1,
+ 9.2, 9.3,
+ 9.3, 9.4,
+ 3.7, 4.8, // 5y
+ 3.9, 4.0,
+-2.3,-3.2, // 4
+-4.3,+5.1, // 5
+ 4.4, 5.5,
+ 4.6, 5.7,
+ 4.8, 5.9,
+ 4.0, 5.1,
+ 4.2, 5.3,
+ 4.3, 5.4,
+ 0.1, 0.1, // 6x
+ 0.2, 0.3,
+ 0.4, 0.5,
+ 0.6, 0.7,
+ 0.8, 0.9,
+ 1.0, 1.1,
+ 1.2, 1.3,
+ 1.4, 1.5,
+ 1.6, 1.7,
+ 1.8, 1.9,
+ 2.0, 2.1, // 6y
+ 2.1, 2.2,
+ 2.3, 2.4,
+ 2.5, 2.6,
+ 2.7, 2.8,
+ 2.9, 3.0,
+ 3.1, 3.2,
+ 3.3, 3.4,
+ 3.5, 3.6,
+ 3.7, 3.8,
+ 3.9, 4.0, // 7x
+ 4.0, 4.1,
+ 4.2, 4.3,
+ 4.4, 4.5,
+ 4.6, 4.7,
+ 4.8, 4.9,
+ 5.0, 5.1,
+ 5.2, 5.3,
+ 5.4, 5.5,
+ 5.6, 5.7,
+ 5.8, 5.9, // 7y
+ 6.0, 6.1,
+ 6.1, 6.2,
+ 6.3, 6.4,
+ 6.5, 6.6,
+ 6.7, 6.8,
+ 6.9, 7.0,
+ 7.1, 7.2,
+ 7.3, 7.4,
+ 7.5, 7.6,
+ 7.7, 7.8, // 8x
+ 7.9, 8.0,
+ 8.4, 8.5,
+ 8.6, 8.7,
+ 8.8, 8.9,
+ 9.0, 9.1,
++5.0,-1.2, // 8
+-2.2,-2.3, // 9
+ 9.2, 9.3,
+ 9.3, 9.4,
+ 3.7, 4.8, // 8y
+ 3.9, 4.0,
+ 4.4, 5.5,
+ 4.6, 5.7,
+ 4.8, 5.9,
+ 4.0, 5.1,
+-1.2,+4.0, // 8
+-1.3,-3.2, // 9
+ 4.2, 5.3,
+ 4.3, 5.4,
+ 7.7, 7.8, // 9x
+ 7.9, 8.0,
+ 8.4, 8.5,
+ 8.6, 8.7,
+ 8.8, 8.9,
+ 9.0, 9.1,
+-2.2,-1.3, // 8
++5.1,-4.3, // 9
+ 9.2, 9.3,
+ 9.3, 9.4,
+ 3.7, 4.8, // 9y
+ 3.9, 4.0,
+ 4.4, 5.5,
+ 4.6, 5.7,
+ 4.8, 5.9,
+ 4.0, 5.1,
+-2.3,-3.2, // 8
+-4.3,+4.1, // 9
+ 4.2, 5.3,
+ 4.3, 5.4,
 };
 
 // ----------------------------------------------------------------------
@@ -322,9 +280,9 @@
   1.0,
 };
 
-const double pylith::faults::CohesiveDynDataQuad4::_forcesInitial[] = {
-  2.05, -1.05,
-  2.05, -1.05,
+const double pylith::faults::CohesiveDynDataQuad4::_initialTractions[] = {
+  2.0, -1.0,
+  2.1, -1.1,
 };
 
 
@@ -338,16 +296,16 @@
 // ----------------------------------------------------------------------
 // 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
+  1.1, 2.1,
+  1.2, 2.2,
+  1.3, 2.3, // 4
+  1.4, 2.4, // 5
+  1.5, 2.5,
+  1.6, 2.6,
+  1.7, 2.7, // 8
+  1.9, 2.9, // 9
+  21.8, 2.8, // 10
+  21.0, 2.0, // 11
 };
 
 // No change in fieldIncr
@@ -358,37 +316,35 @@
 // ----------------------------------------------------------------------
 // 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
+  1.1, 2.1,
+  1.2, 2.2,
+  1.3, 2.3, // 4
+  1.4, 2.4, // 5
+  1.5, 2.5,
+  1.6, 2.6,
+  1.3, 2.3, // 8
+  1.4, 2.4, // 9
+  1.8, 2.8, // 10
+  1.0, 2.0, // 11
 };
 
 // Output
-// :TODO: Update Lagrange multiplier values
 const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrSlipE[] = {
-  9.1,  10.100000000000,
-  9.2,  10.200000000000,
-  9.3,  10.313079001869,
-  9.4,  10.405865253910,
-  9.5,  10.500000000000,
-  9.6,  10.600000000000,
-  9.7,  10.686920998131,
-  9.9,  10.894134746090,
- -9.4, -10.800000000000,
- -8.6, -10.000000000000,
+   1.100000000000,   2.100000000000,
+   1.200000000000,   2.200000000000,
+   1.300000000000,   2.406970297611,
+   1.400000000000,   3.369389712309,
+   1.500000000000,   2.500000000000,
+   1.600000000000,   2.600000000000,
+   1.300000000000,   2.193029702389,
+   1.400000000000,   1.430610287691,
+   1.800000000000,  -3.440000000000,
+   1.000000000000,  -3.600000000000,
 };
 
-// Update slip values based on changes in Lagrange multiplier values
 const double pylith::faults::CohesiveDynDataQuad4::_slipSlipE[] = {
-  0.026158003737426,                   0.0,
-  0.011730507820273,                   0.0,
+   0.213940595221,   0.000000000000,
+   1.938779424618,   0.000000000000,
 };
 
 // ----------------------------------------------------------------------
@@ -396,35 +352,35 @@
 // ----------------------------------------------------------------------
 // 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
+  1.1, 2.1,
+  1.2, 2.2,
+  1.3, 2.3, // 4
+  1.4, 2.4, // 5
+  1.5, 2.5,
+  1.6, 2.6,
+  1.3, 2.3, // 8
+  1.4, 2.4, // 9
+  -10.8, 2.8, // 10
+  -10.0, 2.0, // 11
 };
 
 // Output
 const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrOpenE[] = {
-   9.100000000000,  10.100000000000,
-   9.200000000000,  10.200000000000,
-   9.300000000000,  10.685047196672,
-   9.932709332305,  11.176949275526,
-   9.500000000000,  10.500000000000,
-   9.600000000000,  10.600000000000,
-   9.700000000000,  10.314952803328,
-   9.367290667695,  10.123050724474,
+   1.100000000000,   2.100000000000,
+   1.200000000000,   2.200000000000,
+   3.815834136232,   2.039404156843,
+   4.287400342924,   3.820863468454,
+   1.500000000000,   2.500000000000,
+   1.600000000000,   2.600000000000,
+  -1.215834136232,   2.560595843157,
+  -1.487400342924,   0.979136531546,
   -8.800000000000,  -9.800000000000,
   -8.000000000000,  -9.000000000000,
 };
 
 const double pylith::faults::CohesiveDynDataQuad4::_slipOpenE[] = {
-  0.770094393343286,  0.0,
-  1.553898551051246,   1.065418664609568,
+  -0.521191686313,   5.031668272463,
+   2.841726936907,   5.774800685848,
 };
 
 // ----------------------------------------------------------------------
@@ -448,7 +404,7 @@
   jacobian = const_cast<double*>(_jacobian);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
-  forcesInitial = const_cast<double*>(_forcesInitial);
+  initialTractions = const_cast<double*>(_initialTractions);
 
   constraintVertices = const_cast<int*>(_constraintVertices);
   numConstraintVert = _numConstraintVert;  

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -67,7 +67,7 @@
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.
-  static const double _forcesInitial[]; ///< Expected values for initial forces.
+  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.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTet4.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTet4.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTet4.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -45,24 +45,34 @@
 
 const int pylith::faults::CohesiveDynDataTet4::_numBasis = 3;
 
-const int pylith::faults::CohesiveDynDataTet4::_numQuadPts = 1;
+const int pylith::faults::CohesiveDynDataTet4::_numQuadPts = 3;
 
 const double pylith::faults::CohesiveDynDataTet4::_quadPts[] = {
-  -3.33333333e-01,  -3.33333333e-01,
+ -1.00000000e+00, -1.00000000e+00,
+  1.00000000e+00, -1.00000000e+00,
+ -1.00000000e+00,  1.00000000e+00,
 };
 
 const double pylith::faults::CohesiveDynDataTet4::_quadWts[] = {
-  2.0,
+  2.0/3.0, 2.0/3.0, 2.0/3.0,
 };
 
 const double pylith::faults::CohesiveDynDataTet4::_basis[] = {
-  3.33333333e-01,  3.33333333e-01,
-  3.33333333e-01,};
+  1.0, 0.0, 0.0,
+  0.0, 1.0, 0.0,
+  0.0, 0.0, 1.0,
+};
 
 const double pylith::faults::CohesiveDynDataTet4::_basisDeriv[] = {
  -0.50000000e+00, -0.50000000e+00,
   0.50000000e+00,  0.00000000e+00,
   0.00000000e+00,  0.50000000e+00,
+ -0.50000000e+00, -0.50000000e+00,
+  0.50000000e+00,  0.00000000e+00,
+  0.00000000e+00,  0.50000000e+00,
+ -0.50000000e+00, -0.50000000e+00,
+  0.50000000e+00,  0.00000000e+00,
+  0.00000000e+00,  0.50000000e+00,
 };
 
 const double pylith::faults::CohesiveDynDataTet4::_verticesRef[] = {
@@ -84,380 +94,378 @@
   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.2, 8.2, 9.2, // 7
+  7.3, 8.3, 9.3, // 8
+  7.4, 8.4, 9.4, // 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,
+  1.0,  0.1,  0.2, // 2x
   0.3,  0.4,  0.5,
   0.6,  0.7,  0.8,
-  0.9,    1,  1.1,
+  0.9,  1.0,  1.1,
   1.2,  1.3,  1.4,
   1.5,  1.6,  1.7,
-  1.8,  1.9,    2,
+  1.8,  1.9,  2.0,
   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,
+  3.0,  3.1,  3.2,
+  2.0,  4.1,  3.2, // 2y
+  2.3,  4.4,  3.5,
+  2.6,  4.7,  3.8,
+  2.9,  4.0,  3.1,
+  2.2,  4.3,  3.4,
+  2.5,  4.6,  3.7,
+  2.8,  4.9,  3.0,
+  2.1,  4.2,  3.3,
+  2.4,  4.5,  3.6,
+  2.7,  4.8,  3.9,
+  2.0,  4.1,  3.2,
+  1.0,  7.1,  2.2, // 2z
+  1.3,  7.4,  2.5,
+  1.6,  7.7,  2.8,
+  1.9,  7.0,  2.1,
+  1.2,  7.3,  2.4,
+  1.5,  7.6,  2.7,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
+  1.0,  0.1,  0.2, // 3x
+ +4.0, -1.1, -1.2, // 3
+ -1.3, -1.4, -1.5, // 4
+ -1.6, -1.7, -1.8, // 5
+  0.3,  0.4,  0.5,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  2.0,  4.1,  3.2, // 3y
+ -1.1, +4.1, -2.3, // 3
+ -2.4, -2.5, -2.6, // 4
+ -2.7, -2.8, -2.9, // 5
+  2.3,  4.4,  3.5,
+  2.5,  4.6,  3.7,
+  2.8,  4.9,  3.0,
+  2.1,  4.2,  3.3,
+  2.4,  4.5,  3.6,
+  2.7,  4.8,  3.9,
+  2.0,  4.1,  3.2,
+  1.0,  7.1,  2.2, // 3z
+ -1.2, -2.3, +4.2, // 3
+ -1.0, -1.1, -1.2, // 4
+ -1.3, -1.4, -1.5, // 5
+  1.5,  7.6,  2.7,
+  1.3,  7.4,  2.5,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
+  1.0,  0.1,  0.2, // 4x
+ -1.3, -2.4, -1.0, // 3
+ +4.3, -0.2, -0.3, // 4
+ -0.4, -0.5, -0.6, // 5
+  0.3,  0.4,  0.5,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  2.0,  4.1,  3.2, // 4y
+ -1.4, -2.5, -1.1, // 3
+ -0.2, +4.4, -0.9, // 4
+ -0.8, -0.7, -0.5, // 5
+  2.3,  4.4,  3.5,
+  2.5,  4.6,  3.7,
+  2.8,  4.9,  3.0,
+  2.1,  4.2,  3.3,
+  2.4,  4.5,  3.6,
+  2.7,  4.8,  3.9,
+  2.0,  4.1,  3.2,
+  1.0,  7.1,  2.2, // 4z
+ -1.5, -2.6, -1.2, // 3
+ -0.3, -0.9, +4.5, // 4
+ -1.1, -1.2, -1.3, // 5
+  1.3,  7.4,  2.5,
+  1.5,  7.6,  2.7,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
+  1.0,  0.1,  0.2, // 5x
+ -1.6, -2.7, -1.3, // 3
+ -0.4, -0.8, -1.1, // 4
+ +4.6, -1.8, -1.5, // 5
+  0.3,  0.4,  0.5,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  1.0,  0.1,  0.2, // 5y
+ -1.7, -2.8, -1.4, // 3
+ -0.5, -0.7, -1.2, // 4
+ -1.8, +4.7, -1.1, // 5
+  0.3,  0.4,  0.5,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  1.0,  7.1,  2.2, // 5z
+ -1.8, -2.9, -1.5, // 3
+ -0.6, -0.5, -1.3, // 4
+ -1.5, -1.1, +4.8, // 5
+  1.3,  7.4,  2.5,
+  1.5,  7.6,  2.7,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
+  1.0,  0.1,  0.2, // 6x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  2.0,  4.1,  3.2, // 6y
+  2.3,  4.4,  3.5,
+  2.6,  4.7,  3.8,
+  2.9,  4.0,  3.1,
+  2.2,  4.3,  3.4,
+  2.5,  4.6,  3.7,
+  2.8,  4.9,  3.0,
+  2.1,  4.2,  3.3,
+  2.4,  4.5,  3.6,
+  2.7,  4.8,  3.9,
+  2.0,  4.1,  3.2,
+  1.0,  7.1,  2.2, // 6z
+  1.3,  7.4,  2.5,
+  1.6,  7.7,  2.8,
+  1.9,  7.0,  2.1,
+  1.2,  7.3,  2.4,
+  1.5,  7.6,  2.7,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
+  1.0,  0.1,  0.2, // 7x
+  0.3,  0.4,  0.5,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+ +5.0, -1.1, -1.2, // 3
+ -1.3, -1.4, -1.5, // 4
+ -1.6, -1.7, -1.8, // 5
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  2.0,  4.1,  3.2, // 7y
+  2.3,  4.4,  3.5,
+  2.5,  4.6,  3.7,
+  2.8,  4.9,  3.0,
+  2.1,  4.2,  3.3,
+ -1.1, +5.1, -2.3, // 7
+ -2.4, -2.5, -2.6, // 8
+ -2.7, -2.8, -2.9, // 9
+  2.4,  4.5,  3.6,
+  2.7,  4.8,  3.9,
+  2.0,  4.1,  3.2,
+  1.0,  7.1,  2.2, // 7z
+  1.5,  7.6,  2.7,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+  1.3,  7.4,  2.5,
+ -1.2, -2.3, +5.2, // 7
+ -1.0, -1.1, -1.2, // 8
+ -1.3, -1.4, -1.5, // 9
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
+  1.0,  0.1,  0.2, // 8x
+  0.3,  0.4,  0.5,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+ -1.3, -2.4, -1.0, // 7
+ +5.3, -0.2, -0.3, // 8
+ -0.4, -0.5, -0.6, // 9
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  2.0,  4.1,  3.2, // 8y
+  2.3,  4.4,  3.5,
+  2.5,  4.6,  3.7,
+  2.8,  4.9,  3.0,
+  2.1,  4.2,  3.3,
+ -1.4, -2.5, -1.1, // 7
+ -0.2, +5.4, -0.9, // 8
+ -0.8, -0.7, -0.5, // 9
+  2.4,  4.5,  3.6,
+  2.7,  4.8,  3.9,
+  2.0,  4.1,  3.2,
+  1.0,  7.1,  2.2, // 8z
+  1.3,  7.4,  2.5,
+  1.5,  7.6,  2.7,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+ -1.5, -2.6, -1.2, // 7
+ -0.3, -0.9, +5.5, // 8
+ -1.1, -1.2, -1.3, // 9
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
+  1.0,  0.1,  0.2, // 9x
+  0.3,  0.4,  0.5,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+ -1.6, -2.7, -1.3, // 7
+ -0.4, -0.8, -1.1, // 8
+ +5.6, -1.8, -1.5, // 9
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  2.0,  4.1,  3.2, // 9y
+  2.3,  4.4,  3.5,
+  2.5,  4.6,  3.7,
+  2.8,  4.9,  3.0,
+  2.1,  4.2,  3.3,
+ -1.7, -2.8, -1.4, // 7
+ -0.5, -0.7, -1.2, // 8
+ -1.8, +5.7, -1.1, // 9
+  2.4,  4.5,  3.6,
+  2.7,  4.8,  3.9,
+  2.0,  4.1,  3.2,
+  1.0,  7.1,  2.2, // 9z
+  1.3,  7.4,  2.5,
+  1.5,  7.6,  2.7,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+ -1.8, -2.9, -1.5, // 7
+ -0.6, -0.5, -1.3, // 8
+ -1.5, -1.1, +5.8, // 9
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
+  1.0,  0.1,  0.2, // 10x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  2.0,  4.1,  3.2, // 10y
+  2.3,  4.4,  3.5,
+  2.6,  4.7,  3.8,
+  2.9,  4.0,  3.1,
+  2.2,  4.3,  3.4,
+  2.5,  4.6,  3.7,
+  2.8,  4.9,  3.0,
+  2.1,  4.2,  3.3,
+  2.4,  4.5,  3.6,
+  2.7,  4.8,  3.9,
+  2.0,  4.1,  3.2,
+  1.0,  7.1,  2.2, // 10z
+  1.3,  7.4,  2.5,
+  1.6,  7.7,  2.8,
+  1.9,  7.0,  2.1,
+  1.2,  7.3,  2.4,
+  1.5,  7.6,  2.7,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
+  1.0,  0.1,  0.2, // 11x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  2.0,  4.1,  3.2, // 11y
+  2.3,  4.4,  3.5,
+  2.6,  4.7,  3.8,
+  2.9,  4.0,  3.1,
+  2.2,  4.3,  3.4,
+  2.5,  4.6,  3.7,
+  2.8,  4.9,  3.0,
+  2.1,  4.2,  3.3,
+  2.4,  4.5,  3.6,
+  2.7,  4.8,  3.9,
+  2.0,  4.1,  3.2,
+  1.0,  7.1,  2.2, // 11z
+  1.3,  7.4,  2.5,
+  1.6,  7.7,  2.8,
+  1.9,  7.0,  2.1,
+  1.2,  7.3,  2.4,
+  1.5,  7.6,  2.7,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
+  1.0,  0.1,  0.2, // 12x
+  0.3,  0.4,  0.5,
+  0.6,  0.7,  0.8,
+  0.9,  1.0,  1.1,
+  1.2,  1.3,  1.4,
+  1.5,  1.6,  1.7,
+  1.8,  1.9,  2.0,
+  2.1,  2.2,  2.3,
+  2.4,  2.5,  2.6,
+  2.7,  2.8,  2.9,
+  3.0,  3.1,  3.2,
+  2.0,  4.1,  3.2, // 12y
+  2.3,  4.4,  3.5,
+  2.6,  4.7,  3.8,
+  2.9,  4.0,  3.1,
+  2.2,  4.3,  3.4,
+  2.5,  4.6,  3.7,
+  2.8,  4.9,  3.0,
+  2.1,  4.2,  3.3,
+  2.4,  4.5,  3.6,
+  2.7,  4.8,  3.9,
+  2.0,  4.1,  3.2,
+  1.0,  7.1,  2.2, // 12z
+  1.3,  7.4,  2.5,
+  1.6,  7.7,  2.8,
+  1.9,  7.0,  2.1,
+  1.2,  7.3,  2.4,
+  1.5,  7.6,  2.7,
+  1.8,  7.9,  2.0,
+  1.1,  7.2,  2.3,
+  1.4,  7.5,  2.6,
+  1.7,  7.8,  2.9,
+  1.0,  7.1,  2.2,
 };
 
 // ----------------------------------------------------------------------
@@ -476,10 +484,10 @@
   1.0/3.0,
 };
 
-const double pylith::faults::CohesiveDynDataTet4::_forcesInitial[] = {
-  3.1/3.0, -1.1/3.0, +2.1/3.0,
-  3.1/3.0, -1.1/3.0, +2.1/3.0,
-  3.1/3.0, -1.1/3.0, +2.1/3.0,
+const double pylith::faults::CohesiveDynDataTet4::_initialTractions[] = {
+  +3.0, -1.0, +2.0, 
+  +3.1, -1.1, +2.1, 
+  +3.2, -1.2, +2.2, 
 };
 
 
@@ -493,17 +501,17 @@
 // ----------------------------------------------------------------------
 // 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
+  1.1, 2.1, 3.1,
+  1.2, 2.2, 3.2, // 3
+  1.3, 2.3, 3.3, // 4
+  1.4, 2.4, 3.4, // 5
+  1.5, 2.5, 3.5,
+  1.6, 2.6, 3.6, // 7
+  1.8, 2.8, 3.8, // 8
+  1.0, 2.0, 3.0, // 9
+  41.7, 2.7, 3.7, // 10
+  41.9, 2.9, 3.9, // 11
+  41.1, 2.1, 3.1, // 12
 };
 
 // No change in fieldIncr
@@ -514,38 +522,38 @@
 // ----------------------------------------------------------------------
 // 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
+  1.1, 2.1, 3.1,
+  1.2, 2.2, 3.2, // 3
+  1.3, 2.3, 3.3, // 4
+  1.4, 2.4, 3.4, // 5
+  1.5, 2.5, 3.5,
+  1.2, 2.2, 3.2, // 7
+  1.3, 2.3, 3.3, // 8
+  1.4, 2.4, 3.4, // 9
+  9.7, 2.7, 3.7, // 10
+  9.9, 2.9, 3.9, // 11
+  9.1, 2.1, 3.1, // 12
 };
 
 // Output
 const double pylith::faults::CohesiveDynDataTet4::_fieldIncrSlipE[] = {
-   8.100000000000,   9.100000000000,  10.100000000000,
-   8.200000000000,   8.391727731714,  10.956284985259,
-   8.300000000000,   8.791277340217,  10.815192651071,
-   8.400000000000,   9.060755249362,  10.758883268626,
-   8.500000000000,   9.500000000000,  10.500000000000,
-   8.600000000000,  10.408272268286,   9.843715014741,
-   8.800000000000,  10.308722659783,  10.284807348929,
-   8.000000000000,   9.339244750638,   9.641116731374,
-  -7.300777685147,  -8.252092036995, -10.700000000000,
-  -7.500201409882,  -8.452606339630, -10.900000000000,
-  -6.702681322117,  -7.650402548711, -10.100000000000,
+   1.100000000000,   2.100000000000,   3.100000000000,
+   1.200000000000,   2.427020189783,   3.226804829918,
+   1.300000000000,   2.281534813168,   3.292288303722,
+   1.400000000000,   2.543753403100,   3.499170314087,
+   1.500000000000,   2.500000000000,   3.500000000000,
+   1.200000000000,   1.972979810217,   3.173195170082,
+   1.300000000000,   2.318465186832,   3.307711696278,
+   1.400000000000,   2.256246596900,   3.300829685913,
+   9.700000000000,  -1.935106067360,  -1.748282570405,
+   9.900000000000,  -1.959241090539,  -1.782841275376,
+   9.100000000000,  -1.865391385620,  -1.642919108291,
 };
 
 const double pylith::faults::CohesiveDynDataTet4::_slipSlipE[] = {
-  -1.616544536572,  -1.512569970519,   0.000000000000,
-  -1.017445319566,  -1.030385302142,   0.000000000000,
-  -0.678489501275,  -0.717766537252,   0.000000000000,
+   0.454040379566,  -0.053609659837,   0.000000000000,
+  -0.036930373664,   0.015423392555,   0.000000000000,
+   0.287506806199,  -0.198340628174,   0.000000000000,
 };
 
 // ----------------------------------------------------------------------
@@ -553,38 +561,38 @@
 // ----------------------------------------------------------------------
 // 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
+  1.1, 2.1, 3.1,
+  1.2, 2.2, 3.2, // 3
+  1.3, 2.3, 3.3, // 4
+  1.4, 2.4, 3.4, // 5
+  1.5, 2.5, 3.5,
+  1.2, 2.2, 3.2, // 7
+  1.3, 2.3, 3.3, // 8
+  1.4, 2.4, 3.4, // 9
+ -20.7, 2.7, 3.7, // 10
+ -20.9, 2.9, 3.9, // 11
+ -20.1, 2.1, 3.1, // 12
 };
 
 // Output
 const double pylith::faults::CohesiveDynDataTet4::_fieldIncrOpenE[] = {
-   8.100000000000,   9.100000000000,  10.100000000000,
-   8.200000000000,   8.707485448105,  11.300792216319,
-   8.300000000000,   9.089936432069,  11.135493258511,
-   8.400000000000,   9.353421152116,  11.068689140292,
-   8.500000000000,   9.500000000000,  10.500000000000,
-   8.600000000000,  10.092514551895,   9.499207783681,
-   8.800000000000,  10.010063567931,   9.964506741489,
-   8.000000000000,   9.046578847884,   9.331310859708,
+   1.100000000000,   2.100000000000,   3.100000000000,
+   2.478935676274,   2.200668834288,   2.866497129446,
+   2.514833997358,   1.906576121577,   2.868854721277,
+   2.460386652668,   2.373508489140,   3.258697327233,
+   1.500000000000,   2.500000000000,   3.500000000000,
+  -0.078935676274,   2.199331165712,   3.533502870554,
+   0.085166002642,   2.693423878423,   3.731145278723,
+   0.339613347332,   2.426491510860,   3.541302672767,
   -7.700000000000,  -8.700000000000,  -9.700000000000,
   -7.900000000000,  -8.900000000000,  -9.900000000000,
   -7.100000000000,  -8.100000000000,  -9.100000000000,
 };
 
 const double pylith::faults::CohesiveDynDataTet4::_slipOpenE[] = {
-  -0.985029103789,  -2.201584432637,   0.000000000000,
-  -0.420127135861,  -1.670986517021,   0.000000000000,
-  -0.093157695768,  -1.337378280584,   0.000000000000,
+   0.001337668577,   0.667005741108,   2.557871352547,
+  -0.786847756846,   0.862290557446,   2.429667994716,
+  -0.052983021720,   0.282605345535,   2.120773305336,
 };
 
 // ----------------------------------------------------------------------
@@ -608,7 +616,7 @@
   jacobian = const_cast<double*>(_jacobian);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
-  forcesInitial = const_cast<double*>(_forcesInitial);
+  initialTractions = const_cast<double*>(_initialTractions);
 
   constraintVertices = const_cast<int*>(_constraintVertices);
   numConstraintVert = _numConstraintVert;  

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTet4.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTet4.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTet4.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -67,7 +67,7 @@
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.
-  static const double _forcesInitial[]; ///< Expected values for initial forces.
+  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.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -61,24 +61,24 @@
 
 const int pylith::faults::CohesiveDynDataTri3::_numBasis = 2;
 
-const int pylith::faults::CohesiveDynDataTri3::_numQuadPts = 1;
+const int pylith::faults::CohesiveDynDataTri3::_numQuadPts = 2;
 
 const double pylith::faults::CohesiveDynDataTri3::_quadPts[] = {
-  0.0,
+  -1.0, 1.0,
 };
 
 const double pylith::faults::CohesiveDynDataTri3::_quadWts[] = {
-  2.0,
+  1.0, 1.0
 };
 
 const double pylith::faults::CohesiveDynDataTri3::_basis[] = {
-  0.5,
-  0.5
+  1.0, 0.0,
+  0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveDynDataTri3::_basisDeriv[] = {
-  -0.5,
-   0.5
+  -0.5, 0.5,
+  -0.5, 0.5,
 };
 
 const double pylith::faults::CohesiveDynDataTri3::_verticesRef[] = {
@@ -97,16 +97,14 @@
   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.2, 9.2, // 6
+  8.3, 9.3, // 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)
+  1.0, 1.1, // 2x
   0.1, 1.2,
   0.2, 1.3,
   0.3, 1.4,
@@ -122,86 +120,86 @@
   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.1, 5.1, // 3x
+ +4.0,-1.2, // 3
+ -2.2,-2.3, // 4
   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.6,+1.0, 
   4.7, 5.7,
   6.1, 7.1, // 3y
-  6.2, 1.0,
-  6.3, 7.2,
+ -1.2,+5.0, // 3
+ -1.3,-3.2, // 4
   6.4, 7.3,
   6.5, 7.4,
   6.6, 7.5,
- +1.0, 7.6, //  8
+  1.0, 7.6,
   6.7, 7.7,
   8.1, 9.1, // 4x
-  8.2, 9.2,
-  1.0, 9.3,
+ -2.2,-1.3, // 3
+ +4.1,-4.3, // 4
   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
+  8.7,+1.0,
+  1.1, 1.1, // 4y
+ -2.3,-3.2, // 3
+ -4.3,+5.1, // 4
+  1.4, 1.3,
+  1.5, 1.4,
+  1.6, 1.5,
+  1.7, 1.6,
+  1.0, 1.7,
+  2.1, 3.1, // 5x
+  2.2, 3.2,
+  2.3, 3.3,
+  1.0, 3.4,
+  2.4, 3.5,
+  2.5, 3.6,
+  2.6, 3.7,
+  2.7, 3.8,
+  4.1, 5.1, // 5y
+  4.2, 5.2,
+  4.3, 5.3,
+  4.4, 1.0,
+  4.5, 5.4,
+  4.6, 5.5,
+  4.7, 5.6,
+  4.8, 5.7,
+  6.1, 7.1, // 6x
+  6.2, 7.2,
+  6.3, 7.3,
+  6.4, 7.4,
+ +5.0,-1.2, // 6
+ -2.2,-2.3, // 7
+  6.6, 1.0,
+  6.7, 7.7,
+  8.1, 9.1, // 6y
+  8.2, 9.2,
+  8.3, 9.3,
+  8.4, 9.4,
+ -1.2,+4.0, // 6
+ -1.3,-3.2, // 7
+  1.0, 9.6,
+  8.7, 9.7,
+  0.1, 1.1, // 7x
+  0.2, 1.2,
+  0.3, 1.3,
+  0.4, 1.4,
+ -2.2,-1.3, // 6
+ +5.1,-4.3, // 7
+  0.6, 1.7,
+  0.7, 1.0,
+  2.1, 3.1, // 7y
+  2.2, 3.2,
+  2.3, 3.3,
+  2.4, 3.4,
+ -2.3,-3.2, // 6
+ -4.3,+4.1, // 7
+  2.7, 3.6,
+  1.0, 3.7, //  9
 
   24.1, 25.1, // 8x (rows associated with Lagrange multiplier vertex label 8)
   24.2,+1.0, //  3
@@ -252,9 +250,9 @@
   1.0,
 };
 
-const double pylith::faults::CohesiveDynDataTri3::_forcesInitial[] = {
-  2.05, -1.05,
-  2.05, -1.05,
+const double pylith::faults::CohesiveDynDataTri3::_initialTractions[] = {
+  2.0, -1.0,
+  2.1, -1.1,
 };
 
 
@@ -268,14 +266,14 @@
 // ----------------------------------------------------------------------
 // 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
+  1.1, 2.1,
+  1.2, 2.2, // 3
+  1.3, 2.3, // 4
+  1.4, 2.4,
+  1.2, 2.2, // 6
+  1.3, 2.3, // 7
+  21.6, 2.6, // 8
+  21.8, 2.8, // 9
 };
 
 // No change in fieldIncr
@@ -286,31 +284,31 @@
 // ----------------------------------------------------------------------
 // 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
+  9.1, 7.1,
+  9.2, 7.2, // 3
+  9.3, 7.3, // 4
+  9.4, 7.4,
+  9.2, 7.2, // 6
+  9.3, 7.3, // 7
+  1.6, 2.6, // 8
+  1.8, 2.8, // 9
 };
 
 // Output
 const double pylith::faults::CohesiveDynDataTri3::_fieldIncrSlipE[] = {
-  9.1,  10.100000000000,
-  9.2,   9.304186565683,
-  9.3,  10.066643380561,
-  9.4,  10.400000000000,
-  9.5,  11.395813434317,
-  9.7,  10.933356619439,
- -8.0, -10.600000000000,
- -8.2, -10.800000000000,
+   9.100000000000,   7.100000000000,
+   9.200000000000,   7.390546440275,
+   9.300000000000,   8.283993111958,
+   9.400000000000,   7.400000000000,
+   9.200000000000,   7.009453559725,
+   9.300000000000,   6.316006888042,
+   1.600000000000,  -3.480000000000,
+   1.800000000000,  -3.440000000000,
 };
 
 const double pylith::faults::CohesiveDynDataTri3::_slipSlipE[] = {
-  -1.791626868633122,                   0.0,
-  -0.466713238878134,                   0.0,
+   0.381092880550,   0.000000000000,
+   1.967986223916,   0.000000000000,
 };
 
 // ----------------------------------------------------------------------
@@ -318,31 +316,31 @@
 // ----------------------------------------------------------------------
 // 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
+  9.1, 7.1,
+  9.2, 7.2, // 3
+  9.3, 7.3, // 4
+  9.4, 7.4,
+  9.2, 7.2, // 6
+  9.3, 7.3, // 7
+  -10.6, 2.6, // 8
+  -10.8, 2.8, // 9
 };
 
 // Output
 const double pylith::faults::CohesiveDynDataTri3::_fieldIncrOpenE[] = {
- 9.100000000000,  10.100000000000,
- 9.200000000000,  10.851688943849,
-10.191208845155,  11.487449638489,
- 9.400000000000,  10.400000000000,
- 9.500000000000,   9.848311056151,
- 8.808791154845,   9.512550361511,
--8.600000000000,  -9.600000000000,
--8.800000000000,  -9.800000000000,
+   9.100000000000,   7.100000000000,
+  11.874337677762,   7.148344513504,
+  12.357207850137,   8.757371967576,
+   9.400000000000,   7.400000000000,
+   6.525662322238,   7.251655486496,
+   6.242792149863,   5.842628032424,
+  -8.600000000000,  -9.600000000000,
+  -8.800000000000,  -9.800000000000,
 };
 
 const double pylith::faults::CohesiveDynDataTri3::_slipOpenE[] = {
-  1.303377887698464,  0.0,
-  2.374899276978848,  1.782417690310881,
+  -0.103310972991,   5.348675355523,
+   2.914743935152,   6.114415700274,
 };
 
 // ----------------------------------------------------------------------
@@ -366,7 +364,7 @@
   jacobian = const_cast<double*>(_jacobian);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
-  forcesInitial = const_cast<double*>(_forcesInitial);
+  initialTractions = const_cast<double*>(_initialTractions);
 
   constraintVertices = const_cast<int*>(_constraintVertices);
   numConstraintVert = _numConstraintVert;  

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -67,7 +67,7 @@
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.
-  static const double _forcesInitial[]; ///< Expected values for initial forces.
+  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.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3d.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3d.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3d.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -76,24 +76,24 @@
 
 const int pylith::faults::CohesiveDynDataTri3d::_numBasis = 2;
 
-const int pylith::faults::CohesiveDynDataTri3d::_numQuadPts = 1;
+const int pylith::faults::CohesiveDynDataTri3d::_numQuadPts = 2;
 
 const double pylith::faults::CohesiveDynDataTri3d::_quadPts[] = {
-  0.0,
+  -1.0, 1.0,
 };
 
 const double pylith::faults::CohesiveDynDataTri3d::_quadWts[] = {
-  2.0,
+  1.0, 1.0
 };
 
 const double pylith::faults::CohesiveDynDataTri3d::_basis[] = {
-  0.5,
-  0.5
+  1.0, 0.0,
+  0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveDynDataTri3d::_basisDeriv[] = {
-  -0.5,
-   0.5
+  -0.5, 0.5,
+  -0.5, 0.5,
 };
 
 const double pylith::faults::CohesiveDynDataTri3d::_verticesRef[] = {
@@ -114,16 +114,14 @@
   6.4, 8.4,
   6.5, 8.5, // 8
   6.6, 8.6,
-  6.7, 8.7, // 10
-  6.9, 8.9, // 11
-  7.1, 9.1, // 12
-  6.8, 8.8, // 13
-  6.0, 8.0, // 14
-  7.2, 9.2, // 15
+  6.2, 8.2, // 10
+  6.3, 8.3, // 11
+  6.5, 8.5, // 12
+ -3.8, 4.8, // 13
+  3.0, 4.0, // 14
+  3.2, 4.2, // 15
 };
 
-// :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::CohesiveDynDataTri3d::_jacobian[] = {
   1.0, 1.1, // 4x
   1.1, 2.1,
@@ -150,78 +148,54 @@
   3.1, 4.0,
   3.2, 4.1,
   6.1, 7.2, // 5x
-  6.0, 7.3,
-  6.9, 7.4,
+ +6.0,-1.0, // 5
+ -1.1,-1.2, // 6
   6.8, 7.5,
-  6.7, 7.6,
+ -1.3,-1.4, // 8
   6.6, 7.7,
   6.5, 7.8,
   6.4, 7.9,
   6.3, 7.0,
- -0.70710678118654757, +0.70710678118654757, // 13
+  6.5, 6.6,
   6.2, 7.1,
   6.1, 7.2,
   3.0, 5.1, // 5y
-  3.1, 5.2,
-  3.2, 5.2,
+ -1.0,+6.1, // 5
+ -0.9,-0.8, // 6
   3.3, 5.1,
-  3.4, 5.3,
+ -0.7,-0.6, // 8
   3.5, 5.0,
   3.6, 5.4,
   3.7, 5.9,
   3.8, 5.5,
- +0.70710678118654757, +0.70710678118654757, // 13
+  3.9, 5.5,
   4.2, 5.6,
   4.1, 5.8,
   3.0, 2.7, // 6x
-  3.9, 2.7,
-  3.8, 2.8,
+ -1.1,-0.9, // 5
+ +6.2,-2.1, // 6
   3.7, 2.6,
-  3.6, 2.9,
+ -2.2,-2.3, // 8
   3.5, 2.5,
   3.4, 2.1,
   3.3, 2.4,
   3.2, 2.2,
   3.1, 2.3,
-  0.0,+1.0, // 14
+  2.0, 2.0,
   3.0, 2.4,
   4.1, 6.1, // 6y
-  4.1, 6.6,
-  4.2, 6.2,
-  4.2, 6.5,
+ -1.2,-0.8, // 5
+ -2.1,+6.3, // 6
   4.3, 6.3,
+ -1.4,-1.5, // 8
   4.3, 6.4,
   4.4, 6.4,
   4.4, 6.3,
   4.5, 6.5,
   4.5, 6.2,
- +1.0, 0.0, // 14
+  4.6, 7.0,
   4.6, 6.1,
-  4.6, 6.6, // 7x
-  5.7, 9.7,
-  5.7, 9.9,
-  5.8, 9.8,
-  5.8, 9.8,
-  5.9, 9.9,
-  5.1, 9.7,
-  5.2, 9.1,
-  5.3, 9.6,
-  5.1, 9.2,
-  5.4, 9.5,
-  5.2, 9.3,
-  5.5, 9.4, // 7y
-  6.3, 9.4,
-  6.6, 9.3,
-  6.4, 9.5,
-  6.7, 9.2,
-  6.5, 9.6,
-  6.8, 9.1,
-  6.6, 9.7,
-  7.9, 8.9,
-  7.7, 8.8,
-  7.1, 8.8,
-  7.8, 8.9,
-  7.2, 8.7, // 8x
+  7.2, 8.7, // 7x
   7.9, 8.1,
   7.3, 8.6,
   7.1, 8.2,
@@ -232,8 +206,8 @@
   7.6, 8.3,
   7.4, 8.5,
   7.7, 8.6,
- -1.0, 0.0, // 15
-  6.5, 3.3, // 8y
+  7.8, 8.7,
+  6.5, 3.3, // 7y
   6.4, 3.4,
   6.3, 3.8,
   6.2, 3.9,
@@ -244,7 +218,31 @@
   5.6, 3.4,
   5.5, 3.3,
   5.4, 3.2,
-  0.0,+1.0, // 15
+  5.5, 3.3,
+  4.6, 6.6, // 8x
+ -1.3,-0.7, // 5
+ -2.2,-1.4, // 6
+  5.8, 9.8,
+ +6.4,-1.1, // 8
+  5.9, 9.9,
+  5.1, 9.7,
+  5.2, 9.1,
+  5.3, 9.6,
+  5.1, 9.2,
+  5.4, 9.5,
+  5.2, 9.3,
+  5.5, 9.4, // 8y
+ -1.4,-0.6, // 5
+ -2.3,-1.5, // 6
+  6.4, 9.5,
+ -1.1,+6.5, // 8
+  6.5, 9.6,
+  6.8, 9.1,
+  6.6, 9.7,
+  7.9, 8.9,
+  7.7, 8.8,
+  7.1, 8.8,
+  7.8, 8.9,
   4.4, 2.0, // 9x
   4.3, 2.1,
   4.2, 2.2,
@@ -269,97 +267,97 @@
   2.7, 3.8,
   2.8, 3.7,
   2.9, 3.6,
-  1.0, 3.5, // 10x
-  1.1, 4.4,
-  1.2, 4.3,
-  1.3, 4.2,
-  1.4, 4.1,
-  1.5, 4.0,
-  1.6, 4.1,
-  1.7, 4.2,
-  1.8, 4.3,
- +0.70710678118654757, -0.70710678118654757, // 13
-  1.9, 5.4,
-  9.0, 5.5,
-  8.0, 4.7, // 10y
-  7.1, 4.5,
-  6.2, 4.4,
-  6.3, 4.6,
-  6.4, 4.7,
-  6.5, 4.4,
-  4.6, 4.8,
-  4.7, 4.4,
-  4.8, 4.2,
- -0.70710678118654757, -0.70710678118654757, // 13
-  6.1, 4.8,
-  6.2, 4.7,
-  6.3, 5.6, // 11x
-  6.4, 5.5,
-  6.5, 5.4,
-  6.6, 5.3,
-  6.7, 5.1,
-  6.8, 5.2,
-  6.9, 5.3,
-  7.0, 5.9,
-  7.7, 5.8,
-  7.6, 5.7,
-  0.0,-1.0, // 14
-  7.5, 5.5,
-  7.4, 6.4, // 11y
-  7.3, 6.2,
-  7.2, 6.0,
-  7.2, 6.9,
-  7.1, 6.8,
-  7.0, 6.7,
-  7.2, 6.6,
-  7.3, 6.5,
-  7.4, 6.3,
-  7.5, 6.2,
- -1.0, 0.0, // 14
-  8.6, 6.2,
-  8.7, 6.3, // 12x
-  8.8, 6.3,
-  8.9, 7.4,
-  8.0, 7.5,
-  8.6, 7.6,
-  8.5, 7.7,
-  8.4, 7.8,
-  8.0, 7.9,
-  8.3, 7.1,
-  8.0, 7.2,
-  8.2, 7.3,
- +1.0, 0.0, // 15
-  7.2, 8.6, // 12y
-  6.6, 8.5,
-  6.7, 8.4,
-  6.9, 8.2,
-  6.5, 8.3,
-  6.4, 8.5,
-  6.3, 8.6,
-  6.5, 8.8,
-  4.7, 8.7,
-  4.9, 8.5,
-  7.5, 8.3,
-  6.0,-1.0, // 15
+  6.1, 7.2, // 10x
+  6.8, 7.5,
+  6.6, 7.7,
+  6.5, 7.8,
+  6.4, 7.9,
+  6.3, 7.0,
+ +5.0,-1.0, // 10
+ -1.1,-1.2, // 11
+ -1.3,-1.4, // 12
+  6.5, 6.6,
+  6.2, 7.1,
+  6.1, 7.2,
+  3.0, 5.1, // 10y
+  3.3, 5.1,
+  3.5, 5.0,
+  3.6, 5.4,
+  3.7, 5.9,
+  3.8, 5.5,
+ -1.0,+5.1, // 10
+ -0.9,-0.8, // 11
+ -0.7,-0.6, // 12
+  3.9, 5.5,
+  4.2, 5.6,
+  4.1, 5.8,
+  3.0, 2.7, // 11x
+  3.7, 2.6,
+  3.5, 2.5,
+  3.4, 2.1,
+  3.3, 2.4,
+  3.2, 2.2,
+ -1.1,-0.9, // 10
+ +5.2,-2.1, // 11
+ -2.2,-2.3, // 12
+  3.1, 2.3,
+  2.0, 2.0,
+  3.0, 2.4,
+  4.1, 6.1, // 11y
+  4.3, 6.3,
+  4.3, 6.4,
+  4.4, 6.4,
+  4.4, 6.3,
+  4.5, 6.5,
+ -1.2,-0.8, // 10
+ -2.1,+5.3, // 11
+ -1.4,-1.5, // 12
+  4.5, 6.2,
+  4.6, 7.0,
+  4.6, 6.1,
+  4.6, 6.6, // 12x
+  5.8, 9.8,
+  5.9, 9.9,
+  5.1, 9.7,
+  5.2, 9.1,
+  5.3, 9.6,
+ -1.3,-0.7, // 10
+ -2.2,-1.4, // 11
+ +5.4,-1.1, // 12
+  5.1, 9.2,
+  5.4, 9.5,
+  5.2, 9.3,
+  5.5, 9.4, // 12y
+  6.4, 9.5,
+  6.5, 9.6,
+  6.8, 9.1,
+  6.6, 9.7,
+  7.9, 8.9,
+ -1.4,-0.6, // 10
+ -2.3,-1.5, // 11
+ -1.1,+5.5, // 12
+  7.7, 8.8,
+  7.1, 8.8,
+  7.8, 8.9,
   3.2, 8.3, // 13x
- -0.70710678118654757, +0.70710678118654757, // 5
+  3.3, 8.4,
   5.4, 9.3,
   5.6, 9.7,
   3.7, 9.0,
   5.9, 9.9,
- +0.70710678118654757, -0.70710678118654757, // 10
+  6.0, 9.8,
   4.4, 4.8,
   4.6, 4.7,
   4.8, 4.6,
   4.9, 4.4,
   4.0, 4.2,
   4.2, 4.3, // 13y
- +0.70710678118654757, +0.70710678118654757, // 5
+  4.3, 4.4,
   7.5, 3.4,
   6.7, 3.5,
   6.4, 3.6,
   4.6, 3.9,
- -0.70710678118654757, -0.70710678118654757, // 10
+  4.7, 4.0,
   8.9, 2.8,
   7.6, 2.7,
   6.4, 2.6,
@@ -367,24 +365,24 @@
   3.8, 2.3,
   4.5, 2.2, // 14x
   8.5, 2.4,
-  0.0,+1.0, // 6
+  0.0, 1.0,
   7.4, 3.6,
   6.6, 3.5,
   4.7, 3.4,
   3.8, 3.5,
-  0.0,-1.0, // 11
+  0.0, 1.0,
   5.9, 3.7,
   8.7, 4.6,
   7.6, 4.5,
   6.5, 4.4,
   5.5, 4.3, // 14y
   4.3, 4.8,
- +1.0, 0.0, // 6
+  1.0, 0.0,
   4.3, 4.7,
   6.5, 4.6,
   9.6, 4.5,
   8.7, 4.3,
- -1.0, 0.0, // 11
+  1.0, 0.0,
   7.9, 4.5,
   6.7, 5.3,
   5.6, 5.8,
@@ -393,11 +391,11 @@
   3.3, 5.5,
   4.2, 5.3,
   5.4, 5.6,
- -1.0, 6.0, // 8
+  1.0, 6.0,
   0.8, 6.6,
   9.8, 6.5,
   8.5, 6.5,
- +1.0, 0.0, // 12
+  1.0, 0.0,
   7.5, 7.3,
   6.4, 7.6,
   5.2, 7.8,
@@ -405,11 +403,11 @@
   3.7, 8.6,
   3.8, 8.5,
   2.9, 8.3,
-  0.0,+1.0, // 8
+  0.0, 1.0,
   2.0, 9.9,
   2.7, 9.8,
   1.6, 9.7,
-  0.0,-1.0, // 12
+  0.0, 1.0,
   1.5, 5.5,
   1.2, 5.4,
   1.1, 5.3,
@@ -438,10 +436,10 @@
   13, 14, 15
 };
 
-const double pylith::faults::CohesiveDynDataTri3d::_forcesInitial[] = {
-  3.15*1.4142135623730951, 1.00*1.41421356237309,
-  2.05, -1.05,
-  1.10,  2.10,
+const double pylith::faults::CohesiveDynDataTri3d::_initialTractions[] = {
+  3.0*0.70710678118654757, 0.70710678118654757,
+  2.1, -1.1,
+  1.2,  2.2,
 };
 
 
@@ -450,18 +448,18 @@
 // ----------------------------------------------------------------------
 // Input
 const double pylith::faults::CohesiveDynDataTri3d::_fieldIncrStick[] = {
-  1.1, 29.1,
-  1.2, 29.2, // 5
-  1.3, 29.3, // 6
-  1.4, 29.4,
-  1.5, 29.5, // 8
-  1.6, 29.6,
-  1.7, 29.7, // 10
-  1.9, 29.9, // 11
-  2.1, 29.1, // 12
-  1.8, -29.8, // 13
-  1.0, -29.0, // 14
-  2.2, -29.2, // 15
+  1.1, 2.1,
+  1.2, 2.2, // 5
+  1.3, 2.3, // 6
+  1.4, 2.4,
+  1.5, 2.5, // 8
+  1.6, 2.6,
+  1.7, 2.7, // 10
+  1.9, 2.9, // 11
+  2.1, 2.1, // 12
+  21.8, 22.8, // 13
+  21.0, 2.0, // 14
+  2.2, 22.2, // 15
 };
 
 // No change in fieldIncr
@@ -472,41 +470,40 @@
 // ----------------------------------------------------------------------
 // Input
 const double pylith::faults::CohesiveDynDataTri3d::_fieldIncrSlip[] = {
-  9.1, 10.1,
-  9.2, 10.2, // 5
-  9.3, 10.3, // 6
-  9.4, 10.4,
-  9.5, 10.5, // 8
-  9.6, 10.6,
-  9.7, 10.7, // 10
-  9.9, 10.9, // 11
-  9.1, 10.1, // 12
-  9.8, -10.8, // 13
-  9.0, -10.0, // 14
-  9.2, -10.2, // 15
+  1.1, 2.1,
+  1.2, 2.2, // 5
+  1.3, 2.3, // 6
+  1.4, 2.4,
+  1.5, 2.5, // 8
+  1.6, 2.6,
+  1.2, 2.2, // 10
+  1.3, 2.3, // 11
+  1.5, 2.5, // 12
+  1.8, 0.8, // 13
+  1.0, 0.1, // 14
+  1.2, 0.2, // 15
 };
 
 // Output
-// TODO Update
 const double pylith::faults::CohesiveDynDataTri3d::_fieldIncrSlipE[] = {
-  9.100000000000,  10.100000000000,
-  4.178047263424,  15.221952736576,
-  9.300000000000,  10.050098043990,
-  9.400000000000,  10.400000000000,
-  9.655679817715,  10.500000000000,
-  9.600000000000,  10.600000000000,
- 14.721952736576,   5.678047263424,
-  9.900000000000,  11.149901956010,
-  8.944320182285,  10.100000000000,
- -5.600000000000, -10.800000000000,
- -4.800000000000, -10.000000000000,
- -6.600000000000, -10.200000000000,
+   1.100000000000,   2.100000000000,
+   2.005761009464,   1.394238990536,
+   1.300000000000,   1.928356338235,
+   1.400000000000,   2.400000000000,
+   1.216364402612,   2.500000000000,
+   1.600000000000,   2.600000000000,
+   0.394238990536,   3.005761009464,
+   1.300000000000,   2.671643661765,
+   1.783635597388,   2.500000000000,
+   4.520000000000,  -1.920000000000,
+   1.000000000000,  -1.600000000000,
+  -0.560000000000,   0.200000000000,
 };
 
 const double pylith::faults::CohesiveDynDataTri3d::_slipSlipE[] = {
-  14.204227339325,   0.0,
-  -0.499803912020,   0.0,
-  -0.311359635429,   0.0,
+  -2.279036295232,   0.000000000000,
+  -0.743287323529,   0.000000000000,
+   0.567271194775,   0.000000000000,
 };
 
 // ----------------------------------------------------------------------
@@ -514,41 +511,40 @@
 // ----------------------------------------------------------------------
 // Input
 const double pylith::faults::CohesiveDynDataTri3d::_fieldIncrOpen[] = {
-  9.1, 10.1,
-  9.2, 10.2, // 5
-  9.3, 10.3, // 6
-  9.4, 10.4,
-  9.5, 10.5, // 8
-  9.6, 10.6,
-  9.7, 10.7, // 10
-  9.9, 10.9, // 11
-  9.1, 10.1, // 12
-  9.8, 10.8, // 13
-  9.0, 10.0, // 14
-  9.2, 10.2, // 15
+  1.1, 2.1,
+  1.2, 2.2, // 5
+  1.3, 2.3, // 6
+  1.4, 2.4,
+  1.5, 2.5, // 8
+  1.6, 2.6,
+  1.2, 2.2, // 10
+  1.3, 2.3, // 11
+  1.5, 2.5, // 12
+-10.8, 0.8, // 13
+-10.0, 0.1, // 14
+  1.2,-10.2, // 15
 };
 
 // Output
 const double pylith::faults::CohesiveDynDataTri3d::_fieldIncrOpenE[] = {
-   9.100000000000,  10.100000000000,
-  17.946141606808,   1.453858393192,
-   9.300000000000,  16.358051491522,
-   9.400000000000,  10.400000000000,
-   1.376240123890,  19.299429217321,
-   9.600000000000,  10.600000000000,
-   0.953858393192,  19.446141606808,
-   9.900000000000,   4.841948508478,
-  17.223759876110,   1.300570782679,
-  -6.800000000000,  -8.800000000000,
-  -6.000000000000,  -8.000000000000,
-  -7.200000000000,  -9.200000000000,
+   1.100000000000,   2.100000000000,
+   9.940107961522,   3.662120348918,
+   5.688525058023,   5.314075601410,
+   1.400000000000,   2.400000000000,
+   3.622067204316,   6.167076609904,
+   1.600000000000,   2.600000000000,
+  -7.540107961522,   0.737879651082,
+  -3.088525058023,  -0.714075601410,
+  -0.622067204316,  -1.167076609904,
+   3.800000000000,  -4.800000000000,
+  -3.000000000000,  -4.000000000000,
+  -3.200000000000,  -4.200000000000,
 };
 
 const double pylith::faults::CohesiveDynDataTri3d::_slipOpenE[] = {
--24.737824157567,  0.0,
- 12.116102983044,  0.0,
- 16.247519752219,  17.598858434641,
-
+ -10.292628788528,  14.428129643052,
+   6.028151202820,   8.777050116045,
+  -4.244134408633,   7.334153219809,
 };
 
 // ----------------------------------------------------------------------
@@ -572,7 +568,7 @@
   jacobian = const_cast<double*>(_jacobian);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
-  forcesInitial = const_cast<double*>(_forcesInitial);
+  initialTractions = const_cast<double*>(_initialTractions);
 
   constraintVertices = const_cast<int*>(_constraintVertices);
   numConstraintVert = _numConstraintVert;  

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3d.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3d.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveDynDataTri3d.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -67,7 +67,7 @@
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.
-  static const double _forcesInitial[]; ///< Expected values for initial forces.
+  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.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataHex8.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataHex8.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataHex8.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -48,10 +48,10 @@
 const int pylith::faults::CohesiveKinDataHex8::_numQuadPts = 4;
 
 const double pylith::faults::CohesiveKinDataHex8::_quadPts[] = {
-  -0.57735027, -0.57735027,
-  +0.57735027, -0.57735027,
-  +0.57735027, +0.57735027,
-  -0.57735027, +0.57735027,
+  -1.0, -1.0,
+  +1.0, -1.0,
+  +1.0, +1.0,
+  -1.0, +1.0
 };
 
 const double pylith::faults::CohesiveKinDataHex8::_quadWts[] = {
@@ -59,10 +59,10 @@
 };
 
 const double pylith::faults::CohesiveKinDataHex8::_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,
+  1.0, 0.0, 0.0, 0.0,
+  0.0, 1.0, 0.0, 0.0,
+  0.0, 0.0, 1.0, 0.0,
+  0.0, 0.0, 0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinDataHex8::_basisDeriv[] = {
@@ -170,9 +170,9 @@
   1.5, 1.5, 1.5, // 15
   1.7, 1.7, 1.7, // 16
   1.9, 1.9, 1.9, // 17
-  1.4, 1.4, 1.4, // 18
-  1.6, 1.6, 1.6, // 19
-  1.8, 1.8, 1.8, // 20
+  1.0, 1.0, 1.0, // 18
+  1.0, 1.0, 1.0, // 19
+  1.0, 1.0, 1.0, // 20
   1.0, 1.0, 1.0, // 21
 };
 
@@ -215,22 +215,30 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -9.4,-5.4,+7.4, // 6
- -9.6,-5.6,+7.6, // 7
- -9.8,-5.8,+7.8, // 8
- -9.0,-5.0,+7.0, // 9
+  +5.4, +7.4, +9.4, // 6
+  +5.6, +7.6, +9.6, // 7
+  +5.8, +7.8, +9.8, // 8
+  +5.0, +7.0, +9.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +9.4,+5.4,-7.4, // 14
- +9.6,+5.6,-7.6, // 15
- +9.8,+5.8,-7.8, // 16
- +9.0,+5.0,-7.0, // 17
-  0.8+1.82575588523, -0.8+-0.55566483464, 0.8+0.07938069066, // 18 (constraint)
-  0.9+1.69682900001, -0.9+-0.56560966667, 0.9+0.14140241667, // 19 (constraint)
-  1.0+1.51709826228, -1.0+-0.54615537442, 1.0+0.18205179147, // 20 (constraint)
-  1.1+1.29378670385, -1.1+-0.49761027071, 1.1+0.19904410828, // 21 (constraint)
+  -5.4, -7.4, -9.4, // 14
+  -5.6, -7.6, -9.6, // 15
+  -5.8, -7.8, -9.8, // 16
+  -5.0, -7.0, -9.0, // 17
+
+  // 18 (constraint)
+  -(5.3-4.5+0.07938069066), -(7.3-6.5+1.82575588523), -(9.3-8.5+0.55566483464),
+
+  // 19 (constraint)
+  -(5.5-4.6+0.14140241667), -(7.5-6.6+1.69682900001), -(9.5-8.6+0.56560966667),
+
+  // 20 (constraint)
+  -(5.7-4.7+0.18205179147), -(7.7-6.7+1.51709826228), -(9.7-8.7+0.54615537442),
+
+  // 21 (constraint)
+  -(5.9-4.8+0.19904410828), -(7.9-6.8+1.29378670385), -(9.9-8.8+0.49761027071),
 };
 
 const double pylith::faults::CohesiveKinDataHex8::_residualIncr[] = {
@@ -238,22 +246,30 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -9.4,-5.4,+7.4, // 6
- -9.6,-5.6,+7.6, // 7
- -9.8,-5.8,+7.8, // 8
- -9.0,-5.0,+7.0, // 9
+  +5.4, +7.4, +9.4, // 6
+  +5.6, +7.6, +9.6, // 7
+  +5.8, +7.8, +9.8, // 8
+  +5.0, +7.0, +9.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +9.4,+5.4,-7.4, // 14
- +9.6,+5.6,-7.6, // 15
- +9.8,+5.8,-7.8, // 16
- +9.0,+5.0,-7.0, // 17
-  0.8+1.82575588523, -0.8+-0.55566483464, 0.8+0.07938069066, // 18 (constraint)
-  0.9+1.69682900001, -0.9+-0.56560966667, 0.9+0.14140241667, // 19 (constraint)
-  1.0+1.51709826228, -1.0+-0.54615537442, 1.0+0.18205179147, // 20 (constraint)
-  1.1+1.29378670385, -1.1+-0.49761027071, 1.1+0.19904410828, // 21 (constraint)
+  -5.4, -7.4, -9.4, // 14
+  -5.6, -7.6, -9.6, // 15
+  -5.8, -7.8, -9.8, // 16
+  -5.0, -7.0, -9.0, // 17
+
+  // 18 (constraint)
+  -(5.3-4.5+0.07938069066), -(7.3-6.5+1.82575588523), -(9.3-8.5+0.55566483464),
+
+  // 19 (constraint)
+  -(5.5-4.6+0.14140241667), -(7.5-6.6+1.69682900001), -(9.5-8.6+0.56560966667),
+
+  // 20 (constraint)
+  -(5.7-4.7+0.18205179147), -(7.7-6.7+1.51709826228), -(9.7-8.7+0.54615537442),
+
+  // 21 (constraint)
+  -(5.9-4.8+0.19904410828), -(7.9-6.8+1.29378670385), -(9.9-8.8+0.49761027071),
 };
 
 const double pylith::faults::CohesiveKinDataHex8::_jacobian[] = {
@@ -513,7 +529,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 18
+ -1.0, 0.0, 0.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -533,7 +549,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 18
+  0.0,-1.0, 0.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -553,7 +569,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 18
+  0.0, 0.0,-1.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -574,7 +590,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 19
+ -1.0, 0.0, 0.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7y
@@ -594,7 +610,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 19
+  0.0,-1.0, 0.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7z
@@ -614,7 +630,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 19
+  0.0, 0.0,-1.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8x
@@ -635,7 +651,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 20
+ -1.0, 0.0, 0.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8y
   0.0, 0.0, 0.0,
@@ -655,7 +671,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 20
+  0.0,-1.0, 0.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8z
   0.0, 0.0, 0.0,
@@ -675,7 +691,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 20
+  0.0, 0.0,-1.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 9x
   0.0, 0.0, 0.0,
@@ -696,7 +712,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 21
+ -1.0, 0.0, 0.0, // 21
   0.0, 0.0, 0.0, // 9y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -716,7 +732,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 21
+  0.0,-1.0, 0.0, // 21
   0.0, 0.0, 0.0, // 9z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -736,7 +752,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 21
+  0.0, 0.0,-1.0, // 21
   0.0, 0.0, 0.0, // 10x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -993,7 +1009,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 18
+ +1.0, 0.0, 0.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1013,7 +1029,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 18
+  0.0,+1.0, 0.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1033,7 +1049,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 18
+  0.0, 0.0,+1.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1054,7 +1070,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 19
+ +1.0, 0.0, 0.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 15y
@@ -1074,7 +1090,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 19
+  0.0,+1.0, 0.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 15z
@@ -1094,7 +1110,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 19
+  0.0, 0.0,+1.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 16x
@@ -1115,7 +1131,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 20
+ +1.0, 0.0, 0.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 16y
   0.0, 0.0, 0.0,
@@ -1135,7 +1151,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 20
+  0.0,+1.0, 0.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 16z
   0.0, 0.0, 0.0,
@@ -1155,7 +1171,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 20
+  0.0, 0.0,+1.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 17x
   0.0, 0.0, 0.0,
@@ -1176,7 +1192,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 21
+ +1.0, 0.0, 0.0, // 21
   0.0, 0.0, 0.0, // 17y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1196,7 +1212,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 21
+  0.0,+1.0, 0.0, // 21
   0.0, 0.0, 0.0, // 17z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1216,12 +1232,12 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 21
+  0.0, 0.0,+1.0, // 21
   0.0, 0.0, 0.0, // 18x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 6
+ -1.0, 0.0, 0.0, // 6
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1229,7 +1245,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 14
+ +1.0, 0.0, 0.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1241,7 +1257,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 6
+  0.0,-1.0, 0.0, // 6
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1249,7 +1265,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 14
+  0.0,+1.0, 0.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1261,7 +1277,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 6
+  0.0, 0.0,-1.0, // 6
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1269,7 +1285,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 14
+  0.0, 0.0,+1.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1282,7 +1298,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 7
+ -1.0, 0.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1290,7 +1306,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 15
+ +1.0, 0.0, 0.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1302,7 +1318,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 7
+  0.0,-1.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1310,7 +1326,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 15
+  0.0,+1.0, 0.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1322,7 +1338,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 7
+  0.0, 0.0,-1.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1330,7 +1346,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 15
+  0.0, 0.0,+1.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1343,7 +1359,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 8
+ -1.0, 0.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1351,7 +1367,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 16
+ +1.0, 0.0, 0.0, // 16
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1363,7 +1379,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 8
+  0.0,-1.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1371,7 +1387,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 16
+  0.0,+1.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1383,7 +1399,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 8
+  0.0, 0.0,-1.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1391,7 +1407,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 16
+  0.0, 0.0,+1.0, // 16
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1404,7 +1420,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 9
+ -1.0, 0.0, 0.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1412,7 +1428,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 17
+ +1.0, 0.0, 0.0, // 17
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1424,7 +1440,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 9
+  0.0,-1.0, 0.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1432,7 +1448,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 17
+  0.0,+1.0, 0.0, // 17
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1444,7 +1460,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 9
+  0.0, 0.0,-1.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1452,7 +1468,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 17
+  0.0, 0.0,+1.0, // 17
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1464,22 +1480,22 @@
   3.2, 4.2, 5.2,
   3.3, 4.3, 5.3,
   3.4, 4.4, 5.4,
-  10.1749505588, 9.31910094671, 1.19608248275, // 6
-  10.1039043952, 9.3565301613, 1.55916596774, // 7
-  10.0557317781, 9.37031383702, 1.88484239309, // 8
-  9.46707670425, 8.80701959867, 2.73150557445, // 9
+  3.81542674923, 5.62624380386, 6.03655867323, // 6
+  4.05551729839, 5.80814306452, 6.26077887097, // 7
+  4.29102589574, 5.95854913114, 6.47307768721, // 8
+  4.5184280556, 6.08059317225, 6.67174581469, // 9
   3.9, 4.9, 5.9,
   3.0, 4.0, 5.0,
   3.1, 4.1, 5.1,
   3.2, 4.2, 5.2,
-  -4.40186602934, -1.26050109236, 10.2660586738, // 14
-  -3.43749802151, -0.573632172048, 9.81022296774, // 15
-  -2.65573177809, 0.0296861629776, 9.51515760691, // 16
-  -1.46880950929, 1.10387616968, 8.80699471894, // 17
-  -7.22865142007, -6.45587627588, -10.0124258381, // 18
-  -7.61044825807, -6.46533445161, -10.4062470323, // 19
-  -7.93953352294, -6.48576793174, -10.8047440227, // 20
-  -7.21263527761, -5.52328996599, -10.2007380677, // 21
+  2.93604605858, 3.00048791863, 4.68089383859, // 14
+  3.01411488172, 3.21131406451, 4.7951692043, // 15
+  3.10897410427, 3.44145086886, 4.92692231279, // 16
+  3.21938394732, 3.6868064684, 5.07413554398, // 17
+  0.473140123852, 1.68936570579, 0.804838009839, // 18
+  0.728827677422, 1.93302890323, 1.05724619355, // 19
+  1.00474402275, 2.13953352294, 1.31423206826, // 20
+  1.29317050009, 2.30506771005, 1.56914246644, // 21
 };
 
 pylith::faults::CohesiveKinDataHex8::CohesiveKinDataHex8(void)

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataLine2.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataLine2.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataLine2.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -121,7 +121,7 @@
 
 
 const double pylith::faults::CohesiveKinDataLine2::_orientation[] = {
-  1.0
+   1.0
 };
 
 const double pylith::faults::CohesiveKinDataLine2::_area[] = {
@@ -130,17 +130,17 @@
 
 const double pylith::faults::CohesiveKinDataLine2::_residualIncr[] = {
    0.0,
-   7.5,
+  +7.5, // 3
    0.0,
-  -7.5,
+  -7.5, // 5
   -0.2+1.89546413727,
 };
 
 const double pylith::faults::CohesiveKinDataLine2::_residual[] = {
    0.0,
-   7.5, // 3
+  +7.5, // 3
    0.0,
-   -7.5, // 5
+  -7.5, // 5
   -0.2+1.89546413727,
 };
 
@@ -154,10 +154,10 @@
 
 const double pylith::faults::CohesiveKinDataLine2::_fieldIncrAdjusted[] = {
   1.1,
-  -3.09368089375, // 3
+  0.419757841424, // 3
   1.3,
-  5.33587415261, // 5
-  -9.44609796626, // 6
+  2.11522197869, // 5
+  -1.71653274887, // 6
 };
 
 pylith::faults::CohesiveKinDataLine2::CohesiveKinDataLine2(void)

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -58,24 +58,24 @@
 
 const int pylith::faults::CohesiveKinDataQuad4::_numBasis = 2;
 
-const int pylith::faults::CohesiveKinDataQuad4::_numQuadPts = 1;
+const int pylith::faults::CohesiveKinDataQuad4::_numQuadPts = 2;
 
 const double pylith::faults::CohesiveKinDataQuad4::_quadPts[] = {
-  0.0,
+  -1.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinDataQuad4::_quadWts[] = {
-  2.0,
+  1.0, 1.0
 };
 
 const double pylith::faults::CohesiveKinDataQuad4::_basis[] = {
-  0.5,
-  0.5
+  1.0, 0.0,
+  0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinDataQuad4::_basisDeriv[] = {
-  -0.5,
-   0.5
+  -0.5, 0.5,
+  -0.5, 0.5,
 };
 
 const double pylith::faults::CohesiveKinDataQuad4::_verticesRef[] = {
@@ -130,7 +130,7 @@
   1.6, 1.6,
   1.7, 1.7, // 8
   1.9, 1.9, // 9
-  1.8, 1.8, // 10
+  1.0, 1.0, // 10
   1.0, 1.0, // 11
 };
 
@@ -171,27 +171,31 @@
 const double pylith::faults::CohesiveKinDataQuad4::_residual[] = {
   0.0,  0.0,
   0.0,  0.0,
-  9.8,  8.8, // 4
-  9.0,  8.0, // 5
+ +8.8, +9.8, // 4
+ +8.0, +9.0, // 5
   0.0,  0.0,
   0.0,  0.0,
- -9.8, -8.8, // 8
- -9.0, -8.0, // 9
- -0.4+1.77538035254, -0.4+0.14794836271, // 10
- -0.5+1.89546413727, -0.5+0.08241148423, // 11
+ -8.8, -9.8, // 8
+ -8.0, -9.0, // 9
+  -(8.7-8.3) + 0.14794836271,
+  -(9.7-9.3) + 1.77538035254, // 10
+  -(8.9-8.4) + 0.08241148423,
+  -(9.9-9.4) + 1.89546413727, // 11
 };
 
 const double pylith::faults::CohesiveKinDataQuad4::_residualIncr[] = {
   0.0,  0.0,
   0.0,  0.0,
-  9.8,  8.8, // 4
-  9.0,  8.0, // 5
+ +8.8, +9.8, // 4
+ +8.0, +9.0, // 5
   0.0,  0.0,
   0.0,  0.0,
- -9.8, -8.8, // 8
- -9.0, -8.0, // 9
- -0.4+1.77538035254, -0.4+0.14794836271, // 10
- -0.5+1.89546413727, -0.5+0.08241148423, // 11
+ -8.8, -9.8, // 8
+ -8.0, -9.0, // 9
+  -(8.7-8.3) + 0.14794836271,
+  -(9.7-9.3) + 1.77538035254, // 10
+  -(8.9-8.4) + 0.08241148423,
+  -(9.9-9.4) + 1.89546413727, // 11
 };
 
 const double pylith::faults::CohesiveKinDataQuad4::_jacobian[] = {
@@ -243,7 +247,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 10
+ -1.0, 0.0, // 10
   0.0, 0.0,
   0.0, 0.0, // 4y
   0.0, 0.0,
@@ -253,7 +257,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  10
+  0.0,-1.0, // 10
   0.0, 0.0,
   0.0, 0.0, // 5x
   0.0, 0.0,
@@ -264,7 +268,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  11
+ -1.0, 0.0, // 11
   0.0, 0.0, // 5y
   0.0, 0.0,
   0.0, 0.0,
@@ -274,7 +278,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  11
+  0.0,-1.0, // 11
   0.0, 0.0, // 6x
   0.0, 0.0,
   0.0, 0.0,
@@ -323,7 +327,7 @@
   0.0, 0.0, 
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, //  10
+ +1.0, 0.0, // 10
   0.0, 0.0,
   0.0, 0.0, // 8y
   0.0, 0.0,
@@ -333,7 +337,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 10
+  0.0,+1.0, // 10
   0.0, 0.0,
   0.0, 0.0, // 9x
   0.0, 0.0,
@@ -344,7 +348,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 11
+ +1.0, 0.0, // 11
   0.0, 0.0, // 9y
   0.0, 0.0,
   0.0, 0.0,
@@ -354,45 +358,45 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 11
+  0.0,+1.0, // 11
   0.0, 0.0, // 10x
   0.0, 0.0,
-  0.0,-1.0, //  4
+ -1.0, 0.0, // 4
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, //  8
+ +1.0, 0.0, // 8
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 10y
   0.0, 0.0,
- -1.0, 0.0, //  4
+  0.0,-1.0, // 4
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, //  8
+  0.0,+1.0, // 8
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 11x
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  5
+ -1.0, 0.0, // 5
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, //  9
+ +1.0, 0.0, // 9
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 11y
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  5
+  0.0,-1.0, // 5
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 9
+  0.0,+1.0, // 9
   0.0, 0.0,
   0.0, 0.0,
 };
@@ -400,14 +404,14 @@
 const double pylith::faults::CohesiveKinDataQuad4::_fieldIncrAdjusted[] = {
   3.1, 4.1,
   3.2, 4.2,
-  -4.09563227733, -3.248612969, // 4
-  -2.78814167707, -2.11773476302, // 5
+  3.6694959278, 3.74728446689, // 4
+  3.92830853938, 3.88442973915, // 5
   3.5, 4.5,
   3.6, 4.6,
-  9.35548350619, 10.472468741, // 8
-  8.459683341, 9.70254140433, // 9
-  -9.8131968597, -9.61432196053, // 10
-  -9.12482866822, -8.66339834789, // 11
+  3.41744429051, 5.12266481943, // 8
+  3.51072002361, 5.27989387642, // 9
+  0.480344706137, -0.718530193038, // 10
+  0.739631955136, -0.721798365193, // 11
 };
 
 pylith::faults::CohesiveKinDataQuad4::CohesiveKinDataQuad4(void)

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4e.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4e.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4e.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -77,24 +77,24 @@
 
 const int pylith::faults::CohesiveKinDataQuad4e::_numBasis = 2;
 
-const int pylith::faults::CohesiveKinDataQuad4e::_numQuadPts = 1;
+const int pylith::faults::CohesiveKinDataQuad4e::_numQuadPts = 2;
 
 const double pylith::faults::CohesiveKinDataQuad4e::_quadPts[] = {
-  0.0,
+  -1.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinDataQuad4e::_quadWts[] = {
-  2.0,
+  1.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinDataQuad4e::_basis[] = {
-  0.5,
-  0.5
+  1.0, 0.0,
+  0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinDataQuad4e::_basisDeriv[] = {
-  -0.5,
-   0.5
+  -0.5, 0.5,
+  -0.5, 0.5,
 };
 
 const double pylith::faults::CohesiveKinDataQuad4e::_verticesRef[] = {
@@ -134,6 +134,45 @@
 
 
 
+const double pylith::faults::CohesiveKinDataQuad4e::_fieldIncr[] = {
+  6.1, 4.1,
+  6.2, 4.2,
+  6.3, 4.3, // 6
+  6.4, 4.4, // 7
+  6.5, 4.5,
+  6.6, 4.6,
+  6.7, 4.7,
+  6.8, 4.8, // 11
+  6.9, 4.9,
+  6.0, 4.0, // 13
+  5.2, 3.2, // 14
+  5.4, 3.4, // 15
+  5.1, 3.1, // 16
+  5.3, 3.3, // 17
+  5.5, 3.5, // 18
+};
+
+
+const double pylith::faults::CohesiveKinDataQuad4e::_jacobianLumped[] = {
+  1.1, 7.1,
+  1.2, 7.2,
+  1.3, 7.3, // 6
+  1.4, 7.4, // 7
+  1.5, 7.5,
+  1.6, 7.6,
+  1.7, 7.7,
+  1.8, 7.8, // 11
+  1.9, 7.9,
+  1.0, 7.0, // 13
+  2.2, 3.2, // 14
+  2.4, 3.4, // 15
+  1.0, 1.0, // 16
+  1.0, 1.0, // 17
+  1.0, 1.0, // 18
+};
+
+
+
 const double pylith::faults::CohesiveKinDataQuad4e::_orientation[] = {
   0.0, -1.0,  -1.0, 0.0,
   0.0, -1.0,  -1.0, 0.0,
@@ -172,37 +211,43 @@
 const double pylith::faults::CohesiveKinDataQuad4e::_residual[] = {
   0.0,  0.0,
   0.0,  0.0,
- -6.1, -4.1, // 6
- -6.3, -4.3, // 7
+ +1.0*4.1, +1.0*6.1, // 6
+ +2.0*4.3, +2.0*6.3, // 7
   0.0,  0.0,
   0.0,  0.0,
   0.0,  0.0,
- -6.5, -4.5, // 11
+ +1.0*4.5, +1.0*6.5, // 11
   0.0,  0.0,
- +6.1, +4.1, // 13
- +6.3, +4.3, // 15
- +6.5, +4.5, // 17
- -0.3+1.77538035254, -0.3+0.14794836271, // 16
-  0.8+1.89546413727,  0.8+0.08241148423, // 17
-  0.6+1.59887481971,  0.6+0.19186497837, // 18
+ -1.0*4.1, -1.0*6.1, // 13
+ -2.0*4.3, -2.0*6.3, // 14
+ -1.0*4.5, -1.0*6.5, // 15
+ -1.0*(3.0-3.3 + 0.14794836271),
+ -1.0*(5.0-5.3 + 1.77538035254), // 16
+ -2.0*(4.2-3.4 + 0.08241148423),
+ -2.0*(6.2-5.4 + 1.89546413727), // 17
+ -1.0*(4.4-3.8 + 0.19186497837),
+ -1.0*(6.4-5.8 + 1.59887481971), // 18
 };
 
 const double pylith::faults::CohesiveKinDataQuad4e::_residualIncr[] = {
   0.0,  0.0,
   0.0,  0.0,
- -6.1, -4.1, // 6
- -6.3, -4.3, // 7
+ +1.0*4.1, +1.0*6.1, // 6
+ +2.0*4.3, +2.0*6.3, // 7
   0.0,  0.0,
   0.0,  0.0,
   0.0,  0.0,
- -6.5, -4.5, // 11
+ +1.0*4.5, +1.0*6.5, // 11
   0.0,  0.0,
- +6.1, +4.1, // 13
- +6.3, +4.3, // 15
- +6.5, +4.5, // 17
- -0.3+1.77538035254, -0.3+0.14794836271, // 16
-  0.8+1.89546413727,  0.8+0.08241148423, // 17
-  0.6+1.59887481971,  0.6+0.19186497837, // 18
+ -1.0*4.1, -1.0*6.1, // 13
+ -2.0*4.3, -2.0*6.3, // 14
+ -1.0*4.5, -1.0*6.5, // 15
+ -1.0*(3.0-3.3 + 0.14794836271),
+ -1.0*(5.0-5.3 + 1.77538035254), // 16
+ -2.0*(4.2-3.4 + 0.08241148423),
+ -2.0*(6.2-5.4 + 1.89546413727), // 17
+ -1.0*(4.4-3.8 + 0.19186497837),
+ -1.0*(6.4-5.8 + 1.59887481971), // 18
 };
 
 const double pylith::faults::CohesiveKinDataQuad4e::_jacobian[] = {
@@ -278,7 +323,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 16
+ -1.0, 0.0, // 16
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 6y
@@ -293,7 +338,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 16
+  0.0,-1.0, // 16
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 7x
@@ -309,7 +354,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 17
+ -2.0, 0.0, // 17
   0.0, 0.0,
   0.0, 0.0, // 7y
   0.0, 0.0,
@@ -324,7 +369,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 17
+  0.0,-2.0, // 17
   0.0, 0.0,
   0.0, 0.0, // 8x
   0.0, 0.0,
@@ -430,7 +475,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 18
+ -1.0, 0.0, // 18
   0.0, 0.0, // 11y
   0.0, 0.0,
   0.0, 0.0,
@@ -445,7 +490,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 18
+  0.0,-1.0, // 18
   0.0, 0.0, // 12x
   0.0, 0.0,
   0.0, 0.0,
@@ -488,7 +533,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 16
+ +1.0, 0.0, // 16
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 13y
@@ -503,7 +548,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, // 16
+  0.0,+1.0, // 16
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 14x
@@ -519,7 +564,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 17
+ +2.0, 0.0, // 17
   0.0, 0.0,
   0.0, 0.0, // 14y
   0.0, 0.0,
@@ -534,7 +579,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, // 17
+  0.0,+2.0, // 17
   0.0, 0.0,
   0.0, 0.0, // 15x
   0.0, 0.0,
@@ -550,7 +595,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 18
+ +1.0, 0.0, // 18
   0.0, 0.0, // 15y
   0.0, 0.0,
   0.0, 0.0,
@@ -565,17 +610,17 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, // 18
+  0.0,+1.0, // 18
   0.0, 0.0, // 16x
   0.0, 0.0,
-  0.0,+1.0, // 6
+ -1.0, 0.0, // 6
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 13
+ +1.0, 0.0, // 13
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
@@ -583,14 +628,14 @@
   0.0, 0.0,
   0.0, 0.0, // 16y
   0.0, 0.0,
- +1.0, 0.0, // 6
+  0.0,-1.0, // 6
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, // 13
+  0.0,+1.0, // 13
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
@@ -599,14 +644,14 @@
   0.0, 0.0, // 17x
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 7
+ -2.0, 0.0, // 7
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 14
+ +2.0, 0.0, // 14
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
@@ -614,14 +659,14 @@
   0.0, 0.0, // 17y
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 7
+  0.0,-2.0, // 7
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, // 14
+  0.0,+2.0, // 14
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
@@ -633,11 +678,11 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 11
+ -1.0, 0.0, // 11
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 15
+ +1.0, 0.0, // 15
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
@@ -648,11 +693,11 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 11
+  0.0,-1.0, // 11
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, // 15
+  0.0,+1.0, // 15
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
@@ -676,6 +721,8 @@
   slipTimeFilename = const_cast<char*>(_slipTimeFilename);
   riseTimeFilename = const_cast<char*>(_riseTimeFilename);
   fieldT = const_cast<double*>(_fieldT);
+  fieldIncr = const_cast<double*>(_fieldIncr);
+  jacobianLumped = const_cast<double*>(_jacobianLumped);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
   residual = const_cast<double*>(_residual);

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4e.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4e.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataQuad4e.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -64,6 +64,8 @@
   //@}
 
   static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldIncr[]; ///< Solution increment field over domain at time t.
+  static const double _jacobianLumped[]; ///< Lumped Jacobian.
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -44,24 +44,34 @@
 
 const int pylith::faults::CohesiveKinDataTet4::_numBasis = 3;
 
-const int pylith::faults::CohesiveKinDataTet4::_numQuadPts = 1;
+const int pylith::faults::CohesiveKinDataTet4::_numQuadPts = 3;
 
 const double pylith::faults::CohesiveKinDataTet4::_quadPts[] = {
-  -3.33333333e-01,  -3.33333333e-01,
+ -1.00000000e+00, -1.00000000e+00,
+  1.00000000e+00, -1.00000000e+00,
+ -1.00000000e+00,  1.00000000e+00,
 };
 
 const double pylith::faults::CohesiveKinDataTet4::_quadWts[] = {
-  2.0,
+  2.0/3.0, 2.0/3.0, 2.0/3.0,
 };
 
 const double pylith::faults::CohesiveKinDataTet4::_basis[] = {
-  3.33333333e-01,  3.33333333e-01,
-  3.33333333e-01,};
+  1.0, 0.0, 0.0,
+  0.0, 1.0, 0.0,
+  0.0, 0.0, 1.0,
+};
 
 const double pylith::faults::CohesiveKinDataTet4::_basisDeriv[] = {
  -0.50000000e+00, -0.50000000e+00,
   0.50000000e+00,  0.00000000e+00,
   0.00000000e+00,  0.50000000e+00,
+ -0.50000000e+00, -0.50000000e+00,
+  0.50000000e+00,  0.00000000e+00,
+  0.00000000e+00,  0.50000000e+00,
+ -0.50000000e+00, -0.50000000e+00,
+  0.50000000e+00,  0.00000000e+00,
+  0.00000000e+00,  0.50000000e+00,
 };
 
 const double pylith::faults::CohesiveKinDataTet4::_verticesRef[] = {
@@ -120,9 +130,9 @@
   1.6, 1.6, 1.6, // 7
   1.8, 1.8, 1.8, // 8
   1.0, 1.0, 1.0, // 9
-  1.7, 1.7, 1.7, // 10
-  1.9, 1.9, 1.9, // 11
-  1.1, 1.1, 1.1, // 12
+  1.0, 1.0, 1.0, // 10
+  1.0, 1.0, 1.0, // 11
+  1.0, 1.0, 1.0, // 12
 };
 
 const int pylith::faults::CohesiveKinDataTet4::_numFaultVertices = 3;
@@ -163,30 +173,42 @@
 
 const double pylith::faults::CohesiveKinDataTet4::_residual[] = {
   0.0,  0.0,  0.0,
-  9.7,  7.7,  8.7, // 3
-  9.9,  7.9,  8.9, // 4
-  9.1,  7.1,  8.1, // 5
+   +7.7/3.0,  +8.7/3.0,  +9.7/3.0, // 3
+  +7.9/3.0,  +8.9/3.0,  +9.9/3.0, // 4
+  +7.1/3.0,  +8.1/3.0,  +9.1/3.0, // 5
   0.0,  0.0,  0.0,
- -9.7, -7.7, -8.7, // 7
- -9.9, -7.9, -8.9, // 4
- -9.1, -7.1, -8.1, // 5
- -0.4+1.82575588523, -0.4+-0.55566483464, -0.4+0.07938069066, // 10
- -0.5+1.69682900001, -0.5+-0.56560966667, -0.5+0.14140241667, // 11
-  0.4+1.51709826228,  0.4+-0.54615537442,  0.4+0.18205179147, // 12
+  -7.7/3.0,  -8.7/3.0,  -9.7/3.0, // 7
+  -7.9/3.0,  -8.9/3.0,  -9.9/3.0, // 8
+  -7.1/3.0,  -8.1/3.0,  -9.1/3.0, // 9
+  -1.0/3.0*(7.6-7.2 + -0.07938069066),
+  -1.0/3.0*(8.6-8.2 + -1.82575588523),
+  -1.0/3.0*(9.6-9.2 + 0.55566483464), // 10
+  -1.0/3.0*(7.8-7.3 + -0.14140241667),
+  -1.0/3.0*(8.8-8.3 + -1.69682900001),
+  -1.0/3.0*(9.8-9.3 + 0.56560966667), // 11
+  -1.0/3.0*(7.0-7.4 + -0.18205179147),
+  -1.0/3.0*(8.0-8.4 + -1.51709826228),
+  -1.0/3.0*(9.0-9.4 + 0.54615537442), // 12
 };
 
 const double pylith::faults::CohesiveKinDataTet4::_residualIncr[] = {
   0.0,  0.0,  0.0,
-  9.7,  7.7,  8.7, // 3
-  9.9,  7.9,  8.9, // 4
-  9.1,  7.1,  8.1, // 5
+   +7.7/3.0,  +8.7/3.0,  +9.7/3.0, // 3
+  +7.9/3.0,  +8.9/3.0,  +9.9/3.0, // 4
+  +7.1/3.0,  +8.1/3.0,  +9.1/3.0, // 5
   0.0,  0.0,  0.0,
- -9.7, -7.7, -8.7, // 7
- -9.9, -7.9, -8.9, // 4
- -9.1, -7.1, -8.1, // 5
- -0.4+1.82575588523, -0.4+-0.55566483464, -0.4+0.07938069066, // 10
- -0.5+1.69682900001, -0.5+-0.56560966667, -0.5+0.14140241667, // 11
-  0.4+1.51709826228,  0.4+-0.54615537442,  0.4+0.18205179147, // 12
+  -7.7/3.0,  -8.7/3.0,  -9.7/3.0, // 7
+  -7.9/3.0,  -8.9/3.0,  -9.9/3.0, // 8
+  -7.1/3.0,  -8.1/3.0,  -9.1/3.0, // 9
+  -1.0/3.0*(7.6-7.2 + -0.07938069066),
+  -1.0/3.0*(8.6-8.2 + -1.82575588523),
+  -1.0/3.0*(9.6-9.2 + 0.55566483464), // 10
+  -1.0/3.0*(7.8-7.3 + -0.14140241667),
+  -1.0/3.0*(8.8-8.3 + -1.69682900001),
+  -1.0/3.0*(9.8-9.3 + 0.56560966667), // 11
+  -1.0/3.0*(7.0-7.4 + -0.18205179147),
+  -1.0/3.0*(8.0-8.4 + -1.51709826228),
+  -1.0/3.0*(9.0-9.4 + 0.54615537442), // 12
 };
 
 const double pylith::faults::CohesiveKinDataTet4::_jacobian[] = {
@@ -231,7 +253,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 10
+ -1.0/3.0, 0.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 3y
@@ -242,7 +264,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 10
+  0.0,-1.0/3.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 3z
@@ -253,7 +275,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 10
+  0.0, 0.0,-1.0/3.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 4x
@@ -265,7 +287,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 11
+ -1.0/3.0, 0.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 4y
   0.0, 0.0, 0.0,
@@ -276,7 +298,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 11
+  0.0,-1.0/3.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 4z
   0.0, 0.0, 0.0,
@@ -287,7 +309,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 11
+  0.0, 0.0,-1.0/3.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 5x
   0.0, 0.0, 0.0,
@@ -299,7 +321,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 12
+ -1.0/3.0, 0.0, 0.0, // 12
   0.0, 0.0, 0.0, // 5y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -310,7 +332,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 12
+  0.0,-1.0/3.0, 0.0, // 12
   0.0, 0.0, 0.0, // 5z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -321,7 +343,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 12
+  0.0, 0.0,-1.0/3.0, // 12
   0.0, 0.0, 0.0, // 6x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -363,7 +385,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 10
+ +1.0/3.0, 0.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7y
@@ -374,7 +396,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 10
+  0.0,+1.0/3.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7z
@@ -385,7 +407,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 10
+  0.0, 0.0,+1.0/3.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8x
@@ -397,7 +419,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 11
+ +1.0/3.0, 0.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8y
   0.0, 0.0, 0.0,
@@ -408,7 +430,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 11
+  0.0,+1.0/3.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8z
   0.0, 0.0, 0.0,
@@ -419,7 +441,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 11
+  0.0, 0.0,+1.0/3.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 9x
   0.0, 0.0, 0.0,
@@ -431,7 +453,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 12
+ +1.0/3.0, 0.0, 0.0, // 12
   0.0, 0.0, 0.0, // 9y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -442,7 +464,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 12
+  0.0,+1.0/3.0, 0.0, // 12
   0.0, 0.0, 0.0, // 9z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -453,35 +475,35 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 12
+  0.0, 0.0,+1.0/3.0, // 12
   0.0, 0.0, 0.0, // 10x
-  0.0,-1.0, 0.0, // 3
+ -1.0/3.0, 0.0, 0.0, // 3
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 7
+ +1.0/3.0, 0.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 10y
-  0.0, 0.0,-1.0, // 3
+  0.0,-1.0/3.0, 0.0, // 3
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 7
+  0.0,+1.0/3.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 10z
- -1.0, 0.0, 0.0, // 3
+  0.0, 0.0,-1.0/3.0, // 3
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 7
+  0.0, 0.0,+1.0/3.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -489,33 +511,33 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11x
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 4
+ -1.0/3.0, 0.0, 0.0, // 4
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 8
+ +1.0/3.0, 0.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11y
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 4
+  0.0,-1.0/3.0, 0.0, // 4
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 8
+  0.0,+1.0/3.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11z
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 4
+  0.0, 0.0,-1.0/3.0, // 4
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 8
+  0.0, 0.0,+1.0/3.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -523,33 +545,33 @@
   0.0, 0.0, 0.0, // 12x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 5
+ -1.0/3.0, 0.0, 0.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 9
+ +1.0/3.0, 0.0, 0.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 12y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 5
+  0.0,-1.0/3.0, 0.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 9
+  0.0,+1.0/3.0, 0.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 12z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 5
+  0.0, 0.0,-1.0/3.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 9
+  0.0, 0.0,+1.0/3.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -557,16 +579,16 @@
 
 const double pylith::faults::CohesiveKinDataTet4::_fieldIncrAdjusted[] = {
   3.1, 4.1, 5.1,
-  -4.70012229942, -3.03138431537, -1.50390580878, // 3
-  -4.10716666377, -2.47185604467, -0.927412749378, // 4
-  -3.34252157978, -1.47021951405, -0.324816213039, // 5
+  3.61178246248, 3.61385377987, 5.97466561979, // 3
+  3.79854053226, 3.8953896129, 6.20906367742, // 4
+  2.99081175355, 3.43454239072, 5.29423140601, // 5
   3.5, 4.5, 5.5,
-  9.52509172457, 10.0235382365, 10.6279293566, // 7
-  9.14962036828, 9.69078492115, 10.2975758746, // 8
-  12.4395302117, 12.2183073197, 13.0147426983, // 9
-  -8.67766117844, -8.04468697053, -9.48014675931, // 10
-  -8.80341285807, -8.09563657419, -9.62931666291, // 11
-  -8.21830731966, -8.01474269826, -9.43953021169, // 12
+  3.29116315314, 5.0396096651, 5.01900078515, // 7
+  3.43994294893, 5.09221861291, 5.14345401075, // 8
+  3.57286354502, 5.351640653, 5.14807603159, // 9
+  1.48241686493, -2.11012639247, 2.78879623126, // 10
+  1.9443080758, -1.5779805097, 3.54534834194, // 11
+  -1.71859063507, -4.05492195899, -0.444228094765, // 12
 };
 
 pylith::faults::CohesiveKinDataTet4::CohesiveKinDataTet4(void)

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4e.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4e.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4e.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -44,24 +44,34 @@
 
 const int pylith::faults::CohesiveKinDataTet4e::_numBasis = 3;
 
-const int pylith::faults::CohesiveKinDataTet4e::_numQuadPts = 1;
+const int pylith::faults::CohesiveKinDataTet4e::_numQuadPts = 3;
 
 const double pylith::faults::CohesiveKinDataTet4e::_quadPts[] = {
-  -3.33333333e-01,  -3.33333333e-01,
+ -1.00000000e+00, -1.00000000e+00,
+  1.00000000e+00, -1.00000000e+00,
+ -1.00000000e+00,  1.00000000e+00,
 };
 
 const double pylith::faults::CohesiveKinDataTet4e::_quadWts[] = {
-  2.0,
+  2.0/3.0, 2.0/3.0, 2.0/3.0,
 };
 
 const double pylith::faults::CohesiveKinDataTet4e::_basis[] = {
-  3.33333333e-01,  3.33333333e-01,
-  3.33333333e-01,};
+  1.0, 0.0, 0.0,
+  0.0, 1.0, 0.0,
+  0.0, 0.0, 1.0,
+};
 
 const double pylith::faults::CohesiveKinDataTet4e::_basisDeriv[] = {
  -0.50000000e+00, -0.50000000e+00,
   0.50000000e+00,  0.00000000e+00,
   0.00000000e+00,  0.50000000e+00,
+ -0.50000000e+00, -0.50000000e+00,
+  0.50000000e+00,  0.00000000e+00,
+  0.00000000e+00,  0.50000000e+00,
+ -0.50000000e+00, -0.50000000e+00,
+  0.50000000e+00,  0.00000000e+00,
+  0.00000000e+00,  0.50000000e+00,
 };
 
 const double pylith::faults::CohesiveKinDataTet4e::_verticesRef[] = {
@@ -100,7 +110,41 @@
   4.4, 6.4, 8.4, // 17
 };
 
+const double pylith::faults::CohesiveKinDataTet4e::_fieldIncr[] = {
+  6.1, 7.1, 2.1,
+  6.2, 7.2, 2.2, // 5
+  6.3, 7.3, 2.3, // 6
+  6.4, 7.4, 2.4, // 7
+  6.5, 7.5, 2.5, // 8
+  6.6, 7.6, 2.6,
+  6.7, 7.7, 2.7, // 10
+  6.9, 7.9, 2.9, // 11
+  5.1, 8.1, 1.1, // 12
+  5.3, 8.3, 1.3, // 13
+  4.8, 8.8, 2.8, // 14
+  4.0, 8.0, 2.0, // 15
+  5.2, 8.2, 1.2, // 16
+  5.4, 8.4, 1.4, // 17
+};
 
+const double pylith::faults::CohesiveKinDataTet4e::_jacobianLumped[] = {
+  4.1, 6.1, 8.1,
+  4.2, 6.2, 8.2, // 5
+  4.3, 6.3, 8.3, // 6
+  4.4, 6.4, 8.4, // 7
+  4.5, 6.5, 8.5, // 8
+  4.6, 6.6, 8.6,
+  4.7, 6.7, 8.7, // 10
+  4.9, 6.9, 8.9, // 11
+  3.1, 5.1, 7.1, // 12
+  3.3, 5.3, 7.3, // 13
+  1.0, 1.0, 1.0, // 14
+  1.0, 1.0, 1.0, // 15
+  1.0, 1.0, 1.0, // 16
+  1.0, 1.0, 1.0, // 17
+};
+
+
 const double pylith::faults::CohesiveKinDataTet4e::_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,
@@ -141,36 +185,60 @@
 
 const double pylith::faults::CohesiveKinDataTet4e::_residual[] = {
   0.0,  0.0,  0.0,
-  7.8,  3.8,  5.8, // 5
-  7.0,  3.0,  5.0, // 6
-  8.2,  4.2,  6.2, // 7
-  8.4,  4.4,  6.4, // 8
+  +2.0/3.0*3.8, +2.0/3.0*5.8, +2.0/3.0*7.8, // 5
+  +1.0/3.0*3.0, +1.0/3.0*5.0, +1.0/3.0*7.0, // 6
+  +2.0/3.0*4.2, +2.0/3.0*6.2, +2.0/3.0*8.2, // 7
+  +1.0/3.0*4.4, +1.0/3.0*6.4, +1.0/3.0*8.4, // 8
   0.0,  0.0,  0.0,
- -7.8, -3.8, -5.8, // 10
- -7.0, -3.0, -5.0, // 11
- -8.2, -4.2, -6.2, // 12
- -8.4, -4.4, -6.4, // 13
- -0.5+1.82575588523, -0.5+-0.55566483464, -0.5+0.07938069066, // 14
- -0.6+1.69682900001, -0.6+-0.56560966667, -0.6+0.14140241667, // 15
- -0.7+1.51709826228, -0.7-0.54615537442, -0.7+0.18205179147, // 16
- -0.8+1.29378670385, -0.8-0.49761027071, -0.8+0.19904410828, // 17
+  -2.0/3.0*3.8, -2.0/3.0*5.8, -2.0/3.0*7.8, // 10
+  -1.0/3.0*3.0, -1.0/3.0*5.0, -1.0/3.0*7.0, // 11
+  -2.0/3.0*4.2, -2.0/3.0*6.2, -2.0/3.0*8.2, // 12
+  -1.0/3.0*4.4, -1.0/3.0*6.4, -1.0/3.0*8.4, // 13
+
+  -2.0/3.0*(3.7-3.2 + -0.07938069066),
+  -2.0/3.0*(5.7-5.2 + -1.82575588523),
+  -2.0/3.0*(7.7-7.2 + 0.55566483464), // 14
+
+  -1.0/3.0*(3.9-3.3 + -0.14140241667),
+  -1.0/3.0*(5.9-5.3 + -1.69682900001),
+  -1.0/3.0*(7.9-7.3 + 0.56560966667), // 15
+
+  -2.0/3.0*(4.1-3.4 + -0.18205179147),
+  -2.0/3.0*(6.1-5.4 + -1.51709826228),
+  -2.0/3.0*(8.1-7.4 + 0.54615537442), // 16
+
+  -1.0/3.0*(4.3-3.5 + -0.19904410828),
+  -1.0/3.0*(6.3-5.5 + -1.29378670385),
+  -1.0/3.0*(8.3-7.5 + 0.49761027071), // 17
 };
 
 const double pylith::faults::CohesiveKinDataTet4e::_residualIncr[] = {
   0.0,  0.0,  0.0,
-  7.8,  3.8,  5.8, // 5
-  7.0,  3.0,  5.0, // 6
-  8.2,  4.2,  6.2, // 7
-  8.4,  4.4,  6.4, // 8
+  +2.0/3.0*3.8, +2.0/3.0*5.8, +2.0/3.0*7.8, // 5
+  +1.0/3.0*3.0, +1.0/3.0*5.0, +1.0/3.0*7.0, // 6
+  +2.0/3.0*4.2, +2.0/3.0*6.2, +2.0/3.0*8.2, // 7
+  +1.0/3.0*4.4, +1.0/3.0*6.4, +1.0/3.0*8.4, // 8
   0.0,  0.0,  0.0,
- -7.8, -3.8, -5.8, // 10
- -7.0, -3.0, -5.0, // 11
- -8.2, -4.2, -6.2, // 12
- -8.4, -4.4, -6.4, // 13
- -0.5+1.82575588523, -0.5+-0.55566483464, -0.5+0.07938069066, // 14
- -0.6+1.69682900001, -0.6+-0.56560966667, -0.6+0.14140241667, // 15
- -0.7+1.51709826228, -0.7-0.54615537442, -0.7+0.18205179147, // 16
- -0.8+1.29378670385, -0.8-0.49761027071, -0.8+0.19904410828, // 17
+  -2.0/3.0*3.8, -2.0/3.0*5.8, -2.0/3.0*7.8, // 10
+  -1.0/3.0*3.0, -1.0/3.0*5.0, -1.0/3.0*7.0, // 11
+  -2.0/3.0*4.2, -2.0/3.0*6.2, -2.0/3.0*8.2, // 12
+  -1.0/3.0*4.4, -1.0/3.0*6.4, -1.0/3.0*8.4, // 13
+
+  -2.0/3.0*(3.7-3.2 + -0.07938069066),
+  -2.0/3.0*(5.7-5.2 + -1.82575588523),
+  -2.0/3.0*(7.7-7.2 + 0.55566483464), // 14
+
+  -1.0/3.0*(3.9-3.3 + -0.14140241667),
+  -1.0/3.0*(5.9-5.3 + -1.69682900001),
+  -1.0/3.0*(7.9-7.3 + 0.56560966667), // 15
+
+  -2.0/3.0*(4.1-3.4 + -0.18205179147),
+  -2.0/3.0*(6.1-5.4 + -1.51709826228),
+  -2.0/3.0*(8.1-7.4 + 0.54615537442), // 16
+
+  -1.0/3.0*(4.3-3.5 + -0.19904410828),
+  -1.0/3.0*(6.3-5.5 + -1.29378670385),
+  -1.0/3.0*(8.3-7.5 + 0.49761027071), // 17
 };
 
 const double pylith::faults::CohesiveKinDataTet4e::_jacobian[] = {
@@ -226,7 +294,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 14
+ -2.0/3.0, 0.0, 0.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -240,7 +308,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 14
+  0.0,-2.0/3.0, 0.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -254,7 +322,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 14
+  0.0, 0.0,-2.0/3.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -269,7 +337,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 15
+ -1.0/3.0, 0.0, 0.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 6y
@@ -283,7 +351,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 15
+  0.0,-1.0/3.0, 0.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 6z
@@ -297,7 +365,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 15
+  0.0, 0.0,-1.0/3.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7x
@@ -312,7 +380,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 16
+ -2.0/3.0, 0.0, 0.0, // 16
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7y
   0.0, 0.0, 0.0,
@@ -326,7 +394,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 16
+  0.0,-2.0/3.0, 0.0, // 16
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7z
   0.0, 0.0, 0.0,
@@ -340,7 +408,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 16
+  0.0, 0.0,-2.0/3.0, // 16
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8x
   0.0, 0.0, 0.0,
@@ -355,7 +423,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 17
+ -1.0/3.0, 0.0, 0.0, // 17
   0.0, 0.0, 0.0, // 8y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -369,7 +437,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 17
+  0.0,-1.0/3.0, 0.0, // 17
   0.0, 0.0, 0.0, // 8z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -383,7 +451,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 17
+  0.0, 0.0,-1.0/3.0, // 17
   0.0, 0.0, 0.0, // 9x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -436,7 +504,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 14
+ +2.0/3.0, 0.0, 0.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -450,7 +518,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 14
+  0.0,+2.0/3.0, 0.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -464,7 +532,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 14
+  0.0, 0.0,+2.0/3.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -479,7 +547,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 15
+ +1.0/3.0, 0.0, 0.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11y
@@ -493,7 +561,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 15
+  0.0,+1.0/3.0, 0.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11z
@@ -507,7 +575,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 15
+  0.0, 0.0,+1.0/3.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 12x
@@ -522,7 +590,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 16
+ +2.0/3.0, 0.0, 0.0, // 16
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 12y
   0.0, 0.0, 0.0,
@@ -536,7 +604,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 16
+  0.0,+2.0/3.0, 0.0, // 16
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 12z
   0.0, 0.0, 0.0,
@@ -550,7 +618,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 16
+  0.0, 0.0,+2.0/3.0, // 16
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 13x
   0.0, 0.0, 0.0,
@@ -565,7 +633,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 17
+ +1.0/3.0, 0.0, 0.0, // 17
   0.0, 0.0, 0.0, // 13y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -579,7 +647,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 17
+  0.0,+1.0/3.0, 0.0, // 17
   0.0, 0.0, 0.0, // 13z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -593,14 +661,14 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 17
+  0.0, 0.0,+1.0/3.0, // 17
   0.0, 0.0, 0.0, // 14x
-  0.0,-1.0, 0.0, // 5
+ -2.0/3.0, 0.0, 0.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 10
+ +2.0/3.0, 0.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -609,12 +677,12 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 14y
-  0.0, 0.0,-1.0, // 5
+  0.0,-2.0/3.0, 0.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 10
+  0.0,+2.0/3.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -623,12 +691,12 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 14z
- -1.0, 0.0, 0.0, // 5
+  0.0, 0.0,-2.0/3.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 10
+  0.0, 0.0,+2.0/3.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -638,12 +706,12 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 15x
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 6
+ -1.0/3.0, 0.0, 0.0, // 6
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 11
+ +1.0/3.0, 0.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -652,12 +720,12 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 15y
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 6
+  0.0,-1.0/3.0, 0.0, // 6
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 11
+  0.0,+1.0/3.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -666,12 +734,12 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 15z
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 6
+  0.0, 0.0,-1.0/3.0, // 6
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 11
+  0.0, 0.0,+1.0/3.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -681,12 +749,12 @@
   0.0, 0.0, 0.0, // 16x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 7
+ -2.0/3.0, 0.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 12
+ +2.0/3.0, 0.0, 0.0, // 12
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -695,12 +763,12 @@
   0.0, 0.0, 0.0, // 16y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 7
+  0.0,-2.0/3.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 12
+  0.0,+2.0/3.0, 0.0, // 12
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -709,27 +777,27 @@
   0.0, 0.0, 0.0, // 16z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 7
+  0.0, 0.0,-2.0/3.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 12
+  0.0, 0.0,+2.0/3.0, // 12
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0, 0.0, // 17x
+  0.0, 0.0, 0.0,// 17x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 8
+ -1.0/3.0, 0.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 13
+ +1.0/3.0, 0.0, 0.0, // 13
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -738,12 +806,12 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 8
+  0.0,-1.0/3.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 13
+  0.0,+1.0/3.0, 0.0, // 13
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -752,12 +820,12 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 8
+  0.0, 0.0,-1.0/3.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 13
+  0.0, 0.0,+1.0/3.0, // 13
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -782,6 +850,8 @@
   slipTimeFilename = const_cast<char*>(_slipTimeFilename);
   riseTimeFilename = const_cast<char*>(_riseTimeFilename);
   fieldT = const_cast<double*>(_fieldT);
+  fieldIncr = const_cast<double*>(_fieldIncr);
+  jacobianLumped = const_cast<double*>(_jacobianLumped);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
   residual = const_cast<double*>(_residual);

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4e.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4e.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4e.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -64,6 +64,8 @@
   //@}
 
   static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldIncr[]; ///< Solution increment field over domain at time t.
+  static const double _jacobianLumped[]; ///< Lumped Jacobian.
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4f.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4f.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4f.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -44,24 +44,34 @@
 
 const int pylith::faults::CohesiveKinDataTet4f::_numBasis = 3;
 
-const int pylith::faults::CohesiveKinDataTet4f::_numQuadPts = 1;
+const int pylith::faults::CohesiveKinDataTet4f::_numQuadPts = 3;
 
 const double pylith::faults::CohesiveKinDataTet4f::_quadPts[] = {
-  -3.33333333e-01,  -3.33333333e-01,
+ -1.00000000e+00, -1.00000000e+00,
+  1.00000000e+00, -1.00000000e+00,
+ -1.00000000e+00,  1.00000000e+00,
 };
 
 const double pylith::faults::CohesiveKinDataTet4f::_quadWts[] = {
-  2.0,
+  2.0/3.0, 2.0/3.0, 2.0/3.0,
 };
 
 const double pylith::faults::CohesiveKinDataTet4f::_basis[] = {
-  3.33333333e-01,  3.33333333e-01,
-  3.33333333e-01,};
+  1.0, 0.0, 0.0,
+  0.0, 1.0, 0.0,
+  0.0, 0.0, 1.0,
+};
 
 const double pylith::faults::CohesiveKinDataTet4f::_basisDeriv[] = {
  -0.50000000e+00, -0.50000000e+00,
   0.50000000e+00,  0.00000000e+00,
   0.00000000e+00,  0.50000000e+00,
+ -0.50000000e+00, -0.50000000e+00,
+  0.50000000e+00,  0.00000000e+00,
+  0.00000000e+00,  0.50000000e+00,
+ -0.50000000e+00, -0.50000000e+00,
+  0.50000000e+00,  0.00000000e+00,
+  0.00000000e+00,  0.50000000e+00,
 };
 
 const double pylith::faults::CohesiveKinDataTet4f::_verticesRef[] = {
@@ -98,6 +108,34 @@
 };
 
 
+const double pylith::faults::CohesiveKinDataTet4f::_fieldIncr[] = {
+  3.1, 4.1, 5.1,
+  3.2, 4.2, 5.2, // 3
+  3.3, 4.3, 5.3, // 4
+  3.4, 4.4, 5.4, // 5
+  3.5, 4.5, 5.5,
+  3.6, 4.6, 5.6, // 7
+  3.8, 4.8, 5.8, // 8
+  3.0, 4.0, 5.0, // 9
+  3.7, 4.7, 5.7, // 10
+  3.9, 4.9, 5.9, // 11
+  3.1, 4.1, 5.1, // 12
+};
+
+const double pylith::faults::CohesiveKinDataTet4f::_jacobianLumped[] = {
+  1.1, 1.1, 1.1,
+  1.2, 1.2, 1.2, // 3
+  1.3, 1.3, 1.3, // 4
+  1.4, 1.4, 1.4, // 5
+  1.5, 1.5, 1.5,
+  1.6, 1.6, 1.6, // 7
+  1.8, 1.8, 1.8, // 8
+  1.0, 1.0, 1.0, // 9
+  1.0, 1.0, 1.0, // 10
+  1.0, 1.0, 1.0, // 11
+  1.0, 1.0, 1.0, // 12
+};
+
 const double pylith::faults::CohesiveKinDataTet4f::_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,
@@ -135,30 +173,42 @@
 
 const double pylith::faults::CohesiveKinDataTet4f::_residual[] = {
   0.0,  0.0,  0.0,
- -9.7, -7.7, +8.7, // 3
- -9.9, -7.9, +8.9, // 4
- -9.1, -7.1, +8.1, // 5
+   +7.7/3.0,  +8.7/3.0,  +9.7/3.0, // 3
+  +7.9/3.0,  +8.9/3.0,  +9.9/3.0, // 4
+  +7.1/3.0,  +8.1/3.0,  +9.1/3.0, // 5
   0.0,  0.0,  0.0,
- +9.7, +7.7, -8.7, // 7
- +9.9, +7.9, -8.9, // 8
- +9.1, +7.1, -8.1, // 9
-  0.4+1.82575588523,  -0.4+-0.55566483464,  0.4+0.07938069066, // 10
-  0.5+1.69682900001,  -0.5+-0.56560966667,  0.5+0.14140241667, // 11
- -0.4+1.51709826228,  +0.4+-0.54615537442, -0.4+0.18205179147, // 12
+  -7.7/3.0,  -8.7/3.0,  -9.7/3.0, // 7
+  -7.9/3.0,  -8.9/3.0,  -9.9/3.0, // 8
+  -7.1/3.0,  -8.1/3.0,  -9.1/3.0, // 9
+  -1.0/3.0*(7.6-7.2 +  0.07938069066),
+  -1.0/3.0*(8.6-8.2 +  1.82575588523),
+  -1.0/3.0*(9.6-9.2 +  0.55566483464), // 10
+  -1.0/3.0*(7.8-7.3 +  0.14140241667),
+  -1.0/3.0*(8.8-8.3 +  1.69682900001),
+  -1.0/3.0*(9.8-9.3 +  0.56560966667), // 11
+  -1.0/3.0*(7.0-7.4 +  0.18205179147),
+  -1.0/3.0*(8.0-8.4 +  1.51709826228),
+  -1.0/3.0*(9.0-9.4 +  0.54615537442), // 12
 };
 
 const double pylith::faults::CohesiveKinDataTet4f::_residualIncr[] = {
   0.0,  0.0,  0.0,
- -9.7, -7.7, +8.7, // 3
- -9.9, -7.9, +8.9, // 4
- -9.1, -7.1, +8.1, // 5
+   +7.7/3.0,  +8.7/3.0,  +9.7/3.0, // 3
+  +7.9/3.0,  +8.9/3.0,  +9.9/3.0, // 4
+  +7.1/3.0,  +8.1/3.0,  +9.1/3.0, // 5
   0.0,  0.0,  0.0,
- +9.7, +7.7, -8.7, // 7
- +9.9, +7.9, -8.9, // 8
- +9.1, +7.1, -8.1, // 9
-  0.4+1.82575588523, -0.4+-0.55566483464,  0.4+0.07938069066, // 10
-  0.5+1.69682900001, -0.5+-0.56560966667,  0.5+0.14140241667, // 11
- -0.4+1.51709826228, +0.4+-0.54615537442, -0.4+0.18205179147, // 12
+  -7.7/3.0,  -8.7/3.0,  -9.7/3.0, // 7
+  -7.9/3.0,  -8.9/3.0,  -9.9/3.0, // 8
+  -7.1/3.0,  -8.1/3.0,  -9.1/3.0, // 9
+  -1.0/3.0*(7.6-7.2 +  0.07938069066),
+  -1.0/3.0*(8.6-8.2 +  1.82575588523),
+  -1.0/3.0*(9.6-9.2 +  0.55566483464), // 10
+  -1.0/3.0*(7.8-7.3 +  0.14140241667),
+  -1.0/3.0*(8.8-8.3 +  1.69682900001),
+  -1.0/3.0*(9.8-9.3 +  0.56560966667), // 11
+  -1.0/3.0*(7.0-7.4 +  0.18205179147),
+  -1.0/3.0*(8.0-8.4 +  1.51709826228),
+  -1.0/3.0*(9.0-9.4 +  0.54615537442), // 12
 };
 
 const double pylith::faults::CohesiveKinDataTet4f::_jacobian[] = {
@@ -203,7 +253,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 10
+ -1.0/3.0, 0.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 3y
@@ -214,7 +264,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 10
+  0.0,-1.0/3.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 3z
@@ -225,7 +275,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 10
+  0.0, 0.0,-1.0/3.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 4x
@@ -237,7 +287,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 11
+ -1.0/3.0, 0.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 4y
   0.0, 0.0, 0.0,
@@ -248,7 +298,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 11
+  0.0,-1.0/3.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 4z
   0.0, 0.0, 0.0,
@@ -259,7 +309,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 11
+  0.0, 0.0,-1.0/3.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 5x
   0.0, 0.0, 0.0,
@@ -271,7 +321,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 12
+ -1.0/3.0, 0.0, 0.0, // 12
   0.0, 0.0, 0.0, // 5y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -282,7 +332,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 12
+  0.0,-1.0/3.0, 0.0, // 12
   0.0, 0.0, 0.0, // 5z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -293,7 +343,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 12
+  0.0, 0.0,-1.0/3.0, // 12
   0.0, 0.0, 0.0, // 6x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -335,7 +385,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 10
+ +1.0/3.0, 0.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7y
@@ -346,7 +396,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 10
+  0.0,+1.0/3.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7z
@@ -357,7 +407,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 10
+  0.0, 0.0,+1.0/3.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8x
@@ -369,7 +419,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 11
+ +1.0/3.0, 0.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8y
   0.0, 0.0, 0.0,
@@ -380,7 +430,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 11
+  0.0,+1.0/3.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8z
   0.0, 0.0, 0.0,
@@ -391,7 +441,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 11
+  0.0, 0.0,+1.0/3.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 9x
   0.0, 0.0, 0.0,
@@ -403,7 +453,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 12
+ +1.0/3.0, 0.0, 0.0, // 12
   0.0, 0.0, 0.0, // 9y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -414,7 +464,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 12
+  0.0,+1.0/3.0, 0.0, // 12
   0.0, 0.0, 0.0, // 9z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -425,35 +475,35 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 12
+  0.0, 0.0,+1.0/3.0, // 12
   0.0, 0.0, 0.0, // 10x
-  0.0,+1.0, 0.0, // 3
+ -1.0/3.0, 0.0, 0.0, // 3
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 7
+ +1.0/3.0, 0.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 10y
-  0.0, 0.0,-1.0, // 3
+  0.0,-1.0/3.0, 0.0, // 3
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 7
+  0.0,+1.0/3.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 10z
- +1.0, 0.0, 0.0, // 3
+  0.0, 0.0,-1.0/3.0, // 3
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 7
+  0.0, 0.0,+1.0/3.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -461,33 +511,33 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11x
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 4
+ -1.0/3.0, 0.0, 0.0, // 4
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 8
+ +1.0/3.0, 0.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11y
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 4
+  0.0,-1.0/3.0, 0.0, // 4
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 8
+  0.0,+1.0/3.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11z
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 4
+  0.0, 0.0,-1.0/3.0, // 4
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 8
+  0.0, 0.0,+1.0/3.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -495,33 +545,33 @@
   0.0, 0.0, 0.0, // 12x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 5
+ -1.0/3.0, 0.0, 0.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 9
+ +1.0/3.0, 0.0, 0.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 12y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 5
+  0.0,-1.0/3.0, 0.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 9
+  0.0,+1.0/3.0, 0.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 12z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 5
+  0.0, 0.0,-1.0/3.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 9
+  0.0, 0.0,+1.0/3.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -545,6 +595,8 @@
   slipTimeFilename = const_cast<char*>(_slipTimeFilename);
   riseTimeFilename = const_cast<char*>(_riseTimeFilename);
   fieldT = const_cast<double*>(_fieldT);
+  fieldIncr = const_cast<double*>(_fieldIncr);
+  jacobianLumped = const_cast<double*>(_jacobianLumped);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
   residual = const_cast<double*>(_residual);

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4f.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4f.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTet4f.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -64,6 +64,8 @@
   //@}
 
   static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldIncr[]; ///< Solution increment field over domain at time t.
+  static const double _jacobianLumped[]; ///< Lumped Jacobian.
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -61,24 +61,24 @@
 
 const int pylith::faults::CohesiveKinDataTri3::_numBasis = 2;
 
-const int pylith::faults::CohesiveKinDataTri3::_numQuadPts = 1;
+const int pylith::faults::CohesiveKinDataTri3::_numQuadPts = 2;
 
 const double pylith::faults::CohesiveKinDataTri3::_quadPts[] = {
-  0.0,
+  -1.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinDataTri3::_quadWts[] = {
-  2.0,
+  1.0, 1.0
 };
 
 const double pylith::faults::CohesiveKinDataTri3::_basis[] = {
-  0.5,
-  0.5
+  1.0, 0.0,
+  0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinDataTri3::_basisDeriv[] = {
-  -0.5,
-   0.5
+  -0.5, 0.5,
+  -0.5, 0.5,
 };
 
 const double pylith::faults::CohesiveKinDataTri3::_verticesRef[] = {
@@ -127,8 +127,8 @@
   1.4, 1.4,
   1.5, 1.5, // 6
   1.7, 1.7, // 7
-  1.6, 1.6, // 8
-  1.8, 1.8, // 9
+  1.0, 1.0, // 8
+  1.0, 1.0, // 9
 };
 
 const int pylith::faults::CohesiveKinDataTri3::_numFaultVertices = 2;
@@ -166,24 +166,28 @@
 
 const double pylith::faults::CohesiveKinDataTri3::_residual[] = {
   0.0,  0.0,
- -9.6, -8.6, // 3
- -9.8, -8.8, // 4
+ +8.6, +9.6, // 3
+ +8.8, +9.8, // 4
   0.0,  0.0,
- +9.6, +8.6, // 6
- +9.8, +8.8, // 7
-  0.3+1.89546413727,  0.3+0.08241148423, // 8
-  0.4+1.77538035254,  0.4+0.14794836271, // 9
+ -8.6, -9.6, // 6
+ -8.8, -9.8, // 7
+ -(8.5-8.2) - (0.08241148423),
+ -(9.5-9.2) - (1.89546413727), // 8
+ -(8.7-8.3) - (0.14794836271),
+ -(9.7-9.3) - (1.77538035254), // 9
 };
 
 const double pylith::faults::CohesiveKinDataTri3::_residualIncr[] = {
   0.0,  0.0,
- -9.6, -8.6, // 3
- -9.8, -8.8, // 4
+ +8.6, +9.6, // 3
+ +8.8, +9.8, // 4
   0.0,  0.0,
- +9.6, +8.6, // 6
- +9.8, +8.8, // 7
-  0.3+1.89546413727,  0.3+0.08241148423, // 8
-  0.4+1.77538035254,  0.4+0.14794836271, // 9
+ -8.6, -9.6, // 6
+ -8.8, -9.8, // 7
+ -(8.5-8.2) - (0.08241148423),
+ -(9.5-9.2) - (1.89546413727), // 8
+ -(8.7-8.3) - (0.14794836271),
+ -(9.7-9.3) - (1.77538035254), // 9
 };
 
 const double pylith::faults::CohesiveKinDataTri3::_jacobian[] = {
@@ -209,7 +213,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 8
+ -1.0, 0.0, // 8
   0.0, 0.0,
   0.0, 0.0, // 3y
   0.0, 0.0,
@@ -217,7 +221,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, //  8
+  0.0,-1.0, // 8
   0.0, 0.0,
   0.0, 0.0, // 4x
   0.0, 0.0,
@@ -226,7 +230,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, //  9
+ -1.0, 0.0, //  9
   0.0, 0.0, // 4y
   0.0, 0.0,
   0.0, 0.0,
@@ -234,7 +238,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, //  9
+  0.0,-1.0, // 9
   0.0, 0.0, // 5x
   0.0, 0.0,
   0.0, 0.0,
@@ -257,7 +261,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  8
+ +1.0, 0.0, // 8
   0.0, 0.0,
   0.0, 0.0, // 6y
   0.0, 0.0,
@@ -265,7 +269,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  8
+  0.0,+1.0, // 8
   0.0, 0.0,
   0.0, 0.0, // 7x
   0.0, 0.0,
@@ -274,7 +278,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  9
+ +1.0, 0.0, // 9
   0.0, 0.0, // 7y
   0.0, 0.0,
   0.0, 0.0,
@@ -282,52 +286,52 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  9
+  0.0,+1.0, // 9
 
   0.0, 0.0, // 8x
-  0.0,+1.0, //  3
+ -1.0, 0.0, // 3
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  6
+ +1.0, 0.0, // 6
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 8y
- +1.0, 0.0, //  3
+  0.0,-1.0, // 3
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  6
+  0.0,+1.0, // 6
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
 
   0.0, 0.0, // 9x
   0.0, 0.0,
-  0.0,+1.0, //  4
+ -1.0, 0.0, //  4
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  7
+ +1.0, 0.0, // 7
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 9y
   0.0, 0.0,
- +1.0, 0.0, //  4
+  0.0,-1.0, // 4
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  7
+  0.0,+1.0, // 7
   0.0, 0.0,
   0.0, 0.0,
 };
 
 const double pylith::faults::CohesiveKinDataTri3::_fieldIncrAdjusted[] = {
   3.1, 4.1,
-  11.4124508246, 12.5863689652, // 3
-  11.1489656107, 12.3019463023, // 4
+  3.57911749124, 5.58636896515, // 3
+  3.83717073887, 5.75938219977, // 4
   3.4, 4.4,
-  -3.06996065966, -2.20909517212, // 6
-  -2.30215017286, -1.41913540767, // 7
-  -10.0636427582, -9.85494098949, // 8
-  -10.402530193, -10.2036552939, // 9
+  3.19670600701, 3.39090482788, // 6
+  3.28922237616, 3.58400184723, // 7
+  0.454940989487, 1.66364275818, // 8
+  0.69832196053, 1.8971968597, // 9
 };
 
 pylith::faults::CohesiveKinDataTri3::CohesiveKinDataTri3(void)

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3d.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3d.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3d.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -76,24 +76,24 @@
 
 const int pylith::faults::CohesiveKinDataTri3d::_numBasis = 2;
 
-const int pylith::faults::CohesiveKinDataTri3d::_numQuadPts = 1;
+const int pylith::faults::CohesiveKinDataTri3d::_numQuadPts = 2;
 
 const double pylith::faults::CohesiveKinDataTri3d::_quadPts[] = {
-  0.0,
+  -1.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinDataTri3d::_quadWts[] = {
-  2.0,
+  1.0, 1.0
 };
 
 const double pylith::faults::CohesiveKinDataTri3d::_basis[] = {
-  0.5,
-  0.5
+  1.0, 0.0,
+  0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinDataTri3d::_basisDeriv[] = {
-  -0.5,
-   0.5
+  -0.5, 0.5,
+  -0.5, 0.5,
 };
 
 const double pylith::faults::CohesiveKinDataTri3d::_verticesRef[] = {
@@ -128,7 +128,37 @@
   7.2, 9.2, // 15
 };
 
+const double pylith::faults::CohesiveKinDataTri3d::_fieldIncr[] = {
+  3.1, 7.1,
+  3.2, 7.2, // 5
+  3.3, 7.3, // 6
+  3.4, 7.4,
+  3.5, 7.5, // 8
+  3.6, 7.6,
+  3.7, 7.7, // 10
+  3.9, 7.9, // 11
+  3.1, 7.1, // 12
+  3.8, 7.8, // 13
+  3.0, 7.0, // 14
+  2.2, 5.2, // 15
+};
 
+const double pylith::faults::CohesiveKinDataTri3d::_jacobianLumped[] = {
+  6.1, 8.1,
+  6.2, 8.2, // 5
+  6.3, 8.3, // 6
+  6.4, 8.4,
+  6.5, 8.5, // 8
+  6.6, 8.6,
+  6.7, 8.7, // 10
+  6.9, 8.9, // 11
+  7.1, 9.1, // 12
+  1.0, 1.0, // 13
+  1.0, 1.0, // 14
+  1.0, 1.0, // 15
+};
+
+
 const double pylith::faults::CohesiveKinDataTri3d::_orientation[] = {
   +0.70710678118654757, -0.70710678118654757,  
   -0.70710678118654757, -0.70710678118654757,
@@ -166,32 +196,38 @@
 
 const double pylith::faults::CohesiveKinDataTri3d::_residual[] = {
   0.0,  0.0,
- -1.4142135623730949, -11.030865786510143, // 5
- -8.0,  -6.0, // 6
+ +2.0*6.8, +2.0*8.8, // 5
+ +1.0*6.0, +1.0*8.0, // 6
   0.0,  0.0,
- +7.2,  -9.2, // 8
+ +1.0*7.2, +1.0*9.2, // 8
   0.0,  0.0,
- +1.4142135623730949, +11.030865786510143, // 10
- +8.0, +6.0, // 11
- -7.2, +9.2, // 12
-  0.0+1.89546413727, +0.70710678118654757+0.08241148423, // 13
-  0.6+1.77538035254, 0.6+0.14794836271, // 14
- -0.6+1.59887481971,  0.6+0.19186497837, // 15
+ -2.0*6.8, -2.0*8.8, // 10
+ -1.0*6.0, -1.0*8.0, // 6
+ -1.0*7.2, -1.0*9.2, // 8
+  -2.0*(6.7-6.2 -0.70710678118654757*(1.89546413727-0.08241148423)),
+  -2.0*(8.7-8.2 -0.70710678118654757*(-1.89546413727-0.08241148423)), // 13
+  -1.0*(6.9-6.3 +0.14794836271),
+  -1.0*(8.9-8.3 +1.77538035254), // 14
+  -1.0*(7.1-6.5 -1.59887481971),
+  -1.0*(9.1-8.5 +0.19186497837), // 15
 };
 
 const double pylith::faults::CohesiveKinDataTri3d::_residualIncr[] = {
   0.0,  0.0,
- -1.4142135623730949, -11.030865786510143, // 5
- -8.0,  -6.0, // 6
+ +2.0*6.8, +2.0*8.8, // 5
+ +1.0*6.0, +1.0*8.0, // 6
   0.0,  0.0,
- +7.2,  -9.2, // 8
+ +1.0*7.2, +1.0*9.2, // 8
   0.0,  0.0,
- +1.4142135623730949, +11.030865786510143, // 10
- +8.0, +6.0, // 11
- -7.2, +9.2, // 12
-  0.0+1.89546413727, +0.70710678118654757+0.08241148423, // 13
-  0.6+1.77538035254, 0.6+0.14794836271, // 14
- -0.6+1.59887481971,  0.6+0.19186497837, // 15
+ -2.0*6.8, -2.0*8.8, // 10
+ -1.0*6.0, -1.0*8.0, // 6
+ -1.0*7.2, -1.0*9.2, // 8
+  -2.0*(6.7-6.2 -0.70710678118654757*(1.89546413727-0.08241148423)),
+  -2.0*(8.7-8.2 -0.70710678118654757*(-1.89546413727-0.08241148423)), // 13
+  -1.0*(6.9-6.3 +0.14794836271),
+  -1.0*(8.9-8.3 +1.77538035254), // 14
+  -1.0*(7.1-6.5 -1.59887481971),
+  -1.0*(9.1-8.5 +0.19186497837), // 15
 };
 
 const double pylith::faults::CohesiveKinDataTri3d::_jacobian[] = {
@@ -228,7 +264,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -0.70710678118654757, +0.70710678118654757, // 13
+ -2.0, 0.0, // 13
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 5y
@@ -240,7 +276,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +0.70710678118654757, +0.70710678118654757, // 13
+  0.0,-2.0, // 13
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 6x
@@ -253,7 +289,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 14
+ -1.0, 0.0, // 14
   0.0, 0.0,
   0.0, 0.0, // 6y
   0.0, 0.0,
@@ -265,7 +301,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 14
+  0.0,-1.0, // 14
   0.0, 0.0,
   0.0, 0.0, // 7x
   0.0, 0.0,
@@ -314,7 +350,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 15
+  0.0,-1.0, // 15
   0.0, 0.0, // 9x
   0.0, 0.0,
   0.0, 0.0,
@@ -348,7 +384,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +0.70710678118654757, -0.70710678118654757, // 13
+ +2.0, 0.0, // 13
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 10y
@@ -360,7 +396,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -0.70710678118654757, -0.70710678118654757, // 13
+  0.0,+2.0, // 13
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 11x
@@ -373,7 +409,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 14
+ +1.0, 0.0, // 14
   0.0, 0.0,
   0.0, 0.0, // 11y
   0.0, 0.0,
@@ -385,7 +421,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, // 14
+  0.0,+1.0, // 14
   0.0, 0.0,
   0.0, 0.0, // 12x
   0.0, 0.0,
@@ -410,26 +446,26 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 15
+  0.0,+1.0, // 15
   0.0, 0.0, // 13x
- -0.70710678118654757, +0.70710678118654757, // 5
+ -2.0, 0.0, // 5
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +0.70710678118654757, -0.70710678118654757, // 10
+ +2.0, 0.0, // 10
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 13y
- +0.70710678118654757, +0.70710678118654757, // 5
+  0.0,-2.0, // 5
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -0.70710678118654757, -0.70710678118654757, // 10
+  0.0,+2.0, // 10
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
@@ -437,24 +473,24 @@
   0.0, 0.0,
   0.0, 0.0, // 14x
   0.0, 0.0,
-  0.0,+1.0, // 6
+ -1.0, 0.0, // 6
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 11
+ +1.0, 0.0, // 11
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 14y
   0.0, 0.0,
- +1.0, 0.0, // 6
+  0.0,-1.0, // 6
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, // 11
+  0.0,+1.0, // 11
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
@@ -475,11 +511,11 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 8
+  0.0,-1.0, // 8
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 12
+  0.0,+1.0, // 12
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
@@ -503,6 +539,8 @@
   slipTimeFilename = const_cast<char*>(_slipTimeFilename);
   riseTimeFilename = const_cast<char*>(_riseTimeFilename);
   fieldT = const_cast<double*>(_fieldT);
+  fieldIncr = const_cast<double*>(_fieldIncr);
+  jacobianLumped = const_cast<double*>(_jacobianLumped);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
   residual = const_cast<double*>(_residual);

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3d.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3d.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinDataTri3d.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -64,6 +64,8 @@
   //@}
 
   static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldIncr[]; ///< Solution increment field over domain at time t.
+  static const double _jacobianLumped[]; ///< Lumped Jacobian.
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -48,10 +48,10 @@
 const int pylith::faults::CohesiveKinSrcsDataHex8::_numQuadPts = 4;
 
 const double pylith::faults::CohesiveKinSrcsDataHex8::_quadPts[] = {
-  -0.57735027, -0.57735027,
-  +0.57735027, -0.57735027,
-  +0.57735027, +0.57735027,
-  -0.57735027, +0.57735027,
+  -1.0, -1.0,
+  +1.0, -1.0,
+  +1.0, +1.0,
+  -1.0, +1.0
 };
 
 const double pylith::faults::CohesiveKinSrcsDataHex8::_quadWts[] = {
@@ -59,10 +59,10 @@
 };
 
 const double pylith::faults::CohesiveKinSrcsDataHex8::_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,
+  1.0, 0.0, 0.0, 0.0,
+  0.0, 1.0, 0.0, 0.0,
+  0.0, 0.0, 1.0, 0.0,
+  0.0, 0.0, 0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataHex8::_basisDeriv[] = {
@@ -112,18 +112,18 @@
   4.2, 6.2, 8.2,
   4.3, 6.3, 8.3,
   4.4, 6.4, 8.4,
-  4.5, 6.5, 8.5,
-  4.6, 6.6, 8.6,
-  4.7, 6.7, 8.7,
-  4.8, 6.8, 8.8,
+  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,
-  5.5, 7.5, 9.5,
-  5.7, 7.7, 9.7,
-  5.9, 7.9, 9.9,
+  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
@@ -131,6 +131,52 @@
 };
 
 
+const double pylith::faults::CohesiveKinSrcsDataHex8::_fieldIncr[] = {
+  3.1, 4.1, 5.1,
+  3.2, 4.2, 5.2,
+  3.3, 4.3, 5.3,
+  3.4, 4.4, 5.4,
+  3.5, 4.5, 5.5, // 6
+  3.6, 4.6, 5.6, // 7
+  3.7, 4.7, 5.7, // 8
+  3.8, 4.8, 5.8, // 9
+  3.9, 4.9, 5.9,
+  3.0, 4.0, 5.0,
+  3.1, 4.1, 5.1,
+  3.2, 4.2, 5.2,
+  3.3, 4.3, 5.3, // 14
+  3.5, 4.5, 5.5, // 15
+  3.7, 4.7, 5.7, // 16
+  3.9, 4.9, 5.9, // 17
+  3.4, 4.4, 5.4, // 18
+  3.6, 4.6, 5.6, // 19
+  3.8, 4.8, 5.8, // 20
+  3.0, 4.0, 5.0, // 21
+};
+
+const double pylith::faults::CohesiveKinSrcsDataHex8::_jacobianLumped[] = {
+  1.1, 1.1, 1.1,
+  1.2, 1.2, 1.2,
+  1.3, 1.3, 1.3,
+  1.4, 1.4, 1.4,
+  1.5, 1.5, 1.5, // 6
+  1.6, 1.6, 1.6, // 7
+  1.7, 1.7, 1.7, // 8
+  1.8, 1.8, 1.8, // 9
+  1.9, 1.9, 1.9,
+  1.0, 1.0, 1.0,
+  1.1, 1.1, 1.1,
+  1.2, 1.2, 1.2,
+  1.3, 1.3, 1.3, // 14
+  1.5, 1.5, 1.5, // 15
+  1.7, 1.7, 1.7, // 16
+  1.9, 1.9, 1.9, // 17
+  1.0, 1.0, 1.0, // 18
+  1.0, 1.0, 1.0, // 19
+  1.0, 1.0, 1.0, // 20
+  1.0, 1.0, 1.0, // 21
+};
+
 const double pylith::faults::CohesiveKinSrcsDataHex8::_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,
@@ -170,22 +216,38 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -9.4,-5.4,+7.4, // 6
- -9.6,-5.6,+7.6, // 7
- -9.8,-5.8,+7.8, // 8
- -9.0,-5.0,+7.0, // 9
+  +5.4, +7.4, +9.4, // 6
+  +5.6, +7.6, +9.6, // 7
+  +5.8, +7.8, +9.8, // 8
+  +5.0, +7.0, +9.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +9.4,+5.4,-7.4, // 14
- +9.6,+5.6,-7.6, // 15
- +9.8,+5.8,-7.8, // 16
- +9.0,+5.0,-7.0, // 17
-  0.8+1.82575588523+0.91680340354, -0.8+-0.55566483464-0.27902712282, 0.8+0.07938069066+0.03986101755, // 18 (constraint)
-  0.9+1.69682900001+0.62551316338, -0.9+-0.56560966667-0.20850438779, 0.9+0.14140241667+0.05212609695, // 19 (constraint)
-  1.0+1.51709826228+0.34903622931, -1.0+-0.54615537442-0.12565304255, 1.0+0.18205179147+0.04188434752, // 20 (constraint)
-  1.1+1.29378670385+0.12855127934, -1.1+-0.49761027071+-0.04944279975, 1.1+0.19904410828+0.01977711990, // 21 (constraint)
+  -5.4, -7.4, -9.4, // 14
+  -5.6, -7.6, -9.6, // 15
+  -5.8, -7.8, -9.8, // 16
+  -5.0, -7.0, -9.0, // 17
+
+  // 18 (constraint)
+  -(5.3-4.5 + 0.07938069066+0.03986101755), 
+  -(7.3-6.5 + 1.82575588523+0.91680340354),
+  -(9.3-8.5 + 0.55566483464+0.27902712282),
+
+  // 19 (constraint)
+  -(5.5-4.6 + 0.14140241667+0.05212609695),
+  -(7.5-6.6 + 1.69682900001+0.62551316338),
+  -(9.5-8.6 + 0.56560966667+0.20850438779),
+
+  // 20 (constraint)
+  -(5.7-4.7 + 0.18205179147+0.04188434752),
+  -(7.7-6.7 + 1.51709826228+0.34903622931),
+  -(9.7-8.7 + 0.54615537442+0.12565304255),
+
+  // 21 (constraint)
+  -(5.9-4.8 + 0.19904410828+0.01977711990),
+  -(7.9-6.8 + 1.29378670385+0.12855127934),
+  -(9.9-8.8 + 0.49761027071+0.04944279975),
 };
 
 const double pylith::faults::CohesiveKinSrcsDataHex8::_residualIncr[] = {
@@ -193,22 +255,38 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -9.4,-5.4,+7.4, // 6
- -9.6,-5.6,+7.6, // 7
- -9.8,-5.8,+7.8, // 8
- -9.0,-5.0,+7.0, // 9
+  +5.4, +7.4, +9.4, // 6
+  +5.6, +7.6, +9.6, // 7
+  +5.8, +7.8, +9.8, // 8
+  +5.0, +7.0, +9.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +9.4,+5.4,-7.4, // 14
- +9.6,+5.6,-7.6, // 15
- +9.8,+5.8,-7.8, // 16
- +9.0,+5.0,-7.0, // 17
-  0.8+1.82575588523+0.91680340354, -0.8+-0.55566483464-0.27902712282, 0.8+0.07938069066+0.03986101755, // 18 (constraint)
-  0.9+1.69682900001+0.62551316338, -0.9+-0.56560966667-0.20850438779, 0.9+0.14140241667+0.05212609695, // 19 (constraint)
-  1.0+1.51709826228+0.34903622931, -1.0+-0.54615537442-0.12565304255, 1.0+0.18205179147+0.04188434752, // 20 (constraint)
-  1.1+1.29378670385+0.12855127934, -1.1+-0.49761027071+-0.04944279975, 1.1+0.19904410828+0.01977711990, // 21 (constraint)
+  -5.4, -7.4, -9.4, // 14
+  -5.6, -7.6, -9.6, // 15
+  -5.8, -7.8, -9.8, // 16
+  -5.0, -7.0, -9.0, // 17
+
+  // 18 (constraint)
+  -(5.3-4.5 + 0.07938069066+0.03986101755), 
+  -(7.3-6.5 + 1.82575588523+0.91680340354),
+  -(9.3-8.5 + 0.55566483464+0.27902712282),
+
+  // 19 (constraint)
+  -(5.5-4.6 + 0.14140241667+0.05212609695),
+  -(7.5-6.6 + 1.69682900001+0.62551316338),
+  -(9.5-8.6 + 0.56560966667+0.20850438779),
+
+  // 20 (constraint)
+  -(5.7-4.7 + 0.18205179147+0.04188434752),
+  -(7.7-6.7 + 1.51709826228+0.34903622931),
+  -(9.7-8.7 + 0.54615537442+0.12565304255),
+
+  // 21 (constraint)
+  -(5.9-4.8 + 0.19904410828+0.01977711990),
+  -(7.9-6.8 + 1.29378670385+0.12855127934),
+  -(9.9-8.8 + 0.49761027071+0.04944279975),
 };
 
 const double pylith::faults::CohesiveKinSrcsDataHex8::_jacobian[] = {
@@ -468,7 +546,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 18
+ -1.0, 0.0, 0.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -488,7 +566,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 18
+  0.0,-1.0, 0.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -508,7 +586,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 18
+  0.0, 0.0,-1.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -529,7 +607,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 19
+ -1.0, 0.0, 0.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7y
@@ -549,7 +627,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 19
+  0.0,-1.0, 0.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7z
@@ -569,7 +647,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 19
+  0.0, 0.0,-1.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8x
@@ -590,7 +668,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 20
+ -1.0, 0.0, 0.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8y
   0.0, 0.0, 0.0,
@@ -610,7 +688,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 20
+  0.0,-1.0, 0.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8z
   0.0, 0.0, 0.0,
@@ -630,7 +708,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 20
+  0.0, 0.0,-1.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 9x
   0.0, 0.0, 0.0,
@@ -651,7 +729,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 21
+ -1.0, 0.0, 0.0, // 21
   0.0, 0.0, 0.0, // 9y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -671,7 +749,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 21
+  0.0,-1.0, 0.0, // 21
   0.0, 0.0, 0.0, // 9z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -691,7 +769,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 21
+  0.0, 0.0,-1.0, // 21
   0.0, 0.0, 0.0, // 10x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -948,7 +1026,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 18
+ +1.0, 0.0, 0.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -968,7 +1046,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 18
+  0.0,+1.0, 0.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -988,7 +1066,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 18
+  0.0, 0.0,+1.0, // 18
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1009,7 +1087,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 19
+ +1.0, 0.0, 0.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 15y
@@ -1029,7 +1107,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 19
+  0.0,+1.0, 0.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 15z
@@ -1049,7 +1127,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 19
+  0.0, 0.0,+1.0, // 19
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 16x
@@ -1070,7 +1148,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 20
+ +1.0, 0.0, 0.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 16y
   0.0, 0.0, 0.0,
@@ -1090,7 +1168,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 20
+  0.0,+1.0, 0.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 16z
   0.0, 0.0, 0.0,
@@ -1110,7 +1188,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 20
+  0.0, 0.0,+1.0, // 20
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 17x
   0.0, 0.0, 0.0,
@@ -1131,7 +1209,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 21
+ +1.0, 0.0, 0.0, // 21
   0.0, 0.0, 0.0, // 17y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1151,7 +1229,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 21
+  0.0,+1.0, 0.0, // 21
   0.0, 0.0, 0.0, // 17z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1171,12 +1249,12 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 21
+  0.0, 0.0,+1.0, // 21
   0.0, 0.0, 0.0, // 18x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 6
+ -1.0, 0.0, 0.0, // 6
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1184,7 +1262,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 14
+ +1.0, 0.0, 0.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1196,7 +1274,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 6
+  0.0,-1.0, 0.0, // 6
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1204,7 +1282,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 14
+  0.0,+1.0, 0.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1216,7 +1294,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 6
+  0.0, 0.0,-1.0, // 6
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1224,7 +1302,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 14
+  0.0, 0.0,+1.0, // 14
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1237,7 +1315,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 7
+ -1.0, 0.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1245,7 +1323,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 15
+ +1.0, 0.0, 0.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1257,7 +1335,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 7
+  0.0,-1.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1265,7 +1343,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 15
+  0.0,+1.0, 0.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1277,7 +1355,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 7
+  0.0, 0.0,-1.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1285,7 +1363,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 15
+  0.0, 0.0,+1.0, // 15
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1298,7 +1376,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 8
+ -1.0, 0.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1306,7 +1384,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 16
+ +1.0, 0.0, 0.0, // 16
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1318,7 +1396,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 8
+  0.0,-1.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1326,7 +1404,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 16
+  0.0,+1.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1338,7 +1416,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 8
+  0.0, 0.0,-1.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1346,7 +1424,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 16
+  0.0, 0.0,+1.0, // 16
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1359,7 +1437,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 9
+ -1.0, 0.0, 0.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1367,7 +1445,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 17
+ +1.0, 0.0, 0.0, // 17
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1379,7 +1457,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 9
+  0.0,-1.0, 0.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1387,7 +1465,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 17
+  0.0,+1.0, 0.0, // 17
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1399,7 +1477,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 9
+  0.0, 0.0,-1.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1407,7 +1485,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 17
+  0.0, 0.0,+1.0, // 17
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -1432,6 +1510,8 @@
   slipTimeFilename = const_cast<char*>(_slipTimeFilename);
   riseTimeFilename = const_cast<char*>(_riseTimeFilename);
   fieldT = const_cast<double*>(_fieldT);
+  fieldIncr = const_cast<double*>(_fieldIncr);
+  jacobianLumped = const_cast<double*>(_jacobianLumped);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
   residual = const_cast<double*>(_residual);

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -63,7 +63,9 @@
   static const char* _matPropsFilename; ///< Name of db for bulk mat properties.
   //@}
 
-  static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldT[]; ///< Field over domain at time t.
+  static const double _fieldIncr[]; ///< Solution increment field over domain at time t.
+  static const double _jacobianLumped[]; ///< Lumped Jacobian.
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -82,6 +82,22 @@
 };
 
 
+const double pylith::faults::CohesiveKinSrcsDataLine2::_fieldIncr[] = {
+  1.1,
+  1.2, // 3
+  1.3,
+  1.4, // 5
+  1.5
+};
+
+const double pylith::faults::CohesiveKinSrcsDataLine2::_jacobianLumped[] = {
+  2.1,
+  2.2, // 3
+  2.3,
+  2.4, // 5
+  1.0
+};
+
 const double pylith::faults::CohesiveKinSrcsDataLine2::_orientation[] = {
   1.0
 };
@@ -115,7 +131,7 @@
 
 const double pylith::faults::CohesiveKinSrcsDataLine2::_residualIncr[] = {
    0.0,
-   7.5,
+  +7.5,
    0.0,
   -7.5,
   -0.2+1.89546413727+0.99414665414,
@@ -123,7 +139,7 @@
 
 const double pylith::faults::CohesiveKinSrcsDataLine2::_residual[] = {
    0.0,
-   7.5,
+  +7.5,
    0.0,
   -7.5,
   -0.2+1.89546413727+0.99414665414,
@@ -155,6 +171,8 @@
   slipTimeFilename = const_cast<char*>(_slipTimeFilename);
   riseTimeFilename = const_cast<char*>(_riseTimeFilename);
   fieldT = const_cast<double*>(_fieldT);
+  fieldIncr = const_cast<double*>(_fieldIncr);
+  jacobianLumped = const_cast<double*>(_jacobianLumped);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
   residualIncr = const_cast<double*>(_residualIncr);

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -63,7 +63,9 @@
   static const char* _matPropsFilename; ///< Name of db for bulk mat properties.
   //@}
 
-  static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldT[]; ///< Field over domain at time t.
+  static const double _fieldIncr[]; ///< Solution increment field over domain at time t.
+  static const double _jacobianLumped[]; ///< Lumped Jacobian.
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -58,24 +58,24 @@
 
 const int pylith::faults::CohesiveKinSrcsDataQuad4::_numBasis = 2;
 
-const int pylith::faults::CohesiveKinSrcsDataQuad4::_numQuadPts = 1;
+const int pylith::faults::CohesiveKinSrcsDataQuad4::_numQuadPts = 2;
 
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_quadPts[] = {
-  0.0,
+  -1.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_quadWts[] = {
-  2.0,
+  1.0, 1.0
 };
 
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_basis[] = {
-  0.5,
-  0.5
+  1.0, 0.0,
+  0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_basisDeriv[] = {
-  -0.5,
-   0.5
+  -0.5, 0.5,
+  -0.5, 0.5,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_verticesRef[] = {
@@ -108,7 +108,31 @@
   8.0, 9.0, // 11
 };
 
+const double pylith::faults::CohesiveKinSrcsDataQuad4::_fieldIncr[] = {
+  3.1, 4.1,
+  3.2, 4.2,
+  3.3, 4.3, // 4
+  3.4, 4.4, // 5
+  3.5, 4.5,
+  3.6, 4.6,
+  3.7, 4.7, // 8
+  3.9, 4.9, // 9
+  3.8, 4.8, // 10
+  3.0, 4.0, // 11
+};
 
+const double pylith::faults::CohesiveKinSrcsDataQuad4::_jacobianLumped[] = {
+  1.1, 1.1,
+  1.2, 1.2,
+  1.3, 1.3, // 4
+  1.4, 1.4, // 5
+  1.5, 1.5,
+  1.6, 1.6,
+  1.7, 1.7, // 8
+  1.9, 1.9, // 9
+  1.0, 1.0, // 10
+  1.0, 1.0, // 11
+};
 
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_orientation[] = {
   0.0,  1.0,  +1.0, 0.0,
@@ -145,27 +169,31 @@
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_residual[] = {
   0.0,  0.0,
   0.0,  0.0,
-  9.8,  8.8, // 4
-  9.0,  8.0, // 5
+ +8.8, +9.8, // 4
+ +8.0, +9.0, // 5
   0.0,  0.0,
   0.0,  0.0,
- -9.8, -8.8, // 8
- -9.0, -8.0, // 9
- -0.4+1.77538035254+0.68377062865, -0.4+0.14794836271+0.05698088572, // 10
- -0.5+1.89546413727+0.99414665414, -0.5+0.08241148423+0.04322376757, // 11
+ -8.8, -9.8, // 8
+ -8.0, -9.0, // 9
+ -(8.7-8.3 + -0.14794836271 + -0.05698088572),
+ -(9.7-9.3 + -1.77538035254 + -0.68377062865), // 10
+ -(8.9-8.4 + -0.08241148423 + -0.04322376757),
+ -(9.9-9.4 + -1.89546413727 + -0.99414665414), // 11
 };
 
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_residualIncr[] = {
   0.0,  0.0,
   0.0,  0.0,
-  9.8,  8.8, // 4
-  9.0,  8.0, // 5
+ +8.8, +9.8, // 4
+ +8.0, +9.0, // 5
   0.0,  0.0,
   0.0,  0.0,
- -9.8, -8.8, // 8
- -9.0, -8.0, // 9
- -0.4+1.77538035254+0.68377062865, -0.4+0.14794836271+0.05698088572, // 10
- -0.5+1.89546413727+0.99414665414, -0.5+0.08241148423+0.04322376757, // 11
+ -8.8, -9.8, // 8
+ -8.0, -9.0, // 9
+ -(8.7-8.3 + -0.14794836271 + -0.05698088572),
+ -(9.7-9.3 + -1.77538035254 + -0.68377062865), // 10
+ -(8.9-8.4 + -0.08241148423 + -0.04322376757),
+ -(9.9-9.4 + -1.89546413727 + -0.99414665414), // 11
 };
 
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_jacobian[] = {
@@ -217,7 +245,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, // 10
+ -1.0, 0.0, // 10
   0.0, 0.0,
   0.0, 0.0, // 4y
   0.0, 0.0,
@@ -227,7 +255,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  10
+  0.0,-1.0, // 10
   0.0, 0.0,
   0.0, 0.0, // 5x
   0.0, 0.0,
@@ -238,7 +266,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  11
+ -1.0, 0.0, // 11
   0.0, 0.0, // 5y
   0.0, 0.0,
   0.0, 0.0,
@@ -248,7 +276,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  11
+  0.0,-1.0, // 11
   0.0, 0.0, // 6x
   0.0, 0.0,
   0.0, 0.0,
@@ -297,7 +325,7 @@
   0.0, 0.0, 
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, //  10
+ +1.0, 0.0, // 10
   0.0, 0.0,
   0.0, 0.0, // 8y
   0.0, 0.0,
@@ -307,7 +335,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 10
+  0.0,+1.0, // 10
   0.0, 0.0,
   0.0, 0.0, // 9x
   0.0, 0.0,
@@ -318,7 +346,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 11
+ +1.0, 0.0, // 11
   0.0, 0.0, // 9y
   0.0, 0.0,
   0.0, 0.0,
@@ -328,45 +356,45 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 11
+  0.0,+1.0, // 11
   0.0, 0.0, // 10x
   0.0, 0.0,
-  0.0,-1.0, //  4
+ -1.0, 0.0, // 4
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, //  8
+ +1.0, 0.0, // 8
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 10y
   0.0, 0.0,
- -1.0, 0.0, //  4
+  0.0,-1.0, // 4
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, //  8
+  0.0,+1.0, // 8
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 11x
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  5
+ -1.0, 0.0, // 5
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, //  9
+ +1.0, 0.0, // 9
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 11y
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  5
+  0.0,-1.0, // 5
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, // 9
+  0.0,+1.0, // 9
   0.0, 0.0,
   0.0, 0.0,
 };
@@ -389,6 +417,8 @@
   slipTimeFilename = const_cast<char*>(_slipTimeFilename);
   riseTimeFilename = const_cast<char*>(_riseTimeFilename);
   fieldT = const_cast<double*>(_fieldT);
+  fieldIncr = const_cast<double*>(_fieldIncr);
+  jacobianLumped = const_cast<double*>(_jacobianLumped);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
   residual = const_cast<double*>(_residual);

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -63,7 +63,9 @@
   static const char* _matPropsFilename; ///< Name of db for bulk mat properties.
   //@}
 
-  static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldT[]; ///< Field over domain at time t.
+  static const double _fieldIncr[]; ///< Solution increment field over domain at time t.
+  static const double _jacobianLumped[]; ///< Lumped Jacobian.
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -44,24 +44,34 @@
 
 const int pylith::faults::CohesiveKinSrcsDataTet4::_numBasis = 3;
 
-const int pylith::faults::CohesiveKinSrcsDataTet4::_numQuadPts = 1;
+const int pylith::faults::CohesiveKinSrcsDataTet4::_numQuadPts = 3;
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_quadPts[] = {
-  -3.33333333e-01,  -3.33333333e-01,
+ -1.00000000e+00, -1.00000000e+00,
+  1.00000000e+00, -1.00000000e+00,
+ -1.00000000e+00,  1.00000000e+00,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_quadWts[] = {
-  2.0,
+  2.0/3.0, 2.0/3.0, 2.0/3.0,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_basis[] = {
-  3.33333333e-01,  3.33333333e-01,
-  3.33333333e-01,};
+  1.0, 0.0, 0.0,
+  0.0, 1.0, 0.0,
+  0.0, 0.0, 1.0,
+};
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_basisDeriv[] = {
  -0.50000000e+00, -0.50000000e+00,
   0.50000000e+00,  0.00000000e+00,
   0.00000000e+00,  0.50000000e+00,
+ -0.50000000e+00, -0.50000000e+00,
+  0.50000000e+00,  0.00000000e+00,
+  0.00000000e+00,  0.50000000e+00,
+ -0.50000000e+00, -0.50000000e+00,
+  0.50000000e+00,  0.00000000e+00,
+  0.00000000e+00,  0.50000000e+00,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_verticesRef[] = {
@@ -97,7 +107,34 @@
   7.1, 8.1, 9.1, // 12
 };
 
+const double pylith::faults::CohesiveKinSrcsDataTet4::_fieldIncr[] = {
+  3.1, 4.1, 5.1,
+  3.2, 4.2, 5.2, // 3
+  3.3, 4.3, 5.3, // 4
+  3.4, 4.4, 5.4, // 5
+  3.5, 4.5, 5.5,
+  3.6, 4.6, 5.6, // 7
+  3.8, 4.8, 5.8, // 8
+  3.0, 4.0, 5.0, // 9
+  3.7, 4.7, 5.7, // 10
+  3.9, 4.9, 5.9, // 11
+  3.1, 4.1, 5.1, // 12
+};
 
+const double pylith::faults::CohesiveKinSrcsDataTet4::_jacobianLumped[] = {
+  1.1, 1.1, 1.1,
+  1.2, 1.2, 1.2, // 3
+  1.3, 1.3, 1.3, // 4
+  1.4, 1.4, 1.4, // 5
+  1.5, 1.5, 1.5,
+  1.6, 1.6, 1.6, // 7
+  1.8, 1.8, 1.8, // 8
+  1.0, 1.0, 1.0, // 9
+  1.0, 1.0, 1.0, // 10
+  1.0, 1.0, 1.0, // 11
+  1.0, 1.0, 1.0, // 12
+};
+
 const double pylith::faults::CohesiveKinSrcsDataTet4::_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,
@@ -135,30 +172,42 @@
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_residual[] = {
   0.0,  0.0,  0.0,
-  9.7,  7.7,  8.7, // 3
-  9.9,  7.9,  8.9, // 4
-  9.1,  7.1,  8.1, // 5
+   +7.7/3.0,  +8.7/3.0,  +9.7/3.0, // 3
+  +7.9/3.0,  +8.9/3.0,  +9.9/3.0, // 4
+  +7.1/3.0,  +8.1/3.0,  +9.1/3.0, // 5
   0.0,  0.0,  0.0,
- -9.7, -7.7, -8.7, // 7
- -9.9, -7.9, -8.9, // 4
- -9.1, -7.1, -8.1, // 5
- -0.4+1.82575588523+0.91680340354, -0.4+-0.55566483464+-0.27902712282, -0.4+0.07938069066+0.03986101755, // 10
- -0.5+1.69682900001+0.62551316338, -0.5+-0.56560966667+-0.20850438779, -0.5+0.14140241667+0.05212609695, // 11
-  0.4+1.51709826228+0.34903622931,  0.4+-0.54615537442+-0.12565304255,  0.4+0.18205179147+0.04188434752, // 12
+  -7.7/3.0,  -8.7/3.0,  -9.7/3.0, // 7
+  -7.9/3.0,  -8.9/3.0,  -9.9/3.0, // 8
+  -7.1/3.0,  -8.1/3.0,  -9.1/3.0, // 9
+  -1.0/3.0*(7.6-7.2 + -0.07938069066-0.03986101755),
+  -1.0/3.0*(8.6-8.2 + -1.82575588523-0.91680340354),
+  -1.0/3.0*(9.6-9.2 + 0.55566483464+0.27902712282), // 10
+  -1.0/3.0*(7.8-7.3 + -0.14140241667-0.05212609695),
+  -1.0/3.0*(8.8-8.3 + -1.69682900001-0.62551316338),
+  -1.0/3.0*(9.8-9.3 + 0.56560966667+0.20850438779), // 11
+  -1.0/3.0*(7.0-7.4 + -0.18205179147-0.04188434752),
+  -1.0/3.0*(8.0-8.4 + -1.51709826228-0.34903622931),
+  -1.0/3.0*(9.0-9.4 + 0.54615537442+0.12565304255), // 12
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_residualIncr[] = {
   0.0,  0.0,  0.0,
-  9.7,  7.7,  8.7, // 3
-  9.9,  7.9,  8.9, // 4
-  9.1,  7.1,  8.1, // 5
+   +7.7/3.0,  +8.7/3.0,  +9.7/3.0, // 3
+  +7.9/3.0,  +8.9/3.0,  +9.9/3.0, // 4
+  +7.1/3.0,  +8.1/3.0,  +9.1/3.0, // 5
   0.0,  0.0,  0.0,
- -9.7, -7.7, -8.7, // 7
- -9.9, -7.9, -8.9, // 4
- -9.1, -7.1, -8.1, // 5
- -0.4+1.82575588523+0.91680340354, -0.4+-0.55566483464+-0.27902712282, -0.4+0.07938069066+0.03986101755, // 10
- -0.5+1.69682900001+0.62551316338, -0.5+-0.56560966667+-0.20850438779, -0.5+0.14140241667+0.05212609695, // 11
-  0.4+1.51709826228+0.34903622931,  0.4+-0.54615537442+-0.12565304255,  0.4+0.18205179147+0.04188434752, // 12
+  -7.7/3.0,  -8.7/3.0,  -9.7/3.0, // 7
+  -7.9/3.0,  -8.9/3.0,  -9.9/3.0, // 8
+  -7.1/3.0,  -8.1/3.0,  -9.1/3.0, // 9
+  -1.0/3.0*(7.6-7.2 + -0.07938069066-0.03986101755),
+  -1.0/3.0*(8.6-8.2 + -1.82575588523-0.91680340354),
+  -1.0/3.0*(9.6-9.2 + 0.55566483464+0.27902712282), // 10
+  -1.0/3.0*(7.8-7.3 + -0.14140241667-0.05212609695),
+  -1.0/3.0*(8.8-8.3 + -1.69682900001-0.62551316338),
+  -1.0/3.0*(9.8-9.3 + 0.56560966667+0.20850438779), // 11
+  -1.0/3.0*(7.0-7.4 + -0.18205179147-0.04188434752),
+  -1.0/3.0*(8.0-8.4 + -1.51709826228-0.34903622931),
+  -1.0/3.0*(9.0-9.4 + 0.54615537442+0.12565304255), // 12
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_jacobian[] = {
@@ -203,7 +252,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 10
+ -1.0/3.0, 0.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 3y
@@ -214,7 +263,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 10
+  0.0,-1.0/3.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 3z
@@ -225,7 +274,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 10
+  0.0, 0.0,-1.0/3.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 4x
@@ -237,7 +286,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 11
+ -1.0/3.0, 0.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 4y
   0.0, 0.0, 0.0,
@@ -248,7 +297,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 11
+  0.0,-1.0/3.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 4z
   0.0, 0.0, 0.0,
@@ -259,7 +308,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 11
+  0.0, 0.0,-1.0/3.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 5x
   0.0, 0.0, 0.0,
@@ -271,7 +320,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 12
+ -1.0/3.0, 0.0, 0.0, // 12
   0.0, 0.0, 0.0, // 5y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -282,7 +331,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 12
+  0.0,-1.0/3.0, 0.0, // 12
   0.0, 0.0, 0.0, // 5z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -293,7 +342,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 12
+  0.0, 0.0,-1.0/3.0, // 12
   0.0, 0.0, 0.0, // 6x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -335,7 +384,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 10
+ +1.0/3.0, 0.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7y
@@ -346,7 +395,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 10
+  0.0,+1.0/3.0, 0.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 7z
@@ -357,7 +406,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 10
+  0.0, 0.0,+1.0/3.0, // 10
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8x
@@ -369,7 +418,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 11
+ +1.0/3.0, 0.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8y
   0.0, 0.0, 0.0,
@@ -380,7 +429,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 11
+  0.0,+1.0/3.0, 0.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 8z
   0.0, 0.0, 0.0,
@@ -391,7 +440,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 11
+  0.0, 0.0,+1.0/3.0, // 11
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 9x
   0.0, 0.0, 0.0,
@@ -403,7 +452,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 12
+ +1.0/3.0, 0.0, 0.0, // 12
   0.0, 0.0, 0.0, // 9y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -414,7 +463,7 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 12
+  0.0,+1.0/3.0, 0.0, // 12
   0.0, 0.0, 0.0, // 9z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -425,35 +474,35 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 12
+  0.0, 0.0,+1.0/3.0, // 12
   0.0, 0.0, 0.0, // 10x
-  0.0,-1.0, 0.0, // 3
+ -1.0/3.0, 0.0, 0.0, // 3
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 7
+ +1.0/3.0, 0.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 10y
-  0.0, 0.0,-1.0, // 3
+  0.0,-1.0/3.0, 0.0, // 3
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 7
+  0.0,+1.0/3.0, 0.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 10z
- -1.0, 0.0, 0.0, // 3
+  0.0, 0.0,-1.0/3.0, // 3
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 7
+  0.0, 0.0,+1.0/3.0, // 7
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -461,33 +510,33 @@
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11x
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 4
+ -1.0/3.0, 0.0, 0.0, // 4
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 8
+ +1.0/3.0, 0.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11y
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 4
+  0.0,-1.0/3.0, 0.0, // 4
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 8
+  0.0,+1.0/3.0, 0.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 11z
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 4
+  0.0, 0.0,-1.0/3.0, // 4
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 8
+  0.0, 0.0,+1.0/3.0, // 8
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -495,33 +544,33 @@
   0.0, 0.0, 0.0, // 12x
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,-1.0, 0.0, // 5
+ -1.0/3.0, 0.0, 0.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0,+1.0, 0.0, // 9
+ +1.0/3.0, 0.0, 0.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 12y
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,-1.0, // 5
+  0.0,-1.0/3.0, 0.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
-  0.0, 0.0,+1.0, // 9
+  0.0,+1.0/3.0, 0.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0, // 12z
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- -1.0, 0.0, 0.0, // 5
+  0.0, 0.0,-1.0/3.0, // 5
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
- +1.0, 0.0, 0.0, // 9
+  0.0, 0.0,+1.0/3.0, // 9
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
@@ -545,6 +594,8 @@
   slipTimeFilename = const_cast<char*>(_slipTimeFilename);
   riseTimeFilename = const_cast<char*>(_riseTimeFilename);
   fieldT = const_cast<double*>(_fieldT);
+  fieldIncr = const_cast<double*>(_fieldIncr);
+  jacobianLumped = const_cast<double*>(_jacobianLumped);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
   residual = const_cast<double*>(_residual);

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -63,7 +63,9 @@
   static const char* _matPropsFilename; ///< Name of db for bulk mat properties.
   //@}
 
-  static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldT[]; ///< Field over domain at time t.
+  static const double _fieldIncr[]; ///< Solution increment field over domain at time t.
+  static const double _jacobianLumped[]; ///< Lumped Jacobian.
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.cc
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.cc	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.cc	2011-10-17 22:23:48 UTC (rev 19086)
@@ -72,24 +72,24 @@
 
 const int pylith::faults::CohesiveKinSrcsDataTri3::_numBasis = 2;
 
-const int pylith::faults::CohesiveKinSrcsDataTri3::_numQuadPts = 1;
+const int pylith::faults::CohesiveKinSrcsDataTri3::_numQuadPts = 2;
 
 const double pylith::faults::CohesiveKinSrcsDataTri3::_quadPts[] = {
-  0.0,
+  -1.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTri3::_quadWts[] = {
-  2.0,
+  1.0, 1.0
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTri3::_basis[] = {
-  0.5,
-  0.5
+  1.0, 0.0,
+  0.0, 1.0,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTri3::_basisDeriv[] = {
-  -0.5,
-   0.5
+  -0.5, 0.5,
+  -0.5, 0.5,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTri3::_verticesRef[] = {
@@ -120,7 +120,28 @@
   8.8, 9.8, // 9
 };
 
+const double pylith::faults::CohesiveKinSrcsDataTri3::_fieldIncr[] = {
+  3.1, 4.1,
+  3.2, 4.2, // 3
+  3.3, 4.3, // 4
+  3.4, 4.4,
+  3.5, 4.5, // 6
+  3.7, 4.7, // 7
+  3.6, 4.6, // 8
+  3.8, 4.8, // 9
+};
 
+const double pylith::faults::CohesiveKinSrcsDataTri3::_jacobianLumped[] = {
+  1.1, 1.1,
+  1.2, 1.2, // 3
+  1.3, 1.3, // 4
+  1.4, 1.4,
+  1.5, 1.5, // 6
+  1.7, 1.7, // 7
+  1.0, 1.0, // 8
+  1.0, 1.0, // 9
+};
+
 const double pylith::faults::CohesiveKinSrcsDataTri3::_orientation[] = {
   0.0, -1.0,  -1.0, 0.0,
   0.0, -1.0,  -1.0, 0.0
@@ -156,24 +177,28 @@
 
 const double pylith::faults::CohesiveKinSrcsDataTri3::_residual[] = {
   0.0,  0.0,
- -9.6, -8.6, // 3
- -9.8, -8.8, // 4
+ +8.6, +9.6, // 3
+ +8.8, +9.8, // 4
   0.0,  0.0,
- +9.6, +8.6, // 6
- +9.8, +8.8, // 7
-  0.3+1.89546413727+0.99414665414,  0.3+0.08241148423+0.04322376757, // 8
-  0.4+1.77538035254+0.68377062865,  0.4+0.14794836271+0.05698088572, // 9
+ -8.6, -9.6, // 6
+ -8.8, -9.8, // 7
+ -(8.5-8.2 + 0.08241148423 + 0.04322376757),
+ -(9.5-9.2 + 1.89546413727 + 0.99414665414), // 8
+ -(8.7-8.3 + 0.14794836271 + 0.05698088572),
+ -(9.7-9.3 + 1.77538035254 + 0.68377062865), // 9
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTri3::_residualIncr[] = {
   0.0,  0.0,
- -9.6, -8.6, // 3
- -9.8, -8.8, // 4
+ +8.6, +9.6, // 3
+ +8.8, +9.8, // 4
   0.0,  0.0,
- +9.6, +8.6, // 6
- +9.8, +8.8, // 7
-  0.3+1.89546413727+0.99414665414,  0.3+0.08241148423+0.04322376757, // 8
-  0.4+1.77538035254+0.68377062865,  0.4+0.14794836271+0.05698088572, // 9
+ -8.6, -9.6, // 6
+ -8.8, -9.8, // 7
+ -(8.5-8.2 + 0.08241148423 + 0.04322376757),
+ -(9.5-9.2 + 1.89546413727 + 0.99414665414), // 8
+ -(8.7-8.3 + 0.14794836271 + 0.05698088572),
+ -(9.7-9.3 + 1.77538035254 + 0.68377062865), // 9
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTri3::_jacobian[] = {
@@ -199,7 +224,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, // 8
+ -1.0, 0.0, // 8
   0.0, 0.0,
   0.0, 0.0, // 3y
   0.0, 0.0,
@@ -207,7 +232,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, //  8
+  0.0,-1.0, // 8
   0.0, 0.0,
   0.0, 0.0, // 4x
   0.0, 0.0,
@@ -216,7 +241,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,+1.0, //  9
+ -1.0, 0.0, //  9
   0.0, 0.0, // 4y
   0.0, 0.0,
   0.0, 0.0,
@@ -224,7 +249,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- +1.0, 0.0, //  9
+  0.0,-1.0, // 9
   0.0, 0.0, // 5x
   0.0, 0.0,
   0.0, 0.0,
@@ -247,7 +272,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  8
+ +1.0, 0.0, // 8
   0.0, 0.0,
   0.0, 0.0, // 6y
   0.0, 0.0,
@@ -255,7 +280,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  8
+  0.0,+1.0, // 8
   0.0, 0.0,
   0.0, 0.0, // 7x
   0.0, 0.0,
@@ -264,7 +289,7 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  9
+ +1.0, 0.0, // 9
   0.0, 0.0, // 7y
   0.0, 0.0,
   0.0, 0.0,
@@ -272,39 +297,39 @@
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  9
+  0.0,+1.0, // 9
 
   0.0, 0.0, // 8x
-  0.0,+1.0, //  3
+ -1.0, 0.0, // 3
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  6
+ +1.0, 0.0, // 6
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 8y
- +1.0, 0.0, //  3
+  0.0,-1.0, // 3
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  6
+  0.0,+1.0, // 6
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0,
 
   0.0, 0.0, // 9x
   0.0, 0.0,
-  0.0,+1.0, //  4
+ -1.0, 0.0, //  4
   0.0, 0.0,
   0.0, 0.0,
-  0.0,-1.0, //  7
+ +1.0, 0.0, // 7
   0.0, 0.0,
   0.0, 0.0,
   0.0, 0.0, // 9y
   0.0, 0.0,
- +1.0, 0.0, //  4
+  0.0,-1.0, // 4
   0.0, 0.0,
   0.0, 0.0,
- -1.0, 0.0, //  7
+  0.0,+1.0, // 7
   0.0, 0.0,
   0.0, 0.0,
 };
@@ -327,6 +352,8 @@
   slipTimeFilename = const_cast<char*>(_slipTimeFilename);
   riseTimeFilename = const_cast<char*>(_riseTimeFilename);
   fieldT = const_cast<double*>(_fieldT);
+  fieldIncr = const_cast<double*>(_fieldIncr);
+  jacobianLumped = const_cast<double*>(_jacobianLumped);
   orientation = const_cast<double*>(_orientation);
   area = const_cast<double*>(_area);
   residual = const_cast<double*>(_residual);

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.hh
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.hh	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.hh	2011-10-17 22:23:48 UTC (rev 19086)
@@ -63,7 +63,9 @@
   static const char* _matPropsFilename; ///< Name of db for bulk mat properties.
   //@}
 
-  static const double _fieldT[]; ///< Solution field at time t.
+  static const double _fieldT[]; ///< Field over domain at time t.
+  static const double _fieldIncr[]; ///< Solution increment field over domain at time t.
+  static const double _jacobianLumped[]; ///< Lumped Jacobian.
 
   static const double _orientation[]; ///< Expected values for fault orientation.
   static const double _area[]; ///< Expected values for fault area.

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/adjustsoln.py
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/adjustsoln.py	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/adjustsoln.py	2011-10-17 22:23:48 UTC (rev 19086)
@@ -3,358 +3,160 @@
 
 # ----------------------------------------------------------------------
 if test == "line2":
-    C = 1.0
-    dk = 1.89546413727; l = 1.5
-    Ai = 2.2; ri = 7.5; ui = 7.2; dui = 1.2
-    Aj = 2.4; rj = -7.5; uj = 7.4; duj = 1.4
+    jL = 1.0; rL = +1.69546413727;
+    jN = 2.2; duN = 1.2
+    jP = 2.4; duP = 1.4
 
-    Si = (Ai * Aj) / (Ai + Aj)
-    Aru = ri/Ai - rj/Aj + ui - uj
-    Aruslip = -C*Aru - dk 
-    dlp = Si * Aruslip
+    Sinv = 1.0/(jL**2 * (1.0/jN + 1.0/jP))
+    duL = Sinv * (-rL + jL*(duP-duN));
 
-    ddui = +C / Ai * dlp
-    dduj = -C / Aj * dlp
+    dduN = jL / jN * duL
+    dduP = -jL / jP * duL
 
     #print "Aru",Aru
     #print "Aruslip",Aruslip
     #print "Si",Si
     #print "dlip",dlp
 
-    print dui+ddui,duj+dduj,dlp
+    print duN+dduN,duP+dduP,duL
 
 # ----------------------------------------------------------------------
 elif test == "tri3" or test == "quad4":
 
     if test == "tri3":
 
-        Cpx = 0.0
-        Cpy = -1.0
-        Cqx = -1.0
-        Cqy = 0.0
-
         if vertex == 0:
-            # Lagrange vertex 8, vertex i: 3, vertex j: 6
-            dkp = 1.89546413727; lp = 3.6
-            dkq = 0.08241148423; lq = 4.6
-            
-            # vertex i
-            Aix = 1.2; Aiy = 1.2
-            rix = -9.6; riy = -8.6
-            uix = 8.2; uiy = 9.2
-            duix = 3.2; duiy = 4.2
-            
-            # vertex j
-            Ajx = 1.5; Ajy = 1.5
-            rjx = +9.6; rjy = +8.6
-            ujx = 8.5; ujy = 9.5
-            dujx = 3.5; dujy = 4.5
-            
+            # Lagrange vertex 8, vertex N: 3, vertex P: 6
+            jL = 1.0
+            rLx = -(8.5-8.2) - (0.08241148423)
+            rLy = -(9.5-9.2) - (1.89546413727)
+            jN = 1.2; duNx = 3.2; duNy = 4.2;
+            jP = 1.5; duPx = 3.5; duPy = 4.5;
+
         elif vertex == 1:
-            # Lagrange vertex 9, vertex i: 4, vertex j: 7
-            dkp = 1.77538035254; lp = 3.8
-            dkq = 0.14794836271; lq = 4.8
+            # Lagrange vertex 9, vertex N: 4, vertex P: 7
+            jL = 1.0
+            rLx = -(8.7-8.3) - (0.14794836271)
+            rLy = -(9.7-9.3) - (1.77538035254)
+            jN = 1.3; duNx = 3.3; duNy = 4.3;
+            jP = 1.7; duPx = 3.7; duPy = 4.7;
             
-            # vertex i
-            Aix = 1.3; Aiy = 1.3
-            rix = -9.8; riy = -8.8
-            uix = 8.3; uiy = 9.3
-            duix = 3.3; duiy = 4.3
-            
-            # vertex j
-            Ajx = 1.7; Ajy = 1.7
-            rjx = +9.8; rjy = +8.8
-            ujx = 8.7; ujy = 9.7
-            dujx = 3.7; dujy = 4.7
-            
     elif test == "quad4":
 
-        Cpx = 0.0
-        Cpy = 1.0
-        Cqx = 1.0
-        Cqy = 0.0
-        
         if vertex == 0:
-            # Lagrange vertex 10, vertex i: 4, vertex j: 8
-            dkp = 1.77538035254; lp = 3.8
-            dkq = 0.14794836271; lq = 4.8
+            # Lagrange vertex 10, vertex N: 4, vertex P: 8
+            jL = 1.0
+            rLx = -(8.7-8.3) + 0.14794836271
+            rLy = -(9.7-9.3) + 1.77538035254
+            jN = 1.3; duNx = 3.3; duNy = 4.3;
+            jP = 1.7; duPx = 3.7; duPy = 4.7;
             
-            # vertex i: 4
-            Aix = 1.3; Aiy = 1.3
-            rix = +9.8; riy = +8.8
-            uix = 8.3; uiy = 9.3
-            duix = 3.3; duiy = 4.3
-            
-            # vertex j: 8
-            Ajx = 1.7; Ajy = 1.7
-            rjx = -9.8; rjy = -8.8
-            ujx = 8.7; ujy = 9.7
-            dujx = 3.7; dujy = 4.7
-            
         elif vertex == 1:
-            # Lagrange vertex 11, vertex i: 5, vertex j: 9
-            dkp = 1.89546413727; lp = 3.0
-            dkq = 0.08241148423; lq = 4.0
-            
-            # vertex i: 5
-            Aix = 1.4; Aiy = 1.4
-            rix = +9.0; riy = +8.0
-            uix = 8.4; uiy = 9.4
-            duix = 3.4; duiy = 4.4
-            
-            # vertex j: 9
-            Ajx = 1.9; Ajy = 1.9
-            rjx = -9.0; rjy = -8.0
-            ujx = 8.9; ujy = 9.9
-            dujx = 3.9; dujy = 4.9
+            # Lagrange vertex 11, vertex N: 5, vertex P: 9
+            jL = 1.0
+            rLx = -(8.9-8.4) + 0.08241148423
+            rLy = -(9.9-9.4) + 1.89546413727
+            jN = 1.4; duNx = 3.4; duNy = 4.4;
+            jP = 1.9; duPx = 3.9; duPy = 4.9;
 
-    Sppi = Aix*Ajx / (Aix + Ajx)
-    Sqqi = Aix*Ajx / (Aix + Ajx)
+    Sinv = 1.0/(jL**2 * (1.0/jN + 1.0/jP))
+    duLx = Sinv * (-rLx + jL*(duPx - duNx))
+    duLy = Sinv * (-rLy + jL*(duPy - duNy))
 
-    Arux = rix / Aix - rjx / Ajx + uix - ujx
-    Aruy = riy / Aiy - rjy / Ajy + uiy - ujy
+    dduNx = jL / jN * duLx
+    dduNy = jL / jN * duLy
 
-    Arup = Cpx*Arux + Cpy*Aruy
-    Aruq = Cqx*Arux + Cqy*Aruy
-    Arupslip = -Arup - dkp 
-    Aruqslip = -Aruq - dkq 
+    dduPx = -jL / jP * duLx
+    dduPy = -jL / jP * duLy
+            
+    print duNx+dduNx,duNy+dduNy
+    print duPx+dduPx,duPy+dduPy
+    print duLx,duLy
 
-    dlp = Sppi * Arupslip
-    dlq = Sqqi * Aruqslip
-
-    dduix = +1.0/Aix * (Cpx*dlp + Cqx*dlq)
-    dduiy = +1.0/Aiy * (Cpy*dlp + Cqy*dlq)
-
-    ddujx = -1.0/Ajx * (Cpx*dlp + Cqx*dlq)
-    ddujy = -1.0/Ajy * (Cpy*dlp + Cqy*dlq)
-
-    print "Sppi",Sppi
-    print "Sqqi",Sqqi
-
-    print "Arup",Arup
-    print "Aruq",Aruq
-
-    print "Arupslip",Arupslip
-    print "Aruqslip",Aruqslip
-
-    print "dlp",dlp
-    print "dlq",dlq
-
-    print "dduix:",dduix
-    print "dduiy:",dduiy
-
-    print "ddujx:",ddujx
-    print "ddujy:",ddujy
-
-    print duix+dduix,duiy+dduiy
-    print dujx+ddujx,dujy+ddujy
-    print dlp,dlq
-
 # ----------------------------------------------------------------------
 elif test == "tet4" or test == "hex8":
 
     if test == "tet4":
 
-        Cpx = 0.0
-        Cpy = 1.0
-        Cpz = 0.0
-        Cqx = 0.0
-        Cqy = 0.0
-        Cqz = 1.0
-        Crx = 1.0
-        Cry = 0.0
-        Crz = 0.0
-
         if vertex == 0:
-            # Lagrange vertex 10, vertex i: 3, vertex j: 7
-            dkp = 1.82575588523; lp = 3.7
-            dkq = -0.55566483464; lq = 4.7
-            dkr = 0.07938069066; lr = 5.7
-            
-            # vertex i: 3
-            Aix = 1.2; Aiy = 1.2; Aiz = 1.2
-            rix = +9.7; riy = +7.7; riz = +8.7
-            uix = 7.2; uiy = 8.2; uiz = 9.2
-            duix = 3.2; duiy = 4.2; duiz = 5.2
-            
-            # vertex j: 7
-            Ajx = 1.6; Ajy = 1.6; Ajz = 1.6
-            rjx = -9.7; rjy = -7.7; rjz = -8.7
-            ujx = 7.6; ujy = 8.6; ujz = 9.6
-            dujx = 3.6; dujy = 4.6; dujz = 5.6
-            
+            # Lagrange vertex 10, vertex N: 3, vertex P: 7
+            jL = 1.0/3.0
+            rLx = -1.0/3.0*(7.6-7.2 + -0.07938069066)
+            rLy = -1.0/3.0*(8.6-8.2 + -1.82575588523)
+            rLz = -1.0/3.0*(9.6-9.2 + 0.55566483464)
+            jN = 1.2; duNx = 3.2; duNy = 4.2; duNz = 5.2;
+            jP = 1.6; duPx = 3.6; duPy = 4.6; duPz = 5.6;
+
         elif vertex == 1:
-            # Lagrange vertex 11, vertex i: 4, vertex j: 8
-            dkp = 1.69682900001; lp = 3.9
-            dkq = -0.56560966667; lq = 4.9
-            dkr = 0.14140241667; lr = 5.9
+            # Lagrange vertex 11, vertex N: 4, vertex P: 8
+            jL = 1.0/3.0
+            rLx = -1.0/3.0*(7.8-7.3 + -0.14140241667)
+            rLy = -1.0/3.0*(8.8-8.3 + -1.69682900001)
+            rLz = -1.0/3.0*(9.8-9.3 + 0.56560966667)
+            jN = 1.3; duNx = 3.3; duNy = 4.3; duNz = 5.3;
+            jP = 1.8; duPx = 3.8; duPy = 4.8; duPz = 5.8;
             
-            # vertex i: 4
-            Aix = 1.3; Aiy = 1.3; Aiz = 1.3
-            rix = +9.9; riy = +7.9; riz = +8.9
-            uix = 7.3; uiy = 8.3; uiz = 9.3
-            duix = 3.3; duiy = 4.3; duiz = 5.3
-            
-            # vertex j: 8
-            Ajx = 1.8; Ajy = 1.8; Ajz = 1.8
-            rjx = -9.9; rjy = -7.9; rjz = -8.9
-            ujx = 7.8; ujy = 8.8; ujz = 9.8
-            dujx = 3.8; dujy = 4.8; dujz = 5.8
-            
         elif vertex == 2:
-            # Lagrange vertex 12, vertex i: 5, vertex j: 9
-            dkp = 1.51709826228; lp = 3.1
-            dkq = -0.54615537442; lq = 4.1
-            dkr = 0.18205179147; lr = 5.1
+            # Lagrange vertex 12, vertex N: 5, vertex P: 9
+            jL = 1.0/3.0
+            rLx = -1.0/3.0*(7.0-7.4 + -0.18205179147)
+            rLy = -1.0/3.0*(8.0-8.4 + -1.51709826228)
+            rLz = -1.0/3.0*(9.0-9.4 + 0.54615537442)
+            jN = 1.4; duNx = 3.4; duNy = 4.4; duNz = 5.4;
+            jP = 1.0; duPx = 3.0; duPy = 4.0; duPz = 5.0;
             
-            # vertex i: 5
-            Aix = 1.4; Aiy = 1.4; Aiz = 1.4
-            rix = +9.1; riy = +7.1; riz = +8.1
-            uix = 7.4; uiy = 8.4; uiz = 9.4
-            duix = 3.4; duiy = 4.4; duiz = 5.4
-            
-            # vertex j: 9
-            Ajx = 1.0; Ajy = 1.0; Ajz = 1.0
-            rjx = -9.1; rjy = -7.1; rjz = -8.1
-            ujx = 7.0; ujy = 8.0; ujz = 9.0
-            dujx = 3.0; dujy = 4.0; dujz = 5.0
-            
     elif test == "hex8":
 
-        Cpx = 0.0
-        Cpy = -1.0
-        Cpz = 0.0
-        Cqx = 0.0
-        Cqy = 0.0
-        Cqz = +1.0
-        Crx = -1.0
-        Cry = 0.0
-        Crz = 0.0
-
         if vertex == 0:
-            # Lagrange vertex 18, vertex i: 6, vertex j: 14
-            dkp = 1.82575588523; lp = 3.4
-            dkq = -0.55566483464; lq = 4.4
-            dkr = 0.07938069066; lr = 5.4
+            # Lagrange vertex 18, vertex N: 6, vertex P: 14
+            jL = 1.0
+            rLx = -(5.3-4.5+0.07938069066)
+            rLy = -(7.3-6.5+1.82575588523)
+            rLz = -(9.3-8.5+0.55566483464)
+            jN = 1.5; duNx = 3.5; duNy = 4.5; duNz = 5.5;
+            jP = 1.3; duPx = 3.3; duPy = 4.3; duPz = 5.3;
             
-            # vertex i: 6
-            Aix = 1.5; Aiy = 1.5; Aiz = 1.5
-            rix = -9.4; riy = -5.4; riz = +7.4
-            uix = 4.5; uiy = 6.5; uiz = 8.5
-            duix = 3.5; duiy = 4.5; duiz = 5.5
-            
-            # vertex j: 14
-            Ajx = 1.3; Ajy = 1.3; Ajz = 1.3
-            rjx = +9.4; rjy = +5.4; rjz = -7.4
-            ujx = 5.3; ujy = 7.3; ujz = 9.3
-            dujx = 3.3; dujy = 4.3; dujz = 5.3
-            
         elif vertex == 1:
-            # Lagrange vertex 19, vertex i: 7, vertex j: 15
-            dkp = 1.69682900001; lp = 3.6
-            dkq = -0.56560966667; lq = 4.6
-            dkr = 0.14140241667; lr = 5.6
+            # Lagrange vertex 19, vertex N: 7, vertex P: 15
+            jL = 1.0
+            rLx = -(5.5-4.6+0.14140241667)
+            rLy = -(7.5-6.6+1.69682900001)
+            rLz = -(9.5-8.6+0.56560966667)
+            jN = 1.6; duNx = 3.6; duNy = 4.6; duNz = 5.6;
+            jP = 1.5; duPx = 3.5; duPy = 4.5; duPz = 5.5;
             
-            # vertex i: 7
-            Aix = 1.6; Aiy = 1.6; Aiz = 1.6
-            rix = -9.6; riy = -5.6; riz = +7.6
-            uix = 4.6; uiy = 6.6; uiz = 8.6
-            duix = 3.6; duiy = 4.6; duiz = 5.6
-            
-            # vertex j: 15
-            Ajx = 1.5; Ajy = 1.5; Ajz = 1.5
-            rjx = +9.6; rjy = +5.6; rjz = -7.6
-            ujx = 5.5; ujy = 7.5; ujz = 9.5
-            dujx = 3.5; dujy = 4.5; dujz = 5.5
-            
         elif vertex == 2:
-            # Lagrange vertex 20, vertex i: 8, vertex j: 16
-            dkp = 1.51709826228; lp = 3.8
-            dkq = -0.54615537442; lq = 4.8
-            dkr = 0.18205179147; lr = 5.8
+            # Lagrange vertex 20, vertex N: 8, vertex P: 16
+            jL = 1.0
+            rLx = -(5.7-4.7+0.18205179147)
+            rLy = -(7.7-6.7+1.51709826228)
+            rLz = -(9.7-8.7+0.54615537442)
+            jN = 1.7; duNx = 3.7; duNy = 4.7; duNz = 5.7;
+            jP = 1.7; duPx = 3.7; duPy = 4.7; duPz = 5.7;
             
-            # vertex i: 8
-            Aix = 1.7; Aiy = 1.7; Aiz = 1.7
-            rix = -9.8; riy = -5.8; riz = +7.8
-            uix = 4.7; uiy = 6.7; uiz = 8.7
-            duix = 3.7; duiy = 4.7; duiz = 5.7
-            
-            # vertex j: 16
-            Ajx = 1.7; Ajy = 1.7; Ajz = 1.7
-            rjx = +9.8; rjy = +5.8; rjz = -7.8
-            ujx = 5.7; ujy = 7.7; ujz = 9.7
-            dujx = 3.7; dujy = 4.7; dujz = 5.7
-            
         elif vertex == 3:
-            # Lagrange vertex 21, vertex i: 9, vertex j: 17
-            dkp = 1.29378670385; lp = 3.0
-            dkq = -0.49761027071; lq = 4.0
-            dkr = 0.19904410828; lr = 5.0
+            # Lagrange vertex 21, vertex N: 9, vertex P: 17
+            jL = 1.0
+            rLx = -(5.9-4.8+0.19904410828)
+            rLy = -(7.9-6.8+1.29378670385)
+            rLz = -(9.9-8.8+0.49761027071)
+            jN = 1.8; duNx = 3.8; duNy = 4.8; duNz = 5.8;
+            jP = 1.9; duPx = 3.9; duPy = 4.9; duPz = 5.9;
             
-            # vertex i: 9
-            Aix = 1.8; Aiy = 1.8; Aiz = 1.8
-            rix = -9.0; riy = -5.0; riz = +7.0
-            uix = 4.8; uiy = 6.8; uiz = 8.8
-            duix = 3.8; duiy = 4.8; duiz = 5.8
-            
-            # vertex j: 17
-            Ajx = 1.9; Ajy = 1.9; Ajz = 1.9
-            rjx = +9.0; rjy = +5.0; rjz = -7.0
-            ujx = 5.9; ujy = 7.9; ujz = 9.9
-            dujx = 3.9; dujy = 4.9; dujz = 5.9
-            
-    Sppi = Aix*Ajx / (Aix + Ajx)
-    Sqqi = Aiy*Ajy / (Aiy + Ajy)
-    Srri = Aiz*Ajz / (Aiz + Ajz)
+    Sinv = 1.0/(jL**2 * (1.0/jN + 1.0/jP))
+    duLx = Sinv * (-rLx + jL*(duPx - duNx))
+    duLy = Sinv * (-rLy + jL*(duPy - duNy))
+    duLz = Sinv * (-rLz + jL*(duPz - duNz))
 
-    Arux = rix / Aix - rjx / Ajx + uix - ujx
-    Aruy = riy / Aiy - rjy / Ajy + uiy - ujy
-    Aruz = riz / Aiz - rjz / Ajz + uiz - ujz
+    dduNx = jL / jN * duLx
+    dduNy = jL / jN * duLy
+    dduNz = jL / jN * duLz
 
-    Arup = Cpx*Arux + Cpy*Aruy + Cpz*Aruz
-    Aruq = Cqx*Arux + Cqy*Aruy + Cqz*Aruz
-    Arur = Crx*Arux + Cry*Aruy + Crz*Aruz
-    Arupslip = -Arup - dkp
-    Aruqslip = -Aruq - dkq
-    Arurslip = -Arur - dkr
+    dduPx = -jL / jP * duLx
+    dduPy = -jL / jP * duLy
+    dduPz = -jL / jP * duLz
+            
+    print duNx+dduNx,duNy+dduNy, duNz+dduNz
+    print duPx+dduPx,duPy+dduPy, duPz+dduPz
+    print duLx,duLy, duLz
 
-    dlp = Sppi * Arupslip
-    dlq = Sqqi * Aruqslip
-    dlr = Srri * Arurslip
-
-    dduix = +1.0/Aix * (Cpx*dlp + Cqx*dlq + Crx*dlr)
-    dduiy = +1.0/Aiy * (Cpy*dlp + Cqy*dlq + Cry*dlr)
-    dduiz = +1.0/Aiy * (Cpz*dlp + Cqz*dlq + Crz*dlr)
-
-    ddujx = -1.0/Ajx * (Cpx*dlp + Cqx*dlq + Crx*dlr)
-    ddujy = -1.0/Ajy * (Cpy*dlp + Cqy*dlq + Cry*dlr)
-    ddujz = -1.0/Ajz * (Cpz*dlp + Cqz*dlq + Crz*dlr)
-
-#     print "Sppi",Sppi
-#     print "Sqqi",Sqqi
-#     print "Srri",Srri
-
-#     print "Arup",Arup
-#     print "Aruq",Aruq
-#     print "Arur",Arur
-
-#     print "Arupslip",Arupslip
-#     print "Aruqslip",Aruqslip
-#     print "Arurslip",Arurslip
-
-#     print "dlp",dlp
-#     print "dlq",dlq
-#     print "dlr",dlr
-
-#     print "dduix:",dduix
-#     print "dduiy:",dduiy
-#     print "dduiz:",dduiz
-
-#     print "ddujx:",ddujx
-#     print "ddujy:",ddujy
-#     print "ddujz:",ddujz
-
-    print duix+dduix,duiy+dduiy,duiz+dduiz
-    print dujx+ddujx,dujy+ddujy,dujz+ddujz
-    print dlp,dlq,dlr
-

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/cohesivedyn.py
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/cohesivedyn.py	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/cohesivedyn.py	2011-10-17 22:23:48 UTC (rev 19086)
@@ -1,6 +1,6 @@
 cell = "hex8"
 dim = "3d"
-testCase = "slip"
+testCase = "open"
 
 import numpy
 
@@ -22,6 +22,28 @@
 
 
 # ----------------------------------------------------------------------
+def globalToFault(v, R):
+    """
+    Convert vector from global coordinate system to fault coordinate system.
+    """
+    (m,ndof) = v.shape
+
+    vF = numpy.dot(C, v.reshape(m*ndof,1))
+    return vF.reshape((m, ndof))
+
+
+# ----------------------------------------------------------------------
+def faultToGlobal(v, R):
+    """
+    Convert vector from fault coordinate system to global coordinate system.
+    """
+    (m,ndof) = v.shape
+
+    vG = numpy.dot(C.transpose(), v.reshape(m*ndof,1))
+    return vG.reshape((m, ndof))
+
+
+# ----------------------------------------------------------------------
 if dim == "2d":
     if cell == "tri3":
         dlagrange1 = numpy.zeros(2)
@@ -34,53 +56,56 @@
 
         fieldT = numpy.array([[8.6, 9.6],
                               [8.8, 9.8]])
-        fieldIncr = numpy.array([[9.6, -10.6],
-                                 [9.8, -10.8]])
-        area = numpy.array([1.0, 1.0])
+        fieldIncr = numpy.array([[1.6, 2.6],
+                                 [1.8, 2.8]])
+        L = numpy.array([[1.0, 0.0, 0.0, 0.0,],
+                         [0.0, 1.0, 0.0, 0.0,],
+                         [0.0, 0.0, 1.0, 0.0,],
+                         [0.0, 0.0, 0.0, 1.0,],]);
         C = numpy.array([[0.0, -1.0, 0.0, 0.0,],
                          [-1.0, 0.0, 0.0, 0.0,],
                          [0.0, 0.0, 0.0, -1.0,],
                          [0.0, 0.0, -1.0, 0.0,],]);
     
         jacobianN = numpy.array(
-            [[  1.0,  5.2,  4.2,  5.3,],
-             [  6.2,  1.0,  6.3,  7.2,],
-             [  8.2,  9.2,  1.0,  9.3,],
-             [ 10.2, 11.2, 10.3,  1.0,],])
+            [[  4.0,  -1.2,  -2.2,  -2.3,],
+             [  -1.2,  5.0,  -1.3,  -3.2,],
+             [  -2.2,  -1.3,  4.1,  -4.3,],
+             [  -2.3,  -3.2,  -4.3,  5.1,],])
 
         jacobianP = numpy.array(
-            [[  1.0, 17.5, 16.5, 17.6,],
-             [ 18.5,  1.0, 18.6, 19.5,],
-             [ 20.5, 21.5,  1.0, 21.6,],
-             [ 22.5, 23.5, 22.6,  1.0,],])
+            [[  5.0,  -1.2,  -2.2,  -2.3,],
+             [  -1.2,  4.0,  -1.3,  -3.2,],
+             [  -2.2,  -1.3,  5.1,  -4.3,],
+             [  -2.3,  -3.2,  -4.3,  4.1,],])
 
         disp = numpy.array([[ 8.1, 9.1,],
                             [ 8.2, 9.2,],
                             [ 8.3, 9.3,],
                             [ 8.4, 9.4,],
-                            [ 8.5, 9.5,],
-                            [ 8.7, 9.7,],
+                            [ 8.2, 9.2,],
+                            [ 8.3, 9.3,],
                             [ 8.6, 9.6,],
                             [ 8.8, 9.8,],])
 
         if testCase == "slip":
-            dispIncr = numpy.array([[ 9.1, 10.1,],
-                                    [ 9.2, 10.2,],
-                                    [ 9.3, 10.3,],
-                                    [ 9.4, 10.4,],
-                                    [ 9.5, 10.5,],
-                                    [ 9.7, 10.7,],
-                                    [ 9.6, -10.6,],
-                                    [ 9.8, -10.8,],])            
+            dispIncr = numpy.array([[ 9.1, 7.1,],
+                                    [ 9.2, 7.2,],
+                                    [ 9.3, 7.3,],
+                                    [ 9.4, 7.4,],
+                                    [ 9.2, 7.2,],
+                                    [ 9.3, 7.3,],
+                                    [ 1.6, 2.6,],
+                                    [ 1.8, 2.8,],])            
         elif testCase == "open":
-            dispIncr = numpy.array([[ 9.1, 10.1,],
-                                    [ 9.2, 10.2,],
-                                    [ 9.3, 10.3,],
-                                    [ 9.4, 10.4,],
-                                    [ 9.5, 10.5,],
-                                    [ 9.7, 10.7,],
-                                    [ 9.6, 10.6,],
-                                    [ 9.8, 10.8,],])
+            dispIncr = numpy.array([[ 9.1, 7.1,],
+                                    [ 9.2, 7.2,],
+                                    [ 9.3, 7.3,],
+                                    [ 9.4, 7.4,],
+                                    [ 9.2, 7.2,],
+                                    [ 9.3, 7.3,],
+                                    [ -10.6, 2.6,],
+                                    [ -10.8, 2.8,],])            
 
 
     elif cell == "tri3d":
@@ -92,13 +117,20 @@
         m = 6
         DOF = 2
 
-        fieldT = numpy.array([[6.8, 8.8],
-                              [6.0, 8.0],
-                              [7.2, 9.2]])
-        fieldIncr = numpy.array([[9.8, -10.8],
-                                 [9.0, -10.0],
-                                 [9.2, -10.2]])
-        area = numpy.array([2.0, 1.0, 1.0])
+        fieldT = numpy.array([[-3.8, 4.8],
+                              [3.0, 4.0],
+                              [3.2, 4.2]])
+        fieldIncr = numpy.array([[1.8, 0.8],
+                                 [1.0, 0.1],
+                                 [1.2, 0.2]])
+
+        L = numpy.array([[2.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+                         [0.0, 2.0, 0.0, 0.0, 0.0, 0.0],
+                         [0.0, 0.0, 1.0, 0.0, 0.0, 0.0],
+                         [0.0, 0.0, 0.0, 1.0, 0.0, 0.0],
+                         [0.0, 0.0, 0.0, 0.0, 1.0, 0.0],
+                         [0.0, 0.0, 0.0, 0.0, 0.0, 1.0]])
+
         C = numpy.array([[+0.70710678118654757, -0.70710678118654757, 0.0, 0.0, 0.0, 0.0,],
                          [-0.70710678118654757, -0.70710678118654757, 0.0, 0.0, 0.0, 0.0,],
                          [0.0, 0.0, 0.0, -1.0, 0.0, 0.0,],
@@ -107,20 +139,20 @@
                          [0.0, 0.0, 0.0, 0.0, 0.0, -1.0,],])
     
         jacobianN = numpy.array(
-            [[6.0, 7.3, 6.9, 7.4, 6.7, 7.6],
-             [3.1, 5.2, 3.2, 5.2, 3.4, 5.3],
-             [3.9, 2.7, 3.8, 2.8, 0.0, 0.0],
-             [4.1, 6.6, 4.2, 6.2, 0.0, 0.0],
-             [7.9, 8.1, 0.0, 0.0, 7.4, 8.5],
-             [6.4, 3.4, 0.0, 0.0, 6.1, 3.8]])
+            [[+6.0, -1.0, -1.1, -1.2, -1.3, -1.4],
+             [-1.0, +6.1, -0.9, -0.8, -0.7, -0.6],
+             [-1.1, -0.9, +6.2, -2.1,  0.0,  0.0],
+             [-1.2, -0.8, -2.1, +6.3,  0.0,  0.0],
+             [-1.3, -0.7,  0.0,  0.0, +6.4, -1.1],
+             [-1.4, -0.6,  0.0,  0.0, -1.1, +6.5]])
 
         jacobianP = numpy.array(
-            [[1.6, 4.1, 1.7, 4.2, 1.8, 4.3],
-             [4.6, 4.8, 4.7, 4.4, 4.8, 4.2],
-             [6.9, 5.3, 7.0, 5.9, 0.0, 0.0],
-             [7.2, 6.6, 7.3, 6.5, 0.0, 0.0],
-             [8.4, 7.8, 0.0, 0.0, 8.3, 7.1],
-             [6.3, 8.6, 0.0, 0.0, 4.7, 8.7]])
+            [[+5.0, -1.0, -1.1, -1.2, -1.3, -1.4],
+             [-1.0, +5.1, -0.9, -0.8, -0.7, -0.6],
+             [-1.1, -0.9, +5.2, -2.1,  0.0,  0.0],
+             [-1.2, -0.8, -2.1, +5.3,  0.0,  0.0],
+             [-1.3, -0.7,  0.0,  0.0, +5.4, -1.1],
+             [-1.4, -0.6,  0.0,  0.0, -1.1, +5.5]])
 
         disp = numpy.array([[ 6.1, 8.1,],
                             [ 6.2, 8.2,],
@@ -128,39 +160,39 @@
                             [ 6.4, 8.4,],
                             [ 6.5, 8.5,],
                             [ 6.6, 8.6,],
-                            [ 6.7, 8.7,],
-                            [ 6.9, 8.9,],
-                            [ 7.1, 9.1,],
-                            [ 6.8, 8.8,],
-                            [ 6.0, 8.0,],
-                            [ 7.2, 9.2,],])
+                            [ 6.2, 8.2,],
+                            [ 6.3, 8.3,],
+                            [ 6.5, 8.5,],
+                            [-3.8, 4.8,],
+                            [ 3.0, 4.0,],
+                            [ 3.2, 4.2,],])
 
         if testCase == "slip":
-            dispIncr = numpy.array([[ 9.1, 10.1,],
-                                    [ 9.2, 10.2,],
-                                    [ 9.3, 10.3,],
-                                    [ 9.4, 10.4,],
-                                    [ 9.5, 10.5,],
-                                    [ 9.6, 10.6,],
-                                    [ 9.7, 10.7,],
-                                    [ 9.9, 10.9,],
-                                    [ 9.1, 10.1,],
-                                    [ 9.8, -10.8,],
-                                    [ 9.0, -10.0,],
-                                    [ 9.2, -10.2,],])            
+            dispIncr = numpy.array([[ 1.1, 2.1,],
+                                    [ 1.2, 2.2,],
+                                    [ 1.3, 2.3,],
+                                    [ 1.4, 2.4,],
+                                    [ 1.5, 2.5,],
+                                    [ 1.6, 2.6,],
+                                    [ 1.2, 2.2,],
+                                    [ 1.3, 2.3,],
+                                    [ 1.5, 2.5,],
+                                    [ 1.8, 0.8,],
+                                    [ 1.0, 0.1,],
+                                    [ 1.2, 0.2,],])            
         elif testCase == "open":
-            dispIncr = numpy.array([[ 9.1, 10.1,],
-                                    [ 9.2, 10.2,],
-                                    [ 9.3, 10.3,],
-                                    [ 9.4, 10.4,],
-                                    [ 9.5, 10.5,],
-                                    [ 9.6, 10.6,],
-                                    [ 9.7, 10.7,],
-                                    [ 9.9, 10.9,],
-                                    [ 9.1, 10.1,],
-                                    [ 9.8, 10.8,],
-                                    [ 9.0, 10.0,],
-                                    [ 9.2, 10.2,],])            
+            dispIncr = numpy.array([[ 1.1, 2.1,],
+                                    [ 1.2, 2.2,],
+                                    [ 1.3, 2.3,],
+                                    [ 1.4, 2.4,],
+                                    [ 1.5, 2.5,],
+                                    [ 1.6, 2.6,],
+                                    [ 1.2, 2.2,],
+                                    [ 1.3, 2.3,],
+                                    [ 1.5, 2.5,],
+                                    [-10.8, 0.8,],
+                                    [-10.0, 0.1,],
+                                    [ 1.2, -10.2,],])            
 
 
     elif cell == "quad4":
@@ -174,25 +206,28 @@
 
         fieldT = numpy.array([[8.8, 9.8],
                               [8.0, 9.0]])
-        fieldIncr = numpy.array([[-9.8, -10.8],
-                                 [-9.0, -10.0]])
-        area = numpy.array([1.0, 1.0])
+        fieldIncr = numpy.array([[1.8, 2.8],
+                                 [1.0, 2.0]])
+        L = numpy.array([[1.0, 0.0, 0.0, 0.0,],
+                         [0.0, 1.0, 0.0, 0.0,],
+                         [0.0, 0.0, 1.0, 0.0,],
+                         [0.0, 0.0, 0.0, 1.0,],]);
         C = numpy.array([[0.0, -1.0, 0.0, 0.0,],
                          [-1.0, 0.0, 0.0, 0.0,],
                          [0.0, 0.0, 0.0, -1.0,],
                          [0.0, 0.0, -1.0, 0.0,],]);
     
         jacobianN = numpy.array(
-            [[  1.0,  8.1,  8.2,  8.3,],
-             [  9.9,  1.0, 10.0, 10.1,],
-             [ 11.7, 11.8,  1.0, 11.9,],
-             [ 13.5, 13.6, 13.7,  1.0,],])
+            [[  4.0,  -1.2,  -2.2,  -2.3,],
+             [  -1.2,  5.0,  -1.3,  -3.2,],
+             [  -2.2,  -1.3,  4.1,  -4.3,],
+             [  -2.3,  -3.2,  -4.3,  5.1,],])
 
         jacobianP = numpy.array(
-            [[  1.0, 23.7, 23.8, 23.9,],
-             [ 25.5,  1.0, 25.6, 25.7,],
-             [ 27.3, 27.4,  1.0, 27.5,],
-             [ 29.1, 29.2, 29.3,  1.0,],])
+            [[  5.0,  -1.2,  -2.2,  -2.3,],
+             [  -1.2,  4.0,  -1.3,  -3.2,],
+             [  -2.2,  -1.3,  5.1,  -4.3,],
+             [  -2.3,  -3.2,  -4.3,  4.1,],])
 
         disp = numpy.array([[ 8.1, 9.1,],
                             [ 8.2, 9.2,],
@@ -200,41 +235,43 @@
                             [ 8.4, 9.4,],
                             [ 8.5, 9.5,],
                             [ 8.6, 9.6,],
-                            [ 8.7, 9.7,],
-                            [ 8.9, 9.9,],
+                            [ 8.3, 9.3,],
+                            [ 8.4, 9.4,],
                             [ 8.8, 9.8,],
                             [ 8.0, 9.0,],])
 
         if testCase == "slip":
-            dispIncr = numpy.array([[ 9.1, 10.1,],
-                                    [ 9.2, 10.2,],
-                                    [ 9.3, 10.3,],
-                                    [ 9.4, 10.4,],
-                                    [ 9.5, 10.5,],
-                                    [ 9.6, 10.6,],
-                                    [ 9.7, 10.7,],
-                                    [ 9.9, 10.9,],
-                                    [ -9.8, -10.8,],
-                                    [ -9.0, -10.0,],])
-          
+            dispIncr = numpy.array([[ 1.1, 2.1,],
+                                    [ 1.2, 2.2,],
+                                    [ 1.3, 2.3,],
+                                    [ 1.4, 2.4,],
+                                    [ 1.5, 2.5,],
+                                    [ 1.6, 2.6,],
+                                    [ 1.3, 2.3,],
+                                    [ 1.4, 2.4,],
+                                    [ 1.8, 2.8,],
+                                    [ 1.0, 2.0,],])            
         elif testCase == "open":
-            dispIncr = numpy.array([[ 9.1, 10.1,],
-                                    [ 9.2, 10.2,],
-                                    [ 9.3, 10.3,],
-                                    [ 9.4, 10.4,],
-                                    [ 9.5, 10.5,],
-                                    [ 9.6, 10.6,],
-                                    [ 9.7, 10.7,],
-                                    [ 9.9, 10.9,],
-                                    [ 9.8, 10.8,],
-                                    [ 9.0, 10.0,],])
+            dispIncr = numpy.array([[ 1.1, 2.1,],
+                                    [ 1.2, 2.2,],
+                                    [ 1.3, 2.3,],
+                                    [ 1.4, 2.4,],
+                                    [ 1.5, 2.5,],
+                                    [ 1.6, 2.6,],
+                                    [ 1.3, 2.3,],
+                                    [ 1.4, 2.4,],
+                                    [ -10.8, 2.8,],
+                                    [ -10.0, 2.0,],])            
 
+
     # ------------------------------------------------------------------
     fieldTpdt = fieldT + fieldIncr
 
-    tractionShear = abs(fieldTpdt[:,0]) / area
-    tractionNormal = fieldTpdt[:,1] / area
+    fieldTpdt = globalToFault(fieldTpdt, C)
 
+    tractionShear = abs(fieldTpdt[:,0])
+    tractionNormal = fieldTpdt[:,1]
+
     print "tractionShear",tractionShear
     print "tractionNormal",tractionNormal
 
@@ -242,38 +279,38 @@
 
     print "friction",friction
 
-    lagrangeTpdt0 = friction * fieldTpdt[:,0] / tractionShear
-
-    lagrangeIncr0 = lagrangeTpdt0 - fieldT[:,0]
-
-    print "lagrangeIncr0",lagrangeIncr0
-
-    dlagrange0 = (tractionShear - friction) * fieldTpdt[:,0] / tractionShear
-    
+    dlagrange0 = (friction - tractionShear) * fieldTpdt[:,0] / tractionShear
+                           
     print "dlagrange0",dlagrange0
 
     if testCase == "slip": 
         dLagrange = numpy.vstack((dlagrange0, dlagrange1))
         dLagrange = numpy.transpose(dLagrange)
-        dLagrange = numpy.reshape(dLagrange, m)
+        dLagrange = faultToGlobal(dLagrange, C).reshape(m)
     elif testCase == "open":
         dLagrange = numpy.reshape(disp+dispIncr, n)
-        dLagrange = dLagrange[indexL]
+        dLagrange = -dLagrange[indexL]
 
     print "dLagrange \n", dLagrange
 
-    RHS = numpy.dot(numpy.transpose(C),dLagrange)
-    duN = -numpy.dot(inv(jacobianN),RHS)
-    duP = numpy.dot(inv(jacobianP),RHS)
+    RHS = numpy.dot(numpy.transpose(L),dLagrange)
+    print "RHS",RHS
+    duN = numpy.dot(inv(jacobianN),RHS)
+    duP = -numpy.dot(inv(jacobianP),RHS)
     
     dispRel = duP - duN
 
-    slipVertex = numpy.dot(C,dispRel)
+    dispTpdt = disp + dispIncr
+    dispTpdt = numpy.reshape(dispTpdt, n)
+
+    slipVertex = dispRel + dispTpdt[indexP]-dispTpdt[indexN]
     slipVertex = numpy.reshape(slipVertex, (m/DOF,DOF))
+    slipVertex = globalToFault(slipVertex, C)
     if testCase == "slip":
         slipVertex[:,1] = 0
     mask = slipVertex[:,1] < 0.0
     slipVertex[mask,1] = 0
+    slipVertex = faultToGlobal(slipVertex, C)
     slipVertex = numpy.reshape(slipVertex, m)
 
     print "duN \n", duN
@@ -281,15 +318,13 @@
 
     dispIncrE = dispIncr
     dispIncrE = numpy.reshape(dispIncrE, n)
+    dispIncrE[indexL] = dispIncrE[indexL] + dLagrange
+    dispIncrE[indexN] = dispIncrE[indexN] - 0.5*slipVertex
+    dispIncrE[indexP] = dispIncrE[indexP] + 0.5*slipVertex
+    dispIncrE = numpy.reshape(dispIncrE, (n/DOF,DOF))
 
-    dispIncrE[indexL] = dispIncrE[indexL] - dLagrange
-    dispIncrE[indexN] = dispIncrE[indexN] - \
-        0.5*numpy.dot(C.transpose(), slipVertex)
-    dispIncrE[indexP] = dispIncrE[indexP] + \
-        0.5*numpy.dot(C.transpose(), slipVertex)
-
-    dispIncrE = numpy.reshape(dispIncrE, (n/DOF,DOF))
     slipVertex = numpy.reshape(slipVertex, (m/DOF,DOF))
+    slipVertex = globalToFault(slipVertex, C)
 
     print "dispIncrE\n", printdata(dispIncrE)
     print "slipVertexE\n", printdata(slipVertex)
@@ -310,69 +345,86 @@
         fieldT = numpy.array([[7.7, 8.7, 9.7],
                               [7.9, 8.9, 9.9],
                               [7.1, 8.1, 9.1]])
-        fieldIncr = numpy.array([[8.7, 9.7, -10.7],
-                                 [8.9, 9.9, -10.9],
-                                 [8.1, 9.1, -10.1]])
-        area = numpy.array([1.0/3.0, 1.0/3.0, 1.0/3.0])
+        fieldIncr = numpy.array([[9.7, 2.7, 3.7],
+                                 [9.9, 2.9, 3.9],
+                                 [9.1, 2.1, 3.1]])
         
+        L = numpy.array([[1.0/3.0,0,0, 0.0,0,0, 0.0,0,0,],
+                         [0,1.0/3.0,0, 0,0.0,0, 0,0.0,0,],
+                         [0,0,1.0/3.0, 0,0,0.0, 0,0,0.0,],
+                         [0.0,0,0, 1.0/3.0,0,0, 0.0,0,0,],
+                         [0,0.0,0, 0,1.0/3.0,0, 0,0.0,0,],
+                         [0,0,0.0, 0,0,1.0/3.0, 0,0,0.0,],
+                         [0.0,0,0, 0.0,0,0, 1.0/3.0,0,0,],
+                         [0,0.0,0, 0,0.0,0, 0,1.0/3.0,0,],
+                         [0,0,0.0, 0,0,0.0, 0,0,1.0/3.0,]])
+
+        Cv = numpy.array([[ 0, -1, 0,],
+                          [ 0, 0, +1,],
+                          [ -1, 0, 0,],])
+        Zv = numpy.zeros([3,3])
+        C = numpy.vstack( (numpy.hstack((Cv, Zv, Zv)),
+                           numpy.hstack((Zv, Cv, Zv)),
+                           numpy.hstack((Zv, Zv, Cv)) ) )
+
         jacobianN = numpy.array(
-            [[1.0, 10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7],
-             [13.1, 1.0, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8], 
-             [16.2, 16.3, 1.0, 16.4, 16.5, 16.6, 16.7, 16.8, 16.9],
-             [19.3, 19.4, 19.5, 1.0, 19.6, 19.7, 19.8, 19.9, 20.0],
-             [22.4, 22.5, 22.6, 22.7, 1.0, 22.8, 22.9, 23.0, 23.1],
-             [25.5, 25.6, 25.7, 25.8, 25.9, 1.0, 26.0, 26.1, 26.2],
-             [28.6, 28.7, 28.8, 28.9, 29.0, 29.1, 1.0, 29.2, 29.3],
-             [31.7, 31.8, 31.9, 32.0, 32.1, 32.2, 32.3, 1.0, 32.4],
-             [34.8, 34.9, 35.0, 35.1, 35.2, 35.3, 35.4, 35.5, 1.0]])
+            [[ 4.0, -1.1, -1.2, -1.3, -1.4, -1.5, -1.6, -1.7, -1.8],
+             [-1.1,  4.1, -2.3, -2.4, -2.5, -2.6, -2.7, -2.8, -2.9], 
+             [-1.2, -2.3,  4.2, -1.0, -1.1, -1.2, -1.3, -1.4, -1.5],
+             [-1.3, -2.4, -1.0,  4.3, -0.2, -0.3, -0.4, -0.5, -0.6],
+             [-1.4, -2.5, -1.1, -0.2,  4.4, -0.9, -0.8, -0.7, -0.5],
+             [-1.5, -2.6, -1.2, -0.3, -0.9,  4.5, -1.1, -1.2, -1.3],
+             [-1.6, -2.7, -1.3, -0.4, -0.8, -1.1,  4.6, -1.8, -1.5],
+             [-1.7, -2.8, -1.4, -0.5, -0.7, -1.2, -1.8,  4.7, -1.1],
+             [-1.8, -2.9, -1.5, -0.6, -0.5, -1.3, -1.5, -1.1,  4.8]])
 
         jacobianP = numpy.array(
-            [[  1.0, 48.7, 48.8, 48.9, 49.0, 49.1, 49.2, 49.3, 49.4,],
-             [ 51.8,  1.0, 51.9, 52.0, 52.1, 52.2, 52.3, 52.4, 52.5,],
-             [ 54.9, 55.0,  1.0, 55.1, 55.2, 55.3, 55.4, 55.5, 55.6,],
-             [ 58.0, 58.1, 58.2,  1.0, 58.3, 58.4, 58.5, 58.6, 58.7,],
-             [ 61.1, 61.2, 61.3, 61.4,  1.0, 61.5, 61.6, 61.7, 61.8,],
-             [ 64.2, 64.3, 64.4, 64.5, 64.6,  1.0, 64.7, 64.8, 64.9,],
-             [ 67.3, 67.4, 67.5, 67.6, 67.7, 67.8,  1.0, 67.9, 68.0,],
-             [ 70.4, 70.5, 70.6, 70.7, 70.8, 70.9, 71.0,  1.0, 71.1,],
-             [ 73.5, 73.6, 73.7, 73.8, 73.9, 74.0, 74.1, 74.2,  1.0,],])
+            [[ 5.0, -1.1, -1.2, -1.3, -1.4, -1.5, -1.6, -1.7, -1.8],
+             [-1.1,  5.1, -2.3, -2.4, -2.5, -2.6, -2.7, -2.8, -2.9], 
+             [-1.2, -2.3,  5.2, -1.0, -1.1, -1.2, -1.3, -1.4, -1.5],
+             [-1.3, -2.4, -1.0,  5.3, -0.2, -0.3, -0.4, -0.5, -0.6],
+             [-1.4, -2.5, -1.1, -0.2,  5.4, -0.9, -0.8, -0.7, -0.5],
+             [-1.5, -2.6, -1.2, -0.3, -0.9,  5.5, -1.1, -1.2, -1.3],
+             [-1.6, -2.7, -1.3, -0.4, -0.8, -1.1,  5.6, -1.8, -1.5],
+             [-1.7, -2.8, -1.4, -0.5, -0.7, -1.2, -1.8,  5.7, -1.1],
+             [-1.8, -2.9, -1.5, -0.6, -0.5, -1.3, -1.5, -1.1,  5.8]])
 
         disp = numpy.array([[ 7.1, 8.1, 9.1,],
                             [ 7.2, 8.2, 9.2,],
                             [ 7.3, 8.3, 9.3,],
                             [ 7.4, 8.4, 9.4,],
                             [ 7.5, 8.5, 9.5,],
-                            [ 7.6, 8.6, 9.6,],
-                            [ 7.8, 8.8, 9.8,],
-                            [ 7.0, 8.0, 9.0,],
+                            [ 7.2, 8.2, 9.2,],
+                            [ 7.3, 8.3, 9.3,],
+                            [ 7.4, 8.4, 9.4,],
                             [ 7.7, 8.7, 9.7,],
                             [ 7.9, 8.9, 9.9,],
                             [ 7.1, 8.1, 9.1,],])
 
         if testCase == "slip":
-            dispIncr = numpy.array([[ 8.1, 9.1, 10.1,],
-                                    [ 8.2, 9.2, 10.2,],
-                                    [ 8.3, 9.3, 10.3,],
-                                    [ 8.4, 9.4, 10.4,],
-                                    [ 8.5, 9.5, 10.5,],
-                                    [ 8.6, 9.6, 10.6,],
-                                    [ 8.8, 9.8, 10.8,],
-                                    [ 8.0, 9.0, 10.0,],
-                                    [ 8.7, 9.7, -10.7,],
-                                    [ 8.9, 9.9, -10.9,],
-                                    [ 8.1, 9.1, -10.1,],])            
+            dispIncr = numpy.array([[ 1.1, 2.1, 3.1,],
+                                    [ 1.2, 2.2, 3.2,],
+                                    [ 1.3, 2.3, 3.3,],
+                                    [ 1.4, 2.4, 3.4,],
+                                    [ 1.5, 2.5, 3.5,],
+                                    [ 1.2, 2.2, 3.2,],
+                                    [ 1.3, 2.3, 3.3,],
+                                    [ 1.4, 2.4, 3.4,],
+                                    [ 9.7, 2.7, 3.7,],
+                                    [ 9.9, 2.9, 3.9,],
+                                    [ 9.1, 2.1, 3.1,],])            
         elif testCase == "open":
-            dispIncr = numpy.array([[ 8.1, 9.1, 10.1,],
-                                    [ 8.2, 9.2, 10.2,],
-                                    [ 8.3, 9.3, 10.3,],
-                                    [ 8.4, 9.4, 10.4,],
-                                    [ 8.5, 9.5, 10.5,],
-                                    [ 8.6, 9.6, 10.6,],
-                                    [ 8.8, 9.8, 10.8,],
-                                    [ 8.0, 9.0, 10.0,],
-                                    [ 8.7, 9.7, 10.7,],
-                                    [ 8.9, 9.9, 10.9,],
-                                    [ 8.1, 9.1, 10.1,],])
+            dispIncr = numpy.array([[ 1.1, 2.1, 3.1,],
+                                    [ 1.2, 2.2, 3.2,],
+                                    [ 1.3, 2.3, 3.3,],
+                                    [ 1.4, 2.4, 3.4,],
+                                    [ 1.5, 2.5, 3.5,],
+                                    [ 1.2, 2.2, 3.2,],
+                                    [ 1.3, 2.3, 3.3,],
+                                    [ 1.4, 2.4, 3.4,],
+                                    [-20.7,  2.7, 3.7,],
+                                    [-20.9,  2.9, 3.9,],
+                                    [-20.1,  2.1, 3.1,],])            
 
 
     elif cell == "hex8":
@@ -384,115 +436,141 @@
         m = 12
         DOF = 3
 
-        fieldT = numpy.array([[5.4, 7.4, 9.4],
-                              [5.6, 7.6, 9.6],
-                              [5.8, 7.8, 9.8],
-                              [5.0, 7.0, 9.0]])
-        fieldIncr = numpy.array([[-6.4, -8.4, -10.4],
-                                 [-6.6, -8.6, -10.6],
-                                 [-6.8, -8.8, -10.8],
-                                 [-6.0, -8.0, -10.0]])
-        area = numpy.array([1.0, 1.0, 1.0, 1.0])
-    
+        a0 = 1.0
+        a1 = 0.0
+        a2 = 0.0
+        L = numpy.array([[a0, 0, 0, a1, 0, 0, a1, 0, 0, a2, 0, 0],
+                         [0, a0, 0, 0, a1, 0, 0, a1, 0, 0, a2, 0],
+                         [0, 0, a0, 0, 0, a1, 0, 0, a1, 0, 0, a2],
+                         [a1, 0, 0, a0, 0, 0, a2, 0, 0, a1, 0, 0],
+                         [0, a1, 0, 0, a0, 0, 0, a2, 0, 0, a1, 0],
+                         [0, 0, a1, 0, 0, a0, 0, 0, a2, 0, 0, a1],
+                         [a1, 0, 0, a2, 0, 0, a0, 0, 0, a1, 0, 0],
+                         [0, a1, 0, 0, a2, 0, 0, a0, 0, 0, a1, 0],
+                         [0, 0, a1, 0, 0, a2, 0, 0, a0, 0, 0, a1],
+                         [a2, 0, 0, a1, 0, 0, a1, 0, 0, a0, 0, 0],
+                         [0, a2, 0, 0, a1, 0, 0, a1, 0, 0, a0, 0],
+                         [0, 0, a2, 0, 0, a1, 0, 0, a1, 0, 0, a0]])
+
+        fieldT = numpy.array([[4.4, 2.4, 3.4],
+                              [4.6, 2.6, 3.6],
+                              [4.8, 2.8, 3.8],
+                              [4.0, 2.0, 3.0]])
+        fieldIncr = numpy.array([[1.4, 2.4, 0.4],
+                                 [1.6, 2.6, 0.6],
+                                 [1.8, 2.8, 0.8],
+                                 [1.0, 2.0, 0.2]])
+
+        Cv = numpy.array([[ 0, -1, 0,],
+                          [ 0, 0, +1,],
+                          [ -1, 0, 0,],])
+        Zv = numpy.zeros([3,3])
+        C = numpy.vstack( (numpy.hstack((Cv, Zv, Zv, Zv)),
+                           numpy.hstack((Zv, Cv, Zv, Zv)),
+                           numpy.hstack((Zv, Zv, Cv, Zv)),
+                           numpy.hstack((Zv, Zv, Zv, Cv)) ) )
+
         jacobianN = numpy.array(
-            [[   1.0,  72.1,  72.2,  72.3,  72.4,  72.5,  72.6,  72.7,  72.8,  72.9,  73.0,  73.1,],
-             [  77.9,   1.0,  78.0,  78.1,  78.2,  78.3,  78.4,  78.5,  78.6,  78.7,  78.8,  78.9,],
-             [  83.7,  83.8,   1.0,  83.9,  84.0,  84.1,  84.2,  84.3,  84.4,  84.5,  84.6,  84.7,],
-             [  89.5,  89.6,  89.7,   1.0,  89.8,  89.9,  90.0,  90.1,  90.2,  90.3,  90.4,  90.5,],
-             [  95.3,  95.4,  95.5,  95.6,   1.0,  95.7,  95.8,  95.9,  96.0,  96.1,  96.2,  96.3,],
-             [ 101.1, 101.2, 101.3, 101.4, 101.5,   1.0, 101.6, 101.7, 101.8, 101.9, 102.0, 102.1,],
-             [ 106.9, 107.0, 107.1, 107.2, 107.3, 107.4,   1.0, 107.5, 107.6, 107.7, 107.8, 107.9,],
-             [ 112.7, 112.8, 112.9, 113.0, 113.1, 113.2, 113.3,   1.0, 113.4, 113.5, 113.6, 113.7,],
-             [ 118.5, 118.6, 118.7, 118.8, 118.9, 119.0, 119.1, 119.2,   1.0, 119.3, 119.4, 119.5,],
-             [ 124.3, 124.4, 124.5, 124.6, 124.7, 124.8, 124.9, 125.0, 125.1,   1.0, 125.2, 125.3,],
-             [ 130.1, 130.2, 130.3, 130.4, 130.5, 130.6, 130.7, 130.8, 130.9, 131.0,   1.0, 131.1,],
-             [ 135.9, 136.0, 136.1, 136.2, 136.3, 136.4, 136.5, 136.6, 136.7, 136.8, 136.9,   1.0,],])
+            [[+6.0, -0.5, -0.6, -0.7, -0.8, -0.9, -1.0, -0.8, -0.7, -0.6, -0.5, -0.4,],
+             [-0.5, +6.1, -1.0, -1.1, -1.2, -1.3, -1.4, -1.3, -1.2, -1.1, -1.0, -0.9,],
+             [-0.6, -1.0, +6.2, -0.5, -0.6, -0.7, -0.8, -0.9, -0.8, -0.7, -0.6, -0.5,],
+             [-0.7, -1.1, -0.5, +6.3, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1,],
+             [-0.8, -1.2, -0.6, -0.8, +6.4, -0.3, -0.4, -0.5, -0.6, -0.7, -0.8, -0.9,],
+             [-0.9, -1.3, -0.7, -0.7, -0.3, +6.5, -0.3, -0.8, -0.7, -0.6, -0.9, -0.7,],
+             [-1.0, -1.4, -0.8, -0.6, -0.4, -0.3, +6.6, -1.1, -0.8, -0.7, -0.6, -0.5,],
+             [-0.8, -1.3, -0.9, -0.5, -0.5, -0.8, -1.1, +6.7, -0.8, -0.9, -1.0, -1.1,],
+             [-0.7, -1.2, -0.8, -0.4, -0.6, -0.7, -0.8, -0.8, +6.8, -1.0, -1.1, -1.2,],
+             [-0.6, -1.1, -0.7, -0.3, -0.7, -0.6, -0.7, -0.9, -1.0, +6.9, -0.5, -0.4,],
+             [-0.5, -1.0, -0.6, -0.2, -0.8, -0.9, -0.6, -1.0, -1.1, -0.5, +6.0, -1.2,],
+             [-0.4, -0.9, -0.5, -0.1, -0.9, -0.7, -0.5, -1.1, -1.2, -0.4, -1.2, +6.1,],])
 
 
         jacobianP = numpy.array(
-            [[   1.0, 214.9, 215.0, 215.1, 215.2, 215.3, 215.4, 215.5, 215.6, 215.7, 215.8, 215.9,],
-             [ 220.7,   1.0, 220.8, 220.9, 221.0, 221.1, 221.2, 221.3, 221.4, 221.5, 221.6, 221.7,],
-             [ 226.5, 226.6,   1.0, 226.7, 226.8, 226.9, 227.0, 227.1, 227.2, 227.3, 227.4, 227.5,],
-             [ 232.3, 232.4, 232.5,   1.0, 232.6, 232.7, 232.8, 232.9, 233.0, 233.1, 233.2, 233.3,],
-             [ 238.1, 238.2, 238.3, 238.4,   1.0, 238.5, 238.6, 238.7, 238.8, 238.9, 239.0, 239.1,],
-             [ 243.9, 244.0, 244.1, 244.2, 244.3,   1.0, 244.4, 244.5, 244.6, 244.7, 244.8, 244.9,],
-             [ 249.7, 249.8, 249.9, 250.0, 250.1, 250.2,   1.0, 250.3, 250.4, 250.5, 250.6, 250.7,],
-             [ 255.5, 255.6, 255.7, 255.8, 255.9, 256.0, 256.1,   1.0, 256.2, 256.3, 256.4, 256.5,],
-             [ 261.3, 261.4, 261.5, 261.6, 261.7, 261.8, 261.9, 262.0,   1.0, 262.1, 262.2, 262.3,],
-             [ 267.1, 267.2, 267.3, 267.4, 267.5, 267.6, 267.7, 267.8, 267.9,   1.0, 268.0, 268.1,],
-             [ 272.9, 273.0, 273.1, 273.2, 273.3, 273.4, 273.5, 273.6, 273.7, 273.8,   1.0, 273.9,],
-             [ 278.7, 278.8, 278.9, 279.0, 279.1, 279.2, 279.3, 279.4, 279.5, 279.6, 279.7,   1.0,],])
+            [[+7.0, -0.5, -0.6, -0.7, -0.8, -0.9, -1.0, -0.8, -0.7, -0.6, -0.5, -0.4,],
+             [-0.5, +7.1, -1.0, -1.1, -1.2, -1.3, -1.4, -1.3, -1.2, -1.1, -1.0, -0.9,],
+             [-0.6, -1.0, +7.2, -0.5, -0.6, -0.7, -0.8, -0.9, -0.8, -0.7, -0.6, -0.5,],
+             [-0.7, -1.1, -0.5, +7.3, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1,],
+             [-0.8, -1.2, -0.6, -0.8, +7.4, -0.3, -0.4, -0.5, -0.6, -0.7, -0.8, -0.9,],
+             [-0.9, -1.3, -0.7, -0.7, -0.3, +7.5, -0.3, -0.8, -0.7, -0.6, -0.9, -0.7,],
+             [-1.0, -1.4, -0.8, -0.6, -0.4, -0.3, +7.6, -1.1, -0.8, -0.7, -0.6, -0.5,],
+             [-0.8, -1.3, -0.9, -0.5, -0.5, -0.8, -1.1, +7.7, -0.8, -0.9, -1.0, -1.1,],
+             [-0.7, -1.2, -0.8, -0.4, -0.6, -0.7, -0.8, -0.8, +7.8, -1.0, -1.1, -1.2,],
+             [-0.6, -1.1, -0.7, -0.3, -0.7, -0.6, -0.7, -0.9, -1.0, +7.9, -0.5, -0.4,],
+             [-0.5, -1.0, -0.6, -0.2, -0.8, -0.9, -0.6, -1.0, -1.1, -0.5, +7.0, -1.2,],
+             [-0.4, -0.9, -0.5, -0.1, -0.9, -0.7, -0.5, -1.1, -1.2, -0.4, -1.2, +7.1,],])
 
-        disp = numpy.array([[ 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,],
-                            [ 4.6, 6.6, 8.6,],
-                            [ 4.7, 6.7, 8.7,],
-                            [ 4.8, 6.8, 8.8,],
-                            [ 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,],
-                            [ 5.5, 7.5, 9.5,],
-                            [ 5.7, 7.7, 9.7,],
-                            [ 5.9, 7.9, 9.9,],
-                            [ 5.4, 7.4, 9.4,],
-                            [ 5.6, 7.6, 9.6,],
-                            [ 5.8, 7.8, 9.8,],
-                            [ 5.0, 7.0, 9.0,],])
+        disp = numpy.array([[ 4.1, 2.1, 3.1,],
+                            [ 4.2, 2.2, 3.2,],
+                            [ 4.3, 2.3, 3.3,],
+                            [ 4.4, 2.4, 3.4,],
+                            [ 4.5, 2.5, 3.5,],
+                            [ 4.6, 2.6, 3.6,],
+                            [ 4.7, 2.7, 3.7,],
+                            [ 4.8, 2.8, 3.8,],
+                            [ 4.9, 2.9, 3.9,],
+                            [ 4.0, 2.0, 3.0,],
+                            [ 4.1, 2.1, 3.1,],
+                            [ 4.2, 2.2, 3.2,],
+                            [ 4.5, 2.5, 3.5,],
+                            [ 4.6, 2.6, 3.6,],
+                            [ 4.7, 2.7, 3.7,],
+                            [ 4.8, 2.8, 3.8,],
+                            [ 4.4, 2.4, 3.4,],
+                            [ 4.6, 2.6, 3.6,],
+                            [ 4.8, 2.8, 3.8,],
+                            [ 4.0, 2.0, 3.0,],])
 
         if testCase == "slip":
-            dispIncr = numpy.array([[ 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,],
-                                    [ 5.6, 7.6, 9.6,],
-                                    [ 5.7, 7.7, 9.7,],
-                                    [ 5.8, 7.8, 9.8,],
-                                    [ 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,],
-                                    [ 6.5, 8.5, 10.5,],
-                                    [ 6.7, 8.7, 10.7,],
-                                    [ 6.9, 8.9, 10.9,],
-                                    [ -6.4, -8.4, -10.4,],
-                                    [ -6.6, -8.6, -10.6,],
-                                    [ -6.8, -8.8, -10.8,],
-                                    [ -6.0, -8.0, -10.0,],])          
+            dispIncr = numpy.array([[ 1.1, 2.1, 0.1,],
+                                    [ 1.2, 2.2, 0.2,],
+                                    [ 1.3, 2.3, 0.3,],
+                                    [ 1.4, 2.4, 0.4,],
+                                    [ 1.5, 2.5, 0.5,],
+                                    [ 1.6, 2.6, 0.6,],
+                                    [ 1.7, 2.7, 0.7,],
+                                    [ 1.8, 2.8, 0.8,],
+                                    [ 1.9, 2.9, 0.9,],
+                                    [ 1.0, 2.0, 0.0,],
+                                    [ 1.1, 2.1, 0.1,],
+                                    [ 1.2, 2.2, 0.2,],
+                                    [ 1.5, 2.5, 0.5,],
+                                    [ 1.6, 2.6, 0.6,],
+                                    [ 1.7, 2.7, 0.7,],
+                                    [ 1.8, 2.8, 0.8,],
+                                    [ 1.4, 2.4, 0.4,],
+                                    [ 1.6, 2.6, 0.6,],
+                                    [ 1.8, 2.8, 0.8,],
+                                    [ 1.0, 2.0, 0.2,],])          
         elif testCase == "open":
-            dispIncr = numpy.array([[ 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,],
-                                    [ 5.6, 7.6, 9.6,],
-                                    [ 5.7, 7.7, 9.7,],
-                                    [ 5.8, 7.8, 9.8,],
-                                    [ 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,],
-                                    [ 6.5, 8.5, 10.5,],
-                                    [ 6.7, 8.7, 10.7,],
-                                    [ 6.9, 8.9, 10.9,],
-                                    [ 6.4, 8.4, 10.4,],
-                                    [ 6.6, 8.6, 10.6,],
-                                    [ 6.8, 8.8, 10.8,],
-                                    [ 6.0, 8.0, 10.0,],])
+            dispIncr = numpy.array([[ 1.1, 2.1, 0.1,],
+                                    [ 1.2, 2.2, 0.2,],
+                                    [ 1.3, 2.3, 0.3,],
+                                    [ 1.4, 2.4, 0.4,],
+                                    [ 1.5, 2.5, 0.5,],
+                                    [ 1.6, 2.6, 0.6,],
+                                    [ 1.7, 2.7, 0.7,],
+                                    [ 1.8, 2.8, 0.8,],
+                                    [ 1.9, 2.9, 0.9,],
+                                    [ 1.0, 2.0, 0.0,],
+                                    [ 1.1, 2.1, 0.1,],
+                                    [ 1.2, 2.2, 0.2,],
+                                    [ 1.5, 2.5, 0.5,],
+                                    [ 1.6, 2.6, 0.6,],
+                                    [ 1.7, 2.7, 0.7,],
+                                    [ 1.8, 2.8, 0.8,],
+                                    [-10.4, 2.4, 0.4,],
+                                    [-10.6, 2.6, 0.6,],
+                                    [-10.8, 2.8, 0.8,],
+                                    [-10.0, 2.0, 0.2,],])          
 
     # ------------------------------------------------------------------
     fieldTpdt = fieldT + fieldIncr
 
-    tractionShear = (fieldTpdt[:,0]**2 + fieldTpdt[:,1]**2)**0.5 / area
-    tractionNormal = fieldTpdt[:,2] / area
+    fieldTpdt = globalToFault(fieldTpdt, C)
 
+    tractionShear = (fieldTpdt[:,0]**2 + fieldTpdt[:,1]**2)**0.5
+    tractionNormal = fieldTpdt[:,2]
+
     print "tractionShear",tractionShear
     print "tractionNormal",tractionNormal
 
@@ -500,61 +578,40 @@
 
     print "friction",friction
 
-    lagrangeTpdt0 = friction * fieldTpdt[:,0] / tractionShear
-    lagrangeTpdt1 = friction * fieldTpdt[:,1] / tractionShear
-
-    lagrangeIncr0 = lagrangeTpdt0 - fieldT[:,0]
-    lagrangeIncr1 = lagrangeTpdt1 - fieldT[:,1]
-
-    print "lagrangeIncr0",lagrangeIncr0
-    print "lagrangeIncr1",lagrangeIncr1
-
-    dlagrange0 = (tractionShear - friction) * fieldTpdt[:,0] / tractionShear
-    dlagrange1 = (tractionShear - friction) * fieldTpdt[:,1] / tractionShear
-    
+    dlagrange0 = (friction - tractionShear) * fieldTpdt[:,0] / tractionShear
+    dlagrange1 = (friction - tractionShear) * fieldTpdt[:,1] / tractionShear
+                           
     print "dlagrange0",dlagrange0
     print "dlagrange1",dlagrange1
 
-    D = numpy.array([[ 0, -1, 0,],
-                     [ 0, 0, +1,],
-                     [ -1, 0, 0,],])
-
-    Z = numpy.zeros([3,3])
-
-    if cell == "tet4":
-        C1 = numpy.hstack((D, Z, Z))
-        C2 = numpy.hstack((Z, D, Z))
-        C3 = numpy.hstack((Z, Z, D))
-        C = numpy.vstack((C1, C2, C3))
-    elif cell == "hex8":
-        C1 = numpy.hstack((D, Z, Z, Z))
-        C2 = numpy.hstack((Z, D, Z, Z))
-        C3 = numpy.hstack((Z, Z, D, Z))
-        C4 = numpy.hstack((Z, Z, Z, D))        
-        C = numpy.vstack((C1, C2, C3, C4))
-
     if testCase == "slip": 
         dLagrange = numpy.vstack((dlagrange0, dlagrange1, dlagrange2))
         dLagrange = numpy.transpose(dLagrange)
-        dLagrange = numpy.reshape(dLagrange, m)
+        dLagrange = faultToGlobal(dLagrange, C).reshape(m)
     elif testCase == "open":
         dLagrange = numpy.reshape(disp+dispIncr, n)
-        dLagrange = dLagrange[indexL]
+        dLagrange = -dLagrange[indexL]
 
     print "dLagrange \n", dLagrange
 
-    RHS = numpy.dot(numpy.transpose(C),dLagrange)
-    duN = -numpy.dot(inv(jacobianN),RHS)
-    duP = numpy.dot(inv(jacobianP),RHS)
+    RHS = numpy.dot(numpy.transpose(L),dLagrange)
+    print "RHS",RHS
+    duN = numpy.dot(inv(jacobianN),RHS)
+    duP = -numpy.dot(inv(jacobianP),RHS)
     
     dispRel = duP - duN
 
-    slipVertex = numpy.dot(C,dispRel)
+    dispTpdt = disp + dispIncr
+    dispTpdt = numpy.reshape(dispTpdt, n)
+
+    slipVertex = dispRel + dispTpdt[indexP]-dispTpdt[indexN]
     slipVertex = numpy.reshape(slipVertex, (m/DOF,DOF))
+    slipVertex = globalToFault(slipVertex, C)
     if testCase == "slip":
-        slipVertex[:,2] = 0    
+        slipVertex[:,2] = 0
     mask = slipVertex[:,2] < 0.0
     slipVertex[mask,2] = 0
+    slipVertex = faultToGlobal(slipVertex, C)
     slipVertex = numpy.reshape(slipVertex, m)
 
     print "duN \n", duN
@@ -563,15 +620,13 @@
     dispIncrE = dispIncr
     dispIncrE = numpy.reshape(dispIncrE, n)
 
-    dispIncrE[indexL] = dispIncrE[indexL] - dLagrange
-    dispIncrE[indexN] = dispIncrE[indexN] - \
-        0.5*numpy.dot(C.transpose(), slipVertex)
-    dispIncrE[indexP] = dispIncrE[indexP] + \
-        0.5*numpy.dot(C.transpose(), slipVertex)
+    dispIncrE[indexL] = dispIncrE[indexL] + dLagrange
+    dispIncrE[indexN] = dispIncrE[indexN] - 0.5*slipVertex
+    dispIncrE[indexP] = dispIncrE[indexP] + 0.5*slipVertex
+    dispIncrE = numpy.reshape(dispIncrE, (n/DOF,DOF))
 
-    dispIncrE = numpy.reshape(dispIncrE, (n/DOF,DOF))
     slipVertex = numpy.reshape(slipVertex, (m/DOF,DOF))
+    slipVertex = globalToFault(slipVertex, C)
 
     print "dispIncrE\n", printdata(dispIncrE)
     print "slipVertexE\n", printdata(slipVertex)
-

Modified: short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/hex8_initialtract.spatialdb
===================================================================
--- short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/hex8_initialtract.spatialdb	2011-10-17 21:11:17 UTC (rev 19085)
+++ short/3D/PyLith/branches/v1.6-stable/unittests/libtests/faults/data/hex8_initialtract.spatialdb	2011-10-17 22:23:48 UTC (rev 19086)
@@ -11,7 +11,7 @@
     space-dim = 3
   }
 }
-0.0  -0.57735027  -0.57735027    1.0000    2.0000   -3.0000
-0.0   0.57735027  -0.57735027    1.1000    2.1000   -3.1000
-0.0  -0.57735027   0.57735027    1.2000    2.2000   -3.2000
-0.0   0.57735027   0.57735027    1.3000    2.3000   -3.3000
+0.0  -1.0  -1.0    1.0000    2.0000   -3.0000
+0.0   1.0  -1.0    1.1000    2.1000   -3.1000
+0.0  -1.0   1.0    1.2000    2.2000   -3.2000
+0.0   1.0   1.0    1.3000    2.3000   -3.3000



More information about the CIG-COMMITS mailing list