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

surendra at geodynamics.org surendra at geodynamics.org
Mon Jan 18 23:16:23 PST 2010


Author: surendra
Date: 2010-01-18 23:16:22 -0800 (Mon, 18 Jan 2010)
New Revision: 16144

Added:
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/faults/data/hex8_initialtract.spatialdb
   short/3D/PyLith/trunk/unittests/libtests/faults/data/tet4_initialtract.spatialdb
Modified:
   short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am
   short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc
   short/3D/PyLith/trunk/unittests/libtests/faults/data/Makefile.am
Log:
Added Hex8 Tet4 unittests for friction and tests passed

Modified: short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am	2010-01-18 22:16:36 UTC (rev 16143)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am	2010-01-19 07:16:22 UTC (rev 16144)
@@ -48,6 +48,8 @@
 	TestFaultCohesiveDynL.cc \
 	TestFaultCohesiveDynLTri3.cc \
 	TestFaultCohesiveDynLQuad4.cc \
+	TestFaultCohesiveDynLHex8.cc \
+	TestFaultCohesiveDynLTet4.cc \
 	test_faults.cc
 
 
@@ -77,7 +79,9 @@
 	TestFaultCohesiveKinSrcsHex8.hh \
 	TestFaultCohesiveDynL.hh \
 	TestFaultCohesiveDynLTri3.hh \
-	TestFaultCohesiveDynLQuad4.hh
+	TestFaultCohesiveDynLQuad4.hh \
+	TestFaultCohesiveDynLHex8.hh \
+	TestFaultCohesiveDynLTet4.hh
 
 # Source files associated with testing data
 testfaults_SOURCES += \
@@ -137,7 +141,9 @@
 	data/CohesiveKinSrcsDataHex8.cc \
 	data/CohesiveDynLData.cc \
 	data/CohesiveDynLDataTri3.cc \
-	data/CohesiveDynLDataQuad4.cc
+	data/CohesiveDynLDataQuad4.cc \
+	data/CohesiveDynLDataHex8.cc \
+	data/CohesiveDynLDataTet4.cc
 
 noinst_HEADERS += \
 	data/CohesiveData.hh \
@@ -196,7 +202,9 @@
 	data/CohesiveKinSrcsDataHex8.hh \
 	data/CohesiveDynLData.hh \
 	data/CohesiveDynLDataTri3.hh \
-	data/CohesiveDynLDataQuad4.hh
+	data/CohesiveDynLDataQuad4.hh \
+	data/CohesiveDynLDataHex8.hh \
+	data/CohesiveDynLDataTet4.hh
 
 AM_CPPFLAGS = \
 	$(PYTHON_EGG_CPPFLAGS) -I$(PYTHON_INCDIR) \

Modified: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc	2010-01-18 22:16:36 UTC (rev 16143)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc	2010-01-19 07:16:22 UTC (rev 16144)
@@ -400,6 +400,9 @@
       for (int i = 0; i < fiberDimE; ++i) {
         const int index = iVertex * spaceDim + i;
         const double valE = valsE[index];
+	std::cout << "valE: " << valE
+		  << ", val: " << vals[i]
+		  << std::endl;
         if (fabs(valE) > tolerance)
           CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
         else
@@ -467,6 +470,9 @@
       for (int i = 0; i < fiberDimE; ++i) {
         const int index = iVertex * spaceDim + i;
         const double valE = valsE[index];
+	std::cout << "valE: " << valE
+		  << ", val: " << vals[i]
+		  << std::endl;
         if (fabs(valE) > tolerance)
           CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
         else
@@ -513,6 +519,9 @@
       for (int i = 0; i < fiberDimE; ++i) {
         const int index = iVertex * spaceDim + i;
         const double valE = valsE[index];
+	std::cout << "valE: " << valE
+		  << ", val: " << vals[i]
+		  << std::endl;
         if (fabs(valE) > tolerance)
           CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
         else
@@ -610,7 +619,7 @@
     const double scale = 1.0 / _data->area[iVertex];
     for (int iDim=0; iDim < spaceDim; ++iDim) {
       const double tractionE =
-        (_data->initialTractions[iVertex*spaceDim+iDim] + dispVertex[iDim]) * scale;
+        _data->initialTractions[iVertex*spaceDim+iDim] + (dispVertex[iDim]) * scale;
       if (tractionE != 0.0)
         CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, tractionsVertex[iDim]/tractionE,
              tolerance);

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

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

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

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

Added: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc	2010-01-19 07:16:22 UTC (rev 16144)
@@ -0,0 +1,1551 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+
+/* Original mesh
+ *
+ * Cells are 0-1 and vertices are 2-13.
+ *
+ *       2,3,4,5 -------- 6,7,8,9 -------- 10,11,12,13
+ *
+ *                        ^^^^^^^ Vertices forming fault
+ *
+ * After adding cohesive elements
+ *
+ * Cells are 0-1,16 and vertices are 4-15.
+ *
+ *       2,3,4,5 -------- 6,7,8,9 -- 14,15,16,17 -------- 10,11,12,13
+ *                                    18,19,20,21
+ *                        ^^^^^^^^^^^^^^^^^^^^^^ Cohesive element
+ *
+ */
+
+#include "CohesiveDynLDataHex8.hh"
+
+const char* pylith::faults::CohesiveDynLDataHex8::_meshFilename =
+  "data/hex8.mesh";
+
+const int pylith::faults::CohesiveDynLDataHex8::_spaceDim = 3;
+
+const int pylith::faults::CohesiveDynLDataHex8::_cellDim = 2;
+
+const int pylith::faults::CohesiveDynLDataHex8::_numBasis = 4;
+
+const int pylith::faults::CohesiveDynLDataHex8::_numQuadPts = 4;
+
+const double pylith::faults::CohesiveDynLDataHex8::_quadPts[] = {
+  -0.57735027, -0.57735027,
+  +0.57735027, -0.57735027,
+  +0.57735027, +0.57735027,
+  -0.57735027, +0.57735027,
+};
+
+const double pylith::faults::CohesiveDynLDataHex8::_quadWts[] = {
+  1.0, 1.0, 1.0, 1.0
+};
+
+const double pylith::faults::CohesiveDynLDataHex8::_basis[] = {
+  0.62200847,  0.16666667,  0.16666667,  0.0446582,
+  0.16666667,  0.62200847,  0.0446582,   0.16666667,
+  0.16666667,  0.0446582,   0.62200847,  0.16666667,
+  0.0446582,   0.16666667,  0.16666667,  0.62200847,
+};
+
+const double pylith::faults::CohesiveDynLDataHex8::_basisDeriv[] = {
+  -0.39433757, -0.39433757,
+  +0.39433757, -0.10566243,
+  +0.10566243, +0.10566243,
+  -0.10566243, +0.39433757,
+
+  -0.39433757, -0.10566243,
+  +0.39433757, -0.39433757,
+  +0.10566243, +0.39433757,
+  -0.10566243, +0.10566243,
+
+  -0.10566243, -0.10566243,
+  +0.10566243, -0.39433757,
+  +0.39433757, +0.39433757,
+  -0.39433757, +0.10566243,
+
+  -0.10566243, -0.39433757,
+  +0.10566243, -0.10566243,
+  +0.39433757, +0.10566243,
+  -0.39433757, +0.39433757,
+};
+
+const double pylith::faults::CohesiveDynLDataHex8::_verticesRef[] = {
+  -1.0, -1.0,
+  +1.0, -1.0,
+  +1.0, +1.0,
+  -1.0, +1.0
+};
+
+const int pylith::faults::CohesiveDynLDataHex8::_id = 10;
+
+const char* pylith::faults::CohesiveDynLDataHex8::_label = "fault";
+
+const char* pylith::faults::CohesiveDynLDataHex8::_initialTractFilename = 
+  "data/hex8_initialtract.spatialdb";
+
+const double pylith::faults::CohesiveDynLDataHex8::_fieldT[] = {
+  4.1, 6.1, 8.1,
+  4.2, 6.2, 8.2,
+  4.3, 6.3, 8.3,
+  4.4, 6.4, 8.4,
+  4.5, 6.5, 8.5, // 6
+  4.6, 6.6, 8.6, // 7
+  4.7, 6.7, 8.7, // 8
+  4.8, 6.8, 8.8, // 9
+  4.9, 6.9, 8.9,
+  4.0, 6.0, 8.0,
+  5.1, 7.1, 9.1,
+  5.2, 7.2, 9.2,
+  5.3, 7.3, 9.3, // 14
+  5.5, 7.5, 9.5, // 15
+  5.7, 7.7, 9.7, // 16
+  5.9, 7.9, 9.9, // 17
+  5.4, 7.4, 9.4, // 18
+  5.6, 7.6, 9.6, // 19
+  5.8, 7.8, 9.8, // 20
+  5.0, 7.0, 9.0, // 21
+};
+
+// :TODO: Make sensible values for Jacobian for DOF on positive and
+// negative sides of the fault. Add semi-random values for other DOF.
+const double pylith::faults::CohesiveDynLDataHex8::_jacobian[] = {
+  1.0, 0.0, 0.0, // 2x
+  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,
+  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,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 1.0, 0.0, // 2y
+  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,
+  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,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 1.0, // 2z
+  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,
+  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,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 3x
+  1.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.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.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.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 3y
+  0.0, 1.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.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.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.0, 0.0,
+  0.0, 0.0, 0.0, // 3z
+  0.0, 0.0, 1.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.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.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.0,
+  0.0, 0.0, 0.0, // 4x
+  0.0, 0.0, 0.0,
+  1.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.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.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.0, 0.0, 0.0, // 4y
+  0.0, 0.0, 0.0,
+  0.0, 1.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.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.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.0, 0.0, // 4z
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 1.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.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.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.0, // 5x
+  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, 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, 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, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 5y
+  0.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, 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, 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, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 5z
+  0.0, 0.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,
+  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,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 6x
+  0.0, 0.0, 0.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, 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, 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, // 18
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 6y
+  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, 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, 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, 0.0, 0.0, // 18
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 6z
+  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, 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, 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, 0.0, // 18
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 7x
+  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,
+  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,
+  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,+1.0, // 19
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 7y
+  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,
+  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,
+  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,
+ +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, // 7z
+  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,
+  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,
+  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,+1.0, 0.0, // 19
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 8x
+  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,
+  1.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.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.0, 0.0,+1.0, // 20
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 8y
+  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, 1.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.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,
+ +1.0, 0.0, 0.0, // 20
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 8z
+  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, 1.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.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,+1.0, 0.0, // 20
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 9x
+  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,
+  1.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.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.0, 0.0,+1.0, // 21
+  0.0, 0.0, 0.0, // 9y
+  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,
+  0.0, 1.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.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,
+ +1.0, 0.0, 0.0, // 21
+  0.0, 0.0, 0.0, // 9z
+  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,
+  0.0, 0.0, 1.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.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,+1.0, 0.0, // 21
+  0.0, 0.0, 0.0, // 10x
+  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,
+  0.0, 0.0, 0.0,
+  1.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.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.0, 0.0, 0.0, // 10y
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 1.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.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.0, 0.0, // 10z
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 1.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.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.0, // 11x
+  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,
+  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, 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, 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, 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, 0.0,
+  0.0, 1.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.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, // 11z
+  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,
+  0.0, 0.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,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 12x
+  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,
+  0.0, 0.0, 0.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, 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, 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, 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, 0.0,
+  0.0, 1.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.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, // 12z
+  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,
+  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, 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, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 13x
+  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,
+  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,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 13y
+  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,
+  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,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 13z
+  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,
+  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,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 14x
+  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,
+  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,
+  1.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, // 18
+  0.0, 0.0, 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, 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, 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, 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, // 18
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 14z
+  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,
+  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, 1.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, // 18
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 15x
+  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,
+  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,
+  1.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, // 19
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 15y
+  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,
+  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,
+  0.0, 1.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, // 19
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 15z
+  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,
+  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,
+  0.0, 0.0, 1.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, // 19
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 16x
+  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,
+  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,
+  0.0, 0.0, 0.0,
+  1.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, // 20
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 16y
+  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,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 1.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, // 20
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 16z
+  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,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 1.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, // 20
+  0.0, 0.0, 0.0,
+  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, 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, 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, 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, // 21
+  0.0, 0.0, 0.0, // 17y
+  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,
+  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,
+  0.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, 0.0,
+  0.0, 0.0, 0.0,
+ -1.0, 0.0, 0.0, // 21
+  0.0, 0.0, 0.0, // 17z
+  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,
+  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,
+  0.0, 0.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,
+  0.0, 0.0, 0.0,
+  0.0,-1.0, 0.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
+  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,
+  0.0, 0.0, 0.0,
+  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,
+  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, // 18y
+  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, 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, 0.0, 0.0,
+  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,
+  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, // 18z
+  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, 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, 0.0,
+ -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,
+  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, // 19x
+  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, // 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,
+  0.0, 0.0, 0.0,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 19y
+  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, // 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,
+  0.0, 0.0, 0.0,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 19z
+  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, // 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,
+  0.0, 0.0, 0.0,
+ -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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 20x
+  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,+1.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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0,-1.0, 0.0, // 16
+  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, // 20y
+  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,+1.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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 20z
+  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,
+ +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,
+  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, // 16
+  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, // 21x
+  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,
+  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,
+  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, // 17
+  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, // 21y
+  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,
+  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,
+  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, // 17
+  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, // 21z
+  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,
+ +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,
+  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, // 17
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+};
+
+// ----------------------------------------------------------------------
+// Computed values
+// ----------------------------------------------------------------------
+
+const double pylith::faults::CohesiveDynLDataHex8::_orientation[] = {
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+};
+
+const double pylith::faults::CohesiveDynLDataHex8::_area[] = {
+  1.0, 1.0, 1.0, 1.0
+};
+
+const double pylith::faults::CohesiveDynLDataHex8::_initialTractions[] = {
+  1.0, 2.0, -3.0,
+  1.1, 2.1, -3.1,
+  1.2, 2.2, -3.2,
+  1.3, 2.3, -3.3,
+};
+
+
+const int pylith::faults::CohesiveDynLDataHex8::_numConstraintVert = 4;
+const int pylith::faults::CohesiveDynLDataHex8::_constraintVertices[] = {
+  18, 19, 20, 21
+};
+const int pylith::faults::CohesiveDynLDataHex8::_constraintCells[] = {
+  23, 23, 23, 23
+};
+
+// ----------------------------------------------------------------------
+// Stick case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrStick[] = {
+  0.1, 2.1, 28.1,
+  0.2, 2.2, 28.2,
+  0.3, 2.3, 28.3,
+  0.4, 2.4, 28.4,
+  0.5, 2.5, 28.5, // 6
+  0.6, 2.6, 28.6, // 7
+  0.7, 2.7, 28.7, // 8
+  0.8, 2.8, 28.8, // 9
+  0.9, 2.9, 28.9,
+  0.0, 2.0, 28.0,
+  1.1, 3.1, 29.1,
+  1.2, 3.2, 29.2,
+  1.3, 3.3, 29.3, // 14
+  1.5, 3.5, 29.5, // 15
+  1.7, 3.7, 29.7, // 16
+  1.9, 3.9, 29.9, // 17
+  1.4, 3.4, -29.4, // 18
+  1.6, 3.6, -29.6, // 19
+  1.8, 3.8, -29.8, // 20
+  1.0, 3.0, -29.0, // 21
+};
+
+// No change in fieldIncr
+// Zero slip
+
+// ----------------------------------------------------------------------
+// Slip case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrSlip[] = {
+  5.1, 7.1, 9.1,
+  5.2, 7.2, 9.2,
+  5.3, 7.3, 9.3,
+  5.4, 7.4, 9.4,
+  5.5, 7.5, 9.5, // 6
+  5.6, 7.6, 9.6, // 7
+  5.7, 7.7, 9.7, // 8
+  5.8, 7.8, 9.8, // 9
+  5.9, 7.9, 9.9,
+  5.0, 7.0, 9.0,
+  6.1, 8.1, 10.1,
+  6.2, 8.2, 10.2,
+  6.3, 8.3, 10.3, // 14
+  6.5, 8.5, 10.5, // 15
+  6.7, 8.7, 10.7, // 16
+  6.9, 8.9, 10.9, // 17
+  6.4, 8.4, -10.4, // 18
+  6.6, 8.6, -10.6, // 19
+  6.8, 8.8, -10.8, // 20
+  6.0, 8.0, -10.0, // 21
+};
+
+// Output
+// :TODO: Update Lagrange multiplier values
+const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrSlipE[] = {
+  5.1, 7.1, 9.1,
+  5.2, 7.2, 9.2,
+  5.3, 7.3, 9.3,
+  5.4, 7.4, 9.4,
+  5.5, 7.5, 9.5, // 6
+  5.6, 7.6, 9.6, // 7
+  5.7, 7.7, 9.7, // 8
+  5.8, 7.8, 9.8, // 9
+  5.9, 7.9, 9.9,
+  5.0, 7.0, 9.0,
+  6.1, 8.1, 10.1,
+  6.2, 8.2, 10.2,
+  6.3, 8.3, 10.3, // 14
+  6.5, 8.5, 10.5, // 15
+  6.7, 8.7, 10.7, // 16
+  6.9, 8.9, 10.9, // 17
+ -3.9639, -5.47708, -10.4, // 18
+  -4.12012, -5.63492, -10.6, // 19
+  -4.27642, -5.79274, -10.8, // 20
+  -3.47428, -4.91948, -10.0, // 21
+};
+
+// :TODO: Update slip values based on changes in Lagrange multiplier values
+const double pylith::faults::CohesiveDynLDataHex8::_slipSlipE[] = {
+  20.727794955342528,  27.754166126645078,                   0.0,
+  21.440242443570444,  28.469830129986981,                   0.0,
+  22.152833625484085,  29.185479220875859,                   0.0,
+  18.948563495682009,  25.838950221384557,                   0.0,
+};
+
+// ----------------------------------------------------------------------
+// Open case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrOpen[] = {
+  5.1, 7.1, 9.1,
+  5.2, 7.2, 9.2,
+  5.3, 7.3, 9.3,
+  5.4, 7.4, 9.4,
+  5.5, 7.5, 9.5, // 6
+  5.6, 7.6, 9.6, // 7
+  5.7, 7.7, 9.7, // 8
+  5.8, 7.8, 9.8, // 9
+  5.9, 7.9, 9.9,
+  5.0, 7.0, 9.0,
+  6.1, 8.1, 10.1,
+  6.2, 8.2, 10.2,
+  6.3, 8.3, 10.3, // 14
+  6.5, 8.5, 10.5, // 15
+  6.7, 8.7, 10.7, // 16
+  6.9, 8.9, 10.9, // 17
+  6.4, 8.4, 10.4, // 18
+  6.6, 8.6, 10.6, // 19
+  6.8, 8.8, 10.8, // 20
+  6.0, 8.0, 10.0, // 21
+};
+
+// Output
+const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrOpenE[] = {
+  5.1, 7.1, 9.1,
+  5.2, 7.2, 9.2,
+  5.3, 7.3, 9.3,
+  5.4, 7.4, 9.4,
+  5.5, 7.5, 9.5, // 6
+  5.6, 7.6, 9.6, // 7
+  5.7, 7.7, 9.7, // 8
+  5.8, 7.8, 9.8, // 9
+  5.9, 7.9, 9.9,
+  5.0, 7.0, 9.0,
+  6.1, 8.1, 10.1,
+  6.2, 8.2, 10.2,
+  6.3, 8.3, 10.3, // 14
+  6.5, 8.5, 10.5, // 15
+  6.7, 8.7, 10.7, // 16
+  6.9, 8.9, 10.9, // 17
+  -5.4, -7.4, -9.4, // 18
+  -5.6, -7.6, -9.6, // 19
+  -5.8, -7.8, -9.8, // 20
+  -5.0, -7.0, -9.0, // 21
+};
+
+const double pylith::faults::CohesiveDynLDataHex8::_slipOpenE[] = {
+  23.6, 31.6, 39.6,
+  24.4, 32.4, 40.4,
+  25.2, 33.2, 41.2,
+  22.0, 30.0, 38.0,
+};
+
+// ----------------------------------------------------------------------
+pylith::faults::CohesiveDynLDataHex8::CohesiveDynLDataHex8(void)
+{ // constructor
+  meshFilename = const_cast<char*>(_meshFilename);
+  spaceDim = _spaceDim;
+  cellDim = _cellDim;
+  numBasis = _numBasis;
+  numQuadPts = _numQuadPts;
+  quadPts = const_cast<double*>(_quadPts);
+  quadWts = const_cast<double*>(_quadWts);
+  basis = const_cast<double*>(_basis);
+  basisDeriv = const_cast<double*>(_basisDeriv);
+  verticesRef = const_cast<double*>(_verticesRef);
+  id = _id;
+  label = const_cast<char*>(_label);
+  initialTractFilename = const_cast<char*>(_initialTractFilename);
+
+  fieldT = const_cast<double*>(_fieldT);
+  jacobian = const_cast<double*>(_jacobian);
+  orientation = const_cast<double*>(_orientation);
+  area = const_cast<double*>(_area);
+  initialTractions = const_cast<double*>(_initialTractions);
+
+  constraintVertices = const_cast<int*>(_constraintVertices);
+  constraintCells = const_cast<int*>(_constraintCells);
+  numConstraintVert = _numConstraintVert;  
+
+  // Stick
+  fieldIncrStick = const_cast<double*>(_fieldIncrStick);
+
+  // Slip
+  fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
+  fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
+  slipSlipE = const_cast<double*>(_slipSlipE);
+
+  // Open
+  fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
+  fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
+  slipOpenE = const_cast<double*>(_slipOpenE);
+} // constructor
+
+pylith::faults::CohesiveDynLDataHex8::~CohesiveDynLDataHex8(void)
+{}
+
+
+// End of file

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

Added: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc	2010-01-19 07:16:22 UTC (rev 16144)
@@ -0,0 +1,634 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+
+/* Original mesh
+ *
+ * Cells are 0-1, vertices are 2-6.
+ *
+ * 2   3,4,5  6
+ *
+ *     ^^^^^ Face in x-y plane
+ *
+ * After adding cohesive elements
+ *
+ * Cells are 0-1,10, vertices are 2-9.
+ *
+ * 2   3,4,5  7,8,9   6
+ *             10,11,12
+ *     ^^^^^^^^^^^^ Cohesive element in x-y plane.
+ */
+
+#include "CohesiveDynLDataTet4.hh"
+
+const char* pylith::faults::CohesiveDynLDataTet4::_meshFilename =
+  "data/tet4.mesh";
+
+const int pylith::faults::CohesiveDynLDataTet4::_spaceDim = 3;
+
+const int pylith::faults::CohesiveDynLDataTet4::_cellDim = 2;
+
+const int pylith::faults::CohesiveDynLDataTet4::_numBasis = 3;
+
+const int pylith::faults::CohesiveDynLDataTet4::_numQuadPts = 1;
+
+const double pylith::faults::CohesiveDynLDataTet4::_quadPts[] = {
+  3.33333333e-01,  3.33333333e-01,
+};
+
+const double pylith::faults::CohesiveDynLDataTet4::_quadWts[] = {
+  5.00000000e-01,
+};
+
+const double pylith::faults::CohesiveDynLDataTet4::_basis[] = {
+  3.33333333e-01,  3.33333333e-01,
+  3.33333333e-01,};
+
+const double pylith::faults::CohesiveDynLDataTet4::_basisDeriv[] = {
+ -1.00000000e+00, -1.00000000e+00,
+  1.00000000e+00,  0.00000000e+00,
+  0.00000000e+00,  1.00000000e+00,
+};
+
+const double pylith::faults::CohesiveDynLDataTet4::_verticesRef[] = {
+ -1.00000000e+00, -1.00000000e+00,
+  1.00000000e+00, -1.00000000e+00,
+ -1.00000000e+00,  1.00000000e+00,
+};
+
+const int pylith::faults::CohesiveDynLDataTet4::_id = 10;
+
+const char* pylith::faults::CohesiveDynLDataTet4::_label = "fault";
+
+const char* pylith::faults::CohesiveDynLDataTet4::_initialTractFilename = 
+  "data/tet4_initialtract.spatialdb";
+
+const double pylith::faults::CohesiveDynLDataTet4::_fieldT[] = {
+  7.1, 8.1, 9.1,
+  7.2, 8.2, 9.2, // 3
+  7.3, 8.3, 9.3, // 4
+  7.4, 8.4, 9.4, // 5
+  7.5, 8.5, 9.5,
+  7.6, 8.6, 9.6, // 7
+  7.8, 8.8, 9.8, // 8
+  7.0, 8.0, 9.0, // 9
+  7.7, 8.7, 9.7, // 10
+  7.9, 8.9, 9.9, // 11
+  7.1, 8.1, 9.1, // 12
+};
+
+// :TODO: Make sensible values for Jacobian for DOF on positive and
+// negative sides of the fault. Add semi-random values for other DOF.
+const double pylith::faults::CohesiveDynLDataTet4::_jacobian[] = {
+  1.0, 0.0, 0.0, // 2x
+  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,
+  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, // 2y
+  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,
+  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, // 2z
+  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,
+  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, // 3x
+  1.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.0, 0.0, 0.0,
+  0.0, 0.0,-1.0, // 10
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 3y
+  0.0, 1.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.0, 0.0,
+ -1.0, 0.0, 0.0, // 10
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 3z
+  0.0, 0.0, 1.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.0,
+  0.0,-1.0, 0.0, // 10
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 4x
+  0.0, 0.0, 0.0,
+  1.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.0, 0.0, 0.0,
+  0.0, 0.0,-1.0, // 11
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 4y
+  0.0, 0.0, 0.0,
+  0.0, 1.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.0, 0.0,
+ -1.0, 0.0, 0.0, // 11
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 4z
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 1.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.0,
+  0.0,-1.0, 0.0, // 11
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 5x
+  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, 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,-1.0, // 12
+  0.0, 0.0, 0.0, // 5y
+  0.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, 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, 0.0, // 12
+  0.0, 0.0, 0.0, // 5z
+  0.0, 0.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,
+  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
+  0.0, 0.0, 0.0, // 6x
+  0.0, 0.0, 0.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, 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, // 6y
+  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, 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, 0.0, 0.0, // 6z
+  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, 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, 0.0, // 7x
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0,+1.0, // 10
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 7y
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+ +1.0, 0.0, 0.0, // 10
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 7z
+  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,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0,+1.0, 0.0, // 10
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 8x
+  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,
+  1.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, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 8y
+  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, 1.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, 0.0,
+  0.0, 0.0, 0.0, // 8z
+  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, 1.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0,+1.0, 0.0, // 11
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0, // 9x
+  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,
+  1.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, 0.0, 0.0, // 9y
+  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,
+  0.0, 1.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, 0.0, // 9z
+  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,
+  0.0, 0.0, 1.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0,+1.0, 0.0, // 12
+  0.0, 0.0, 0.0, // 10x
+  0.0,-1.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
+  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, 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, 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, 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, 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, // 11x
+  0.0, 0.0, 0.0,
+  0.0,-1.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
+  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, 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, 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, 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, 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, // 12x
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+  0.0,-1.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
+  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, 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, 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, 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, 0.0,
+  0.0, 0.0, 0.0,
+  0.0, 0.0, 0.0,
+};
+
+// ----------------------------------------------------------------------
+// Computed values
+// ----------------------------------------------------------------------
+
+const double pylith::faults::CohesiveDynLDataTet4::_orientation[] = {
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+  0.0, -1.0, 0.0,    0.0, 0.0, -1.0,    -1.0, 0.0, 0.0,
+};
+
+const double pylith::faults::CohesiveDynLDataTet4::_area[] = {
+  1.0/3.0, 
+  1.0/3.0, 
+  1.0/3.0,
+};
+
+const double pylith::faults::CohesiveDynLDataTet4::_initialTractions[] = {
+  1.0, 2.0, -3.0,
+  1.1, 2.1, -3.1,
+  1.2, 2.2, -3.2,
+};
+
+
+const int pylith::faults::CohesiveDynLDataTet4::_numConstraintVert = 3;
+const int pylith::faults::CohesiveDynLDataTet4::_constraintVertices[] = {
+  10, 11, 12
+};
+const int pylith::faults::CohesiveDynLDataTet4::_constraintCells[] = {
+  14, 14, 14
+};
+
+// ----------------------------------------------------------------------
+// Stick case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrStick[] = {
+  1.1, 2.1, 35.1,
+  1.2, 2.2, 35.2, // 3
+  1.3, 2.3, 35.3, // 4
+  1.4, 2.4, 35.4, // 5
+  1.5, 2.5, 35.5,
+  1.6, 2.6, 35.6, // 7
+  1.8, 2.8, 35.8, // 8
+  1.0, 2.0, 35.0, // 9
+  1.7, 2.7, -35.7, // 10
+  1.9, 2.9, -35.9, // 11
+  1.1, 2.1, -35.1, // 12
+};
+
+// No change in fieldIncr
+// Zero slip
+
+// ----------------------------------------------------------------------
+// Slip case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrSlip[] = {
+  8.1, 9.1, 10.1,
+  8.2, 9.2, 10.2, // 3
+  8.3, 9.3, 10.3, // 4
+  8.4, 9.4, 10.4, // 5
+  8.5, 9.5, 10.5,
+  8.6, 9.6, 10.6, // 7
+  8.8, 9.8, 10.8, // 8
+  8.0, 9.0, 10.0, // 9
+  8.7, 9.7, -10.7, // 10
+  8.9, 9.9, -10.9, // 11
+  8.1, 9.1, -10.1, // 12
+};
+
+// Output
+// :TODO: Update Lagrange multiplier values
+const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrSlipE[] = {
+  8.1, 9.1, 10.1,
+  8.2, 9.2, 10.2, // 3
+  8.3, 9.3, 10.3, // 4
+  8.4, 9.4, 10.4, // 5
+  8.5, 9.5, 10.5,
+  8.6, 9.6, 10.6, // 7
+  8.8, 9.8, 10.8, // 8
+  8.0, 9.0, 10.0, // 9
+  -6.90156, -7.80418, -10.7, // 10
+  -7.08708, -7.9903, -10.9, // 11
+  -6.27887, -7.17083, -10.1, // 12
+};
+
+// :TODO: Update slip values based on changes in Lagrange multiplier values
+const double pylith::faults::CohesiveDynLDataTet4::_slipSlipE[] = {
+  31.203110740589327,  35.008368147978267,                   0.0,
+  31.974152400186210,  35.780599114494088,                   0.0,
+  28.757749464750159,  32.541663868006758,                   0.0,
+};
+
+// ----------------------------------------------------------------------
+// Open case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrOpen[] = {
+  8.1, 9.1, 10.1,
+  8.2, 9.2, 10.2, // 3
+  8.3, 9.3, 10.3, // 4
+  8.4, 9.4, 10.4, // 5
+  8.5, 9.5, 10.5,
+  8.6, 9.6, 10.6, // 7
+  8.8, 9.8, 10.8, // 8
+  8.0, 9.0, 10.0, // 9
+  8.7, 9.7, 10.7, // 10
+  8.9, 9.9, 10.9, // 11
+  8.1, 9.1, 10.1, // 12
+};
+
+// Output
+const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrOpenE[] = {
+  8.1, 9.1, 10.1,
+  8.2, 9.2, 10.2, // 3
+  8.3, 9.3, 10.3, // 4
+  8.4, 9.4, 10.4, // 5
+  8.5, 9.5, 10.5,
+  8.6, 9.6, 10.6, // 7
+  8.8, 9.8, 10.8, // 8
+  8.0, 9.0, 10.0, // 9
+  -7.7, -8.7, -9.7, // 10
+  -7.9, -8.9, -9.9, // 11
+  -7.1, -8.1, -9.1, // 12
+};
+
+const double pylith::faults::CohesiveDynLDataTet4::_slipOpenE[] = {
+  32.8, 36.8, 40.8,
+  33.6, 37.6, 41.6,
+  30.4, 34.4, 38.4,
+};
+
+// ----------------------------------------------------------------------
+pylith::faults::CohesiveDynLDataTet4::CohesiveDynLDataTet4(void)
+{ // constructor
+  meshFilename = const_cast<char*>(_meshFilename);
+  spaceDim = _spaceDim;
+  cellDim = _cellDim;
+  numBasis = _numBasis;
+  numQuadPts = _numQuadPts;
+  quadPts = const_cast<double*>(_quadPts);
+  quadWts = const_cast<double*>(_quadWts);
+  basis = const_cast<double*>(_basis);
+  basisDeriv = const_cast<double*>(_basisDeriv);
+  verticesRef = const_cast<double*>(_verticesRef);
+  id = _id;
+  label = const_cast<char*>(_label);
+  initialTractFilename = const_cast<char*>(_initialTractFilename);
+
+  fieldT = const_cast<double*>(_fieldT);
+  jacobian = const_cast<double*>(_jacobian);
+  orientation = const_cast<double*>(_orientation);
+  area = const_cast<double*>(_area);
+  initialTractions = const_cast<double*>(_initialTractions);
+
+  constraintVertices = const_cast<int*>(_constraintVertices);
+  constraintCells = const_cast<int*>(_constraintCells);
+  numConstraintVert = _numConstraintVert;  
+
+  // Stick
+  fieldIncrStick = const_cast<double*>(_fieldIncrStick);
+
+  // Slip
+  fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
+  fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
+  slipSlipE = const_cast<double*>(_slipSlipE);
+
+  // Open
+  fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
+  fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
+  slipOpenE = const_cast<double*>(_slipOpenE);
+} // constructor
+
+pylith::faults::CohesiveDynLDataTet4::~CohesiveDynLDataTet4(void)
+{}
+
+
+// End of file

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

Modified: short/3D/PyLith/trunk/unittests/libtests/faults/data/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/Makefile.am	2010-01-18 22:16:36 UTC (rev 16143)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/Makefile.am	2010-01-19 07:16:22 UTC (rev 16144)
@@ -67,6 +67,7 @@
 	tet4e_finalslip.spatialdb \
 	tet4e_sliptime.spatialdb \
 	tet4e_risetime.spatialdb \
+	tet4_initialtract.spatialdb \
 	hex8.mesh \
 	hex8b.mesh \
 	hex8c.mesh \
@@ -79,6 +80,7 @@
 	hex8_finalslip.spatialdb \
 	hex8_sliptime.spatialdb \
 	hex8_risetime.spatialdb \
+	hex8_initialtract.spatialdb \
 	tri3traction.mesh \
 	quad4traction.mesh \
 	tet4traction.mesh \

Added: short/3D/PyLith/trunk/unittests/libtests/faults/data/hex8_initialtract.spatialdb
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/hex8_initialtract.spatialdb	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/hex8_initialtract.spatialdb	2010-01-19 07:16:22 UTC (rev 16144)
@@ -0,0 +1,17 @@
+#SPATIAL.ascii 1
+SimpleDB {
+  num-values = 3
+  value-names =  traction-shear-leftlateral traction-shear-updip traction-normal
+  value-units =  Pa   Pa  Pa
+  num-locs = 4
+  data-dim = 1
+  space-dim = 3
+  cs-data = cartesian {
+    to-meters = 1.0
+    space-dim = 3
+  }
+}
+         0.0   -1.0000   -1.0000    1.0000    2.0000   -3.0000
+         0.0    1.0000   -1.0000    1.1000    2.1000   -3.1000
+         0.0   -1.0000    1.0000    1.2000    2.2000   -3.2000
+         0.0    1.0000    1.0000    1.3000    2.3000   -3.3000

Added: short/3D/PyLith/trunk/unittests/libtests/faults/data/tet4_initialtract.spatialdb
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/tet4_initialtract.spatialdb	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/tet4_initialtract.spatialdb	2010-01-19 07:16:22 UTC (rev 16144)
@@ -0,0 +1,16 @@
+#SPATIAL.ascii 1
+SimpleDB {
+  num-values = 3
+  value-names =  traction-shear-leftlateral traction-shear-updip traction-normal
+  value-units =  Pa   Pa  Pa
+  num-locs = 3
+  data-dim = 1
+  space-dim = 3
+  cs-data = cartesian {
+    to-meters = 1.0
+    space-dim = 3
+  }
+}
+0.0  -1.0  0.0  1.0  2.0  -3.0
+0.0    0.0  1.0  1.1  2.1  -3.1
+0.0    1.0  0.0  1.2  2.2  -3.2



More information about the CIG-COMMITS mailing list