[cig-commits] r16280 - in short/3D/PyLith/trunk: . examples/twocells/twoquad4 libsrc libsrc/faults modulesrc/faults playpen/friction/twohex8 playpen/friction/twoquad4 playpen/friction/twotet4 playpen/friction/twotri3 pylith pylith/faults unittests/libtests/faults unittests/libtests/faults/data unittests/libtests/friction unittests/libtests/meshio unittests/pytests/faults
brad at geodynamics.org
brad at geodynamics.org
Fri Feb 19 12:08:48 PST 2010
Author: brad
Date: 2010-02-19 12:08:42 -0800 (Fri, 19 Feb 2010)
New Revision: 16280
Added:
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.hh
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.cc
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.hh
short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDyn.i
short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveLagrange.i
short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDyn.py
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.hh
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.hh
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.hh
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.hh
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.cc
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.cc
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.cc
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.cc
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.hh
short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py
Removed:
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.cc
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.hh
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.icc
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.icc
short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDynL.i
short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDynL.py
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.hh
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.cc
short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.cc
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.cc
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.cc
short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.hh
short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDynL.py
Modified:
short/3D/PyLith/trunk/TODO
short/3D/PyLith/trunk/examples/twocells/twoquad4/dislocation.cfg
short/3D/PyLith/trunk/libsrc/Makefile.am
short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc
short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh
short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.hh
short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.icc
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveTract.cc
short/3D/PyLith/trunk/libsrc/faults/Makefile.am
short/3D/PyLith/trunk/libsrc/faults/faultsfwd.hh
short/3D/PyLith/trunk/modulesrc/faults/FaultCohesive.i
short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveKin.i
short/3D/PyLith/trunk/modulesrc/faults/Makefile.am
short/3D/PyLith/trunk/modulesrc/faults/faults.i
short/3D/PyLith/trunk/playpen/friction/twohex8/compression.cfg
short/3D/PyLith/trunk/playpen/friction/twohex8/opening.cfg
short/3D/PyLith/trunk/playpen/friction/twohex8/shear-sliding.cfg
short/3D/PyLith/trunk/playpen/friction/twohex8/shear-stick.cfg
short/3D/PyLith/trunk/playpen/friction/twoquad4/compression.cfg
short/3D/PyLith/trunk/playpen/friction/twoquad4/opening.cfg
short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-sliding.cfg
short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-stick.cfg
short/3D/PyLith/trunk/playpen/friction/twotet4/compression.cfg
short/3D/PyLith/trunk/playpen/friction/twotet4/opening.cfg
short/3D/PyLith/trunk/playpen/friction/twotet4/shear-sliding.cfg
short/3D/PyLith/trunk/playpen/friction/twotet4/shear-stick.cfg
short/3D/PyLith/trunk/playpen/friction/twotri3/compression.cfg
short/3D/PyLith/trunk/playpen/friction/twotri3/opening.cfg
short/3D/PyLith/trunk/playpen/friction/twotri3/shear-sliding.cfg
short/3D/PyLith/trunk/playpen/friction/twotri3/shear-stick.cfg
short/3D/PyLith/trunk/pylith/Makefile.am
short/3D/PyLith/trunk/pylith/faults/__init__.py
short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am
short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc
short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh
short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterVTKFaultMesh.cc
short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py
Log:
Refactorization of cohesive fault objects. Added FaultCohesiveLagrange. Renamed FaultCohesiveDynL to FaultCohesiveDyn.
Modified: short/3D/PyLith/trunk/TODO
===================================================================
--- short/3D/PyLith/trunk/TODO 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/TODO 2010-02-19 20:08:42 UTC (rev 16280)
@@ -5,11 +5,6 @@
* Better preconditioning
Better PETSc settings or Laplacian based preconditioner
-* Data structure to hold label of fault Lagrange vertices and
- conventional vertices [DONE, need to clean up FaultCohesive, etc]
-
- Refactor in FaultCohesive
-
* Drucker-Prager elastoplastic
* Friction
@@ -43,15 +38,12 @@
Initial tractions
Integrate over fault surface (should be current implementation)
-FaultCohesiveDyn -> FaultCohesiveTract
FaultCohesiveDynL -> FaultCohesiveDyn
Refactor FaultCohesive
- integrateResidualAssembled()
- updateSlip() [implemented for FaultCohesiveKin, not for FaultCohesiveDyn]
6. Other fault constitutive models [Surendra]
Rate- and state-friction with aging law
- Rate- and state-friction with slip law
+ Rate- and state-friction with slip law (only if desired)
----------------------------------------------------------------------
@@ -75,14 +67,17 @@
integrateResidualLumped()
- FaultCohesiveDynL
- integrateJacobian (lumped)
+ FaultCohesiveDyn
adjustSolnLumped
----------------------------------------------------------------------
TODO WELL BEFORE WORKSHOP 2010
----------------------------------------------------------------------
+Examples
+ Cleanup PETSc setttings
+ ksp_view, monitor, converged reason
+
Tutorial
3d/hex8
1. Dirichlet BC (static)
Modified: short/3D/PyLith/trunk/examples/twocells/twoquad4/dislocation.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/twocells/twoquad4/dislocation.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/examples/twocells/twoquad4/dislocation.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -121,3 +121,24 @@
[pylithapp.timedependent.materials.material.output]
cell_filter = pylith.meshio.CellFilterAvgMesh
writer.filename = dislocation-statevars.vtk
+
+# ----------------------------------------------------------------------
+# PETSc
+# ----------------------------------------------------------------------
+# Set the solver options.
+
+[pylithapp.petsc]
+ksp_rtol = 1.0e-8
+pc_type = asm
+# Change the preconditioner settings (must turn off
+# shift_positive_definite and turn on shift_nonzero).
+sub_pc_factor_shift_positive_definite = 0
+sub_pc_factor_shift_nonzero =
+
+ksp_max_it = 100
+ksp_gmres_restart = 50
+
+ksp_monitor = true
+ksp_view = true
+ksp_converged_reason = true
+
Modified: short/3D/PyLith/trunk/libsrc/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/libsrc/Makefile.am 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/Makefile.am 2010-02-19 20:08:42 UTC (rev 16280)
@@ -45,9 +45,10 @@
faults/TopologyOps.cc \
faults/CohesiveTopology.cc \
faults/FaultCohesive.cc \
+ faults/FaultCohesiveLagrange.cc \
+ faults/FaultCohesiveKin.cc \
+ faults/FaultCohesiveDyn.cc \
faults/FaultCohesiveTract.cc \
- faults/FaultCohesiveDynL.cc \
- faults/FaultCohesiveKin.cc \
feassemble/CellGeometry.cc \
feassemble/Constraint.cc \
feassemble/GeometryPoint1D.cc \
Modified: short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -672,13 +672,11 @@
void
pylith::faults::CohesiveTopology::createFaultParallel(
topology::SubMesh* faultMesh,
- std::map<point_type, point_type>* cohesiveToFault,
const topology::Mesh& mesh,
const int materialId,
const bool constraintCell)
{ // createFaultParallel
assert(0 != faultMesh);
- assert(0 != cohesiveToFault);
// Memory logging
ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
@@ -703,7 +701,6 @@
ALE::Obj<ALE::Mesh::sieve_type> faultSieve =
new ALE::Mesh::sieve_type(sieve->comm(), sieve->debug());
assert(!faultSieve.isNull());
- cohesiveToFault->clear();
const ALE::Obj<SieveMesh::label_sequence>& cohesiveCells =
sieveMesh->getLabelStratum("material-id", materialId);
@@ -747,7 +744,6 @@
for (int i = 2*faceSize; i < 3*faceSize; ++i)
faultSieve->addArrow(cone[i], face, color++);
} // if/else
- (*cohesiveToFault)[*c_iter] = face;
++face;
cV.clear();
} // for
@@ -787,11 +783,6 @@
assert(!faultCells.isNull());
SieveSubMesh::label_sequence::iterator f_iter = faultCells->begin();
- for(SieveMesh::label_sequence::iterator c_iter = cBegin;
- c_iter != cEnd;
- ++c_iter, ++f_iter)
- (*cohesiveToFault)[*c_iter] = *f_iter;
-
// Update coordinates
const ALE::Obj<topology::Mesh::RealSection>& coordinates =
sieveMesh->getRealSection("coordinates");
Modified: short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/CohesiveTopology.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -80,8 +80,6 @@
/** Create (distributed) fault mesh from cohesive cells.
*
* @param faultMesh Finite-element mesh of fault (output).
- * @param cohesiveToFault Mapping of cohesive cell to fault mesh
- * cell (output).
* @param mesh Finite-element mesh.
* @param materialId Material id for cohesive elements.
* @param constraintCell True if creating cells constrained with
@@ -89,7 +87,6 @@
*/
static
void createFaultParallel(topology::SubMesh* faultMesh,
- std::map<point_type, point_type>* cohesiveToFault,
const topology::Mesh& mesh,
const int materialId,
const bool constraintCell =false);
Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -22,7 +22,6 @@
// Include directives ---------------------------------------------------
#include "Fault.hh" // ISA Fault
-#include <map> // HASA std::map
#include "pylith/topology/SubMesh.hh" // ISA Integrator<Quadrature<SubMesh> >
#include "pylith/feassemble/Quadrature.hh" // ISA Integrator<Quadrature>
#include "pylith/feassemble/Integrator.hh" // ISA Integrator
@@ -51,13 +50,20 @@
/** Set flag for using fault mesh or group of vertices to define
* fault surface.
*
+ * This method is part of a KLUDGE to allow creation of cohesive
+ * cells in cases where domain cells have more than one face (edge
+ * for 2-D problems) on the fault.
+ *
* @param flag True if using fault mesh, false if using vertices.
*/
void useFaultMesh(const bool flag);
- // TEMPORARY
/** Set filename of UCD file for fault mesh.
*
+ * This method is part of a KLUDGE to allow creation of cohesive
+ * cells in cases where domain cells have more than one face (edge
+ * for 2-D problems) on the fault.
+ *
* @param filename Filename for UCD file.
*/
void faultMeshFilename(const char* filename);
@@ -95,16 +101,19 @@
*/
bool useLagrangeConstraints(void) const;
+ /** Get fields associated with fault.
+ *
+ * @returns Fields associated with fault.
+ */
+ const topology::Fields<topology::Field<topology::SubMesh> >*
+ fields(void) const;
+
// PROTECTED MEMBERS //////////////////////////////////////////////////
protected :
/// Fields for fault information.
topology::Fields<topology::Field<topology::SubMesh> >* _fields;
- /// Map label of cohesive cell to label of cells in fault mesh.
- std::map<topology::Mesh::SieveMesh::point_type,
- topology::SubMesh::SieveMesh::point_type> _cohesiveToFault;
-
bool _useLagrangeConstraints; ///< True if uses Lagrange multipliers.
// PRIVATE MEMBERS ////////////////////////////////////////////////////
Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.icc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesive.icc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -21,5 +21,12 @@
return _useLagrangeConstraints;
} // useLagrangeConstraints
+// Get fields associated with fault.
+inline
+const pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> >*
+pylith::faults::FaultCohesive::fields(void) const {
+ return _fields;
+} // fields
+
// End of file
Copied: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc (from rev 16279, short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.cc)
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc (rev 0)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,1187 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "FaultCohesiveDyn.hh" // implementation of object methods
+
+#include "CohesiveTopology.hh" // USES CohesiveTopology
+
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
+#include "pylith/feassemble/CellGeometry.hh" // USES CellGeometry
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/topology/Field.hh" // USES Field
+#include "pylith/topology/Fields.hh" // USES Fields
+#include "pylith/topology/Jacobian.hh" // USES Jacobian
+#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+#include "pylith/friction/FrictionModel.hh" // USES FrictionModel
+
+#include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
+#include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
+#include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
+
+#include <cmath> // USES pow(), sqrt()
+#include <strings.h> // USES strcasecmp()
+#include <cstring> // USES strlen()
+#include <cstdlib> // USES atoi()
+#include <cassert> // USES assert()
+#include <sstream> // USES std::ostringstream
+#include <stdexcept> // USES std::runtime_error
+
+// Precomputing geometry significantly increases storage but gives a
+// slight speed improvement.
+//#define PRECOMPUTE_GEOMETRY
+
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
+
+// ----------------------------------------------------------------------
+// Default constructor.
+pylith::faults::FaultCohesiveDyn::FaultCohesiveDyn(void) :
+ _dbInitialTract(0),
+ _friction(0)
+{ // constructor
+ _needJacobianDiag = true;
+ _needVelocity = true;
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor.
+pylith::faults::FaultCohesiveDyn::~FaultCohesiveDyn(void)
+{ // destructor
+ deallocate();
+} // destructor
+
+// ----------------------------------------------------------------------
+// Deallocate PETSc and local data structures.
+void pylith::faults::FaultCohesiveDyn::deallocate(void)
+{ // deallocate
+ FaultCohesiveLagrange::deallocate();
+
+ _dbInitialTract = 0; // :TODO: Use shared pointer
+ _friction = 0; // :TODO: Use shared pointer
+} // deallocate
+
+// ----------------------------------------------------------------------
+// Sets the spatial database for the inital tractions
+void
+pylith::faults::FaultCohesiveDyn::dbInitialTract(spatialdata::spatialdb::SpatialDB* db)
+{ // dbInitial
+ _dbInitialTract = db;
+} // dbInitial
+
+// ----------------------------------------------------------------------
+// Get the friction (constitutive) model.
+void
+pylith::faults::FaultCohesiveDyn::frictionModel(friction::FrictionModel* const model)
+{ // frictionModel
+ _friction = model;
+} // frictionModel
+
+// ----------------------------------------------------------------------
+// Initialize fault. Determine orientation and setup boundary
+void
+pylith::faults::FaultCohesiveDyn::initialize(const topology::Mesh& mesh,
+ const double upDir[3],
+ const double normalDir[3])
+{ // initialize
+ assert(0 != upDir);
+ assert(0 != normalDir);
+ assert(0 != _quadrature);
+ assert(0 != _normalizer);
+
+ FaultCohesiveLagrange::initialize(mesh, upDir, normalDir);
+
+ // Get initial tractions using a spatial database.
+ _getInitialTractions();
+
+ // Setup fault constitutive model.
+ assert(0 != _friction);
+ _friction->initialize(*_faultMesh, _quadrature, _fields->get("area"));
+
+ const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
+ assert(0 != cs);
+
+ topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+
+ // Create field for diagonal entries of Jacobian at conventional
+ // vertices i and j associated with Lagrange vertex k
+ _fields->add("Jacobian diagonal", "jacobian_diagonal");
+ topology::Field<topology::SubMesh>& jacobianDiag = _fields->get(
+ "Jacobian diagonal");
+ jacobianDiag.newSection(slip, 2 * cs->spaceDim());
+ jacobianDiag.allocate();
+ jacobianDiag.vectorFieldType(topology::FieldBase::OTHER);
+
+ // Create field for slip rate associated with Lagrange vertex k
+ _fields->add("slip rate", "slip_rate");
+ topology::Field<topology::SubMesh>& slipRate = _fields->get("slip rate");
+ slipRate.cloneSection(slip);
+ slipRate.vectorFieldType(topology::FieldBase::OTHER);
+
+ //logger.stagePop();
+} // initialize
+
+// ----------------------------------------------------------------------
+// Update state variables as needed.
+void
+pylith::faults::FaultCohesiveDyn::updateStateVars(
+ const double t,
+ topology::SolutionFields* const fields)
+{ // updateStateVars
+ assert(0 != fields);
+ assert(0 != _fields);
+
+ // :TODO: Update friction state variables
+} // updateStateVars
+
+// ----------------------------------------------------------------------
+// Constrain solution based on friction.
+void
+pylith::faults::FaultCohesiveDyn::constrainSolnSpace(
+ topology::SolutionFields* const fields,
+ const double t,
+ const topology::Jacobian& jacobian)
+{ // constrainSolnSpace
+ assert(0 != fields);
+ assert(0 != _quadrature);
+ assert(0 != _fields);
+ assert(0 != _friction);
+
+ _updateSlipRate(*fields);
+
+ const int spaceDim = _quadrature->spaceDim();
+
+ // Allocate arrays for vertex values
+ double_array tractionTVertex(spaceDim);
+ double_array tractionTpdtVertex(spaceDim);
+ double_array slipTpdtVertex(spaceDim);
+ double_array lagrangeTpdtVertex(spaceDim);
+ double_array dLagrangeTpdtVertex(spaceDim);
+
+ // Get sections
+ double_array slipVertex(spaceDim);
+ const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
+ assert(!slipSection.isNull());
+
+ double_array slipRateVertex(spaceDim);
+ const ALE::Obj<RealSection>& slipRateSection =
+ _fields->get("slip rate").section();
+ assert(!slipRateSection.isNull());
+
+ const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+ assert(!areaSection.isNull());
+
+ double_array orientationVertex(spaceDim * spaceDim);
+ const ALE::Obj<RealSection>& orientationSection =
+ _fields->get("orientation").section();
+ assert(!orientationSection.isNull());
+
+ double_array tractionInitialVertex(spaceDim);
+ const ALE::Obj<RealSection>& tractionInitialSection =
+ (0 != _dbInitialTract) ? _fields->get("initial traction").section() : 0;
+
+ double_array lagrangeTVertex(spaceDim);
+ const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
+ assert(!dispTSection.isNull());
+
+ double_array lagrangeTIncrVertex(spaceDim);
+ const ALE::Obj<RealSection>& dispTIncrSection =
+ fields->get("dispIncr(t->t+dt)").section();
+ assert(!dispTIncrSection.isNull());
+
+ double_array jacobianVertexN(spaceDim);
+ double_array jacobianVertexP(spaceDim);
+ const ALE::Obj<RealSection>& jacobianDiagSection =
+ fields->get("Jacobian diagonal").section();
+ assert(!jacobianDiagSection.isNull());
+
+ slipSection->view("SLIP");
+ areaSection->view("AREA");
+ if (0 != _dbInitialTract)
+ tractionInitialSection->view("INITIAL TRACTION");
+ dispTSection->view("DISP (t)");
+ dispTIncrSection->view("DISP INCR (t->t+dt)");
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+ const int v_fault = _cohesiveVertices[iVertex].fault;
+ const int v_negative = _cohesiveVertices[iVertex].negative;
+ const int v_positive = _cohesiveVertices[iVertex].positive;
+
+ // Get slip
+ slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+
+ // Get slip rate
+ slipRateSection->restrictPoint(v_fault, &slipRateVertex[0],
+ slipRateVertex.size());
+
+ // Get total fault area asssociated with vertex (assembled over all cells)
+ const double* areaVertex = areaSection->restrictPoint(v_fault);
+ assert(0 != areaVertex);
+ assert(1 == areaSection->getFiberDimension(v_fault));
+
+ // Get fault orientation
+ orientationSection->restrictPoint(v_fault, &orientationVertex[0],
+ orientationVertex.size());
+
+ // Get diagonal of Jacobian at conventional vertices i and j
+ // associated with Lagrange vertex k
+ jacobianDiagSection->restrictPoint(v_negative, &jacobianVertexN[0],
+ jacobianVertexN.size());
+ jacobianDiagSection->restrictPoint(v_positive, &jacobianVertexP[0],
+ jacobianVertexP.size());
+
+ // Get initial fault tractions
+ if (0 != _dbInitialTract) {
+ assert(!tractionInitialSection.isNull());
+ tractionInitialSection->restrictPoint(v_fault,
+ &tractionInitialVertex[0], tractionInitialVertex.size());
+ } // if
+
+ // Get Lagrange multiplier values from disp(t), and dispIncr(t->t+dt)
+ dispTSection->restrictPoint(v_lagrange, &lagrangeTVertex[0],
+ lagrangeTVertex.size());
+ dispTIncrSection->restrictPoint(v_lagrange, &lagrangeTIncrVertex[0],
+ lagrangeTIncrVertex.size());
+
+ // Compute Lagrange multiplier at time t+dt
+ lagrangeTpdtVertex = lagrangeTVertex + lagrangeTIncrVertex;
+ dLagrangeTpdtVertex = 0.0;
+
+ // :KLUDGE: Solution at Lagrange constraint vertices is the
+ // Lagrange multiplier value, which is currently the force.
+ // Compute traction by dividing force by area
+ assert(*areaVertex > 0);
+ tractionTVertex = lagrangeTVertex / (*areaVertex);
+ tractionTpdtVertex = lagrangeTpdtVertex / (*areaVertex);
+
+ // Get friction properties and state variables.
+ _friction->retrievePropsAndVars(v_fault);
+
+ // Use fault constitutive model to compute traction associated with
+ // friction.
+ switch (spaceDim) { // switch
+ case 1: { // case 1
+ // Sensitivity of slip to changes in the Lagrange multipliers
+ // Aixjx = 1.0/Aix + 1.0/Ajx
+ const double Aixjx = 1.0 / jacobianVertexN[0] + 1.0
+ / jacobianVertexP[0];
+ const double Spp = 1.0;
+
+ if (tractionTpdtVertex[0] + tractionInitialVertex[0] < 0) {
+ // if compression, then no changes to solution
+ } else {
+ // if tension, then traction is zero.
+
+ // Update slip based on value required to stick versus
+ // zero traction
+ dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
+ slipVertex[0] += Spp * dLagrangeTpdtVertex[0];
+
+ // Set traction to zero.
+ tractionTpdtVertex[0] = 0.0;
+ } // else
+ PetscLogFlops(0); // :TODO: Fix this
+ break;
+ } // case 1
+ case 2: { // case 2
+ std::cout << "Normal traction:" << tractionTpdtVertex[1]
+ + tractionInitialVertex[1] << std::endl;
+
+ // Sensitivity of slip to changes in the Lagrange multipliers
+ // Aixjx = 1.0/Aix + 1.0/Ajx
+ assert(jacobianVertexN[0] > 0.0);
+ assert(jacobianVertexP[0] > 0.0);
+ const double Aixjx = 1.0 / jacobianVertexN[0] + 1.0
+ / jacobianVertexP[0];
+ // Aiyjy = 1.0/Aiy + 1.0/Ajy
+ assert(jacobianVertexN[1] > 0.0);
+ assert(jacobianVertexP[1] > 0.0);
+ const double Aiyjy = 1.0 / jacobianVertexN[1] + 1.0
+ / jacobianVertexP[1];
+ const double Cpx = orientationVertex[0];
+ const double Cpy = orientationVertex[1];
+ const double Cqx = orientationVertex[2];
+ const double Cqy = orientationVertex[3];
+ const double Spp = Cpx * Cpx * Aixjx + Cpy * Cpy * Aiyjy;
+ const double Spq = Cpx * Cqx * Aixjx + Cpy * Cqy * Aiyjy;
+ const double Sqq = Cqx * Cqx * Aixjx + Cqy * Cqy * Aiyjy;
+
+ const double tractionNormal = tractionTpdtVertex[1]
+ + tractionInitialVertex[1];
+ const double slip = slipVertex[0];
+ const double slipRate = slipRateVertex[0];
+
+ if (tractionTpdtVertex[1] + tractionInitialVertex[1] < 0 && 0
+ == slipVertex[1]) {
+ // if in compression and no opening
+ std::cout << "FAULT IN COMPRESSION" << std::endl;
+ const double frictionStress = _friction->calcFriction(slip, slipRate,
+ tractionNormal);
+ std::cout << "frictionStress: " << frictionStress << std::endl;
+ if (tractionTpdtVertex[0] > frictionStress || (tractionTpdtVertex[0]
+ < frictionStress && slipVertex[0] > 0.0)) {
+ // traction is limited by friction, so have sliding
+ std::cout << "LIMIT TRACTION, HAVE SLIDING" << std::endl;
+
+ // Update slip based on value required to stick versus friction
+ dLagrangeTpdtVertex[0] = (tractionTpdtVertex[0] - frictionStress)
+ * (*areaVertex);
+ slipVertex[0] += Spp * dLagrangeTpdtVertex[0];
+ std::cout << "Estimated slip: " << slipVertex[0] << std::endl;
+ // Limit traction
+ tractionTpdtVertex[0] = frictionStress;
+ } else {
+ // else friction exceeds value necessary, so stick
+ std::cout << "STICK" << std::endl;
+ // no changes to solution
+ } // if/else
+ } else {
+ // if in tension, then traction is zero.
+ std::cout << "FAULT IN TENSION" << std::endl;
+
+ // Update slip based on value required to stick versus
+ // zero traction
+ dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
+ dLagrangeTpdtVertex[1] = tractionTpdtVertex[1] * (*areaVertex);
+ slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
+ * dLagrangeTpdtVertex[1];
+ slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
+ * dLagrangeTpdtVertex[1];
+
+ // Set traction to zero
+ tractionTpdtVertex = 0.0;
+ } // else
+ PetscLogFlops(0); // :TODO: Fix this
+ break;
+ } // case 2
+ case 3: { // case 3
+ std::cout << "Normal traction:" << tractionTpdtVertex[2]
+ + tractionInitialVertex[2] << std::endl;
+
+ // Sensitivity of slip to changes in the Lagrange multipliers
+ // Aixjx = 1.0/Aix + 1.0/Ajx
+ assert(jacobianVertexN[0] > 0.0);
+ assert(jacobianVertexP[0] > 0.0);
+ const double Aixjx = 1.0 / jacobianVertexN[0] + 1.0
+ / jacobianVertexP[0];
+ // Aiyjy = 1.0/Aiy + 1.0/Ajy
+ assert(jacobianVertexN[1] > 0.0);
+ assert(jacobianVertexP[1] > 0.0);
+ const double Aiyjy = 1.0 / jacobianVertexN[1] + 1.0
+ / jacobianVertexP[1];
+ // Aizjz = 1.0/Aiz + 1.0/Ajz
+ assert(jacobianVertexN[2] > 0.0);
+ assert(jacobianVertexP[2] > 0.0);
+ const double Aizjz = 1.0 / jacobianVertexN[2] + 1.0
+ / jacobianVertexP[2];
+ const double Cpx = orientationVertex[0];
+ const double Cpy = orientationVertex[1];
+ const double Cpz = orientationVertex[2];
+ const double Cqx = orientationVertex[3];
+ const double Cqy = orientationVertex[4];
+ const double Cqz = orientationVertex[5];
+ const double Crx = orientationVertex[6];
+ const double Cry = orientationVertex[7];
+ const double Crz = orientationVertex[8];
+ const double Spp = Cpx * Cpx * Aixjx + Cpy * Cpy * Aiyjy + Cpz * Cpz
+ * Aizjz;
+ const double Spq = Cpx * Cqx * Aixjx + Cpy * Cqy * Aiyjy + Cpz * Cqz
+ * Aizjz;
+ const double Spr = Cpx * Crx * Aixjx + Cpy * Cry * Aiyjy + Cpz * Crz
+ * Aizjz;
+ const double Sqq = Cqx * Cqx * Aixjx + Cqy * Cqy * Aiyjy + Cqz * Cqz
+ * Aizjz;
+ const double Sqr = Cqx * Crx * Aixjx + Cqy * Cry * Aiyjy + Cqz * Crz
+ * Aizjz;
+ const double Srr = Crx * Crx * Aixjx + Cry * Cry * Aiyjy + Crz * Crz
+ * Aizjz;
+
+ double slip = sqrt(pow(slipVertex[1], 2) + pow(slipVertex[0], 2));
+ double slipRate = sqrt(pow(slipRateVertex[1], 2) + pow(slipRateVertex[0],
+ 2));
+
+ const double tractionNormalVertex = tractionTpdtVertex[2] + tractionInitialVertex[2];
+ const double tractionShearVertex = sqrt(pow(tractionTpdtVertex[1], 2) + pow(
+ tractionTpdtVertex[0], 2));
+ const double slipShearVertex = sqrt(pow(slipVertex[1], 2) + pow(slipVertex[0], 2));
+
+ if (tractionNormalVertex < 0 && 0 == slipVertex[2]) {
+ // if in compression and no opening
+ std::cout << "FAULT IN COMPRESSION" << std::endl;
+ const double frictionStress = _friction->calcFriction(slip, slipRate,
+ tractionNormalVertex);
+ std::cout << "frictionStress: " << frictionStress << std::endl;
+ if (tractionShearVertex > frictionStress || (tractionShearVertex
+ < frictionStress && slipShearVertex > 0.0)) {
+ // traction is limited by friction, so have sliding
+ std::cout << "LIMIT TRACTION, HAVE SLIDING" << std::endl;
+
+ // Update slip based on value required to stick versus friction
+ dLagrangeTpdtVertex[0] = (tractionShearVertex - frictionStress)
+ * tractionTpdtVertex[0] / tractionShearVertex * (*areaVertex);
+ dLagrangeTpdtVertex[1] = (tractionShearVertex - frictionStress)
+ * tractionTpdtVertex[1] / tractionShearVertex * (*areaVertex);
+ slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
+ * dLagrangeTpdtVertex[1];
+
+ slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
+ * dLagrangeTpdtVertex[1];
+
+ std::cout << "Estimated slip: " << " " << slipVertex[0] << " "
+ << slipVertex[1] << " " << slipVertex[2] << std::endl;
+
+ // Limit traction
+ tractionTpdtVertex[0] = frictionStress * tractionTpdtVertex[0]
+ / tractionShearVertex;
+ tractionTpdtVertex[1] = frictionStress * tractionTpdtVertex[1]
+ / tractionShearVertex;
+ } else {
+ // else friction exceeds value necessary, so stick
+ std::cout << "STICK" << std::endl;
+ // no changes to solution
+ } // if/else
+ } else {
+ // if in tension, then traction is zero.
+ std::cout << "FAULT IN TENSION" << std::endl;
+
+ // Update slip based on value required to stick versus
+ // zero traction
+ dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
+ dLagrangeTpdtVertex[1] = tractionTpdtVertex[1] * (*areaVertex);
+ dLagrangeTpdtVertex[2] = tractionTpdtVertex[2] * (*areaVertex);
+ slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
+ * dLagrangeTpdtVertex[1] + Spr * dLagrangeTpdtVertex[2];
+ slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
+ * dLagrangeTpdtVertex[1] + Sqr * dLagrangeTpdtVertex[2];
+ slipVertex[2] += Spr * dLagrangeTpdtVertex[0] + Sqr
+ * dLagrangeTpdtVertex[1] + Srr * dLagrangeTpdtVertex[2];
+
+ std::cout << "Estimated slip: " << " " << slipVertex[0] << " "
+ << slipVertex[1] << " " << slipVertex[2] << std::endl;
+
+ // Set traction to zero
+ tractionTpdtVertex = 0.0;
+ } // else
+ PetscLogFlops(0); // :TODO: Fix this
+ break;
+ } // case 3
+ default:
+ assert(0);
+ } // switch
+
+ // Update Lagrange multiplier values.
+ // :KLUDGE: (TEMPORARY) Solution at Lagrange constraint vertices
+ // is the Lagrange multiplier value, which is currently the
+ // force. Compute force by multipling traction by area
+ lagrangeTIncrVertex =
+ (tractionTpdtVertex - tractionTVertex) * (*areaVertex);
+ assert(lagrangeTIncrVertex.size() ==
+ dispTIncrSection->getFiberDimension(v_lagrange));
+ dispTIncrSection->updatePoint(v_lagrange, &lagrangeTIncrVertex[0]);
+
+ // Update the slip estimate based on adjustment to the Lagrange
+ // multiplier values.
+ assert(slipVertex.size() ==
+ slipSection->getFiberDimension(v_fault));
+ slipSection->updatePoint(v_fault, &slipVertex[0]);
+ } // if
+
+ dispTIncrSection->view("AFTER DISP INCR (t->t+dt)");
+ slipSection->view("AFTER SLIP");
+} // constrainSolnSpace
+
+// ----------------------------------------------------------------------
+// Adjust solution from solver with lumped Jacobian to match Lagrange
+// multiplier constraints.
+void
+pylith::faults::FaultCohesiveDyn::adjustSolnLumped(topology::SolutionFields* const fields,
+ const topology::Field<
+ topology::Mesh>& jacobian)
+{ // adjustSolnLumped
+ // :TODO: Update this to constrain solution space using friction
+ assert(false);
+#if 0
+ assert(0 != fields);
+ assert(0 != _quadrature);
+
+ // Cohesive cells with conventional vertices i and j, and constraint
+ // vertex k require 2 adjustments to the solution:
+ //
+ // * DOF k: Compute increment in Lagrange multipliers
+ // dl_k = S^{-1} (-C_ki (A_i^{-1} r_i - C_kj A_j^{-1} r_j + u_i - u_j) - d_k)
+ // S = C_ki (A_i^{-1} + A_j^{-1}) C_ki^T
+ // * DOF i and j: Adjust displacement increment (solution) to account
+ // for Lagrange multiplier constraints
+ // du_i = +A_i^-1 C_ki^T dlk
+ // du_j = -A_j^-1 C_kj^T dlk
+
+ const int setupEvent = _logger->eventId("FaAS setup");
+ const int geometryEvent = _logger->eventId("FaAS geometry");
+ const int computeEvent = _logger->eventId("FaAS compute");
+ const int restrictEvent = _logger->eventId("FaAS restrict");
+ const int updateEvent = _logger->eventId("FaAS update");
+
+ _logger->eventBegin(setupEvent);
+
+ // Get cell information and setup storage for cell data
+ const int spaceDim = _quadrature->spaceDim();
+ const int orientationSize = spaceDim * spaceDim;
+
+ // Get section information
+ double_array orientationVertex(orientationSize);
+ const ALE::Obj<RealSection>& orientationSection =
+ _fields->get("orientation").section();
+ assert(!orientationSection.isNull());
+
+ double_array slipVertex(spaceDim);
+ const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
+ assert(!slipSection.isNull());
+
+ double_array jacobianVertexN(spaceDim);
+ double_array jacobianVertexP(spaceDim);
+ const ALE::Obj<RealSection>& jacobianSection = jacobian.section();
+ assert(!jacobianSection.isNull());
+
+ double_array residualVertexN(spaceDim);
+ double_array residualVertexP(spaceDim);
+ const ALE::Obj<RealSection>& residualSection =
+ fields->get("residual").section();
+
+ double_array dispTVertexN(spaceDim);
+ double_array dispTVertexP(spaceDim);
+ const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
+
+ double_array solutionVertexN(spaceDim);
+ double_array solutionVertexP(spaceDim);
+ double_array solutionVertexL(spaceDim);
+ const ALE::Obj<RealSection>& solutionSection = fields->get(
+ "dispIncr(t->t+dt)").section();
+
+ _logger->eventEnd(setupEvent);
+
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(computeEvent);
+#endif
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+ const int v_fault = _cohesiveVertices[iVertex].fault;
+ const int v_negative = _cohesiveVertices[iVertex].negative;
+ const int v_positive = _cohesiveVertices[iVertex].positive;
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(restrictEvent);
+#endif
+
+ // Get orientations at fault cell's vertices.
+ orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
+
+ // Get slip at fault cell's vertices.
+ slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+
+ // Get residual at cohesive cell's vertices.
+ residualSection->restrictPoint(v_negative, &residualVertexN[0], residualVertexN.size());
+ residualSection->restrictPoint(v_positive, &residualVertexP[0], residualVertexP.size());
+
+ // Get jacobian at cohesive cell's vertices.
+ jacobianSection->restrictPoint(v_negative, &jacobianVertexN[0], jacobianVertexN.size());
+ jacobianSection->restrictPoint(v_positive, &jacobianVertexP[0], jacobianVertexP.size());
+
+ // Get disp(t) at cohesive cell's vertices.
+ dispTSection->restrictPoint(v_negative, &dispTVertexN[0], dispTVertexN.size());
+ dispTSection->restrictPoint(v_positive, &dispTVertexP[0], dispTVertexP.size());
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(restrictEvent);
+ _logger->eventBegin(computeEvent);
+#endif
+
+ switch (spaceDim) { // switch
+ case 1: {
+ assert(jacobianVertexN[0] > 0.0);
+ assert(jacobianVertexP[0] > 0.0);
+
+ const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+ / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+ // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+ const double Aru = residualVertexN[0] / jacobianVertexN[0]
+ - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+ - dispTVertexP[0];
+
+ // dl_k = D^{-1}( - C_{ki} Aru - d_k)
+ const double Aruslip = -Aru - slipVertex[0];
+ const double dlp = Sinv * Aruslip;
+
+ // Update displacements at negative vertex
+ solutionVertexN[0] = +1.0 / jacobianVertexN[0] * dlp;
+
+ // Update displacements at positive vertex
+ solutionVertexP[0] = -1.0 / jacobianVertexP[0] * dlp;
+
+ // Update Lagrange multiplier.
+ solutionVertexL[0] = dlp;
+
+ break;
+ } // case 1
+ case 2: {
+ assert(jacobianVertexN[0] > 0.0);
+ assert(jacobianVertexN[1] > 0.0);
+ assert(jacobianVertexP[0] > 0.0);
+ assert(jacobianVertexP[1] > 0.0);
+
+ const double Cpx = orientationVertex[0];
+ const double Cpy = orientationVertex[1];
+ const double Cqx = orientationVertex[2];
+ const double Cqy = orientationVertex[3];
+
+ // Check to make sure Jacobian is same at all DOF for
+ // vertices i and j (means S is diagonal with equal enties).
+ assert(jacobianVertexN[0] == jacobianVertexN[1]);
+ assert(jacobianVertexP[0] == jacobianVertexP[1]);
+
+ const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+ / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+ // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+ const double Arux = residualVertexN[0] / jacobianVertexN[0]
+ - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+ - dispTVertexP[0];
+ const double Aruy = residualVertexN[1] / jacobianVertexN[1]
+ - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
+ - dispTVertexP[1];
+
+ // dl_k = S^{-1}(-C_{ki} Aru - d_k)
+ const double Arup = Cpx * Arux + Cpy * Aruy;
+ const double Aruq = Cqx * Arux + Cqy * Aruy;
+ const double Arupslip = -Arup - slipVertex[0];
+ const double Aruqslip = -Aruq - slipVertex[1];
+ const double dlp = Sinv * Arupslip;
+ const double dlq = Sinv * Aruqslip;
+
+ const double dlx = Cpx * dlp + Cqx * dlq;
+ const double dly = Cpy * dlp + Cqy * dlq;
+
+ // Update displacements at negative vertex.
+ solutionVertexN[0] = dlx / jacobianVertexN[0];
+ solutionVertexN[1] = dly / jacobianVertexN[1];
+
+ // Update displacements at positive vertex.
+ solutionVertexP[0] = -dlx / jacobianVertexP[0];
+ solutionVertexP[1] = -dly / jacobianVertexP[0];
+
+ // Update Lagrange multiplier.
+ solutionVertexL[0] = dlp;
+ solutionVertexL[1] = dlq;
+
+ break;
+ } // case 2
+ case 3: {
+ assert(jacobianVertexN[0] > 0.0);
+ assert(jacobianVertexN[1] > 0.0);
+ assert(jacobianVertexN[2] > 0.0);
+ assert(jacobianVertexP[0] > 0.0);
+ assert(jacobianVertexP[1] > 0.0);
+ assert(jacobianVertexP[2] > 0.0);
+
+ const double Cpx = orientationVertex[0];
+ const double Cpy = orientationVertex[1];
+ const double Cpz = orientationVertex[2];
+ const double Cqx = orientationVertex[3];
+ const double Cqy = orientationVertex[4];
+ const double Cqz = orientationVertex[5];
+ const double Crx = orientationVertex[6];
+ const double Cry = orientationVertex[7];
+ const double Crz = orientationVertex[8];
+
+ // Check to make sure Jacobian is same at all DOF for
+ // vertices i and j (means S is diagonal with equal enties).
+ assert(jacobianVertexN[0] == jacobianVertexN[1] && jacobianVertexN[0] == jacobianVertexN[2]);
+ assert(jacobianVertexP[0] == jacobianVertexP[1] && jacobianVertexP[0] == jacobianVertexP[2]);
+
+ const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+ / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+ // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+ const double Arux = residualVertexN[0] / jacobianVertexN[0]
+ - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+ - dispTVertexP[0];
+ const double Aruy = residualVertexN[1] / jacobianVertexN[1]
+ - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
+ - dispTVertexP[1];
+ const double Aruz = residualVertexN[2] / jacobianVertexN[2]
+ - residualVertexP[2] / jacobianVertexP[2] + dispTVertexN[2]
+ - dispTVertexP[2];
+
+ // dl_k = D^{-1}( -C_{ki} Aru - d_k)
+ const double Arup = Cpx * Arux + Cpy * Aruy + Cpz * Aruz;
+ const double Aruq = Cqx * Arux + Cqy * Aruy + Cqz * Aruz;
+ const double Arur = Crx * Arux + Cry * Aruy + Crz * Aruz;
+ const double Arupslip = -Arup - slipVertex[0];
+ const double Aruqslip = -Aruq - slipVertex[1];
+ const double Arurslip = -Arur - slipVertex[2];
+ const double dlp = Sinv * Arupslip;
+ const double dlq = Sinv * Aruqslip;
+ const double dlr = Sinv * Arurslip;
+
+ const double dlx = Cpx * dlp + Cqx * dlq + Crx * dlr;
+ const double dly = Cpy * dlp + Cqy * dlq + Cry * dlr;
+ const double dlz = Cpz * dlp + Cqz * dlq + Crz * dlr;
+
+ // Update displacements at negative vertex.
+ solutionVertexN[0] = dlx / jacobianVertexN[0];
+ solutionVertexN[1] = dly / jacobianVertexN[1];
+ solutionVertexN[2] = dlz / jacobianVertexN[2];
+
+ // Update displacements at positive vertex.
+ solutionVertexP[0] = -dlx / jacobianVertexP[0];
+ solutionVertexP[1] = -dly / jacobianVertexP[1];
+ solutionVertexP[2] = -dlz / jacobianVertexP[2];
+
+ // Update Lagrange multiplier.
+ solutionVertexL[0] = dlp;
+ solutionVertexL[1] = dlq;
+ solutionVertexL[2] = dlr;
+
+ break;
+ } // case 3
+ default:
+ assert(0);
+ throw std::logic_error("Unknown spatial dimension.");
+ } // switch
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(computeEvent);
+ _logger->eventBegin(updateEvent);
+#endif
+
+ assert(solutionVertexN.size() == solutionSection->getFiberDimension(v_negative));
+ solutionSection->updateAddPoint(v_negative, &solutionVertexN[0]);
+
+ assert(solutionVertexP.size() == solutionSection->getFiberDimension(v_positive));
+ solutionSection->updateAddPoint(v_positive, &solutionVertexP[0]);
+
+ assert(solutionVertexL.size() == solutionSection->getFiberDimension(v_lagrange));
+ solutionSection->updateAddPoint(v_lagrange, &solutionVertexL[0]);
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(updateEvent);
+#endif
+ } // for
+
+ switch(spaceDim) {
+ case 1:
+ PetscLogFlops(numVertices*17);
+ break;
+ case 2:
+ PetscLogFlops(numVertices*41);
+ break;
+ case 3:
+ PetscLogFlops(numVertices*72);
+ break;
+ default:
+ assert(0);
+ throw std::logic_error("Unknown spatial dimension.");
+ } // switch
+
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(computeEvent);
+#endif
+#endif
+} // adjustSolnLumped
+
+// ----------------------------------------------------------------------
+// Get vertex field associated with integrator.
+const pylith::topology::Field<pylith::topology::SubMesh>&
+pylith::faults::FaultCohesiveDyn::vertexField(const char* name,
+ const topology::SolutionFields* fields)
+{ // vertexField
+ assert(0 != _faultMesh);
+ assert(0 != _quadrature);
+ assert(0 != _normalizer);
+ assert(0 != _fields);
+ assert(0 != _friction);
+
+ const int cohesiveDim = _faultMesh->dimension();
+ const int spaceDim = _quadrature->spaceDim();
+
+ const int slipStrLen = strlen("final_slip");
+ const int timeStrLen = strlen("slip_time");
+
+ double scale = 0.0;
+ int fiberDim = 0;
+ if (0 == strcasecmp("slip", name)) {
+ const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+ return slip;
+
+ } else if (cohesiveDim > 0 && 0 == strcasecmp("strike_dir", name)) {
+ const ALE::Obj<RealSection>& orientationSection = _fields->get(
+ "orientation").section();
+ assert(!orientationSection.isNull());
+ const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
+ 0);
+ assert(!dirSection.isNull());
+ _allocateBufferVectorField();
+ topology::Field<topology::SubMesh>& buffer =
+ _fields->get("buffer (vector)");
+ buffer.copy(dirSection);
+ buffer.label("strike_dir");
+ buffer.scale(1.0);
+ return buffer;
+
+ } else if (2 == cohesiveDim && 0 == strcasecmp("dip_dir", name)) {
+ const ALE::Obj<RealSection>& orientationSection = _fields->get(
+ "orientation").section();
+ assert(!orientationSection.isNull());
+ const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
+ 1);
+ _allocateBufferVectorField();
+ topology::Field<topology::SubMesh>& buffer =
+ _fields->get("buffer (vector)");
+ buffer.copy(dirSection);
+ buffer.label("dip_dir");
+ buffer.scale(1.0);
+ return buffer;
+
+ } else if (0 == strcasecmp("normal_dir", name)) {
+ const ALE::Obj<RealSection>& orientationSection = _fields->get(
+ "orientation").section();
+ assert(!orientationSection.isNull());
+ const int space = (0 == cohesiveDim) ? 0 : (1 == cohesiveDim) ? 1 : 2;
+ const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
+ space);
+ assert(!dirSection.isNull());
+ _allocateBufferVectorField();
+ topology::Field<topology::SubMesh>& buffer =
+ _fields->get("buffer (vector)");
+ buffer.copy(dirSection);
+ buffer.label("normal_dir");
+ buffer.scale(1.0);
+ return buffer;
+
+ } else if (0 == strncasecmp("initial_traction", name, slipStrLen)) {
+ assert(0 != _dbInitialTract);
+ const topology::Field<topology::SubMesh>& initialTraction = _fields->get(
+ "initial traction");
+ return initialTraction;
+
+ } else if (0 == strcasecmp("traction", name)) {
+ assert(0 != fields);
+ const topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
+ _allocateBufferVectorField();
+ topology::Field<topology::SubMesh>& buffer =
+ _fields->get("buffer (vector)");
+ _calcTractions(&buffer, dispT);
+ return buffer;
+
+ } else {
+ std::ostringstream msg;
+ msg << "Request for unknown vertex field '" << name << "' for fault '"
+ << label() << "'.";
+ throw std::runtime_error(msg.str());
+ } // else
+
+
+ // Satisfy return values
+ assert(0 != _fields);
+ const topology::Field<topology::SubMesh>& buffer = _fields->get(
+ "buffer (vector)");
+ return buffer;
+} // vertexField
+
+// ----------------------------------------------------------------------
+// Get cell field associated with integrator.
+const pylith::topology::Field<pylith::topology::SubMesh>&
+pylith::faults::FaultCohesiveDyn::cellField(const char* name,
+ const topology::SolutionFields* fields) { // cellField
+ // Should not reach this point if requested field was found
+ std::ostringstream msg;
+ msg << "Request for unknown cell field '" << name << "' for fault '"
+ << label() << ".";
+ throw std::runtime_error(msg.str());
+
+ // Satisfy return values
+ assert(0 != _fields);
+ const topology::Field<topology::SubMesh>& buffer = _fields->get(
+ "buffer (vector)");
+ return buffer;
+} // cellField
+
+// ----------------------------------------------------------------------
+void
+pylith::faults::FaultCohesiveDyn::_getInitialTractions(void)
+{ // _getInitialTractions
+ assert(0 != _normalizer);
+ assert(0 != _quadrature);
+
+ const double pressureScale = _normalizer->pressureScale();
+ const double lengthScale = _normalizer->lengthScale();
+
+ const int spaceDim = _quadrature->spaceDim();
+ const int numQuadPts = _quadrature->numQuadPts();
+
+ if (0 != _dbInitialTract) { // Setup initial values, if provided.
+ // Create section to hold initial tractions.
+ _fields->add("initial traction", "initial_traction");
+ topology::Field<topology::SubMesh>& traction = _fields->get(
+ "initial traction");
+ topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+ traction.cloneSection(slip);
+ traction.scale(pressureScale);
+ const ALE::Obj<RealSection>& tractionSection = traction.section();
+ assert(!tractionSection.isNull());
+
+ _dbInitialTract->open();
+ switch (spaceDim) { // switch
+ case 1: {
+ const char* valueNames[] = { "traction-normal" };
+ _dbInitialTract->queryVals(valueNames, 1);
+ break;
+ } // case 1
+ case 2: {
+ const char* valueNames[] = { "traction-shear", "traction-normal" };
+ _dbInitialTract->queryVals(valueNames, 2);
+ break;
+ } // case 2
+ case 3: {
+ const char* valueNames[] = { "traction-shear-leftlateral",
+ "traction-shear-updip", "traction-normal" };
+ _dbInitialTract->queryVals(valueNames, 3);
+ break;
+ } // case 3
+ default:
+ std::cerr << "Bad spatial dimension '" << spaceDim << "'." << std::endl;
+ assert(0);
+ throw std::logic_error("Bad spatial dimension in Neumann.");
+ } // switch
+
+ // Get 'fault' vertices.
+ const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+ assert(!faultSieveMesh.isNull());
+ const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+ faultSieveMesh->depthStratum(0);
+ assert(!vertices.isNull());
+ const SieveSubMesh::label_sequence::iterator verticesBegin =
+ vertices->begin();
+ const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+ const int numBasis = _quadrature->numBasis();
+ const int spaceDim = _quadrature->spaceDim();
+
+ // Containers for database query results and quadrature coordinates in
+ // reference geometry.
+ double_array tractionVertex(spaceDim);
+ double_array coordsVertex(spaceDim);
+
+ // Get sections.
+ const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
+ "coordinates");
+ assert(!coordinates.isNull());
+ const spatialdata::geocoords::CoordSys* cs = _faultMesh->coordsys();
+
+ const double lengthScale = _normalizer->lengthScale();
+
+ // Loop over vertices in fault mesh and perform queries.
+ for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+ != verticesEnd; ++v_iter) {
+ coordinates->restrictPoint(*v_iter, &coordsVertex[0], coordsVertex.size());
+ // Dimensionalize coordinates
+ _normalizer->dimensionalize(&coordsVertex[0], coordsVertex.size(),
+ lengthScale);
+
+ tractionVertex = 0.0;
+ const int err = _dbInitialTract->query(&tractionVertex[0], spaceDim,
+ &coordsVertex[0], spaceDim, cs);
+ if (err) {
+ std::ostringstream msg;
+ msg << "Could not find initial tractions at (";
+ for (int i = 0; i < spaceDim; ++i)
+ msg << " " << coordsVertex[i];
+ msg << ") for dynamic fault interface " << label() << "\n"
+ << "using spatial database " << _dbInitialTract->label() << ".";
+ throw std::runtime_error(msg.str());
+ } // if
+
+ _normalizer->nondimensionalize(&tractionVertex[0], tractionVertex.size(),
+ pressureScale);
+
+ // Update section
+ assert(tractionVertex.size() == tractionSection->getFiberDimension(*v_iter));
+ tractionSection->updatePoint(*v_iter, &tractionVertex[0]);
+ } // for
+
+ _dbInitialTract->close();
+
+ //traction.view("INITIAL TRACTIONS"); // DEBUGGING
+ } // if
+} // _getInitialTractions
+
+// ----------------------------------------------------------------------
+// Compute change in tractions on fault surface using solution.
+// NOTE: We must convert vertex labels to fault vertex labels
+void
+pylith::faults::FaultCohesiveDyn::_calcTractions(
+ topology::Field<topology::SubMesh>* tractions,
+ const topology::Field<topology::Mesh>& dispT)
+{ // _calcTractionsChange
+ assert(0 != tractions);
+ assert(0 != _faultMesh);
+ assert(0 != _fields);
+ assert(0 != _normalizer);
+
+ // Fiber dimension of tractions matches spatial dimension.
+ const int fiberDim = _quadrature->spaceDim();
+ double_array tractionsVertex(fiberDim);
+
+ // Get sections.
+ const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+ assert(!areaSection.isNull());
+ const ALE::Obj<RealSection>& dispTSection = dispT.section();
+ assert(!dispTSection.isNull());
+
+ // Allocate buffer for tractions field (if necessary).
+ const ALE::Obj<RealSection>& tractionsSection = tractions->section();
+ if (tractionsSection.isNull()) {
+ ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+ //logger.stagePush("Fault");
+
+ const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+ tractions->newSection(slip, fiberDim);
+ tractions->allocate();
+
+ //logger.stagePop();
+ } // if
+ const double pressureScale = _normalizer->pressureScale();
+ tractions->label("traction");
+ tractions->scale(pressureScale);
+ tractions->zero();
+
+ // Set tractions to initial tractions if they exist
+ if (0 != _dbInitialTract) {
+ const ALE::Obj<RealSection>& initialTractionSection = _fields->get(
+ "initial traction").section();
+ assert(!initialTractionSection.isNull());
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_fault = _cohesiveVertices[iVertex].fault;
+ initialTractionSection->restrictPoint(v_fault, &tractionsVertex[0],
+ tractionsVertex.size());
+ assert(fiberDim == tractionsSection->getFiberDimension(v_fault));
+ tractionsSection->updatePoint(v_fault, &tractionsVertex[0]);
+ } // for
+ } // if
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+ const int v_fault = _cohesiveVertices[iVertex].fault;
+
+ assert(fiberDim == dispTSection->getFiberDimension(v_lagrange));
+ assert(fiberDim == tractionsSection->getFiberDimension(v_fault));
+ assert(1 == areaSection->getFiberDimension(v_fault));
+
+ const double* dispTVertex = dispTSection->restrictPoint(v_lagrange);
+ assert(0 != dispTVertex);
+ const double* areaVertex = areaSection->restrictPoint(v_fault);
+ assert(0 != areaVertex);
+
+ for (int i = 0; i < fiberDim; ++i)
+ tractionsVertex[i] = dispTVertex[i] / areaVertex[0];
+
+ assert(tractionsVertex.size() == tractionsSection->getFiberDimension(v_fault));
+ tractionsSection->updateAddPoint(v_fault, &tractionsVertex[0]);
+ } // for
+
+ PetscLogFlops(numVertices * (1 + fiberDim) );
+
+#if 0 // DEBUGGING
+ tractions->view("TRACTIONS");
+#endif
+
+} // _calcTractions
+
+// ----------------------------------------------------------------------
+// Update slip rate associated with Lagrange vertex k corresponding
+// to diffential velocity between conventional vertices i and j.
+void
+pylith::faults::FaultCohesiveDyn::_updateSlipRate(const topology::SolutionFields& fields)
+{ // _updateSlipRate
+ assert(0 != _fields);
+
+ const int spaceDim = _quadrature->spaceDim();
+
+ // Get section information
+ double_array velocityVertexN(spaceDim);
+ double_array velocityVertexP(spaceDim);
+ const ALE::Obj<RealSection>& velocitySection =
+ fields.get("velocity(t)").section();
+ assert(!velocitySection.isNull());
+
+ double_array slipRateVertex(spaceDim);
+ const ALE::Obj<RealSection>& slipRateSection =
+ _fields->get("slip rate").section();
+
+ double_array orientationVertex(spaceDim*spaceDim);
+ const ALE::Obj<RealSection>& orientationSection =
+ _fields->get("orientation").section();
+ assert(!orientationSection.isNull());
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+ const int v_fault = _cohesiveVertices[iVertex].fault;
+ const int v_negative = _cohesiveVertices[iVertex].negative;
+ const int v_positive = _cohesiveVertices[iVertex].positive;
+
+ // Get values
+ const double* velocityVertexN = velocitySection->restrictPoint(v_negative);
+ assert(0 != velocityVertexN);
+ assert(spaceDim == velocitySection->getFiberDimension(v_negative));
+
+ const double* velocityVertexP = velocitySection->restrictPoint(v_positive);
+ assert(0 != velocityVertexP);
+ assert(spaceDim == velocitySection->getFiberDimension(v_positive));
+
+ const double* orientationVertex = orientationSection->restrictPoint(v_fault);
+ assert(0 != orientationVertex);
+ assert(spaceDim*spaceDim == orientationSection->getFiberDimension(v_fault));
+
+ slipRateVertex = 0.0;
+ // Velocity for negative vertex.
+ for (int iDim = 0; iDim < spaceDim; ++iDim)
+ for (int kDim = 0; kDim < spaceDim; ++kDim)
+ slipRateVertex[iDim] +=
+ velocityVertexN[kDim] * -orientationVertex[kDim*spaceDim+iDim];
+
+ // Velocity for positive vertex.
+ for (int iDim = 0; iDim < spaceDim; ++iDim)
+ for (int kDim = 0; kDim < spaceDim; ++kDim)
+ slipRateVertex[iDim] +=
+ velocityVertexP[kDim] * +orientationVertex[kDim*spaceDim+iDim];
+
+ // Update slip rate field.
+ assert(slipRateVertex.size() == slipRateSection->getFiberDimension(v_fault));
+ slipRateSection->updatePoint(v_fault, &slipRateVertex[0]);
+ } // for
+
+ PetscLogFlops(numVertices*spaceDim*spaceDim*4);
+} // _updateSlipRate
+
+
+// End of file
Copied: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.hh (from rev 16277, short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.hh)
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.hh (rev 0)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDyn.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,171 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file libsrc/faults/FaultCohesiveDyn.hh
+ *
+ * @brief C++ implementation for a fault surface with spontaneous
+ * (dynamic) slip implemented with cohesive cells.
+ */
+
+#if !defined(pylith_faults_faultcohesivedyn_hh)
+#define pylith_faults_faultcohesivedyn_hh
+
+// Include directives ---------------------------------------------------
+#include "FaultCohesiveLagrange.hh" // ISA FaultCohesiveLagrange
+
+#include "pylith/friction/frictionfwd.hh" // HOLDSA Friction model
+
+// FaultCohesiveDyn -----------------------------------------------------
+/**
+ * @brief C++ implementation for a fault surface with spontaneous
+ * (dynamic) slip implemented with cohesive cells.
+ *
+ */
+class pylith::faults::FaultCohesiveDyn : public FaultCohesiveLagrange
+{ // class FaultCohesiveDyn
+ friend class TestFaultCohesiveDyn; // unit testing
+
+ // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+ /// Default constructor.
+ FaultCohesiveDyn(void);
+
+ /// Destructor.
+ virtual
+ ~FaultCohesiveDyn(void);
+
+ /// Deallocate PETSc and local data structures.
+ virtual
+ void deallocate(void);
+
+ /** Sets the spatial database for the inital tractions.
+ *
+ * @param db spatial database for initial tractions
+ */
+ void dbInitialTract(spatialdata::spatialdb::SpatialDB* db);
+
+ /** Set the friction (constitutive) model.
+ *
+ * @param model Fault constutive model.
+ */
+ void frictionModel(friction::FrictionModel* const model);
+
+ /** Initialize fault. Determine orientation and setup boundary
+ * condition parameters.
+ *
+ * @param mesh Finite-element mesh.
+ * @param upDir Direction perpendicular to along-strike direction that is
+ * not collinear with fault normal (usually "up" direction but could
+ * be up-dip direction; only applies to fault surfaces in a 3-D domain).
+ * @param normalDir General preferred direction for fault normal
+ * (used to pick which of two possible normal directions for
+ * interface; only applies to fault surfaces in a 3-D domain).
+ */
+ void initialize(const topology::Mesh& mesh,
+ const double upDir[3],
+ const double normalDir[3]);
+
+ /** Update state variables as needed.
+ *
+ * @param t Current time
+ * @param fields Solution fields
+ * @param mesh Finite-element mesh
+ */
+ void updateStateVars(const double t,
+ topology::SolutionFields* const fields);
+
+ /** Constrain solution space based on friction.
+ *
+ * @param fields Solution fields.
+ * @param t Current time.
+ * @param jacobian Sparse matrix for system Jacobian.
+ */
+ void constrainSolnSpace(topology::SolutionFields* const fields,
+ const double t,
+ const topology::Jacobian& jacobian);
+
+ /** Adjust solution from solver with lumped Jacobian to match Lagrange
+ * multiplier constraints.
+ *
+ * @param fields Solution fields.
+ * @param jacobian Jacobian of the system.
+ */
+ void adjustSolnLumped(topology::SolutionFields* fields,
+ const topology::Field<topology::Mesh>& jacobian);
+
+ /** Get vertex field associated with integrator.
+ *
+ * @param name Name of cell field.
+ * @param fields Solution fields.
+ * @returns Vertex field.
+ */
+ const topology::Field<topology::SubMesh>&
+ vertexField(const char* name,
+ const topology::SolutionFields* fields =0);
+
+ /** Get cell field associated with integrator.
+ *
+ * @param name Name of cell field.
+ * @param fields Solution fields.
+ * @returns Cell field.
+ */
+ const topology::Field<topology::SubMesh>&
+ cellField(const char* name,
+ const topology::SolutionFields* fields =0);
+
+ // PRIVATE METHODS ////////////////////////////////////////////////////
+private :
+
+ /** Get initial tractions using a spatial database.
+ */
+ void _getInitialTractions(void);
+
+ /** Compute change in tractions on fault surface using solution.
+ *
+ * @param tractions Field for tractions.
+ * @param solution Solution over domain
+ */
+ void _calcTractions(topology::Field<topology::SubMesh>* tractions,
+ const topology::Field<topology::Mesh>& solution);
+
+ /** Update slip rate associated with Lagrange vertex k corresponding
+ * to diffential velocity between conventional vertices i and j.
+ *
+ * @param fields Solution fields.
+ */
+ void _updateSlipRate(const topology::SolutionFields& fields);
+
+ // PRIVATE MEMBERS ////////////////////////////////////////////////////
+private :
+
+ /// Database for initial tractions.
+ spatialdata::spatialdb::SpatialDB* _dbInitialTract;
+
+ /// To identify constitutive model
+ friction::FrictionModel* _friction;
+
+ // NOT IMPLEMENTED ////////////////////////////////////////////////////
+private :
+
+ /// Not implemented
+ FaultCohesiveDyn(const FaultCohesiveDyn&);
+
+ /// Not implemented
+ const FaultCohesiveDyn& operator=(const FaultCohesiveDyn&);
+
+}; // class FaultCohesiveDyn
+
+#endif // pylith_faults_faultcohesivedyn_hh
+
+
+// End of file
Deleted: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,1914 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "FaultCohesiveDynL.hh" // implementation of object methods
-
-#include "CohesiveTopology.hh" // USES CohesiveTopology
-
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
-#include "pylith/feassemble/CellGeometry.hh" // USES CellGeometry
-#include "pylith/topology/Mesh.hh" // USES Mesh
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/topology/Field.hh" // USES Field
-#include "pylith/topology/Fields.hh" // USES Fields
-#include "pylith/topology/Jacobian.hh" // USES Jacobian
-#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
-#include "pylith/friction/FrictionModel.hh" // USES FrictionModel
-
-#include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
-#include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
-#include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
-
-#include <cmath> // USES pow(), sqrt()
-#include <strings.h> // USES strcasecmp()
-#include <cstring> // USES strlen()
-#include <cstdlib> // USES atoi()
-#include <cassert> // USES assert()
-#include <sstream> // USES std::ostringstream
-#include <stdexcept> // USES std::runtime_error
-
-// Precomputing geometry significantly increases storage but gives a
-// slight speed improvement.
-//#define PRECOMPUTE_GEOMETRY
-
-// ----------------------------------------------------------------------
-typedef pylith::topology::Mesh::SieveMesh SieveMesh;
-typedef pylith::topology::Mesh::RealSection RealSection;
-typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
-
-// ----------------------------------------------------------------------
-// Default constructor.
-pylith::faults::FaultCohesiveDynL::FaultCohesiveDynL(void) :
- _dbInitialTract(0),
- _friction(0)
-{ // constructor
- _useLagrangeConstraints = true;
- _needJacobianDiag = true;
- _needVelocity = true;
-} // constructor
-
-// ----------------------------------------------------------------------
-// Destructor.
-pylith::faults::FaultCohesiveDynL::~FaultCohesiveDynL(void)
-{ // destructor
- deallocate();
-} // destructor
-
-// ----------------------------------------------------------------------
-// Deallocate PETSc and local data structures.
-void pylith::faults::FaultCohesiveDynL::deallocate(void)
-{ // deallocate
- FaultCohesive::deallocate();
-
- _dbInitialTract = 0; // :TODO: Use shared pointer
- _friction = 0; // :TODO: Use shared pointer
-} // deallocate
-
-// ----------------------------------------------------------------------
-// Sets the spatial database for the inital tractions
-void
-pylith::faults::FaultCohesiveDynL::dbInitialTract(spatialdata::spatialdb::SpatialDB* db)
-{ // dbInitial
- _dbInitialTract = db;
-} // dbInitial
-
-// ----------------------------------------------------------------------
-// Get the friction (constitutive) model.
-void
-pylith::faults::FaultCohesiveDynL::frictionModel(friction::FrictionModel* const model)
-{ // frictionModel
- _friction = model;
-} // frictionModel
-
-// ----------------------------------------------------------------------
-// Initialize fault. Determine orientation and setup boundary
-void
-pylith::faults::FaultCohesiveDynL::initialize(const topology::Mesh& mesh,
- const double upDir[3],
- const double normalDir[3])
-{ // initialize
- assert(0 != upDir);
- assert(0 != normalDir);
- assert(0 != _quadrature);
- assert(0 != _normalizer);
-
- const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
- assert(0 != cs);
-
- delete _faultMesh;
- _faultMesh = new topology::SubMesh();
- CohesiveTopology::createFaultParallel(_faultMesh, &_cohesiveToFault, mesh,
- id(), useLagrangeConstraints());
-
- delete _fields;
- _fields = new topology::Fields<topology::Field<topology::SubMesh> >(
- *_faultMesh);
-
- ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
- //logger.stagePush("Fault");
-
- // Allocate slip field
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- assert(!vertices.isNull());
- _fields->add("slip", "slip");
- topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- slip.newSection(vertices, cs->spaceDim());
- slip.allocate();
- slip.vectorFieldType(topology::FieldBase::VECTOR);
- slip.scale(_normalizer->lengthScale());
-
- const ALE::Obj<SieveSubMesh::label_sequence>& cells =
- faultSieveMesh->heightStratum(0);
- assert(!cells.isNull());
- const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
- const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
- _quadrature->initializeGeometry();
-#if defined(PRECOMPUTE_GEOMETRY)
- _quadrature->computeGeometry(*_faultMesh, cells);
-#endif
-
- // Compute orientation at vertices in fault mesh.
- _calcOrientation(upDir, normalDir);
-
- // Compute tributary area for each vertex in fault mesh.
- _calcArea();
-
- // Get initial tractions using a spatial database.
- _getInitialTractions();
-
- // Setup fault constitutive model.
- assert(0 != _friction);
- _friction->initialize(*_faultMesh, _quadrature, _fields->get("area"));
-
- // Create field for diagonal entries of Jacobian at conventional
- // vertices i and j associated with Lagrange vertex k
- _fields->add("Jacobian diagonal", "jacobian_diagonal");
- topology::Field<topology::SubMesh>& jacobianDiag = _fields->get(
- "Jacobian diagonal");
- jacobianDiag.newSection(slip, 2 * cs->spaceDim());
- jacobianDiag.allocate();
- jacobianDiag.vectorFieldType(topology::FieldBase::OTHER);
-
- // Create field for slip rate associated with Lagrange vertex k
- _fields->add("slip rate", "slip_rate");
- topology::Field<topology::SubMesh>& slipRate = _fields->get("slip rate");
- slipRate.cloneSection(slip);
- slipRate.vectorFieldType(topology::FieldBase::OTHER);
-
- //logger.stagePop();
-} // initialize
-
-// ----------------------------------------------------------------------
-void pylith::faults::FaultCohesiveDynL::splitField(topology::Field<
- topology::Mesh>* field)
-{ // splitField
- assert(0 != field);
-
- const ALE::Obj<RealSection>& section = field->section();
- assert(!section.isNull());
- if (0 == section->getNumSpaces())
- return; // Return if there are no fibrations
-
- const int fibrationDisp = 0;
- const int fibrationLagrange = 1;
-
- // Get domain Sieve mesh
- const ALE::Obj<SieveMesh>& sieveMesh = field->mesh().sieveMesh();
- assert(!sieveMesh.isNull());
-
- // Get fault Sieve mesh
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
-
- const ALE::Obj<SieveMesh::label_sequence>& vertices =
- sieveMesh->depthStratum(0);
- assert(!vertices.isNull());
- const SieveSubMesh::label_sequence::iterator verticesBegin =
- vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
- SieveSubMesh::renumbering_type& renumbering =
- faultSieveMesh->getRenumbering();
- const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
- renumbering.end();
- for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd; ++v_iter)
- if (renumbering.find(*v_iter) != renumberingEnd) {
- const int vertexFault = renumbering[*v_iter];
- const int vertexMesh = *v_iter;
- const int fiberDim = section->getFiberDimension(vertexMesh);
- assert(fiberDim > 0);
- // Reset displacement fibration fiber dimension to zero.
- section->setFiberDimension(vertexMesh, 0, fibrationDisp);
- // Set Langrange fibration fiber dimension.
- section->setFiberDimension(vertexMesh, fiberDim, fibrationLagrange);
- } // if
-} // splitField
-
-// ----------------------------------------------------------------------
-// Integrate contribution of cohesive cells to residual term that
-// require assembly across processors.
-void pylith::faults::FaultCohesiveDynL::integrateResidual(const topology::Field<
- topology::Mesh>& residual,
- const double t,
- topology::SolutionFields* const fields)
-{ // integrateResidual
- assert(0 != fields);
- assert(0 != _quadrature);
- assert(0 != _fields);
-
- // Cohesive cells with normal vertices i and j, and constraint
- // vertex k make 2 contributions to the residual:
- //
- // * DOF i and j: internal forces in soln field associated with
- // slip -[C]^T{L(t)+dL(t)}
- // * DOF k: slip values -[C]{u(t)+dt(t)}
-
- // Get cell information and setup storage for cell data
- const int spaceDim = _quadrature->spaceDim();
- const int orientationSize = spaceDim * spaceDim;
- const int numBasis = _quadrature->numBasis();
- const int numConstraintVert = numBasis;
- const int numCorners = 3 * numConstraintVert; // cohesive cell
- const int numQuadPts = _quadrature->numQuadPts();
- const double_array& quadWts = _quadrature->quadWts();
- assert(quadWts.size() == numQuadPts);
-
- // Allocate vectors for cell values
- double_array dispTpdtCell(numCorners * spaceDim);
-
- // Tributary area for the current for each vertex.
- double_array areaVertexCell(numConstraintVert);
-
- // Get cohesive cells
- const ALE::Obj<SieveMesh>& sieveMesh = residual.mesh().sieveMesh();
- assert(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
- sieveMesh->getLabelStratum("material-id", id());
- assert(!cellsCohesive.isNull());
- const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
- cellsCohesive->begin();
- const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
- cellsCohesive->end();
- const int cellsCohesiveSize = cellsCohesive->size();
-
- // Get fault Sieve mesh
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
-
- // Get section information
- double_array orientationCell(numConstraintVert * orientationSize);
- const ALE::Obj<RealSection>& orientationSection =
- _fields->get("orientation").section();
- assert(!orientationSection.isNull());
- topology::Mesh::RestrictVisitor orientationVisitor(*orientationSection,
- orientationCell.size(), &orientationCell[0]);
-
- // Total fault area associated with each vertex (assembled over all cells).
- double_array areaCell(numConstraintVert);
- const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
- assert(!areaSection.isNull());
- topology::Mesh::RestrictVisitor areaVisitor(*areaSection, areaCell.size(),
- &areaCell[0]);
-
- double_array dispTCell(numCorners * spaceDim);
- topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
- const ALE::Obj<RealSection>& dispTSection = dispT.section();
- assert(!dispTSection.isNull());
- topology::Mesh::RestrictVisitor dispTVisitor(*dispTSection, dispTCell.size(),
- &dispTCell[0]);
-
- double_array dispTIncrCell(numCorners * spaceDim);
- topology::Field<topology::Mesh>& dispTIncr = fields->get("dispIncr(t->t+dt)");
- const ALE::Obj<RealSection>& dispTIncrSection = dispTIncr.section();
- assert(!dispTIncrSection.isNull());
- topology::Mesh::RestrictVisitor dispTIncrVisitor(*dispTIncrSection,
- dispTIncrCell.size(), &dispTIncrCell[0]);
-
- double_array residualCell(numCorners * spaceDim);
- const ALE::Obj<RealSection>& residualSection = residual.section();
- topology::Mesh::UpdateAddVisitor residualVisitor(*residualSection,
- &residualCell[0]);
-
- double_array coordinatesCell(numBasis * spaceDim);
- const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
- "coordinates");
- assert(!coordinates.isNull());
- topology::Mesh::RestrictVisitor coordsVisitor(*coordinates,
- coordinatesCell.size(), &coordinatesCell[0]);
-
- for (SieveMesh::label_sequence::iterator c_iter = cellsCohesiveBegin; c_iter
- != cellsCohesiveEnd; ++c_iter) {
- const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
- areaVertexCell = 0.0;
- residualCell = 0.0;
-
- // Compute geometry information for current cell
-#if defined(PRECOMPUTE_GEOMETRY)
- _quadrature->retrieveGeometry(c_fault);
-#else
- coordsVisitor.clear();
- faultSieveMesh->restrictClosure(c_fault, coordsVisitor);
- _quadrature->computeGeometry(coordinatesCell, c_fault);
-#endif
- // Get cell geometry information that depends on cell
- const double_array& basis = _quadrature->basis();
- const double_array& jacobianDet = _quadrature->jacobianDet();
-
- // Compute contributory area for cell (to weight contributions)
- for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
- const double wt = quadWts[iQuad] * jacobianDet[iQuad];
- for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
- const double dArea = wt * basis[iQuad * numBasis + iBasis];
- areaVertexCell[iBasis] += dArea;
- } // for
- } // for
-
- // Get orientations at fault cell's vertices.
- orientationVisitor.clear();
- faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
-
- // Get area at fault cell's vertices.
- areaVisitor.clear();
- faultSieveMesh->restrictClosure(c_fault, areaVisitor);
-
- // Get disp(t) at cohesive cell's vertices.
- dispTVisitor.clear();
- sieveMesh->restrictClosure(*c_iter, dispTVisitor);
-
- // Get dispIncr(t) at cohesive cell's vertices.
- dispTIncrVisitor.clear();
- sieveMesh->restrictClosure(*c_iter, dispTIncrVisitor);
-
- // Compute current estimate of displacement at time t+dt using
- // solution increment.
- dispTpdtCell = dispTCell + dispTIncrCell;
-
- for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
- // Blocks in cell matrix associated with normal cohesive
- // vertices i and j and constraint vertex k
- const int indexI = iConstraint;
- const int indexJ = iConstraint + numConstraintVert;
- const int indexK = iConstraint + 2 * numConstraintVert;
-
- assert(areaCell[iConstraint] > 0);
- const double wt = areaVertexCell[iConstraint] / areaCell[iConstraint];
-
- // Get orientation at constraint vertex
- const double* orientationVertex = &orientationCell[iConstraint
- * orientationSize];
- assert(0 != orientationVertex);
-
- // Entries associated with constraint forces applied at node i
- for (int iDim = 0; iDim < spaceDim; ++iDim) {
- for (int kDim = 0; kDim < spaceDim; ++kDim)
- residualCell[indexI * spaceDim + iDim] -= dispTpdtCell[indexK
- * spaceDim + kDim] * -orientationVertex[kDim * spaceDim + iDim]
- * wt;
- } // for
-
- // Entries associated with constraint forces applied at node j
- for (int jDim = 0; jDim < spaceDim; ++jDim) {
- for (int kDim = 0; kDim < spaceDim; ++kDim)
- residualCell[indexJ * spaceDim + jDim] -= dispTpdtCell[indexK
- * spaceDim + kDim] * orientationVertex[kDim * spaceDim + jDim]
- * wt;
- } // for
-
- // Entries associated with relative displacements between node i
- // and node j for constraint node k
- for (int kDim = 0; kDim < spaceDim; ++kDim) {
- for (int iDim = 0; iDim < spaceDim; ++iDim)
- residualCell[indexK * spaceDim + kDim] -= (dispTpdtCell[indexJ
- * spaceDim + iDim] - dispTpdtCell[indexI * spaceDim + iDim])
- * orientationVertex[kDim * spaceDim + iDim] * wt;
- } // for
- } // for
-
-#if 0 // DEBUGGING
- std::cout << "Updating fault residual for cell " << *c_iter << std::endl;
- for(int i = 0; i < numCorners*spaceDim; ++i) {
- std::cout << " dispTpdt["<<i<<"]: " << dispTpdtCell[i] << std::endl;
- }
- for(int i = 0; i < numCorners*spaceDim; ++i) {
- std::cout << " dispT["<<i<<"]: " << dispTCell[i] << std::endl;
- }
- for(int i = 0; i < numCorners*spaceDim; ++i) {
- std::cout << " dispIncr["<<i<<"]: " << dispTIncrCell[i] << std::endl;
- }
- for(int i = 0; i < numCorners*spaceDim; ++i) {
- std::cout << " v["<<i<<"]: " << residualCell[i] << std::endl;
- }
-#endif
-
- residualVisitor.clear();
- sieveMesh->updateClosure(*c_iter, residualVisitor);
- } // for
-
- PetscLogFlops(cellsCohesiveSize*numConstraintVert*spaceDim*spaceDim*11);
-} // integrateResidual
-
-// ----------------------------------------------------------------------
-// Integrate contribution of cohesive cells to residual term that do
-// not require assembly across cells, vertices, or processors.
-void pylith::faults::FaultCohesiveDynL::integrateResidualAssembled(const topology::Field<
- topology::Mesh>& residual,
- const double t,
- topology::SolutionFields* const fields)
-{ // integrateResidualAssembled
- assert(0 != fields);
- assert(0 != _fields);
-
- // Cohesive cells with normal vertices i and j, and constraint
- // vertex k make contributions to the assembled residual:
- //
- // * DOF k: slip values {D(t+dt)}
-
- topology::Field<topology::SubMesh>& slip = _fields->get("slip");
-
- const int spaceDim = _quadrature->spaceDim();
-
- // Get sections
- const ALE::Obj<SieveMesh>& sieveMesh = residual.mesh().sieveMesh();
- assert(!sieveMesh.isNull());
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<RealSection>& slipSection = slip.section();
- assert(!slipSection.isNull());
- const ALE::Obj<RealSection>& residualSection = residual.section();
- assert(!residualSection.isNull());
-
- const ALE::Obj<SieveMesh::label_sequence>& vertices =
- sieveMesh->depthStratum(0);
- assert(!vertices.isNull());
- const SieveSubMesh::label_sequence::iterator verticesBegin =
- vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
- SieveSubMesh::renumbering_type& renumbering =
- faultSieveMesh->getRenumbering();
- const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
- renumbering.end();
-
- for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd; ++v_iter)
- if (renumbering.find(*v_iter) != renumberingEnd) {
- const int vertexFault = renumbering[*v_iter];
- const int vertexMesh = *v_iter;
- const double* slipVertex = slipSection->restrictPoint(vertexFault);
- assert(spaceDim == slipSection->getFiberDimension(vertexFault));
- assert(spaceDim == residualSection->getFiberDimension(vertexMesh));
- assert(0 != slipVertex);
- residualSection->updateAddPoint(vertexMesh, slipVertex);
- } // if
-} // integrateResidualAssembled
-
-// ----------------------------------------------------------------------
-// Compute Jacobian matrix (A) associated with operator that do not
-// require assembly across cells, vertices, or processors.
-void
-pylith::faults::FaultCohesiveDynL::integrateJacobianAssembled(
- topology::Jacobian* jacobian,
- const double t,
- topology::SolutionFields* const fields)
-{ // integrateJacobianAssembled
- assert(0 != jacobian);
- assert(0 != fields);
- assert(0 != _fields);
-
- // Add constraint information to Jacobian matrix; these are the
- // direction cosines. Entries are associated with vertices ik, jk,
- // ki, and kj.
-
- // Get cohesive cells
- const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
- assert(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
- sieveMesh->getLabelStratum("material-id", id());
- assert(!cellsCohesive.isNull());
- const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
- cellsCohesive->begin();
- const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
- cellsCohesive->end();
- const int cellsCohesiveSize = cellsCohesive->size();
-
- const int spaceDim = _quadrature->spaceDim();
- const int orientationSize = spaceDim * spaceDim;
-
- const int numConstraintVert = _quadrature->numBasis();
- const int numCorners = 3 * numConstraintVert; // cohesive cell
- double_array matrixCell(numCorners * spaceDim * numCorners * spaceDim);
- double_array orientationCell(numConstraintVert * orientationSize);
-
- // Get section information
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<RealSection>& solutionSection = fields->solution().section();
- assert(!solutionSection.isNull());
- const ALE::Obj<RealSection>& orientationSection =
- _fields->get("orientation").section();
- assert(!orientationSection.isNull());
- topology::Mesh::RestrictVisitor orientationVisitor(*orientationSection,
- orientationCell.size(), &orientationCell[0]);
-
-#if 0 // DEBUGGING
- // Check that fault cells match cohesive cells
- ALE::ISieveVisitor::PointRetriever<sieve_type> cV(std::max(1, mesh->getSieve()->getMaxConeSize()));
- ALE::ISieveVisitor::PointRetriever<sieve_type> cV2(std::max(1, _faultMesh->getSieve()->getMaxConeSize()));
- Mesh::renumbering_type& fRenumbering = _faultMesh->getRenumbering();
- const int rank = mesh->commRank();
-
- for (Mesh::label_sequence::iterator c_iter = cellsCohesiveBegin;
- c_iter != cellsCohesiveEnd;
- ++c_iter) {
- mesh->getSieve()->cone(*c_iter, cV);
- const int coneSize = cV.getSize();
- const Mesh::point_type *cone = cV.getPoints();
- const int faceSize = coneSize / 3;
- const Mesh::point_type face = _cohesiveToFault[*c_iter];
- _faultMesh->getSieve()->cone(face, cV2);
- const int fConeSize = cV2.getSize();
- const Mesh::point_type *fCone = cV2.getPoints();
-
- assert(0 == coneSize % faceSize);
- assert(faceSize == fConeSize);
- // Use last vertices (contraints) for fault mesh
- for(int i = 2*faceSize, j = 0; i < 3*faceSize; ++i, ++j) {
- assert(fRenumbering[cone[i]] == fCone[j]);
- }
- cV.clear();
- cV2.clear();
- }
-#endif
-
- const PetscMat jacobianMatrix = jacobian->matrix();
- assert(0 != jacobianMatrix);
- const ALE::Obj<SieveMesh::order_type>& globalOrder =
- sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
- solutionSection);
- assert(!globalOrder.isNull());
- // We would need to request unique points here if we had an interpolated mesh
- topology::Mesh::IndicesVisitor jacobianVisitor(*solutionSection,
- *globalOrder, (int) pow(sieveMesh->getSieve()->getMaxConeSize(),
- sieveMesh->depth()) * spaceDim);
-
- for (SieveMesh::label_sequence::iterator c_iter = cellsCohesiveBegin; c_iter
- != cellsCohesiveEnd; ++c_iter) {
- const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-
- matrixCell = 0.0;
- // Get orientations at fault cell's vertices.
- orientationVisitor.clear();
- faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
-
- for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
- // Blocks in cell matrix associated with normal cohesive
- // vertices i and j and constraint vertex k
- const int indexI = iConstraint;
- const int indexJ = iConstraint + numConstraintVert;
- const int indexK = iConstraint + 2 * numConstraintVert;
-
- // Get orientation at constraint vertex
- const double* orientationVertex = &orientationCell[iConstraint
- * orientationSize];
- assert(0 != orientationVertex);
-
- // Entries associated with constraint forces applied at node i
- for (int iDim = 0; iDim < spaceDim; ++iDim)
- for (int kDim = 0; kDim < spaceDim; ++kDim) {
- const int row = indexI * spaceDim + iDim;
- const int col = indexK * spaceDim + kDim;
- matrixCell[row * numCorners * spaceDim + col]
- = -orientationVertex[kDim * spaceDim + iDim];
- matrixCell[col * numCorners * spaceDim + row]
- = -orientationVertex[kDim * spaceDim + iDim];
- } // for
-
- // Entries associated with constraint forces applied at node j
- for (int jDim = 0; jDim < spaceDim; ++jDim)
- for (int kDim = 0; kDim < spaceDim; ++kDim) {
- const int row = indexJ * spaceDim + jDim;
- const int col = indexK * spaceDim + kDim;
- matrixCell[row * numCorners * spaceDim + col]
- = orientationVertex[kDim * spaceDim + jDim];
- matrixCell[col * numCorners * spaceDim + row]
- = orientationVertex[kDim * spaceDim + jDim];
- } // for
- } // for
-
- // Insert cell contribution into PETSc Matrix
- jacobianVisitor.clear();
- PetscErrorCode err = updateOperator(jacobianMatrix, *sieveMesh->getSieve(),
- jacobianVisitor, *c_iter, &matrixCell[0], INSERT_VALUES);
- CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
- } // for
- PetscLogFlops(cellsCohesiveSize*numConstraintVert*spaceDim*spaceDim*4);
- _needNewJacobian = false;
-} // integrateJacobianAssembled
-
-// ----------------------------------------------------------------------
-// Update state variables as needed.
-void
-pylith::faults::FaultCohesiveDynL::updateStateVars(
- const double t,
- topology::SolutionFields* const fields)
-{ // updateStateVars
- assert(0 != fields);
- assert(0 != _fields);
-
-} // updateStateVars
-
-// ----------------------------------------------------------------------
-// Constrain solution based on friction.
-void
-pylith::faults::FaultCohesiveDynL::constrainSolnSpace(
- topology::SolutionFields* const fields,
- const double t,
- const topology::Jacobian& jacobian)
-{ // constrainSolnSpace
- assert(0 != fields);
- assert(0 != _quadrature);
- assert(0 != _fields);
- assert(0 != _friction);
-
- const int spaceDim = _quadrature->spaceDim();
-
- // Allocate arrays for vertex values
- double_array tractionTVertex(spaceDim);
- double_array tractionTpdtVertex(spaceDim);
- double_array slipTpdtVertex(spaceDim);
- double_array lagrangeTpdtVertex(spaceDim);
- double_array dLagrangeTpdtVertex(spaceDim);
-
- // Get domain mesh and fault mesh
- const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
- assert(!sieveMesh.isNull());
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
-
- // Get sections
- double_array slipVertex(spaceDim);
- const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
- assert(!slipSection.isNull());
-
- _updateSlipRate(*fields);
- double_array slipRateVertex(spaceDim);
- const ALE::Obj<RealSection>& slipRateSection =
- _fields->get("slip rate").section();
- assert(!slipRateSection.isNull());
-
- const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
- assert(!areaSection.isNull());
-
- double_array orientationVertex(spaceDim * spaceDim);
- const ALE::Obj<RealSection>& orientationSection =
- _fields->get("orientation").section();
- assert(!orientationSection.isNull());
-
- double_array tractionInitialVertex(spaceDim);
- const ALE::Obj<RealSection>& tractionInitialSection =
- (0 != _dbInitialTract) ? _fields->get("initial traction").section() : 0;
-
- double_array lagrangeTVertex(spaceDim);
- const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
- assert(!dispTSection.isNull());
-
- double_array lagrangeTIncrVertex(spaceDim);
- const ALE::Obj<RealSection>& dispTIncrSection = fields->get(
- "dispIncr(t->t+dt)").section();
- assert(!dispTIncrSection.isNull());
-
- double_array jacobianVertex(2 * spaceDim);
- const ALE::Obj<RealSection>& jacobianSection = _fields->get(
- "Jacobian diagonal").section();
- assert(!jacobianSection.isNull());
- _updateJacobianDiagonal(*fields);
-
- slipSection->view("SLIP");
- areaSection->view("AREA");
- if (0 != _dbInitialTract)
- tractionInitialSection->view("INITIAL TRACTION");
- dispTSection->view("DISP (t)");
- dispTIncrSection->view("DISP INCR (t->t+dt)");
-
- // Get mesh and fault vertices and renumbering
- const ALE::Obj<SieveMesh::label_sequence>& vertices =
- sieveMesh->depthStratum(0);
- assert(!vertices.isNull());
- const SieveSubMesh::label_sequence::iterator verticesBegin =
- vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
- SieveSubMesh::renumbering_type& renumbering =
- faultSieveMesh->getRenumbering();
- const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
- renumbering.end();
-
- for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd; ++v_iter)
- if (renumbering.find(*v_iter) != renumberingEnd) {
- const int vertexFault = renumbering[*v_iter];
- const int vertexMesh = *v_iter;
-
- // Get slip
- slipSection->restrictPoint(vertexFault, &slipVertex[0], slipVertex.size());
-
- // Get slip rate
- slipRateSection->restrictPoint(vertexFault, &slipRateVertex[0],
- slipRateVertex.size());
-
- // Get total fault area asssociated with vertex (assembled over all cells)
- const double* areaVertex = areaSection->restrictPoint(vertexFault);
- assert(0 != areaVertex);
- assert(1 == areaSection->getFiberDimension(vertexFault));
-
- // Get fault orientation
- orientationSection->restrictPoint(vertexFault, &orientationVertex[0],
- orientationVertex.size());
-
- // Get diagonal of Jacobian at conventional vertices i and j
- // associated with Lagrange vertex k
- jacobianSection->restrictPoint(vertexFault, &jacobianVertex[0],
- jacobianVertex.size());
-
- // Get initial fault tractions
- if (0 != _dbInitialTract) {
- assert(!tractionInitialSection.isNull());
- tractionInitialSection->restrictPoint(vertexFault,
- &tractionInitialVertex[0], tractionInitialVertex.size());
- } // if
-
- // Get Lagrange multiplier values from disp(t), and dispIncr(t->t+dt)
- dispTSection->restrictPoint(vertexMesh, &lagrangeTVertex[0],
- lagrangeTVertex.size());
- dispTIncrSection->restrictPoint(vertexMesh, &lagrangeTIncrVertex[0],
- lagrangeTIncrVertex.size());
-
- // Compute Lagrange multiplier at time t+dt
- lagrangeTpdtVertex = lagrangeTVertex + lagrangeTIncrVertex;
- dLagrangeTpdtVertex = 0.0;
-
- // :KLUDGE: Solution at Lagrange constraint vertices is the
- // Lagrange multiplier value, which is currently the force.
- // Compute traction by dividing force by area
- assert(*areaVertex > 0);
- tractionTVertex = lagrangeTVertex / (*areaVertex);
- tractionTpdtVertex = lagrangeTpdtVertex / (*areaVertex);
-
- // Get friction properties and state variables.
- _friction->retrievePropsAndVars(vertexFault);
-
- // Use fault constitutive model to compute traction associated with
- // friction.
- switch (spaceDim) { // switch
- case 1: { // case 1
- // Sensitivity of slip to changes in the Lagrange multipliers
- // Aixjx = 1.0/Aix + 1.0/Ajx
- const double Aixjx = 1.0 / jacobianVertex[0] + 1.0
- / jacobianVertex[spaceDim + 0];
- const double Spp = 1.0;
-
- if (tractionTpdtVertex[0] + tractionInitialVertex[0] < 0) {
- // if compression, then no changes to solution
- } else {
- // if tension, then traction is zero.
-
- // Update slip based on value required to stick versus
- // zero traction
- dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
- slipVertex[0] += Spp * dLagrangeTpdtVertex[0];
-
- // Set traction to zero.
- tractionTpdtVertex[0] = 0.0;
- } // else
- break;
- } // case 1
- case 2: { // case 2
- std::cout << "Normal traction:" << tractionTpdtVertex[1]
- + tractionInitialVertex[1] << std::endl;
-
- // Sensitivity of slip to changes in the Lagrange multipliers
- // Aixjx = 1.0/Aix + 1.0/Ajx
- assert(jacobianVertex[0] > 0.0);
- assert(jacobianVertex[spaceDim+0] > 0.0);
- const double Aixjx = 1.0 / jacobianVertex[0] + 1.0
- / jacobianVertex[spaceDim + 0];
- // Aiyjy = 1.0/Aiy + 1.0/Ajy
- assert(jacobianVertex[1] > 0.0);
- assert(jacobianVertex[spaceDim+1] > 0.0);
- const double Aiyjy = 1.0 / jacobianVertex[1] + 1.0
- / jacobianVertex[spaceDim + 1];
- const double Cpx = orientationVertex[0];
- const double Cpy = orientationVertex[1];
- const double Cqx = orientationVertex[2];
- const double Cqy = orientationVertex[3];
- const double Spp = Cpx * Cpx * Aixjx + Cpy * Cpy * Aiyjy;
- const double Spq = Cpx * Cqx * Aixjx + Cpy * Cqy * Aiyjy;
- const double Sqq = Cqx * Cqx * Aixjx + Cqy * Cqy * Aiyjy;
-
- const double tractionNormal = tractionTpdtVertex[1]
- + tractionInitialVertex[1];
- const double slip = slipVertex[0];
- const double slipRate = slipRateVertex[0];
-
- if (tractionTpdtVertex[1] + tractionInitialVertex[1] < 0 && 0
- == slipVertex[1]) {
- // if in compression and no opening
- std::cout << "FAULT IN COMPRESSION" << std::endl;
- const double frictionStress = _friction->calcFriction(slip, slipRate,
- tractionNormal);
- std::cout << "frictionStress: " << frictionStress << std::endl;
- if (tractionTpdtVertex[0] > frictionStress || (tractionTpdtVertex[0]
- < frictionStress && slipVertex[0] > 0.0)) {
- // traction is limited by friction, so have sliding
- std::cout << "LIMIT TRACTION, HAVE SLIDING" << std::endl;
-
- // Update slip based on value required to stick versus friction
- dLagrangeTpdtVertex[0] = (tractionTpdtVertex[0] - frictionStress)
- * (*areaVertex);
- slipVertex[0] += Spp * dLagrangeTpdtVertex[0];
- std::cout << "Estimated slip: " << slipVertex[0] << std::endl;
- // Limit traction
- tractionTpdtVertex[0] = frictionStress;
- } else {
- // else friction exceeds value necessary, so stick
- std::cout << "STICK" << std::endl;
- // no changes to solution
- } // if/else
- } else {
- // if in tension, then traction is zero.
- std::cout << "FAULT IN TENSION" << std::endl;
-
- // Update slip based on value required to stick versus
- // zero traction
- dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
- dLagrangeTpdtVertex[1] = tractionTpdtVertex[1] * (*areaVertex);
- slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
- * dLagrangeTpdtVertex[1];
- slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
- * dLagrangeTpdtVertex[1];
-
- // Set traction to zero
- tractionTpdtVertex = 0.0;
- } // else
- break;
- } // case 2
- case 3: { // case 3
- std::cout << "Normal traction:" << tractionTpdtVertex[2]
- + tractionInitialVertex[2] << std::endl;
-
- // Sensitivity of slip to changes in the Lagrange multipliers
- // Aixjx = 1.0/Aix + 1.0/Ajx
- assert(jacobianVertex[0] > 0.0);
- assert(jacobianVertex[spaceDim+0] > 0.0);
- const double Aixjx = 1.0 / jacobianVertex[0] + 1.0
- / jacobianVertex[spaceDim + 0];
- // Aiyjy = 1.0/Aiy + 1.0/Ajy
- assert(jacobianVertex[1] > 0.0);
- assert(jacobianVertex[spaceDim+1] > 0.0);
- const double Aiyjy = 1.0 / jacobianVertex[1] + 1.0
- / jacobianVertex[spaceDim + 1];
- // Aizjz = 1.0/Aiz + 1.0/Ajz
- assert(jacobianVertex[2] > 0.0);
- assert(jacobianVertex[spaceDim+2] > 0.0);
- const double Aizjz = 1.0 / jacobianVertex[2] + 1.0
- / jacobianVertex[spaceDim + 2];
- const double Cpx = orientationVertex[0];
- const double Cpy = orientationVertex[1];
- const double Cpz = orientationVertex[2];
- const double Cqx = orientationVertex[3];
- const double Cqy = orientationVertex[4];
- const double Cqz = orientationVertex[5];
- const double Crx = orientationVertex[6];
- const double Cry = orientationVertex[7];
- const double Crz = orientationVertex[8];
- const double Spp = Cpx * Cpx * Aixjx + Cpy * Cpy * Aiyjy + Cpz * Cpz
- * Aizjz;
- const double Spq = Cpx * Cqx * Aixjx + Cpy * Cqy * Aiyjy + Cpz * Cqz
- * Aizjz;
- const double Spr = Cpx * Crx * Aixjx + Cpy * Cry * Aiyjy + Cpz * Crz
- * Aizjz;
- const double Sqq = Cqx * Cqx * Aixjx + Cqy * Cqy * Aiyjy + Cqz * Cqz
- * Aizjz;
- const double Sqr = Cqx * Crx * Aixjx + Cqy * Cry * Aiyjy + Cqz * Crz
- * Aizjz;
- const double Srr = Crx * Crx * Aixjx + Cry * Cry * Aiyjy + Crz * Crz
- * Aizjz;
-
- double slip = sqrt(pow(slipVertex[1], 2) + pow(slipVertex[0], 2));
- double slipRate = sqrt(pow(slipRateVertex[1], 2) + pow(
- slipRateVertex[0], 2));
-
- double tractionNormalVertex;
- double tractionShearVertex;
- double slipShearVertex;
-
- tractionNormalVertex = tractionTpdtVertex[2] + tractionInitialVertex[2];
- tractionShearVertex = sqrt(pow(tractionTpdtVertex[1], 2) + pow(
- tractionTpdtVertex[0], 2));
- slipShearVertex = sqrt(pow(slipVertex[1], 2) + pow(slipVertex[0], 2));
-
- if (tractionNormalVertex < 0 && 0 == slipVertex[2]) {
- // if in compression and no opening
- std::cout << "FAULT IN COMPRESSION" << std::endl;
- const double frictionStress = _friction->calcFriction(slip, slipRate,
- tractionNormalVertex);
- std::cout << "frictionStress: " << frictionStress << std::endl;
- if (tractionShearVertex > frictionStress || (tractionShearVertex
- < frictionStress && slipShearVertex > 0.0)) {
- // traction is limited by friction, so have sliding
- std::cout << "LIMIT TRACTION, HAVE SLIDING" << std::endl;
-
- // Update slip based on value required to stick versus friction
- dLagrangeTpdtVertex[0] = (tractionShearVertex - frictionStress)
- * tractionTpdtVertex[0] / tractionShearVertex * (*areaVertex);
- dLagrangeTpdtVertex[1] = (tractionShearVertex - frictionStress)
- * tractionTpdtVertex[1] / tractionShearVertex * (*areaVertex);
- slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
- * dLagrangeTpdtVertex[1];
-
- slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
- * dLagrangeTpdtVertex[1];
-
- std::cout << "Estimated slip: " << " " << slipVertex[0] << " "
- << slipVertex[1] << " " << slipVertex[2] << std::endl;
-
- // Limit traction
- tractionTpdtVertex[0] = frictionStress * tractionTpdtVertex[0]
- / tractionShearVertex;
- tractionTpdtVertex[1] = frictionStress * tractionTpdtVertex[1]
- / tractionShearVertex;
- } else {
- // else friction exceeds value necessary, so stick
- std::cout << "STICK" << std::endl;
- // no changes to solution
- } // if/else
- } else {
- // if in tension, then traction is zero.
- std::cout << "FAULT IN TENSION" << std::endl;
-
- // Update slip based on value required to stick versus
- // zero traction
- dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
- dLagrangeTpdtVertex[1] = tractionTpdtVertex[1] * (*areaVertex);
- dLagrangeTpdtVertex[2] = tractionTpdtVertex[2] * (*areaVertex);
- slipVertex[0] += Spp * dLagrangeTpdtVertex[0] + Spq
- * dLagrangeTpdtVertex[1] + Spr * dLagrangeTpdtVertex[2];
- slipVertex[1] += Spq * dLagrangeTpdtVertex[0] + Sqq
- * dLagrangeTpdtVertex[1] + Sqr * dLagrangeTpdtVertex[2];
- slipVertex[2] += Spr * dLagrangeTpdtVertex[0] + Sqr
- * dLagrangeTpdtVertex[1] + Srr * dLagrangeTpdtVertex[2];
-
- std::cout << "Estimated slip: " << " " << slipVertex[0] << " "
- << slipVertex[1] << " " << slipVertex[2] << std::endl;
-
- // Set traction to zero
- tractionTpdtVertex = 0.0;
- } // else
- break;
- } // case 3
- default:
- assert(0);
- } // switch
- // TEMPORARY END
-
- // Update Lagrange multiplier values.
- // :KLUDGE: (TEMPORARY) Solution at Lagrange constraint vertices
- // is the Lagrange multiplier value, which is currently the
- // force. Compute force by multipling traction by area
- lagrangeTIncrVertex = (tractionTpdtVertex - tractionTVertex)
- * (*areaVertex);
- assert(lagrangeTIncrVertex.size() ==
- dispTIncrSection->getFiberDimension(vertexMesh));
- dispTIncrSection->updatePoint(vertexMesh, &lagrangeTIncrVertex[0]);
-
- // Update the slip estimate based on adjustment to the Lagrange
- // multiplier values.
- assert(slipVertex.size() ==
- slipSection->getFiberDimension(vertexFault));
- slipSection->updatePoint(vertexFault, &slipVertex[0]);
- } // if
-
- dispTIncrSection->view("AFTER DISP INCR (t->t+dt)");
- slipSection->view("AFTER SLIP");
-
- // FIX THIS
- PetscLogFlops(0);
-} // constrainSolnSpace
-
-// ----------------------------------------------------------------------
-// Verify configuration is acceptable.
-void
-pylith::faults::FaultCohesiveDynL::verifyConfiguration(const topology::Mesh& mesh) const
-{ // verifyConfiguration
- assert(0 != _quadrature);
-
- const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
- assert(!sieveMesh.isNull());
-
- if (!sieveMesh->hasIntSection(label())) {
- std::ostringstream msg;
- msg << "Mesh missing group of vertices '" << label()
- << " for boundary condition.";
- throw std::runtime_error(msg.str());
- } // if
-
- // check compatibility of mesh and quadrature scheme
- const int dimension = mesh.dimension() - 1;
- if (_quadrature->cellDim() != dimension) {
- std::ostringstream msg;
- msg << "Dimension of reference cell in quadrature scheme ("
- << _quadrature->cellDim()
- << ") does not match dimension of cells in mesh (" << dimension
- << ") for fault '" << label() << "'.";
- throw std::runtime_error(msg.str());
- } // if
-
- const int numCorners = _quadrature->refGeometry().numCorners();
- const ALE::Obj<SieveMesh::label_sequence>& cells =
- sieveMesh->getLabelStratum("material-id", id());
- assert(!cells.isNull());
- const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
- const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
- for (SieveMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
- != cellsEnd; ++c_iter) {
- const int cellNumCorners = sieveMesh->getNumCellCorners(*c_iter);
- if (3 * numCorners != cellNumCorners) {
- std::ostringstream msg;
- msg << "Number of vertices in reference cell (" << numCorners
- << ") is not compatible with number of vertices (" << cellNumCorners
- << ") in cohesive cell " << *c_iter << " for fault '" << label()
- << "'.";
- throw std::runtime_error(msg.str());
- } // if
- } // for
-} // verifyConfiguration
-
-// ----------------------------------------------------------------------
-// Get vertex field associated with integrator.
-const pylith::topology::Field<pylith::topology::SubMesh>&
-pylith::faults::FaultCohesiveDynL::vertexField(const char* name,
- const topology::SolutionFields* fields)
-{ // vertexField
- assert(0 != _faultMesh);
- assert(0 != _quadrature);
- assert(0 != _normalizer);
- assert(0 != _fields);
- assert(0 != _friction);
-
- const int cohesiveDim = _faultMesh->dimension();
- const int spaceDim = _quadrature->spaceDim();
-
- const int slipStrLen = strlen("final_slip");
- const int timeStrLen = strlen("slip_time");
-
- double scale = 0.0;
- int fiberDim = 0;
- if (0 == strcasecmp("slip", name)) {
- const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- return slip;
-
- } else if (cohesiveDim > 0 && 0 == strcasecmp("strike_dir", name)) {
- const ALE::Obj<RealSection>& orientationSection = _fields->get(
- "orientation").section();
- assert(!orientationSection.isNull());
- const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
- 0);
- assert(!dirSection.isNull());
- _allocateBufferVertexVectorField();
- topology::Field<topology::SubMesh>& buffer =
- _fields->get("buffer (vector)");
- buffer.copy(dirSection);
- buffer.label("strike_dir");
- buffer.scale(1.0);
- return buffer;
-
- } else if (2 == cohesiveDim && 0 == strcasecmp("dip_dir", name)) {
- const ALE::Obj<RealSection>& orientationSection = _fields->get(
- "orientation").section();
- assert(!orientationSection.isNull());
- const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
- 1);
- _allocateBufferVertexVectorField();
- topology::Field<topology::SubMesh>& buffer =
- _fields->get("buffer (vector)");
- buffer.copy(dirSection);
- buffer.label("dip_dir");
- buffer.scale(1.0);
- return buffer;
-
- } else if (0 == strcasecmp("normal_dir", name)) {
- const ALE::Obj<RealSection>& orientationSection = _fields->get(
- "orientation").section();
- assert(!orientationSection.isNull());
- const int space = (0 == cohesiveDim) ? 0 : (1 == cohesiveDim) ? 1 : 2;
- const ALE::Obj<RealSection>& dirSection = orientationSection->getFibration(
- space);
- assert(!dirSection.isNull());
- _allocateBufferVertexVectorField();
- topology::Field<topology::SubMesh>& buffer =
- _fields->get("buffer (vector)");
- buffer.copy(dirSection);
- buffer.label("normal_dir");
- buffer.scale(1.0);
- return buffer;
-
- } else if (0 == strncasecmp("initial_traction", name, slipStrLen)) {
- assert(0 != _dbInitialTract);
- const topology::Field<topology::SubMesh>& initialTraction = _fields->get(
- "initial traction");
- return initialTraction;
-
- } else if (0 == strcasecmp("traction", name)) {
- assert(0 != fields);
- const topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
- _allocateBufferVertexVectorField();
- topology::Field<topology::SubMesh>& buffer =
- _fields->get("buffer (vector)");
- _calcTractions(&buffer, dispT);
- return buffer;
-
- } else {
- std::ostringstream msg;
- msg << "Request for unknown vertex field '" << name << "' for fault '"
- << label() << "'.";
- throw std::runtime_error(msg.str());
- } // else
-
-
- // Satisfy return values
- assert(0 != _fields);
- const topology::Field<topology::SubMesh>& buffer = _fields->get(
- "buffer (vector)");
- return buffer;
-} // vertexField
-
-// ----------------------------------------------------------------------
-// Get cell field associated with integrator.
-const pylith::topology::Field<pylith::topology::SubMesh>&
-pylith::faults::FaultCohesiveDynL::cellField(const char* name,
- const topology::SolutionFields* fields) { // cellField
- // Should not reach this point if requested field was found
- std::ostringstream msg;
- msg << "Request for unknown cell field '" << name << "' for fault '"
- << label() << ".";
- throw std::runtime_error(msg.str());
-
- // Satisfy return values
- assert(0 != _fields);
- const topology::Field<topology::SubMesh>& buffer = _fields->get(
- "buffer (vector)");
- return buffer;
-} // cellField
-
-// ----------------------------------------------------------------------
-// Calculate orientation at fault vertices.
-void
-pylith::faults::FaultCohesiveDynL::_calcOrientation(const double upDir[3],
- const double normalDir[3])
-{ // _calcOrientation
- assert(0 != upDir);
- assert(0 != normalDir);
- assert(0 != _faultMesh);
- assert(0 != _fields);
-
- double_array upDirArray(upDir, 3);
-
- // Get vertices in fault mesh.
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- const SieveSubMesh::label_sequence::iterator verticesBegin =
- vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Containers for orientation information.
- const int cohesiveDim = _faultMesh->dimension();
- const int numBasis = _quadrature->numBasis();
- const int spaceDim = _quadrature->spaceDim();
- const int orientationSize = spaceDim * spaceDim;
- const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
- const double_array& verticesRef = cellGeometry.vertices();
- const int jacobianSize = (cohesiveDim > 0) ? spaceDim * cohesiveDim : 1;
- const double_array& quadWts = _quadrature->quadWts();
- double_array jacobian(jacobianSize);
- double jacobianDet = 0;
- double_array orientationVertex(orientationSize);
- double_array coordinatesCell(numBasis * spaceDim);
- double_array refCoordsVertex(cohesiveDim);
-
- // Allocate orientation field.
- _fields->add("orientation", "orientation");
- topology::Field<topology::SubMesh>& orientation = _fields->get("orientation");
- const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- orientation.newSection(slip, orientationSize);
- const ALE::Obj<RealSection>& orientationSection = orientation.section();
- assert(!orientationSection.isNull());
- // Create subspaces for along-strike, up-dip, and normal directions
- for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
- orientationSection->addSpace();
- for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
- orientationSection->setFiberDimension(vertices, spaceDim, iDim);
- orientation.allocate();
- orientation.zero();
-
- // Get fault cells.
- const ALE::Obj<SieveSubMesh::label_sequence>& cells =
- faultSieveMesh->heightStratum(0);
- assert(!cells.isNull());
- const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
- const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
-
- // Compute orientation of fault at constraint vertices
-
- // Get section containing coordinates of vertices
- const ALE::Obj<RealSection>& coordinatesSection =
- faultSieveMesh->getRealSection("coordinates");
- assert(!coordinatesSection.isNull());
- topology::Mesh::RestrictVisitor coordinatesVisitor(*coordinatesSection,
- coordinatesCell.size(), &coordinatesCell[0]);
-
- // Set orientation function
- assert(cohesiveDim == _quadrature->cellDim());
- assert(spaceDim == _quadrature->spaceDim());
-
- // Loop over cohesive cells, computing orientation weighted by
- // jacobian at constraint vertices
-
- const ALE::Obj<SieveSubMesh::sieve_type>& sieve = faultSieveMesh->getSieve();
- assert(!sieve.isNull());
- typedef ALE::SieveAlg<SieveSubMesh> SieveAlg;
-
- ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type>
- ncV(*sieve, (size_t) pow(sieve->getMaxConeSize(), std::max(0,
- faultSieveMesh->depth())));
-
- for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
- != cellsEnd; ++c_iter) {
- // Get orientations at fault cell's vertices.
- coordinatesVisitor.clear();
- faultSieveMesh->restrictClosure(*c_iter, coordinatesVisitor);
-
- ncV.clear();
- ALE::ISieveTraversal<SieveSubMesh::sieve_type>::orientedClosure(*sieve,
- *c_iter, ncV);
- const int coneSize = ncV.getSize();
- const Mesh::point_type *cone = ncV.getPoints();
-
- for (int v = 0; v < coneSize; ++v) {
- // Compute Jacobian and determinant of Jacobian at vertex
- memcpy(&refCoordsVertex[0], &verticesRef[v * cohesiveDim], cohesiveDim
- * sizeof(double));
- cellGeometry.jacobian(&jacobian, &jacobianDet, coordinatesCell,
- refCoordsVertex);
-
- // Compute orientation
- cellGeometry.orientation(&orientationVertex, jacobian, jacobianDet,
- upDirArray);
-
- // Update orientation
- orientationSection->updateAddPoint(cone[v], &orientationVertex[0]);
- } // for
- } // for
-
- //orientation.view("ORIENTATION BEFORE COMPLETE");
-
- // Assemble orientation information
- orientation.complete();
-
- // Loop over vertices, make orientation information unit magnitude
- double_array vertexDir(orientationSize);
- int count = 0;
- for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd; ++v_iter, ++count) {
- orientationVertex = 0.0;
- orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
- orientationVertex.size());
- for (int iDim = 0; iDim < spaceDim; ++iDim) {
- double mag = 0;
- for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
- mag += pow(orientationVertex[index + jDim], 2);
- mag = sqrt(mag);
- assert(mag > 0.0);
- for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
- orientationVertex[index + jDim] /= mag;
- } // for
-
- orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
- } // for
- PetscLogFlops(count * orientationSize * 4);
-
- if (2 == cohesiveDim && vertices->size() > 0) {
- // Check orientation of first vertex, if dot product of fault
- // normal with preferred normal is negative, flip up/down dip
- // direction.
- //
- // If the user gives the correct normal direction (points from
- // footwall to ahanging wall), we should end up with
- // left-lateral-slip, reverse-slip, and fault-opening for positive
- // slip values.
- //
- // When we flip the up/down dip direction, we create a left-handed
- // strike/dip/normal coordinate system, but it gives the correct
- // sense of slip. In reality the strike/dip/normal directions that
- // are used are the opposite of what we would want, but we cannot
- // flip the fault normal direction because it is tied to how the
- // cohesive cells are created.
-
- assert(vertices->size() > 0);
- orientationSection->restrictPoint(*vertices->begin(),
- &orientationVertex[0], orientationVertex.size());
-
- assert(3 == spaceDim);
- double_array normalDirVertex(&orientationVertex[6], 3);
- const double normalDot = normalDir[0] * normalDirVertex[0] + normalDir[1]
- * normalDirVertex[1] + normalDir[2] * normalDirVertex[2];
-
- const int istrike = 0;
- const int idip = 3;
- const int inormal = 6;
- if (normalDot < 0.0) {
- // Flip dip direction
- for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd; ++v_iter) {
- orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
- orientationVertex.size());
- assert(9 == orientationSection->getFiberDimension(*v_iter));
- for (int iDim = 0; iDim < 3; ++iDim) // flip dip
- orientationVertex[idip + iDim] *= -1.0;
-
- // Update direction
- orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
- } // for
- PetscLogFlops(5 + count * 3);
- } // if
- } // if
-
- //orientation.view("ORIENTATION");
-} // _calcOrientation
-
-// ----------------------------------------------------------------------
-void pylith::faults::FaultCohesiveDynL::_calcArea(void) { // _calcArea
- assert(0 != _faultMesh);
- assert(0 != _fields);
-
- // Containers for area information
- const int cellDim = _quadrature->cellDim();
- const int numBasis = _quadrature->numBasis();
- const int numQuadPts = _quadrature->numQuadPts();
- const int spaceDim = _quadrature->spaceDim();
- const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
- const double_array& quadWts = _quadrature->quadWts();
- assert(quadWts.size() == numQuadPts);
- double jacobianDet = 0;
- double_array areaCell(numBasis);
-
- // Get vertices in fault mesh.
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- const SieveSubMesh::label_sequence::iterator verticesBegin =
- vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Allocate area field.
- _fields->add("area", "area");
-
- topology::Field<topology::SubMesh>& area = _fields->get("area");
- const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- area.newSection(slip, 1);
- area.allocate();
- area.zero();
- const ALE::Obj<RealSection>& areaSection = area.section();
- assert(!areaSection.isNull());
- topology::Mesh::UpdateAddVisitor areaVisitor(*areaSection, &areaCell[0]);
-
- double_array coordinatesCell(numBasis * spaceDim);
- const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
- "coordinates");
- assert(!coordinates.isNull());
- topology::Mesh::RestrictVisitor coordsVisitor(*coordinates,
- coordinatesCell.size(), &coordinatesCell[0]);
-
- const ALE::Obj<SieveSubMesh::label_sequence>& cells =
- faultSieveMesh->heightStratum(0);
- assert(!cells.isNull());
- const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
- const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
-
- // Loop over cells in fault mesh, compute area
- for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
- != cellsEnd; ++c_iter) {
- areaCell = 0.0;
-
- // Compute geometry information for current cell
-#if defined(PRECOMPUTE_GEOMETRY)
- _quadrature->retrieveGeometry(*c_iter);
-#else
- coordsVisitor.clear();
- faultSieveMesh->restrictClosure(*c_iter, coordsVisitor);
- _quadrature->computeGeometry(coordinatesCell, *c_iter);
-#endif
-
- // Get cell geometry information that depends on cell
- const double_array& basis = _quadrature->basis();
- const double_array& jacobianDet = _quadrature->jacobianDet();
-
- // Compute area
- for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
- const double wt = quadWts[iQuad] * jacobianDet[iQuad];
- for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
- const double dArea = wt * basis[iQuad * numBasis + iBasis];
- areaCell[iBasis] += dArea;
- } // for
- } // for
- areaVisitor.clear();
- faultSieveMesh->updateClosure(*c_iter, areaVisitor);
-
- PetscLogFlops( numQuadPts*(1+numBasis*2) );
- } // for
-
- // Assemble area information
- area.complete();
-
-#if 0 // DEBUGGING
- area.view("AREA");
- //_faultMesh->getSendOverlap()->view("Send fault overlap");
- //_faultMesh->getRecvOverlap()->view("Receive fault overlap");
-#endif
-} // _calcArea
-
-// ----------------------------------------------------------------------
-// Compute change in tractions on fault surface using solution.
-// NOTE: We must convert vertex labels to fault vertex labels
-void
-pylith::faults::FaultCohesiveDynL::_calcTractions(topology::Field<
- topology::SubMesh>* tractions, const topology::Field<topology::Mesh>& dispT)
-{ // _calcTractionsChange
- assert(0 != tractions);
- assert(0 != _faultMesh);
- assert(0 != _fields);
- assert(0 != _normalizer);
-
- // Get vertices from mesh of domain.
- const ALE::Obj<SieveMesh>& sieveMesh = dispT.mesh().sieveMesh();
- assert(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& vertices =
- sieveMesh->depthStratum(0);
- assert(!vertices.isNull());
- const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
- const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Get fault vertices
- const ALE::Obj<SieveMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<SieveSubMesh::label_sequence>& fvertices =
- faultSieveMesh->depthStratum(0);
- const SieveSubMesh::label_sequence::iterator fverticesBegin =
- fvertices->begin();
- const SieveSubMesh::label_sequence::iterator fverticesEnd = fvertices->end();
-
- // Get sections.
- const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
- assert(!areaSection.isNull());
- const ALE::Obj<RealSection>& dispTSection = dispT.section();
- assert(!dispTSection.isNull());
-
- // Fiber dimension of tractions matches spatial dimension.
- const int fiberDim = _quadrature->spaceDim();
- double_array tractionsVertex(fiberDim);
-
- // Allocate buffer for tractions field (if nec.).
- const ALE::Obj<RealSection>& tractionsSection = tractions->section();
- if (tractionsSection.isNull()) {
- ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
- //logger.stagePush("Fault");
-
- const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- tractions->newSection(slip, fiberDim);
- tractions->allocate();
-
- //logger.stagePop();
- } // if
- assert(!tractionsSection.isNull());
- const double pressureScale = _normalizer->pressureScale();
- tractions->label("traction");
- tractions->scale(pressureScale);
- tractions->zero();
-
- // Set tractions to initial tractions if they exist
- if (0 != _dbInitialTract) {
- const ALE::Obj<RealSection>& initialTractionSection = _fields->get(
- "initial traction").section();
- assert(!initialTractionSection.isNull());
- for (SubMesh::label_sequence::iterator v_iter = fverticesBegin; v_iter
- != fverticesEnd; ++v_iter) {
- initialTractionSection->restrictPoint(*v_iter, &tractionsVertex[0],
- tractionsVertex.size());
- assert(fiberDim == tractionsSection->getFiberDimension(*v_iter));
- tractionsSection->updatePoint(*v_iter, &tractionsVertex[0]);
- } // for
- } // if
-
- const int numFaultVertices = fvertices->size();
- Mesh::renumbering_type& renumbering = faultSieveMesh->getRenumbering();
- const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
- renumbering.end();
-
-#if 0 // DEBUGGING, MOVE TO SEPARATE CHECK METHOD
- // Check fault mesh and volume mesh coordinates
- const ALE::Obj<RealSection>& coordinates = mesh->getRealSection("coordinates");
- const ALE::Obj<RealSection>& fCoordinates = _faultMesh->getRealSection("coordinates");
-
- for (Mesh::label_sequence::iterator v_iter = verticesBegin;
- v_iter != verticesEnd;
- ++v_iter) {
- if (renumbering.find(*v_iter) != renumberingEnd) {
- const int v = *v_iter;
- const int dim = coordinates->getFiberDimension(*v_iter);
- const double *a = coordinates->restrictPoint(*v_iter);
- const int fv = renumbering[*v_iter];
- const int fDim = fCoordinates->getFiberDimension(fv);
- const double *fa = fCoordinates->restrictPoint(fv);
-
- if (dim != fDim) throw ALE::Exception("Coordinate fiber dimensions do not match");
- for(int d = 0; d < dim; ++d) {
- if (a[d] != fa[d]) throw ALE::Exception("Coordinate values do not match");
- }
- }
- }
-#endif
-
- for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd; ++v_iter)
- if (renumbering.find(*v_iter) != renumberingEnd) {
- const int vertexMesh = *v_iter;
- const int vertexFault = renumbering[*v_iter];
- assert(fiberDim == dispTSection->getFiberDimension(vertexMesh));
- assert(fiberDim == tractionsSection->getFiberDimension(vertexFault));
- assert(1 == areaSection->getFiberDimension(vertexFault));
-
- const double* dispTVertex = dispTSection->restrictPoint(vertexMesh);
- assert(0 != dispTVertex);
- const double* areaVertex = areaSection->restrictPoint(vertexFault);
- assert(0 != areaVertex);
-
- for (int i = 0; i < fiberDim; ++i)
- tractionsVertex[i] = dispTVertex[i] / areaVertex[0];
-
- tractionsSection->updatePointAllAdd(vertexFault, &tractionsVertex[0]);
- } // if
-
- PetscLogFlops(numFaultVertices * (1 + fiberDim) );
-
-#if 0 // DEBUGGING
- tractions->view("TRACTIONS");
-#endif
-} // _calcTractions
-
-// ----------------------------------------------------------------------
-void
-pylith::faults::FaultCohesiveDynL::_getInitialTractions(void)
-{ // _getInitialTractions
- assert(0 != _normalizer);
- assert(0 != _quadrature);
-
- const double pressureScale = _normalizer->pressureScale();
- const double lengthScale = _normalizer->lengthScale();
-
- const int spaceDim = _quadrature->spaceDim();
- const int numQuadPts = _quadrature->numQuadPts();
-
- if (0 != _dbInitialTract) { // Setup initial values, if provided.
- // Create section to hold initial tractions.
- _fields->add("initial traction", "initial_traction");
- topology::Field<topology::SubMesh>& traction = _fields->get(
- "initial traction");
- topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- traction.cloneSection(slip);
- traction.scale(pressureScale);
- const ALE::Obj<RealSection>& tractionSection = traction.section();
- assert(!tractionSection.isNull());
-
- _dbInitialTract->open();
- switch (spaceDim) { // switch
- case 1: {
- const char* valueNames[] = { "traction-normal" };
- _dbInitialTract->queryVals(valueNames, 1);
- break;
- } // case 1
- case 2: {
- const char* valueNames[] = { "traction-shear", "traction-normal" };
- _dbInitialTract->queryVals(valueNames, 2);
- break;
- } // case 2
- case 3: {
- const char* valueNames[] = { "traction-shear-leftlateral",
- "traction-shear-updip", "traction-normal" };
- _dbInitialTract->queryVals(valueNames, 3);
- break;
- } // case 3
- default:
- std::cerr << "Bad spatial dimension '" << spaceDim << "'." << std::endl;
- assert(0);
- throw std::logic_error("Bad spatial dimension in Neumann.");
- } // switch
-
- // Get 'fault' vertices.
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- assert(!vertices.isNull());
- const SieveSubMesh::label_sequence::iterator verticesBegin =
- vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- const int numBasis = _quadrature->numBasis();
- const int spaceDim = _quadrature->spaceDim();
-
- // Containers for database query results and quadrature coordinates in
- // reference geometry.
- double_array tractionVertex(spaceDim);
- double_array coordsVertex(spaceDim);
-
- // Get sections.
- const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
- "coordinates");
- assert(!coordinates.isNull());
- const spatialdata::geocoords::CoordSys* cs = _faultMesh->coordsys();
-
- const double lengthScale = _normalizer->lengthScale();
-
- // Loop over vertices in fault mesh and perform queries.
- for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd; ++v_iter) {
- coordinates->restrictPoint(*v_iter, &coordsVertex[0], coordsVertex.size());
- // Dimensionalize coordinates
- _normalizer->dimensionalize(&coordsVertex[0], coordsVertex.size(),
- lengthScale);
-
- tractionVertex = 0.0;
- const int err = _dbInitialTract->query(&tractionVertex[0], spaceDim,
- &coordsVertex[0], spaceDim, cs);
- if (err) {
- std::ostringstream msg;
- msg << "Could not find initial tractions at (";
- for (int i = 0; i < spaceDim; ++i)
- msg << " " << coordsVertex[i];
- msg << ") for dynamic fault interface " << label() << "\n"
- << "using spatial database " << _dbInitialTract->label() << ".";
- throw std::runtime_error(msg.str());
- } // if
-
- _normalizer->nondimensionalize(&tractionVertex[0], tractionVertex.size(),
- pressureScale);
-
- // Update section
- assert(tractionVertex.size() == tractionSection->getFiberDimension(*v_iter));
- tractionSection->updatePoint(*v_iter, &tractionVertex[0]);
- } // for
-
- _dbInitialTract->close();
-
- //traction.view("INITIAL TRACTIONS"); // DEBUGGING
- } // if
-} // _getInitialTractions
-
-// ----------------------------------------------------------------------
-// Update diagonal of Jacobian at conventional vertices i and j
-// associated with Lagrange vertex k.
-void
-pylith::faults::FaultCohesiveDynL::_updateJacobianDiagonal(const topology::SolutionFields& fields)
-{ // _updateJacobianDiagonal
- assert(0 != _fields);
-
- // Get cohesive cells
- const ALE::Obj<SieveMesh>& sieveMesh = fields.mesh().sieveMesh();
- assert(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
- sieveMesh->getLabelStratum("material-id", id());
- assert(!cellsCohesive.isNull());
- const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
- cellsCohesive->begin();
- const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
- cellsCohesive->end();
- const int cellsCohesiveSize = cellsCohesive->size();
-
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
-
- const int spaceDim = _quadrature->spaceDim();
- const int numConstraintVert = _quadrature->numBasis();
- const int numCorners = 3 * numConstraintVert; // cohesive cell
-
- // Get section information
- double_array jacobianDiagCell(numCorners * spaceDim);
- const ALE::Obj<RealSection>& jacobianDiagSection = fields.get(
- "Jacobian diagonal").section();
- assert(!jacobianDiagSection.isNull());
- topology::Mesh::RestrictVisitor jacobianDiagVisitor(*jacobianDiagSection,
- jacobianDiagCell.size(), &jacobianDiagCell[0]);
-
- double_array jacobianDiagFaultCell(numConstraintVert * 2 * spaceDim);
- const ALE::Obj<RealSection>& jacobianDiagFaultSection = _fields->get(
- "Jacobian diagonal").section();
- topology::Mesh::UpdateAllVisitor jacobianDiagFaultVisitor(
- *jacobianDiagFaultSection, &jacobianDiagFaultCell[0]);
-
- for (SieveMesh::label_sequence::iterator c_iter = cellsCohesiveBegin; c_iter
- != cellsCohesiveEnd; ++c_iter) {
- const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-
- jacobianDiagVisitor.clear();
- sieveMesh->restrictClosure(*c_iter, jacobianDiagVisitor);
-
- for (int iConstraint = 0, indexF = 0; iConstraint < numConstraintVert; ++iConstraint) {
- // Blocks in cell matrix associated with normal cohesive
- // vertices i and j and constraint vertex k
- const int indexI = iConstraint;
- const int indexJ = iConstraint + numConstraintVert;
- const int indexK = iConstraint + 2 * numConstraintVert;
-
- // Diagonal for vertex i
- for (int iDim = 0; iDim < spaceDim; ++iDim) {
- jacobianDiagFaultCell[indexF + iDim] = jacobianDiagCell[indexI
- * spaceDim + iDim];
- assert(jacobianDiagFaultCell[indexF+iDim] > 0.0);
- } // for
- indexF += spaceDim;
-
- // Diagonal for vertex j
- for (int iDim = 0; iDim < spaceDim; ++iDim) {
- jacobianDiagFaultCell[indexF + iDim] = jacobianDiagCell[indexJ
- * spaceDim + iDim];
- assert(jacobianDiagFaultCell[indexF+iDim] > 0.0);
- } // for
- indexF += spaceDim;
- } // for
-
- // Insert cell contribution into
- jacobianDiagFaultVisitor.clear();
- faultSieveMesh->updateClosure(c_fault, jacobianDiagFaultVisitor);
- } // for
-} // _updateJacobianDiagonal
-
-// ----------------------------------------------------------------------
-// Update slip rate associated with Lagrange vertex k corresponding
-// to diffential velocity between conventional vertices i and j.
-void
-pylith::faults::FaultCohesiveDynL::_updateSlipRate(const topology::SolutionFields& fields)
-{ // _updateSlipRate
- assert(0 != _fields);
-
- // Get cohesive cells
- const ALE::Obj<SieveMesh>& sieveMesh = fields.mesh().sieveMesh();
- assert(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
- sieveMesh->getLabelStratum("material-id", id());
- assert(!cellsCohesive.isNull());
- const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
- cellsCohesive->begin();
- const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
- cellsCohesive->end();
- const int cellsCohesiveSize = cellsCohesive->size();
-
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
-
- const int spaceDim = _quadrature->spaceDim();
- const int numConstraintVert = _quadrature->numBasis();
- const int numCorners = 3 * numConstraintVert; // cohesive cell
- const int orientationSize = spaceDim * spaceDim;
-
- // Get section information
- double_array velocityCell(numCorners * spaceDim);
- const ALE::Obj<RealSection>& velocitySection =
- fields.get("velocity(t)").section();
- assert(!velocitySection.isNull());
- topology::Mesh::RestrictVisitor velocityVisitor(*velocitySection,
- velocityCell.size(), &velocityCell[0]);
-
- double_array slipRateCell(numConstraintVert * spaceDim);
- const ALE::Obj<RealSection>& slipRateSection =
- _fields->get("slip rate").section();
- topology::Mesh::UpdateAllVisitor slipRateVisitor(*slipRateSection,
- &slipRateCell[0]);
-
- // Get section information
- double_array orientationCell(numConstraintVert * orientationSize);
- const ALE::Obj<RealSection>& orientationSection =
- _fields->get("orientation").section();
- assert(!orientationSection.isNull());
- topology::Mesh::RestrictVisitor orientationVisitor(*orientationSection,
- orientationCell.size(), &orientationCell[0]);
-
- for (SieveMesh::label_sequence::iterator c_iter = cellsCohesiveBegin; c_iter
- != cellsCohesiveEnd; ++c_iter) {
- const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
- slipRateCell = 0.0;
-
- velocityVisitor.clear();
- sieveMesh->restrictClosure(*c_iter, velocityVisitor);
-
- // Get orientations at fault cell's vertices.
- orientationVisitor.clear();
- faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
-
- for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
- // Blocks in cell matrix associated with normal cohesive
- // vertices i and j and constraint vertex k
- const int indexI = iConstraint;
- const int indexJ = iConstraint + numConstraintVert;
- const int indexK = iConstraint + 2 * numConstraintVert;
-
- // Get orientation at constraint vertex
- const double* orientationVertex = &orientationCell[iConstraint
- * orientationSize];
- assert(0 != orientationVertex);
-
- // Velocity for vertex i.
- for (int iDim = 0; iDim < spaceDim; ++iDim) {
- for (int kDim = 0; kDim < spaceDim; ++kDim)
- slipRateCell[iConstraint * spaceDim + iDim] -= velocityCell[indexI
- * spaceDim + kDim] * -orientationVertex[kDim * spaceDim + iDim];
- } // for
-
- // Velocity for vertex j.
- for (int iDim = 0; iDim < spaceDim; ++iDim) {
- for (int kDim = 0; kDim < spaceDim; ++kDim)
- slipRateCell[iConstraint * spaceDim + iDim] -= velocityCell[indexJ
- * spaceDim + kDim] * +orientationVertex[kDim * spaceDim + iDim];
- } // for
-
- } // for
-
- // Insert cell contribution into
- slipRateVisitor.clear();
- faultSieveMesh->updateClosure(c_fault, slipRateVisitor);
- } // for
-
- PetscLogFlops(cellsCohesiveSize*numConstraintVert*spaceDim*spaceDim*3);
-} // _updateSlipRate
-
-// ----------------------------------------------------------------------
-// Allocate buffer for vector field.
-void
-pylith::faults::FaultCohesiveDynL::_allocateBufferVertexVectorField(void)
-{ // _allocateBufferVertexVectorField
- assert(0 != _fields);
- if (_fields->hasField("buffer (vector)"))
- return;
-
- ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
- logger.stagePush("Output");
-
- // Create vector field; use same shape/chart as slip field.
- assert(0 != _faultMesh);
- _fields->add("buffer (vector)", "buffer");
- topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (vector)");
- const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- buffer.cloneSection(slip);
- buffer.zero();
-
- logger.stagePop();
-} // _allocateBufferVertexVectorField
-
-// ----------------------------------------------------------------------
-// Allocate buffer for scalar field.
-void
-pylith::faults::FaultCohesiveDynL::_allocateBufferVertexScalarField(void)
-{ // _allocateBufferVertexScalarField
- assert(0 != _fields);
- if (_fields->hasField("buffer (scalar)"))
- return;
-
- ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
- logger.stagePush("Output");
-
- // Create vector field; use same shape/chart as area field.
- assert(0 != _faultMesh);
- _fields->add("buffer (scalar)", "buffer");
- topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (scalar)");
- const topology::Field<topology::SubMesh>& area = _fields->get("area");
- buffer.cloneSection(area);
- buffer.zero();
-
- logger.stagePop();
-} // _allocateBufferVertexScalarField
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,313 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/** @file libsrc/faults/FaultCohesiveDynL.hh
- *
- * @brief C++ implementation for a fault surface with spontaneous
- * (dynamic) slip implemented with cohesive elements.
- */
-
-#if !defined(pylith_faults_faultcohesivedynl_hh)
-#define pylith_faults_faultcohesivedynl_hh
-
-// Include directives ---------------------------------------------------
-#include "FaultCohesive.hh" // ISA FaultCohesive
-
-#include "pylith/friction/frictionfwd.hh" // HOLDSA Friction model
-
-#include "pylith/topology/SubMesh.hh" // ISA Integrator<Quadrature<SubMesh> >
-#include "pylith/feassemble/Quadrature.hh" // ISA Integrator<Quadrature>
-#include "pylith/feassemble/Integrator.hh" // ISA Integrator
-
-#include <string> // HASA std::string
-
-// FaultCohesiveDynL -----------------------------------------------------
-/**
- * @brief C++ implementation for a fault surface with spontaneous
- * (dynamic) slip implemented with cohesive elements.
- *
- * The fault constitutive model is implemented using Lagrange
- * multipliers. The constraints associated with stick/slip behavior
- * are associated with "constraint" vertices which sit between the
- * pair of vertices on each side of the fault.
- *
- * The ordering of vertices in a cohesive cell is the vertices on the
- * "negative" side of the fault, the corresponding entries on the
- * "positive" side of the fault, and then the corresponding constraint
- * vertices.
- *
- * The system without Lagrange multipliers is
- *
- * [A(t+dt)]{u(t+dt)} = {b(t+dt)}
- *
- * With Lagrange multipliers this system becomes
- *
- * [A(t+dt) C^T ]{ u(t+dt) } = {b(t+dt)}
- * [ C 0 ]{ L(t+dt) } {D(t+dt)}
- *
- * where C is the matrix of Lagrange constraints, L is the vector of
- * Lagrange multiplies (internal forces in this case), and D is the
- * fault slip.
- *
- * We solve for the increment in the displacement field, so we rewrite
- * the system as
- *
- * [A(t+dt) C^T ]{ du(t) } = {b(t+dt)} - [A(t+dt) C^T ]{ u(t) }
- * [ C 0 ]{ dL(t) } {D(t+dt)} [ C 0 ]{ L(t) }
- *
- * We form the residual as
- *
- * {r(t+dt)} = {b(t+dt)} - [A(t+dt) C^T ]{ u(t)+du(t) }
- * {D(t+dt)} [ C 0 ]{ L(t)+dL(t) }
- *
- * The terms in the residual contributing to the DOF at the Lagrange
- * vertices are
- *
- * {r(t+dt)} = {D(t+dt)} - [C]{u(t)+dt(t)}
- *
- * The first term, {D(t+dt)}, does not involve integration over the
- * cohesive cells, so it does not require assembling over cohesive
- * cells or processors. We compute the term in
- * integrateResidualAssembled().
- *
- * The term in the residual contributing to the DOF at the
- * non-Lagrange vertices of the cohesive cells is
- *
- * {r(t+dt)} = -[C]^T{L(t)+dL(t)}
- *
- * We integrate the Lagrange multiplier term and the relative
- * displacement term over the cohesive cells, because this introduces
- * weighting of the orientation of the fault for the direction of slip
- * at the vertices of the cohesive cells.
- */
-class pylith::faults::FaultCohesiveDynL : public FaultCohesive
-{ // class FaultCohesiveDynL
- friend class TestFaultCohesiveDynL; // unit testing
-
- // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
- /// Default constructor.
- FaultCohesiveDynL(void);
-
- /// Destructor.
- virtual
- ~FaultCohesiveDynL(void);
-
- /// Deallocate PETSc and local data structures.
- virtual
- void deallocate(void);
-
- /** Sets the spatial database for the inital tractions.
- *
- * @param db spatial database for initial tractions
- */
- void dbInitialTract(spatialdata::spatialdb::SpatialDB* db);
-
- /** Set the friction (constitutive) model.
- *
- * @param model Fault constutive model.
- */
- void frictionModel(friction::FrictionModel* const model);
-
- /** Initialize fault. Determine orientation and setup boundary
- * condition parameters.
- *
- * @param mesh Finite-element mesh.
- * @param upDir Direction perpendicular to along-strike direction that is
- * not collinear with fault normal (usually "up" direction but could
- * be up-dip direction; only applies to fault surfaces in a 3-D domain).
- * @param normalDir General preferred direction for fault normal
- * (used to pick which of two possible normal directions for
- * interface; only applies to fault surfaces in a 3-D domain).
- */
- void initialize(const topology::Mesh& mesh,
- const double upDir[3],
- const double normalDir[3]);
-
- /** Split solution field for separate preconditioning of normal DOF
- * from DOF associated with Lagrange multipliers.
- *
- * @param field Solution field.
- */
- void splitField(topology::Field<topology::Mesh>* field);
-
- /** Integrate contributions to residual term (r) for operator that
- * require assembly across processors.
- *
- * @param residual Field containing values for residual
- * @param t Current time
- * @param fields Solution fields
- */
- void integrateResidual(const topology::Field<topology::Mesh>& residual,
- const double t,
- topology::SolutionFields* const fields);
-
- /** Integrate contributions to residual term (r) for operator that
- * do not require assembly across cells, vertices, or processors.
- *
- * @param residual Field containing values for residual
- * @param t Current time
- * @param fields Solution fields
- */
- void integrateResidualAssembled(const topology::Field<topology::Mesh>& residual,
- const double t,
- topology::SolutionFields* const fields);
-
- /** Integrate contributions to Jacobian matrix (A) associated with
- * operator that do not require assembly across cells, vertices, or
- * processors.
- *
- * @param jacobian Sparse matrix
- * @param t Current time
- * @param fields Solution fields
- * @param mesh Finite-element mesh
- */
- void integrateJacobianAssembled(topology::Jacobian* jacobian,
- const double t,
- topology::SolutionFields* const fields);
-
- /** Update state variables as needed.
- *
- * @param t Current time
- * @param fields Solution fields
- * @param mesh Finite-element mesh
- */
- void updateStateVars(const double t,
- topology::SolutionFields* const fields);
-
- /** Constrain solution space based on friction.
- *
- * @param fields Solution fields.
- * @param t Current time.
- * @param jacobian Sparse matrix for system Jacobian.
- */
- void constrainSolnSpace(topology::SolutionFields* const fields,
- const double t,
- const topology::Jacobian& jacobian);
-
- /** Verify configuration is acceptable.
- *
- * @param mesh Finite-element mesh
- */
- void verifyConfiguration(const topology::Mesh& mesh) const;
-
- /** Get vertex field associated with integrator.
- *
- * @param name Name of cell field.
- * @param fields Solution fields.
- * @returns Vertex field.
- */
- const topology::Field<topology::SubMesh>&
- vertexField(const char* name,
- const topology::SolutionFields* fields =0);
-
- /** Get cell field associated with integrator.
- *
- * @param name Name of cell field.
- * @param fields Solution fields.
- * @returns Cell field.
- */
- const topology::Field<topology::SubMesh>&
- cellField(const char* name,
- const topology::SolutionFields* fields =0);
-
- /** Cohesive cells use Lagrange multiplier constraints?
- *
- * @returns True if implementation using Lagrange multiplier
- * constraints, false otherwise.
- */
- bool useLagrangeConstraints(void) const;
-
- /** Get fields associated with fault.
- *
- * @returns Fields associated with fault.
- */
- const topology::Fields<topology::Field<topology::SubMesh> >*
- fields(void) const;
-
- // PRIVATE METHODS ////////////////////////////////////////////////////
-private :
-
- /** Calculate orientation at fault vertices.
- *
- * @param upDir Direction perpendicular to along-strike direction that is
- * not collinear with fault normal (usually "up" direction but could
- * be up-dip direction; only applies to fault surfaces in a 3-D domain).
- * @param normalDir General preferred direction for fault normal
- * (used to pick which of two possible normal directions for
- * interface; only applies to fault surfaces in a 3-D domain).
- */
- void _calcOrientation(const double upDir[3],
- const double normalDir[3]);
-
- /// Calculate fault area field.
- void _calcArea(void);
-
- /** Get initial tractions using a spatial database.
- */
- void _getInitialTractions(void);
-
- /** Update diagonal of Jacobian at conventional vertices i and j
- * associated with Lagrange vertex k.
- *
- * @param fields Solution fields.
- */
- void _updateJacobianDiagonal(const topology::SolutionFields& fields);
-
- /** Update slip rate associated with Lagrange vertex k corresponding
- * to diffential velocity between conventional vertices i and j.
- *
- * @param fields Solution fields.
- */
- void _updateSlipRate(const topology::SolutionFields& fields);
-
- /** Compute change in tractions on fault surface using solution.
- *
- * @param tractions Field for tractions.
- * @param solution Solution over domain
- */
- void _calcTractions(topology::Field<topology::SubMesh>* tractions,
- const topology::Field<topology::Mesh>& solution);
-
- /// Allocate buffer for vector field.
- void _allocateBufferVertexVectorField(void);
-
- /// Allocate buffer for scalar field.
- void _allocateBufferVertexScalarField(void);
-
- // PRIVATE MEMBERS ////////////////////////////////////////////////////
-private :
-
- /// Database for initial tractions.
- spatialdata::spatialdb::SpatialDB* _dbInitialTract;
-
- /// To identify constitutive model
- friction::FrictionModel* _friction;
-
- // NOT IMPLEMENTED ////////////////////////////////////////////////////
-private :
-
- /// Not implemented
- FaultCohesiveDynL(const FaultCohesiveDynL&);
-
- /// Not implemented
- const FaultCohesiveDynL& operator=(const FaultCohesiveDynL&);
-
-}; // class FaultCohesiveDynL
-
-#include "FaultCohesiveDynL.icc" // inline methods
-
-#endif // pylith_faults_faultcohesivedynl_hh
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.icc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveDynL.icc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,32 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#if !defined(pylith_faults_faultcohesivedynl_hh)
-#error "FaultCohesiveDynL.icc can only be included from FaultCohesiveDynL.hh"
-#endif
-
-// Cohesive cells use Lagrange multiplier constraints?
-inline
-bool
-pylith::faults::FaultCohesiveDynL::useLagrangeConstraints(void) const {
- return true;
-} // useLagrangeConstraints
-
-// Get fields associated with fault.
-inline
-const pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> >*
-pylith::faults::FaultCohesiveDynL::fields(void) const {
- return _fields;
-} // fields
-
-
-// End of file
Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -13,8 +13,10 @@
#include <portinfo>
#include "FaultCohesiveKin.hh" // implementation of object methods
+
#include "EqKinSrc.hh" // USES EqKinSrc
#include "CohesiveTopology.hh" // USES CohesiveTopology
+
#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
#include "pylith/feassemble/CellGeometry.hh" // USES CellGeometry
#include "pylith/topology/Mesh.hh" // USES Mesh
@@ -23,8 +25,10 @@
#include "pylith/topology/Fields.hh" // USES Fields
#include "pylith/topology/Jacobian.hh" // USES Jacobian
#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+
#include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
#include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
+
#include <cmath> // USES pow(), sqrt()
#include <strings.h> // USES strcasecmp()
#include <cstring> // USES strlen()
@@ -45,7 +49,6 @@
// Default constructor.
pylith::faults::FaultCohesiveKin::FaultCohesiveKin(void)
{ // constructor
- _useLagrangeConstraints = true;
} // constructor
// ----------------------------------------------------------------------
@@ -60,7 +63,7 @@
void
pylith::faults::FaultCohesiveKin::deallocate(void)
{ // deallocate
- FaultCohesive::deallocate();
+ FaultCohesiveLagrange::deallocate();
// :TODO: Use shared pointers for earthquake sources
} // deallocate
@@ -96,91 +99,17 @@
assert(0 != _quadrature);
assert(0 != _normalizer);
- _initializeLogger();
+ FaultCohesiveLagrange::initialize(mesh, upDir, normalDir);
- const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
- assert(0 != cs);
-
- delete _faultMesh;
- _faultMesh = new topology::SubMesh();
- CohesiveTopology::createFaultParallel(_faultMesh, &_cohesiveToFault, mesh, id(), useLagrangeConstraints());
-
- _initializeCohesiveInfo(mesh);
-
- delete _fields;
- _fields = new topology::Fields<topology::Field<topology::SubMesh> >(
- *_faultMesh);
-
const srcs_type::const_iterator srcsEnd = _eqSrcs.end();
for (srcs_type::iterator s_iter = _eqSrcs.begin(); s_iter != srcsEnd; ++s_iter) {
EqKinSrc* src = s_iter->second;
assert(0 != src);
src->initialize(*_faultMesh, *_normalizer);
} // for
-
- ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
- //logger.stagePush("Fault");
-
- // Allocate slip field
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- assert(!vertices.isNull());
- _fields->add("slip", "slip");
- topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- slip.newSection(vertices, cs->spaceDim());
- slip.allocate();
- slip.vectorFieldType(topology::FieldBase::VECTOR);
- slip.scale(_normalizer->lengthScale());
-
- const ALE::Obj<SieveSubMesh::label_sequence>& cells =
- faultSieveMesh->heightStratum(0);
- assert(!cells.isNull());
- const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
- const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
- _quadrature->initializeGeometry();
-#if defined(PRECOMPUTE_GEOMETRY)
- _quadrature->computeGeometry(*_faultMesh, cells);
-#endif
-
- // Compute orientation at vertices in fault mesh.
- _calcOrientation(upDir, normalDir);
-
- // Compute tributary area for each vertex in fault mesh.
- _calcArea();
-
- //logger.stagePop();
} // initialize
// ----------------------------------------------------------------------
-void
-pylith::faults::FaultCohesiveKin::splitField(topology::Field<
- topology::Mesh>* field)
-{ // splitField
- assert(0 != field);
-
- const ALE::Obj<RealSection>& section = field->section();
- assert(!section.isNull());
- if (0 == section->getNumSpaces())
- return; // Return if there are no fibrations
-
- const int spaceDim = field->mesh().dimension();
- const int fibrationLagrange = spaceDim;
-
- const int numVertices = _cohesiveVertices.size();
- for (int iVertex=0; iVertex < numVertices; ++iVertex) {
- const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
- assert(spaceDim == section->getFiberDimension(v_lagrange));
- // Reset displacement fibration fiber dimension to zero.
- for (int fibration=0; fibration < spaceDim; ++fibration)
- section->setFiberDimension(v_lagrange, 0, fibration);
- // Set Lagrange fibration fiber dimension.
- section->setFiberDimension(v_lagrange, spaceDim, fibrationLagrange);
- } // for
-} // splitField
-
-// ----------------------------------------------------------------------
// Integrate contribution of cohesive cells to residual term that do
// not require assembly across cells, vertices, or processors.
void
@@ -192,20 +121,7 @@
assert(0 != _fields);
assert(0 != _logger);
- // Cohesive cells with normal vertices i and j, and constraint
- // vertex k make contributions to the assembled residual:
- //
- // * DOF i and j: internal forces in soln field associated with
- // slip -[C]^T{L(t)+dL(t)}
- // * DOF k: slip values -[C]{u(t)+dt(t)}
- // * DOF k: slip values {D(t+dt)}
-
- const int setupEvent = _logger->eventId("FkIR setup");
- const int geometryEvent = _logger->eventId("FkIR geometry");
- const int computeEvent = _logger->eventId("FkIR compute");
- const int restrictEvent = _logger->eventId("FkIR restrict");
- const int updateEvent = _logger->eventId("FkIR update");
-
+ const int setupEvent = _logger->eventId("FaIR setup");
_logger->eventBegin(setupEvent);
topology::Field<topology::SubMesh>& slip = _fields->get("slip");
@@ -219,726 +135,13 @@
src->slip(&slip, t);
} // for
- // Get cell information and setup storage for cell data
- const int spaceDim = _quadrature->spaceDim();
- const int orientationSize = spaceDim * spaceDim;
-
- // Allocate vectors for vertex values
- double_array slipVertex(spaceDim);
- double_array orientationVertex(orientationSize);
- double_array dispTVertexN(spaceDim);
- double_array dispTVertexP(spaceDim);
- double_array dispTVertexL(spaceDim);
- double_array dispTIncrVertexN(spaceDim);
- double_array dispTIncrVertexP(spaceDim);
- double_array dispTIncrVertexL(spaceDim);
- double_array dispTpdtVertexN(spaceDim);
- double_array dispTpdtVertexP(spaceDim);
- double_array dispTpdtVertexL(spaceDim);
- double_array residualVertexN(spaceDim);
- double_array residualVertexP(spaceDim);
- double_array residualVertexL(spaceDim);
-
- // Get sections
- const ALE::Obj<RealSection>& slipSection = slip.section();
- assert(!slipSection.isNull());
-
- const ALE::Obj<RealSection>& residualSection = residual.section();
- assert(!residualSection.isNull());
-
- const ALE::Obj<RealSection>& orientationSection =
- _fields->get("orientation").section();
- assert(!orientationSection.isNull());
-
- topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
- const ALE::Obj<RealSection>& dispTSection = dispT.section();
- assert(!dispTSection.isNull());
-
- topology::Field<topology::Mesh>& dispTIncr = fields->get("dispIncr(t->t+dt)");
- const ALE::Obj<RealSection>& dispTIncrSection = dispTIncr.section();
- assert(!dispTIncrSection.isNull());
-
_logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
- _logger->eventBegin(computeEvent);
-#endif
- const int numVertices = _cohesiveVertices.size();
- for (int iVertex=0; iVertex < numVertices; ++iVertex) {
- const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
- const int v_fault = _cohesiveVertices[iVertex].fault;
- const int v_negative = _cohesiveVertices[iVertex].negative;
- const int v_positive = _cohesiveVertices[iVertex].positive;
+ FaultCohesiveLagrange::integrateResidualAssembled(residual, t, fields);
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventBegin(restrictEvent);
-#endif
-
- slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
-
- // Get orientations at fault cell's vertices.
- orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
-
- // Get disp(t) at conventional vertices and Lagrange vertex.
- dispTSection->restrictPoint(v_negative, &dispTVertexN[0], dispTVertexN.size());
- dispTSection->restrictPoint(v_positive, &dispTVertexP[0], dispTVertexP.size());
- dispTSection->restrictPoint(v_lagrange, &dispTVertexL[0], dispTVertexL.size());
-
- // Get dispIncr(t->t+dt) at conventional vertices and Lagrange vertex.
- dispTIncrSection->restrictPoint(v_negative, &dispTIncrVertexN[0], dispTIncrVertexN.size());
- dispTIncrSection->restrictPoint(v_positive, &dispTIncrVertexP[0], dispTIncrVertexP.size());
- dispTIncrSection->restrictPoint(v_lagrange, &dispTIncrVertexL[0], dispTIncrVertexL.size());
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(restrictEvent);
- _logger->eventBegin(computeEvent);
-#endif
-
- // Compute current estimate of displacement at time t+dt using
- // solution increment.
- dispTpdtVertexN = dispTVertexN + dispTIncrVertexN;
- dispTpdtVertexP = dispTVertexP + dispTIncrVertexP;
- dispTpdtVertexL = dispTVertexL + dispTIncrVertexL;
-
- // Entries associated with constraint forces applied at negative vertex
- residualVertexN = 0.0;
- for (int iDim = 0; iDim < spaceDim; ++iDim)
- for (int kDim = 0; kDim < spaceDim; ++kDim)
- residualVertexN[iDim] -= dispTpdtVertexL[kDim] * -orientationVertex[kDim*spaceDim+iDim];
-
- // Entries associated with constraint forces applied at positive vertex
- residualVertexP = -residualVertexN;
-
- // Entries associated with relative displacements between positive
- // and negative vertices for Lagrange vertex.
- residualVertexL = slipVertex;
- for (int kDim = 0; kDim < spaceDim; ++kDim)
- for (int iDim = 0; iDim < spaceDim; ++iDim)
- residualVertexL[kDim] -= (dispTpdtVertexP[iDim] - dispTpdtVertexN[iDim])
- * orientationVertex[kDim*spaceDim+iDim];
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(computeEvent);
- _logger->eventBegin(updateEvent);
-#endif
-
- assert(residualVertexN.size() == residualSection->getFiberDimension(v_negative));
- residualSection->updateAddPoint(v_negative, &residualVertexN[0]);
-
- assert(residualVertexP.size() == residualSection->getFiberDimension(v_positive));
- residualSection->updateAddPoint(v_positive, &residualVertexP[0]);
-
- assert(residualVertexL.size() == residualSection->getFiberDimension(v_lagrange));
- residualSection->updateAddPoint(v_lagrange, &residualVertexL[0]);
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(updateEvent);
-#endif
- } // for
- PetscLogFlops(numVertices*spaceDim*spaceDim*8);
-
-#if !defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(computeEvent);
-#endif
} // integrateResidualAssembled
// ----------------------------------------------------------------------
-// Compute Jacobian matrix (A) associated with operator that do not
-// require assembly across cells, vertices, or processors.
-void
-pylith::faults::FaultCohesiveKin::integrateJacobianAssembled(topology::Jacobian* jacobian,
- const double t,
- topology::SolutionFields* const fields)
-{ // integrateJacobianAssembled
- assert(0 != jacobian);
- assert(0 != fields);
- assert(0 != _fields);
- assert(0 != _logger);
-
- const int setupEvent = _logger->eventId("FkIJ setup");
- const int geometryEvent = _logger->eventId("FkIJ geometry");
- const int computeEvent = _logger->eventId("FkIJ compute");
- const int restrictEvent = _logger->eventId("FkIJ restrict");
- const int updateEvent = _logger->eventId("FkIJ update");
-
- _logger->eventBegin(setupEvent);
-
- // Add constraint information to Jacobian matrix; these are the
- // direction cosines. Entries are associated with vertices ik, jk,
- // ki, and kj.
-
- // Get cohesive cells
- const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
- assert(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
- sieveMesh->getLabelStratum("material-id", id());
- assert(!cellsCohesive.isNull());
- const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
- cellsCohesive->begin();
- const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
- cellsCohesive->end();
- const int cellsCohesiveSize = cellsCohesive->size();
-
- const int spaceDim = _quadrature->spaceDim();
- const int orientationSize = spaceDim * spaceDim;
-
- const int numConstraintVert = _quadrature->numBasis();
- const int numCorners = 3 * numConstraintVert; // cohesive cell
- double_array matrixCell(numCorners * spaceDim * numCorners * spaceDim);
- double_array orientationCell(numConstraintVert * orientationSize);
-
- // Get section information
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<RealSection>& solutionSection = fields->solution().section();
- assert(!solutionSection.isNull());
- const ALE::Obj<RealSection>& orientationSection =
- _fields->get("orientation").section();
- assert(!orientationSection.isNull());
- topology::Mesh::RestrictVisitor orientationVisitor(*orientationSection,
- orientationCell.size(), &orientationCell[0]);
-
-#if 0 // DEBUGGING
- // Check that fault cells match cohesive cells
- ALE::ISieveVisitor::PointRetriever<sieve_type> cV(std::max(1, mesh->getSieve()->getMaxConeSize()));
- ALE::ISieveVisitor::PointRetriever<sieve_type> cV2(std::max(1, _faultMesh->getSieve()->getMaxConeSize()));
- Mesh::renumbering_type& fRenumbering = _faultMesh->getRenumbering();
- const int rank = mesh->commRank();
-
- for (Mesh::label_sequence::iterator c_iter = cellsCohesiveBegin;
- c_iter != cellsCohesiveEnd;
- ++c_iter) {
- mesh->getSieve()->cone(*c_iter, cV);
- const int coneSize = cV.getSize();
- const Mesh::point_type *cone = cV.getPoints();
- const int faceSize = coneSize / 3;
- const Mesh::point_type face = _cohesiveToFault[*c_iter];
- _faultMesh->getSieve()->cone(face, cV2);
- const int fConeSize = cV2.getSize();
- const Mesh::point_type *fCone = cV2.getPoints();
-
- assert(0 == coneSize % faceSize);
- assert(faceSize == fConeSize);
- // Use last vertices (contraints) for fault mesh
- for(int i = 2*faceSize, j = 0; i < 3*faceSize; ++i, ++j) {
- assert(fRenumbering[cone[i]] == fCone[j]);
- }
- cV.clear();
- cV2.clear();
- }
-#endif
-
- const PetscMat jacobianMatrix = jacobian->matrix();
- assert(0 != jacobianMatrix);
- const ALE::Obj<SieveMesh::order_type>& globalOrder =
- sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
- solutionSection);
- assert(!globalOrder.isNull());
- // We would need to request unique points here if we had an interpolated mesh
- topology::Mesh::IndicesVisitor jacobianVisitor(*solutionSection,
- *globalOrder, (int) pow(sieveMesh->getSieve()->getMaxConeSize(),
- sieveMesh->depth()) * spaceDim);
-
- _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
- _logger->eventBegin(computeEvent);
-#endif
-
- for (SieveMesh::label_sequence::iterator c_iter = cellsCohesiveBegin; c_iter
- != cellsCohesiveEnd; ++c_iter) {
- const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventBegin(restrictEvent);
-#endif
-
- matrixCell = 0.0;
- // Get orientations at fault cell's vertices.
- orientationVisitor.clear();
- faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(restrictEvent);
- _logger->eventBegin(computeEvent);
-#endif
-
- for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
- // Blocks in cell matrix associated with normal cohesive
- // vertices i and j and constraint vertex k
- const int indexI = iConstraint;
- const int indexJ = iConstraint + numConstraintVert;
- const int indexK = iConstraint + 2 * numConstraintVert;
-
- // Get orientation at constraint vertex
- const double* orientationVertex = &orientationCell[iConstraint
- * orientationSize];
- assert(0 != orientationVertex);
-
- // Entries associated with constraint forces applied at node i
- for (int iDim = 0; iDim < spaceDim; ++iDim)
- for (int kDim = 0; kDim < spaceDim; ++kDim) {
- const int row = indexI * spaceDim + iDim;
- const int col = indexK * spaceDim + kDim;
- matrixCell[row * numCorners * spaceDim + col]
- = -orientationVertex[kDim * spaceDim + iDim];
- matrixCell[col * numCorners * spaceDim + row]
- = -orientationVertex[kDim * spaceDim + iDim];
- } // for
-
- // Entries associated with constraint forces applied at node j
- for (int jDim = 0; jDim < spaceDim; ++jDim)
- for (int kDim = 0; kDim < spaceDim; ++kDim) {
- const int row = indexJ * spaceDim + jDim;
- const int col = indexK * spaceDim + kDim;
- matrixCell[row * numCorners * spaceDim + col]
- = orientationVertex[kDim * spaceDim + jDim];
- matrixCell[col * numCorners * spaceDim + row]
- = orientationVertex[kDim * spaceDim + jDim];
- } // for
- } // for
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(computeEvent);
- _logger->eventBegin(updateEvent);
-#endif
-
- // Insert cell contribution into PETSc Matrix
- jacobianVisitor.clear();
- PetscErrorCode err = updateOperator(jacobianMatrix, *sieveMesh->getSieve(),
- jacobianVisitor, *c_iter, &matrixCell[0], INSERT_VALUES);
- CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(updateEvent);
-#endif
- } // for
- PetscLogFlops(cellsCohesiveSize*numConstraintVert*spaceDim*spaceDim*4);
-
-#if !defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(computeEvent);
-#endif
-
- _needNewJacobian = false;
-} // integrateJacobianAssembled
-
-// ----------------------------------------------------------------------
-// Compute Jacobian matrix (A) associated with operator that do not
-// require assembly across cells, vertices, or processors.
-void
-pylith::faults::FaultCohesiveKin::integrateJacobianAssembled(topology::Field<
- topology::Mesh>* jacobian,
- const double t,
- topology::SolutionFields* const fields)
-{ // integrateJacobianAssembled
- assert(0 != jacobian);
- assert(0 != fields);
- assert(0 != _fields);
- assert(0 != _logger);
-
- const int setupEvent = _logger->eventId("FkIJ setup");
- const int geometryEvent = _logger->eventId("FkIJ geometry");
- const int computeEvent = _logger->eventId("FkIJ compute");
- const int restrictEvent = _logger->eventId("FkIJ restrict");
- const int updateEvent = _logger->eventId("FkIJ update");
-
- _logger->eventBegin(setupEvent);
-
- // Add ones to diagonal Jacobian matrix (as field) for
- // convenience. Instead of including the constraints in the Jacobian
- // matrix, we adjust the solution to account for the Lagrange
- // multipliers as part of the solve.
-
- const int spaceDim = _quadrature->spaceDim();
- double_array jacobianVertex(spaceDim);
- jacobianVertex = 1.0;
- const ALE::Obj<RealSection>& jacobianSection = jacobian->section();
- assert(!jacobianSection.isNull());
-
- _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
- _logger->eventBegin(computeEvent);
-#endif
-
- const int numVertices = _cohesiveVertices.size();
- for (int iVertex=0; iVertex < numVertices; ++iVertex) {
- const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
-
- assert(jacobianSection->getFiberDimension(v_lagrange) == spaceDim);
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventBegin(updateEvent);
-#endif
- jacobianSection->updatePoint(v_lagrange, &jacobianVertex[0]);
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(updateEvent);
-#endif
- } // for
- PetscLogFlops(0);
-
-#if !defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(computeEvent);
-#endif
-
- _needNewJacobian = false;
-} // integrateJacobianAssembled
-
-// ----------------------------------------------------------------------
-// Update state variables as needed.
-void
-pylith::faults::FaultCohesiveKin::updateStateVars(const double t,
- topology::SolutionFields* const fields)
-{ // updateStateVars
- assert(0 != fields);
- assert(0 != _fields);
-
-} // updateStateVars
-
-// ----------------------------------------------------------------------
-// Adjust solution from solver with lumped Jacobian to match Lagrange
-// multiplier constraints.
-void
-pylith::faults::FaultCohesiveKin::adjustSolnLumped(topology::SolutionFields* const fields,
- const topology::Field<
- topology::Mesh>& jacobian)
-{ // adjustSolnLumped
- assert(0 != fields);
- assert(0 != _quadrature);
-
- // Cohesive cells with conventional vertices i and j, and constraint
- // vertex k require 2 adjustments to the solution:
- //
- // * DOF k: Compute increment in Lagrange multipliers
- // dl_k = S^{-1} (-C_ki (A_i^{-1} r_i - C_kj A_j^{-1} r_j + u_i - u_j) - d_k)
- // S = C_ki (A_i^{-1} + A_j^{-1}) C_ki^T
- // * DOF i and j: Adjust displacement increment (solution) to account
- // for Lagrange multiplier constraints
- // du_i = +A_i^-1 C_ki^T dlk
- // du_j = -A_j^-1 C_kj^T dlk
-
- const int setupEvent = _logger->eventId("FkAS setup");
- const int geometryEvent = _logger->eventId("FkAS geometry");
- const int computeEvent = _logger->eventId("FkAS compute");
- const int restrictEvent = _logger->eventId("FkAS restrict");
- const int updateEvent = _logger->eventId("FkAS update");
-
- _logger->eventBegin(setupEvent);
-
- // Get cell information and setup storage for cell data
- const int spaceDim = _quadrature->spaceDim();
- const int orientationSize = spaceDim * spaceDim;
-
- // Get section information
- double_array orientationVertex(orientationSize);
- const ALE::Obj<RealSection>& orientationSection =
- _fields->get("orientation").section();
- assert(!orientationSection.isNull());
-
- double_array slipVertex(spaceDim);
- const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
- assert(!slipSection.isNull());
-
- double_array jacobianVertexN(spaceDim);
- double_array jacobianVertexP(spaceDim);
- const ALE::Obj<RealSection>& jacobianSection = jacobian.section();
- assert(!jacobianSection.isNull());
-
- double_array residualVertexN(spaceDim);
- double_array residualVertexP(spaceDim);
- const ALE::Obj<RealSection>& residualSection =
- fields->get("residual").section();
-
- double_array dispTVertexN(spaceDim);
- double_array dispTVertexP(spaceDim);
- const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
-
- double_array solutionVertexN(spaceDim);
- double_array solutionVertexP(spaceDim);
- double_array solutionVertexL(spaceDim);
- const ALE::Obj<RealSection>& solutionSection = fields->get(
- "dispIncr(t->t+dt)").section();
-
- _logger->eventEnd(setupEvent);
-
-#if !defined(DETAILED_EVENT_LOGGING)
- _logger->eventBegin(computeEvent);
-#endif
-
- const int numVertices = _cohesiveVertices.size();
- for (int iVertex=0; iVertex < numVertices; ++iVertex) {
- const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
- const int v_fault = _cohesiveVertices[iVertex].fault;
- const int v_negative = _cohesiveVertices[iVertex].negative;
- const int v_positive = _cohesiveVertices[iVertex].positive;
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventBegin(restrictEvent);
-#endif
-
- // Get orientations at fault cell's vertices.
- orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
-
- // Get slip at fault cell's vertices.
- slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
-
- // Get residual at cohesive cell's vertices.
- residualSection->restrictPoint(v_negative, &residualVertexN[0], residualVertexN.size());
- residualSection->restrictPoint(v_positive, &residualVertexP[0], residualVertexP.size());
-
- // Get jacobian at cohesive cell's vertices.
- jacobianSection->restrictPoint(v_negative, &jacobianVertexN[0], jacobianVertexN.size());
- jacobianSection->restrictPoint(v_positive, &jacobianVertexP[0], jacobianVertexP.size());
-
- // Get disp(t) at cohesive cell's vertices.
- dispTSection->restrictPoint(v_negative, &dispTVertexN[0], dispTVertexN.size());
- dispTSection->restrictPoint(v_positive, &dispTVertexP[0], dispTVertexP.size());
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(restrictEvent);
- _logger->eventBegin(computeEvent);
-#endif
-
- switch (spaceDim) { // switch
- case 1: {
- assert(jacobianVertexN[0] > 0.0);
- assert(jacobianVertexP[0] > 0.0);
-
- const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
- / (jacobianVertexN[0] + jacobianVertexP[0]);
-
- // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
- const double Aru = residualVertexN[0] / jacobianVertexN[0]
- - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
- - dispTVertexP[0];
-
- // dl_k = D^{-1}( - C_{ki} Aru - d_k)
- const double Aruslip = -Aru - slipVertex[0];
- const double dlp = Sinv * Aruslip;
-
- // Update displacements at negative vertex
- solutionVertexN[0] = +1.0 / jacobianVertexN[0] * dlp;
-
- // Update displacements at positive vertex
- solutionVertexP[0] = -1.0 / jacobianVertexP[0] * dlp;
-
- // Update Lagrange multiplier.
- solutionVertexL[0] = dlp;
-
- break;
- } // case 1
- case 2: {
- assert(jacobianVertexN[0] > 0.0);
- assert(jacobianVertexN[1] > 0.0);
- assert(jacobianVertexP[0] > 0.0);
- assert(jacobianVertexP[1] > 0.0);
-
- const double Cpx = orientationVertex[0];
- const double Cpy = orientationVertex[1];
- const double Cqx = orientationVertex[2];
- const double Cqy = orientationVertex[3];
-
- // Check to make sure Jacobian is same at all DOF for
- // vertices i and j (means S is diagonal with equal enties).
- assert(jacobianVertexN[0] == jacobianVertexN[1]);
- assert(jacobianVertexP[0] == jacobianVertexP[1]);
-
- const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
- / (jacobianVertexN[0] + jacobianVertexP[0]);
-
- // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
- const double Arux = residualVertexN[0] / jacobianVertexN[0]
- - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
- - dispTVertexP[0];
- const double Aruy = residualVertexN[1] / jacobianVertexN[1]
- - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
- - dispTVertexP[1];
-
- // dl_k = S^{-1}(-C_{ki} Aru - d_k)
- const double Arup = Cpx * Arux + Cpy * Aruy;
- const double Aruq = Cqx * Arux + Cqy * Aruy;
- const double Arupslip = -Arup - slipVertex[0];
- const double Aruqslip = -Aruq - slipVertex[1];
- const double dlp = Sinv * Arupslip;
- const double dlq = Sinv * Aruqslip;
-
- const double dlx = Cpx * dlp + Cqx * dlq;
- const double dly = Cpy * dlp + Cqy * dlq;
-
- // Update displacements at negative vertex.
- solutionVertexN[0] = dlx / jacobianVertexN[0];
- solutionVertexN[1] = dly / jacobianVertexN[1];
-
- // Update displacements at positive vertex.
- solutionVertexP[0] = -dlx / jacobianVertexP[0];
- solutionVertexP[1] = -dly / jacobianVertexP[0];
-
- // Update Lagrange multiplier.
- solutionVertexL[0] = dlp;
- solutionVertexL[1] = dlq;
-
- break;
- } // case 2
- case 3: {
- assert(jacobianVertexN[0] > 0.0);
- assert(jacobianVertexN[1] > 0.0);
- assert(jacobianVertexN[2] > 0.0);
- assert(jacobianVertexP[0] > 0.0);
- assert(jacobianVertexP[1] > 0.0);
- assert(jacobianVertexP[2] > 0.0);
-
- const double Cpx = orientationVertex[0];
- const double Cpy = orientationVertex[1];
- const double Cpz = orientationVertex[2];
- const double Cqx = orientationVertex[3];
- const double Cqy = orientationVertex[4];
- const double Cqz = orientationVertex[5];
- const double Crx = orientationVertex[6];
- const double Cry = orientationVertex[7];
- const double Crz = orientationVertex[8];
-
- // Check to make sure Jacobian is same at all DOF for
- // vertices i and j (means S is diagonal with equal enties).
- assert(jacobianVertexN[0] == jacobianVertexN[1] && jacobianVertexN[0] == jacobianVertexN[2]);
- assert(jacobianVertexP[0] == jacobianVertexP[1] && jacobianVertexP[0] == jacobianVertexP[2]);
-
- const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
- / (jacobianVertexN[0] + jacobianVertexP[0]);
-
- // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
- const double Arux = residualVertexN[0] / jacobianVertexN[0]
- - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
- - dispTVertexP[0];
- const double Aruy = residualVertexN[1] / jacobianVertexN[1]
- - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
- - dispTVertexP[1];
- const double Aruz = residualVertexN[2] / jacobianVertexN[2]
- - residualVertexP[2] / jacobianVertexP[2] + dispTVertexN[2]
- - dispTVertexP[2];
-
- // dl_k = D^{-1}( -C_{ki} Aru - d_k)
- const double Arup = Cpx * Arux + Cpy * Aruy + Cpz * Aruz;
- const double Aruq = Cqx * Arux + Cqy * Aruy + Cqz * Aruz;
- const double Arur = Crx * Arux + Cry * Aruy + Crz * Aruz;
- const double Arupslip = -Arup - slipVertex[0];
- const double Aruqslip = -Aruq - slipVertex[1];
- const double Arurslip = -Arur - slipVertex[2];
- const double dlp = Sinv * Arupslip;
- const double dlq = Sinv * Aruqslip;
- const double dlr = Sinv * Arurslip;
-
- const double dlx = Cpx * dlp + Cqx * dlq + Crx * dlr;
- const double dly = Cpy * dlp + Cqy * dlq + Cry * dlr;
- const double dlz = Cpz * dlp + Cqz * dlq + Crz * dlr;
-
- // Update displacements at negative vertex.
- solutionVertexN[0] = dlx / jacobianVertexN[0];
- solutionVertexN[1] = dly / jacobianVertexN[1];
- solutionVertexN[2] = dlz / jacobianVertexN[2];
-
- // Update displacements at positive vertex.
- solutionVertexP[0] = -dlx / jacobianVertexP[0];
- solutionVertexP[1] = -dly / jacobianVertexP[1];
- solutionVertexP[2] = -dlz / jacobianVertexP[2];
-
- // Update Lagrange multiplier.
- solutionVertexL[0] = dlp;
- solutionVertexL[1] = dlq;
- solutionVertexL[2] = dlr;
-
- break;
- } // case 3
- default:
- assert(0);
- throw std::logic_error("Unknown spatial dimension.");
- } // switch
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(computeEvent);
- _logger->eventBegin(updateEvent);
-#endif
-
- assert(solutionVertexN.size() == solutionSection->getFiberDimension(v_negative));
- solutionSection->updateAddPoint(v_negative, &solutionVertexN[0]);
-
- assert(solutionVertexP.size() == solutionSection->getFiberDimension(v_positive));
- solutionSection->updateAddPoint(v_positive, &solutionVertexP[0]);
-
- assert(solutionVertexL.size() == solutionSection->getFiberDimension(v_lagrange));
- solutionSection->updateAddPoint(v_lagrange, &solutionVertexL[0]);
-
-#if defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(updateEvent);
-#endif
- } // for
-
- switch(spaceDim) {
- case 1:
- PetscLogFlops(numVertices*17);
- break;
- case 2:
- PetscLogFlops(numVertices*41);
- break;
- case 3:
- PetscLogFlops(numVertices*72);
- break;
- default:
- assert(0);
- throw std::logic_error("Unknown spatial dimension.");
- } // switch
-
-#if !defined(DETAILED_EVENT_LOGGING)
- _logger->eventEnd(computeEvent);
-#endif
-} // adjustSolnLumped
-
-// ----------------------------------------------------------------------
-// Verify configuration is acceptable.
-void
-pylith::faults::FaultCohesiveKin::verifyConfiguration(const topology::Mesh& mesh) const
-{ // verifyConfiguration
- assert(0 != _quadrature);
-
- const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
- assert(!sieveMesh.isNull());
-
- if (!sieveMesh->hasIntSection(label())) {
- std::ostringstream msg;
- msg << "Mesh missing group of vertices '" << label()
- << " for boundary condition.";
- throw std::runtime_error(msg.str());
- } // if
-
- // check compatibility of mesh and quadrature scheme
- const int dimension = mesh.dimension() - 1;
- if (_quadrature->cellDim() != dimension) {
- std::ostringstream msg;
- msg << "Dimension of reference cell in quadrature scheme ("
- << _quadrature->cellDim()
- << ") does not match dimension of cells in mesh (" << dimension
- << ") for fault '" << label() << "'.";
- throw std::runtime_error(msg.str());
- } // if
-
- const int numCorners = _quadrature->refGeometry().numCorners();
- const ALE::Obj<SieveMesh::label_sequence>& cells =
- sieveMesh->getLabelStratum("material-id", id());
- assert(!cells.isNull());
- const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
- const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
- for (SieveMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
- != cellsEnd; ++c_iter) {
- const int cellNumCorners = sieveMesh->getNumCellCorners(*c_iter);
- if (3 * numCorners != cellNumCorners) {
- std::ostringstream msg;
- msg << "Number of vertices in reference cell (" << numCorners
- << ") is not compatible with number of vertices (" << cellNumCorners
- << ") in cohesive cell " << *c_iter << " for fault '" << label()
- << "'.";
- throw std::runtime_error(msg.str());
- } // if
- } // for
-} // verifyConfiguration
-
-// ----------------------------------------------------------------------
// Get vertex field associated with integrator.
const pylith::topology::Field<pylith::topology::SubMesh>&
pylith::faults::FaultCohesiveKin::vertexField(const char* name,
@@ -1062,513 +265,5 @@
return buffer;
} // cellField
-// ----------------------------------------------------------------------
-// Initialize auxiliary cohesive cell information.
-void pylith::faults::FaultCohesiveKin::_initializeCohesiveInfo(const topology::Mesh& mesh)
-{ // _initializeCohesiveInfo
- assert(0 != _quadrature);
- // Get cohesive cells
- const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
- assert(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& cells =
- sieveMesh->getLabelStratum("material-id", id());
- assert(!cells.isNull());
- const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
- const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
-
- const int numConstraintVert = _quadrature->numBasis();
- const int numCorners = 3 * numConstraintVert; // cohesive cell
-
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- SubMesh::renumbering_type& renumbering = faultSieveMesh->getRenumbering();
- const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
- renumbering.end();
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
-
- typedef std::map<int, int> indexmap_type;
- indexmap_type indexMap;
- _cohesiveVertices.resize(vertices->size());
- int index = 0;
-
- const ALE::Obj<SieveMesh::sieve_type>& sieve = mesh.sieveMesh()->getSieve();
- assert(!sieve.isNull());
- typedef ALE::SieveAlg<SieveMesh> SieveAlg;
-
- ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type> ncV(*sieve,
- (size_t) pow(sieve->getMaxConeSize(), std::max(0, sieveMesh->depth())));
-
- for (SieveMesh::label_sequence::iterator c_iter=cellsBegin;
- c_iter != cellsEnd;
- ++c_iter) {
- // Get oriented closure
- ncV.clear();
- ALE::ISieveTraversal<SieveMesh::sieve_type>::orientedClosure(*sieve, *c_iter, ncV);
- const int coneSize = ncV.getSize();
- assert(coneSize == numCorners);
- const Mesh::point_type *cone = ncV.getPoints();
- assert(0 != cone);
-
- for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
- // normal cohesive vertices i and j and constraint vertex k
- const int indexI = iConstraint;
- const int indexJ = iConstraint + numConstraintVert;
- const int indexK = iConstraint + 2 * numConstraintVert;
-
- const int v_lagrange = cone[indexK];
- const int v_negative = cone[indexI];
- const int v_positive = cone[indexJ];
- const int v_fault = renumbering[v_lagrange];
-
- if (indexMap.end() == indexMap.find(v_lagrange)) {
- _cohesiveVertices[index].lagrange = v_lagrange;
- _cohesiveVertices[index].positive = v_positive;
- _cohesiveVertices[index].negative = v_negative;
- _cohesiveVertices[index].fault = v_fault;
-#if 0
- std::cout << "cohesiveVertices[" << index << "]: "
- << "l: " << v_lagrange
- << ", p: " << v_positive
- << ", n: " << v_negative
- << ", f: " << v_fault
- << std::endl;
-#endif
- indexMap[v_lagrange] = index; // add index to map
- ++index;
- } // if
- } // for
- } // for
-} // _initializeCohesiveInfo
-
-// ----------------------------------------------------------------------
-// Initialize logger.
-void
-pylith::faults::FaultCohesiveKin::_initializeLogger(void)
-{ // initializeLogger
- delete _logger;
- _logger = new utils::EventLogger;
- assert(0 != _logger);
- _logger->className("FaultCohesiveKin");
- _logger->initialize();
-
- _logger->registerEvent("FkAS setup");
- _logger->registerEvent("FkAS geometry");
- _logger->registerEvent("FkAS compute");
- _logger->registerEvent("FkAS restrict");
- _logger->registerEvent("FkAS update");
-
- _logger->registerEvent("FkIR setup");
- _logger->registerEvent("FkIR geometry");
- _logger->registerEvent("FkIR compute");
- _logger->registerEvent("FkIR restrict");
- _logger->registerEvent("FkIR update");
-
- _logger->registerEvent("FkIJ setup");
- _logger->registerEvent("FkIJ geometry");
- _logger->registerEvent("FkIJ compute");
- _logger->registerEvent("FkIJ restrict");
- _logger->registerEvent("FkIJ update");
-} // initializeLogger
-
-// ----------------------------------------------------------------------
-// Calculate orientation at fault vertices.
-void
-pylith::faults::FaultCohesiveKin::_calcOrientation(const double upDir[3],
- const double normalDir[3])
-{ // _calcOrientation
- assert(0 != upDir);
- assert(0 != normalDir);
- assert(0 != _faultMesh);
- assert(0 != _fields);
-
- double_array upDirArray(upDir, 3);
-
- // Get vertices in fault mesh.
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- const SieveSubMesh::label_sequence::iterator verticesBegin =
- vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Containers for orientation information.
- const int cohesiveDim = _faultMesh->dimension();
- const int numBasis = _quadrature->numBasis();
- const int spaceDim = _quadrature->spaceDim();
- const int orientationSize = spaceDim * spaceDim;
- const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
- const double_array& verticesRef = cellGeometry.vertices();
- const int jacobianSize = (cohesiveDim > 0) ? spaceDim * cohesiveDim : 1;
- const double_array& quadWts = _quadrature->quadWts();
- double_array jacobian(jacobianSize);
- double jacobianDet = 0;
- double_array orientationVertex(orientationSize);
- double_array coordinatesCell(numBasis * spaceDim);
- double_array refCoordsVertex(cohesiveDim);
-
- // Allocate orientation field.
- _fields->add("orientation", "orientation");
- topology::Field<topology::SubMesh>& orientation = _fields->get("orientation");
- const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- orientation.newSection(slip, orientationSize);
- const ALE::Obj<RealSection>& orientationSection = orientation.section();
- assert(!orientationSection.isNull());
- // Create subspaces for along-strike, up-dip, and normal directions
- for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
- orientationSection->addSpace();
- for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
- orientationSection->setFiberDimension(vertices, spaceDim, iDim);
- orientation.allocate();
- orientation.zero();
-
- // Get fault cells.
- const ALE::Obj<SieveSubMesh::label_sequence>& cells =
- faultSieveMesh->heightStratum(0);
- assert(!cells.isNull());
- const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
- const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
-
- // Compute orientation of fault at constraint vertices
-
- // Get section containing coordinates of vertices
- const ALE::Obj<RealSection>& coordinatesSection =
- faultSieveMesh->getRealSection("coordinates");
- assert(!coordinatesSection.isNull());
- topology::Mesh::RestrictVisitor coordinatesVisitor(*coordinatesSection,
- coordinatesCell.size(), &coordinatesCell[0]);
-
- // Set orientation function
- assert(cohesiveDim == _quadrature->cellDim());
- assert(spaceDim == _quadrature->spaceDim());
-
- // Loop over cohesive cells, computing orientation weighted by
- // jacobian at constraint vertices
-
- const ALE::Obj<SieveSubMesh::sieve_type>& sieve = faultSieveMesh->getSieve();
- assert(!sieve.isNull());
- typedef ALE::SieveAlg<SieveSubMesh> SieveAlg;
-
- ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type>
- ncV(*sieve, (size_t) pow(sieve->getMaxConeSize(), std::max(0,
- faultSieveMesh->depth())));
-
- for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
- != cellsEnd; ++c_iter) {
- // Get orientations at fault cell's vertices.
- coordinatesVisitor.clear();
- faultSieveMesh->restrictClosure(*c_iter, coordinatesVisitor);
-
- ncV.clear();
- ALE::ISieveTraversal<SieveSubMesh::sieve_type>::orientedClosure(*sieve,
- *c_iter, ncV);
- const int coneSize = ncV.getSize();
- const Mesh::point_type *cone = ncV.getPoints();
-
- for (int v = 0; v < coneSize; ++v) {
- // Compute Jacobian and determinant of Jacobian at vertex
- memcpy(&refCoordsVertex[0], &verticesRef[v * cohesiveDim], cohesiveDim
- * sizeof(double));
- cellGeometry.jacobian(&jacobian, &jacobianDet, coordinatesCell,
- refCoordsVertex);
-
- // Compute orientation
- cellGeometry.orientation(&orientationVertex, jacobian, jacobianDet,
- upDirArray);
-
- // Update orientation
- orientationSection->updateAddPoint(cone[v], &orientationVertex[0]);
- } // for
- } // for
-
- //orientation.view("ORIENTATION BEFORE COMPLETE");
-
- // Assemble orientation information
- orientation.complete();
-
- // Loop over vertices, make orientation information unit magnitude
- double_array vertexDir(orientationSize);
- int count = 0;
- for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd; ++v_iter, ++count) {
- orientationVertex = 0.0;
- orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
- orientationVertex.size());
- for (int iDim = 0; iDim < spaceDim; ++iDim) {
- double mag = 0;
- for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
- mag += pow(orientationVertex[index + jDim], 2);
- mag = sqrt(mag);
- assert(mag > 0.0);
- for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
- orientationVertex[index + jDim] /= mag;
- } // for
-
- orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
- } // for
- PetscLogFlops(count * orientationSize * 4);
-
- if (2 == cohesiveDim && vertices->size() > 0) {
- // Check orientation of first vertex, if dot product of fault
- // normal with preferred normal is negative, flip up/down dip
- // direction.
- //
- // If the user gives the correct normal direction (points from
- // footwall to ahanging wall), we should end up with
- // left-lateral-slip, reverse-slip, and fault-opening for positive
- // slip values.
- //
- // When we flip the up/down dip direction, we create a left-handed
- // strike/dip/normal coordinate system, but it gives the correct
- // sense of slip. In reality the strike/dip/normal directions that
- // are used are the opposite of what we would want, but we cannot
- // flip the fault normal direction because it is tied to how the
- // cohesive cells are created.
-
- assert(vertices->size() > 0);
- orientationSection->restrictPoint(*vertices->begin(),
- &orientationVertex[0], orientationVertex.size());
-
- assert(3 == spaceDim);
- double_array normalDirVertex(&orientationVertex[6], 3);
- const double normalDot = normalDir[0] * normalDirVertex[0] + normalDir[1]
- * normalDirVertex[1] + normalDir[2] * normalDirVertex[2];
-
- const int istrike = 0;
- const int idip = 3;
- const int inormal = 6;
- if (normalDot < 0.0) {
- // Flip dip direction
- for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd; ++v_iter) {
- orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
- orientationVertex.size());
- assert(9 == orientationSection->getFiberDimension(*v_iter));
- for (int iDim = 0; iDim < 3; ++iDim) // flip dip
- orientationVertex[idip + iDim] *= -1.0;
-
- // Update direction
- orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
- } // for
- PetscLogFlops(5 + count * 3);
- } // if
- } // if
-
- //orientation.view("ORIENTATION");
-} // _calcOrientation
-
-// ----------------------------------------------------------------------
-void
-pylith::faults::FaultCohesiveKin::_calcArea(void)
-{ // _calcArea
- assert(0 != _faultMesh);
- assert(0 != _fields);
-
- // Containers for area information
- const int cellDim = _quadrature->cellDim();
- const int numBasis = _quadrature->numBasis();
- const int numQuadPts = _quadrature->numQuadPts();
- const int spaceDim = _quadrature->spaceDim();
- const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
- const double_array& quadWts = _quadrature->quadWts();
- assert(quadWts.size() == numQuadPts);
- double jacobianDet = 0;
- double_array areaCell(numBasis);
-
- // Get vertices in fault mesh.
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- const SieveSubMesh::label_sequence::iterator verticesBegin =
- vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Allocate area field.
- _fields->add("area", "area");
-
- topology::Field<topology::SubMesh>& area = _fields->get("area");
- const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- area.newSection(slip, 1);
- area.allocate();
- area.zero();
- const ALE::Obj<RealSection>& areaSection = area.section();
- assert(!areaSection.isNull());
- topology::Mesh::UpdateAddVisitor areaVisitor(*areaSection, &areaCell[0]);
-
- double_array coordinatesCell(numBasis * spaceDim);
- const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
- "coordinates");
- assert(!coordinates.isNull());
- topology::Mesh::RestrictVisitor coordsVisitor(*coordinates,
- coordinatesCell.size(), &coordinatesCell[0]);
-
- const ALE::Obj<SieveSubMesh::label_sequence>& cells =
- faultSieveMesh->heightStratum(0);
- assert(!cells.isNull());
- const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
- const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
-
- // Loop over cells in fault mesh, compute area
- for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
- != cellsEnd; ++c_iter) {
- areaCell = 0.0;
-
- // Compute geometry information for current cell
-#if defined(PRECOMPUTE_GEOMETRY)
- _quadrature->retrieveGeometry(*c_iter);
-#else
- coordsVisitor.clear();
- faultSieveMesh->restrictClosure(*c_iter, coordsVisitor);
- _quadrature->computeGeometry(coordinatesCell, *c_iter);
-#endif
-
- // Get cell geometry information that depends on cell
- const double_array& basis = _quadrature->basis();
- const double_array& jacobianDet = _quadrature->jacobianDet();
-
- // Compute area
- for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
- const double wt = quadWts[iQuad] * jacobianDet[iQuad];
- for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
- const double dArea = wt * basis[iQuad * numBasis + iBasis];
- areaCell[iBasis] += dArea;
- } // for
- } // for
- areaVisitor.clear();
- faultSieveMesh->updateClosure(*c_iter, areaVisitor);
-
- PetscLogFlops( numQuadPts*(1+numBasis*2) );
- } // for
-
- // Assemble area information
- area.complete();
-
-#if 0 // DEBUGGING
- area.view("AREA");
- //_faultMesh->getSendOverlap()->view("Send fault overlap");
- //_faultMesh->getRecvOverlap()->view("Receive fault overlap");
-#endif
-} // _calcArea
-
-// ----------------------------------------------------------------------
-// Compute change in tractions on fault surface using solution.
-// NOTE: We must convert vertex labels to fault vertex labels
-void
-pylith::faults::FaultCohesiveKin::_calcTractionsChange(
- topology::Field<topology::SubMesh>* tractions,
- const topology::Field<topology::Mesh>& dispT)
-{ // _calcTractionsChange
- assert(0 != tractions);
- assert(0 != _faultMesh);
- assert(0 != _fields);
- assert(0 != _normalizer);
-
- tractions->label("traction_change");
- tractions->scale(_normalizer->pressureScale());
-
- // Fiber dimension of tractions matches spatial dimension.
- const int fiberDim = _quadrature->spaceDim();
- double_array tractionsVertex(fiberDim);
-
- // Get sections.
- const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
- assert(!areaSection.isNull());
- const ALE::Obj<RealSection>& dispTSection = dispT.section();
- assert(!dispTSection.isNull());
-
- // Allocate buffer for tractions field (if necessary).
- const ALE::Obj<RealSection>& tractionsSection = tractions->section();
- if (tractionsSection.isNull()) {
- ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
- //logger.stagePush("Fault");
-
- const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- tractions->newSection(slip, fiberDim);
- tractions->allocate();
-
- //logger.stagePop();
- } // if
- assert(!tractionsSection.isNull());
- tractions->zero();
-
- const double pressureScale = tractions->scale();
-
- const int numVertices = _cohesiveVertices.size();
- for (int iVertex=0; iVertex < numVertices; ++iVertex) {
- const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
- const int v_fault = _cohesiveVertices[iVertex].fault;
-
- assert(fiberDim == dispTSection->getFiberDimension(v_lagrange));
- assert(fiberDim == tractionsSection->getFiberDimension(v_fault));
- assert(1 == areaSection->getFiberDimension(v_fault));
-
- const double* dispTVertex = dispTSection->restrictPoint(v_lagrange);
- assert(0 != dispTVertex);
- const double* areaVertex = areaSection->restrictPoint(v_fault);
- assert(0 != areaVertex);
-
- for (int i = 0; i < fiberDim; ++i)
- tractionsVertex[i] = dispTVertex[i] / areaVertex[0];
-
- assert(tractionsVertex.size() == tractionsSection->getFiberDimension(v_fault));
- tractionsSection->updatePoint(v_fault, &tractionsVertex[0]);
- } // for
-
- PetscLogFlops(numVertices * (1 + fiberDim) );
-
-#if 0 // DEBUGGING
- tractions->view("TRACTIONS");
-#endif
-} // _calcTractionsChange
-
-// ----------------------------------------------------------------------
-// Allocate buffer for vector field.
-void
-pylith::faults::FaultCohesiveKin::_allocateBufferVectorField(void)
-{ // _allocateBufferVectorField
- assert(0 != _fields);
- if (_fields->hasField("buffer (vector)"))
- return;
-
- ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
- logger.stagePush("Output");
-
- // Create vector field; use same shape/chart as slip field.
- assert(0 != _faultMesh);
- _fields->add("buffer (vector)", "buffer");
- topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (vector)");
- const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
- buffer.cloneSection(slip);
- buffer.zero();
-
- logger.stagePop();
-} // _allocateBufferVectorField
-
-// ----------------------------------------------------------------------
-// Allocate buffer for scalar field.
-void
-pylith::faults::FaultCohesiveKin::_allocateBufferScalarField(void)
-{ // _allocateBufferScalarField
- assert(0 != _fields);
- if (_fields->hasField("buffer (scalar)"))
- return;
-
- ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
- logger.stagePush("Output");
-
- // Create vector field; use same shape/chart as area field.
- assert(0 != _faultMesh);
- _fields->add("buffer (scalar)", "buffer");
- topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (scalar)");
- const topology::Field<topology::SubMesh>& area = _fields->get("area");
- buffer.cloneSection(area);
- buffer.zero();
-
- logger.stagePop();
-} // _allocateBufferScalarField
-
-
// End of file
Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -20,74 +20,17 @@
#define pylith_faults_faultcohesivekin_hh
// Include directives ---------------------------------------------------
-#include "FaultCohesive.hh" // ISA FaultCohesive
+#include "FaultCohesiveLagrange.hh" // ISA FaultCohesive
-#include "pylith/topology/SubMesh.hh" // ISA Integrator<Quadrature<SubMesh> >
-#include "pylith/feassemble/Quadrature.hh" // ISA Integrator<Quadrature>
-#include "pylith/feassemble/Integrator.hh" // ISA Integrator
-
#include <string> // HASA std::string
+#include <map> // HASA std::map
// FaultCohesiveKin -----------------------------------------------------
/**
* @brief C++ implementation for a fault surface with kinematic
* (prescribed) slip implemented with cohesive elements.
- *
- * Fault boundary condition is specified using Lagrange
- * multipliers. The constraints are associated with "constraint"
- * vertices which sit between the pair of vertices on each side of the
- * fault.
- *
- * The ordering of vertices in a cohesive cell is the vertices on the
- * "negative" side of the fault, the corresponding entries on the
- * "positive" side of the fault, and then the corresponding constraint
- * vertices.
- *
- * The system without Lagrange multipliers is
- *
- * [A(t+dt)]{u(t+dt)} = {b(t+dt)}
- *
- * With Lagrange multipliers this system becomes
- *
- * [A(t+dt) C^T ]{ u(t+dt) } = {b(t+dt)}
- * [ C 0 ]{ L(t+dt) } {D(t+dt)}
- *
- * where C is the matrix of Lagrange constraints, L is the vector of
- * Lagrange multiplies (internal forces in this case), and D is the
- * fault slip.
- *
- * We solve for the increment in the displacement field, so we rewrite
- * the system as
- *
- * [A(t+dt) C^T ]{ du(t) } = {b(t+dt)} - [A(t+dt) C^T ]{ u(t) }
- * [ C 0 ]{ dL(t) } {D(t+dt)} [ C 0 ]{ L(t) }
- *
- * We form the residual as
- *
- * {r(t+dt)} = {b(t+dt)} - [A(t+dt) C^T ]{ u(t)+du(t) }
- * {D(t+dt)} [ C 0 ]{ L(t)+dL(t) }
- *
- * The terms in the residual contributing to the DOF at the Lagrange
- * vertices are
- *
- * {r(t+dt)} = {D(t+dt)} - [C]{u(t)+dt(t)}
- *
- * The first term, {D(t+dt)}, does not involve integration over the
- * cohesive cells, so it does not require assembling over cohesive
- * cells or processors. We compute the term in
- * integrateResidualAssembled().
- *
- * The term in the residual contributing to the DOF at the
- * non-Lagrange vertices of the cohesive cells is
- *
- * {r(t+dt)} = -[C]^T{L(t)+dL(t)}
- *
- * We integrate the Lagrange multiplier term and the relative
- * displacement term over the cohesive cells, because this introduces
- * weighting of the orientation of the fault for the direction of slip
- * at the vertices of the cohesive cells.
*/
-class pylith::faults::FaultCohesiveKin : public FaultCohesive
+class pylith::faults::FaultCohesiveKin : public FaultCohesiveLagrange
{ // class FaultCohesiveKin
friend class TestFaultCohesiveKin; // unit testing
@@ -98,11 +41,9 @@
FaultCohesiveKin(void);
/// Destructor.
- virtual
~FaultCohesiveKin(void);
/// Deallocate PETSc and local data structures.
- virtual
void deallocate(void);
/** Set kinematic earthquake sources.
@@ -132,12 +73,6 @@
const double upDir[3],
const double normalDir[3]);
- /** Split solution field for separate preconditioning.
- *
- * @param field Solution field.
- */
- void splitField(topology::Field<topology::Mesh>* field);
-
/** Integrate contributions to residual term (r) for operator that
* do not require assembly across cells, vertices, or processors.
*
@@ -149,55 +84,6 @@
const double t,
topology::SolutionFields* const fields);
- /** Integrate contributions to Jacobian matrix (A) associated with
- * operator that do not require assembly across cells, vertices, or
- * processors.
- *
- * @param jacobian Sparse matrix
- * @param t Current time
- * @param fields Solution fields
- */
- void integrateJacobianAssembled(topology::Jacobian* jacobian,
- const double t,
- topology::SolutionFields* const fields);
-
- /** Integrate contributions to Jacobian matrix (A) associated with
- * operator that do not require assembly across cells, vertices, or
- * processors.
- *
- * @param jacobian Diagonal Jacobian matrix as a field.
- * @param t Current time
- * @param fields Solution fields
- */
- void integrateJacobianAssembled(topology::Field<topology::Mesh>* jacobian,
- const double t,
- topology::SolutionFields* const fields);
-
- /** Update state variables as needed.
- *
- * @param t Current time
- * @param fields Solution fields
- * @param mesh Finite-element mesh
- */
- void updateStateVars(const double t,
- topology::SolutionFields* const fields);
-
- /** Adjust solution from solver with lumped Jacobian to match Lagrange
- * multiplier constraints.
- *
- * @param solution Solution field.
- * @param jacobian Jacobian of the system.
- * @param residual Residual field.
- */
- void adjustSolnLumped(topology::SolutionFields* fields,
- const topology::Field<topology::Mesh>& jacobian);
-
- /** Verify configuration is acceptable.
- *
- * @param mesh Finite-element mesh
- */
- void verifyConfiguration(const topology::Mesh& mesh) const;
-
/** Get vertex field associated with integrator.
*
* @param name Name of cell field.
@@ -218,85 +104,11 @@
cellField(const char* name,
const topology::SolutionFields* fields =0);
- /** Get fields associated with fault.
- *
- * @returns Fields associated with fault.
- */
- const topology::Fields<topology::Field<topology::SubMesh> >*
- fields(void) const;
-
- // PROTECTED STRUCTS //////////////////////////////////////////////////
-protected :
-
- /** Data structure to hold relations between vertices in cohesive cell
- * in mesh of domain and cell of fault mesh.
- */
- struct CohesiveInfo {
- int lagrange; ///< Vertex associated with Lagrange multiplier.
- int positive; ///< Vertex on positive side of the fault.
- int negative; ///< Vertex on negative side of the fault.
- int fault; ///< Vertex in fault mesh.
- };
-
- // PROTECTED METHODS //////////////////////////////////////////////////
-protected :
-
- /** Initialize auxiliary cohesive cell information.
- *
- * @param mesh Finite-element mesh of the domain.
- */
- void _initializeCohesiveInfo(const topology::Mesh& mesh);
-
- // PROTECTED MEMBERS //////////////////////////////////////////////////
-protected :
-
- /// Array of cohesive vertex information.
- std::vector<CohesiveInfo> _cohesiveVertices;
-
- // PRIVATE METHODS ////////////////////////////////////////////////////
-private :
-
- /// Initialize logger.
- void _initializeLogger(void);
-
- /** Calculate orientation at fault vertices.
- *
- * @param upDir Direction perpendicular to along-strike direction that is
- * not collinear with fault normal (usually "up" direction but could
- * be up-dip direction; only applies to fault surfaces in a 3-D domain).
- * @param normalDir General preferred direction for fault normal
- * (used to pick which of two possible normal directions for
- * interface; only applies to fault surfaces in a 3-D domain).
- */
- void _calcOrientation(const double upDir[3],
- const double normalDir[3]);
-
- /// Calculate fault area field.
- void _calcArea(void);
-
- /** Compute change in tractions on fault surface using solution.
- *
- * @param tractions Field for tractions.
- * @param mesh Finite-element mesh for domain
- * @param solution Solution over domain
- */
- void _calcTractionsChange(topology::Field<topology::SubMesh>* tractions,
- const topology::Field<topology::Mesh>& solution);
-
- /// Allocate buffer for vector field.
- void _allocateBufferVectorField(void);
-
- /// Allocate buffer for scalar field.
- void _allocateBufferScalarField(void);
-
// PRIVATE TYPEDEFS ///////////////////////////////////////////////////
private :
typedef std::map<std::string, EqKinSrc*> srcs_type;
- // PRIVATE STRUCTS ////////////////////////////////////////////////////
-private :
-
// PRIVATE MEMBERS ////////////////////////////////////////////////////
private :
@@ -313,8 +125,6 @@
}; // class FaultCohesiveKin
-#include "FaultCohesiveKin.icc" // inline methods
-
#endif // pylith_faults_faultcohesivekin_hh
Deleted: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.icc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.icc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,25 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#if !defined(pylith_faults_faultcohesivekin_hh)
-#error "FaultCohesiveKin.icc can only be included from FaultCohesiveKin.hh"
-#endif
-
-// Get fields associated with fault.
-inline
-const pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> >*
-pylith::faults::FaultCohesiveKin::fields(void) const {
- return _fields;
-} // fields
-
-
-// End of file
Added: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.cc (rev 0)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,1372 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "FaultCohesiveLagrange.hh" // implementation of object methods
+
+#include "CohesiveTopology.hh" // USES CohesiveTopology
+
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
+#include "pylith/feassemble/CellGeometry.hh" // USES CellGeometry
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/topology/Field.hh" // USES Field
+#include "pylith/topology/Fields.hh" // USES Fields
+#include "pylith/topology/Jacobian.hh" // USES Jacobian
+#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+
+#include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
+#include "spatialdata/spatialdb/SpatialDB.hh" // USES SpatialDB
+
+#include <cmath> // USES pow(), sqrt()
+#include <strings.h> // USES strcasecmp()
+#include <cstring> // USES strlen()
+#include <cstdlib> // USES atoi()
+#include <cassert> // USES assert()
+#include <sstream> // USES std::ostringstream
+#include <stdexcept> // USES std::runtime_error
+
+//#define PRECOMPUTE_GEOMETRY
+//#define DETAILED_EVENT_LOGGING
+
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
+
+// ----------------------------------------------------------------------
+// Default constructor.
+pylith::faults::FaultCohesiveLagrange::FaultCohesiveLagrange(void)
+{ // constructor
+ _useLagrangeConstraints = true;
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor.
+pylith::faults::FaultCohesiveLagrange::~FaultCohesiveLagrange(void)
+{ // destructor
+ deallocate();
+} // destructor
+
+// ----------------------------------------------------------------------
+// Deallocate PETSc and local data structures.
+void
+pylith::faults::FaultCohesiveLagrange::deallocate(void)
+{ // deallocate
+ FaultCohesive::deallocate();
+
+} // deallocate
+
+// ----------------------------------------------------------------------
+// Initialize fault. Determine orientation and setup boundary
+void
+pylith::faults::FaultCohesiveLagrange::initialize(const topology::Mesh& mesh,
+ const double upDir[3],
+ const double normalDir[3])
+{ // initialize
+ assert(0 != upDir);
+ assert(0 != normalDir);
+ assert(0 != _quadrature);
+ assert(0 != _normalizer);
+
+ _initializeLogger();
+
+ const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
+ assert(0 != cs);
+
+ delete _faultMesh;
+ _faultMesh = new topology::SubMesh();
+ CohesiveTopology::createFaultParallel(_faultMesh, mesh, id(),
+ _useLagrangeConstraints);
+ _initializeCohesiveInfo(mesh);
+
+ delete _fields;
+ _fields = new topology::Fields<topology::Field<topology::SubMesh> >(
+ *_faultMesh);
+
+ ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+ //logger.stagePush("Fault");
+
+ // Allocate slip field
+ const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+ assert(!faultSieveMesh.isNull());
+ const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+ faultSieveMesh->depthStratum(0);
+ assert(!vertices.isNull());
+ _fields->add("slip", "slip");
+ topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+ slip.newSection(vertices, cs->spaceDim());
+ slip.allocate();
+ slip.vectorFieldType(topology::FieldBase::VECTOR);
+ slip.scale(_normalizer->lengthScale());
+
+ const ALE::Obj<SieveSubMesh::label_sequence>& cells =
+ faultSieveMesh->heightStratum(0);
+ assert(!cells.isNull());
+ const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
+ const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
+ _quadrature->initializeGeometry();
+#if defined(PRECOMPUTE_GEOMETRY)
+ _quadrature->computeGeometry(*_faultMesh, cells);
+#endif
+
+ // Compute orientation at vertices in fault mesh.
+ _calcOrientation(upDir, normalDir);
+
+ // Compute tributary area for each vertex in fault mesh.
+ _calcArea();
+
+ //logger.stagePop();
+} // initialize
+
+// ----------------------------------------------------------------------
+void
+pylith::faults::FaultCohesiveLagrange::splitField(topology::Field<
+ topology::Mesh>* field)
+{ // splitField
+ assert(0 != field);
+
+ const ALE::Obj<RealSection>& section = field->section();
+ assert(!section.isNull());
+ if (0 == section->getNumSpaces())
+ return; // Return if there are no fibrations
+
+ const int spaceDim = field->mesh().dimension();
+ const int fibrationLagrange = spaceDim;
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+ assert(spaceDim == section->getFiberDimension(v_lagrange));
+ // Reset displacement fibration fiber dimension to zero.
+ for (int fibration=0; fibration < spaceDim; ++fibration)
+ section->setFiberDimension(v_lagrange, 0, fibration);
+ // Set Lagrange fibration fiber dimension.
+ section->setFiberDimension(v_lagrange, spaceDim, fibrationLagrange);
+ } // for
+} // splitField
+
+// ----------------------------------------------------------------------
+// Integrate contribution of cohesive cells to residual term that do
+// not require assembly across cells, vertices, or processors.
+void
+pylith::faults::FaultCohesiveLagrange::integrateResidualAssembled(const topology::Field<
+ topology::Mesh>& residual,
+ const double t,
+ topology::SolutionFields* const fields) { // integrateResidualAssembled
+ assert(0 != fields);
+ assert(0 != _fields);
+ assert(0 != _logger);
+
+ // Cohesive cells with normal vertices i and j, and constraint
+ // vertex k make contributions to the assembled residual:
+ //
+ // * DOF i and j: internal forces in soln field associated with
+ // slip -[C]^T{L(t)+dL(t)}
+ // * DOF k: slip values -[C]{u(t)+dt(t)}
+ // * DOF k: slip values {D(t+dt)}
+
+ const int setupEvent = _logger->eventId("FaIR setup");
+ const int geometryEvent = _logger->eventId("FaIR geometry");
+ const int computeEvent = _logger->eventId("FaIR compute");
+ const int restrictEvent = _logger->eventId("FaIR restrict");
+ const int updateEvent = _logger->eventId("FaIR update");
+
+ _logger->eventBegin(setupEvent);
+
+ // Get cell information and setup storage for cell data
+ const int spaceDim = _quadrature->spaceDim();
+ const int orientationSize = spaceDim * spaceDim;
+
+ // Allocate vectors for vertex values
+ double_array slipVertex(spaceDim);
+ double_array orientationVertex(orientationSize);
+ double_array dispTVertexN(spaceDim);
+ double_array dispTVertexP(spaceDim);
+ double_array dispTVertexL(spaceDim);
+ double_array dispTIncrVertexN(spaceDim);
+ double_array dispTIncrVertexP(spaceDim);
+ double_array dispTIncrVertexL(spaceDim);
+ double_array dispTpdtVertexN(spaceDim);
+ double_array dispTpdtVertexP(spaceDim);
+ double_array dispTpdtVertexL(spaceDim);
+ double_array residualVertexN(spaceDim);
+ double_array residualVertexP(spaceDim);
+ double_array residualVertexL(spaceDim);
+
+ // Get sections
+ topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+ const ALE::Obj<RealSection>& slipSection = slip.section();
+ assert(!slipSection.isNull());
+
+ const ALE::Obj<RealSection>& residualSection = residual.section();
+ assert(!residualSection.isNull());
+
+ const ALE::Obj<RealSection>& orientationSection =
+ _fields->get("orientation").section();
+ assert(!orientationSection.isNull());
+
+ topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
+ const ALE::Obj<RealSection>& dispTSection = dispT.section();
+ assert(!dispTSection.isNull());
+
+ topology::Field<topology::Mesh>& dispTIncr = fields->get("dispIncr(t->t+dt)");
+ const ALE::Obj<RealSection>& dispTIncrSection = dispTIncr.section();
+ assert(!dispTIncrSection.isNull());
+
+ _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(computeEvent);
+#endif
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+ const int v_fault = _cohesiveVertices[iVertex].fault;
+ const int v_negative = _cohesiveVertices[iVertex].negative;
+ const int v_positive = _cohesiveVertices[iVertex].positive;
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(restrictEvent);
+#endif
+
+ slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+
+ // Get orientations at fault cell's vertices.
+ orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
+
+ // Get disp(t) at conventional vertices and Lagrange vertex.
+ dispTSection->restrictPoint(v_negative, &dispTVertexN[0], dispTVertexN.size());
+ dispTSection->restrictPoint(v_positive, &dispTVertexP[0], dispTVertexP.size());
+ dispTSection->restrictPoint(v_lagrange, &dispTVertexL[0], dispTVertexL.size());
+
+ // Get dispIncr(t->t+dt) at conventional vertices and Lagrange vertex.
+ dispTIncrSection->restrictPoint(v_negative, &dispTIncrVertexN[0], dispTIncrVertexN.size());
+ dispTIncrSection->restrictPoint(v_positive, &dispTIncrVertexP[0], dispTIncrVertexP.size());
+ dispTIncrSection->restrictPoint(v_lagrange, &dispTIncrVertexL[0], dispTIncrVertexL.size());
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(restrictEvent);
+ _logger->eventBegin(computeEvent);
+#endif
+
+ // Compute current estimate of displacement at time t+dt using
+ // solution increment.
+ dispTpdtVertexN = dispTVertexN + dispTIncrVertexN;
+ dispTpdtVertexP = dispTVertexP + dispTIncrVertexP;
+ dispTpdtVertexL = dispTVertexL + dispTIncrVertexL;
+
+ // Entries associated with constraint forces applied at negative vertex
+ residualVertexN = 0.0;
+ for (int iDim = 0; iDim < spaceDim; ++iDim)
+ for (int kDim = 0; kDim < spaceDim; ++kDim)
+ residualVertexN[iDim] -= dispTpdtVertexL[kDim] * -orientationVertex[kDim*spaceDim+iDim];
+
+ // Entries associated with constraint forces applied at positive vertex
+ residualVertexP = -residualVertexN;
+
+ // Entries associated with relative displacements between positive
+ // and negative vertices for Lagrange vertex.
+ residualVertexL = slipVertex;
+ for (int kDim = 0; kDim < spaceDim; ++kDim)
+ for (int iDim = 0; iDim < spaceDim; ++iDim)
+ residualVertexL[kDim] -= (dispTpdtVertexP[iDim] - dispTpdtVertexN[iDim])
+ * orientationVertex[kDim*spaceDim+iDim];
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(computeEvent);
+ _logger->eventBegin(updateEvent);
+#endif
+
+ assert(residualVertexN.size() == residualSection->getFiberDimension(v_negative));
+ residualSection->updateAddPoint(v_negative, &residualVertexN[0]);
+
+ assert(residualVertexP.size() == residualSection->getFiberDimension(v_positive));
+ residualSection->updateAddPoint(v_positive, &residualVertexP[0]);
+
+ assert(residualVertexL.size() == residualSection->getFiberDimension(v_lagrange));
+ residualSection->updateAddPoint(v_lagrange, &residualVertexL[0]);
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(updateEvent);
+#endif
+ } // for
+ PetscLogFlops(numVertices*spaceDim*spaceDim*8);
+
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(computeEvent);
+#endif
+} // integrateResidualAssembled
+
+// ----------------------------------------------------------------------
+// Compute Jacobian matrix (A) associated with operator that do not
+// require assembly across cells, vertices, or processors.
+void
+pylith::faults::FaultCohesiveLagrange::integrateJacobianAssembled(topology::Jacobian* jacobian,
+ const double t,
+ topology::SolutionFields* const fields)
+{ // integrateJacobianAssembled
+ assert(0 != jacobian);
+ assert(0 != fields);
+ assert(0 != _fields);
+ assert(0 != _logger);
+
+ const int setupEvent = _logger->eventId("FaIJ setup");
+ const int geometryEvent = _logger->eventId("FaIJ geometry");
+ const int computeEvent = _logger->eventId("FaIJ compute");
+ const int restrictEvent = _logger->eventId("FaIJ restrict");
+ const int updateEvent = _logger->eventId("FaIJ update");
+
+ _logger->eventBegin(setupEvent);
+
+ // Add constraint information to Jacobian matrix; these are the
+ // direction cosines. Entries are associated with vertices ik, jk,
+ // ki, and kj.
+
+ // Get cell information and setup storage for cell data
+ const int spaceDim = _quadrature->spaceDim();
+ const int orientationSize = spaceDim * spaceDim;
+
+ // Allocate vectors for vertex values
+ double_array orientationVertex(orientationSize);
+ double_array jacobianVertex(spaceDim*spaceDim);
+ int_array indicesL(spaceDim);
+ int_array indicesN(spaceDim);
+ int_array indicesP(spaceDim);
+ int_array indicesRel(spaceDim);
+ for (int i=0; i < spaceDim; ++i)
+ indicesRel[i] = i;
+
+ // Get sections
+ const ALE::Obj<RealSection>& solutionSection = fields->solution().section();
+ assert(!solutionSection.isNull());
+
+ const ALE::Obj<RealSection>& orientationSection =
+ _fields->get("orientation").section();
+ assert(!orientationSection.isNull());
+
+ const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+ assert(!sieveMesh.isNull());
+ const ALE::Obj<SieveMesh::order_type>& globalOrder =
+ sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
+ solutionSection);
+ assert(!globalOrder.isNull());
+
+ const PetscMat jacobianMatrix = jacobian->matrix();
+ assert(0 != jacobianMatrix);
+
+ _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(computeEvent);
+#endif
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+ const int v_fault = _cohesiveVertices[iVertex].fault;
+ const int v_negative = _cohesiveVertices[iVertex].negative;
+ const int v_positive = _cohesiveVertices[iVertex].positive;
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(restrictEvent);
+#endif
+
+ // Get orientations at fault cell's vertices.
+ orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
+
+ // Set global order indices
+ indicesL = indicesRel + globalOrder->getIndex(v_lagrange);
+ indicesN = indicesRel + globalOrder->getIndex(v_negative);
+ indicesP = indicesRel + globalOrder->getIndex(v_positive);
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(restrictEvent);
+ _logger->eventBegin(updateEvent);
+#endif
+
+ // Values associated with [C]
+ // Values at positive vertex, entry L,P in Jacobian
+ jacobianVertex = orientationVertex;
+ MatSetValues(jacobianMatrix,
+ indicesL.size(), &indicesL[0],
+ indicesP.size(), &indicesP[0],
+ &jacobianVertex[0],
+ INSERT_VALUES);
+
+ // Values at negative vertex, entry L,N in Jacobian
+ jacobianVertex *= -1.0;
+ MatSetValues(jacobianMatrix,
+ indicesL.size(), &indicesL[0],
+ indicesN.size(), &indicesN[0],
+ &jacobianVertex[0],
+ INSERT_VALUES);
+
+ // Values associated with [C]^T
+ // Transpose orientation matrix
+ for (int iDim=0; iDim < spaceDim; ++iDim)
+ for (int jDim=0; jDim < spaceDim; ++jDim)
+ jacobianVertex[iDim*spaceDim+jDim] = orientationVertex[jDim*spaceDim+iDim];
+ // Values at positive vertex, entry P,L in Jacobian
+ MatSetValues(jacobianMatrix,
+ indicesP.size(), &indicesP[0],
+ indicesL.size(), &indicesL[0],
+ &jacobianVertex[0],
+ INSERT_VALUES);
+
+ // Values at negative vertex, entry L,N in Jacobian
+ jacobianVertex *= -1.0;
+ MatSetValues(jacobianMatrix,
+ indicesN.size(), &indicesN[0],
+ indicesL.size(), &indicesL[0],
+ &jacobianVertex[0],
+ INSERT_VALUES);
+
+ // Values at Lagrange vertex, entry L,L in Jacobian
+ jacobianVertex = 0.0;
+ MatSetValues(jacobianMatrix,
+ indicesL.size(), &indicesL[0],
+ indicesL.size(), &indicesL[0],
+ &jacobianVertex[0],
+ INSERT_VALUES);
+
+#if defined(DETAILED_EVENT_LOGGING)
+ PetscLogFlops(numVertices*(spaceDim*spaceDim*2));
+ _logger->eventBegin(updateEvent);
+#endif
+
+ } // for
+
+#if !defined(DETAILED_EVENT_LOGGING)
+ PetscLogFlops(numVertices*(spaceDim*spaceDim*2));
+ _logger->eventEnd(computeEvent);
+#endif
+
+ _needNewJacobian = false;
+} // integrateJacobianAssembled
+
+// ----------------------------------------------------------------------
+// Compute Jacobian matrix (A) associated with operator that do not
+// require assembly across cells, vertices, or processors.
+void
+pylith::faults::FaultCohesiveLagrange::integrateJacobianAssembled(
+ topology::Field<topology::Mesh>* jacobian,
+ const double t,
+ topology::SolutionFields* const fields)
+{ // integrateJacobianAssembled
+ assert(0 != jacobian);
+ assert(0 != fields);
+ assert(0 != _fields);
+ assert(0 != _logger);
+
+ const int setupEvent = _logger->eventId("FaIJ setup");
+ const int geometryEvent = _logger->eventId("FaIJ geometry");
+ const int computeEvent = _logger->eventId("FaIJ compute");
+ const int restrictEvent = _logger->eventId("FaIJ restrict");
+ const int updateEvent = _logger->eventId("FaIJ update");
+
+ _logger->eventBegin(setupEvent);
+
+ // Add ones to diagonal Jacobian matrix (as field) for
+ // convenience. Instead of including the constraints in the Jacobian
+ // matrix, we adjust the solution to account for the Lagrange
+ // multipliers as part of the solve.
+
+ const int spaceDim = _quadrature->spaceDim();
+ double_array jacobianVertex(spaceDim);
+ jacobianVertex = 1.0;
+ const ALE::Obj<RealSection>& jacobianSection = jacobian->section();
+ assert(!jacobianSection.isNull());
+
+ _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(computeEvent);
+#endif
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+
+ assert(jacobianSection->getFiberDimension(v_lagrange) == spaceDim);
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(updateEvent);
+#endif
+ jacobianSection->updatePoint(v_lagrange, &jacobianVertex[0]);
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(updateEvent);
+#endif
+ } // for
+ PetscLogFlops(0);
+
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(computeEvent);
+#endif
+
+ _needNewJacobian = false;
+} // integrateJacobianAssembled
+
+// ----------------------------------------------------------------------
+// Adjust solution from solver with lumped Jacobian to match Lagrange
+// multiplier constraints.
+void
+pylith::faults::FaultCohesiveLagrange::adjustSolnLumped(topology::SolutionFields* const fields,
+ const topology::Field<
+ topology::Mesh>& jacobian)
+{ // adjustSolnLumped
+ assert(0 != fields);
+ assert(0 != _quadrature);
+
+ // Cohesive cells with conventional vertices i and j, and constraint
+ // vertex k require 2 adjustments to the solution:
+ //
+ // * DOF k: Compute increment in Lagrange multipliers
+ // dl_k = S^{-1} (-C_ki (A_i^{-1} r_i - C_kj A_j^{-1} r_j + u_i - u_j) - d_k)
+ // S = C_ki (A_i^{-1} + A_j^{-1}) C_ki^T
+ // * DOF i and j: Adjust displacement increment (solution) to account
+ // for Lagrange multiplier constraints
+ // du_i = +A_i^-1 C_ki^T dlk
+ // du_j = -A_j^-1 C_kj^T dlk
+
+ const int setupEvent = _logger->eventId("FaAS setup");
+ const int geometryEvent = _logger->eventId("FaAS geometry");
+ const int computeEvent = _logger->eventId("FaAS compute");
+ const int restrictEvent = _logger->eventId("FaAS restrict");
+ const int updateEvent = _logger->eventId("FaAS update");
+
+ _logger->eventBegin(setupEvent);
+
+ // Get cell information and setup storage for cell data
+ const int spaceDim = _quadrature->spaceDim();
+ const int orientationSize = spaceDim * spaceDim;
+
+ // Get section information
+ double_array orientationVertex(orientationSize);
+ const ALE::Obj<RealSection>& orientationSection =
+ _fields->get("orientation").section();
+ assert(!orientationSection.isNull());
+
+ double_array slipVertex(spaceDim);
+ const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
+ assert(!slipSection.isNull());
+
+ double_array jacobianVertexN(spaceDim);
+ double_array jacobianVertexP(spaceDim);
+ const ALE::Obj<RealSection>& jacobianSection = jacobian.section();
+ assert(!jacobianSection.isNull());
+
+ double_array residualVertexN(spaceDim);
+ double_array residualVertexP(spaceDim);
+ const ALE::Obj<RealSection>& residualSection =
+ fields->get("residual").section();
+
+ double_array dispTVertexN(spaceDim);
+ double_array dispTVertexP(spaceDim);
+ const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
+
+ double_array solutionVertexN(spaceDim);
+ double_array solutionVertexP(spaceDim);
+ double_array solutionVertexL(spaceDim);
+ const ALE::Obj<RealSection>& solutionSection = fields->get(
+ "dispIncr(t->t+dt)").section();
+
+ _logger->eventEnd(setupEvent);
+
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(computeEvent);
+#endif
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+ const int v_fault = _cohesiveVertices[iVertex].fault;
+ const int v_negative = _cohesiveVertices[iVertex].negative;
+ const int v_positive = _cohesiveVertices[iVertex].positive;
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(restrictEvent);
+#endif
+
+ // Get orientations at fault cell's vertices.
+ orientationSection->restrictPoint(v_fault, &orientationVertex[0], orientationVertex.size());
+
+ // Get slip at fault cell's vertices.
+ slipSection->restrictPoint(v_fault, &slipVertex[0], slipVertex.size());
+
+ // Get residual at cohesive cell's vertices.
+ residualSection->restrictPoint(v_negative, &residualVertexN[0], residualVertexN.size());
+ residualSection->restrictPoint(v_positive, &residualVertexP[0], residualVertexP.size());
+
+ // Get jacobian at cohesive cell's vertices.
+ jacobianSection->restrictPoint(v_negative, &jacobianVertexN[0], jacobianVertexN.size());
+ jacobianSection->restrictPoint(v_positive, &jacobianVertexP[0], jacobianVertexP.size());
+
+ // Get disp(t) at cohesive cell's vertices.
+ dispTSection->restrictPoint(v_negative, &dispTVertexN[0], dispTVertexN.size());
+ dispTSection->restrictPoint(v_positive, &dispTVertexP[0], dispTVertexP.size());
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(restrictEvent);
+ _logger->eventBegin(computeEvent);
+#endif
+
+ switch (spaceDim) { // switch
+ case 1: {
+ assert(jacobianVertexN[0] > 0.0);
+ assert(jacobianVertexP[0] > 0.0);
+
+ const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+ / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+ // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+ const double Aru = residualVertexN[0] / jacobianVertexN[0]
+ - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+ - dispTVertexP[0];
+
+ // dl_k = D^{-1}( - C_{ki} Aru - d_k)
+ const double Aruslip = -Aru - slipVertex[0];
+ const double dlp = Sinv * Aruslip;
+
+ // Update displacements at negative vertex
+ solutionVertexN[0] = +1.0 / jacobianVertexN[0] * dlp;
+
+ // Update displacements at positive vertex
+ solutionVertexP[0] = -1.0 / jacobianVertexP[0] * dlp;
+
+ // Update Lagrange multiplier.
+ solutionVertexL[0] = dlp;
+
+ break;
+ } // case 1
+ case 2: {
+ assert(jacobianVertexN[0] > 0.0);
+ assert(jacobianVertexN[1] > 0.0);
+ assert(jacobianVertexP[0] > 0.0);
+ assert(jacobianVertexP[1] > 0.0);
+
+ const double Cpx = orientationVertex[0];
+ const double Cpy = orientationVertex[1];
+ const double Cqx = orientationVertex[2];
+ const double Cqy = orientationVertex[3];
+
+ // Check to make sure Jacobian is same at all DOF for
+ // vertices i and j (means S is diagonal with equal enties).
+ assert(jacobianVertexN[0] == jacobianVertexN[1]);
+ assert(jacobianVertexP[0] == jacobianVertexP[1]);
+
+ const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+ / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+ // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+ const double Arux = residualVertexN[0] / jacobianVertexN[0]
+ - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+ - dispTVertexP[0];
+ const double Aruy = residualVertexN[1] / jacobianVertexN[1]
+ - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
+ - dispTVertexP[1];
+
+ // dl_k = S^{-1}(-C_{ki} Aru - d_k)
+ const double Arup = Cpx * Arux + Cpy * Aruy;
+ const double Aruq = Cqx * Arux + Cqy * Aruy;
+ const double Arupslip = -Arup - slipVertex[0];
+ const double Aruqslip = -Aruq - slipVertex[1];
+ const double dlp = Sinv * Arupslip;
+ const double dlq = Sinv * Aruqslip;
+
+ const double dlx = Cpx * dlp + Cqx * dlq;
+ const double dly = Cpy * dlp + Cqy * dlq;
+
+ // Update displacements at negative vertex.
+ solutionVertexN[0] = dlx / jacobianVertexN[0];
+ solutionVertexN[1] = dly / jacobianVertexN[1];
+
+ // Update displacements at positive vertex.
+ solutionVertexP[0] = -dlx / jacobianVertexP[0];
+ solutionVertexP[1] = -dly / jacobianVertexP[0];
+
+ // Update Lagrange multiplier.
+ solutionVertexL[0] = dlp;
+ solutionVertexL[1] = dlq;
+
+ break;
+ } // case 2
+ case 3: {
+ assert(jacobianVertexN[0] > 0.0);
+ assert(jacobianVertexN[1] > 0.0);
+ assert(jacobianVertexN[2] > 0.0);
+ assert(jacobianVertexP[0] > 0.0);
+ assert(jacobianVertexP[1] > 0.0);
+ assert(jacobianVertexP[2] > 0.0);
+
+ const double Cpx = orientationVertex[0];
+ const double Cpy = orientationVertex[1];
+ const double Cpz = orientationVertex[2];
+ const double Cqx = orientationVertex[3];
+ const double Cqy = orientationVertex[4];
+ const double Cqz = orientationVertex[5];
+ const double Crx = orientationVertex[6];
+ const double Cry = orientationVertex[7];
+ const double Crz = orientationVertex[8];
+
+ // Check to make sure Jacobian is same at all DOF for
+ // vertices i and j (means S is diagonal with equal enties).
+ assert(jacobianVertexN[0] == jacobianVertexN[1] && jacobianVertexN[0] == jacobianVertexN[2]);
+ assert(jacobianVertexP[0] == jacobianVertexP[1] && jacobianVertexP[0] == jacobianVertexP[2]);
+
+ const double Sinv = jacobianVertexN[0] * jacobianVertexP[0]
+ / (jacobianVertexN[0] + jacobianVertexP[0]);
+
+ // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+ const double Arux = residualVertexN[0] / jacobianVertexN[0]
+ - residualVertexP[0] / jacobianVertexP[0] + dispTVertexN[0]
+ - dispTVertexP[0];
+ const double Aruy = residualVertexN[1] / jacobianVertexN[1]
+ - residualVertexP[1] / jacobianVertexP[1] + dispTVertexN[1]
+ - dispTVertexP[1];
+ const double Aruz = residualVertexN[2] / jacobianVertexN[2]
+ - residualVertexP[2] / jacobianVertexP[2] + dispTVertexN[2]
+ - dispTVertexP[2];
+
+ // dl_k = D^{-1}( -C_{ki} Aru - d_k)
+ const double Arup = Cpx * Arux + Cpy * Aruy + Cpz * Aruz;
+ const double Aruq = Cqx * Arux + Cqy * Aruy + Cqz * Aruz;
+ const double Arur = Crx * Arux + Cry * Aruy + Crz * Aruz;
+ const double Arupslip = -Arup - slipVertex[0];
+ const double Aruqslip = -Aruq - slipVertex[1];
+ const double Arurslip = -Arur - slipVertex[2];
+ const double dlp = Sinv * Arupslip;
+ const double dlq = Sinv * Aruqslip;
+ const double dlr = Sinv * Arurslip;
+
+ const double dlx = Cpx * dlp + Cqx * dlq + Crx * dlr;
+ const double dly = Cpy * dlp + Cqy * dlq + Cry * dlr;
+ const double dlz = Cpz * dlp + Cqz * dlq + Crz * dlr;
+
+ // Update displacements at negative vertex.
+ solutionVertexN[0] = dlx / jacobianVertexN[0];
+ solutionVertexN[1] = dly / jacobianVertexN[1];
+ solutionVertexN[2] = dlz / jacobianVertexN[2];
+
+ // Update displacements at positive vertex.
+ solutionVertexP[0] = -dlx / jacobianVertexP[0];
+ solutionVertexP[1] = -dly / jacobianVertexP[1];
+ solutionVertexP[2] = -dlz / jacobianVertexP[2];
+
+ // Update Lagrange multiplier.
+ solutionVertexL[0] = dlp;
+ solutionVertexL[1] = dlq;
+ solutionVertexL[2] = dlr;
+
+ break;
+ } // case 3
+ default:
+ assert(0);
+ throw std::logic_error("Unknown spatial dimension.");
+ } // switch
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(computeEvent);
+ _logger->eventBegin(updateEvent);
+#endif
+
+ assert(solutionVertexN.size() == solutionSection->getFiberDimension(v_negative));
+ solutionSection->updateAddPoint(v_negative, &solutionVertexN[0]);
+
+ assert(solutionVertexP.size() == solutionSection->getFiberDimension(v_positive));
+ solutionSection->updateAddPoint(v_positive, &solutionVertexP[0]);
+
+ assert(solutionVertexL.size() == solutionSection->getFiberDimension(v_lagrange));
+ solutionSection->updateAddPoint(v_lagrange, &solutionVertexL[0]);
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(updateEvent);
+#endif
+ } // for
+
+ switch(spaceDim) {
+ case 1:
+ PetscLogFlops(numVertices*17);
+ break;
+ case 2:
+ PetscLogFlops(numVertices*41);
+ break;
+ case 3:
+ PetscLogFlops(numVertices*72);
+ break;
+ default:
+ assert(0);
+ throw std::logic_error("Unknown spatial dimension.");
+ } // switch
+
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(computeEvent);
+#endif
+} // adjustSolnLumped
+
+// ----------------------------------------------------------------------
+// Verify configuration is acceptable.
+void
+pylith::faults::FaultCohesiveLagrange::verifyConfiguration(const topology::Mesh& mesh) const
+{ // verifyConfiguration
+ assert(0 != _quadrature);
+
+ const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+ assert(!sieveMesh.isNull());
+
+ if (!sieveMesh->hasIntSection(label())) {
+ std::ostringstream msg;
+ msg << "Mesh missing group of vertices '" << label()
+ << " for boundary condition.";
+ throw std::runtime_error(msg.str());
+ } // if
+
+ // check compatibility of mesh and quadrature scheme
+ const int dimension = mesh.dimension() - 1;
+ if (_quadrature->cellDim() != dimension) {
+ std::ostringstream msg;
+ msg << "Dimension of reference cell in quadrature scheme ("
+ << _quadrature->cellDim()
+ << ") does not match dimension of cells in mesh (" << dimension
+ << ") for fault '" << label() << "'.";
+ throw std::runtime_error(msg.str());
+ } // if
+
+ const int numCorners = _quadrature->refGeometry().numCorners();
+ const ALE::Obj<SieveMesh::label_sequence>& cells =
+ sieveMesh->getLabelStratum("material-id", id());
+ assert(!cells.isNull());
+ const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
+ const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
+ for (SieveMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
+ != cellsEnd; ++c_iter) {
+ const int cellNumCorners = sieveMesh->getNumCellCorners(*c_iter);
+ if (3 * numCorners != cellNumCorners) {
+ std::ostringstream msg;
+ msg << "Number of vertices in reference cell (" << numCorners
+ << ") is not compatible with number of vertices (" << cellNumCorners
+ << ") in cohesive cell " << *c_iter << " for fault '" << label()
+ << "'.";
+ throw std::runtime_error(msg.str());
+ } // if
+ } // for
+} // verifyConfiguration
+
+// ----------------------------------------------------------------------
+// Initialize auxiliary cohesive cell information.
+void pylith::faults::FaultCohesiveLagrange::_initializeCohesiveInfo(const topology::Mesh& mesh)
+{ // _initializeCohesiveInfo
+ assert(0 != _quadrature);
+
+ // Get cohesive cells
+ const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+ assert(!sieveMesh.isNull());
+ const ALE::Obj<SieveMesh::label_sequence>& cells =
+ sieveMesh->getLabelStratum("material-id", id());
+ assert(!cells.isNull());
+ const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
+ const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
+
+ const int numConstraintVert = _quadrature->numBasis();
+ const int numCorners = 3 * numConstraintVert; // cohesive cell
+
+ const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+ assert(!faultSieveMesh.isNull());
+ SubMesh::renumbering_type& renumbering = faultSieveMesh->getRenumbering();
+ const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
+ renumbering.end();
+ const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+ faultSieveMesh->depthStratum(0);
+
+ typedef std::map<int, int> indexmap_type;
+ indexmap_type indexMap;
+ _cohesiveVertices.resize(vertices->size());
+ int index = 0;
+
+ const ALE::Obj<SieveMesh::sieve_type>& sieve = mesh.sieveMesh()->getSieve();
+ assert(!sieve.isNull());
+ typedef ALE::SieveAlg<SieveMesh> SieveAlg;
+
+ ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type> ncV(*sieve,
+ (size_t) pow(sieve->getMaxConeSize(), std::max(0, sieveMesh->depth())));
+
+ for (SieveMesh::label_sequence::iterator c_iter=cellsBegin;
+ c_iter != cellsEnd;
+ ++c_iter) {
+ // Get oriented closure
+ ncV.clear();
+ ALE::ISieveTraversal<SieveMesh::sieve_type>::orientedClosure(*sieve, *c_iter, ncV);
+ const int coneSize = ncV.getSize();
+ assert(coneSize == numCorners);
+ const Mesh::point_type *cone = ncV.getPoints();
+ assert(0 != cone);
+
+ for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
+ // normal cohesive vertices i and j and constraint vertex k
+ const int indexI = iConstraint;
+ const int indexJ = iConstraint + numConstraintVert;
+ const int indexK = iConstraint + 2 * numConstraintVert;
+
+ const int v_lagrange = cone[indexK];
+ const int v_negative = cone[indexI];
+ const int v_positive = cone[indexJ];
+ const int v_fault = renumbering[v_lagrange];
+
+ if (indexMap.end() == indexMap.find(v_lagrange)) {
+ _cohesiveVertices[index].lagrange = v_lagrange;
+ _cohesiveVertices[index].positive = v_positive;
+ _cohesiveVertices[index].negative = v_negative;
+ _cohesiveVertices[index].fault = v_fault;
+#if 0
+ std::cout << "cohesiveVertices[" << index << "]: "
+ << "l: " << v_lagrange
+ << ", p: " << v_positive
+ << ", n: " << v_negative
+ << ", f: " << v_fault
+ << std::endl;
+#endif
+ indexMap[v_lagrange] = index; // add index to map
+ ++index;
+ } // if
+ } // for
+ } // for
+} // _initializeCohesiveInfo
+
+// ----------------------------------------------------------------------
+// Initialize logger.
+void
+pylith::faults::FaultCohesiveLagrange::_initializeLogger(void)
+{ // initializeLogger
+ delete _logger;
+ _logger = new utils::EventLogger;
+ assert(0 != _logger);
+ _logger->className("FaultCohesiveLagrange");
+ _logger->initialize();
+
+ _logger->registerEvent("FaAS setup");
+ _logger->registerEvent("FaAS geometry");
+ _logger->registerEvent("FaAS compute");
+ _logger->registerEvent("FaAS restrict");
+ _logger->registerEvent("FaAS update");
+
+ _logger->registerEvent("FaIR setup");
+ _logger->registerEvent("FaIR geometry");
+ _logger->registerEvent("FaIR compute");
+ _logger->registerEvent("FaIR restrict");
+ _logger->registerEvent("FaIR update");
+
+ _logger->registerEvent("FaIJ setup");
+ _logger->registerEvent("FaIJ geometry");
+ _logger->registerEvent("FaIJ compute");
+ _logger->registerEvent("FaIJ restrict");
+ _logger->registerEvent("FaIJ update");
+} // initializeLogger
+
+// ----------------------------------------------------------------------
+// Calculate orientation at fault vertices.
+void
+pylith::faults::FaultCohesiveLagrange::_calcOrientation(const double upDir[3],
+ const double normalDir[3])
+{ // _calcOrientation
+ assert(0 != upDir);
+ assert(0 != normalDir);
+ assert(0 != _faultMesh);
+ assert(0 != _fields);
+
+ double_array upDirArray(upDir, 3);
+
+ // Get vertices in fault mesh.
+ const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+ assert(!faultSieveMesh.isNull());
+ const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+ faultSieveMesh->depthStratum(0);
+ const SieveSubMesh::label_sequence::iterator verticesBegin =
+ vertices->begin();
+ const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+ // Containers for orientation information.
+ const int cohesiveDim = _faultMesh->dimension();
+ const int numBasis = _quadrature->numBasis();
+ const int spaceDim = _quadrature->spaceDim();
+ const int orientationSize = spaceDim * spaceDim;
+ const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
+ const double_array& verticesRef = cellGeometry.vertices();
+ const int jacobianSize = (cohesiveDim > 0) ? spaceDim * cohesiveDim : 1;
+ const double_array& quadWts = _quadrature->quadWts();
+ double_array jacobian(jacobianSize);
+ double jacobianDet = 0;
+ double_array orientationVertex(orientationSize);
+ double_array coordinatesCell(numBasis * spaceDim);
+ double_array refCoordsVertex(cohesiveDim);
+
+ // Allocate orientation field.
+ _fields->add("orientation", "orientation");
+ topology::Field<topology::SubMesh>& orientation = _fields->get("orientation");
+ const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+ orientation.newSection(slip, orientationSize);
+ const ALE::Obj<RealSection>& orientationSection = orientation.section();
+ assert(!orientationSection.isNull());
+ // Create subspaces for along-strike, up-dip, and normal directions
+ for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
+ orientationSection->addSpace();
+ for (int iDim = 0; iDim <= cohesiveDim; ++iDim)
+ orientationSection->setFiberDimension(vertices, spaceDim, iDim);
+ orientation.allocate();
+ orientation.zero();
+
+ // Get fault cells.
+ const ALE::Obj<SieveSubMesh::label_sequence>& cells =
+ faultSieveMesh->heightStratum(0);
+ assert(!cells.isNull());
+ const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
+ const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
+
+ // Compute orientation of fault at constraint vertices
+
+ // Get section containing coordinates of vertices
+ const ALE::Obj<RealSection>& coordinatesSection =
+ faultSieveMesh->getRealSection("coordinates");
+ assert(!coordinatesSection.isNull());
+ topology::Mesh::RestrictVisitor coordinatesVisitor(*coordinatesSection,
+ coordinatesCell.size(), &coordinatesCell[0]);
+
+ // Set orientation function
+ assert(cohesiveDim == _quadrature->cellDim());
+ assert(spaceDim == _quadrature->spaceDim());
+
+ // Loop over cohesive cells, computing orientation weighted by
+ // jacobian at constraint vertices
+
+ const ALE::Obj<SieveSubMesh::sieve_type>& sieve = faultSieveMesh->getSieve();
+ assert(!sieve.isNull());
+ typedef ALE::SieveAlg<SieveSubMesh> SieveAlg;
+
+ ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type>
+ ncV(*sieve, (size_t) pow(sieve->getMaxConeSize(), std::max(0,
+ faultSieveMesh->depth())));
+
+ for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
+ != cellsEnd; ++c_iter) {
+ // Get orientations at fault cell's vertices.
+ coordinatesVisitor.clear();
+ faultSieveMesh->restrictClosure(*c_iter, coordinatesVisitor);
+
+ ncV.clear();
+ ALE::ISieveTraversal<SieveSubMesh::sieve_type>::orientedClosure(*sieve,
+ *c_iter, ncV);
+ const int coneSize = ncV.getSize();
+ const Mesh::point_type *cone = ncV.getPoints();
+
+ for (int v = 0; v < coneSize; ++v) {
+ // Compute Jacobian and determinant of Jacobian at vertex
+ memcpy(&refCoordsVertex[0], &verticesRef[v * cohesiveDim], cohesiveDim
+ * sizeof(double));
+ cellGeometry.jacobian(&jacobian, &jacobianDet, coordinatesCell,
+ refCoordsVertex);
+
+ // Compute orientation
+ cellGeometry.orientation(&orientationVertex, jacobian, jacobianDet,
+ upDirArray);
+
+ // Update orientation
+ orientationSection->updateAddPoint(cone[v], &orientationVertex[0]);
+ } // for
+ } // for
+
+ //orientation.view("ORIENTATION BEFORE COMPLETE");
+
+ // Assemble orientation information
+ orientation.complete();
+
+ // Loop over vertices, make orientation information unit magnitude
+ double_array vertexDir(orientationSize);
+ int count = 0;
+ for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+ != verticesEnd; ++v_iter, ++count) {
+ orientationVertex = 0.0;
+ orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
+ orientationVertex.size());
+ for (int iDim = 0; iDim < spaceDim; ++iDim) {
+ double mag = 0;
+ for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
+ mag += pow(orientationVertex[index + jDim], 2);
+ mag = sqrt(mag);
+ assert(mag > 0.0);
+ for (int jDim = 0, index = iDim * spaceDim; jDim < spaceDim; ++jDim)
+ orientationVertex[index + jDim] /= mag;
+ } // for
+
+ orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
+ } // for
+ PetscLogFlops(count * orientationSize * 4);
+
+ if (2 == cohesiveDim && vertices->size() > 0) {
+ // Check orientation of first vertex, if dot product of fault
+ // normal with preferred normal is negative, flip up/down dip
+ // direction.
+ //
+ // If the user gives the correct normal direction (points from
+ // footwall to ahanging wall), we should end up with
+ // left-lateral-slip, reverse-slip, and fault-opening for positive
+ // slip values.
+ //
+ // When we flip the up/down dip direction, we create a left-handed
+ // strike/dip/normal coordinate system, but it gives the correct
+ // sense of slip. In reality the strike/dip/normal directions that
+ // are used are the opposite of what we would want, but we cannot
+ // flip the fault normal direction because it is tied to how the
+ // cohesive cells are created.
+
+ assert(vertices->size() > 0);
+ orientationSection->restrictPoint(*vertices->begin(),
+ &orientationVertex[0], orientationVertex.size());
+
+ assert(3 == spaceDim);
+ double_array normalDirVertex(&orientationVertex[6], 3);
+ const double normalDot = normalDir[0] * normalDirVertex[0] + normalDir[1]
+ * normalDirVertex[1] + normalDir[2] * normalDirVertex[2];
+
+ const int istrike = 0;
+ const int idip = 3;
+ const int inormal = 6;
+ if (normalDot < 0.0) {
+ // Flip dip direction
+ for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+ != verticesEnd; ++v_iter) {
+ orientationSection->restrictPoint(*v_iter, &orientationVertex[0],
+ orientationVertex.size());
+ assert(9 == orientationSection->getFiberDimension(*v_iter));
+ for (int iDim = 0; iDim < 3; ++iDim) // flip dip
+ orientationVertex[idip + iDim] *= -1.0;
+
+ // Update direction
+ orientationSection->updatePoint(*v_iter, &orientationVertex[0]);
+ } // for
+ PetscLogFlops(5 + count * 3);
+ } // if
+ } // if
+
+ //orientation.view("ORIENTATION");
+} // _calcOrientation
+
+// ----------------------------------------------------------------------
+void
+pylith::faults::FaultCohesiveLagrange::_calcArea(void)
+{ // _calcArea
+ assert(0 != _faultMesh);
+ assert(0 != _fields);
+
+ // Containers for area information
+ const int cellDim = _quadrature->cellDim();
+ const int numBasis = _quadrature->numBasis();
+ const int numQuadPts = _quadrature->numQuadPts();
+ const int spaceDim = _quadrature->spaceDim();
+ const feassemble::CellGeometry& cellGeometry = _quadrature->refGeometry();
+ const double_array& quadWts = _quadrature->quadWts();
+ assert(quadWts.size() == numQuadPts);
+ double jacobianDet = 0;
+ double_array areaCell(numBasis);
+
+ // Get vertices in fault mesh.
+ const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+ assert(!faultSieveMesh.isNull());
+ const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+ faultSieveMesh->depthStratum(0);
+ const SieveSubMesh::label_sequence::iterator verticesBegin =
+ vertices->begin();
+ const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+ // Allocate area field.
+ _fields->add("area", "area");
+
+ topology::Field<topology::SubMesh>& area = _fields->get("area");
+ const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+ area.newSection(slip, 1);
+ area.allocate();
+ area.zero();
+ const ALE::Obj<RealSection>& areaSection = area.section();
+ assert(!areaSection.isNull());
+ topology::Mesh::UpdateAddVisitor areaVisitor(*areaSection, &areaCell[0]);
+
+ double_array coordinatesCell(numBasis * spaceDim);
+ const ALE::Obj<RealSection>& coordinates = faultSieveMesh->getRealSection(
+ "coordinates");
+ assert(!coordinates.isNull());
+ topology::Mesh::RestrictVisitor coordsVisitor(*coordinates,
+ coordinatesCell.size(), &coordinatesCell[0]);
+
+ const ALE::Obj<SieveSubMesh::label_sequence>& cells =
+ faultSieveMesh->heightStratum(0);
+ assert(!cells.isNull());
+ const SieveSubMesh::label_sequence::iterator cellsBegin = cells->begin();
+ const SieveSubMesh::label_sequence::iterator cellsEnd = cells->end();
+
+ // Loop over cells in fault mesh, compute area
+ for (SieveSubMesh::label_sequence::iterator c_iter = cellsBegin; c_iter
+ != cellsEnd; ++c_iter) {
+ areaCell = 0.0;
+
+ // Compute geometry information for current cell
+#if defined(PRECOMPUTE_GEOMETRY)
+ _quadrature->retrieveGeometry(*c_iter);
+#else
+ coordsVisitor.clear();
+ faultSieveMesh->restrictClosure(*c_iter, coordsVisitor);
+ _quadrature->computeGeometry(coordinatesCell, *c_iter);
+#endif
+
+ // Get cell geometry information that depends on cell
+ const double_array& basis = _quadrature->basis();
+ const double_array& jacobianDet = _quadrature->jacobianDet();
+
+ // Compute area
+ for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
+ const double wt = quadWts[iQuad] * jacobianDet[iQuad];
+ for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
+ const double dArea = wt * basis[iQuad * numBasis + iBasis];
+ areaCell[iBasis] += dArea;
+ } // for
+ } // for
+ areaVisitor.clear();
+ faultSieveMesh->updateClosure(*c_iter, areaVisitor);
+
+ PetscLogFlops( numQuadPts*(1+numBasis*2) );
+ } // for
+
+ // Assemble area information
+ area.complete();
+
+#if 0 // DEBUGGING
+ area.view("AREA");
+ //_faultMesh->getSendOverlap()->view("Send fault overlap");
+ //_faultMesh->getRecvOverlap()->view("Receive fault overlap");
+#endif
+} // _calcArea
+
+// ----------------------------------------------------------------------
+// Compute change in tractions on fault surface using solution.
+// NOTE: We must convert vertex labels to fault vertex labels
+void
+pylith::faults::FaultCohesiveLagrange::_calcTractionsChange(
+ topology::Field<topology::SubMesh>* tractions,
+ const topology::Field<topology::Mesh>& dispT)
+{ // _calcTractionsChange
+ assert(0 != tractions);
+ assert(0 != _faultMesh);
+ assert(0 != _fields);
+ assert(0 != _normalizer);
+
+ tractions->label("traction_change");
+ tractions->scale(_normalizer->pressureScale());
+
+ // Fiber dimension of tractions matches spatial dimension.
+ const int fiberDim = _quadrature->spaceDim();
+ double_array tractionsVertex(fiberDim);
+
+ // Get sections.
+ const ALE::Obj<RealSection>& areaSection = _fields->get("area").section();
+ assert(!areaSection.isNull());
+ const ALE::Obj<RealSection>& dispTSection = dispT.section();
+ assert(!dispTSection.isNull());
+
+ // Allocate buffer for tractions field (if necessary).
+ const ALE::Obj<RealSection>& tractionsSection = tractions->section();
+ if (tractionsSection.isNull()) {
+ ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+ //logger.stagePush("Fault");
+
+ const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+ tractions->newSection(slip, fiberDim);
+ tractions->allocate();
+
+ //logger.stagePop();
+ } // if
+ assert(!tractionsSection.isNull());
+ tractions->zero();
+
+ const double pressureScale = tractions->scale();
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+ const int v_fault = _cohesiveVertices[iVertex].fault;
+
+ assert(fiberDim == dispTSection->getFiberDimension(v_lagrange));
+ assert(fiberDim == tractionsSection->getFiberDimension(v_fault));
+ assert(1 == areaSection->getFiberDimension(v_fault));
+
+ const double* dispTVertex = dispTSection->restrictPoint(v_lagrange);
+ assert(0 != dispTVertex);
+ const double* areaVertex = areaSection->restrictPoint(v_fault);
+ assert(0 != areaVertex);
+
+ for (int i = 0; i < fiberDim; ++i)
+ tractionsVertex[i] = dispTVertex[i] / areaVertex[0];
+
+ assert(tractionsVertex.size() == tractionsSection->getFiberDimension(v_fault));
+ tractionsSection->updatePoint(v_fault, &tractionsVertex[0]);
+ } // for
+
+ PetscLogFlops(numVertices * (1 + fiberDim) );
+
+#if 0 // DEBUGGING
+ tractions->view("TRACTIONS");
+#endif
+} // _calcTractionsChange
+
+// ----------------------------------------------------------------------
+// Allocate buffer for vector field.
+void
+pylith::faults::FaultCohesiveLagrange::_allocateBufferVectorField(void)
+{ // _allocateBufferVectorField
+ assert(0 != _fields);
+ if (_fields->hasField("buffer (vector)"))
+ return;
+
+ ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+ logger.stagePush("Output");
+
+ // Create vector field; use same shape/chart as slip field.
+ assert(0 != _faultMesh);
+ _fields->add("buffer (vector)", "buffer");
+ topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (vector)");
+ const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
+ buffer.cloneSection(slip);
+ buffer.zero();
+
+ logger.stagePop();
+} // _allocateBufferVectorField
+
+// ----------------------------------------------------------------------
+// Allocate buffer for scalar field.
+void
+pylith::faults::FaultCohesiveLagrange::_allocateBufferScalarField(void)
+{ // _allocateBufferScalarField
+ assert(0 != _fields);
+ if (_fields->hasField("buffer (scalar)"))
+ return;
+
+ ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+ logger.stagePush("Output");
+
+ // Create vector field; use same shape/chart as area field.
+ assert(0 != _faultMesh);
+ _fields->add("buffer (scalar)", "buffer");
+ topology::Field<topology::SubMesh>& buffer = _fields->get("buffer (scalar)");
+ const topology::Field<topology::SubMesh>& area = _fields->get("area");
+ buffer.cloneSection(area);
+ buffer.zero();
+
+ logger.stagePop();
+} // _allocateBufferScalarField
+
+
+// End of file
Added: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.hh (rev 0)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveLagrange.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,251 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file libsrc/faults/FaultCohesiveLagrange.hh
+ *
+ * @brief C++ abstract base class for implementing fault slip using
+ * Lagrange multipliers and cohesive cells.
+ */
+
+#if !defined(pylith_faults_faultcohesivelagrange_hh)
+#define pylith_faults_faultcohesivelagrange_hh
+
+// Include directives ---------------------------------------------------
+#include "FaultCohesive.hh" // ISA FaultCohesive
+
+// FaultCohesiveLagrange -----------------------------------------------------
+/**
+ * @brief C++ abstract base class for implementing falt slip using
+ * Lagrange multipliers and cohesive cells.
+ *
+ * Fault boundary condition is specified using Lagrange
+ * multipliers. The constraints are associated with "constraint"
+ * vertices which sit between the pair of vertices on each side of the
+ * fault.
+ *
+ * The ordering of vertices in a cohesive cell is the vertices on the
+ * "negative" side of the fault, the corresponding entries on the
+ * "positive" side of the fault, and then the corresponding constraint
+ * vertices.
+ *
+ * The system without Lagrange multipliers is
+ *
+ * [A(t+dt)]{u(t+dt)} = {b(t+dt)}
+ *
+ * With Lagrange multipliers this system becomes
+ *
+ * [A(t+dt) C^T ]{ u(t+dt) } = {b(t+dt)}
+ * [ C 0 ]{ L(t+dt) } {D(t+dt)}
+ *
+ * where C is the matrix of Lagrange constraints, L is the vector of
+ * Lagrange multiplies (internal forces in this case), and D is the
+ * fault slip.
+ *
+ * We solve for the increment in the displacement field, so we rewrite
+ * the system as
+ *
+ * [A(t+dt) C^T ]{ du(t) } = {b(t+dt)} - [A(t+dt) C^T ]{ u(t) }
+ * [ C 0 ]{ dL(t) } {D(t+dt)} [ C 0 ]{ L(t) }
+ *
+ * We form the residual as
+ *
+ * {r(t+dt)} = {b(t+dt)} - [A(t+dt) C^T ]{ u(t)+du(t) }
+ * {D(t+dt)} [ C 0 ]{ L(t)+dL(t) }
+ *
+ * The terms in the residual contributing to the DOF at the Lagrange
+ * vertices are
+ *
+ * {r(t+dt)} = {D(t+dt)} - [C]{u(t)+dt(t)}
+ *
+ * The term in the residual contributing to the DOF at the
+ * non-Lagrange vertices of the cohesive cells is
+ *
+ * {r(t+dt)} = -[C]^T{L(t)+dL(t)}
+ *
+ * We integrate the Lagrange multiplier term and the relative
+ * displacement term over the cohesive cells, because this introduces
+ * weighting of the orientation of the fault for the direction of slip
+ * at the vertices of the cohesive cells.
+ */
+class pylith::faults::FaultCohesiveLagrange : public FaultCohesive
+{ // class FaultCohesiveLagrange
+ friend class TestFaultCohesiveLagrange; // unit testing
+
+ // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+ /// Default constructor.
+ FaultCohesiveLagrange(void);
+
+ /// Destructor.
+ virtual
+ ~FaultCohesiveLagrange(void);
+
+ /// Deallocate PETSc and local data structures.
+ virtual
+ void deallocate(void);
+
+ /** Initialize fault. Determine orientation and setup boundary
+ * condition parameters.
+ *
+ * @param mesh Finite-element mesh.
+ * @param upDir Direction perpendicular to along-strike direction that is
+ * not collinear with fault normal (usually "up" direction but could
+ * be up-dip direction; only applies to fault surfaces in a 3-D domain).
+ * @param normalDir General preferred direction for fault normal
+ * (used to pick which of two possible normal directions for
+ * interface; only applies to fault surfaces in a 3-D domain).
+ */
+ virtual
+ void initialize(const topology::Mesh& mesh,
+ const double upDir[3],
+ const double normalDir[3]);
+
+ /** Split solution field for separate preconditioning.
+ *
+ * @param field Solution field.
+ */
+ void splitField(topology::Field<topology::Mesh>* field);
+
+ /** Integrate contributions to residual term (r) for operator that
+ * do not require assembly across cells, vertices, or processors.
+ *
+ * @param residual Field containing values for residual
+ * @param t Current time
+ * @param fields Solution fields
+ */
+ virtual
+ void integrateResidualAssembled(const topology::Field<topology::Mesh>& residual,
+ const double t,
+ topology::SolutionFields* const fields);
+
+ /** Integrate contributions to Jacobian matrix (A) associated with
+ * operator that do not require assembly across cells, vertices, or
+ * processors.
+ *
+ * @param jacobian Sparse matrix
+ * @param t Current time
+ * @param fields Solution fields
+ */
+ virtual
+ void integrateJacobianAssembled(topology::Jacobian* jacobian,
+ const double t,
+ topology::SolutionFields* const fields);
+
+ /** Integrate contributions to Jacobian matrix (A) associated with
+ * operator that do not require assembly across cells, vertices, or
+ * processors.
+ *
+ * @param jacobian Diagonal Jacobian matrix as a field.
+ * @param t Current time
+ * @param fields Solution fields
+ */
+ virtual
+ void integrateJacobianAssembled(topology::Field<topology::Mesh>* jacobian,
+ const double t,
+ topology::SolutionFields* const fields);
+
+ /** Adjust solution from solver with lumped Jacobian to match Lagrange
+ * multiplier constraints.
+ *
+ * @param fields Solution fields
+ * @param jacobian Jacobian of the system.
+ */
+ virtual
+ void adjustSolnLumped(topology::SolutionFields* fields,
+ const topology::Field<topology::Mesh>& jacobian);
+
+ /** Verify configuration is acceptable.
+ *
+ * @param mesh Finite-element mesh
+ */
+ virtual
+ void verifyConfiguration(const topology::Mesh& mesh) const;
+
+ // PROTECTED STRUCTS //////////////////////////////////////////////////
+protected :
+
+ /** Data structure to hold relations between vertices in cohesive cell
+ * in mesh of domain and cell of fault mesh.
+ */
+ struct CohesiveInfo {
+ int lagrange; ///< Vertex associated with Lagrange multiplier.
+ int positive; ///< Vertex on positive side of the fault.
+ int negative; ///< Vertex on negative side of the fault.
+ int fault; ///< Vertex in fault mesh.
+ };
+
+ // PROTECTED METHODS //////////////////////////////////////////////////
+protected :
+
+ /** Initialize auxiliary cohesive cell information.
+ *
+ * @param mesh Finite-element mesh of the domain.
+ */
+ void _initializeCohesiveInfo(const topology::Mesh& mesh);
+
+ /** Compute change in tractions on fault surface using solution.
+ *
+ * @param tractions Field for tractions.
+ * @param solution Solution over domain
+ */
+ void _calcTractionsChange(topology::Field<topology::SubMesh>* tractions,
+ const topology::Field<topology::Mesh>& solution);
+
+ /// Allocate buffer for vector field.
+ void _allocateBufferVectorField(void);
+
+ /// Allocate buffer for scalar field.
+ void _allocateBufferScalarField(void);
+
+ // PROTECTED MEMBERS //////////////////////////////////////////////////
+protected :
+
+ /// Array of cohesive vertex information.
+ std::vector<CohesiveInfo> _cohesiveVertices;
+
+ // PRIVATE METHODS ////////////////////////////////////////////////////
+private :
+
+ /// Initialize logger.
+ void _initializeLogger(void);
+
+ /** Calculate orientation at fault vertices.
+ *
+ * @param upDir Direction perpendicular to along-strike direction that is
+ * not collinear with fault normal (usually "up" direction but could
+ * be up-dip direction; only applies to fault surfaces in a 3-D domain).
+ * @param normalDir General preferred direction for fault normal
+ * (used to pick which of two possible normal directions for
+ * interface; only applies to fault surfaces in a 3-D domain).
+ */
+ void _calcOrientation(const double upDir[3],
+ const double normalDir[3]);
+
+ /// Calculate fault area field.
+ void _calcArea(void);
+
+ // NOT IMPLEMENTED ////////////////////////////////////////////////////
+private :
+
+ /// Not implemented
+ FaultCohesiveLagrange(const FaultCohesiveLagrange&);
+
+ /// Not implemented
+ const FaultCohesiveLagrange& operator=(const FaultCohesiveLagrange&);
+
+}; // class FaultCohesiveLagrange
+
+#endif // pylith_faults_faultcohesivelagrange_hh
+
+
+// End of file
Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveTract.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveTract.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveTract.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -70,8 +70,8 @@
assert(0 != _quadrature);
delete _faultMesh; _faultMesh = new topology::SubMesh();
- CohesiveTopology::createFaultParallel(_faultMesh, &_cohesiveToFault,
- mesh, id(), useLagrangeConstraints());
+ CohesiveTopology::createFaultParallel(_faultMesh, mesh, id(),
+ useLagrangeConstraints());
// Reset fields.
delete _fields;
@@ -99,330 +99,7 @@
const double t,
topology::SolutionFields* const fields)
{ // integrateResidual
- assert(0 != _quadrature);
- assert(0 != _faultMesh);
- assert(0 != _fields);
-
- // debugging
- residual.view("RESIDUAL BEFORE FRICTION");
-
- // Get cell geometry information that doesn't depend on cell
- const int numQuadPts = _quadrature->numQuadPts();
- const double_array& quadWts = _quadrature->quadWts();
- assert(quadWts.size() == numQuadPts);
- const int numBasis = _quadrature->numBasis();
- const int spaceDim = _quadrature->spaceDim();
- const int numCornersCohesive = 2*numBasis;
- const int orientationSize = spaceDim*spaceDim;
-
- // Get cohesive cells.
- const ALE::Obj<SieveMesh>& sieveMesh = residual.mesh().sieveMesh();
- assert(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
- sieveMesh->getLabelStratum("material-id", id());
- assert(!cellsCohesive.isNull());
- const SieveSubMesh::label_sequence::iterator cellsBegin = cellsCohesive->begin();
- const SieveSubMesh::label_sequence::iterator cellsEnd = cellsCohesive->end();
-
- // Get fault mesh.
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
- assert(!faultSieveMesh.isNull());
-
- // Get sections.
-
- // Get residual.
- const ALE::Obj<RealSection>& residualSection = residual.section();
- assert(!residualSection.isNull());
- double_array residualCell(numCornersCohesive*spaceDim);
- topology::Mesh::UpdateAddVisitor residualVisitor(*residualSection,
- &residualCell[0]);
- double_array forcesCurrentCell(numCornersCohesive*spaceDim);
- RestrictVisitor forcesCurrentVisitor(*residualSection,
- forcesCurrentCell.size(), &forcesCurrentCell[0]);
-
- // Get displacements.
- double_array dispCell(numCornersCohesive*spaceDim);
- const ALE::Obj<RealSection>& dispSection = fields->get("disp(t)").section();
- assert(!dispSection.isNull());
- RestrictVisitor dispVisitor(*dispSection,
- dispCell.size(), &dispCell[0]);
- double_array dispIncrCell(numCornersCohesive*spaceDim);
- const ALE::Obj<RealSection>& dispIncrSection = fields->get("dispIncr(t->t+dt)").section();
- assert(!dispIncrSection.isNull());
- RestrictVisitor dispIncrVisitor(*dispIncrSection,
- dispIncrCell.size(), &dispIncrCell[0]);
- double_array dispTpdtCell(numCornersCohesive*spaceDim);
-
- // Get initial tractions (if exist).
- double_array tractionInitialFault(numQuadPts*spaceDim);
- const ALE::Obj<RealSection>& tractionInitialSection = (0 != _dbInitial) ?
- _fields->get("initial traction").section() : 0;
-
- // Get orientation.
- double_array orientationCell(numQuadPts*orientationSize);
- const ALE::Obj<RealSection>& orientationSection = _fields->get("orientation").section();
- assert(!orientationSection.isNull());
-
- // Values defined at quadrature points.
- double_array tractionsCurrentCell(numQuadPts*spaceDim);
- double_array tractionCell(numQuadPts*spaceDim); // friction
- double_array slip(spaceDim); // slip at quad pt
- double_array tractionsCurrentFault(spaceDim); // current tractions at quad pt
- double_array tractionFault(spaceDim); // friction at quad pt
-
-#if !defined(PRECOMPUTE_GEOMETRY)
- double_array coordinatesCell(numBasis*spaceDim);
- const ALE::Obj<RealSection>& coordinates =
- faultSieveMesh->getRealSection("coordinates");
- RestrictVisitor coordsVisitor(*coordinates,
- coordinatesCell.size(), &coordinatesCell[0]);
-#endif
-
- // Loop over faces and integrate contribution from each face
- for (SieveSubMesh::label_sequence::iterator c_iter=cellsBegin;
- c_iter != cellsEnd;
- ++c_iter) {
- const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
- residualCell = 0.0;
-
-#if defined(PRECOMPUTE_GEOMETRY)
- _quadrature->retrieveGeometry(*c_iter);
-#else
- coordsVisitor.clear();
- faultSieveMesh->restrictClosure(c_fault, coordsVisitor);
- _quadrature->computeGeometry(coordinatesCell, c_fault);
-#endif
-
- // Get cell geometry information that depends on cell
- const double_array& basis = _quadrature->basis();
- const double_array& jacobianDet = _quadrature->jacobianDet();
-
- // Get displacements at vertices of cohesive cell.
- dispVisitor.clear();
- sieveMesh->restrictClosure(*c_iter, dispVisitor);
- dispIncrVisitor.clear();
- sieveMesh->restrictClosure(*c_iter, dispIncrVisitor);
-
- // Compute current estimate of displacement at time t+dt using
- // solution increment.
- dispTpdtCell = dispCell + dispIncrCell;
-
- // Get current forces at vertices of cohesive cell (current residual).
- forcesCurrentVisitor.clear();
- sieveMesh->restrictClosure(*c_iter, forcesCurrentVisitor);
-
- // Get initial tractions for fault cell.
- if (0 != _dbInitial) {
- assert(!tractionInitialSection.isNull());
- tractionInitialSection->restrictPoint(c_fault, &tractionInitialFault[0],
- tractionInitialFault.size());
- } // if
-
- // Get fault orientation at quadrature points.
- orientationSection->restrictPoint(c_fault, &orientationCell[0],
- orientationCell.size());
-
- tractionCell = 0.0;
- for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
- // wt is also area associated with quadrature point
- const double wt = quadWts[iQuad] * jacobianDet[iQuad];
-
- // Compute slip at current quad pt in global coordinate system.
- // In: dispTpdtCell [2*numBasis*spaceDim] (negative side then positive side??)
- // basis [numQuadpts*numBasis]
- // Out: slipGlobal [spaceDim]
- // Use basis functions to compute displacement at quadrature point and
- // then difference displacements to get slip.
- // ADD STUFF HERE
- double_array dispQuadPt(spaceDim*2);
- double_array slipGlobal(spaceDim);
- for (int iBasis=0; iBasis < numBasis; ++iBasis) {
- for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
- dispQuadPt[iSpace] += basis[iQuad*numBasis+iBasis]
- *dispTpdtCell[iBasis*spaceDim+iSpace];
- dispQuadPt[spaceDim+iSpace] += basis[iQuad*numBasis+iBasis]
- *dispTpdtCell[(iBasis+numBasis)*spaceDim+iSpace];
- }
- }
- for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
- slipGlobal[iSpace] = dispQuadPt[spaceDim+iSpace]
- -dispQuadPt[iSpace];
- }
-
- // Compute slip in fault orientation.
- // In: slipGlobal [spaceDim]
- // orientationCell [numQuadPts*spaceDim*spaceDim, iQuadPt*spaceDim*spaceDim+iDim*spaceDim+jDim]
- // Out: slipFault [spaceDim]
- // Use orientation to rotate from global to fault orientation.
- // ADD STUFF HERE
- double_array slipFault(spaceDim);
- for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
- for (int jSpace=0; jSpace < spaceDim; ++jSpace) {
- slipFault[iSpace] += slipGlobal[jSpace]
- *orientationCell[iQuad*spaceDim*spaceDim+iSpace*spaceDim+jSpace];
- }
- }
-
-
- // Compute traction from current deformation in global coordinate system. (tractionCurrentGlobal)
- // In: forcesCurrentCell [2*numBasis*spaceDim] (negative side then positive side)
- // Out: tractionCurrentGlobal [spaceDim]
- // Use basis functions to compute forces at quadrature point, then difference to get relative forces,
- // and divide by area to get traction vector.
- // ADD STUFF HERE
- double_array forcesQuadPt(2*spaceDim);
- double_array tractionCurrentGlobal(spaceDim);
- for (int iBasis=0; iBasis < numBasis; ++iBasis) {
- for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
- forcesQuadPt[iSpace] += basis[iQuad*numBasis+iBasis]
- *forcesCurrentCell[iBasis*spaceDim+iSpace];
- forcesQuadPt[spaceDim+iSpace] += basis[iQuad*numBasis+iBasis]
- *forcesCurrentCell[(iBasis+numBasis)*spaceDim+iSpace];
- }
- }
- for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
- tractionCurrentGlobal[iSpace] = forcesQuadPt[spaceDim+iSpace]
- -forcesQuadPt[iSpace];
- tractionCurrentGlobal[iSpace] /= wt;
- }
-
-
- // Compute traction in fault orientation.
- // In: tractionCurrentGlobal [spaceDim]
- // Out: tractionCurrentFault [spaceDim]
- // Use orientation to rotate from global to fault orientation.
- // ADD STUFF HERE
- double_array tractionCurrentFault(spaceDim);
- for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
- for (int jSpace=0; jSpace < spaceDim; ++jSpace) {
- tractionCurrentFault[iSpace] += tractionCurrentGlobal[jSpace]
- *orientationCell[iQuad*spaceDim*spaceDim+iSpace*spaceDim+jSpace];
- }
- }
-
- // Compute total traction (initial + current).
- // In: tractionCurrentFault [spaceDim]
- // tractionInitialFault [numQuadPts*spaceDim]
- // Out: tractionTotalFault [spaceDim]
- // ADD STUFF HERE
- double_array tractionTotalFault(spaceDim);
- for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
- tractionTotalFault[iSpace] += tractionCurrentFault[iSpace]
- +tractionInitialFault[iQuad*spaceDim+iSpace];
- }
-
- // Compute traction ("friction") using fault constitutive model in fault orientation.
- // In: slipFault [spaceDim]
- // tractionCurrentFault [spaceDim]
- // tractionTotalFault [spaceDim]
- // Out: frictionFault [spaceDim]
- // BEGIN TEMPORARY
- // Simple fault constitutive model with static friction.
- const double mu = 0.7;
- // ADD STUFF HERE
- double_array frictionFault(spaceDim);
- frictionFault = 0.0;
- switch (spaceDim)
- { // switch
- case 1 : {
- if (tractionTotalFault[0] < 0) {
- frictionFault[0] = tractionCurrentFault[0];
- }
- break;
- } // case 1
- case 2 : {
- if (tractionTotalFault[1] < 0) {
- frictionFault[1] = tractionCurrentFault[1];
- frictionFault[0] = -mu * tractionTotalFault[1];
- if (frictionFault[0] > tractionCurrentFault[0])
- frictionFault[0] = tractionCurrentFault[0];
- }
- break;
- } // case 2
- case 3 : {
- if (tractionTotalFault[2] < 0) {
- frictionFault[2] = tractionCurrentFault[2];
- frictionFault[1] = -mu * tractionTotalFault[2] * tractionTotalFault[1] / sqrt(pow(tractionTotalFault[1],2) +pow(tractionTotalFault[0],2));
- frictionFault[0] = -mu * tractionTotalFault[2] * tractionTotalFault[0] / sqrt(pow(tractionTotalFault[1],2) +pow(tractionTotalFault[0],2));
-
- if (frictionFault[0] > tractionCurrentFault[0])
- frictionFault[0] = tractionCurrentFault[0];
-
- if (frictionFault[1] > tractionCurrentFault[1])
- frictionFault[1] = tractionCurrentFault[1];
- }
- break;
- } // case 3
- default :
- std::cerr << "Bad spatial dimension '" << spaceDim << "'." << std::endl;
- assert(0);
- throw std::logic_error("Bad spatial dimension in Friction.");
- } // switch
-
-
- // END TEMPORARY
-
- // If normal traction is negative (compression), prevent
- // interpenetration by setting traction to exactly counteract
- // current forces acting normal to fault.
-
- // Compute traction associated with "friction" in global coordinate system. (tractionCell)
- // In: frictionFault [spaceDim]
- // Out: tractionCell [numQuadPts*spaceDim]
- // Use orientation to rotate from global to fault orientation.
- // ADD STUFF HERE
- for (int iSpace=0; iSpace < spaceDim; ++iSpace) {
- for (int jSpace=0; jSpace < spaceDim; ++jSpace) {
- tractionCell[iQuad*spaceDim+iSpace] += frictionFault[jSpace]
- *orientationCell[iQuad*spaceDim*spaceDim+iSpace*spaceDim+jSpace];
- }
- }
- tractionCell /= 2.0;
-
- std::cout << " wt: " << wt
- << " dispTpdtCell (-): (" << dispTpdtCell[0*spaceDim+0] << "," << dispTpdtCell[0*spaceDim+1] << ")\n"
- << " (" << dispTpdtCell[1*spaceDim+0] << "," << dispTpdtCell[1*spaceDim+1] << ")\n"
- << " dispTpdtCell (+): (" << dispTpdtCell[2*spaceDim+0] << "," << dispTpdtCell[2*spaceDim+1] << ")\n"
- << " (" << dispTpdtCell[3*spaceDim+0] << "," << dispTpdtCell[3*spaceDim+1] << ")\n"
- << " dispQuadPt (-): (" << dispQuadPt[0] << "," << dispQuadPt[1] << ")\n"
- << " dispQuadPt (+): (" << dispQuadPt[spaceDim+0] << "," << dispQuadPt[spaceDim+1] << ")\n"
- << " slipGlobal: (" << slipGlobal[0] << "," << slipGlobal[1] << ")\n"
- << " slipFault: (" << slipFault[0] << "," << slipFault[1] << ")\n"
- << " forcesQuadPt (-): (" << forcesQuadPt[0] << "," << forcesQuadPt[1] << ")\n"
- << " forcesQuadPt (+): (" << forcesQuadPt[spaceDim+0] << "," << forcesQuadPt[spaceDim+1] << ")\n"
- << " tractionCurrentGlobal: (" << tractionCurrentGlobal[0] << "," << tractionCurrentGlobal[1] << ")\n"
- << " tractionCurrentFault: (" << tractionCurrentFault[0] << "," << tractionCurrentFault[1] << ")\n"
- << " tractionTotalFault: (" << tractionTotalFault[0] << "," << tractionTotalFault[1] << ")\n"
- << " frictionFault: (" << frictionFault[0] << "," << frictionFault[1] << ")\n"
- << " tractionCell: (" << tractionCell[iQuad*spaceDim+0] << "," << tractionCell[iQuad*spaceDim+1] << ")\n"
- << std::endl;
-
-
- // Compute action for dynamic fault term
- for (int iBasis=0; iBasis < numBasis; ++iBasis) {
- const double valI = wt*basis[iQuad*numBasis+iBasis];
- for (int jBasis=0; jBasis < numBasis; ++jBasis) {
- const double valIJ = valI * basis[iQuad*numBasis+jBasis];
- for (int iDim=0; iDim < spaceDim; ++iDim) {
- // :TODO: action for each side of the fault
- residualCell[iBasis*spaceDim+iDim] +=
- tractionCell[iQuad*spaceDim+iDim] * valIJ;
- residualCell[(iBasis+numBasis)*spaceDim+iDim] +=
- -tractionCell[iQuad*spaceDim+iDim] * valIJ;
- } // for
- } // for
- } // for
- } // for
-
- // Assemble cell contribution into field
- residualVisitor.clear();
- sieveMesh->updateClosure(*c_iter, residualVisitor);
-
- PetscLogFlops(numQuadPts*(0)); // :TODO: Count number of operations
- } // for
-
- // debugging
- residual.view("RESIDUAL AFTER FRICTION");
+ throw std::logic_error("FaultCohesiveTract::integrateResidual() not implemented.");
} // integrateResidual
// ----------------------------------------------------------------------
@@ -433,6 +110,8 @@
const double t,
topology::SolutionFields* const fields)
{ // integrateJacobian
+ throw std::logic_error("FaultCohesiveTract::integrateJacobian() not implemented.");
+
_needNewJacobian = false;
} // integrateJacobian
Modified: short/3D/PyLith/trunk/libsrc/faults/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/Makefile.am 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/Makefile.am 2010-02-19 20:08:42 UTC (rev 16280)
@@ -24,11 +24,10 @@
Fault.icc \
FaultCohesive.hh \
FaultCohesive.icc \
+ FaultCohesiveLagrange.hh \
FaultCohesiveTract.hh \
- FaultCohesiveDynL.hh \
- FaultCohesiveDynL.icc \
+ FaultCohesiveDyn.hh \
FaultCohesiveKin.hh \
- FaultCohesiveKin.icc \
LiuCosSlipFn.hh \
LiuCosSlipFn.icc \
SlipTimeFn.hh \
Modified: short/3D/PyLith/trunk/libsrc/faults/faultsfwd.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/faultsfwd.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/libsrc/faults/faultsfwd.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -28,8 +28,9 @@
class Fault;
class FaultCohesive;
- class FaultCohesiveDynL;
+ class FaultCohesiveLagrange;
class FaultCohesiveKin;
+ class FaultCohesiveDyn;
class FaultCohesiveTract;
class EqKinSrc;
Modified: short/3D/PyLith/trunk/modulesrc/faults/FaultCohesive.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/FaultCohesive.i 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/modulesrc/faults/FaultCohesive.i 2010-02-19 20:08:42 UTC (rev 16280)
@@ -39,13 +39,20 @@
/** Set flag for using fault mesh or group of vertices to define
* fault surface.
*
+ * This method is part of a KLUDGE to allow creation of cohesive
+ * cells in cases where domain cells have more than one face
+ * (edge for 2-D problems) on the fault.
+ *
* @param flag True if using fault mesh, false if using vertices.
*/
void useFaultMesh(const bool flag);
- // TEMPORARY
/** Set filename of UCD file for fault mesh.
*
+ * This method is part of a KLUDGE to allow creation of cohesive
+ * cells in cases where domain cells have more than one face
+ * (edge for 2-D problems) on the fault.
+ *
* @param filename Filename for UCD file.
*/
void faultMeshFilename(const char* filename);
@@ -75,9 +82,15 @@
* @returns True if implementation using Lagrange multiplier
* constraints, false otherwise.
*/
- virtual
- bool useLagrangeConstraints(void) const = 0;
+ bool useLagrangeConstraints(void) const;
+ /** Get fields associated with fault.
+ *
+ * @returns Fields associated with fault.
+ */
+ const pylith::topology::Fields<topology::Field<pylith::topology::SubMesh> >*
+ fields(void) const;
+
}; // class FaultCohesive
} // faults
Copied: short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDyn.i (from rev 16277, short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDynL.i)
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDyn.i (rev 0)
+++ short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDyn.i 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,125 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file modulesrc/faults/FaultCohesiveDyn.i
+ *
+ * @brief Python interface to C++ FaultCohesiveDyn object.
+ */
+
+namespace pylith {
+ namespace faults {
+
+ class FaultCohesiveDyn : public FaultCohesiveLagrange
+ { // class FaultCohesiveDyn
+
+ // PUBLIC METHODS /////////////////////////////////////////////////
+ public :
+
+ /// Default constructor.
+ FaultCohesiveDyn(void);
+
+ /// Destructor.
+ virtual
+ ~FaultCohesiveDyn(void);
+
+ /// Deallocate PETSc and local data structures.
+ virtual
+ void deallocate(void);
+
+ /** Sets the spatial database for the inital tractions.
+ *
+ * @param db spatial database for initial tractions
+ */
+ void dbInitialTract(spatialdata::spatialdb::SpatialDB* db);
+
+ /** Set the friction (constitutive) model.
+ *
+ * @param model Fault constutive model.
+ */
+ void frictionModel(pylith::friction::FrictionModel* const model);
+
+ /** Initialize fault. Determine orientation and setup boundary
+ * condition parameters.
+ *
+ * @param mesh Finite-element mesh.
+ * @param upDir Direction perpendicular to along-strike direction that is
+ * not collinear with fault normal (usually "up" direction but could
+ * be up-dip direction; only applies to fault surfaces in a 3-D domain).
+ * @param normalDir General preferred direction for fault normal
+ * (used to pick which of two possible normal directions for
+ * interface; only applies to fault surfaces in a 3-D domain).
+ */
+ void initialize(const pylith::topology::Mesh& mesh,
+ const double upDir[3],
+ const double normalDir[3]);
+
+ /** Update state variables as needed.
+ *
+ * @param t Current time
+ * @param fields Solution fields
+ * @param mesh Finite-element mesh
+ */
+ void updateStateVars(const double t,
+ pylith::topology::SolutionFields* const fields);
+
+ /** Constrain solution space based on friction.
+ *
+ * @param fields Solution fields.
+ * @param t Current time.
+ * @param jacobian Sparse matrix for system Jacobian.
+ */
+ void constrainSolnSpace(pylith::topology::SolutionFields* const fields,
+ const double t,
+ const pylith::topology::Jacobian& jacobian);
+
+ /** Adjust solution from solver with lumped Jacobian to match Lagrange
+ * multiplier constraints.
+ *
+ * @param fields Solution fields.
+ * @param jacobian Jacobian of the system.
+ */
+ void adjustSolnLumped(pylith::topology::SolutionFields* fields,
+ const pylith::topology::Field<pylith::topology::Mesh>& jacobian);
+
+ /** Verify configuration is acceptable.
+ *
+ * @param mesh Finite-element mesh
+ */
+ void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
+
+ /** Get vertex field associated with integrator.
+ *
+ * @param name Name of cell field.
+ * @param fields Solution fields.
+ * @returns Vertex field.
+ */
+ const pylith::topology::Field<pylith::topology::SubMesh>&
+ vertexField(const char* name,
+ const pylith::topology::SolutionFields* fields =0);
+
+ /** Get cell field associated with integrator.
+ *
+ * @param name Name of cell field.
+ * @param fields Solution fields.
+ * @returns Cell field.
+ */
+ const pylith::topology::Field<pylith::topology::SubMesh>&
+ cellField(const char* name,
+ const pylith::topology::SolutionFields* fields =0);
+
+ }; // class FaultCohesiveDyn
+
+ } // faults
+} // pylith
+
+
+// End of file
Deleted: short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDynL.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDynL.i 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveDynL.i 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,171 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/** @file modulesrc/faults/FaultCohesiveDynL.i
- *
- * @brief Python interface to C++ FaultCohesiveDynL object.
- */
-
-namespace pylith {
- namespace faults {
-
- class FaultCohesiveDynL : public FaultCohesive
- { // class FaultCohesiveDynL
-
- // PUBLIC METHODS /////////////////////////////////////////////////
- public :
-
- /// Default constructor.
- FaultCohesiveDynL(void);
-
- /// Destructor.
- virtual
- ~FaultCohesiveDynL(void);
-
- /// Deallocate PETSc and local data structures.
- virtual
- void deallocate(void);
-
- /** Sets the spatial database for the inital tractions.
- *
- * @param db spatial database for initial tractions
- */
- void dbInitialTract(spatialdata::spatialdb::SpatialDB* db);
-
- /** Set the friction (constitutive) model.
- *
- * @param model Fault constutive model.
- */
- void frictionModel(pylith::friction::FrictionModel* const model);
-
- /** Initialize fault. Determine orientation and setup boundary
- * condition parameters.
- *
- * @param mesh Finite-element mesh.
- * @param upDir Direction perpendicular to along-strike direction that is
- * not collinear with fault normal (usually "up" direction but could
- * be up-dip direction; only applies to fault surfaces in a 3-D domain).
- * @param normalDir General preferred direction for fault normal
- * (used to pick which of two possible normal directions for
- * interface; only applies to fault surfaces in a 3-D domain).
- */
- void initialize(const pylith::topology::Mesh& mesh,
- const double upDir[3],
- const double normalDir[3]);
-
- /** Split solution field for separate preconditioning.
- *
- * @param field Solution field.
- */
- void splitField(pylith::topology::Field<pylith::topology::Mesh>* field);
-
- /** Integrate contributions to residual term (r) for operator that
- * require assembly across processors.
- *
- * @param residual Field containing values for residual
- * @param t Current time
- * @param fields Solution fields
- */
- void integrateResidual(const pylith::topology::Field<pylith::topology::Mesh>& residual,
- const double t,
- pylith::topology::SolutionFields* const fields);
-
- /** Integrate contributions to residual term (r) for operator that
- * do not require assembly across cells, vertices, or processors.
- *
- * @param residual Field containing values for residual
- * @param t Current time
- * @param fields Solution fields
- */
- void integrateResidualAssembled(const pylith::topology::Field<pylith::topology::Mesh>& residual,
- const double t,
- pylith::topology::SolutionFields* const fields);
-
- /** Integrate contributions to Jacobian matrix (A) associated with
- * operator that do not require assembly across cells, vertices, or
- * processors.
- *
- * @param mat Sparse matrix
- * @param t Current time
- * @param fields Solution fields
- * @param mesh Finite-element mesh
- */
- void integrateJacobianAssembled(pylith::topology::Jacobian* jacobian,
- const double t,
- pylith::topology::SolutionFields* const fields);
-
- /** Update state variables as needed.
- *
- * @param t Current time
- * @param fields Solution fields
- * @param mesh Finite-element mesh
- */
- void updateStateVars(const double t,
- pylith::topology::SolutionFields* const fields);
-
- /** Constrain solution space based on friction.
- *
- * @param fields Solution fields.
- * @param t Current time.
- * @param jacobian Sparse matrix for system Jacobian.
- */
- void constrainSolnSpace(pylith::topology::SolutionFields* const fields,
- const double t,
- const pylith::topology::Jacobian& jacobian);
-
- /** Verify configuration is acceptable.
- *
- * @param mesh Finite-element mesh
- */
- void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
-
- /** Get vertex field associated with integrator.
- *
- * @param name Name of cell field.
- * @param fields Solution fields.
- * @returns Vertex field.
- */
- const pylith::topology::Field<pylith::topology::SubMesh>&
- vertexField(const char* name,
- const pylith::topology::SolutionFields* fields =0);
-
- /** Get cell field associated with integrator.
- *
- * @param name Name of cell field.
- * @param fields Solution fields.
- * @returns Cell field.
- */
- const pylith::topology::Field<pylith::topology::SubMesh>&
- cellField(const char* name,
- const pylith::topology::SolutionFields* fields =0);
-
- /** Cohesive cells use Lagrange multiplier constraints?
- *
- * @returns True if implementation using Lagrange multiplier
- * constraints, false otherwise.
- */
- bool useLagrangeConstraints(void) const;
-
- /** Get fields associated with fault.
- *
- * @returns Fields associated with fault.
- */
- const pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> >*
- fields(void) const;
-
- }; // class FaultCohesiveDynL
-
- } // faults
-} // pylith
-
-
-// End of file
Modified: short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveKin.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveKin.i 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveKin.i 2010-02-19 20:08:42 UTC (rev 16280)
@@ -18,7 +18,7 @@
namespace pylith {
namespace faults {
- class FaultCohesiveKin : public FaultCohesive
+ class FaultCohesiveKin : public FaultCohesiveLagrange
{ // class FaultCohesiveKin
// PUBLIC METHODS /////////////////////////////////////////////////
@@ -67,24 +67,7 @@
const double upDir[3],
const double normalDir[3]);
- /** Split solution field for separate preconditioning.
- *
- * @param field Solution field.
- */
- void splitField(pylith::topology::Field<pylith::topology::Mesh>* field);
-
/** Integrate contributions to residual term (r) for operator that
- * require assembly across processors.
- *
- * @param residual Field containing values for residual
- * @param t Current time
- * @param fields Solution fields
- */
- void integrateResidual(const pylith::topology::Field<pylith::topology::Mesh>& residual,
- const double t,
- pylith::topology::SolutionFields* const fields);
-
- /** Integrate contributions to residual term (r) for operator that
* do not require assembly across cells, vertices, or processors.
*
* @param residual Field containing values for residual
@@ -95,46 +78,6 @@
const double t,
pylith::topology::SolutionFields* const fields);
- /** Integrate contributions to Jacobian matrix (A) associated with
- * operator that do not require assembly across cells, vertices, or
- * processors.
- *
- * @param jacobian Sparse matrix
- * @param t Current time
- * @param fields Solution fields
- * @param mesh Finite-element mesh
- */
- void integrateJacobianAssembled(pylith::topology::Jacobian* jacobian,
- const double t,
- pylith::topology::SolutionFields* const fields);
-
- /** Integrate contributions to Jacobian matrix (A) associated with
- * operator that do not require assembly across cells, vertices, or
- * processors.
- *
- * @param jacobian Diagonal Jacobian matrix as a field.
- * @param t Current time
- * @param fields Solution fields
- */
- void integrateJacobianAssembled(pylith::topology::Field<pylith::topology::Mesh>* jacobian,
- const double t,
- pylith::topology::SolutionFields* const fields);
-
- /** Update state variables as needed.
- *
- * @param t Current time
- * @param fields Solution fields
- * @param mesh Finite-element mesh
- */
- void updateStateVars(const double t,
- pylith::topology::SolutionFields* const fields);
-
- /** Verify configuration is acceptable.
- *
- * @param mesh Finite-element mesh
- */
- void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
-
/** Get vertex field associated with integrator.
*
* @param name Name of cell field.
@@ -155,20 +98,6 @@
cellField(const char* name,
const pylith::topology::SolutionFields* fields =0);
- /** Cohesive cells use Lagrange multiplier constraints?
- *
- * @returns True if implementation using Lagrange multiplier
- * constraints, false otherwise.
- */
- bool useLagrangeConstraints(void) const;
-
- /** Get fields associated with fault.
- *
- * @returns Fields associated with fault.
- */
- const pylith::topology::Fields<pylith::topology::Field<pylith::topology::SubMesh> >*
- fields(void) const;
-
}; // class FaultCohesiveKin
} // faults
Added: short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveLagrange.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveLagrange.i (rev 0)
+++ short/3D/PyLith/trunk/modulesrc/faults/FaultCohesiveLagrange.i 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,119 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file modulesrc/faults/FaultCohesiveLagrange.i
+ *
+ * @brief Python interface to C++ FaultCohesiveLagrange object.
+ */
+
+namespace pylith {
+ namespace faults {
+
+ class FaultCohesiveLagrange : public FaultCohesive
+ { // class FaultCohesiveLagrange
+
+ // PUBLIC METHODS /////////////////////////////////////////////////
+ public :
+
+ /// Default constructor.
+ FaultCohesiveLagrange(void);
+
+ /// Destructor.
+ virtual
+ ~FaultCohesiveLagrange(void);
+
+ /// Deallocate PETSc and local data structures.
+ virtual
+ void deallocate(void);
+
+ /** Initialize fault. Determine orientation and setup boundary
+ * condition parameters.
+ *
+ * @param mesh Finite-element mesh.
+ * @param upDir Direction perpendicular to along-strike direction that is
+ * not collinear with fault normal (usually "up" direction but could
+ * be up-dip direction; only applies to fault surfaces in a 3-D domain).
+ * @param normalDir General preferred direction for fault normal
+ * (used to pick which of two possible normal directions for
+ * interface; only applies to fault surfaces in a 3-D domain).
+ */
+ virtual
+ void initialize(const pylith::topology::Mesh& mesh,
+ const double upDir[3],
+ const double normalDir[3]);
+
+ /** Split solution field for separate preconditioning.
+ *
+ * @param field Solution field.
+ */
+ void splitField(pylith::topology::Field<pylith::topology::Mesh>* field);
+
+ /** Integrate contributions to residual term (r) for operator that
+ * do not require assembly across cells, vertices, or processors.
+ *
+ * @param residual Field containing values for residual
+ * @param t Current time
+ * @param fields Solution fields
+ */
+ virtual
+ void integrateResidualAssembled(const pylith::topology::Field<pylith::topology::Mesh>& residual,
+ const double t,
+ pylith::topology::SolutionFields* const fields);
+
+ /** Integrate contributions to Jacobian matrix (A) associated with
+ * operator that do not require assembly across cells, vertices, or
+ * processors.
+ *
+ * @param jacobian Sparse matrix
+ * @param t Current time
+ * @param fields Solution fields
+ * @param mesh Finite-element mesh
+ */
+ void integrateJacobianAssembled(pylith::topology::Jacobian* jacobian,
+ const double t,
+ pylith::topology::SolutionFields* const fields);
+
+ /** Integrate contributions to Jacobian matrix (A) associated with
+ * operator that do not require assembly across cells, vertices, or
+ * processors.
+ *
+ * @param jacobian Diagonal Jacobian matrix as a field.
+ * @param t Current time
+ * @param fields Solution fields
+ */
+ void integrateJacobianAssembled(pylith::topology::Field<pylith::topology::Mesh>* jacobian,
+ const double t,
+ pylith::topology::SolutionFields* const fields);
+
+ /** Adjust solution from solver with lumped Jacobian to match Lagrange
+ * multiplier constraints.
+ *
+ * @param fields Solution fields
+ * @param jacobian Jacobian of the system.
+ */
+ virtual
+ void adjustSolnLumped(pylith::topology::SolutionFields* fields,
+ const pylith::topology::Field<pylith::topology::Mesh>& jacobian);
+
+ /** Verify configuration is acceptable.
+ *
+ * @param mesh Finite-element mesh
+ */
+ void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
+
+ }; // class FaultCohesiveLagrange
+
+ } // faults
+} // pylith
+
+
+// End of file
Modified: short/3D/PyLith/trunk/modulesrc/faults/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/Makefile.am 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/modulesrc/faults/Makefile.am 2010-02-19 20:08:42 UTC (rev 16280)
@@ -27,8 +27,9 @@
EqKinSrc.i \
Fault.i \
FaultCohesive.i \
- FaultCohesiveDynL.i \
+ FaultCohesiveLagrange.i \
FaultCohesiveKin.i \
+ FaultCohesiveDyn.i \
FaultCohesiveTract.i \
../topology/SubMesh.i \
../feassemble/Quadrature.i \
Modified: short/3D/PyLith/trunk/modulesrc/faults/faults.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/faults/faults.i 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/modulesrc/faults/faults.i 2010-02-19 20:08:42 UTC (rev 16280)
@@ -24,8 +24,9 @@
#include "pylith/faults/EqKinSrc.hh"
#include "pylith/faults/Fault.hh"
#include "pylith/faults/FaultCohesive.hh"
-#include "pylith/faults/FaultCohesiveDynL.hh"
+#include "pylith/faults/FaultCohesiveLagrange.hh"
#include "pylith/faults/FaultCohesiveKin.hh"
+#include "pylith/faults/FaultCohesiveDyn.hh"
#include "pylith/faults/FaultCohesiveTract.hh"
#include "pylith/topology/SubMesh.hh"
@@ -73,8 +74,9 @@
%include "EqKinSrc.i"
%include "Fault.i"
%include "FaultCohesive.i"
-%include "FaultCohesiveDynL.i"
+%include "FaultCohesiveLagrange.i"
%include "FaultCohesiveKin.i"
+%include "FaultCohesiveDyn.i"
%include "FaultCohesiveTract.i"
// End of file
Modified: short/3D/PyLith/trunk/playpen/friction/twohex8/compression.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twohex8/compression.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twohex8/compression.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -125,7 +125,7 @@
# faults
# ----------------------------------------------------------------------
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twohex8/opening.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twohex8/opening.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twohex8/opening.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -103,7 +103,7 @@
# faults
# ----------------------------------------------------------------------
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twohex8/shear-sliding.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twohex8/shear-sliding.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twohex8/shear-sliding.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -185,7 +185,7 @@
# faults
# ----------------------------------------------------------------------
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twohex8/shear-stick.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twohex8/shear-stick.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twohex8/shear-stick.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -202,7 +202,7 @@
# faults
# ----------------------------------------------------------------------
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twoquad4/compression.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twoquad4/compression.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twoquad4/compression.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -120,7 +120,7 @@
# Provide information on the fault (interface).
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
# Define fault properties.
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twoquad4/opening.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twoquad4/opening.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twoquad4/opening.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -134,7 +134,7 @@
# Provide information on the fault (interface).
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
# Define fault properties.
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-sliding.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-sliding.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-sliding.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -170,7 +170,7 @@
# Provide information on the fault (interface).
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
# Define fault properties.
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-stick.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-stick.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twoquad4/shear-stick.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -184,7 +184,7 @@
# Provide information on the fault (interface).
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
# Define fault properties.
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twotet4/compression.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotet4/compression.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotet4/compression.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -125,7 +125,7 @@
# faults
# ----------------------------------------------------------------------
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twotet4/opening.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotet4/opening.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotet4/opening.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -103,7 +103,7 @@
# faults
# ----------------------------------------------------------------------
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twotet4/shear-sliding.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotet4/shear-sliding.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotet4/shear-sliding.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -187,7 +187,7 @@
# faults
# ----------------------------------------------------------------------
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twotet4/shear-stick.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotet4/shear-stick.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotet4/shear-stick.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -202,7 +202,7 @@
# faults
# ----------------------------------------------------------------------
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twotri3/compression.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotri3/compression.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotri3/compression.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -120,7 +120,7 @@
# Provide information on the fault (interface).
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
# Define fault properties.
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twotri3/opening.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotri3/opening.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotri3/opening.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -134,7 +134,7 @@
# Provide information on the fault (interface).
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
# Define fault properties.
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twotri3/shear-sliding.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotri3/shear-sliding.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotri3/shear-sliding.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -170,7 +170,7 @@
# Provide information on the fault (interface).
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
# Define fault properties.
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/playpen/friction/twotri3/shear-stick.cfg
===================================================================
--- short/3D/PyLith/trunk/playpen/friction/twotri3/shear-stick.cfg 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/playpen/friction/twotri3/shear-stick.cfg 2010-02-19 20:08:42 UTC (rev 16280)
@@ -184,7 +184,7 @@
# Provide information on the fault (interface).
[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveDynL
+fault = pylith.faults.FaultCohesiveDyn
# Define fault properties.
[pylithapp.timedependent.interfaces.fault]
Modified: short/3D/PyLith/trunk/pylith/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/pylith/Makefile.am 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/pylith/Makefile.am 2010-02-19 20:08:42 UTC (rev 16280)
@@ -33,7 +33,7 @@
faults/Fault.py \
faults/FaultCohesive.py \
faults/FaultCohesiveKin.py \
- faults/FaultCohesiveDynL.py \
+ faults/FaultCohesiveDyn.py \
faults/FaultCohesiveTract.py \
faults/LiuCosSlipFn.py \
faults/SingleRupture.py \
Copied: short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDyn.py (from rev 16277, short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDynL.py)
===================================================================
--- short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDyn.py (rev 0)
+++ short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDyn.py 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,225 @@
+#!/usr/bin/env python
+#
+# ----------------------------------------------------------------------
+#
+# Brad T. Aagaard
+# U.S. Geological Survey
+#
+# <LicenseText>
+#
+# ----------------------------------------------------------------------
+#
+
+## @file pylith/faults/FaultCohesiveDyn.py
+##
+
+## @brief Python object for a fault surface with dynamic
+## (friction) fault implemented with cohesive elements.
+##
+## Factory: fault
+
+from FaultCohesive import FaultCohesive
+from pylith.feassemble.Integrator import Integrator
+from faults import FaultCohesiveDyn as ModuleFaultCohesiveDyn
+
+from pylith.utils.NullComponent import NullComponent
+
+# FaultCohesiveDyn class
+class FaultCohesiveDyn(FaultCohesive, Integrator, ModuleFaultCohesiveDyn):
+ """
+ Python object for a fault surface with kinematic (prescribed) slip
+ implemented with cohesive elements.
+
+ Inventory
+
+ @class Inventory
+ Python object for managing FaultCohesiveDyn facilities and properties.
+
+ \b Properties
+ @li None
+
+ \b Facilities
+ @li \b db_initial_tractions Spatial database for initial tractions.
+ @li \b friction Fault constitutive model.
+ @li \b output Output manager associated with fault data.
+
+ Factory: fault
+ """
+
+ # INVENTORY //////////////////////////////////////////////////////////
+
+ import pyre.inventory
+
+ db = pyre.inventory.facility("db_initial_tractions", family="spatial_database",
+ factory=NullComponent)
+ db.meta['tip'] = "Spatial database for initial tractions."
+
+ from pylith.friction.StaticFriction import StaticFriction
+ friction = pyre.inventory.facility("friction", family="friction_model",
+ factory=StaticFriction)
+
+ from pylith.meshio.OutputFaultDyn import OutputFaultDyn
+ output = pyre.inventory.facility("output", family="output_manager",
+ factory=OutputFaultDyn)
+ output.meta['tip'] = "Output manager associated with fault data."
+
+
+ # PUBLIC METHODS /////////////////////////////////////////////////////
+
+ def __init__(self, name="faultcohesivedynl"):
+ """
+ Initialize configuration.
+ """
+ FaultCohesive.__init__(self, name)
+ Integrator.__init__(self)
+ self._loggingPrefix = "CoDy "
+
+ self.availableFields = \
+ {'vertex': \
+ {'info': ["normal_dir"],
+ 'data': ["slip",
+ "traction"]},
+ 'cell': \
+ {'info': [],
+ 'data': []}}
+ return
+
+
+ def preinitialize(self, mesh):
+ """
+ Do pre-initialization setup.
+ """
+ self._info.log("Pre-initializing fault '%s'." % self.label())
+ FaultCohesive.preinitialize(self, mesh)
+ Integrator.preinitialize(self, mesh)
+
+ ModuleFaultCohesiveDyn.quadrature(self, self.faultQuadrature)
+
+ if mesh.dimension() == 2:
+ self.availableFields['vertex']['info'] += ["strike_dir"]
+ elif mesh.dimension() == 3:
+ self.availableFields['vertex']['info'] += ["strike_dir",
+ "dip_dir"]
+
+ if not isinstance(self.inventory.db, NullComponent):
+ self.availableFields['vertex']['info'] += ["initial_traction"]
+ return
+
+
+ def verifyConfiguration(self):
+ """
+ Verify compatibility of configuration.
+ """
+ logEvent = "%sverify" % self._loggingPrefix
+ self._eventLogger.eventBegin(logEvent)
+
+ FaultCohesive.verifyConfiguration(self)
+ Integrator.verifyConfiguration(self)
+ ModuleFaultCohesiveDyn.verifyConfiguration(self, self.mesh)
+
+ self._eventLogger.eventEnd(logEvent)
+ return
+
+
+ def initialize(self, totalTime, numTimeSteps, normalizer):
+ """
+ Initialize cohesive elements.
+ """
+ logEvent = "%sinit" % self._loggingPrefix
+ self._eventLogger.eventBegin(logEvent)
+ self._info.log("Initializing fault '%s'." % self.label())
+
+ Integrator.initialize(self, totalTime, numTimeSteps, normalizer)
+
+ FaultCohesive.initialize(self, totalTime, numTimeSteps, normalizer)
+
+ self._eventLogger.eventEnd(logEvent)
+ return
+
+
+ def poststep(self, t, dt, totalTime, fields):
+ """
+ Hook for doing stuff after advancing time step.
+ """
+ logEvent = "%spoststep" % self._loggingPrefix
+ self._eventLogger.eventBegin(logEvent)
+
+ Integrator.poststep(self, t, dt, totalTime, fields)
+ FaultCohesive.poststep(self, t, dt, totalTime, fields)
+
+ self._eventLogger.eventEnd(logEvent)
+ return
+
+
+ def getVertexField(self, name, fields=None):
+ """
+ Get vertex field.
+ """
+ if None == fields:
+ field = ModuleFaultCohesiveDyn.vertexField(self, name)
+ else:
+ field = ModuleFaultCohesiveDyn.vertexField(self, name, fields)
+ return field
+
+
+ def getCellField(self, name, fields=None):
+ """
+ Get cell field.
+ """
+ if None == fields:
+ field = ModuleFaultCohesiveDyn.cellField(self, name)
+ else:
+ field = ModuleFaultCohesiveDyn.cellField(self, name, fields)
+ return field
+
+
+ def finalize(self):
+ """
+ Cleanup.
+ """
+ FaultCohesive.finalize(self)
+ Integrator.finalize(self)
+ return
+
+
+ # PRIVATE METHODS ////////////////////////////////////////////////////
+
+ def _configure(self):
+ """
+ Setup members using inventory.
+ """
+ FaultCohesive._configure(self)
+ if not isinstance(self.inventory.db, NullComponent):
+ ModuleFaultCohesiveDyn.dbInitialTract(self, self.inventory.db)
+ ModuleFaultCohesiveDyn.frictionModel(self, self.inventory.friction)
+ self.output = self.inventory.output
+ return
+
+
+ def _createModuleObj(self):
+ """
+ Create handle to C++ FaultCohesiveDyn.
+ """
+ ModuleFaultCohesiveDyn.__init__(self)
+ return
+
+
+ def _modelMemoryUse(self):
+ """
+ Model memory allocation.
+ """
+ self.perfLogger.logFault("Fault", self)
+ self.perfLogger.logFields("Fault", self.fields())
+ return
+
+
+# FACTORIES ////////////////////////////////////////////////////////////
+
+def fault():
+ """
+ Factory associated with FaultCohesiveDyn.
+ """
+ return FaultCohesiveDyn()
+
+
+# End of file
Deleted: short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDynL.py
===================================================================
--- short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDynL.py 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/pylith/faults/FaultCohesiveDynL.py 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,225 +0,0 @@
-#!/usr/bin/env python
-#
-# ----------------------------------------------------------------------
-#
-# Brad T. Aagaard
-# U.S. Geological Survey
-#
-# <LicenseText>
-#
-# ----------------------------------------------------------------------
-#
-
-## @file pylith/faults/FaultCohesiveDynL.py
-##
-
-## @brief Python object for a fault surface with dynamic
-## (friction) fault implemented with cohesive elements.
-##
-## Factory: fault
-
-from FaultCohesive import FaultCohesive
-from pylith.feassemble.Integrator import Integrator
-from faults import FaultCohesiveDynL as ModuleFaultCohesiveDynL
-
-from pylith.utils.NullComponent import NullComponent
-
-# FaultCohesiveDynL class
-class FaultCohesiveDynL(FaultCohesive, Integrator, ModuleFaultCohesiveDynL):
- """
- Python object for a fault surface with kinematic (prescribed) slip
- implemented with cohesive elements.
-
- Inventory
-
- @class Inventory
- Python object for managing FaultCohesiveDynL facilities and properties.
-
- \b Properties
- @li None
-
- \b Facilities
- @li \b db_initial_tractions Spatial database for initial tractions.
- @li \b friction Fault constitutive model.
- @li \b output Output manager associated with fault data.
-
- Factory: fault
- """
-
- # INVENTORY //////////////////////////////////////////////////////////
-
- import pyre.inventory
-
- db = pyre.inventory.facility("db_initial_tractions", family="spatial_database",
- factory=NullComponent)
- db.meta['tip'] = "Spatial database for initial tractions."
-
- from pylith.friction.StaticFriction import StaticFriction
- friction = pyre.inventory.facility("friction", family="friction_model",
- factory=StaticFriction)
-
- from pylith.meshio.OutputFaultDyn import OutputFaultDyn
- output = pyre.inventory.facility("output", family="output_manager",
- factory=OutputFaultDyn)
- output.meta['tip'] = "Output manager associated with fault data."
-
-
- # PUBLIC METHODS /////////////////////////////////////////////////////
-
- def __init__(self, name="faultcohesivedynl"):
- """
- Initialize configuration.
- """
- FaultCohesive.__init__(self, name)
- Integrator.__init__(self)
- self._loggingPrefix = "CoDy "
-
- self.availableFields = \
- {'vertex': \
- {'info': ["normal_dir"],
- 'data': ["slip",
- "traction"]},
- 'cell': \
- {'info': [],
- 'data': []}}
- return
-
-
- def preinitialize(self, mesh):
- """
- Do pre-initialization setup.
- """
- self._info.log("Pre-initializing fault '%s'." % self.label())
- FaultCohesive.preinitialize(self, mesh)
- Integrator.preinitialize(self, mesh)
-
- ModuleFaultCohesiveDynL.quadrature(self, self.faultQuadrature)
-
- if mesh.dimension() == 2:
- self.availableFields['vertex']['info'] += ["strike_dir"]
- elif mesh.dimension() == 3:
- self.availableFields['vertex']['info'] += ["strike_dir",
- "dip_dir"]
-
- if not isinstance(self.inventory.db, NullComponent):
- self.availableFields['vertex']['info'] += ["initial_traction"]
- return
-
-
- def verifyConfiguration(self):
- """
- Verify compatibility of configuration.
- """
- logEvent = "%sverify" % self._loggingPrefix
- self._eventLogger.eventBegin(logEvent)
-
- FaultCohesive.verifyConfiguration(self)
- Integrator.verifyConfiguration(self)
- ModuleFaultCohesiveDynL.verifyConfiguration(self, self.mesh)
-
- self._eventLogger.eventEnd(logEvent)
- return
-
-
- def initialize(self, totalTime, numTimeSteps, normalizer):
- """
- Initialize cohesive elements.
- """
- logEvent = "%sinit" % self._loggingPrefix
- self._eventLogger.eventBegin(logEvent)
- self._info.log("Initializing fault '%s'." % self.label())
-
- Integrator.initialize(self, totalTime, numTimeSteps, normalizer)
-
- FaultCohesive.initialize(self, totalTime, numTimeSteps, normalizer)
-
- self._eventLogger.eventEnd(logEvent)
- return
-
-
- def poststep(self, t, dt, totalTime, fields):
- """
- Hook for doing stuff after advancing time step.
- """
- logEvent = "%spoststep" % self._loggingPrefix
- self._eventLogger.eventBegin(logEvent)
-
- Integrator.poststep(self, t, dt, totalTime, fields)
- FaultCohesive.poststep(self, t, dt, totalTime, fields)
-
- self._eventLogger.eventEnd(logEvent)
- return
-
-
- def getVertexField(self, name, fields=None):
- """
- Get vertex field.
- """
- if None == fields:
- field = ModuleFaultCohesiveDynL.vertexField(self, name)
- else:
- field = ModuleFaultCohesiveDynL.vertexField(self, name, fields)
- return field
-
-
- def getCellField(self, name, fields=None):
- """
- Get cell field.
- """
- if None == fields:
- field = ModuleFaultCohesiveDynL.cellField(self, name)
- else:
- field = ModuleFaultCohesiveDynL.cellField(self, name, fields)
- return field
-
-
- def finalize(self):
- """
- Cleanup.
- """
- FaultCohesive.finalize(self)
- Integrator.finalize(self)
- return
-
-
- # PRIVATE METHODS ////////////////////////////////////////////////////
-
- def _configure(self):
- """
- Setup members using inventory.
- """
- FaultCohesive._configure(self)
- if not isinstance(self.inventory.db, NullComponent):
- ModuleFaultCohesiveDynL.dbInitialTract(self, self.inventory.db)
- ModuleFaultCohesiveDynL.frictionModel(self, self.inventory.friction)
- self.output = self.inventory.output
- return
-
-
- def _createModuleObj(self):
- """
- Create handle to C++ FaultCohesiveDynL.
- """
- ModuleFaultCohesiveDynL.__init__(self)
- return
-
-
- def _modelMemoryUse(self):
- """
- Model memory allocation.
- """
- self.perfLogger.logFault("Fault", self)
- self.perfLogger.logFields("Fault", self.fields())
- return
-
-
-# FACTORIES ////////////////////////////////////////////////////////////
-
-def fault():
- """
- Factory associated with FaultCohesiveDynL.
- """
- return FaultCohesiveDynL()
-
-
-# End of file
Modified: short/3D/PyLith/trunk/pylith/faults/__init__.py
===================================================================
--- short/3D/PyLith/trunk/pylith/faults/__init__.py 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/pylith/faults/__init__.py 2010-02-19 20:08:42 UTC (rev 16280)
@@ -17,9 +17,10 @@
__all__ = ['BruneSlipFn',
'ConstRateSlipFn',
'EqKinSrc',
+ 'Fault',
+ 'FaultCohesive',
'FaultCohesiveKin',
- 'FaultCohesive',
- 'Fault',
+ 'FaultCohesiveDyn',
'SlipTimeFn',
'SingleRupture',
'StepSlipFn',
Modified: short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/Makefile.am 2010-02-19 20:08:42 UTC (rev 16280)
@@ -45,11 +45,11 @@
TestFaultCohesiveKinSrcsQuad4.cc \
TestFaultCohesiveKinSrcsTet4.cc \
TestFaultCohesiveKinSrcsHex8.cc \
- TestFaultCohesiveDynL.cc \
- TestFaultCohesiveDynLTri3.cc \
- TestFaultCohesiveDynLQuad4.cc \
- TestFaultCohesiveDynLHex8.cc \
- TestFaultCohesiveDynLTet4.cc \
+ TestFaultCohesiveDyn.cc \
+ TestFaultCohesiveDynTri3.cc \
+ TestFaultCohesiveDynQuad4.cc \
+ TestFaultCohesiveDynHex8.cc \
+ TestFaultCohesiveDynTet4.cc \
test_faults.cc
@@ -77,11 +77,11 @@
TestFaultCohesiveKinSrcsQuad4.hh \
TestFaultCohesiveKinSrcsTet4.hh \
TestFaultCohesiveKinSrcsHex8.hh \
- TestFaultCohesiveDynL.hh \
- TestFaultCohesiveDynLTri3.hh \
- TestFaultCohesiveDynLQuad4.hh \
- TestFaultCohesiveDynLHex8.hh \
- TestFaultCohesiveDynLTet4.hh
+ TestFaultCohesiveDyn.hh \
+ TestFaultCohesiveDynTri3.hh \
+ TestFaultCohesiveDynQuad4.hh \
+ TestFaultCohesiveDynHex8.hh \
+ TestFaultCohesiveDynTet4.hh
# Source files associated with testing data
testfaults_SOURCES += \
@@ -139,11 +139,11 @@
data/CohesiveKinSrcsDataQuad4.cc \
data/CohesiveKinSrcsDataTet4.cc \
data/CohesiveKinSrcsDataHex8.cc \
- data/CohesiveDynLData.cc \
- data/CohesiveDynLDataTri3.cc \
- data/CohesiveDynLDataQuad4.cc \
- data/CohesiveDynLDataHex8.cc \
- data/CohesiveDynLDataTet4.cc
+ data/CohesiveDynData.cc \
+ data/CohesiveDynDataTri3.cc \
+ data/CohesiveDynDataQuad4.cc \
+ data/CohesiveDynDataHex8.cc \
+ data/CohesiveDynDataTet4.cc
noinst_HEADERS += \
data/CohesiveData.hh \
@@ -200,11 +200,11 @@
data/CohesiveKinSrcsDataQuad4.hh \
data/CohesiveKinSrcsDataTet4.hh \
data/CohesiveKinSrcsDataHex8.hh \
- data/CohesiveDynLData.hh \
- data/CohesiveDynLDataTri3.hh \
- data/CohesiveDynLDataQuad4.hh \
- data/CohesiveDynLDataHex8.hh \
- data/CohesiveDynLDataTet4.hh
+ data/CohesiveDynData.hh \
+ data/CohesiveDynDataTri3.hh \
+ data/CohesiveDynDataQuad4.hh \
+ data/CohesiveDynDataHex8.hh \
+ data/CohesiveDynDataTet4.hh
AM_CPPFLAGS = \
$(PYTHON_EGG_CPPFLAGS) -I$(PYTHON_INCDIR) \
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,851 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultCohesiveDyn.hh" // Implementation of class methods
+
+#include "pylith/faults/FaultCohesiveDyn.hh" // USES FaultCohesiveDyn
+
+#include "data/CohesiveDynData.hh" // USES CohesiveDynData
+
+#include "pylith/faults/EqKinSrc.hh" // USES EqKinSrc
+#include "pylith/faults/BruneSlipFn.hh" // USES BruneSlipFn
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
+#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+#include "pylith/topology/Jacobian.hh" // USES Jacobian
+#include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
+#include "pylith/friction/StaticFriction.hh" // USES StaticFriction
+
+#include "spatialdata/geocoords/CSCart.hh" // USES CSCart
+#include "spatialdata/spatialdb/SimpleDB.hh" // USES SimpleDB
+#include "spatialdata/spatialdb/SimpleIOAscii.hh" // USES SimpleIOAscii
+
+#include <stdexcept> // USES runtime_error
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDyn );
+
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::faults::TestFaultCohesiveDyn::setUp(void)
+{ // setUp
+ _data = 0;
+ _quadrature = new feassemble::Quadrature<topology::SubMesh>();
+ CPPUNIT_ASSERT(0 != _quadrature);
+ _dbInitialTract = 0;
+ _friction = 0;
+ _dbFriction = 0;
+ _flipFault = false;
+} // setUp
+
+// ----------------------------------------------------------------------
+// Tear down testing data.
+void
+pylith::faults::TestFaultCohesiveDyn::tearDown(void)
+{ // tearDown
+ delete _data; _data = 0;
+ delete _quadrature; _quadrature = 0;
+ delete _dbInitialTract; _dbInitialTract = 0;
+ delete _friction; _friction = 0;
+ delete _dbFriction; _dbFriction = 0;
+} // tearDown
+
+// ----------------------------------------------------------------------
+// Test constructor.
+void
+pylith::faults::TestFaultCohesiveDyn::testConstructor(void)
+{ // testConstructor
+ FaultCohesiveDyn fault;
+} // testConstructor
+
+// ----------------------------------------------------------------------
+// Test needJacobianDiag().
+void
+pylith::faults::TestFaultCohesiveDyn::testNeedJacobianDiag(void)
+{ // testNeedJacobianDiag
+ FaultCohesiveDyn fault;
+
+ CPPUNIT_ASSERT_EQUAL(true, fault.needJacobianDiag());
+} // testNeedJacobianDiag
+
+// ----------------------------------------------------------------------
+// Test needVelocity().
+void
+pylith::faults::TestFaultCohesiveDyn::testNeedVelocity(void)
+{ // testNeedVelocity
+ FaultCohesiveDyn fault;
+
+ CPPUNIT_ASSERT_EQUAL(true, fault.needVelocity());
+} // testNeedVelocity
+
+// ----------------------------------------------------------------------
+// Test dbInitialTract().
+void
+pylith::faults::TestFaultCohesiveDyn::testDBInitialTract(void)
+{ // testDBInitialTract
+ FaultCohesiveDyn fault;
+
+ const std::string& label = "test database";
+ spatialdata::spatialdb::SimpleDB db;
+ db.label(label.c_str());
+ fault.dbInitialTract(&db);
+ CPPUNIT_ASSERT(0 != fault._dbInitialTract);
+ CPPUNIT_ASSERT_EQUAL(label, std::string(fault._dbInitialTract->label()));
+ } // testDBInitialTract
+
+// ----------------------------------------------------------------------
+// Test initialize().
+void
+pylith::faults::TestFaultCohesiveDyn::testInitialize(void)
+{ // testInitialize
+ CPPUNIT_ASSERT(0 != _data);
+
+ topology::Mesh mesh;
+ FaultCohesiveDyn fault;
+ topology::SolutionFields fields(mesh);
+ _initialize(&mesh, &fault, &fields);
+
+ const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+ CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+ SieveSubMesh::renumbering_type& renumbering =
+ faultSieveMesh->getRenumbering();
+ const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+ faultSieveMesh->depthStratum(0);
+ CPPUNIT_ASSERT(!vertices.isNull());
+ const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
+ const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+ int iVertex = 0;
+ for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
+ v_iter != verticesEnd;
+ ++v_iter, ++iVertex) {
+ CPPUNIT_ASSERT(renumbering.find(_data->constraintVertices[iVertex]) !=
+ renumbering.end());
+ CPPUNIT_ASSERT_EQUAL(renumbering[_data->constraintVertices[iVertex]],
+ *v_iter);
+ } // for
+ CPPUNIT_ASSERT_EQUAL(_data->numConstraintVert, iVertex);
+
+ // Check orientation
+ //fault._fields->get("orientation").view("ORIENTATION"); // DEBUGGING
+ const ALE::Obj<RealSection>& orientationSection =
+ fault._fields->get("orientation").section();
+ CPPUNIT_ASSERT(!orientationSection.isNull());
+ const int spaceDim = _data->spaceDim;
+ const int orientationSize = spaceDim*spaceDim;
+ iVertex = 0;
+ for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
+ v_iter != verticesEnd;
+ ++v_iter, ++iVertex) {
+ const int fiberDim = orientationSection->getFiberDimension(*v_iter);
+ CPPUNIT_ASSERT_EQUAL(orientationSize, fiberDim);
+ const double* orientationVertex =
+ orientationSection->restrictPoint(*v_iter);
+ CPPUNIT_ASSERT(0 != orientationVertex);
+
+ const double tolerance = 1.0e-06;
+ for (int i=0; i < orientationSize; ++i) {
+ const int index = iVertex*orientationSize+i;
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->orientation[index],
+ orientationVertex[i], tolerance);
+ } // for
+ } // for
+
+ // Check area
+ const ALE::Obj<RealSection>& areaSection =
+ fault._fields->get("area").section();
+ CPPUNIT_ASSERT(!areaSection.isNull());
+ iVertex = 0;
+ for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
+ v_iter != verticesEnd;
+ ++v_iter, ++iVertex) {
+ const int fiberDim = areaSection->getFiberDimension(*v_iter);
+ CPPUNIT_ASSERT_EQUAL(1, fiberDim);
+ const double* areaVertex = areaSection->restrictPoint(*v_iter);
+ CPPUNIT_ASSERT(0 != areaVertex);
+
+ const double tolerance = 1.0e-06;
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->area[iVertex], areaVertex[0],
+ tolerance);
+ } // for
+
+ // Initial tractions
+ if (0 != fault._dbInitialTract) {
+ //fault._fields->get("initial traction").view("INITIAL TRACTIONS"); // DEBUGGING
+ const ALE::Obj<RealSection>& tractionSection = fault._fields->get(
+ "initial traction").section();
+ CPPUNIT_ASSERT(!tractionSection.isNull());
+ const int spaceDim = _data->spaceDim;
+ iVertex = 0;
+ for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin;
+ v_iter != verticesEnd;
+ ++v_iter, ++iVertex) {
+ const int fiberDim = tractionSection->getFiberDimension(*v_iter);
+ CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
+ const double* tractionVertex = tractionSection->restrictPoint(*v_iter);
+ CPPUNIT_ASSERT(0 != tractionVertex);
+
+ const double tolerance = 1.0e-06;
+ for (int i = 0; i < spaceDim; ++i) {
+ const int index = iVertex * spaceDim + i;
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->initialTractions[index],
+ tractionVertex[i], tolerance);
+ } // for
+ } // for
+ } // if
+} // testInitialize
+
+// ----------------------------------------------------------------------
+// Test constrainSolnSpace() for sticking case.
+void
+pylith::faults::TestFaultCohesiveDyn::testConstrainSolnSpaceStick(void)
+{ // testConstrainSolnSpaceStick
+ assert(0 != _data);
+
+ topology::Mesh mesh;
+ FaultCohesiveDyn fault;
+ topology::SolutionFields fields(mesh);
+ _initialize(&mesh, &fault, &fields);
+ topology::Jacobian jacobian(fields, "seqdense");
+ _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrStick);
+
+ const int spaceDim = _data->spaceDim;
+
+ const double t = 2.134;
+ const double dt = 0.01;
+ fault.timeStep(dt);
+ fault.constrainSolnSpace(&fields, t, jacobian);
+
+ { // Check solution values
+ // No change to Lagrange multipliers for stick case.
+ const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+ CPPUNIT_ASSERT(!sieveMesh.isNull());
+ const ALE::Obj<SieveMesh::label_sequence>& vertices =
+ sieveMesh->depthStratum(0);
+ CPPUNIT_ASSERT(!vertices.isNull());
+ const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
+ const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+ // Get section containing solution (disp + Lagrange multipliers)
+ const ALE::Obj<RealSection>& dispIncrSection =
+ fields.get("dispIncr(t->t+dt)").section();
+ CPPUNIT_ASSERT(!dispIncrSection.isNull());
+
+ //dispIncrSection->view("DISP INCREMENT"); // DEBUGGING
+
+ // Get expected values
+ const double* valsE = _data->fieldIncrStick; // No change in dispIncr
+ int iVertex = 0; // variable to use as index into valsE array
+ const int fiberDimE = spaceDim; // number of values per point
+ const double tolerance = 1.0e-06;
+ for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
+ v_iter != verticesEnd;
+ ++v_iter, ++iVertex) { // loop over all vertices in mesh
+ // Check fiber dimension (number of values at point)
+ const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
+ CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+ const double* vals = dispIncrSection->restrictPoint(*v_iter);
+ CPPUNIT_ASSERT(0 != vals);
+
+ // Check values at point
+ for (int i = 0; i < fiberDimE; ++i) {
+ const int index = iVertex * spaceDim + i;
+ const double valE = valsE[index];
+ if (fabs(valE) > tolerance)
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
+ else
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+ } // for
+ } // for
+ } // Check solution values
+
+ { // Check slip values
+ // Slip should be zero for the stick case.
+
+ // Get fault vertex info
+ const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+ CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+ SieveSubMesh::renumbering_type& renumbering =
+ faultSieveMesh->getRenumbering();
+ const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+ faultSieveMesh->depthStratum(0);
+ CPPUNIT_ASSERT(!vertices.isNull());
+ const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
+ const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+ // Get section containing slip
+ const ALE::Obj<RealSection>& slipSection =
+ fault._fields->get("slip").section();
+ CPPUNIT_ASSERT(!slipSection.isNull());
+
+ const double valE = 0.0; // slip should be zero
+ int iVertex = 0; // variable to use as index into valsE array
+ const int fiberDimE = spaceDim; // number of values per point
+ const double tolerance = 1.0e-06;
+ for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+ != verticesEnd;
+ ++v_iter, ++iVertex) { // loop over fault vertices
+ // Check fiber dimension (number of values at point)
+ const int fiberDim = slipSection->getFiberDimension(*v_iter);
+ CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+ const double* vals = slipSection->restrictPoint(*v_iter);
+ CPPUNIT_ASSERT(0 != vals);
+
+ // Check values at point
+ for (int i = 0; i < fiberDimE; ++i) {
+ const int index = iVertex * spaceDim + i;
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+ } // for
+ } // for
+ } // Check slip values
+
+} // testConstrainSolnSpaceStick
+
+// ----------------------------------------------------------------------
+// Test constrainSolnSpace() for slipping case.
+void
+pylith::faults::TestFaultCohesiveDyn::testConstrainSolnSpaceSlip(void)
+{ // testConstrainSolnSpaceSlip
+ assert(0 != _data);
+
+ topology::Mesh mesh;
+ FaultCohesiveDyn fault;
+ topology::SolutionFields fields(mesh);
+ _initialize(&mesh, &fault, &fields);
+ topology::Jacobian jacobian(fields, "seqdense");
+ _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrSlip);
+
+ const int spaceDim = _data->spaceDim;
+
+ const double t = 2.134;
+ const double dt = 0.01;
+ fault.timeStep(dt);
+ fault.constrainSolnSpace(&fields, t, jacobian);
+
+ //residual.view("RESIDUAL"); // DEBUGGING
+
+ { // Check solution values
+ // Lagrange multipliers should be adjusted according to friction
+ // as reflected in the fieldIncrSlipE data member.
+ const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+ CPPUNIT_ASSERT(!sieveMesh.isNull());
+ const ALE::Obj<SieveMesh::label_sequence>& vertices =
+ sieveMesh->depthStratum(0);
+ CPPUNIT_ASSERT(!vertices.isNull());
+ const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
+ const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+ // Get section containing solution (disp + Lagrange multipliers)
+ const ALE::Obj<RealSection>& dispIncrSection =
+ fields.get("dispIncr(t->t+dt)").section();
+ CPPUNIT_ASSERT(!dispIncrSection.isNull());
+
+ // Get expected values
+ const double* valsE = _data->fieldIncrSlipE; // Expected values for dispIncr
+ int iVertex = 0; // variable to use as index into valsE array
+ const int fiberDimE = spaceDim; // number of values per point
+ const double tolerance = 1.0e-06;
+ for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
+ v_iter != verticesEnd;
+ ++v_iter, ++iVertex) { // loop over all vertices in mesh
+ // Check fiber dimension (number of values at point)
+ const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
+ CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+ const double* vals = dispIncrSection->restrictPoint(*v_iter);
+ CPPUNIT_ASSERT(0 != vals);
+
+ // Check values at point
+ for (int i = 0; i < fiberDimE; ++i) {
+ const int index = iVertex * spaceDim + i;
+ const double valE = valsE[index];
+ std::cout << "valE: " << valE
+ << ", val: " << vals[i]
+ << std::endl;
+ if (fabs(valE) > tolerance)
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
+ else
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+ } // for
+ } // for
+ } // Check solution values
+
+ { // Check slip values
+ // Slip values should be adjusted based on the change in the
+ // Lagrange multipliers as reflected in the slipSlipE data member.
+
+ // Get fault vertex info
+ const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+ CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+ SieveSubMesh::renumbering_type& renumbering =
+ faultSieveMesh->getRenumbering();
+ const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+ faultSieveMesh->depthStratum(0);
+ CPPUNIT_ASSERT(!vertices.isNull());
+ const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
+ const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+ // Get section containing slip
+ const ALE::Obj<RealSection>& slipSection =
+ fault._fields->get("slip").section();
+ CPPUNIT_ASSERT(!slipSection.isNull());
+
+ // Get expected values
+ const double* valsE = _data->slipSlipE;
+ int iVertex = 0; // variable to use as index into valsE array
+ const int fiberDimE = spaceDim; // number of values per point
+ const double tolerance = 1.0e-06;
+ for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+ != verticesEnd;
+ ++v_iter, ++iVertex) { // loop over fault vertices
+ // Check fiber dimension (number of values at point)
+ const int fiberDim = slipSection->getFiberDimension(*v_iter);
+ CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+ const double* vals = slipSection->restrictPoint(*v_iter);
+ CPPUNIT_ASSERT(0 != vals);
+
+ // Check values at point
+ for (int i = 0; i < fiberDimE; ++i) {
+ const int index = iVertex * spaceDim + i;
+ const double valE = valsE[index];
+ std::cout << "valE: " << valE
+ << ", val: " << vals[i]
+ << std::endl;
+ if (fabs(valE) > tolerance)
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
+ else
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+ } // for
+ } // for
+ } // Check slip values
+
+} // testConstrainSolnSpaceSlip
+
+// ----------------------------------------------------------------------
+// Test constrainSolnSpace() for opening case.
+void
+pylith::faults::TestFaultCohesiveDyn::testConstrainSolnSpaceOpen(void)
+{ // testConstrainSolnSpaceOpen
+ assert(0 != _data);
+
+ topology::Mesh mesh;
+ FaultCohesiveDyn fault;
+ topology::SolutionFields fields(mesh);
+ _initialize(&mesh, &fault, &fields);
+ topology::Jacobian jacobian(fields, "seqdense");
+ _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrOpen);
+
+ const int spaceDim = _data->spaceDim;
+
+ const double t = 2.134;
+ const double dt = 0.01;
+ fault.timeStep(dt);
+ fault.constrainSolnSpace(&fields, t, jacobian);
+
+ //residual.view("RESIDUAL"); // DEBUGGING
+
+ { // Check solution values
+ // Lagrange multipliers should be set to zero as reflected in the
+ // fieldIncrOpenE data member.
+ const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+ CPPUNIT_ASSERT(!sieveMesh.isNull());
+ const ALE::Obj<SieveMesh::label_sequence>& vertices =
+ sieveMesh->depthStratum(0);
+ CPPUNIT_ASSERT(!vertices.isNull());
+ const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
+ const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+ // Get section containing solution (disp + Lagrange multipliers)
+ const ALE::Obj<RealSection>& dispIncrSection =
+ fields.get("dispIncr(t->t+dt)").section();
+ CPPUNIT_ASSERT(!dispIncrSection.isNull());
+
+ // Get expected values
+ const double* valsE = _data->fieldIncrOpenE; // Expected values for dispIncr
+ int iVertex = 0; // variable to use as index into valsE array
+ const int fiberDimE = spaceDim; // number of values per point
+ const double tolerance = 1.0e-06;
+ for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
+ v_iter != verticesEnd;
+ ++v_iter, ++iVertex) { // loop over all vertices in mesh
+ // Check fiber dimension (number of values at point)
+ const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
+ CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+ const double* vals = dispIncrSection->restrictPoint(*v_iter);
+ CPPUNIT_ASSERT(0 != vals);
+
+ // Check values at point
+ for (int i = 0; i < fiberDimE; ++i) {
+ const int index = iVertex * spaceDim + i;
+ const double valE = valsE[index];
+ std::cout << "valE: " << valE
+ << ", val: " << vals[i]
+ << std::endl;
+ if (fabs(valE) > tolerance)
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
+ else
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+ } // for
+ } // for
+ } // Check solution values
+
+ { // Check slip values
+ // Slip values should be adjusted based on the change in the
+ // Lagrange multipliers as reflected in the slipOpenE data member.
+
+ // Get fault vertex info
+ const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+ CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+ SieveSubMesh::renumbering_type& renumbering =
+ faultSieveMesh->getRenumbering();
+ const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
+ faultSieveMesh->depthStratum(0);
+ CPPUNIT_ASSERT(!vertices.isNull());
+ const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
+ const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+ // Get section containing slip
+ const ALE::Obj<RealSection>& slipSection =
+ fault._fields->get("slip").section();
+ CPPUNIT_ASSERT(!slipSection.isNull());
+
+ // Get expected values
+ const double* valsE = _data->slipOpenE;
+ int iVertex = 0; // variable to use as index into valsE array
+ const int fiberDimE = spaceDim; // number of values per point
+ const double tolerance = 1.0e-06;
+ for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
+ != verticesEnd;
+ ++v_iter, ++iVertex) { // loop over fault vertices
+ // Check fiber dimension (number of values at point)
+ const int fiberDim = slipSection->getFiberDimension(*v_iter);
+ CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
+ const double* vals = slipSection->restrictPoint(*v_iter);
+ CPPUNIT_ASSERT(0 != vals);
+
+ // Check values at point
+ for (int i = 0; i < fiberDimE; ++i) {
+ const int index = iVertex * spaceDim + i;
+ const double valE = valsE[index];
+ std::cout << "valE: " << valE
+ << ", val: " << vals[i]
+ << std::endl;
+ if (fabs(valE) > tolerance)
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
+ else
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
+ } // for
+ } // for
+ } // Check slip values
+
+} // testConstrainSolnSpaceOpen
+
+// ----------------------------------------------------------------------
+// Test updateStateVars().
+void
+pylith::faults::TestFaultCohesiveDyn::testUpdateStateVars(void)
+{ // testUpdateStateVars
+ // :TODO: Need to verify that fault constitutive updateStateVars is called.
+} // testUpdateStateVars
+
+// ----------------------------------------------------------------------
+// Test calcTractions().
+void
+pylith::faults::TestFaultCohesiveDyn::testCalcTractions(void)
+{ // testCalcTractions
+ CPPUNIT_ASSERT(0 != _data);
+
+ topology::Mesh mesh;
+ FaultCohesiveDyn fault;
+ topology::SolutionFields fields(mesh);
+ _initialize(&mesh, &fault, &fields);
+ topology::Jacobian jacobian(fields, "seqdense");
+ _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrStick);
+
+ CPPUNIT_ASSERT(0 != fault._faultMesh);
+ const int spaceDim = _data->spaceDim;
+ topology::Field<topology::SubMesh> tractions(*fault._faultMesh);
+ tractions.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
+ tractions.allocate();
+ tractions.zero();
+ const ALE::Obj<RealSection>& tractionsSection = tractions.section();
+ CPPUNIT_ASSERT(!tractionsSection.isNull());
+
+ const double t = 0;
+ fault.updateStateVars(t, &fields);
+ fault._calcTractions(&tractions, fields.get("disp(t)"));
+
+ //tractions.view("TRACTIONS"); // DEBUGGING
+
+ const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
+ CPPUNIT_ASSERT(!faultSieveMesh.isNull());
+ const ALE::Obj<SieveMesh::label_sequence>& vertices =
+ faultSieveMesh->depthStratum(0);
+ CPPUNIT_ASSERT(!vertices.isNull());
+ const SieveSubMesh::label_sequence::iterator verticesBegin =
+ vertices->begin();
+ const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
+ SieveSubMesh::renumbering_type& renumbering =
+ faultSieveMesh->getRenumbering();
+ const SieveMesh::renumbering_type::const_iterator renumberingBegin =
+ renumbering.begin();
+ const SieveMesh::renumbering_type::const_iterator renumberingEnd =
+ renumbering.end();
+
+ const ALE::Obj<RealSection>& dispSection = fields.get("disp(t)").section();
+ CPPUNIT_ASSERT(!dispSection.isNull());
+
+ int iVertex = 0;
+ const double tolerance = 1.0e-06;
+ for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
+ v_iter != verticesEnd;
+ ++v_iter, ++iVertex) {
+ SieveMesh::point_type meshVertex = -1;
+ bool found = false;
+
+ // Test with dbInitialTract
+ for (SieveMesh::renumbering_type::const_iterator r_iter = renumberingBegin;
+ r_iter != renumberingEnd;
+ ++r_iter) {
+ if (r_iter->second == *v_iter) {
+ meshVertex = r_iter->first;
+ found = true;
+ break;
+ } // if
+ } // for
+ CPPUNIT_ASSERT(found);
+ int fiberDim = tractionsSection->getFiberDimension(*v_iter);
+ CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
+ const double* tractionsVertex = tractionsSection->restrictPoint(*v_iter);
+ CPPUNIT_ASSERT(0 != tractionsVertex);
+
+ fiberDim = dispSection->getFiberDimension(meshVertex);
+ CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
+ const double* dispVertex = dispSection->restrictPoint(meshVertex);
+ CPPUNIT_ASSERT(0 != dispVertex);
+
+ const double scale = 1.0 / _data->area[iVertex];
+ for (int iDim=0; iDim < spaceDim; ++iDim) {
+ const double tractionE =
+ _data->initialTractions[iVertex*spaceDim+iDim] +
+ dispVertex[iDim] * scale;
+ if (tractionE != 0.0)
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, tractionsVertex[iDim]/tractionE,
+ tolerance);
+ else
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(tractionE, tractionsVertex[iDim],
+ tolerance);
+ } // for
+ } // for
+
+ // Test without dbInitialTract
+ // :TODO: STUFF GOES HERE (Brad)
+} // testCalcTractions
+
+// ----------------------------------------------------------------------
+// Initialize FaultCohesiveDyn interface condition.
+void
+pylith::faults::TestFaultCohesiveDyn::_initialize(
+ topology::Mesh* const mesh,
+ FaultCohesiveDyn* const fault,
+ topology::SolutionFields* const fields)
+{ // _initialize
+ CPPUNIT_ASSERT(0 != mesh);
+ CPPUNIT_ASSERT(0 != fault);
+ CPPUNIT_ASSERT(0 != fields);
+ CPPUNIT_ASSERT(0 != _data);
+ CPPUNIT_ASSERT(0 != _quadrature);
+
+ meshio::MeshIOAscii iohandler;
+ iohandler.filename(_data->meshFilename);
+ iohandler.read(mesh);
+
+ //mesh->debug(true); // DEBUGGING
+
+ spatialdata::geocoords::CSCart cs;
+ spatialdata::units::Nondimensional normalizer;
+ cs.setSpaceDim(mesh->dimension());
+ cs.initialize();
+ mesh->coordsys(&cs);
+ mesh->nondimensionalize(normalizer);
+
+ _quadrature->initialize(_data->basis, _data->numQuadPts, _data->numBasis,
+ _data->basisDeriv,
+ _data->numQuadPts, _data->numBasis, _data->cellDim,
+ _data->quadPts, _data->numQuadPts, _data->cellDim,
+ _data->quadWts, _data->numQuadPts,
+ _data->spaceDim);
+
+ // Setup initial tractions
+ spatialdata::spatialdb::SimpleDB* db =
+ new spatialdata::spatialdb::SimpleDB("initial tractions");
+ CPPUNIT_ASSERT(0 != db);
+ spatialdata::spatialdb::SimpleIOAscii ioInitialTract;
+ ioInitialTract.filename(_data->initialTractFilename);
+ db->ioHandler(&ioInitialTract);
+ delete _dbInitialTract; _dbInitialTract = db;
+ fault->dbInitialTract(db);
+
+ // Setup friction
+ spatialdata::spatialdb::SimpleDB* dbFriction =
+ new spatialdata::spatialdb::SimpleDB("static friction");
+ CPPUNIT_ASSERT(0 != dbFriction);
+ spatialdata::spatialdb::SimpleIOAscii ioFriction;
+ if (2 == _data->spaceDim)
+ ioFriction.filename("data/static_friction_2d.spatialdb");
+ else if (3 == _data->spaceDim)
+ ioFriction.filename("data/static_friction_3d.spatialdb");
+ dbFriction->ioHandler(&ioFriction);
+ delete _dbFriction; _dbFriction = dbFriction;
+ friction::StaticFriction* friction = new pylith::friction::StaticFriction();
+ CPPUNIT_ASSERT(0 != friction);
+ friction->label("static friction");
+ friction->dbProperties(dbFriction);
+ _friction = friction;
+ fault->frictionModel(friction);
+
+ int firstFaultVertex = 0;
+ int firstLagrangeVertex = mesh->sieveMesh()->getIntSection(_data->label)->size();
+ int firstFaultCell = mesh->sieveMesh()->getIntSection(_data->label)->size();
+ if (fault->useLagrangeConstraints())
+ firstFaultCell += mesh->sieveMesh()->getIntSection(_data->label)->size();
+ fault->id(_data->id);
+ fault->label(_data->label);
+ fault->quadrature(_quadrature);
+
+ fault->adjustTopology(mesh, &firstFaultVertex, &firstLagrangeVertex,
+ &firstFaultCell, _flipFault);
+
+ const double upDir[] = { 0.0, 0.0, 1.0 };
+ const double normalDir[] = { 1.0, 0.0, 0.0 };
+
+ fault->initialize(*mesh, upDir, normalDir);
+
+ // Setup fields
+ fields->add("disp(t)", "displacement");
+ fields->add("dispIncr(t->t+dt)", "displacement_increment");
+ fields->add("velocity(t)", "velocity");
+ fields->solutionName("dispIncr(t->t+dt)");
+
+ const int spaceDim = _data->spaceDim;
+ topology::Field<topology::Mesh>& disp = fields->get("disp(t)");
+ disp.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
+ disp.allocate();
+ fields->copyLayout("disp(t)");
+} // _initialize
+
+// ----------------------------------------------------------------------
+// Set values for fields and Jacobian.
+void
+pylith::faults::TestFaultCohesiveDyn::_setFieldsJacobian(
+ topology::Mesh* const mesh,
+ FaultCohesiveDyn* const fault,
+ topology::SolutionFields* const fields,
+ topology::Jacobian* const jacobian,
+ const double* const fieldIncr)
+{ // _initialize
+ CPPUNIT_ASSERT(0 != mesh);
+ CPPUNIT_ASSERT(0 != fault);
+ CPPUNIT_ASSERT(0 != fields);
+ CPPUNIT_ASSERT(0 != jacobian);
+ CPPUNIT_ASSERT(0 != _data);
+ CPPUNIT_ASSERT(0 != fieldIncr);
+
+ const int spaceDim = _data->spaceDim;
+
+ // Get vertices in mesh
+ const ALE::Obj<SieveMesh>& sieveMesh = mesh->sieveMesh();
+ CPPUNIT_ASSERT(!sieveMesh.isNull());
+ const ALE::Obj<SieveMesh::label_sequence>& vertices =
+ sieveMesh->depthStratum(0);
+ CPPUNIT_ASSERT(!vertices.isNull());
+ const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
+ const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
+
+ // Set displacement values
+ const ALE::Obj<RealSection>& dispSection =
+ fields->get("disp(t)").section();
+ CPPUNIT_ASSERT(!dispSection.isNull());
+ int iVertex = 0;
+ for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
+ v_iter != verticesEnd;
+ ++v_iter, ++iVertex)
+ dispSection->updatePoint(*v_iter, &_data->fieldT[iVertex*spaceDim]);
+
+ // Set increment values
+ const ALE::Obj<RealSection>& dispIncrSection =
+ fields->get("dispIncr(t->t+dt)").section();
+ CPPUNIT_ASSERT(!dispIncrSection.isNull());
+ iVertex = 0;
+ for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
+ v_iter != verticesEnd;
+ ++v_iter, ++iVertex)
+ dispIncrSection->updatePoint(*v_iter, &fieldIncr[iVertex*spaceDim]);
+
+ // Setup Jacobian matrix
+ const int nrows = dispIncrSection->sizeWithBC();
+ const int ncols = nrows;
+ int nrowsM = 0;
+ int ncolsM = 0;
+ PetscMat jacobianMat = jacobian->matrix();
+ MatGetSize(jacobianMat, &nrowsM, &ncolsM);
+ CPPUNIT_ASSERT_EQUAL(nrows, nrowsM);
+ CPPUNIT_ASSERT_EQUAL(ncols, ncolsM);
+
+ int_array rows(nrows);
+ int_array cols(ncols);
+ for (int iRow=0; iRow < nrows; ++iRow)
+ rows[iRow] = iRow;
+ for (int iCol=0; iCol < ncols; ++iCol)
+ cols[iCol] = iCol;
+ MatSetValues(jacobianMat, nrows, &rows[0], ncols, &cols[0], _data->jacobian, INSERT_VALUES);
+ jacobian->assemble("final_assembly");
+
+ // Set Jacobian diagonal
+ fields->add("Jacobian diagonal", "jacobian_diagonal");
+ topology::Field<topology::Mesh>& jacobianDiag =
+ fields->get("Jacobian diagonal");
+ const topology::Field<topology::Mesh>& disp =
+ fields->get("disp(t)");
+ jacobianDiag.cloneSection(disp);
+ jacobianDiag.createVector();
+ jacobianDiag.createScatter();
+ MatGetDiagonal(jacobian->matrix(), jacobianDiag.vector());
+ jacobianDiag.scatterVectorToSection();
+} // _setFieldsJacobian
+
+// ----------------------------------------------------------------------
+// Determine if vertex is a Lagrange multiplier constraint vertex.
+bool
+pylith::faults::TestFaultCohesiveDyn::_isConstraintVertex(const int vertex) const
+{ // _isConstraintVertex
+ assert(0 != _data);
+
+ const int numConstraintVert = _data->numConstraintVert;
+ bool isFound = false;
+ for (int i=0; i < _data->numConstraintVert; ++i)
+ if (_data->constraintVertices[i] == vertex) {
+ isFound = true;
+ break;
+ } // if
+ return isFound;
+} // _isConstraintVertex
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.hh (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDyn.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,155 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultCohesiveDyn.hh
+ *
+ * @brief C++ TestFaultCohesiveDyn object
+ *
+ * C++ unit testing for FaultCohesiveDyn.
+ */
+
+#if !defined(pylith_faults_testfaultcohesivedyn_hh)
+#define pylith_faults_testfaultcohesivedyn_hh
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include "pylith/faults/faultsfwd.hh" // forward declarations
+#include "pylith/topology/topologyfwd.hh" // USES Mesh, SubMesh
+#include "pylith/feassemble/feassemblefwd.hh" // HOLDSA Quadrature
+#include "pylith/friction/frictionfwd.hh" // HOLDSA FrictionModel
+#include "spatialdata/spatialdb/spatialdbfwd.hh" // HOLDSA SpatialDB
+#include <vector> // HASA std::vector
+/// Namespace for pylith package
+namespace pylith {
+ namespace faults {
+ class TestFaultCohesiveDyn;
+
+ class CohesiveDynData;
+ } // faults
+} // pylith
+
+/// C++ unit testing for FaultCohesiveDyn
+class pylith::faults::TestFaultCohesiveDyn: public CppUnit::TestFixture
+{ // class TestFaultCohesiveDyn
+
+ // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+ CPPUNIT_TEST_SUITE( TestFaultCohesiveDyn );
+
+ CPPUNIT_TEST( testConstructor );
+ CPPUNIT_TEST( testNeedJacobianDiag );
+ CPPUNIT_TEST( testNeedVelocity );
+ CPPUNIT_TEST( testDBInitialTract );
+
+ // Tests in derived classes:
+ // testInitialize()
+ // testConstrainSolnSpaceStick()
+ // testConstrainSolnSpaceSlip()
+ // testConstrainSolnSpaceOpen()
+ // testUpdateStateVars()
+ // testCalcTractions()
+
+ CPPUNIT_TEST_SUITE_END();
+
+ // PROTECTED MEMBERS //////////////////////////////////////////////////
+protected:
+
+ CohesiveDynData* _data; ///< Data for testing
+ feassemble::Quadrature<topology::SubMesh>* _quadrature; ///< Fault quad.
+ spatialdata::spatialdb::SpatialDB* _dbInitialTract; ///< Initial tractions.
+ friction::FrictionModel* _friction; ///< Friction model
+ spatialdata::spatialdb::SpatialDB* _dbFriction; ///< Friction parameters.
+ bool _flipFault; ///< If true, flip fault orientation.
+
+ // PUBLIC METHODS /////////////////////////////////////////////////////
+public:
+
+ /// Setup testing data.
+ void setUp(void);
+
+ /// Tear down testing data.
+ void tearDown(void);
+
+ /// Test constructor.
+ void testConstructor(void);
+
+ /// Test needJacobianDiag().
+ void testNeedJacobianDiag(void);
+
+ /// Test needVelocity().
+ void testNeedVelocity(void);
+
+ /// Test dbInitialTract().
+ void testDBInitialTract(void);
+
+ /// Test initialize().
+ void testInitialize(void);
+
+ /// Test constrainSolnSpace() for sticking case.
+ void testConstrainSolnSpaceStick(void);
+
+ /// Test constrainSolnSpace() for slipping case.
+ void testConstrainSolnSpaceSlip(void);
+
+ /// Test constrainSolnSpace for fault opening case().
+ void testConstrainSolnSpaceOpen(void);
+
+ /// Test updateStateVars().
+ void testUpdateStateVars(void);
+
+ /// Test _calcTractions().
+ void testCalcTractions(void);
+
+ // PRIVATE METHODS ////////////////////////////////////////////////////
+private:
+
+ /** Initialize FaultCohesiveDyn interface condition.
+ *
+ * @param mesh PETSc mesh to initialize
+ * @param fault Cohesive fault interface condition to initialize.
+ * @param fields Solution fields.
+ */
+ void _initialize(topology::Mesh* const mesh,
+ FaultCohesiveDyn* const fault,
+ topology::SolutionFields* const fields);
+
+ /** Set values for fields and Jacobian.
+ *
+ * @pre Must call _initialize() before _setFieldsJacobian to set solution
+ * field. Note: Call to Jacobian constructor should be after call to
+ * _initialize() so that the solution field is setup.
+ *
+ * @param mesh PETSc mesh to initialize
+ * @param fault Cohesive fault interface condition to initialize.
+ * @param fields Solution fields.
+ * @param jacobian Jacobian sparse matrix.
+ * @param fieldIncrVals Values for solution increment field.
+ */
+ void _setFieldsJacobian(topology::Mesh* const mesh,
+ FaultCohesiveDyn* const fault,
+ topology::SolutionFields* const fields,
+ topology::Jacobian* const jacobian,
+ const double* const fieldIncrVals);
+
+ /** Determine if vertex is a Lagrange multiplier constraint vertex.
+ *
+ * @param vertex Label of vertex.
+ *
+ * @returns True if vertex is a constraint vertex, false otherwise.
+ */
+ bool _isConstraintVertex(const int vertex) const;
+
+}; // class TestFaultCohesiveDyn
+
+#endif // pylith_faults_testfaultcohesivedyn_hh
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.cc (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultCohesiveDynHex8.hh" // Implementation of class methods
+
+#include "data/CohesiveDynDataHex8.hh" // USES CohesiveDynLDataHex8
+
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
+#include "pylith/feassemble/GeometryQuad3D.hh" // USES GeometryQuad3D
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynHex8 );
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::faults::TestFaultCohesiveDynHex8::setUp(void)
+{ // setUp
+ TestFaultCohesiveDyn::setUp();
+ _data = new CohesiveDynDataHex8();
+
+ CPPUNIT_ASSERT(0 != _quadrature);
+ feassemble::GeometryQuad3D geometry;
+ _quadrature->refGeometry(&geometry);
+
+ _flipFault = true;
+} // setUp
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.hh (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynHex8.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultCohesiveDynHex8.hh
+ *
+ * @brief C++ TestFaultCohesiveDynHex8 object.
+ *
+ * C++ unit testing for FaultCohesiveDyn for mesh with 3-D quadrilateral cells.
+ */
+
+#if !defined(pylith_faults_testfaultcohesivedynhex8_hh)
+#define pylith_faults_testfaultcohesivedynhex8_hh
+
+#include "TestFaultCohesiveDyn.hh" // ISA TestFaultCohesiveDyn
+
+/// Namespace for pylith package
+namespace pylith {
+ namespace faults {
+ class TestFaultCohesiveDynHex8;
+ } // bc
+} // pylith
+
+/// C++ unit testing for FaultCohesiveDyn for mesh with 3-D quadrilateral cells.
+class pylith::faults::TestFaultCohesiveDynHex8 : public TestFaultCohesiveDyn
+{ // class TestFaultCohesiveDynHex8
+
+ // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+ CPPUNIT_TEST_SUITE( TestFaultCohesiveDynHex8 );
+
+ CPPUNIT_TEST( testInitialize );
+ CPPUNIT_TEST( testConstrainSolnSpaceStick );
+ CPPUNIT_TEST( testConstrainSolnSpaceSlip );
+ CPPUNIT_TEST( testConstrainSolnSpaceOpen );
+ CPPUNIT_TEST( testUpdateStateVars );
+ CPPUNIT_TEST( testCalcTractions );
+
+ CPPUNIT_TEST_SUITE_END();
+
+ // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+ /// Setup testing data.
+ void setUp(void);
+
+}; // class TestFaultCohesiveDynHex8
+
+#endif // pylith_faults_testfaultcohesivedynhex8_hh
+
+
+// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,851 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFaultCohesiveDynL.hh" // Implementation of class methods
-
-#include "pylith/faults/FaultCohesiveDynL.hh" // USES FaultCohesiveDynL
-
-#include "data/CohesiveDynLData.hh" // USES CohesiveDynLData
-
-#include "pylith/faults/EqKinSrc.hh" // USES EqKinSrc
-#include "pylith/faults/BruneSlipFn.hh" // USES BruneSlipFn
-#include "pylith/topology/Mesh.hh" // USES Mesh
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
-#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
-#include "pylith/topology/Jacobian.hh" // USES Jacobian
-#include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
-#include "pylith/friction/StaticFriction.hh" // USES StaticFriction
-
-#include "spatialdata/geocoords/CSCart.hh" // USES CSCart
-#include "spatialdata/spatialdb/SimpleDB.hh" // USES SimpleDB
-#include "spatialdata/spatialdb/SimpleIOAscii.hh" // USES SimpleIOAscii
-
-#include <stdexcept> // USES runtime_error
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynL );
-
-// ----------------------------------------------------------------------
-typedef pylith::topology::Mesh::SieveMesh SieveMesh;
-typedef pylith::topology::Mesh::RealSection RealSection;
-typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
-
-// ----------------------------------------------------------------------
-// Setup testing data.
-void
-pylith::faults::TestFaultCohesiveDynL::setUp(void)
-{ // setUp
- _data = 0;
- _quadrature = new feassemble::Quadrature<topology::SubMesh>();
- CPPUNIT_ASSERT(0 != _quadrature);
- _dbInitialTract = 0;
- _friction = 0;
- _dbFriction = 0;
- _flipFault = false;
-} // setUp
-
-// ----------------------------------------------------------------------
-// Tear down testing data.
-void
-pylith::faults::TestFaultCohesiveDynL::tearDown(void)
-{ // tearDown
- delete _data; _data = 0;
- delete _quadrature; _quadrature = 0;
- delete _dbInitialTract; _dbInitialTract = 0;
- delete _friction; _friction = 0;
- delete _dbFriction; _dbFriction = 0;
-} // tearDown
-
-// ----------------------------------------------------------------------
-// Test constructor.
-void
-pylith::faults::TestFaultCohesiveDynL::testConstructor(void)
-{ // testConstructor
- FaultCohesiveDynL fault;
-} // testConstructor
-
-// ----------------------------------------------------------------------
-// Test needJacobianDiag().
-void
-pylith::faults::TestFaultCohesiveDynL::testNeedJacobianDiag(void)
-{ // testNeedJacobianDiag
- FaultCohesiveDynL fault;
-
- CPPUNIT_ASSERT_EQUAL(true, fault.needJacobianDiag());
-} // testNeedJacobianDiag
-
-// ----------------------------------------------------------------------
-// Test needVelocity().
-void
-pylith::faults::TestFaultCohesiveDynL::testNeedVelocity(void)
-{ // testNeedVelocity
- FaultCohesiveDynL fault;
-
- CPPUNIT_ASSERT_EQUAL(true, fault.needVelocity());
-} // testNeedVelocity
-
-// ----------------------------------------------------------------------
-// Test dbInitialTract().
-void
-pylith::faults::TestFaultCohesiveDynL::testDBInitialTract(void)
-{ // testDBInitialTract
- FaultCohesiveDynL fault;
-
- const std::string& label = "test database";
- spatialdata::spatialdb::SimpleDB db;
- db.label(label.c_str());
- fault.dbInitialTract(&db);
- CPPUNIT_ASSERT(0 != fault._dbInitialTract);
- CPPUNIT_ASSERT_EQUAL(label, std::string(fault._dbInitialTract->label()));
- } // testDBInitialTract
-
-// ----------------------------------------------------------------------
-// Test initialize().
-void
-pylith::faults::TestFaultCohesiveDynL::testInitialize(void)
-{ // testInitialize
- CPPUNIT_ASSERT(0 != _data);
-
- topology::Mesh mesh;
- FaultCohesiveDynL fault;
- topology::SolutionFields fields(mesh);
- _initialize(&mesh, &fault, &fields);
-
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
- CPPUNIT_ASSERT(!faultSieveMesh.isNull());
- SieveSubMesh::renumbering_type& renumbering =
- faultSieveMesh->getRenumbering();
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- CPPUNIT_ASSERT(!vertices.isNull());
- const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
- int iVertex = 0;
- for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
- v_iter != verticesEnd;
- ++v_iter, ++iVertex) {
- CPPUNIT_ASSERT(renumbering.find(_data->constraintVertices[iVertex]) !=
- renumbering.end());
- CPPUNIT_ASSERT_EQUAL(renumbering[_data->constraintVertices[iVertex]],
- *v_iter);
- } // for
- CPPUNIT_ASSERT_EQUAL(_data->numConstraintVert, iVertex);
-
- // Check orientation
- //fault._fields->get("orientation").view("ORIENTATION"); // DEBUGGING
- const ALE::Obj<RealSection>& orientationSection =
- fault._fields->get("orientation").section();
- CPPUNIT_ASSERT(!orientationSection.isNull());
- const int spaceDim = _data->spaceDim;
- const int orientationSize = spaceDim*spaceDim;
- iVertex = 0;
- for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
- v_iter != verticesEnd;
- ++v_iter, ++iVertex) {
- const int fiberDim = orientationSection->getFiberDimension(*v_iter);
- CPPUNIT_ASSERT_EQUAL(orientationSize, fiberDim);
- const double* orientationVertex =
- orientationSection->restrictPoint(*v_iter);
- CPPUNIT_ASSERT(0 != orientationVertex);
-
- const double tolerance = 1.0e-06;
- for (int i=0; i < orientationSize; ++i) {
- const int index = iVertex*orientationSize+i;
- CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->orientation[index],
- orientationVertex[i], tolerance);
- } // for
- } // for
-
- // Check area
- const ALE::Obj<RealSection>& areaSection =
- fault._fields->get("area").section();
- CPPUNIT_ASSERT(!areaSection.isNull());
- iVertex = 0;
- for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
- v_iter != verticesEnd;
- ++v_iter, ++iVertex) {
- const int fiberDim = areaSection->getFiberDimension(*v_iter);
- CPPUNIT_ASSERT_EQUAL(1, fiberDim);
- const double* areaVertex = areaSection->restrictPoint(*v_iter);
- CPPUNIT_ASSERT(0 != areaVertex);
-
- const double tolerance = 1.0e-06;
- CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->area[iVertex], areaVertex[0],
- tolerance);
- } // for
-
- // Initial tractions
- if (0 != fault._dbInitialTract) {
- //fault._fields->get("initial traction").view("INITIAL TRACTIONS"); // DEBUGGING
- const ALE::Obj<RealSection>& tractionSection = fault._fields->get(
- "initial traction").section();
- CPPUNIT_ASSERT(!tractionSection.isNull());
- const int spaceDim = _data->spaceDim;
- iVertex = 0;
- for (SieveSubMesh::label_sequence::iterator v_iter = verticesBegin;
- v_iter != verticesEnd;
- ++v_iter, ++iVertex) {
- const int fiberDim = tractionSection->getFiberDimension(*v_iter);
- CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
- const double* tractionVertex = tractionSection->restrictPoint(*v_iter);
- CPPUNIT_ASSERT(0 != tractionVertex);
-
- const double tolerance = 1.0e-06;
- for (int i = 0; i < spaceDim; ++i) {
- const int index = iVertex * spaceDim + i;
- CPPUNIT_ASSERT_DOUBLES_EQUAL(_data->initialTractions[index],
- tractionVertex[i], tolerance);
- } // for
- } // for
- } // if
-} // testInitialize
-
-// ----------------------------------------------------------------------
-// Test constrainSolnSpace() for sticking case.
-void
-pylith::faults::TestFaultCohesiveDynL::testConstrainSolnSpaceStick(void)
-{ // testConstrainSolnSpaceStick
- assert(0 != _data);
-
- topology::Mesh mesh;
- FaultCohesiveDynL fault;
- topology::SolutionFields fields(mesh);
- _initialize(&mesh, &fault, &fields);
- topology::Jacobian jacobian(fields, "seqdense");
- _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrStick);
-
- const int spaceDim = _data->spaceDim;
-
- const double t = 2.134;
- const double dt = 0.01;
- fault.timeStep(dt);
- fault.constrainSolnSpace(&fields, t, jacobian);
-
- { // Check solution values
- // No change to Lagrange multipliers for stick case.
- const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
- CPPUNIT_ASSERT(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& vertices =
- sieveMesh->depthStratum(0);
- CPPUNIT_ASSERT(!vertices.isNull());
- const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
- const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Get section containing solution (disp + Lagrange multipliers)
- const ALE::Obj<RealSection>& dispIncrSection =
- fields.get("dispIncr(t->t+dt)").section();
- CPPUNIT_ASSERT(!dispIncrSection.isNull());
-
- //dispIncrSection->view("DISP INCREMENT"); // DEBUGGING
-
- // Get expected values
- const double* valsE = _data->fieldIncrStick; // No change in dispIncr
- int iVertex = 0; // variable to use as index into valsE array
- const int fiberDimE = spaceDim; // number of values per point
- const double tolerance = 1.0e-06;
- for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
- v_iter != verticesEnd;
- ++v_iter, ++iVertex) { // loop over all vertices in mesh
- // Check fiber dimension (number of values at point)
- const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
- CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
- const double* vals = dispIncrSection->restrictPoint(*v_iter);
- CPPUNIT_ASSERT(0 != vals);
-
- // Check values at point
- for (int i = 0; i < fiberDimE; ++i) {
- const int index = iVertex * spaceDim + i;
- const double valE = valsE[index];
- if (fabs(valE) > tolerance)
- CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
- else
- CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
- } // for
- } // for
- } // Check solution values
-
- { // Check slip values
- // Slip should be zero for the stick case.
-
- // Get fault vertex info
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
- CPPUNIT_ASSERT(!faultSieveMesh.isNull());
- SieveSubMesh::renumbering_type& renumbering =
- faultSieveMesh->getRenumbering();
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- CPPUNIT_ASSERT(!vertices.isNull());
- const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Get section containing slip
- const ALE::Obj<RealSection>& slipSection =
- fault._fields->get("slip").section();
- CPPUNIT_ASSERT(!slipSection.isNull());
-
- const double valE = 0.0; // slip should be zero
- int iVertex = 0; // variable to use as index into valsE array
- const int fiberDimE = spaceDim; // number of values per point
- const double tolerance = 1.0e-06;
- for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd;
- ++v_iter, ++iVertex) { // loop over fault vertices
- // Check fiber dimension (number of values at point)
- const int fiberDim = slipSection->getFiberDimension(*v_iter);
- CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
- const double* vals = slipSection->restrictPoint(*v_iter);
- CPPUNIT_ASSERT(0 != vals);
-
- // Check values at point
- for (int i = 0; i < fiberDimE; ++i) {
- const int index = iVertex * spaceDim + i;
- CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
- } // for
- } // for
- } // Check slip values
-
-} // testConstrainSolnSpaceStick
-
-// ----------------------------------------------------------------------
-// Test constrainSolnSpace() for slipping case.
-void
-pylith::faults::TestFaultCohesiveDynL::testConstrainSolnSpaceSlip(void)
-{ // testConstrainSolnSpaceSlip
- assert(0 != _data);
-
- topology::Mesh mesh;
- FaultCohesiveDynL fault;
- topology::SolutionFields fields(mesh);
- _initialize(&mesh, &fault, &fields);
- topology::Jacobian jacobian(fields, "seqdense");
- _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrSlip);
-
- const int spaceDim = _data->spaceDim;
-
- const double t = 2.134;
- const double dt = 0.01;
- fault.timeStep(dt);
- fault.constrainSolnSpace(&fields, t, jacobian);
-
- //residual.view("RESIDUAL"); // DEBUGGING
-
- { // Check solution values
- // Lagrange multipliers should be adjusted according to friction
- // as reflected in the fieldIncrSlipE data member.
- const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
- CPPUNIT_ASSERT(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& vertices =
- sieveMesh->depthStratum(0);
- CPPUNIT_ASSERT(!vertices.isNull());
- const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
- const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Get section containing solution (disp + Lagrange multipliers)
- const ALE::Obj<RealSection>& dispIncrSection =
- fields.get("dispIncr(t->t+dt)").section();
- CPPUNIT_ASSERT(!dispIncrSection.isNull());
-
- // Get expected values
- const double* valsE = _data->fieldIncrSlipE; // Expected values for dispIncr
- int iVertex = 0; // variable to use as index into valsE array
- const int fiberDimE = spaceDim; // number of values per point
- const double tolerance = 1.0e-06;
- for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
- v_iter != verticesEnd;
- ++v_iter, ++iVertex) { // loop over all vertices in mesh
- // Check fiber dimension (number of values at point)
- const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
- CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
- const double* vals = dispIncrSection->restrictPoint(*v_iter);
- CPPUNIT_ASSERT(0 != vals);
-
- // Check values at point
- for (int i = 0; i < fiberDimE; ++i) {
- const int index = iVertex * spaceDim + i;
- const double valE = valsE[index];
- std::cout << "valE: " << valE
- << ", val: " << vals[i]
- << std::endl;
- if (fabs(valE) > tolerance)
- CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
- else
- CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
- } // for
- } // for
- } // Check solution values
-
- { // Check slip values
- // Slip values should be adjusted based on the change in the
- // Lagrange multipliers as reflected in the slipSlipE data member.
-
- // Get fault vertex info
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
- CPPUNIT_ASSERT(!faultSieveMesh.isNull());
- SieveSubMesh::renumbering_type& renumbering =
- faultSieveMesh->getRenumbering();
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- CPPUNIT_ASSERT(!vertices.isNull());
- const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Get section containing slip
- const ALE::Obj<RealSection>& slipSection =
- fault._fields->get("slip").section();
- CPPUNIT_ASSERT(!slipSection.isNull());
-
- // Get expected values
- const double* valsE = _data->slipSlipE;
- int iVertex = 0; // variable to use as index into valsE array
- const int fiberDimE = spaceDim; // number of values per point
- const double tolerance = 1.0e-06;
- for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd;
- ++v_iter, ++iVertex) { // loop over fault vertices
- // Check fiber dimension (number of values at point)
- const int fiberDim = slipSection->getFiberDimension(*v_iter);
- CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
- const double* vals = slipSection->restrictPoint(*v_iter);
- CPPUNIT_ASSERT(0 != vals);
-
- // Check values at point
- for (int i = 0; i < fiberDimE; ++i) {
- const int index = iVertex * spaceDim + i;
- const double valE = valsE[index];
- std::cout << "valE: " << valE
- << ", val: " << vals[i]
- << std::endl;
- if (fabs(valE) > tolerance)
- CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
- else
- CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
- } // for
- } // for
- } // Check slip values
-
-} // testConstrainSolnSpaceSlip
-
-// ----------------------------------------------------------------------
-// Test constrainSolnSpace() for opening case.
-void
-pylith::faults::TestFaultCohesiveDynL::testConstrainSolnSpaceOpen(void)
-{ // testConstrainSolnSpaceOpen
- assert(0 != _data);
-
- topology::Mesh mesh;
- FaultCohesiveDynL fault;
- topology::SolutionFields fields(mesh);
- _initialize(&mesh, &fault, &fields);
- topology::Jacobian jacobian(fields, "seqdense");
- _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrOpen);
-
- const int spaceDim = _data->spaceDim;
-
- const double t = 2.134;
- const double dt = 0.01;
- fault.timeStep(dt);
- fault.constrainSolnSpace(&fields, t, jacobian);
-
- //residual.view("RESIDUAL"); // DEBUGGING
-
- { // Check solution values
- // Lagrange multipliers should be set to zero as reflected in the
- // fieldIncrOpenE data member.
- const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
- CPPUNIT_ASSERT(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& vertices =
- sieveMesh->depthStratum(0);
- CPPUNIT_ASSERT(!vertices.isNull());
- const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
- const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Get section containing solution (disp + Lagrange multipliers)
- const ALE::Obj<RealSection>& dispIncrSection =
- fields.get("dispIncr(t->t+dt)").section();
- CPPUNIT_ASSERT(!dispIncrSection.isNull());
-
- // Get expected values
- const double* valsE = _data->fieldIncrOpenE; // Expected values for dispIncr
- int iVertex = 0; // variable to use as index into valsE array
- const int fiberDimE = spaceDim; // number of values per point
- const double tolerance = 1.0e-06;
- for (SieveMesh::label_sequence::iterator v_iter = verticesBegin;
- v_iter != verticesEnd;
- ++v_iter, ++iVertex) { // loop over all vertices in mesh
- // Check fiber dimension (number of values at point)
- const int fiberDim = dispIncrSection->getFiberDimension(*v_iter);
- CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
- const double* vals = dispIncrSection->restrictPoint(*v_iter);
- CPPUNIT_ASSERT(0 != vals);
-
- // Check values at point
- for (int i = 0; i < fiberDimE; ++i) {
- const int index = iVertex * spaceDim + i;
- const double valE = valsE[index];
- std::cout << "valE: " << valE
- << ", val: " << vals[i]
- << std::endl;
- if (fabs(valE) > tolerance)
- CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
- else
- CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
- } // for
- } // for
- } // Check solution values
-
- { // Check slip values
- // Slip values should be adjusted based on the change in the
- // Lagrange multipliers as reflected in the slipOpenE data member.
-
- // Get fault vertex info
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
- CPPUNIT_ASSERT(!faultSieveMesh.isNull());
- SieveSubMesh::renumbering_type& renumbering =
- faultSieveMesh->getRenumbering();
- const ALE::Obj<SieveSubMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- CPPUNIT_ASSERT(!vertices.isNull());
- const SieveSubMesh::label_sequence::iterator verticesBegin = vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Get section containing slip
- const ALE::Obj<RealSection>& slipSection =
- fault._fields->get("slip").section();
- CPPUNIT_ASSERT(!slipSection.isNull());
-
- // Get expected values
- const double* valsE = _data->slipOpenE;
- int iVertex = 0; // variable to use as index into valsE array
- const int fiberDimE = spaceDim; // number of values per point
- const double tolerance = 1.0e-06;
- for (SieveMesh::label_sequence::iterator v_iter = verticesBegin; v_iter
- != verticesEnd;
- ++v_iter, ++iVertex) { // loop over fault vertices
- // Check fiber dimension (number of values at point)
- const int fiberDim = slipSection->getFiberDimension(*v_iter);
- CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
- const double* vals = slipSection->restrictPoint(*v_iter);
- CPPUNIT_ASSERT(0 != vals);
-
- // Check values at point
- for (int i = 0; i < fiberDimE; ++i) {
- const int index = iVertex * spaceDim + i;
- const double valE = valsE[index];
- std::cout << "valE: " << valE
- << ", val: " << vals[i]
- << std::endl;
- if (fabs(valE) > tolerance)
- CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valE, tolerance);
- else
- CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
- } // for
- } // for
- } // Check slip values
-
-} // testConstrainSolnSpaceOpen
-
-// ----------------------------------------------------------------------
-// Test updateStateVars().
-void
-pylith::faults::TestFaultCohesiveDynL::testUpdateStateVars(void)
-{ // testUpdateStateVars
- // :TODO: Need to verify that fault constitutive updateStateVars is called.
-} // testUpdateStateVars
-
-// ----------------------------------------------------------------------
-// Test calcTractions().
-void
-pylith::faults::TestFaultCohesiveDynL::testCalcTractions(void)
-{ // testCalcTractions
- CPPUNIT_ASSERT(0 != _data);
-
- topology::Mesh mesh;
- FaultCohesiveDynL fault;
- topology::SolutionFields fields(mesh);
- _initialize(&mesh, &fault, &fields);
- topology::Jacobian jacobian(fields, "seqdense");
- _setFieldsJacobian(&mesh, &fault, &fields, &jacobian, _data->fieldIncrStick);
-
- CPPUNIT_ASSERT(0 != fault._faultMesh);
- const int spaceDim = _data->spaceDim;
- topology::Field<topology::SubMesh> tractions(*fault._faultMesh);
- tractions.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
- tractions.allocate();
- tractions.zero();
- const ALE::Obj<RealSection>& tractionsSection = tractions.section();
- CPPUNIT_ASSERT(!tractionsSection.isNull());
-
- const double t = 0;
- fault.updateStateVars(t, &fields);
- fault._calcTractions(&tractions, fields.get("disp(t)"));
-
- //tractions.view("TRACTIONS"); // DEBUGGING
-
- const ALE::Obj<SieveSubMesh>& faultSieveMesh = fault._faultMesh->sieveMesh();
- CPPUNIT_ASSERT(!faultSieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& vertices =
- faultSieveMesh->depthStratum(0);
- CPPUNIT_ASSERT(!vertices.isNull());
- const SieveSubMesh::label_sequence::iterator verticesBegin =
- vertices->begin();
- const SieveSubMesh::label_sequence::iterator verticesEnd = vertices->end();
- SieveSubMesh::renumbering_type& renumbering =
- faultSieveMesh->getRenumbering();
- const SieveMesh::renumbering_type::const_iterator renumberingBegin =
- renumbering.begin();
- const SieveMesh::renumbering_type::const_iterator renumberingEnd =
- renumbering.end();
-
- const ALE::Obj<RealSection>& dispSection = fields.get("disp(t)").section();
- CPPUNIT_ASSERT(!dispSection.isNull());
-
- int iVertex = 0;
- const double tolerance = 1.0e-06;
- for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
- v_iter != verticesEnd;
- ++v_iter, ++iVertex) {
- SieveMesh::point_type meshVertex = -1;
- bool found = false;
-
- // Test with dbInitialTract
- for (SieveMesh::renumbering_type::const_iterator r_iter = renumberingBegin;
- r_iter != renumberingEnd;
- ++r_iter) {
- if (r_iter->second == *v_iter) {
- meshVertex = r_iter->first;
- found = true;
- break;
- } // if
- } // for
- CPPUNIT_ASSERT(found);
- int fiberDim = tractionsSection->getFiberDimension(*v_iter);
- CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
- const double* tractionsVertex = tractionsSection->restrictPoint(*v_iter);
- CPPUNIT_ASSERT(0 != tractionsVertex);
-
- fiberDim = dispSection->getFiberDimension(meshVertex);
- CPPUNIT_ASSERT_EQUAL(spaceDim, fiberDim);
- const double* dispVertex = dispSection->restrictPoint(meshVertex);
- CPPUNIT_ASSERT(0 != dispVertex);
-
- const double scale = 1.0 / _data->area[iVertex];
- for (int iDim=0; iDim < spaceDim; ++iDim) {
- const double tractionE =
- _data->initialTractions[iVertex*spaceDim+iDim] +
- dispVertex[iDim] * scale;
- if (tractionE != 0.0)
- CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, tractionsVertex[iDim]/tractionE,
- tolerance);
- else
- CPPUNIT_ASSERT_DOUBLES_EQUAL(tractionE, tractionsVertex[iDim],
- tolerance);
- } // for
- } // for
-
- // Test without dbInitialTract
- // :TODO: STUFF GOES HERE (Brad)
-} // testCalcTractions
-
-// ----------------------------------------------------------------------
-// Initialize FaultCohesiveDynL interface condition.
-void
-pylith::faults::TestFaultCohesiveDynL::_initialize(
- topology::Mesh* const mesh,
- FaultCohesiveDynL* const fault,
- topology::SolutionFields* const fields)
-{ // _initialize
- CPPUNIT_ASSERT(0 != mesh);
- CPPUNIT_ASSERT(0 != fault);
- CPPUNIT_ASSERT(0 != fields);
- CPPUNIT_ASSERT(0 != _data);
- CPPUNIT_ASSERT(0 != _quadrature);
-
- meshio::MeshIOAscii iohandler;
- iohandler.filename(_data->meshFilename);
- iohandler.read(mesh);
-
- //mesh->debug(true); // DEBUGGING
-
- spatialdata::geocoords::CSCart cs;
- spatialdata::units::Nondimensional normalizer;
- cs.setSpaceDim(mesh->dimension());
- cs.initialize();
- mesh->coordsys(&cs);
- mesh->nondimensionalize(normalizer);
-
- _quadrature->initialize(_data->basis, _data->numQuadPts, _data->numBasis,
- _data->basisDeriv,
- _data->numQuadPts, _data->numBasis, _data->cellDim,
- _data->quadPts, _data->numQuadPts, _data->cellDim,
- _data->quadWts, _data->numQuadPts,
- _data->spaceDim);
-
- // Setup initial tractions
- spatialdata::spatialdb::SimpleDB* db =
- new spatialdata::spatialdb::SimpleDB("initial tractions");
- CPPUNIT_ASSERT(0 != db);
- spatialdata::spatialdb::SimpleIOAscii ioInitialTract;
- ioInitialTract.filename(_data->initialTractFilename);
- db->ioHandler(&ioInitialTract);
- delete _dbInitialTract; _dbInitialTract = db;
- fault->dbInitialTract(db);
-
- // Setup friction
- spatialdata::spatialdb::SimpleDB* dbFriction =
- new spatialdata::spatialdb::SimpleDB("static friction");
- CPPUNIT_ASSERT(0 != dbFriction);
- spatialdata::spatialdb::SimpleIOAscii ioFriction;
- if (2 == _data->spaceDim)
- ioFriction.filename("data/static_friction_2d.spatialdb");
- else if (3 == _data->spaceDim)
- ioFriction.filename("data/static_friction_3d.spatialdb");
- dbFriction->ioHandler(&ioFriction);
- delete _dbFriction; _dbFriction = dbFriction;
- friction::StaticFriction* friction = new pylith::friction::StaticFriction();
- CPPUNIT_ASSERT(0 != friction);
- friction->label("static friction");
- friction->dbProperties(dbFriction);
- _friction = friction;
- fault->frictionModel(friction);
-
- int firstFaultVertex = 0;
- int firstLagrangeVertex = mesh->sieveMesh()->getIntSection(_data->label)->size();
- int firstFaultCell = mesh->sieveMesh()->getIntSection(_data->label)->size();
- if (fault->useLagrangeConstraints())
- firstFaultCell += mesh->sieveMesh()->getIntSection(_data->label)->size();
- fault->id(_data->id);
- fault->label(_data->label);
- fault->quadrature(_quadrature);
-
- fault->adjustTopology(mesh, &firstFaultVertex, &firstLagrangeVertex,
- &firstFaultCell, _flipFault);
-
- const double upDir[] = { 0.0, 0.0, 1.0 };
- const double normalDir[] = { 1.0, 0.0, 0.0 };
-
- fault->initialize(*mesh, upDir, normalDir);
-
- // Setup fields
- fields->add("disp(t)", "displacement");
- fields->add("dispIncr(t->t+dt)", "displacement_increment");
- fields->add("velocity(t)", "velocity");
- fields->solutionName("dispIncr(t->t+dt)");
-
- const int spaceDim = _data->spaceDim;
- topology::Field<topology::Mesh>& disp = fields->get("disp(t)");
- disp.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
- disp.allocate();
- fields->copyLayout("disp(t)");
-} // _initialize
-
-// ----------------------------------------------------------------------
-// Set values for fields and Jacobian.
-void
-pylith::faults::TestFaultCohesiveDynL::_setFieldsJacobian(
- topology::Mesh* const mesh,
- FaultCohesiveDynL* const fault,
- topology::SolutionFields* const fields,
- topology::Jacobian* const jacobian,
- const double* const fieldIncr)
-{ // _initialize
- CPPUNIT_ASSERT(0 != mesh);
- CPPUNIT_ASSERT(0 != fault);
- CPPUNIT_ASSERT(0 != fields);
- CPPUNIT_ASSERT(0 != jacobian);
- CPPUNIT_ASSERT(0 != _data);
- CPPUNIT_ASSERT(0 != fieldIncr);
-
- const int spaceDim = _data->spaceDim;
-
- // Get vertices in mesh
- const ALE::Obj<SieveMesh>& sieveMesh = mesh->sieveMesh();
- CPPUNIT_ASSERT(!sieveMesh.isNull());
- const ALE::Obj<SieveMesh::label_sequence>& vertices =
- sieveMesh->depthStratum(0);
- CPPUNIT_ASSERT(!vertices.isNull());
- const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
- const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-
- // Set displacement values
- const ALE::Obj<RealSection>& dispSection =
- fields->get("disp(t)").section();
- CPPUNIT_ASSERT(!dispSection.isNull());
- int iVertex = 0;
- for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
- v_iter != verticesEnd;
- ++v_iter, ++iVertex)
- dispSection->updatePoint(*v_iter, &_data->fieldT[iVertex*spaceDim]);
-
- // Set increment values
- const ALE::Obj<RealSection>& dispIncrSection =
- fields->get("dispIncr(t->t+dt)").section();
- CPPUNIT_ASSERT(!dispIncrSection.isNull());
- iVertex = 0;
- for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
- v_iter != verticesEnd;
- ++v_iter, ++iVertex)
- dispIncrSection->updatePoint(*v_iter, &fieldIncr[iVertex*spaceDim]);
-
- // Setup Jacobian matrix
- const int nrows = dispIncrSection->sizeWithBC();
- const int ncols = nrows;
- int nrowsM = 0;
- int ncolsM = 0;
- PetscMat jacobianMat = jacobian->matrix();
- MatGetSize(jacobianMat, &nrowsM, &ncolsM);
- CPPUNIT_ASSERT_EQUAL(nrows, nrowsM);
- CPPUNIT_ASSERT_EQUAL(ncols, ncolsM);
-
- int_array rows(nrows);
- int_array cols(ncols);
- for (int iRow=0; iRow < nrows; ++iRow)
- rows[iRow] = iRow;
- for (int iCol=0; iCol < ncols; ++iCol)
- cols[iCol] = iCol;
- MatSetValues(jacobianMat, nrows, &rows[0], ncols, &cols[0], _data->jacobian, INSERT_VALUES);
- jacobian->assemble("final_assembly");
-
- // Set Jacobian diagonal
- fields->add("Jacobian diagonal", "jacobian_diagonal");
- topology::Field<topology::Mesh>& jacobianDiag =
- fields->get("Jacobian diagonal");
- const topology::Field<topology::Mesh>& disp =
- fields->get("disp(t)");
- jacobianDiag.cloneSection(disp);
- jacobianDiag.createVector();
- jacobianDiag.createScatter();
- MatGetDiagonal(jacobian->matrix(), jacobianDiag.vector());
- jacobianDiag.scatterVectorToSection();
-} // _setFieldsJacobian
-
-// ----------------------------------------------------------------------
-// Determine if vertex is a Lagrange multiplier constraint vertex.
-bool
-pylith::faults::TestFaultCohesiveDynL::_isConstraintVertex(const int vertex) const
-{ // _isConstraintVertex
- assert(0 != _data);
-
- const int numConstraintVert = _data->numConstraintVert;
- bool isFound = false;
- for (int i=0; i < _data->numConstraintVert; ++i)
- if (_data->constraintVertices[i] == vertex) {
- isFound = true;
- break;
- } // if
- return isFound;
-} // _isConstraintVertex
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynL.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,155 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/faults/TestFaultCohesiveDynL.hh
- *
- * @brief C++ TestFaultCohesiveDynL object
- *
- * C++ unit testing for FaultCohesiveDynL.
- */
-
-#if !defined(pylith_faults_testfaultcohesivedynl_hh)
-#define pylith_faults_testfaultcohesivedynl_hh
-
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "pylith/faults/faultsfwd.hh" // forward declarations
-#include "pylith/topology/topologyfwd.hh" // USES Mesh, SubMesh
-#include "pylith/feassemble/feassemblefwd.hh" // HOLDSA Quadrature
-#include "pylith/friction/frictionfwd.hh" // HOLDSA FrictionModel
-#include "spatialdata/spatialdb/spatialdbfwd.hh" // HOLDSA SpatialDB
-#include <vector> // HASA std::vector
-/// Namespace for pylith package
-namespace pylith {
- namespace faults {
- class TestFaultCohesiveDynL;
-
- class CohesiveDynLData;
- } // faults
-} // pylith
-
-/// C++ unit testing for FaultCohesiveDynL
-class pylith::faults::TestFaultCohesiveDynL: public CppUnit::TestFixture
-{ // class TestFaultCohesiveDynL
-
- // CPPUNIT TEST SUITE /////////////////////////////////////////////////
- CPPUNIT_TEST_SUITE( TestFaultCohesiveDynL );
-
- CPPUNIT_TEST( testConstructor );
- CPPUNIT_TEST( testNeedJacobianDiag );
- CPPUNIT_TEST( testNeedVelocity );
- CPPUNIT_TEST( testDBInitialTract );
-
- // Tests in derived classes:
- // testInitialize()
- // testConstrainSolnSpaceStick()
- // testConstrainSolnSpaceSlip()
- // testConstrainSolnSpaceOpen()
- // testUpdateStateVars()
- // testCalcTractions()
-
- CPPUNIT_TEST_SUITE_END();
-
- // PROTECTED MEMBERS //////////////////////////////////////////////////
-protected:
-
- CohesiveDynLData* _data; ///< Data for testing
- feassemble::Quadrature<topology::SubMesh>* _quadrature; ///< Fault quad.
- spatialdata::spatialdb::SpatialDB* _dbInitialTract; ///< Initial tractions.
- friction::FrictionModel* _friction; ///< Friction model
- spatialdata::spatialdb::SpatialDB* _dbFriction; ///< Friction parameters.
- bool _flipFault; ///< If true, flip fault orientation.
-
- // PUBLIC METHODS /////////////////////////////////////////////////////
-public:
-
- /// Setup testing data.
- void setUp(void);
-
- /// Tear down testing data.
- void tearDown(void);
-
- /// Test constructor.
- void testConstructor(void);
-
- /// Test needJacobianDiag().
- void testNeedJacobianDiag(void);
-
- /// Test needVelocity().
- void testNeedVelocity(void);
-
- /// Test dbInitialTract().
- void testDBInitialTract(void);
-
- /// Test initialize().
- void testInitialize(void);
-
- /// Test constrainSolnSpace() for sticking case.
- void testConstrainSolnSpaceStick(void);
-
- /// Test constrainSolnSpace() for slipping case.
- void testConstrainSolnSpaceSlip(void);
-
- /// Test constrainSolnSpace for fault opening case().
- void testConstrainSolnSpaceOpen(void);
-
- /// Test updateStateVars().
- void testUpdateStateVars(void);
-
- /// Test _calcTractions().
- void testCalcTractions(void);
-
- // PRIVATE METHODS ////////////////////////////////////////////////////
-private:
-
- /** Initialize FaultCohesiveDynL interface condition.
- *
- * @param mesh PETSc mesh to initialize
- * @param fault Cohesive fault interface condition to initialize.
- * @param fields Solution fields.
- */
- void _initialize(topology::Mesh* const mesh,
- FaultCohesiveDynL* const fault,
- topology::SolutionFields* const fields);
-
- /** Set values for fields and Jacobian.
- *
- * @pre Must call _initialize() before _setFieldsJacobian to set solution
- * field. Note: Call to Jacobian constructor should be after call to
- * _initialize() so that the solution field is setup.
- *
- * @param mesh PETSc mesh to initialize
- * @param fault Cohesive fault interface condition to initialize.
- * @param fields Solution fields.
- * @param jacobian Jacobian sparse matrix.
- * @param fieldIncrVals Values for solution increment field.
- */
- void _setFieldsJacobian(topology::Mesh* const mesh,
- FaultCohesiveDynL* const fault,
- topology::SolutionFields* const fields,
- topology::Jacobian* const jacobian,
- const double* const fieldIncrVals);
-
- /** Determine if vertex is a Lagrange multiplier constraint vertex.
- *
- * @param vertex Label of vertex.
- *
- * @returns True if vertex is a constraint vertex, false otherwise.
- */
- bool _isConstraintVertex(const int vertex) const;
-
-}; // class TestFaultCohesiveDynL
-
-#endif // pylith_faults_testfaultcohesivedynl_hh
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,42 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFaultCohesiveDynLHex8.hh" // Implementation of class methods
-
-#include "data/CohesiveDynLDataHex8.hh" // USES CohesiveDynLDataHex8
-
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
-#include "pylith/feassemble/GeometryQuad3D.hh" // USES GeometryQuad3D
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynLHex8 );
-
-// ----------------------------------------------------------------------
-// Setup testing data.
-void
-pylith::faults::TestFaultCohesiveDynLHex8::setUp(void)
-{ // setUp
- TestFaultCohesiveDynL::setUp();
- _data = new CohesiveDynLDataHex8();
-
- CPPUNIT_ASSERT(0 != _quadrature);
- feassemble::GeometryQuad3D geometry;
- _quadrature->refGeometry(&geometry);
-
- _flipFault = true;
-} // setUp
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,60 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/faults/TestFaultCohesiveDynLHex8.hh
- *
- * @brief C++ TestFaultCohesiveDynLHex8 object.
- *
- * C++ unit testing for FaultCohesiveDynL for mesh with 3-D quadrilateral cells.
- */
-
-#if !defined(pylith_faults_testfaultcohesivedynlhex8_hh)
-#define pylith_faults_testfaultcohesivedynlhex8_hh
-
-#include "TestFaultCohesiveDynL.hh" // ISA TestFaultCohesiveDynL
-
-/// Namespace for pylith package
-namespace pylith {
- namespace faults {
- class TestFaultCohesiveDynLHex8;
- } // bc
-} // pylith
-
-/// C++ unit testing for FaultCohesiveDynL for mesh with 3-D quadrilateral cells.
-class pylith::faults::TestFaultCohesiveDynLHex8 : public TestFaultCohesiveDynL
-{ // class TestFaultCohesiveDynLHex8
-
- // CPPUNIT TEST SUITE /////////////////////////////////////////////////
- CPPUNIT_TEST_SUITE( TestFaultCohesiveDynLHex8 );
-
- CPPUNIT_TEST( testInitialize );
- CPPUNIT_TEST( testConstrainSolnSpaceStick );
- CPPUNIT_TEST( testConstrainSolnSpaceSlip );
- CPPUNIT_TEST( testConstrainSolnSpaceOpen );
- CPPUNIT_TEST( testUpdateStateVars );
- CPPUNIT_TEST( testCalcTractions );
-
- CPPUNIT_TEST_SUITE_END();
-
- // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
- /// Setup testing data.
- void setUp(void);
-
-}; // class TestFaultCohesiveDynLHex8
-
-#endif // pylith_faults_testfaultcohesivedynlhex8_hh
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,42 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFaultCohesiveDynLQuad4.hh" // Implementation of class methods
-
-#include "data/CohesiveDynLDataQuad4.hh" // USES CohesiveDynLDataQuad4
-
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
-#include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynLQuad4 );
-
-// ----------------------------------------------------------------------
-// Setup testing data.
-void
-pylith::faults::TestFaultCohesiveDynLQuad4::setUp(void)
-{ // setUp
- TestFaultCohesiveDynL::setUp();
- _data = new CohesiveDynLDataQuad4();
-
- CPPUNIT_ASSERT(0 != _quadrature);
- feassemble::GeometryLine2D geometry;
- _quadrature->refGeometry(&geometry);
-
- _flipFault = true;
-} // setUp
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,60 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh
- *
- * @brief C++ TestFaultCohesiveDynLQuad4 object.
- *
- * C++ unit testing for FaultCohesiveDynL for mesh with 2-D quadrilateral cells.
- */
-
-#if !defined(pylith_faults_testfaultcohesivedynlquad4_hh)
-#define pylith_faults_testfaultcohesivedynlquad4_hh
-
-#include "TestFaultCohesiveDynL.hh" // ISA TestFaultCohesiveDynL
-
-/// Namespace for pylith package
-namespace pylith {
- namespace faults {
- class TestFaultCohesiveDynLQuad4;
- } // bc
-} // pylith
-
-/// C++ unit testing for FaultCohesiveDynL for mesh with 2-D quadrilateral cells.
-class pylith::faults::TestFaultCohesiveDynLQuad4 : public TestFaultCohesiveDynL
-{ // class TestFaultCohesiveDynLQuad4
-
- // CPPUNIT TEST SUITE /////////////////////////////////////////////////
- CPPUNIT_TEST_SUITE( TestFaultCohesiveDynLQuad4 );
-
- CPPUNIT_TEST( testInitialize );
- CPPUNIT_TEST( testConstrainSolnSpaceStick );
- CPPUNIT_TEST( testConstrainSolnSpaceSlip );
- CPPUNIT_TEST( testConstrainSolnSpaceOpen );
- CPPUNIT_TEST( testUpdateStateVars );
- CPPUNIT_TEST( testCalcTractions );
-
- CPPUNIT_TEST_SUITE_END();
-
- // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
- /// Setup testing data.
- void setUp(void);
-
-}; // class TestFaultCohesiveDynLQuad4
-
-#endif // pylith_faults_testfaultcohesivedynlquad4_hh
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,42 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFaultCohesiveDynLTet4.hh" // Implementation of class methods
-
-#include "data/CohesiveDynLDataTet4.hh" // USES CohesiveDynLDataTet4
-
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
-#include "pylith/feassemble/GeometryTri3D.hh" // USES GeometryTri3D
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynLTet4 );
-
-// ----------------------------------------------------------------------
-// Setup testing data.
-void
-pylith::faults::TestFaultCohesiveDynLTet4::setUp(void)
-{ // setUp
- TestFaultCohesiveDynL::setUp();
- _data = new CohesiveDynLDataTet4();
-
- CPPUNIT_ASSERT(0 != _quadrature);
- feassemble::GeometryTri3D geometry;
- _quadrature->refGeometry(&geometry);
-
- _flipFault = true;
-} // setUp
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,60 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh
- *
- * @brief C++ TestFaultCohesiveDynLTet4 object.
- *
- * C++ unit testing for FaultCohesiveDynL for mesh with 2-D quadrilateral cells.
- */
-
-#if !defined(pylith_faults_testfaultcohesivedynltet4_hh)
-#define pylith_faults_testfaultcohesivedynltet4_hh
-
-#include "TestFaultCohesiveDynL.hh" // ISA TestFaultCohesiveDynL
-
-/// Namespace for pylith package
-namespace pylith {
- namespace faults {
- class TestFaultCohesiveDynLTet4;
- } // bc
-} // pylith
-
-/// C++ unit testing for FaultCohesiveDynL for mesh with 2-D quadrilateral cells.
-class pylith::faults::TestFaultCohesiveDynLTet4 : public TestFaultCohesiveDynL
-{ // class TestFaultCohesiveDynLTet4
-
- // CPPUNIT TEST SUITE /////////////////////////////////////////////////
- CPPUNIT_TEST_SUITE( TestFaultCohesiveDynLTet4 );
-
- CPPUNIT_TEST( testInitialize );
- CPPUNIT_TEST( testConstrainSolnSpaceStick );
- CPPUNIT_TEST( testConstrainSolnSpaceSlip );
- CPPUNIT_TEST( testConstrainSolnSpaceOpen );
- CPPUNIT_TEST( testUpdateStateVars );
- CPPUNIT_TEST( testCalcTractions );
-
- CPPUNIT_TEST_SUITE_END();
-
- // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
- /// Setup testing data.
- void setUp(void);
-
-}; // class TestFaultCohesiveDynLTet4
-
-#endif // pylith_faults_testfaultcohesivedynltet4_hh
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,42 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-#include <portinfo>
-
-#include "TestFaultCohesiveDynLTri3.hh" // Implementation of class methods
-
-#include "data/CohesiveDynLDataTri3.hh" // USES CohesiveDynLDataTri3
-
-#include "pylith/topology/SubMesh.hh" // USES SubMesh
-#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
-#include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
-
-// ----------------------------------------------------------------------
-CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynLTri3 );
-
-// ----------------------------------------------------------------------
-// Setup testing data.
-void
-pylith::faults::TestFaultCohesiveDynLTri3::setUp(void)
-{ // setUp
- TestFaultCohesiveDynL::setUp();
- _data = new CohesiveDynLDataTri3();
-
- CPPUNIT_ASSERT(0 != _quadrature);
- feassemble::GeometryLine2D geometry;
- _quadrature->refGeometry(&geometry);
-
- _flipFault = true;
-} // setUp
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,60 +0,0 @@
-// -*- C++ -*-
-//
-// ----------------------------------------------------------------------
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ----------------------------------------------------------------------
-//
-
-/**
- * @file unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh
- *
- * @brief C++ TestFaultCohesiveDynLTri3 object.
- *
- * C++ unit testing for FaultCohesiveDynL for mesh with 2-D triangular cells.
- */
-
-#if !defined(pylith_faults_testfaultcohesivedynltri3_hh)
-#define pylith_faults_testfaultcohesivedynltri3_hh
-
-#include "TestFaultCohesiveDynL.hh" // ISA TestFaultCohesiveDynL
-
-/// Namespace for pylith package
-namespace pylith {
- namespace faults {
- class TestFaultCohesiveDynLTri3;
- } // bc
-} // pylith
-
-/// C++ unit testing for FaultCohesiveDynL for mesh with 2-D triangular cells.
-class pylith::faults::TestFaultCohesiveDynLTri3 : public TestFaultCohesiveDynL
-{ // class TestFaultCohesiveDynLTri3
-
- // CPPUNIT TEST SUITE /////////////////////////////////////////////////
- CPPUNIT_TEST_SUITE( TestFaultCohesiveDynLTri3 );
-
- CPPUNIT_TEST( testInitialize );
- CPPUNIT_TEST( testConstrainSolnSpaceStick );
- CPPUNIT_TEST( testConstrainSolnSpaceSlip );
- CPPUNIT_TEST( testConstrainSolnSpaceOpen );
- CPPUNIT_TEST( testUpdateStateVars );
- CPPUNIT_TEST( testCalcTractions );
-
- CPPUNIT_TEST_SUITE_END();
-
- // PUBLIC METHODS /////////////////////////////////////////////////////
-public :
-
- /// Setup testing data.
- void setUp(void);
-
-}; // class TestFaultCohesiveDynLTri3
-
-#endif // pylith_faults_testfaultcohesivedynltri3_hh
-
-
-// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.cc (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultCohesiveDynQuad4.hh" // Implementation of class methods
+
+#include "data/CohesiveDynDataQuad4.hh" // USES CohesiveDynDataQuad4
+
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
+#include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynQuad4 );
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::faults::TestFaultCohesiveDynQuad4::setUp(void)
+{ // setUp
+ TestFaultCohesiveDyn::setUp();
+ _data = new CohesiveDynDataQuad4();
+
+ CPPUNIT_ASSERT(0 != _quadrature);
+ feassemble::GeometryLine2D geometry;
+ _quadrature->refGeometry(&geometry);
+
+ _flipFault = true;
+} // setUp
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLQuad4.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.hh (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynQuad4.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultCohesiveDynQuad4.hh
+ *
+ * @brief C++ TestFaultCohesiveDynQuad4 object.
+ *
+ * C++ unit testing for FaultCohesiveDyn for mesh with 2-D quadrilateral cells.
+ */
+
+#if !defined(pylith_faults_testfaultcohesivedynquad4_hh)
+#define pylith_faults_testfaultcohesivedynquad4_hh
+
+#include "TestFaultCohesiveDyn.hh" // ISA TestFaultCohesiveDyn
+
+/// Namespace for pylith package
+namespace pylith {
+ namespace faults {
+ class TestFaultCohesiveDynQuad4;
+ } // bc
+} // pylith
+
+/// C++ unit testing for FaultCohesiveDyn for mesh with 2-D quadrilateral cells.
+class pylith::faults::TestFaultCohesiveDynQuad4 : public TestFaultCohesiveDyn
+{ // class TestFaultCohesiveDynQuad4
+
+ // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+ CPPUNIT_TEST_SUITE( TestFaultCohesiveDynQuad4 );
+
+ CPPUNIT_TEST( testInitialize );
+ CPPUNIT_TEST( testConstrainSolnSpaceStick );
+ CPPUNIT_TEST( testConstrainSolnSpaceSlip );
+ CPPUNIT_TEST( testConstrainSolnSpaceOpen );
+ CPPUNIT_TEST( testUpdateStateVars );
+ CPPUNIT_TEST( testCalcTractions );
+
+ CPPUNIT_TEST_SUITE_END();
+
+ // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+ /// Setup testing data.
+ void setUp(void);
+
+}; // class TestFaultCohesiveDynQuad4
+
+#endif // pylith_faults_testfaultcohesivedynquad4_hh
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.cc (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultCohesiveDynTet4.hh" // Implementation of class methods
+
+#include "data/CohesiveDynDataTet4.hh" // USES CohesiveDynDataTet4
+
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
+#include "pylith/feassemble/GeometryTri3D.hh" // USES GeometryTri3D
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynTet4 );
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::faults::TestFaultCohesiveDynTet4::setUp(void)
+{ // setUp
+ TestFaultCohesiveDyn::setUp();
+ _data = new CohesiveDynDataTet4();
+
+ CPPUNIT_ASSERT(0 != _quadrature);
+ feassemble::GeometryTri3D geometry;
+ _quadrature->refGeometry(&geometry);
+
+ _flipFault = true;
+} // setUp
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTet4.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.hh (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTet4.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultCohesiveDynTet4.hh
+ *
+ * @brief C++ TestFaultCohesiveDynTet4 object.
+ *
+ * C++ unit testing for FaultCohesiveDyn for mesh with 2-D quadrilateral cells.
+ */
+
+#if !defined(pylith_faults_testfaultcohesivedyntet4_hh)
+#define pylith_faults_testfaultcohesivedyntet4_hh
+
+#include "TestFaultCohesiveDyn.hh" // ISA TestFaultCohesiveDyn
+
+/// Namespace for pylith package
+namespace pylith {
+ namespace faults {
+ class TestFaultCohesiveDynTet4;
+ } // bc
+} // pylith
+
+/// C++ unit testing for FaultCohesiveDyn for mesh with 2-D quadrilateral cells.
+class pylith::faults::TestFaultCohesiveDynTet4 : public TestFaultCohesiveDyn
+{ // class TestFaultCohesiveDynTet4
+
+ // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+ CPPUNIT_TEST_SUITE( TestFaultCohesiveDynTet4 );
+
+ CPPUNIT_TEST( testInitialize );
+ CPPUNIT_TEST( testConstrainSolnSpaceStick );
+ CPPUNIT_TEST( testConstrainSolnSpaceSlip );
+ CPPUNIT_TEST( testConstrainSolnSpaceOpen );
+ CPPUNIT_TEST( testUpdateStateVars );
+ CPPUNIT_TEST( testCalcTractions );
+
+ CPPUNIT_TEST_SUITE_END();
+
+ // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+ /// Setup testing data.
+ void setUp(void);
+
+}; // class TestFaultCohesiveDynTet4
+
+#endif // pylith_faults_testfaultcohesivedyntet4_hh
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.cc (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,42 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestFaultCohesiveDynTri3.hh" // Implementation of class methods
+
+#include "data/CohesiveDynDataTri3.hh" // USES CohesiveDynDataTri3
+
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature<SubMesh>
+#include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::faults::TestFaultCohesiveDynTri3 );
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::faults::TestFaultCohesiveDynTri3::setUp(void)
+{ // setUp
+ TestFaultCohesiveDyn::setUp();
+ _data = new CohesiveDynDataTri3();
+
+ CPPUNIT_ASSERT(0 != _quadrature);
+ feassemble::GeometryLine2D geometry;
+ _quadrature->refGeometry(&geometry);
+
+ _flipFault = true;
+} // setUp
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynLTri3.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.hh (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/TestFaultCohesiveDynTri3.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,60 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/faults/TestFaultCohesiveDynTri3.hh
+ *
+ * @brief C++ TestFaultCohesiveDynTri3 object.
+ *
+ * C++ unit testing for FaultCohesiveDyn for mesh with 2-D triangular cells.
+ */
+
+#if !defined(pylith_faults_testfaultcohesivedyntri3_hh)
+#define pylith_faults_testfaultcohesivedyntri3_hh
+
+#include "TestFaultCohesiveDyn.hh" // ISA TestFaultCohesiveDyn
+
+/// Namespace for pylith package
+namespace pylith {
+ namespace faults {
+ class TestFaultCohesiveDynTri3;
+ } // bc
+} // pylith
+
+/// C++ unit testing for FaultCohesiveDyn for mesh with 2-D triangular cells.
+class pylith::faults::TestFaultCohesiveDynTri3 : public TestFaultCohesiveDyn
+{ // class TestFaultCohesiveDynTri3
+
+ // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+ CPPUNIT_TEST_SUITE( TestFaultCohesiveDynTri3 );
+
+ CPPUNIT_TEST( testInitialize );
+ CPPUNIT_TEST( testConstrainSolnSpaceStick );
+ CPPUNIT_TEST( testConstrainSolnSpaceSlip );
+ CPPUNIT_TEST( testConstrainSolnSpaceOpen );
+ CPPUNIT_TEST( testUpdateStateVars );
+ CPPUNIT_TEST( testCalcTractions );
+
+ CPPUNIT_TEST_SUITE_END();
+
+ // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+ /// Setup testing data.
+ void setUp(void);
+
+}; // class TestFaultCohesiveDynTri3
+
+#endif // pylith_faults_testfaultcohesivedyntri3_hh
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.cc (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,55 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#include "CohesiveDynData.hh"
+
+// ----------------------------------------------------------------------
+// Constructor
+pylith::faults::CohesiveDynData::CohesiveDynData(void) :
+ meshFilename(0),
+ spaceDim(0),
+ cellDim(0),
+ numBasis(0),
+ numQuadPts(0),
+ quadPts(0),
+ quadWts(0),
+ basis(0),
+ basisDeriv(0),
+ verticesRef(0),
+ id(0),
+ label(0),
+ initialTractFilename(0),
+ fieldT(0),
+ fieldIncrStick(0),
+ fieldIncrSlip(0),
+ fieldIncrOpen(0),
+ jacobian(0),
+ orientation(0),
+ initialTractions(0),
+ area(0),
+ fieldIncrSlipE(0),
+ slipSlipE(0),
+ fieldIncrOpenE(0),
+ slipOpenE(0),
+ constraintVertices(0),
+ numConstraintVert(0)
+{ // constructor
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor
+pylith::faults::CohesiveDynData::~CohesiveDynData(void)
+{ // destructor
+} // destructor
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.hh (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynData.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,86 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_faults_cohesivedynldata_hh)
+#define pylith_faults_cohesivedynldata_hh
+
+namespace pylith {
+ namespace faults {
+ class CohesiveDynData;
+ } // pylith
+} // faults
+
+class pylith::faults::CohesiveDynData
+{
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public :
+
+ /// Constructor
+ CohesiveDynData(void);
+
+ /// Destructor
+ ~CohesiveDynData(void);
+
+// PUBLIC MEMBERS ///////////////////////////////////////////////////////
+public:
+
+ char* meshFilename; ///< Filename for input mesh
+
+ /// @name Quadrature information
+ //@{
+ int spaceDim; ///< Number of dimensions in vertex coordinates
+ int cellDim; ///< Number of dimensions associated with cell
+ int numBasis; ///< Number of vertices in cell
+ int numQuadPts; ///< Number of quadrature points
+ double* quadPts; ///< Coordinates of quad pts in ref cell
+ double* quadWts; ///< Weights of quadrature points
+ double* basis; ///< Basis fns at quadrature points
+ double* basisDeriv; ///< Derivatives of basis fns at quad pts
+ double* verticesRef; ///< Coordinates of vertices in ref cell (dual basis)
+ //@}
+
+ /// @name Fault information
+ //@{
+ int id; ///< Fault material identifier
+ char* label; ///< Label for fault
+ char* initialTractFilename; ///< Name of db for initial tractions.
+ //@}
+
+ /// @name Input fields
+ //@{
+ double* fieldT; ///< Solution field at time t.
+ double* fieldIncrStick; ///< Soln increment field at time t for stick case.
+ double* fieldIncrSlip; ///< Soln increment field at time t for slipping case.
+ double* fieldIncrOpen; ///< Soln increment field at time t for opening case.
+ double* jacobian; ///< Jacobian sparse matrix.
+ //@}
+
+ /// @name Calculated values.
+ //@{
+ double* orientation; ///< Expected values for fault orientation.
+ double* area; ///< Expected values for fault area.
+ double* initialTractions; ///< Expected values for initial tractions.
+ double* fieldIncrSlipE; ///< Expected values for solution increment for slipping case.
+ double* slipSlipE; ///< Expected values for slip for slipping case.
+ double* fieldIncrOpenE; ///< Expected values for solution increment for opening case.
+ double* slipOpenE; ///< Expected values for slip for opening case.
+
+ int* constraintVertices; ///< Expected points for constraint vertices
+ int numConstraintVert; ///< Number of constraint vertices
+ //@}
+
+};
+
+#endif // pylith_faults_cohesivedynldata_hh
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.cc (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,1546 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+
+/* Original mesh
+ *
+ * Cells are 0-1 and vertices are 2-13.
+ *
+ * 2,3,4,5 -------- 6,7,8,9 -------- 10,11,12,13
+ *
+ * ^^^^^^^ Vertices forming fault
+ *
+ * After adding cohesive elements
+ *
+ * Cells are 0-1,16 and vertices are 4-15.
+ *
+ * 2,3,4,5 -------- 6,7,8,9 -- 14,15,16,17 -------- 10,11,12,13
+ * 18,19,20,21
+ * ^^^^^^^^^^^^^^^^^^^^^^ Cohesive element
+ *
+ */
+
+#include "CohesiveDynDataHex8.hh"
+
+const char* pylith::faults::CohesiveDynDataHex8::_meshFilename =
+ "data/hex8.mesh";
+
+const int pylith::faults::CohesiveDynDataHex8::_spaceDim = 3;
+
+const int pylith::faults::CohesiveDynDataHex8::_cellDim = 2;
+
+const int pylith::faults::CohesiveDynDataHex8::_numBasis = 4;
+
+const int pylith::faults::CohesiveDynDataHex8::_numQuadPts = 4;
+
+const double pylith::faults::CohesiveDynDataHex8::_quadPts[] = {
+ -0.57735027, -0.57735027,
+ +0.57735027, -0.57735027,
+ +0.57735027, +0.57735027,
+ -0.57735027, +0.57735027,
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_quadWts[] = {
+ 1.0, 1.0, 1.0, 1.0
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_basis[] = {
+ 0.62200847, 0.16666667, 0.16666667, 0.0446582,
+ 0.16666667, 0.62200847, 0.0446582, 0.16666667,
+ 0.16666667, 0.0446582, 0.62200847, 0.16666667,
+ 0.0446582, 0.16666667, 0.16666667, 0.62200847,
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_basisDeriv[] = {
+ -0.39433757, -0.39433757,
+ +0.39433757, -0.10566243,
+ +0.10566243, +0.10566243,
+ -0.10566243, +0.39433757,
+
+ -0.39433757, -0.10566243,
+ +0.39433757, -0.39433757,
+ +0.10566243, +0.39433757,
+ -0.10566243, +0.10566243,
+
+ -0.10566243, -0.10566243,
+ +0.10566243, -0.39433757,
+ +0.39433757, +0.39433757,
+ -0.39433757, +0.10566243,
+
+ -0.10566243, -0.39433757,
+ +0.10566243, -0.10566243,
+ +0.39433757, +0.10566243,
+ -0.39433757, +0.39433757,
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_verticesRef[] = {
+ -1.0, -1.0,
+ +1.0, -1.0,
+ +1.0, +1.0,
+ -1.0, +1.0
+};
+
+const int pylith::faults::CohesiveDynDataHex8::_id = 10;
+
+const char* pylith::faults::CohesiveDynDataHex8::_label = "fault";
+
+const char* pylith::faults::CohesiveDynDataHex8::_initialTractFilename =
+ "data/hex8_initialtract.spatialdb";
+
+const double pylith::faults::CohesiveDynDataHex8::_fieldT[] = {
+ 4.1, 6.1, 8.1,
+ 4.2, 6.2, 8.2,
+ 4.3, 6.3, 8.3,
+ 4.4, 6.4, 8.4,
+ 4.5, 6.5, 8.5, // 6
+ 4.6, 6.6, 8.6, // 7
+ 4.7, 6.7, 8.7, // 8
+ 4.8, 6.8, 8.8, // 9
+ 4.9, 6.9, 8.9,
+ 4.0, 6.0, 8.0,
+ 5.1, 7.1, 9.1,
+ 5.2, 7.2, 9.2,
+ 5.3, 7.3, 9.3, // 14
+ 5.5, 7.5, 9.5, // 15
+ 5.7, 7.7, 9.7, // 16
+ 5.9, 7.9, 9.9, // 17
+ 5.4, 7.4, 9.4, // 18
+ 5.6, 7.6, 9.6, // 19
+ 5.8, 7.8, 9.8, // 20
+ 5.0, 7.0, 9.0, // 21
+};
+
+// :TODO: Make sensible values for Jacobian for DOF on positive and
+// negative sides of the fault. Add semi-random values for other DOF.
+const double pylith::faults::CohesiveDynDataHex8::_jacobian[] = {
+ 1, 0.1, 0.2,
+ 0.3, 0.4, 0.5,
+ 0.6, 0.7, 0.8,
+ 0.9, 1, 1.1,
+ 1.2, 1.3, 1.4,
+ 1.5, 1.6, 1.7,
+ 1.8, 1.9, 2,
+ 2.1, 2.2, 2.3,
+ 2.4, 2.5, 2.6,
+ 2.7, 2.8, 2.9,
+ 3, 3.1, 3.2,
+ 3.3, 3.4, 3.5,
+ 3.6, 3.7, 3.8,
+ 3.9, 4, 4.1,
+ 4.2, 4.3, 4.4,
+ 4.5, 4.6, 4.7,
+ 4.8, 4.9, 5,
+ 5.1, 5.2, 5.3,
+ 5.4, 5.5, 5.6,
+ 5.7, 5.8, 5.9,
+ 6, 1, 6.1,
+ 6.2, 6.3, 6.4,
+ 6.5, 6.6, 6.7,
+ 6.8, 6.9, 7,
+ 7.1, 7.2, 7.3,
+ 7.4, 7.5, 7.6,
+ 7.7, 7.8, 7.9,
+ 8, 8.1, 8.2,
+ 8.3, 8.4, 8.5,
+ 8.6, 8.7, 8.8,
+ 8.9, 9, 9.1,
+ 9.2, 9.3, 9.4,
+ 9.5, 9.6, 9.7,
+ 9.8, 9.9, 10,
+ 10.1, 10.2, 10.3,
+ 10.4, 10.5, 10.6,
+ 10.7, 10.8, 10.9,
+ 11, 11.1, 11.2,
+ 11.3, 11.4, 11.5,
+ 11.6, 11.7, 11.8,
+ 11.9, 12, 1,
+ 12.1, 12.2, 12.3,
+ 12.4, 12.5, 12.6,
+ 12.7, 12.8, 12.9,
+ 13, 13.1, 13.2,
+ 13.3, 13.4, 13.5,
+ 13.6, 13.7, 13.8,
+ 13.9, 14, 14.1,
+ 14.2, 14.3, 14.4,
+ 14.5, 14.6, 14.7,
+ 14.8, 14.9, 15,
+ 15.1, 15.2, 15.3,
+ 15.4, 15.5, 15.6,
+ 15.7, 15.8, 15.9,
+ 16, 16.1, 16.2,
+ 16.3, 16.4, 16.5,
+ 16.6, 16.7, 16.8,
+ 16.9, 17, 17.1,
+ 17.2, 17.3, 17.4,
+ 17.5, 17.6, 17.7,
+ 17.8, 17.9, 18,
+ 1, 18.1, 18.2,
+ 18.3, 18.4, 18.5,
+ 18.6, 18.7, 18.8,
+ 18.9, 19, 19.1,
+ 19.2, 19.3, 19.4,
+ 19.5, 19.6, 19.7,
+ 19.8, 19.9, 20,
+ 20.1, 20.2, 20.3,
+ 20.4, 20.5, 20.6,
+ 20.7, 20.8, 20.9,
+ 21, 21.1, 21.2,
+ 21.3, 21.4, 21.5,
+ 21.6, 21.7, 21.8,
+ 21.9, 22, 22.1,
+ 22.2, 22.3, 22.4,
+ 22.5, 22.6, 22.7,
+ 22.8, 22.9, 23,
+ 23.1, 23.2, 23.3,
+ 23.4, 23.5, 23.6,
+ 23.7, 23.8, 23.9,
+ 24, 1, 24.1,
+ 24.2, 24.3, 24.4,
+ 24.5, 24.6, 24.7,
+ 24.8, 24.9, 25,
+ 25.1, 25.2, 25.3,
+ 25.4, 25.5, 25.6,
+ 25.7, 25.8, 25.9,
+ 26, 26.1, 26.2,
+ 26.3, 26.4, 26.5,
+ 26.6, 26.7, 26.8,
+ 26.9, 27, 27.1,
+ 27.2, 27.3, 27.4,
+ 27.5, 27.6, 27.7,
+ 27.8, 27.9, 28,
+ 28.1, 28.2, 28.3,
+ 28.4, 28.5, 28.6,
+ 28.7, 28.8, 28.9,
+ 29, 29.1, 29.2,
+ 29.3, 29.4, 29.5,
+ 29.6, 29.7, 29.8,
+ 29.9, 30, 1,
+ 30.1, 30.2, 30.3,
+ 30.4, 30.5, 30.6,
+ 30.7, 30.8, 30.9,
+ 31, 31.1, 31.2,
+ 31.3, 31.4, 31.5,
+ 31.6, 31.7, 31.8,
+ 31.9, 32, 32.1,
+ 32.2, 32.3, 32.4,
+ 32.5, 32.6, 32.7,
+ 32.8, 32.9, 33,
+ 33.1, 33.2, 33.3,
+ 33.4, 33.5, 33.6,
+ 33.7, 33.8, 33.9,
+ 34, 34.1, 34.2,
+ 34.3, 34.4, 34.5,
+ 34.6, 34.7, 34.8,
+ 34.9, 35, 35.1,
+ 35.2, 35.3, 35.4,
+ 35.5, 35.6, 35.7,
+ 35.8, 35.9, 36,
+ 1, 36.1, 36.2,
+ 36.3, 36.4, 36.5,
+ 36.6, 36.7, 36.8,
+ 36.9, 37, 37.1,
+ 37.2, 37.3, 37.4,
+ 37.5, 37.6, 37.7,
+ 37.8, 37.9, 38,
+ 38.1, 38.2, 38.3,
+ 38.4, 38.5, 38.6,
+ 38.7, 38.8, 38.9,
+ 39, 39.1, 39.2,
+ 39.3, 39.4, 39.5,
+ 39.6, 39.7, 39.8,
+ 39.9, 40, 40.1,
+ 40.2, 40.3, 40.4,
+ 40.5, 40.6, 40.7,
+ 40.8, 40.9, 41,
+ 41.1, 41.2, 41.3,
+ 41.4, 41.5, 41.6,
+ 41.7, 41.8, 41.9,
+ 42, 1, 42.1,
+ 42.2, 42.3, 42.4,
+ 42.5, 42.6, 42.7,
+ 42.8, 42.9, 43,
+ 43.1, 43.2, 43.3,
+ 43.4, 43.5, 43.6,
+ 43.7, 43.8, 43.9,
+ 44, 44.1, 44.2,
+ 44.3, 44.4, 44.5,
+ 44.6, 44.7, 44.8,
+ 44.9, 45, 45.1,
+ 45.2, 45.3, 45.4,
+ 45.5, 45.6, 45.7,
+ 45.8, 45.9, 46,
+ 46.1, 46.2, 46.3,
+ 46.4, 46.5, 46.6,
+ 46.7, 46.8, 46.9,
+ 47, 47.1, 47.2,
+ 47.3, 47.4, 47.5,
+ 47.6, 47.7, 47.8,
+ 47.9, 48, 1,
+ 48.1, 48.2, 48.3,
+ 48.4, 48.5, 48.6,
+ 48.7, 48.8, 48.9,
+ 49, 49.1, 49.2,
+ 49.3, 49.4, 49.5,
+ 49.6, 49.7, 49.8,
+ 49.9, 50, 50.1,
+ 50.2, 50.3, 50.4,
+ 50.5, 50.6, 50.7,
+ 50.8, 50.9, 51,
+ 51.1, 51.2, 51.3,
+ 51.4, 51.5, 51.6,
+ 51.7, 51.8, 51.9,
+ 52, 52.1, 52.2,
+ 52.3, 52.4, 52.5,
+ 52.6, 52.7, 52.8,
+ 52.9, 53, 53.1,
+ 53.2, 53.3, 53.4,
+ 53.5, 53.6, 53.7,
+ 53.8, 53.9, 54,
+ 1, 54.1, 54.2,
+ 54.3, 54.4, 54.5,
+ 54.6, 54.7, 54.8,
+ 54.9, 55, 55.1,
+ 55.2, 55.3, 55.4,
+ 55.5, 55.6, 55.7,
+ 55.8, 55.9, 56,
+ 56.1, 56.2, 56.3,
+ 56.4, 56.5, 56.6,
+ 56.7, 56.8, 56.9,
+ 57, 57.1, 57.2,
+ 57.3, 57.4, 57.5,
+ 57.6, 57.7, 57.8,
+ 57.9, 58, 58.1,
+ 58.2, 58.3, 58.4,
+ 58.5, 58.6, 58.7,
+ 58.8, 58.9, 59,
+ 59.1, 59.2, 59.3,
+ 59.4, 59.5, 59.6,
+ 59.7, 59.8, 59.9,
+ 60, 1, 60.1,
+ 60.2, 60.3, 60.4,
+ 60.5, 60.6, 60.7,
+ 60.8, 60.9, 61,
+ 61.1, 61.2, 61.3,
+ 61.4, 61.5, 61.6,
+ 61.7, 61.8, 61.9,
+ 62, 62.1, 62.2,
+ 62.3, 62.4, 62.5,
+ 62.6, 62.7, 62.8,
+ 62.9, 63, 63.1,
+ 63.2, 63.3, 63.4,
+ 63.5, 63.6, 63.7,
+ 63.8, 63.9, 64,
+ 64.1, 64.2, 64.3,
+ 64.4, 64.5, 64.6,
+ 64.7, 64.8, 64.9,
+ 65, 65.1, 65.2,
+ 65.3, 65.4, 65.5,
+ 65.6, 65.7, 65.8,
+ 65.9, 66, 1,
+ 66.1, 66.2, 66.3,
+ 66.4, 66.5, 66.6,
+ 66.7, 66.8, 66.9,
+ 67, 67.1, 67.2,
+ 67.3, 67.4, 67.5,
+ 67.6, 67.7, 67.8,
+ 67.9, 68, 68.1,
+ 68.2, 68.3, 68.4,
+ 68.5, 68.6, 68.7,
+ 68.8, 68.9, 69,
+ 69.1, 69.2, 69.3,
+ 69.4, 69.5, 69.6,
+ 69.7, 69.8, 69.9,
+ 70, 70.1, 70.2,
+ 70.3, 70.4, 70.5,
+ 70.6, 70.7, 70.8,
+ 70.9, 71, 71.1,
+ 71.2, 71.3, 71.4,
+ 71.5, 71.6, 71.7,
+ 71.8, 71.9, 72,
+ 1, 72.1, 72.2,
+ 72.3, 72.4, 72.5,
+ 72.6, 72.7, 72.8,
+ 72.9, 73, 73.1,
+ 73.2, 73.3, 73.4,
+ 73.5, 73.6, 73.7,
+ 73.8, 73.9, 74,
+ 74.1, 74.2, 74.3,
+ 74.4, 74.5, 74.6,
+ 74.7, 74.8, 74.9,
+ 75, 75.1, 75.2,
+ 75.3, 75.4, 75.5,
+ 75.6, 75.7, 1,
+ 75.8, 75.9, 76,
+ 76.1, 76.2, 76.3,
+ 76.4, 76.5, 76.6,
+ 76.7, 76.8, 76.9,
+ 77, 77.1, 77.2,
+ 77.3, 77.4, 77.5,
+ 77.6, 77.7, 77.8,
+ 77.9, 1, 78,
+ 78.1, 78.2, 78.3,
+ 78.4, 78.5, 78.6,
+ 78.7, 78.8, 78.9,
+ 79, 79.1, 79.2,
+ 79.3, 79.4, 79.5,
+ 79.6, 79.7, 79.8,
+ 79.9, 80, 80.1,
+ 80.2, 80.3, 80.4,
+ 80.5, 80.6, 80.7,
+ 80.8, 80.9, 81,
+ 81.1, 81.2, 81.3,
+ 1, 81.4, 81.5,
+ 81.6, 81.7, 81.8,
+ 81.9, 82, 82.1,
+ 82.2, 82.3, 82.4,
+ 82.5, 82.6, 82.7,
+ 82.8, 82.9, 83,
+ 83.1, 83.2, 83.3,
+ 83.4, 83.5, 83.6,
+ 83.7, 83.8, 1,
+ 83.9, 84, 84.1,
+ 84.2, 84.3, 84.4,
+ 84.5, 84.6, 84.7,
+ 84.8, 84.9, 85,
+ 85.1, 85.2, 85.3,
+ 85.4, 85.5, 85.6,
+ 85.7, 85.8, 85.9,
+ 86, 86.1, 86.2,
+ 86.3, 86.4, 86.5,
+ 86.6, 86.7, 86.8,
+ 86.9, 87, 87.1,
+ 87.2, 1, 87.3,
+ 87.4, 87.5, 87.6,
+ 87.7, 87.8, 87.9,
+ 88, 88.1, 88.2,
+ 88.3, 88.4, 88.5,
+ 88.6, 88.7, 88.8,
+ 88.9, 89, 89.1,
+ 89.2, 89.3, 89.4,
+ 89.5, 89.6, 89.7,
+ 1, 89.8, 89.9,
+ 90, 90.1, 90.2,
+ 90.3, 90.4, 90.5,
+ 90.6, 90.7, 90.8,
+ 90.9, 91, 91.1,
+ 91.2, 91.3, 91.4,
+ 91.5, 91.6, 91.7,
+ 91.8, 91.9, 92,
+ 92.1, 92.2, 92.3,
+ 92.4, 92.5, 92.6,
+ 92.7, 92.8, 92.9,
+ 93, 93.1, 93.2,
+ 93.3, 93.4, 1,
+ 93.5, 93.6, 93.7,
+ 93.8, 93.9, 94,
+ 94.1, 94.2, 94.3,
+ 94.4, 94.5, 94.6,
+ 94.7, 94.8, 94.9,
+ 95, 95.1, 95.2,
+ 95.3, 95.4, 95.5,
+ 95.6, 1, 95.7,
+ 95.8, 95.9, 96,
+ 96.1, 96.2, 96.3,
+ 96.4, 96.5, 96.6,
+ 96.7, 96.8, 96.9,
+ 97, 97.1, 97.2,
+ 97.3, 97.4, 97.5,
+ 97.6, 97.7, 97.8,
+ 97.9, 98, 98.1,
+ 98.2, 98.3, 98.4,
+ 98.5, 98.6, 98.7,
+ 98.8, 98.9, 99,
+ 1, 99.1, 99.2,
+ 99.3, 99.4, 99.5,
+ 99.6, 99.7, 99.8,
+ 99.9, 100,100.1,
+100.2,100.3,100.4,
+100.5,100.6,100.7,
+100.8,100.9, 101,
+101.1,101.2,101.3,
+101.4,101.5, 1,
+101.6,101.7,101.8,
+101.9, 102,102.1,
+102.2,102.3,102.4,
+102.5,102.6,102.7,
+102.8,102.9, 103,
+103.1,103.2,103.3,
+103.4,103.5,103.6,
+103.7,103.8,103.9,
+ 104,104.1,104.2,
+104.3,104.4,104.5,
+104.6,104.7,104.8,
+104.9, 1, 105,
+105.1,105.2,105.3,
+105.4,105.5,105.6,
+105.7,105.8,105.9,
+ 106,106.1,106.2,
+106.3,106.4,106.5,
+106.6,106.7,106.8,
+106.9, 107,107.1,
+107.2,107.3,107.4,
+ 1,107.5,107.6,
+107.7,107.8,107.9,
+ 108,108.1,108.2,
+108.3,108.4,108.5,
+108.6,108.7,108.8,
+108.9, 109,109.1,
+109.2,109.3,109.4,
+109.5,109.6,109.7,
+109.8,109.9, 110,
+110.1,110.2,110.3,
+110.4,110.5,110.6,
+110.7,110.8,110.9,
+ 111,111.1, 1,
+111.2,111.3,111.4,
+111.5,111.6,111.7,
+111.8,111.9, 112,
+112.1,112.2,112.3,
+112.4,112.5,112.6,
+112.7,112.8,112.9,
+ 113,113.1,113.2,
+113.3, 1,113.4,
+113.5,113.6,113.7,
+113.8,113.9, 114,
+114.1,114.2,114.3,
+114.4,114.5,114.6,
+114.7,114.8,114.9,
+ 115,115.1,115.2,
+115.3,115.4,115.5,
+115.6,115.7,115.8,
+115.9, 116,116.1,
+116.2,116.3,116.4,
+116.5,116.6,116.7,
+ 1,116.8,116.9,
+ 117,117.1,117.2,
+117.3,117.4,117.5,
+117.6,117.7,117.8,
+117.9, 118,118.1,
+118.2,118.3,118.4,
+118.5,118.6,118.7,
+118.8,118.9, 119,
+119.1,119.2, 1,
+119.3,119.4,119.5,
+119.6,119.7,119.8,
+119.9, 120,120.1,
+120.2,120.3,120.4,
+120.5,120.6,120.7,
+120.8,120.9, 121,
+121.1,121.2,121.3,
+121.4,121.5,121.6,
+121.7,121.8,121.9,
+ 122,122.1,122.2,
+122.3,122.4,122.5,
+122.6, 1,122.7,
+122.8,122.9, 123,
+123.1,123.2,123.3,
+123.4,123.5,123.6,
+123.7,123.8,123.9,
+ 124,124.1,124.2,
+124.3,124.4,124.5,
+124.6,124.7,124.8,
+124.9, 125,125.1,
+ 1,125.2,125.3,
+125.4,125.5,125.6,
+125.7,125.8,125.9,
+ 126,126.1,126.2,
+126.3,126.4,126.5,
+126.6,126.7,126.8,
+126.9, 127,127.1,
+127.2,127.3,127.4,
+127.5,127.6,127.7,
+127.8,127.9, 128,
+128.1,128.2,128.3,
+128.4,128.5,128.6,
+128.7,128.8, 1,
+128.9, 129,129.1,
+129.2,129.3,129.4,
+129.5,129.6,129.7,
+129.8,129.9, 130,
+130.1,130.2,130.3,
+130.4,130.5,130.6,
+130.7,130.8,130.9,
+ 131, 1,131.1,
+131.2,131.3,131.4,
+131.5,131.6,131.7,
+131.8,131.9, 132,
+132.1,132.2,132.3,
+132.4,132.5,132.6,
+132.7,132.8,132.9,
+ 133,133.1,133.2,
+133.3,133.4,133.5,
+133.6,133.7,133.8,
+133.9, 134,134.1,
+134.2,134.3,134.4,
+ 1,134.5,134.6,
+134.7,134.8,134.9,
+ 135,135.1,135.2,
+135.3,135.4,135.5,
+135.6,135.7,135.8,
+135.9, 136,136.1,
+136.2,136.3,136.4,
+136.5,136.6,136.7,
+136.8,136.9, 1,
+ 137,137.1,137.2,
+137.3,137.4,137.5,
+137.6,137.7,137.8,
+137.9, 138,138.1,
+138.2,138.3,138.4,
+138.5,138.6,138.7,
+138.8,138.9, 139,
+139.1,139.2,139.3,
+139.4,139.5,139.6,
+139.7,139.8,139.9,
+ 140,140.1,140.2,
+140.3, 1,140.4,
+140.5,140.6,140.7,
+140.8,140.9, 141,
+141.1,141.2,141.3,
+141.4,141.5,141.6,
+141.7,141.8,141.9,
+ 142,142.1,142.2,
+142.3,142.4,142.5,
+142.6,142.7,142.8,
+ 1,142.9, 143,
+143.1,143.2,143.3,
+143.4,143.5,143.6,
+143.7,143.8,143.9,
+ 144,144.1,144.2,
+144.3,144.4,144.5,
+144.6,144.7,144.8,
+144.9, 145,145.1,
+145.2,145.3,145.4,
+145.5,145.6,145.7,
+145.8,145.9, 146,
+146.1,146.2,146.3,
+146.4,146.5,146.6,
+146.7,146.8,146.9,
+ 147,147.1,147.2,
+147.3,147.4,147.5,
+147.6,147.7,147.8,
+147.9, 148,148.1,
+148.2,148.3,148.4,
+148.5,148.6,148.7,
+148.8, 1,148.9,
+ 149,149.1,149.2,
+149.3,149.4,149.5,
+149.6,149.7,149.8,
+149.9, 150,150.1,
+150.2,150.3,150.4,
+150.5,150.6,150.7,
+150.8,150.9, 151,
+151.1,151.2,151.3,
+151.4,151.5,151.6,
+151.7,151.8,151.9,
+ 152,152.1,152.2,
+152.3,152.4,152.5,
+152.6,152.7,152.8,
+152.9, 153,153.1,
+153.2,153.3,153.4,
+153.5,153.6,153.7,
+153.8,153.9, 154,
+154.1,154.2,154.3,
+154.4,154.5,154.6,
+154.7,154.8, 1,
+154.9, 155,155.1,
+155.2,155.3,155.4,
+155.5,155.6,155.7,
+155.8,155.9, 156,
+156.1,156.2,156.3,
+156.4,156.5,156.6,
+156.7,156.8,156.9,
+ 157,157.1,157.2,
+157.3,157.4,157.5,
+157.6,157.7,157.8,
+157.9, 158,158.1,
+158.2,158.3,158.4,
+158.5,158.6,158.7,
+158.8,158.9, 159,
+159.1,159.2,159.3,
+159.4,159.5,159.6,
+159.7,159.8,159.9,
+ 160,160.1,160.2,
+160.3,160.4,160.5,
+160.6,160.7,160.8,
+ 1,160.9, 161,
+161.1,161.2,161.3,
+161.4,161.5,161.6,
+161.7,161.8,161.9,
+ 162,162.1,162.2,
+162.3,162.4,162.5,
+162.6,162.7,162.8,
+162.9, 163,163.1,
+163.2,163.3,163.4,
+163.5,163.6,163.7,
+163.8,163.9, 164,
+164.1,164.2,164.3,
+164.4,164.5,164.6,
+164.7,164.8,164.9,
+ 165,165.1,165.2,
+165.3,165.4,165.5,
+165.6,165.7,165.8,
+165.9, 166,166.1,
+166.2,166.3,166.4,
+166.5,166.6,166.7,
+166.8, 1,166.9,
+ 167,167.1,167.2,
+167.3,167.4,167.5,
+167.6,167.7,167.8,
+167.9, 168,168.1,
+168.2,168.3,168.4,
+168.5,168.6,168.7,
+168.8,168.9, 169,
+169.1,169.2,169.3,
+169.4,169.5,169.6,
+169.7,169.8,169.9,
+ 170,170.1,170.2,
+170.3,170.4,170.5,
+170.6,170.7,170.8,
+170.9, 171,171.1,
+171.2,171.3,171.4,
+171.5,171.6,171.7,
+171.8,171.9, 172,
+172.1,172.2,172.3,
+172.4,172.5,172.6,
+172.7,172.8, 1,
+172.9, 173,173.1,
+173.2,173.3,173.4,
+173.5,173.6,173.7,
+173.8,173.9, 174,
+174.1,174.2,174.3,
+174.4,174.5,174.6,
+174.7,174.8,174.9,
+ 175,175.1,175.2,
+175.3,175.4,175.5,
+175.6,175.7,175.8,
+175.9, 176,176.1,
+176.2,176.3,176.4,
+176.5,176.6,176.7,
+176.8,176.9, 177,
+177.1,177.2,177.3,
+177.4,177.5,177.6,
+177.7,177.8,177.9,
+ 178,178.1,178.2,
+178.3,178.4,178.5,
+178.6,178.7,178.8,
+ 1,178.9, 179,
+179.1,179.2,179.3,
+179.4,179.5,179.6,
+179.7,179.8,179.9,
+ 180,180.1,180.2,
+180.3,180.4,180.5,
+180.6,180.7,180.8,
+180.9, 181,181.1,
+181.2,181.3,181.4,
+181.5,181.6,181.7,
+181.8,181.9, 182,
+182.1,182.2,182.3,
+182.4,182.5,182.6,
+182.7,182.8,182.9,
+ 183,183.1,183.2,
+183.3,183.4,183.5,
+183.6,183.7,183.8,
+183.9, 184,184.1,
+184.2,184.3,184.4,
+184.5,184.6,184.7,
+184.8, 1,184.9,
+ 185,185.1,185.2,
+185.3,185.4,185.5,
+185.6,185.7,185.8,
+185.9, 186,186.1,
+186.2,186.3,186.4,
+186.5,186.6,186.7,
+186.8,186.9, 187,
+187.1,187.2,187.3,
+187.4,187.5,187.6,
+187.7,187.8,187.9,
+ 188,188.1,188.2,
+188.3,188.4,188.5,
+188.6,188.7,188.8,
+188.9, 189,189.1,
+189.2,189.3,189.4,
+189.5,189.6,189.7,
+189.8,189.9, 190,
+190.1,190.2,190.3,
+190.4,190.5,190.6,
+190.7,190.8, 1,
+190.9, 191,191.1,
+191.2,191.3,191.4,
+191.5,191.6,191.7,
+191.8,191.9, 192,
+192.1,192.2,192.3,
+192.4,192.5,192.6,
+192.7,192.8,192.9,
+ 193,193.1,193.2,
+193.3,193.4,193.5,
+193.6,193.7,193.8,
+193.9, 194,194.1,
+194.2,194.3,194.4,
+194.5,194.6,194.7,
+194.8,194.9, 195,
+195.1,195.2,195.3,
+195.4,195.5,195.6,
+195.7,195.8,195.9,
+ 196,196.1,196.2,
+196.3,196.4,196.5,
+196.6,196.7,196.8,
+ 1,196.9, 197,
+197.1,197.2,197.3,
+197.4,197.5,197.6,
+197.7,197.8,197.9,
+ 198,198.1,198.2,
+198.3,198.4,198.5,
+198.6,198.7,198.8,
+198.9, 199,199.1,
+199.2,199.3,199.4,
+199.5,199.6,199.7,
+199.8,199.9, 200,
+200.1,200.2,200.3,
+200.4,200.5,200.6,
+200.7,200.8,200.9,
+ 201,201.1,201.2,
+201.3,201.4,201.5,
+201.6,201.7,201.8,
+201.9, 202,202.1,
+202.2,202.3,202.4,
+202.5,202.6,202.7,
+202.8, 1,202.9,
+ 203,203.1,203.2,
+203.3,203.4,203.5,
+203.6,203.7,203.8,
+203.9, 204,204.1,
+204.2,204.3,204.4,
+204.5,204.6,204.7,
+204.8,204.9, 205,
+205.1,205.2,205.3,
+205.4,205.5,205.6,
+205.7,205.8,205.9,
+ 206,206.1,206.2,
+206.3,206.4,206.5,
+206.6,206.7,206.8,
+206.9, 207,207.1,
+207.2,207.3,207.4,
+207.5,207.6,207.7,
+207.8,207.9, 208,
+208.1,208.2,208.3,
+208.4,208.5,208.6,
+208.7,208.8, 1,
+208.9, 209,209.1,
+209.2,209.3,209.4,
+209.5,209.6,209.7,
+209.8,209.9, 210,
+210.1,210.2,210.3,
+210.4,210.5,210.6,
+210.7,210.8,210.9,
+ 211,211.1,211.2,
+211.3,211.4,211.5,
+211.6,211.7,211.8,
+211.9, 212,212.1,
+212.2,212.3,212.4,
+212.5,212.6,212.7,
+212.8,212.9, 213,
+213.1,213.2,213.3,
+213.4,213.5,213.6,
+213.7,213.8,213.9,
+ 214,214.1,214.2,
+214.3,214.4,214.5,
+214.6,214.7,214.8,
+ 1,214.9, 215,
+215.1,215.2,215.3,
+215.4,215.5,215.6,
+215.7,215.8,215.9,
+ 216,216.1, -1,
+216.2,216.3,216.4,
+216.5,216.6,216.7,
+216.8,216.9, 217,
+217.1,217.2,217.3,
+217.4,217.5,217.6,
+217.7,217.8,217.9,
+ 218,218.1,218.2,
+218.3,218.4,218.5,
+218.6,218.7,218.8,
+218.9, 219,219.1,
+219.2,219.3,219.4,
+219.5,219.6,219.7,
+219.8,219.9, 220,
+220.1,220.2,220.3,
+220.4,220.5,220.6,
+220.7, 1,220.8,
+220.9, 221,221.1,
+221.2,221.3,221.4,
+221.5,221.6,221.7,
+ -1,221.8,221.9,
+ 222,222.1,222.2,
+222.3,222.4,222.5,
+222.6,222.7,222.8,
+222.9, 223,223.1,
+223.2,223.3,223.4,
+223.5,223.6,223.7,
+223.8,223.9, 224,
+224.1,224.2,224.3,
+224.4,224.5,224.6,
+224.7,224.8,224.9,
+ 225,225.1,225.2,
+225.3,225.4,225.5,
+225.6,225.7,225.8,
+225.9, 226,226.1,
+226.2,226.3,226.4,
+226.5,226.6, 1,
+226.7,226.8,226.9,
+ 227,227.1,227.2,
+227.3,227.4,227.5,
+227.6, -1,227.7,
+227.8,227.9, 228,
+228.1,228.2,228.3,
+228.4,228.5,228.6,
+228.7,228.8,228.9,
+ 229,229.1,229.2,
+229.3,229.4,229.5,
+229.6,229.7,229.8,
+229.9, 230,230.1,
+230.2,230.3,230.4,
+230.5,230.6,230.7,
+230.8,230.9, 231,
+231.1,231.2,231.3,
+231.4,231.5,231.6,
+231.7,231.8,231.9,
+ 232,232.1,232.2,
+232.3,232.4,232.5,
+ 1,232.6,232.7,
+232.8,232.9, 233,
+233.1,233.2,233.3,
+233.4,233.5,233.6,
+233.7,233.8, -1,
+233.9, 234,234.1,
+234.2,234.3,234.4,
+234.5,234.6,234.7,
+234.8,234.9, 235,
+235.1,235.2,235.3,
+235.4,235.5,235.6,
+235.7,235.8,235.9,
+ 236,236.1,236.2,
+236.3,236.4,236.5,
+236.6,236.7,236.8,
+236.9, 237,237.1,
+237.2,237.3,237.4,
+237.5,237.6,237.7,
+237.8,237.9, 238,
+238.1,238.2,238.3,
+238.4, 1,238.5,
+238.6,238.7,238.8,
+238.9, 239,239.1,
+239.2,239.3,239.4,
+ -1,239.5,239.6,
+239.7,239.8,239.9,
+ 240,240.1,240.2,
+240.3,240.4,240.5,
+240.6,240.7,240.8,
+240.9, 241,241.1,
+241.2,241.3,241.4,
+241.5,241.6,241.7,
+241.8,241.9, 242,
+242.1,242.2,242.3,
+242.4,242.5,242.6,
+242.7,242.8,242.9,
+ 243,243.1,243.2,
+243.3,243.4,243.5,
+243.6,243.7,243.8,
+243.9, 244,244.1,
+244.2,244.3, 1,
+244.4,244.5,244.6,
+244.7,244.8,244.9,
+ 245,245.1,245.2,
+245.3, -1,245.4,
+245.5,245.6,245.7,
+245.8,245.9, 246,
+246.1,246.2,246.3,
+246.4,246.5,246.6,
+246.7,246.8,246.9,
+ 247,247.1,247.2,
+247.3,247.4,247.5,
+247.6,247.7,247.8,
+247.9, 248,248.1,
+248.2,248.3,248.4,
+248.5,248.6,248.7,
+248.8,248.9, 249,
+249.1,249.2,249.3,
+249.4,249.5,249.6,
+249.7,249.8,249.9,
+ 250,250.1,250.2,
+ 1,250.3,250.4,
+250.5,250.6,250.7,
+250.8,250.9, 251,
+251.1,251.2,251.3,
+251.4,251.5, -1,
+251.6,251.7,251.8,
+251.9, 252,252.1,
+252.2,252.3,252.4,
+252.5,252.6,252.7,
+252.8,252.9, 253,
+253.1,253.2,253.3,
+253.4,253.5,253.6,
+253.7,253.8,253.9,
+ 254,254.1,254.2,
+254.3,254.4,254.5,
+254.6,254.7,254.8,
+254.9, 255,255.1,
+255.2,255.3,255.4,
+255.5,255.6,255.7,
+255.8,255.9, 256,
+256.1, 1,256.2,
+256.3,256.4,256.5,
+256.6,256.7,256.8,
+256.9, 257,257.1,
+ -1,257.2,257.3,
+257.4,257.5,257.6,
+257.7,257.8,257.9,
+ 258,258.1,258.2,
+258.3,258.4,258.5,
+258.6,258.7,258.8,
+258.9, 259,259.1,
+259.2,259.3,259.4,
+259.5,259.6,259.7,
+259.8,259.9, 260,
+260.1,260.2,260.3,
+260.4,260.5,260.6,
+260.7,260.8,260.9,
+ 261,261.1,261.2,
+261.3,261.4,261.5,
+261.6,261.7,261.8,
+261.9, 262, 1,
+262.1,262.2,262.3,
+262.4,262.5,262.6,
+262.7,262.8,262.9,
+ 263, -1,263.1,
+263.2,263.3,263.4,
+263.5,263.6,263.7,
+263.8,263.9, 264,
+264.1,264.2,264.3,
+264.4,264.5,264.6,
+264.7,264.8,264.9,
+ 265,265.1,265.2,
+265.3,265.4,265.5,
+265.6,265.7,265.8,
+265.9, 266,266.1,
+266.2,266.3,266.4,
+266.5,266.6,266.7,
+266.8,266.9, 267,
+267.1,267.2,267.3,
+267.4,267.5,267.6,
+267.7,267.8,267.9,
+ 1, 268,268.1,
+268.2,268.3,268.4,
+268.5,268.6,268.7,
+268.8,268.9, 269,
+269.1,269.2, -1,
+269.3,269.4,269.5,
+269.6,269.7,269.8,
+269.9, 270,270.1,
+270.2,270.3,270.4,
+270.5,270.6,270.7,
+270.8,270.9, 271,
+271.1,271.2,271.3,
+271.4,271.5,271.6,
+271.7,271.8,271.9,
+ 272,272.1,272.2,
+272.3,272.4,272.5,
+272.6,272.7,272.8,
+272.9, 273,273.1,
+273.2,273.3,273.4,
+273.5,273.6,273.7,
+273.8, 1,273.9,
+ 274,274.1,274.2,
+274.3,274.4,274.5,
+274.6,274.7,274.8,
+ -1,274.9, 275,
+275.1,275.2,275.3,
+275.4,275.5,275.6,
+275.7,275.8,275.9,
+ 276,276.1,276.2,
+276.3,276.4,276.5,
+276.6,276.7,276.8,
+276.9, 277,277.1,
+277.2,277.3,277.4,
+277.5,277.6,277.7,
+277.8,277.9, 278,
+278.1,278.2,278.3,
+278.4,278.5,278.6,
+278.7,278.8,278.9,
+ 279,279.1,279.2,
+279.3,279.4,279.5,
+279.6,279.7, 1,
+279.8,279.9, 280,
+280.1,280.2,280.3,
+280.4,280.5,280.6,
+280.7, -1,280.8,
+280.9, 281,281.1,
+281.2,281.3,281.4,
+281.5,281.6,281.7,
+281.8,281.9, 282,
+282.1, 1,282.2,
+282.3,282.4,282.5,
+282.6,282.7,282.8,
+282.9, 283,283.1,
+283.2,283.3,283.4,
+283.5,283.6,283.7,
+283.8,283.9, 284,
+284.1,284.2,284.3,
+284.4, -1,284.5,
+284.6,284.7,284.8,
+284.9, 285,285.1,
+285.2,285.3,285.4,
+285.5,285.6,285.7,
+285.8,285.9, 286,
+286.1,286.2,286.3,
+286.4,286.5,286.6,
+286.7,286.8,286.9,
+ 287,287.1,287.2,
+287.3,287.4,287.5,
+287.6,287.7,287.8,
+287.9, 288, 1,
+288.1,288.2,288.3,
+288.4,288.5,288.6,
+288.7,288.8,288.9,
+ 289,289.1,289.2,
+289.3,289.4,289.5,
+289.6,289.7,289.8,
+289.9, 290,290.1,
+290.2,290.3, -1,
+290.4,290.5,290.6,
+290.7,290.8,290.9,
+ 291,291.1,291.2,
+291.3,291.4,291.5,
+291.6,291.7,291.8,
+291.9, 292,292.1,
+292.2,292.3,292.4,
+292.5,292.6,292.7,
+292.8,292.9, 293,
+293.1,293.2,293.3,
+293.4,293.5,293.6,
+ 1,293.7,293.8,
+293.9, 294,294.1,
+294.2,294.3,294.4,
+294.5,294.6,294.7,
+294.8,294.9, 295,
+295.1,295.2,295.3,
+295.4,295.5,295.6,
+295.7,295.8,295.9,
+ -1, 296,296.1,
+296.2,296.3,296.4,
+296.5,296.6,296.7,
+296.8,296.9, 297,
+297.1,297.2,297.3,
+297.4,297.5,297.6,
+297.7,297.8,297.9,
+ 298,298.1,298.2,
+298.3,298.4,298.5,
+298.6,298.7,298.8,
+298.9, 299,299.1,
+299.2,299.3,299.4,
+299.5,299.6,299.7,
+299.8, 1,299.9,
+ 300,300.1,300.2,
+300.3,300.4,300.5,
+300.6,300.7,300.8,
+300.9, 301,301.1,
+301.2,301.3,301.4,
+301.5,301.6,301.7,
+301.8,301.9, 302,
+302.1, -1,302.2,
+302.3,302.4,302.5,
+302.6,302.7,302.8,
+302.9, 303,303.1,
+303.2,303.3,303.4,
+303.5,303.6,303.7,
+303.8,303.9, 304,
+304.1,304.2,304.3,
+304.4,304.5,304.6,
+304.7,304.8,304.9,
+ 305,305.1,305.2,
+305.3,305.4,305.5,
+305.6,305.7, 1,
+305.8,305.9, 306,
+306.1,306.2,306.3,
+306.4,306.5,306.6,
+306.7,306.8,306.9,
+ 307,307.1,307.2,
+307.3,307.4,307.5,
+307.6,307.7,307.8,
+307.9, 308, -1,
+308.1,308.2,308.3,
+308.4,308.5,308.6,
+308.7,308.8,308.9,
+ 309,309.1,309.2,
+309.3,309.4,309.5,
+309.6,309.7,309.8,
+309.9, 310,310.1,
+310.2,310.3,310.4,
+310.5,310.6,310.7,
+310.8,310.9, 311,
+311.1,311.2,311.3,
+ 1,311.4,311.5,
+311.6,311.7,311.8,
+311.9, 312,312.1,
+312.2,312.3,312.4,
+312.5,312.6,312.7,
+312.8,312.9, 313,
+313.1,313.2,313.3,
+313.4,313.5,313.6,
+ -1,313.7,313.8,
+313.9, 314,314.1,
+314.2,314.3,314.4,
+314.5,314.6,314.7,
+314.8,314.9, 315,
+315.1,315.2,315.3,
+315.4,315.5,315.6,
+315.7,315.8,315.9,
+ 316,316.1,316.2,
+316.3,316.4,316.5,
+316.6,316.7,316.8,
+316.9, 317,317.1,
+317.2,317.3,317.4,
+317.5, 1,317.6,
+317.7,317.8,317.9,
+ 318,318.1,318.2,
+318.3,318.4,318.5,
+318.6,318.7,318.8,
+318.9, 319,319.1,
+319.2,319.3,319.4,
+319.5,319.6,319.7,
+319.8, -1,319.9,
+ 320,320.1,320.2,
+320.3,320.4,320.5,
+320.6,320.7,320.8,
+320.9, 321,321.1,
+321.2,321.3,321.4,
+321.5,321.6,321.7,
+321.8,321.9, 322,
+322.1,322.2,322.3,
+322.4,322.5,322.6,
+322.7,322.8,322.9,
+ 323,323.1,323.2,
+323.3,323.4, 1,
+323.5,323.6,323.7,
+323.8,323.9, 324,
+324.1,324.2,324.3,
+324.4,324.5,324.6,
+324.7,324.8,324.9,
+ 325,325.1,325.2,
+325.3,325.4,325.5,
+325.6,325.7, -1,
+325.8,325.9, 326,
+326.1,326.2,326.3,
+326.4,326.5,326.6,
+326.7,326.8,326.9,
+ 327,327.1,327.2,
+327.3,327.4,327.5,
+327.6,327.7,327.8,
+327.9, 328,328.1,
+328.2,328.3,328.4,
+328.5,328.6,328.7,
+328.8,328.9, 329,
+ 1,329.1,329.2,
+329.3,329.4,329.5,
+329.6,329.7,329.8,
+329.9, 330,330.1,
+330.2,330.3,330.4,
+330.5,330.6,330.7,
+330.8,330.9, 331,
+331.1,331.2,331.3,
+ -1,331.4,331.5,
+331.6,331.7,331.8,
+331.9, 332,332.1,
+332.2,332.3,332.4,
+332.5,332.6,332.7,
+332.8,332.9, 333,
+333.1,333.2,333.3,
+333.4,333.5,333.6,
+333.7,333.8,333.9,
+ 334,334.1,334.2,
+334.3,334.4,334.5,
+334.6,334.7,334.8,
+334.9, 335,335.1,
+335.2, 1,335.3,
+335.4,335.5,335.6,
+335.7,335.8,335.9,
+ 336,336.1,336.2,
+336.3,336.4,336.5,
+336.6,336.7,336.8,
+336.9, 337,337.1,
+337.2,337.3,337.4,
+337.5, -1,337.6,
+337.7,337.8,337.9,
+ 338,338.1,338.2,
+338.3,338.4,338.5,
+338.6,338.7,338.8,
+338.9, 339,339.1,
+339.2,339.3,339.4,
+339.5,339.6,339.7,
+339.8,339.9, 340,
+340.1,340.2,340.3,
+340.4,340.5,340.6,
+340.7,340.8,340.9,
+ 341,341.1, 1,
+341.2,341.3,341.4,
+341.5,341.6,341.7,
+341.8,341.9, 342,
+342.1,342.2,342.3,
+342.4,342.5,342.6,
+342.7,342.8,342.9,
+ 343,343.1,343.2,
+343.3,343.4, -1,
+343.5,343.6,343.7,
+343.8,343.9, 344,
+344.1,344.2,344.3,
+344.4,344.5,344.6,
+344.7,344.8,344.9,
+ 345,345.1,345.2,
+345.3,345.4,345.5,
+345.6,345.7,345.8,
+345.9, 346,346.1,
+346.2,346.3,346.4,
+346.5,346.6,346.7,
+ 1,346.8,346.9,
+ 347,347.1,347.2,
+347.3,347.4,347.5,
+347.6,347.7,347.8,
+347.9, 348,348.1,
+348.2,348.3,348.4,
+348.5,348.6,348.7,
+348.8,348.9, 349,
+ -1,349.1,349.2,
+349.3,349.4,349.5,
+349.6,349.7,349.8,
+349.9, 350,350.1,
+350.2,350.3,350.4,
+};
+
+// ----------------------------------------------------------------------
+// Computed values
+// ----------------------------------------------------------------------
+
+const double pylith::faults::CohesiveDynDataHex8::_orientation[] = {
+ 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
+ 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
+ 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
+ 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_area[] = {
+ 1.0, 1.0, 1.0, 1.0
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_initialTractions[] = {
+ 1.0, 2.0, -3.0,
+ 1.1, 2.1, -3.1,
+ 1.2, 2.2, -3.2,
+ 1.3, 2.3, -3.3,
+};
+
+
+const int pylith::faults::CohesiveDynDataHex8::_numConstraintVert = 4;
+const int pylith::faults::CohesiveDynDataHex8::_constraintVertices[] = {
+ 18, 19, 20, 21
+};
+// ----------------------------------------------------------------------
+// Stick case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataHex8::_fieldIncrStick[] = {
+ 0.1, 2.1, 28.1,
+ 0.2, 2.2, 28.2,
+ 0.3, 2.3, 28.3,
+ 0.4, 2.4, 28.4,
+ 0.5, 2.5, 28.5, // 6
+ 0.6, 2.6, 28.6, // 7
+ 0.7, 2.7, 28.7, // 8
+ 0.8, 2.8, 28.8, // 9
+ 0.9, 2.9, 28.9,
+ 0.0, 2.0, 28.0,
+ 1.1, 3.1, 29.1,
+ 1.2, 3.2, 29.2,
+ 1.3, 3.3, 29.3, // 14
+ 1.5, 3.5, 29.5, // 15
+ 1.7, 3.7, 29.7, // 16
+ 1.9, 3.9, 29.9, // 17
+ 1.4, 3.4, -29.4, // 18
+ 1.6, 3.6, -29.6, // 19
+ 1.8, 3.8, -29.8, // 20
+ 1.0, 3.0, -29.0, // 21
+};
+
+// No change in fieldIncr
+// Zero slip
+
+// ----------------------------------------------------------------------
+// Slip case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataHex8::_fieldIncrSlip[] = {
+ 5.1, 7.1, 9.1,
+ 5.2, 7.2, 9.2,
+ 5.3, 7.3, 9.3,
+ 5.4, 7.4, 9.4,
+ 5.5, 7.5, 9.5, // 6
+ 5.6, 7.6, 9.6, // 7
+ 5.7, 7.7, 9.7, // 8
+ 5.8, 7.8, 9.8, // 9
+ 5.9, 7.9, 9.9,
+ 5.0, 7.0, 9.0,
+ 6.1, 8.1, 10.1,
+ 6.2, 8.2, 10.2,
+ 6.3, 8.3, 10.3, // 14
+ 6.5, 8.5, 10.5, // 15
+ 6.7, 8.7, 10.7, // 16
+ 6.9, 8.9, 10.9, // 17
+ 6.4, 8.4, -10.4, // 18
+ 6.6, 8.6, -10.6, // 19
+ 6.8, 8.8, -10.8, // 20
+ 6.0, 8.0, -10.0, // 21
+};
+
+// Output
+// :TODO: Update Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataHex8::_fieldIncrSlipE[] = {
+ 5.1, 7.1, 9.1,
+ 5.2, 7.2, 9.2,
+ 5.3, 7.3, 9.3,
+ 5.4, 7.4, 9.4,
+ 5.5, 7.5, 9.5, // 6
+ 5.6, 7.6, 9.6, // 7
+ 5.7, 7.7, 9.7, // 8
+ 5.8, 7.8, 9.8, // 9
+ 5.9, 7.9, 9.9,
+ 5.0, 7.0, 9.0,
+ 6.1, 8.1, 10.1,
+ 6.2, 8.2, 10.2,
+ 6.3, 8.3, 10.3, // 14
+ 6.5, 8.5, 10.5, // 15
+ 6.7, 8.7, 10.7, // 16
+ 6.9, 8.9, 10.9, // 17
+ -3.963897477671262, -5.477083063322538, -10.4, // 18
+ -4.120121221785221, -5.634915064993491, -10.6, // 19
+ -4.276416812742042, -5.792739610437928, -10.8, // 20
+ -3.474281747841006, -4.919475110692280, -10.0, // 21
+};
+
+// :TODO: Update slip values based on changes in Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataHex8::_slipSlipE[] = {
+ 20.727794955342528, 27.754166126645078, 0.0,
+ 21.440242443570444, 28.469830129986981, 0.0,
+ 22.152833625484085, 29.185479220875859, 0.0,
+ 18.948563495682009, 25.838950221384557, 0.0,
+};
+
+// ----------------------------------------------------------------------
+// Open case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataHex8::_fieldIncrOpen[] = {
+ 5.1, 7.1, 9.1,
+ 5.2, 7.2, 9.2,
+ 5.3, 7.3, 9.3,
+ 5.4, 7.4, 9.4,
+ 5.5, 7.5, 9.5, // 6
+ 5.6, 7.6, 9.6, // 7
+ 5.7, 7.7, 9.7, // 8
+ 5.8, 7.8, 9.8, // 9
+ 5.9, 7.9, 9.9,
+ 5.0, 7.0, 9.0,
+ 6.1, 8.1, 10.1,
+ 6.2, 8.2, 10.2,
+ 6.3, 8.3, 10.3, // 14
+ 6.5, 8.5, 10.5, // 15
+ 6.7, 8.7, 10.7, // 16
+ 6.9, 8.9, 10.9, // 17
+ 6.4, 8.4, 10.4, // 18
+ 6.6, 8.6, 10.6, // 19
+ 6.8, 8.8, 10.8, // 20
+ 6.0, 8.0, 10.0, // 21
+};
+
+// Output
+const double pylith::faults::CohesiveDynDataHex8::_fieldIncrOpenE[] = {
+ 5.1, 7.1, 9.1,
+ 5.2, 7.2, 9.2,
+ 5.3, 7.3, 9.3,
+ 5.4, 7.4, 9.4,
+ 5.5, 7.5, 9.5, // 6
+ 5.6, 7.6, 9.6, // 7
+ 5.7, 7.7, 9.7, // 8
+ 5.8, 7.8, 9.8, // 9
+ 5.9, 7.9, 9.9,
+ 5.0, 7.0, 9.0,
+ 6.1, 8.1, 10.1,
+ 6.2, 8.2, 10.2,
+ 6.3, 8.3, 10.3, // 14
+ 6.5, 8.5, 10.5, // 15
+ 6.7, 8.7, 10.7, // 16
+ 6.9, 8.9, 10.9, // 17
+ -5.4, -7.4, -9.4, // 18
+ -5.6, -7.6, -9.6, // 19
+ -5.8, -7.8, -9.8, // 20
+ -5.0, -7.0, -9.0, // 21
+};
+
+const double pylith::faults::CohesiveDynDataHex8::_slipOpenE[] = {
+ 23.6, 31.6, 39.6,
+ 24.4, 32.4, 40.4,
+ 25.2, 33.2, 41.2,
+ 22.0, 30.0, 38.0,
+};
+
+// ----------------------------------------------------------------------
+pylith::faults::CohesiveDynDataHex8::CohesiveDynDataHex8(void)
+{ // constructor
+ meshFilename = const_cast<char*>(_meshFilename);
+ spaceDim = _spaceDim;
+ cellDim = _cellDim;
+ numBasis = _numBasis;
+ numQuadPts = _numQuadPts;
+ quadPts = const_cast<double*>(_quadPts);
+ quadWts = const_cast<double*>(_quadWts);
+ basis = const_cast<double*>(_basis);
+ basisDeriv = const_cast<double*>(_basisDeriv);
+ verticesRef = const_cast<double*>(_verticesRef);
+ id = _id;
+ label = const_cast<char*>(_label);
+ initialTractFilename = const_cast<char*>(_initialTractFilename);
+
+ fieldT = const_cast<double*>(_fieldT);
+ jacobian = const_cast<double*>(_jacobian);
+ orientation = const_cast<double*>(_orientation);
+ area = const_cast<double*>(_area);
+ initialTractions = const_cast<double*>(_initialTractions);
+
+ constraintVertices = const_cast<int*>(_constraintVertices);
+ numConstraintVert = _numConstraintVert;
+
+ // Stick
+ fieldIncrStick = const_cast<double*>(_fieldIncrStick);
+
+ // Slip
+ fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
+ fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
+ slipSlipE = const_cast<double*>(_slipSlipE);
+
+ // Open
+ fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
+ fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
+ slipOpenE = const_cast<double*>(_slipOpenE);
+} // constructor
+
+pylith::faults::CohesiveDynDataHex8::~CohesiveDynDataHex8(void)
+{}
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.hh (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataHex8.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_faults_cohesivedynldatahex8_hh)
+#define pylith_faults_cohesivedynldatahex8_hh
+
+#include "CohesiveDynData.hh"
+
+namespace pylith {
+ namespace faults {
+ class CohesiveDynDataHex8;
+ } // pylith
+} // faults
+
+class pylith::faults::CohesiveDynDataHex8 : public CohesiveDynData
+{
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public:
+
+ /// Constructor
+ CohesiveDynDataHex8(void);
+
+ /// Destructor
+ ~CohesiveDynDataHex8(void);
+
+// PRIVATE MEMBERS //////////////////////////////////////////////////////
+private:
+
+ static const char* _meshFilename; ///< Filename of input mesh
+
+ static const int _spaceDim; ///< Number of dimensions in vertex coordinates
+ static const int _cellDim; ///< Number of dimensions associated with cell
+
+ static const int _numBasis; ///< Number of vertices in cell
+ static const int _numQuadPts; ///< Number of quadrature points
+ static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
+ static const double _quadWts[]; ///< Weights of quadrature points
+ static const double _basis[]; ///< Basis fns at quadrature points
+ static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
+ static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
+
+ static const int _id; ///< Fault material identifier
+ static const char* _label; ///< Label for fault
+ static const char* _initialTractFilename; ///< Name of db for initial tractions.
+
+ static const double _fieldT[]; ///< Solution field at time t.
+ static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
+ static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
+ static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
+ static const double _jacobian[]; ///< Jacobian sparse matrix.
+
+ static const double _orientation[]; ///< Expected values for fault orientation.
+ static const double _area[]; ///< Expected values for fault area.
+ static const double _initialTractions[]; ///< Expected values for initial tractions.
+ static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
+ static const double _slipSlipE[]; ///< Expected values for slip for slip case.
+ static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
+ static const double _slipOpenE[]; ///< Expected values for slip for opening case.
+ static const int _constraintVertices[]; ///< Expected points for constraint vertices
+ static const int _numConstraintVert; ///< Number of constraint vertices
+
+};
+
+#endif // pylith_faults_cohesivedynldatahex8_hh
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,468 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+
+/* Original mesh
+ *
+ * Cells are 0-1, vertices are 2-7.
+ *
+ * 3 -------- 5 -------- 7
+ * | | |
+ * | | |
+ * | | |
+ * | | |
+ * | | |
+ * | | |
+ * | | |
+ * | | |
+ * 2 -------- 4 -------- 6
+ *
+ * After adding cohesive elements
+ *
+ * Cells are 0-1,10 vertices are 2-9.
+ *
+ * 3 -------- 5 -11-- 9 -------- 7
+ * | | | |
+ * | | | |
+ * | | | |
+ * | | | |
+ * | | | |
+ * | | | |
+ * | | | |
+ * | | | |
+ * 2 -------- 4 -10-- 8 -------- 6
+ */
+
+#include "CohesiveDynDataQuad4.hh"
+
+const char* pylith::faults::CohesiveDynDataQuad4::_meshFilename =
+ "data/quad4.mesh";
+
+const int pylith::faults::CohesiveDynDataQuad4::_spaceDim = 2;
+
+const int pylith::faults::CohesiveDynDataQuad4::_cellDim = 1;
+
+const int pylith::faults::CohesiveDynDataQuad4::_numBasis = 2;
+
+const int pylith::faults::CohesiveDynDataQuad4::_numQuadPts = 1;
+
+const double pylith::faults::CohesiveDynDataQuad4::_quadPts[] = {
+ 0.0,
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_quadWts[] = {
+ 2.0,
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_basis[] = {
+ 0.5,
+ 0.5
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_basisDeriv[] = {
+ -0.5,
+ 0.5
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_verticesRef[] = {
+ -1.0, 1.0
+};
+
+const int pylith::faults::CohesiveDynDataQuad4::_id = 10;
+
+const char* pylith::faults::CohesiveDynDataQuad4::_label = "fault";
+
+const char* pylith::faults::CohesiveDynDataQuad4::_initialTractFilename =
+ "data/quad4_initialtract.spatialdb";
+
+const double pylith::faults::CohesiveDynDataQuad4::_fieldT[] = {
+ 8.1, 9.1,
+ 8.2, 9.2,
+ 8.3, 9.3, // 4
+ 8.4, 9.4, // 5
+ 8.5, 9.5,
+ 8.6, 9.6,
+ 8.7, 9.7, // 8
+ 8.9, 9.9, // 9
+ 8.8, 9.8, // 10
+ 8.0, 9.0, // 11
+};
+
+// :TODO: Make sensible values for Jacobian for DOF on positive and
+// negative sides of the fault. Add semi-random values for other DOF.
+const double pylith::faults::CohesiveDynDataQuad4::_jacobian[] = {
+ 1, 0.1,
+ 0.2, 0.3,
+ 0.4, 0.5,
+ 0.6, 0.7,
+ 0.8, 0.9,
+ 1, 1.1,
+ 1.2, 1.3,
+ 1.4, 1.5,
+ 1.6, 1.7,
+ 1.8, 1.9,
+ 2, 1,
+ 2.1, 2.2,
+ 2.3, 2.4,
+ 2.5, 2.6,
+ 2.7, 2.8,
+ 2.9, 3,
+ 3.1, 3.2,
+ 3.3, 3.4,
+ 3.5, 3.6,
+ 3.7, 3.8,
+ 3.9, 4,
+ 1, 4.1,
+ 4.2, 4.3,
+ 4.4, 4.5,
+ 4.6, 4.7,
+ 4.8, 4.9,
+ 5, 5.1,
+ 5.2, 5.3,
+ 5.4, 5.5,
+ 5.6, 5.7,
+ 5.8, 5.9,
+ 6, 1,
+ 6.1, 6.2,
+ 6.3, 6.4,
+ 6.5, 6.6,
+ 6.7, 6.8,
+ 6.9, 7,
+ 7.1, 7.2,
+ 7.3, 7.4,
+ 7.5, 7.6,
+ 7.7, 7.8,
+ 7.9, 8,
+ 1, 8.1,
+ 8.2, 8.3,
+ 8.4, 8.5,
+ 8.6, 8.7,
+ 8.8, 8.9,
+ 9, 9.1,
+ 9.2, -1,
+ 9.3, 9.4,
+ 9.5, 9.6,
+ 9.7, 9.8,
+ 9.9, 1,
+ 10,10.1,
+10.2,10.3,
+10.4,10.5,
+10.6,10.7,
+10.8,10.9,
+ -1, 11,
+11.1,11.2,
+11.3,11.4,
+11.5,11.6,
+11.7,11.8,
+ 1,11.9,
+ 12,12.1,
+12.2,12.3,
+12.4,12.5,
+12.6,12.7,
+12.8,12.9,
+ 13, -1,
+13.1,13.2,
+13.3,13.4,
+13.5,13.6,
+13.7, 1,
+13.8,13.9,
+ 14,14.1,
+14.2,14.3,
+14.4,14.5,
+14.6,14.7,
+ -1,14.8,
+14.9, 15,
+15.1,15.2,
+15.3,15.4,
+15.5,15.6,
+ 1,15.7,
+15.8,15.9,
+ 16,16.1,
+16.2,16.3,
+16.4,16.5,
+16.6,16.7,
+16.8,16.9,
+ 17,17.1,
+17.2,17.3,
+17.4,17.5,
+17.6, 1,
+17.7,17.8,
+17.9, 18,
+18.1,18.2,
+18.3,18.4,
+18.5,18.6,
+18.7,18.8,
+18.9, 19,
+19.1,19.2,
+19.3,19.4,
+19.5,19.6,
+ 1,19.7,
+19.8,19.9,
+ 20,20.1,
+20.2,20.3,
+20.4,20.5,
+20.6,20.7,
+20.8,20.9,
+ 21,21.1,
+21.2,21.3,
+21.4,21.5,
+21.6, 1,
+21.7,21.8,
+21.9, 22,
+22.1,22.2,
+22.3,22.4,
+22.5,22.6,
+22.7,22.8,
+22.9, 23,
+23.1,23.2,
+23.3,23.4,
+23.5,23.6,
+ 1,23.7,
+23.8,23.9,
+ 24, 1,
+24.1,24.2,
+24.3,24.4,
+24.5,24.6,
+24.7,24.8,
+24.9, 25,
+25.1,25.2,
+25.3,25.4,
+25.5, 1,
+25.6,25.7,
+ 1,25.8,
+25.9, 26,
+26.1,26.2,
+26.3,26.4,
+26.5,26.6,
+26.7,26.8,
+26.9, 27,
+27.1,27.2,
+27.3,27.4,
+ 1,27.5,
+27.6,27.7,
+27.8, 1,
+27.9, 28,
+28.1,28.2,
+28.3,28.4,
+28.5,28.6,
+28.7,28.8,
+28.9, 29,
+29.1,29.2,
+29.3, 1,
+29.4,29.5,
+ 1,29.6,
+29.7,29.8,
+29.9, 30,
+30.1, -1,
+30.2,30.3,
+30.4,30.5,
+30.6,30.7,
+30.8, 1,
+30.9, 31,
+31.1,31.2,
+31.3,31.4,
+31.5,31.6,
+31.7,31.8,
+ -1,31.9,
+ 32,32.1,
+32.2,32.3,
+32.4,32.5,
+ 1,32.6,
+32.7,32.8,
+32.9, 33,
+33.1,33.2,
+33.3,33.4,
+33.5,33.6,
+33.7,33.8,
+33.9, -1,
+ 34,34.1,
+34.2,34.3,
+34.4,34.5,
+34.6, 1,
+34.7,34.8,
+34.9, 35,
+35.1,35.2,
+35.3,35.4,
+35.5,35.6,
+ -1,35.7,
+35.8,35.9,
+ 36,36.1,
+36.2,36.3,
+ 1,36.4,
+36.5,36.6,
+36.7,36.8,
+};
+
+// ----------------------------------------------------------------------
+// Computed values
+// ----------------------------------------------------------------------
+
+const double pylith::faults::CohesiveDynDataQuad4::_orientation[] = {
+ 0.0, -1.0, -1.0, 0.0,
+ 0.0, -1.0, -1.0, 0.0
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_area[] = {
+ 1.0,
+ 1.0,
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_initialTractions[] = {
+ 1.0, -2.0,
+ 1.1, -2.1,
+};
+
+
+const int pylith::faults::CohesiveDynDataQuad4::_numConstraintVert = 2;
+const int pylith::faults::CohesiveDynDataQuad4::_constraintVertices[] = {
+ 10, 11
+};
+
+// ----------------------------------------------------------------------
+// Stick case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrStick[] = {
+ 1.1, 29.1,
+ 1.2, 29.2,
+ 1.3, 29.3, // 4
+ 1.4, 29.4, // 5
+ 1.5, 29.5,
+ 1.6, 29.6,
+ 1.7, 29.7, // 8
+ 1.9, 29.9, // 9
+ 1.8, -29.8, // 10
+ 1.0, -29.0, // 11
+};
+
+// No change in fieldIncr
+// Zero slip
+
+// ----------------------------------------------------------------------
+// Slip case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrSlip[] = {
+ 9.1, 10.1,
+ 9.2, 10.2,
+ 9.3, 10.3, // 4
+ 9.4, 10.4, // 5
+ 9.5, 10.5,
+ 9.6, 10.6,
+ 9.7, 10.7, // 8
+ 9.9, 10.9, // 9
+ 9.8, -10.8, // 10
+ 9.0, -10.0, // 11
+};
+
+// Output
+// :TODO: Update Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrSlipE[] = {
+ 9.1, 10.1,
+ 9.2, 10.2,
+ 9.3, 10.3, // 4
+ 9.4, 10.4, // 5
+ 9.5, 10.5,
+ 9.6, 10.6,
+ 9.7, 10.7, // 8
+ 9.9, 10.9, // 9
+ -7.0, -10.8, // 10
+ -6.14, -10.0, // 11
+};
+
+// :TODO: Update slip values based on changes in Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataQuad4::_slipSlipE[] = {
+ 33.6, 0.0,
+ 30.28, 0.0,
+};
+
+// ----------------------------------------------------------------------
+// Open case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrOpen[] = {
+ 9.1, 10.1,
+ 9.2, 10.2,
+ 9.3, 10.3, // 4
+ 9.4, 10.4, // 5
+ 9.5, 10.5,
+ 9.6, 10.6,
+ 9.7, 10.7, // 8
+ 9.9, 10.9, // 9
+ 9.8, 10.8, // 10
+ 9.0, 10.0, // 11
+};
+
+// Output
+const double pylith::faults::CohesiveDynDataQuad4::_fieldIncrOpenE[] = {
+ 9.1, 10.1,
+ 9.2, 10.2,
+ 9.3, 10.3, // 4
+ 9.4, 10.4, // 5
+ 9.5, 10.5,
+ 9.6, 10.6,
+ 9.7, 10.7, // 8
+ 9.9, 10.9, // 9
+ -8.8, -9.8, // 10
+ -8.0, -9.0, // 11
+};
+
+const double pylith::faults::CohesiveDynDataQuad4::_slipOpenE[] = {
+ 37.2, 41.2,
+ 34.0, 38.0,
+};
+
+// ----------------------------------------------------------------------
+pylith::faults::CohesiveDynDataQuad4::CohesiveDynDataQuad4(void)
+{ // constructor
+ meshFilename = const_cast<char*>(_meshFilename);
+ spaceDim = _spaceDim;
+ cellDim = _cellDim;
+ numBasis = _numBasis;
+ numQuadPts = _numQuadPts;
+ quadPts = const_cast<double*>(_quadPts);
+ quadWts = const_cast<double*>(_quadWts);
+ basis = const_cast<double*>(_basis);
+ basisDeriv = const_cast<double*>(_basisDeriv);
+ verticesRef = const_cast<double*>(_verticesRef);
+ id = _id;
+ label = const_cast<char*>(_label);
+ initialTractFilename = const_cast<char*>(_initialTractFilename);
+
+ fieldT = const_cast<double*>(_fieldT);
+ jacobian = const_cast<double*>(_jacobian);
+ orientation = const_cast<double*>(_orientation);
+ area = const_cast<double*>(_area);
+ initialTractions = const_cast<double*>(_initialTractions);
+
+ constraintVertices = const_cast<int*>(_constraintVertices);
+ numConstraintVert = _numConstraintVert;
+
+ // Stick
+ fieldIncrStick = const_cast<double*>(_fieldIncrStick);
+
+ // Slip
+ fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
+ fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
+ slipSlipE = const_cast<double*>(_slipSlipE);
+
+ // Open
+ fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
+ fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
+ slipOpenE = const_cast<double*>(_slipOpenE);
+} // constructor
+
+pylith::faults::CohesiveDynDataQuad4::~CohesiveDynDataQuad4(void)
+{}
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataQuad4.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_faults_cohesivedynldataquad4_hh)
+#define pylith_faults_cohesivedynldataquad4_hh
+
+#include "CohesiveDynData.hh"
+
+namespace pylith {
+ namespace faults {
+ class CohesiveDynDataQuad4;
+ } // pylith
+} // faults
+
+class pylith::faults::CohesiveDynDataQuad4 : public CohesiveDynData
+{
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public:
+
+ /// Constructor
+ CohesiveDynDataQuad4(void);
+
+ /// Destructor
+ ~CohesiveDynDataQuad4(void);
+
+// PRIVATE MEMBERS //////////////////////////////////////////////////////
+private:
+
+ static const char* _meshFilename; ///< Filename of input mesh
+
+ static const int _spaceDim; ///< Number of dimensions in vertex coordinates
+ static const int _cellDim; ///< Number of dimensions associated with cell
+
+ static const int _numBasis; ///< Number of vertices in cell
+ static const int _numQuadPts; ///< Number of quadrature points
+ static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
+ static const double _quadWts[]; ///< Weights of quadrature points
+ static const double _basis[]; ///< Basis fns at quadrature points
+ static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
+ static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
+
+ static const int _id; ///< Fault material identifier
+ static const char* _label; ///< Label for fault
+ static const char* _initialTractFilename; ///< Name of db for initial tractions.
+
+ static const double _fieldT[]; ///< Solution field at time t.
+ static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
+ static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
+ static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
+ static const double _jacobian[]; ///< Jacobian sparse matrix.
+
+ static const double _orientation[]; ///< Expected values for fault orientation.
+ static const double _area[]; ///< Expected values for fault area.
+ static const double _initialTractions[]; ///< Expected values for initial tractions.
+ static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
+ static const double _slipSlipE[]; ///< Expected values for slip for slip case.
+ static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
+ static const double _slipOpenE[]; ///< Expected values for slip for opening case.
+ static const int _constraintVertices[]; ///< Expected points for constraint vertices
+ static const int _numConstraintVert; ///< Number of constraint vertices
+
+};
+
+#endif // pylith_faults_cohesivedynldataquad4_hh
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.cc (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,630 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+
+/* Original mesh
+ *
+ * Cells are 0-1, vertices are 2-6.
+ *
+ * 2 3,4,5 6
+ *
+ * ^^^^^ Face in x-y plane
+ *
+ * After adding cohesive elements
+ *
+ * Cells are 0-1,10, vertices are 2-9.
+ *
+ * 2 3,4,5 7,8,9 6
+ * 10,11,12
+ * ^^^^^^^^^^^^ Cohesive element in x-y plane.
+ */
+
+#include "CohesiveDynDataTet4.hh"
+
+const char* pylith::faults::CohesiveDynDataTet4::_meshFilename =
+ "data/tet4.mesh";
+
+const int pylith::faults::CohesiveDynDataTet4::_spaceDim = 3;
+
+const int pylith::faults::CohesiveDynDataTet4::_cellDim = 2;
+
+const int pylith::faults::CohesiveDynDataTet4::_numBasis = 3;
+
+const int pylith::faults::CohesiveDynDataTet4::_numQuadPts = 1;
+
+const double pylith::faults::CohesiveDynDataTet4::_quadPts[] = {
+ 3.33333333e-01, 3.33333333e-01,
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_quadWts[] = {
+ 5.00000000e-01,
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_basis[] = {
+ 3.33333333e-01, 3.33333333e-01,
+ 3.33333333e-01,};
+
+const double pylith::faults::CohesiveDynDataTet4::_basisDeriv[] = {
+ -1.00000000e+00, -1.00000000e+00,
+ 1.00000000e+00, 0.00000000e+00,
+ 0.00000000e+00, 1.00000000e+00,
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_verticesRef[] = {
+ -1.00000000e+00, -1.00000000e+00,
+ 1.00000000e+00, -1.00000000e+00,
+ -1.00000000e+00, 1.00000000e+00,
+};
+
+const int pylith::faults::CohesiveDynDataTet4::_id = 10;
+
+const char* pylith::faults::CohesiveDynDataTet4::_label = "fault";
+
+const char* pylith::faults::CohesiveDynDataTet4::_initialTractFilename =
+ "data/tet4_initialtract.spatialdb";
+
+const double pylith::faults::CohesiveDynDataTet4::_fieldT[] = {
+ 7.1, 8.1, 9.1,
+ 7.2, 8.2, 9.2, // 3
+ 7.3, 8.3, 9.3, // 4
+ 7.4, 8.4, 9.4, // 5
+ 7.5, 8.5, 9.5,
+ 7.6, 8.6, 9.6, // 7
+ 7.8, 8.8, 9.8, // 8
+ 7.0, 8.0, 9.0, // 9
+ 7.7, 8.7, 9.7, // 10
+ 7.9, 8.9, 9.9, // 11
+ 7.1, 8.1, 9.1, // 12
+};
+
+// :TODO: Make sensible values for Jacobian for DOF on positive and
+// negative sides of the fault. Add semi-random values for other DOF.
+const double pylith::faults::CohesiveDynDataTet4::_jacobian[] = {
+ 1, 0.1, 0.2,
+ 0.3, 0.4, 0.5,
+ 0.6, 0.7, 0.8,
+ 0.9, 1, 1.1,
+ 1.2, 1.3, 1.4,
+ 1.5, 1.6, 1.7,
+ 1.8, 1.9, 2,
+ 2.1, 2.2, 2.3,
+ 2.4, 2.5, 2.6,
+ 2.7, 2.8, 2.9,
+ 3, 3.1, 3.2,
+ 3.3, 1, 3.4,
+ 3.5, 3.6, 3.7,
+ 3.8, 3.9, 4,
+ 4.1, 4.2, 4.3,
+ 4.4, 4.5, 4.6,
+ 4.7, 4.8, 4.9,
+ 5, 5.1, 5.2,
+ 5.3, 5.4, 5.5,
+ 5.6, 5.7, 5.8,
+ 5.9, 6, 6.1,
+ 6.2, 6.3, 6.4,
+ 6.5, 6.6, 1,
+ 6.7, 6.8, 6.9,
+ 7, 7.1, 7.2,
+ 7.3, 7.4, 7.5,
+ 7.6, 7.7, 7.8,
+ 7.9, 8, 8.1,
+ 8.2, 8.3, 8.4,
+ 8.5, 8.6, 8.7,
+ 8.8, 8.9, 9,
+ 9.1, 9.2, 9.3,
+ 9.4, 9.5, 9.6,
+ 9.7, 9.8, 9.9,
+ 1, 10, 10.1,
+ 10.2, 10.3, 10.4,
+ 10.5, 10.6, 10.7,
+ 10.8, 10.9, 11,
+ 11.1, 11.2, 11.3,
+ 11.4, 11.5, 11.6,
+ 11.7, 11.8, 11.9,
+ 12, 12.1, -1,
+ 12.2, 12.3, 12.4,
+ 12.5, 12.6, 12.7,
+ 12.8, 12.9, 13,
+ 13.1, 1, 13.2,
+ 13.3, 13.4, 13.5,
+ 13.6, 13.7, 13.8,
+ 13.9, 14, 14.1,
+ 14.2, 14.3, 14.4,
+ 14.5, 14.6, 14.7,
+ 14.8, 14.9, 15,
+ -1, 15.1, 15.2,
+ 15.3, 15.4, 15.5,
+ 15.6, 15.7, 15.8,
+ 15.9, 16, 16.1,
+ 16.2, 16.3, 1,
+ 16.4, 16.5, 16.6,
+ 16.7, 16.8, 16.9,
+ 17, 17.1, 17.2,
+ 17.3, 17.4, 17.5,
+ 17.6, 17.7, 17.8,
+ 17.9, 18, 18.1,
+ 18.2, -1, 18.3,
+ 18.4, 18.5, 18.6,
+ 18.7, 18.8, 18.9,
+ 19, 19.1, 19.2,
+ 19.3, 19.4, 19.5,
+ 1, 19.6, 19.7,
+ 19.8, 19.9, 20,
+ 20.1, 20.2, 20.3,
+ 20.4, 20.5, 20.6,
+ 20.7, 20.8, 20.9,
+ 21, 21.1, 21.2,
+ 21.3, 21.4, 21.5,
+ 21.6, 21.7, -1,
+ 21.8, 21.9, 22,
+ 22.1, 22.2, 22.3,
+ 22.4, 22.5, 22.6,
+ 22.7, 1, 22.8,
+ 22.9, 23, 23.1,
+ 23.2, 23.3, 23.4,
+ 23.5, 23.6, 23.7,
+ 23.8, 23.9, 24,
+ 24.1, 24.2, 24.3,
+ 24.4, 24.5, 24.6,
+ -1, 24.7, 24.8,
+ 24.9, 25, 25.1,
+ 25.2, 25.3, 25.4,
+ 25.5, 25.6, 25.7,
+ 25.8, 25.9, 1,
+ 26, 26.1, 26.2,
+ 26.3, 26.4, 26.5,
+ 26.6, 26.7, 26.8,
+ 26.9, 27, 27.1,
+ 27.2, 27.3, 27.4,
+ 27.5, 27.6, 27.7,
+ 27.8, -1, 27.9,
+ 28, 28.1, 28.2,
+ 28.3, 28.4, 28.5,
+ 28.6, 28.7, 28.8,
+ 28.9, 29, 29.1,
+ 1, 29.2, 29.3,
+ 29.4, 29.5, 29.6,
+ 29.7, 29.8, 29.9,
+ 30, 30.1, 30.2,
+ 30.3, 30.4, 30.5,
+ 30.6, 30.7, 30.8,
+ 30.9, 31, 31.1,
+ 31.2, 31.3, -1,
+ 31.4, 31.5, 31.6,
+ 31.7, 31.8, 31.9,
+ 32, 32.1, 32.2,
+ 32.3, 1, 32.4,
+ 32.5, 32.6, 32.7,
+ 32.8, 32.9, 33,
+ 33.1, 33.2, 33.3,
+ 33.4, 33.5, 33.6,
+ 33.7, 33.8, 33.9,
+ 34, 34.1, 34.2,
+ -1, 34.3, 34.4,
+ 34.5, 34.6, 34.7,
+ 34.8, 34.9, 35,
+ 35.1, 35.2, 35.3,
+ 35.4, 35.5, 1,
+ 35.6, 35.7, 35.8,
+ 35.9, 36, 36.1,
+ 36.2, 36.3, 36.4,
+ 36.5, 36.6, 36.7,
+ 36.8, 36.9, 37,
+ 37.1, 37.2, 37.3,
+ 37.4, -1, 37.5,
+ 37.6, 37.7, 37.8,
+ 37.9, 38, 38.1,
+ 38.2, 38.3, 38.4,
+ 38.5, 38.6, 38.7,
+ 1, 38.8, 38.9,
+ 39, 39.1, 39.2,
+ 39.3, 39.4, 39.5,
+ 39.6, 39.7, 39.8,
+ 39.9, 40, 40.1,
+ 40.2, 40.3, 40.4,
+ 40.5, 40.6, 40.7,
+ 40.8, 40.9, 41,
+ 41.1, 41.2, 41.3,
+ 41.4, 41.5, 41.6,
+ 41.7, 41.8, 41.9,
+ 42, 1, 42.1,
+ 42.2, 42.3, 42.4,
+ 42.5, 42.6, 42.7,
+ 42.8, 42.9, 43,
+ 43.1, 43.2, 43.3,
+ 43.4, 43.5, 43.6,
+ 43.7, 43.8, 43.9,
+ 44, 44.1, 44.2,
+ 44.3, 44.4, 44.5,
+ 44.6, 44.7, 44.8,
+ 44.9, 45, 45.1,
+ 45.2, 45.3, 1,
+ 45.4, 45.5, 45.6,
+ 45.7, 45.8, 45.9,
+ 46, 46.1, 46.2,
+ 46.3, 46.4, 46.5,
+ 46.6, 46.7, 46.8,
+ 46.9, 47, 47.1,
+ 47.2, 47.3, 47.4,
+ 47.5, 47.6, 47.7,
+ 47.8, 47.9, 48,
+ 48.1, 48.2, 48.3,
+ 48.4, 48.5, 48.6,
+ 1, 48.7, 48.8,
+ 48.9, 49, 49.1,
+ 49.2, 49.3, 49.4,
+ 49.5, 49.6, 1,
+ 49.7, 49.8, 49.9,
+ 50, 50.1, 50.2,
+ 50.3, 50.4, 50.5,
+ 50.6, 50.7, 50.8,
+ 50.9, 51, 51.1,
+ 51.2, 51.3, 51.4,
+ 51.5, 51.6, 51.7,
+ 51.8, 1, 51.9,
+ 52, 52.1, 52.2,
+ 52.3, 52.4, 52.5,
+ 1, 52.6, 52.7,
+ 52.8, 52.9, 53,
+ 53.1, 53.2, 53.3,
+ 53.4, 53.5, 53.6,
+ 53.7, 53.8, 53.9,
+ 54, 54.1, 54.2,
+ 54.3, 54.4, 54.5,
+ 54.6, 54.7, 54.8,
+ 54.9, 55, 1,
+ 55.1, 55.2, 55.3,
+ 55.4, 55.5, 55.6,
+ 55.7, 1, 55.8,
+ 55.9, 56, 56.1,
+ 56.2, 56.3, 56.4,
+ 56.5, 56.6, 56.7,
+ 56.8, 56.9, 57,
+ 57.1, 57.2, 57.3,
+ 57.4, 57.5, 57.6,
+ 57.7, 57.8, 57.9,
+ 58, 58.1, 58.2,
+ 1, 58.3, 58.4,
+ 58.5, 58.6, 58.7,
+ 58.8, 58.9, 59,
+ 59.1, 59.2, 1,
+ 59.3, 59.4, 59.5,
+ 59.6, 59.7, 59.8,
+ 59.9, 60, 60.1,
+ 60.2, 60.3, 60.4,
+ 60.5, 60.6, 60.7,
+ 60.8, 60.9, 61,
+ 61.1, 61.2, 61.3,
+ 61.4, 1, 61.5,
+ 61.6, 61.7, 61.8,
+ 61.9, 62, 62.1,
+ 1, 62.2, 62.3,
+ 62.4, 62.5, 62.6,
+ 62.7, 62.8, 62.9,
+ 63, 63.1, 63.2,
+ 63.3, 63.4, 63.5,
+ 63.6, 63.7, 63.8,
+ 63.9, 64, 64.1,
+ 64.2, 64.3, 64.4,
+ 64.5, 64.6, 1,
+ 64.7, 64.8, 64.9,
+ 65, 65.1, 65.2,
+ 65.3, 1, 65.4,
+ 65.5, 65.6, 65.7,
+ 65.8, 65.9, 66,
+ 66.1, 66.2, 66.3,
+ 66.4, 66.5, 66.6,
+ 66.7, 66.8, 66.9,
+ 67, 67.1, 67.2,
+ 67.3, 67.4, 67.5,
+ 67.6, 67.7, 67.8,
+ 1, 67.9, 68,
+ 68.1, 68.2, 68.3,
+ 68.4, 68.5, 68.6,
+ 68.7, 68.8, 1,
+ 68.9, 69, 69.1,
+ 69.2, 69.3, 69.4,
+ 69.5, 69.6, 69.7,
+ 69.8, 69.9, 70,
+ 70.1, 70.2, 70.3,
+ 70.4, 70.5, 70.6,
+ 70.7, 70.8, 70.9,
+ 71, 1, 71.1,
+ 71.2, 71.3, 71.4,
+ 71.5, 71.6, 71.7,
+ 1, 71.8, 71.9,
+ 72, 72.1, 72.2,
+ 72.3, 72.4, 72.5,
+ 72.6, 72.7, 72.8,
+ 72.9, 73, 73.1,
+ 73.2, 73.3, 73.4,
+ 73.5, 73.6, 73.7,
+ 73.8, 73.9, 74,
+ 74.1, 74.2, 1,
+ 74.3, 74.4, 74.5,
+ 74.6, 74.7, 74.8,
+ 74.9, 1, 75,
+ 75.1, 75.2, 75.3,
+ 75.4, -1, 75.5,
+ 75.6, 75.7, 75.8,
+ 75.9, 76, 76.1,
+ 76.2, 76.3, 76.4,
+ 76.5, 1, 76.6,
+ 76.7, 76.8, 76.9,
+ 77, 77.1, 77.2,
+ 77.3, 77.4, 77.5,
+ 77.6, 77.7, 77.8,
+ 77.9, 78, 78.1,
+ 78.2, 78.3, 78.4,
+ 78.5, 78.6, -1,
+ 78.7, 78.8, 78.9,
+ 79, 79.1, 79.2,
+ 79.3, 79.4, 79.5,
+ 79.6, 79.7, 1,
+ 79.8, 79.9, 80,
+ 80.1, 80.2, 80.3,
+ 80.4, 80.5, 80.6,
+ 80.7, 80.8, 80.9,
+ 81, 81.1, 81.2,
+ 81.3, 81.4, 81.5,
+ -1, 81.6, 81.7,
+ 81.8, 81.9, 82,
+ 82.1, 82.2, 82.3,
+ 82.4, 82.5, 82.6,
+ 1, 82.7, 82.8,
+ 82.9, 83, 83.1,
+ 83.2, 83.3, 83.4,
+ 83.5, 83.6, 83.7,
+ 83.8, 83.9, 84,
+ 84.1, 84.2, 84.3,
+ 84.4, 84.5, 84.6,
+ 84.7, 84.8, 84.9,
+ 85, -1, 85.1,
+ 85.2, 85.3, 85.4,
+ 85.5, 85.6, 85.7,
+ 85.8, 85.9, 86,
+ 86.1, 1, 86.2,
+ 86.3, 86.4, 86.5,
+ 86.6, 86.7, 86.8,
+ 86.9, 87, 87.1,
+ 87.2, 87.3, 87.4,
+ 87.5, 87.6, 87.7,
+ 87.8, 87.9, 88,
+ 88.1, 88.2, -1,
+ 88.3, 88.4, 88.5,
+ 88.6, 88.7, 88.8,
+ 88.9, 89, 89.1,
+ 89.2, 89.3, 1,
+ 89.4, 89.5, 89.6,
+ 89.7, 89.8, 89.9,
+ 90, 90.1, 90.2,
+ 90.3, 90.4, 90.5,
+ 90.6, 90.7, 90.8,
+ 90.9, 91, 91.1,
+ -1, 91.2, 91.3,
+ 91.4, 91.5, 91.6,
+ 91.7, 91.8, 91.9,
+ 92, 92.1, 92.2,
+ 1, 92.3, 92.4,
+ 92.5, 92.6, 92.7,
+ 92.8, 92.9, 93,
+ 93.1, 93.2, 93.3,
+ 93.4, 93.5, 93.6,
+ 93.7, 93.8, 93.9,
+ 94, 94.1, 94.2,
+ 94.3, 94.4, 94.5,
+ 94.6, -1, 94.7,
+ 94.8, 94.9, 95,
+ 95.1, 95.2, 95.3,
+ 95.4, 95.5, 95.6,
+ 95.7, 1, 95.8,
+ 95.9, 96, 96.1,
+ 96.2, 96.3, 96.4,
+ 96.5, 96.6, 96.7,
+ 96.8, 96.9, 97,
+ 97.1, 97.2, 97.3,
+ 97.4, 97.5, 97.6,
+ 97.7, 97.8, -1,
+ 97.9, 98, 98.1,
+ 98.2, 98.3, 98.4,
+ 98.5, 98.6, 98.7,
+ 98.8, 98.9, 1,
+ 99, 99.1, 99.2,
+ 99.3, 99.4, 99.5,
+ 99.6, 99.7, 99.8,
+ 99.9, 100,100.1,
+100.2,100.3,100.4,
+100.5,100.6,100.7,
+ -1,100.8,100.9,
+ 101,101.1,101.2,
+101.3,101.4,101.5,
+101.6,101.7,101.8,
+ 1,101.9, 102,
+102.1,102.2,102.3,
+102.4,102.5,102.6,
+102.7,102.8,102.9,
+};
+
+// ----------------------------------------------------------------------
+// Computed values
+// ----------------------------------------------------------------------
+
+const double pylith::faults::CohesiveDynDataTet4::_orientation[] = {
+ 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
+ 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
+ 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_area[] = {
+ 1.0/3.0,
+ 1.0/3.0,
+ 1.0/3.0,
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_initialTractions[] = {
+ 1.0, 2.0, -3.0,
+ 1.1, 2.1, -3.1,
+ 1.2, 2.2, -3.2,
+};
+
+
+const int pylith::faults::CohesiveDynDataTet4::_numConstraintVert = 3;
+const int pylith::faults::CohesiveDynDataTet4::_constraintVertices[] = {
+ 10, 11, 12
+};
+
+// ----------------------------------------------------------------------
+// Stick case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTet4::_fieldIncrStick[] = {
+ 1.1, 2.1, 35.1,
+ 1.2, 2.2, 35.2, // 3
+ 1.3, 2.3, 35.3, // 4
+ 1.4, 2.4, 35.4, // 5
+ 1.5, 2.5, 35.5,
+ 1.6, 2.6, 35.6, // 7
+ 1.8, 2.8, 35.8, // 8
+ 1.0, 2.0, 35.0, // 9
+ 1.7, 2.7, -35.7, // 10
+ 1.9, 2.9, -35.9, // 11
+ 1.1, 2.1, -35.1, // 12
+};
+
+// No change in fieldIncr
+// Zero slip
+
+// ----------------------------------------------------------------------
+// Slip case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTet4::_fieldIncrSlip[] = {
+ 8.1, 9.1, 10.1,
+ 8.2, 9.2, 10.2, // 3
+ 8.3, 9.3, 10.3, // 4
+ 8.4, 9.4, 10.4, // 5
+ 8.5, 9.5, 10.5,
+ 8.6, 9.6, 10.6, // 7
+ 8.8, 9.8, 10.8, // 8
+ 8.0, 9.0, 10.0, // 9
+ 8.7, 9.7, -10.7, // 10
+ 8.9, 9.9, -10.9, // 11
+ 8.1, 9.1, -10.1, // 12
+};
+
+// Output
+// :TODO: Update Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataTet4::_fieldIncrSlipE[] = {
+ 8.1, 9.1, 10.1,
+ 8.2, 9.2, 10.2, // 3
+ 8.3, 9.3, 10.3, // 4
+ 8.4, 9.4, 10.4, // 5
+ 8.5, 9.5, 10.5,
+ 8.6, 9.6, 10.6, // 7
+ 8.8, 9.8, 10.8, // 8
+ 8.0, 9.0, 10.0, // 9
+ -6.90156, -7.80418, -10.7, // 10
+ -7.08708, -7.9903, -10.9, // 11
+ -6.27887, -7.17083, -10.1, // 12
+};
+
+// :TODO: Update slip values based on changes in Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataTet4::_slipSlipE[] = {
+ 31.203110740589327, 35.008368147978267, 0.0,
+ 31.974152400186210, 35.780599114494088, 0.0,
+ 28.757749464750159, 32.541663868006758, 0.0,
+};
+
+// ----------------------------------------------------------------------
+// Open case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTet4::_fieldIncrOpen[] = {
+ 8.1, 9.1, 10.1,
+ 8.2, 9.2, 10.2, // 3
+ 8.3, 9.3, 10.3, // 4
+ 8.4, 9.4, 10.4, // 5
+ 8.5, 9.5, 10.5,
+ 8.6, 9.6, 10.6, // 7
+ 8.8, 9.8, 10.8, // 8
+ 8.0, 9.0, 10.0, // 9
+ 8.7, 9.7, 10.7, // 10
+ 8.9, 9.9, 10.9, // 11
+ 8.1, 9.1, 10.1, // 12
+};
+
+// Output
+const double pylith::faults::CohesiveDynDataTet4::_fieldIncrOpenE[] = {
+ 8.1, 9.1, 10.1,
+ 8.2, 9.2, 10.2, // 3
+ 8.3, 9.3, 10.3, // 4
+ 8.4, 9.4, 10.4, // 5
+ 8.5, 9.5, 10.5,
+ 8.6, 9.6, 10.6, // 7
+ 8.8, 9.8, 10.8, // 8
+ 8.0, 9.0, 10.0, // 9
+ -7.7, -8.7, -9.7, // 10
+ -7.9, -8.9, -9.9, // 11
+ -7.1, -8.1, -9.1, // 12
+};
+
+const double pylith::faults::CohesiveDynDataTet4::_slipOpenE[] = {
+ 32.8, 36.8, 40.8,
+ 33.6, 37.6, 41.6,
+ 30.4, 34.4, 38.4,
+};
+
+// ----------------------------------------------------------------------
+pylith::faults::CohesiveDynDataTet4::CohesiveDynDataTet4(void)
+{ // constructor
+ meshFilename = const_cast<char*>(_meshFilename);
+ spaceDim = _spaceDim;
+ cellDim = _cellDim;
+ numBasis = _numBasis;
+ numQuadPts = _numQuadPts;
+ quadPts = const_cast<double*>(_quadPts);
+ quadWts = const_cast<double*>(_quadWts);
+ basis = const_cast<double*>(_basis);
+ basisDeriv = const_cast<double*>(_basisDeriv);
+ verticesRef = const_cast<double*>(_verticesRef);
+ id = _id;
+ label = const_cast<char*>(_label);
+ initialTractFilename = const_cast<char*>(_initialTractFilename);
+
+ fieldT = const_cast<double*>(_fieldT);
+ jacobian = const_cast<double*>(_jacobian);
+ orientation = const_cast<double*>(_orientation);
+ area = const_cast<double*>(_area);
+ initialTractions = const_cast<double*>(_initialTractions);
+
+ constraintVertices = const_cast<int*>(_constraintVertices);
+ numConstraintVert = _numConstraintVert;
+
+ // Stick
+ fieldIncrStick = const_cast<double*>(_fieldIncrStick);
+
+ // Slip
+ fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
+ fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
+ slipSlipE = const_cast<double*>(_slipSlipE);
+
+ // Open
+ fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
+ fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
+ slipOpenE = const_cast<double*>(_slipOpenE);
+} // constructor
+
+pylith::faults::CohesiveDynDataTet4::~CohesiveDynDataTet4(void)
+{}
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.hh (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTet4.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_faults_cohesivedynldatatet4_hh)
+#define pylith_faults_cohesivedynldatatet4_hh
+
+#include "CohesiveDynData.hh"
+
+namespace pylith {
+ namespace faults {
+ class CohesiveDynDataTet4;
+ } // pylith
+} // faults
+
+class pylith::faults::CohesiveDynDataTet4 : public CohesiveDynData
+{
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public:
+
+ /// Constructor
+ CohesiveDynDataTet4(void);
+
+ /// Destructor
+ ~CohesiveDynDataTet4(void);
+
+// PRIVATE MEMBERS //////////////////////////////////////////////////////
+private:
+
+ static const char* _meshFilename; ///< Filename of input mesh
+
+ static const int _spaceDim; ///< Number of dimensions in vertex coordinates
+ static const int _cellDim; ///< Number of dimensions associated with cell
+
+ static const int _numBasis; ///< Number of vertices in cell
+ static const int _numQuadPts; ///< Number of quadrature points
+ static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
+ static const double _quadWts[]; ///< Weights of quadrature points
+ static const double _basis[]; ///< Basis fns at quadrature points
+ static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
+ static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
+
+ static const int _id; ///< Fault material identifier
+ static const char* _label; ///< Label for fault
+ static const char* _initialTractFilename; ///< Name of db for initial tractions.
+
+ static const double _fieldT[]; ///< Solution field at time t.
+ static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
+ static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
+ static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
+ static const double _jacobian[]; ///< Jacobian sparse matrix.
+
+ static const double _orientation[]; ///< Expected values for fault orientation.
+ static const double _area[]; ///< Expected values for fault area.
+ static const double _initialTractions[]; ///< Expected values for initial tractions.
+ static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
+ static const double _slipSlipE[]; ///< Expected values for slip for slip case.
+ static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
+ static const double _slipOpenE[]; ///< Expected values for slip for opening case.
+ static const int _constraintVertices[]; ///< Expected points for constraint vertices
+ static const int _numConstraintVert; ///< Number of constraint vertices
+
+};
+
+#endif // pylith_faults_cohesivedynldatatet4_hh
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.cc (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.cc)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.cc (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,388 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+/* Original mesh using Sieve labels.
+ *
+ * Cells are 0-1, vertices are 2-5.
+ *
+ * 3
+ * /|\
+ * / | \
+ * / | \
+ * / | \
+ * 2 | 5
+ * \ | /
+ * \ | /
+ * \ | /
+ * \|/
+ * 4
+ *
+ *
+ * After adding cohesive elements using Sieve labels.
+ *
+ * Cells are 0-1, 8, vertices are 2-7.
+ *
+ * 6 -8- 3
+ * /| |\
+ * / | | \
+ * / | | \
+ * / | | \
+ * 2 | | 5
+ * \ | | /
+ * \ | | /
+ * \ | | /
+ * \| |/
+ * 7 -9- 4
+ */
+
+#include "CohesiveDynDataTri3.hh"
+
+const char* pylith::faults::CohesiveDynDataTri3::_meshFilename =
+ "data/tri3.mesh";
+
+const int pylith::faults::CohesiveDynDataTri3::_spaceDim = 2;
+
+const int pylith::faults::CohesiveDynDataTri3::_cellDim = 1;
+
+const int pylith::faults::CohesiveDynDataTri3::_numBasis = 2;
+
+const int pylith::faults::CohesiveDynDataTri3::_numQuadPts = 1;
+
+const double pylith::faults::CohesiveDynDataTri3::_quadPts[] = {
+ 0.0,
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_quadWts[] = {
+ 2.0,
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_basis[] = {
+ 0.5,
+ 0.5
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_basisDeriv[] = {
+ -0.5,
+ 0.5
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_verticesRef[] = {
+ -1.0, 1.0
+};
+
+const int pylith::faults::CohesiveDynDataTri3::_id = 10;
+
+const char* pylith::faults::CohesiveDynDataTri3::_label = "fault";
+
+const char* pylith::faults::CohesiveDynDataTri3::_initialTractFilename =
+ "data/tri3_initialtract.spatialdb";
+
+const double pylith::faults::CohesiveDynDataTri3::_fieldT[] = {
+ 8.1, 9.1,
+ 8.2, 9.2, // 3
+ 8.3, 9.3, // 4
+ 8.4, 9.4,
+ 8.5, 9.5, // 6
+ 8.7, 9.7, // 7
+ 8.6, 9.6, // 8
+ 8.8, 9.8, // 9
+};
+
+// :TODO: Make sensible values for Jacobian for DOF on positive and
+// negative sides of the fault. Add semi-random values for other DOF.
+const double pylith::faults::CohesiveDynDataTri3::_jacobian[] = {
+ 1.0, 1.1, // 2x (values for row associated with vertex with label 2, x DOF)
+ 0.1, 1.2,
+ 0.2, 1.3,
+ 0.3, 1.4,
+ 0.4, 1.5,
+ 0.5, 1.6,
+ 0.6, 1.7,
+ 0.7, 1.8,
+ 2.1, 1.0, // 2y
+ 2.2, 3.1,
+ 2.3, 3.2,
+ 2.4, 3.3,
+ 2.5, 3.4,
+ 2.6, 3.5,
+ 2.7, 3.6,
+ 2.8, 3.7,
+ 4.1, 5.1, // 3x (values for row associated with vertex label 3, x DOF)
+ 1.0, 5.2,
+ 4.2, 5.3,
+ 4.3, 5.4,
+ 4.4, 5.5,
+ 4.5, 5.6,
+ 4.6,+1.0, // 8 (column for DOF associated with vertex label 8)
+ 4.7, 5.7,
+ 6.1, 7.1, // 3y
+ 6.2, 1.0,
+ 6.3, 7.2,
+ 6.4, 7.3,
+ 6.5, 7.4,
+ 6.6, 7.5,
+ +1.0, 7.6, // 8
+ 6.7, 7.7,
+ 8.1, 9.1, // 4x
+ 8.2, 9.2,
+ 1.0, 9.3,
+ 8.3, 9.4,
+ 8.4, 9.5,
+ 8.5, 9.6,
+ 8.6, 9.7,
+ 8.7,+1.0, // 9
+ 10.1, 11.1, // 4y
+ 10.2, 11.2,
+ 10.3, 1.0,
+ 10.4, 11.3,
+ 10.5, 11.4,
+ 10.6, 11.5,
+ 10.7, 11.6,
+ +1.0, 11.7, // 9
+ 12.1, 13.1, // 5x
+ 12.2, 13.2,
+ 12.3, 13.3,
+ 1.0, 13.4,
+ 12.4, 13.5,
+ 12.5, 13.6,
+ 12.6, 13.7,
+ 12.7, 13.8,
+ 14.1, 15.1, // 5y
+ 14.2, 15.2,
+ 14.3, 15.3,
+ 14.4, 1.0,
+ 14.5, 15.4,
+ 14.6, 15.5,
+ 14.7, 15.6,
+ 14.8, 15.7,
+ 16.1, 17.1, // 6x
+ 16.2, 17.2,
+ 16.3, 17.3,
+ 16.4, 17.4,
+ 1.0, 17.5,
+ 16.5, 17.6,
+ 16.6,-1.0, // 8
+ 16.7, 17.7,
+ 18.1, 19.1, // 6y
+ 18.2, 19.2,
+ 18.3, 19.3,
+ 18.4, 19.4,
+ 18.5, 1.0,
+ 18.6, 19.5,
+ -1.0, 19.6, // 8
+ 18.7, 19.7,
+ 20.1, 21.1, // 7x
+ 20.2, 21.2,
+ 20.3, 21.3,
+ 20.4, 21.4,
+ 20.5, 21.5,
+ 1.0, 21.6,
+ 20.6, 21.7,
+ 20.7,-1.0, // 9
+ 22.1, 23.1, // 7y
+ 22.2, 23.2,
+ 22.3, 23.3,
+ 22.4, 23.4,
+ 22.5, 23.5,
+ 22.6, 1.0,
+ 22.7, 23.6,
+ -1.0, 23.7, // 9
+
+ 24.1, 25.1, // 8x (rows associated with Lagrange multiplier vertex label 8)
+ 24.2,+1.0, // 3
+ 24.3, 25.2,
+ 24.4, 25.3,
+ 24.5,-1.0, // 6
+ 24.6, 25.4,
+ 24.7, 25.5,
+ 24.8, 25.6,
+ 26.1, 27.1, // 8y
+ +1.0, 27.2, // 3
+ 26.2, 27.3,
+ 26.3, 27.4,
+ -1.0, 27.5, // 6
+ 26.4, 27.6,
+ 26.5, 27.7,
+ 26.6, 27.8,
+
+ 29.1, 30.1, // 9x
+ 29.2, 30.2,
+ 29.3,+1.0, // 4
+ 29.4, 30.3,
+ 29.5, 30.4,
+ 29.6,-1.0, // 7
+ 29.7, 30.5,
+ 29.8, 30.6,
+ 31.1, 32.1, // 9y
+ 31.2, 32.2,
+ +1.0, 32.3, // 4
+ 31.3, 32.4,
+ 31.4, 32.5,
+ -1.0, 32.6, // 7
+ 31.5, 32.7,
+ 31.6, 32.8,
+};
+
+// ----------------------------------------------------------------------
+// Computed values
+// ----------------------------------------------------------------------
+
+const double pylith::faults::CohesiveDynDataTri3::_orientation[] = {
+ 0.0, -1.0, -1.0, 0.0,
+ 0.0, -1.0, -1.0, 0.0
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_area[] = {
+ 1.0,
+ 1.0,
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_initialTractions[] = {
+ 1.0, -2.0,
+ 1.1, -2.1,
+};
+
+
+const int pylith::faults::CohesiveDynDataTri3::_numConstraintVert = 2;
+const int pylith::faults::CohesiveDynDataTri3::_constraintVertices[] = {
+ 8, 9
+};
+
+// ----------------------------------------------------------------------
+// Stick case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTri3::_fieldIncrStick[] = {
+ 1.1, 29.1,
+ 1.2, 29.2, // 3
+ 1.3, 29.3, // 4
+ 1.4, 29.4,
+ 1.5, 29.5, // 6
+ 1.7, 29.7, // 7
+ 1.6, -29.6, // 8
+ 1.8, -29.8, // 9
+};
+
+// No change in fieldIncr
+// Zero slip
+
+// ----------------------------------------------------------------------
+// Slip case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTri3::_fieldIncrSlip[] = {
+ 9.1, 10.1,
+ 9.2, 10.2, // 3
+ 9.3, 10.3, // 4
+ 9.4, 10.4,
+ 9.5, 10.5, // 6
+ 9.7, 10.7, // 7
+ 9.6, -10.6, // 8
+ 9.8, -10.8, // 9
+};
+
+// Output
+// :TODO: Update Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataTri3::_fieldIncrSlipE[] = {
+ 9.1, 10.1,
+ 9.2, 10.2, // 3
+ 9.3, 10.3, // 4
+ 9.4, 10.4,
+ 9.5, 10.5, // 6
+ 9.7, 10.7, // 7
+ -6.8, -10.6, // 8
+ -6.94, -10.8, // 9
+};
+
+// :TODO: Update slip values based on changes in Lagrange multiplier values
+const double pylith::faults::CohesiveDynDataTri3::_slipSlipE[] = {
+ 32.8, 0.0,
+ 33.48, 0.0,
+};
+
+// ----------------------------------------------------------------------
+// Open case
+// ----------------------------------------------------------------------
+// Input
+const double pylith::faults::CohesiveDynDataTri3::_fieldIncrOpen[] = {
+ 9.1, 10.1,
+ 9.2, 10.2, // 3
+ 9.3, 10.3, // 4
+ 9.4, 10.4,
+ 9.5, 10.5, // 6
+ 9.7, 10.7, // 7
+ 9.6, 10.6, // 8
+ 9.8, 10.8, // 9
+};
+
+// Output
+const double pylith::faults::CohesiveDynDataTri3::_fieldIncrOpenE[] = {
+ 9.1, 10.1,
+ 9.2, 10.2, // 3
+ 9.3, 10.3, // 4
+ 9.4, 10.4,
+ 9.5, 10.5, // 6
+ 9.7, 10.7, // 7
+ -8.6, -9.6, // 8
+ -8.8, -9.8, // 9
+};
+
+const double pylith::faults::CohesiveDynDataTri3::_slipOpenE[] = {
+ 36.4, 40.4,
+ 37.2, 41.2,
+};
+
+// ----------------------------------------------------------------------
+pylith::faults::CohesiveDynDataTri3::CohesiveDynDataTri3(void)
+{ // constructor
+ meshFilename = const_cast<char*>(_meshFilename);
+ spaceDim = _spaceDim;
+ cellDim = _cellDim;
+ numBasis = _numBasis;
+ numQuadPts = _numQuadPts;
+ quadPts = const_cast<double*>(_quadPts);
+ quadWts = const_cast<double*>(_quadWts);
+ basis = const_cast<double*>(_basis);
+ basisDeriv = const_cast<double*>(_basisDeriv);
+ verticesRef = const_cast<double*>(_verticesRef);
+ id = _id;
+ label = const_cast<char*>(_label);
+ initialTractFilename = const_cast<char*>(_initialTractFilename);
+
+ fieldT = const_cast<double*>(_fieldT);
+ jacobian = const_cast<double*>(_jacobian);
+ orientation = const_cast<double*>(_orientation);
+ area = const_cast<double*>(_area);
+ initialTractions = const_cast<double*>(_initialTractions);
+
+ constraintVertices = const_cast<int*>(_constraintVertices);
+ numConstraintVert = _numConstraintVert;
+
+ // Stick
+ fieldIncrStick = const_cast<double*>(_fieldIncrStick);
+
+ // Slip
+ fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
+ fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
+ slipSlipE = const_cast<double*>(_slipSlipE);
+
+ // Open
+ fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
+ fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
+ slipOpenE = const_cast<double*>(_slipOpenE);
+} // constructor
+
+pylith::faults::CohesiveDynDataTri3::~CohesiveDynDataTri3(void)
+{}
+
+
+// End of file
Copied: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.hh (from rev 16277, short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.hh)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.hh (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynDataTri3.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,77 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#if !defined(pylith_faults_cohesivedynldatatri3_hh)
+#define pylith_faults_cohesivedynldatatri3_hh
+
+#include "CohesiveDynData.hh"
+
+namespace pylith {
+ namespace faults {
+ class CohesiveDynDataTri3;
+ } // pylith
+} // faults
+
+class pylith::faults::CohesiveDynDataTri3 : public CohesiveDynData
+{
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public:
+
+ /// Constructor
+ CohesiveDynDataTri3(void);
+
+ /// Destructor
+ ~CohesiveDynDataTri3(void);
+
+// PRIVATE MEMBERS //////////////////////////////////////////////////////
+private:
+
+ static const char* _meshFilename; ///< Filename of input mesh
+
+ static const int _spaceDim; ///< Number of dimensions in vertex coordinates
+ static const int _cellDim; ///< Number of dimensions associated with cell
+
+ static const int _numBasis; ///< Number of vertices in cell
+ static const int _numQuadPts; ///< Number of quadrature points
+ static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
+ static const double _quadWts[]; ///< Weights of quadrature points
+ static const double _basis[]; ///< Basis fns at quadrature points
+ static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
+ static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
+
+ static const int _id; ///< Fault material identifier
+ static const char* _label; ///< Label for fault
+ static const char* _initialTractFilename; ///< Name of db for initial tractions.
+
+ static const double _fieldT[]; ///< Solution field at time t.
+ static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
+ static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
+ static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
+ static const double _jacobian[]; ///< Jacobian sparse matrix.
+
+ static const double _orientation[]; ///< Expected values for fault orientation.
+ static const double _area[]; ///< Expected values for fault area.
+ static const double _initialTractions[]; ///< Expected values for initial tractions.
+ static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
+ static const double _slipSlipE[]; ///< Expected values for slip for slip case.
+ static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
+ static const double _slipOpenE[]; ///< Expected values for slip for opening case.
+ static const int _constraintVertices[]; ///< Expected points for constraint vertices
+ static const int _numConstraintVert; ///< Number of constraint vertices
+
+};
+
+#endif // pylith_faults_cohesivedynldatatri3_hh
+
+
+// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,55 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#include "CohesiveDynLData.hh"
-
-// ----------------------------------------------------------------------
-// Constructor
-pylith::faults::CohesiveDynLData::CohesiveDynLData(void) :
- meshFilename(0),
- spaceDim(0),
- cellDim(0),
- numBasis(0),
- numQuadPts(0),
- quadPts(0),
- quadWts(0),
- basis(0),
- basisDeriv(0),
- verticesRef(0),
- id(0),
- label(0),
- initialTractFilename(0),
- fieldT(0),
- fieldIncrStick(0),
- fieldIncrSlip(0),
- fieldIncrOpen(0),
- jacobian(0),
- orientation(0),
- initialTractions(0),
- area(0),
- fieldIncrSlipE(0),
- slipSlipE(0),
- fieldIncrOpenE(0),
- slipOpenE(0),
- constraintVertices(0),
- numConstraintVert(0)
-{ // constructor
-} // constructor
-
-// ----------------------------------------------------------------------
-// Destructor
-pylith::faults::CohesiveDynLData::~CohesiveDynLData(void)
-{ // destructor
-} // destructor
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLData.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,86 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#if !defined(pylith_faults_cohesivedynldata_hh)
-#define pylith_faults_cohesivedynldata_hh
-
-namespace pylith {
- namespace faults {
- class CohesiveDynLData;
- } // pylith
-} // faults
-
-class pylith::faults::CohesiveDynLData
-{
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public :
-
- /// Constructor
- CohesiveDynLData(void);
-
- /// Destructor
- ~CohesiveDynLData(void);
-
-// PUBLIC MEMBERS ///////////////////////////////////////////////////////
-public:
-
- char* meshFilename; ///< Filename for input mesh
-
- /// @name Quadrature information
- //@{
- int spaceDim; ///< Number of dimensions in vertex coordinates
- int cellDim; ///< Number of dimensions associated with cell
- int numBasis; ///< Number of vertices in cell
- int numQuadPts; ///< Number of quadrature points
- double* quadPts; ///< Coordinates of quad pts in ref cell
- double* quadWts; ///< Weights of quadrature points
- double* basis; ///< Basis fns at quadrature points
- double* basisDeriv; ///< Derivatives of basis fns at quad pts
- double* verticesRef; ///< Coordinates of vertices in ref cell (dual basis)
- //@}
-
- /// @name Fault information
- //@{
- int id; ///< Fault material identifier
- char* label; ///< Label for fault
- char* initialTractFilename; ///< Name of db for initial tractions.
- //@}
-
- /// @name Input fields
- //@{
- double* fieldT; ///< Solution field at time t.
- double* fieldIncrStick; ///< Soln increment field at time t for stick case.
- double* fieldIncrSlip; ///< Soln increment field at time t for slipping case.
- double* fieldIncrOpen; ///< Soln increment field at time t for opening case.
- double* jacobian; ///< Jacobian sparse matrix.
- //@}
-
- /// @name Calculated values.
- //@{
- double* orientation; ///< Expected values for fault orientation.
- double* area; ///< Expected values for fault area.
- double* initialTractions; ///< Expected values for initial tractions.
- double* fieldIncrSlipE; ///< Expected values for solution increment for slipping case.
- double* slipSlipE; ///< Expected values for slip for slipping case.
- double* fieldIncrOpenE; ///< Expected values for solution increment for opening case.
- double* slipOpenE; ///< Expected values for slip for opening case.
-
- int* constraintVertices; ///< Expected points for constraint vertices
- int numConstraintVert; ///< Number of constraint vertices
- //@}
-
-};
-
-#endif // pylith_faults_cohesivedynldata_hh
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,1546 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-
-/* Original mesh
- *
- * Cells are 0-1 and vertices are 2-13.
- *
- * 2,3,4,5 -------- 6,7,8,9 -------- 10,11,12,13
- *
- * ^^^^^^^ Vertices forming fault
- *
- * After adding cohesive elements
- *
- * Cells are 0-1,16 and vertices are 4-15.
- *
- * 2,3,4,5 -------- 6,7,8,9 -- 14,15,16,17 -------- 10,11,12,13
- * 18,19,20,21
- * ^^^^^^^^^^^^^^^^^^^^^^ Cohesive element
- *
- */
-
-#include "CohesiveDynLDataHex8.hh"
-
-const char* pylith::faults::CohesiveDynLDataHex8::_meshFilename =
- "data/hex8.mesh";
-
-const int pylith::faults::CohesiveDynLDataHex8::_spaceDim = 3;
-
-const int pylith::faults::CohesiveDynLDataHex8::_cellDim = 2;
-
-const int pylith::faults::CohesiveDynLDataHex8::_numBasis = 4;
-
-const int pylith::faults::CohesiveDynLDataHex8::_numQuadPts = 4;
-
-const double pylith::faults::CohesiveDynLDataHex8::_quadPts[] = {
- -0.57735027, -0.57735027,
- +0.57735027, -0.57735027,
- +0.57735027, +0.57735027,
- -0.57735027, +0.57735027,
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_quadWts[] = {
- 1.0, 1.0, 1.0, 1.0
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_basis[] = {
- 0.62200847, 0.16666667, 0.16666667, 0.0446582,
- 0.16666667, 0.62200847, 0.0446582, 0.16666667,
- 0.16666667, 0.0446582, 0.62200847, 0.16666667,
- 0.0446582, 0.16666667, 0.16666667, 0.62200847,
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_basisDeriv[] = {
- -0.39433757, -0.39433757,
- +0.39433757, -0.10566243,
- +0.10566243, +0.10566243,
- -0.10566243, +0.39433757,
-
- -0.39433757, -0.10566243,
- +0.39433757, -0.39433757,
- +0.10566243, +0.39433757,
- -0.10566243, +0.10566243,
-
- -0.10566243, -0.10566243,
- +0.10566243, -0.39433757,
- +0.39433757, +0.39433757,
- -0.39433757, +0.10566243,
-
- -0.10566243, -0.39433757,
- +0.10566243, -0.10566243,
- +0.39433757, +0.10566243,
- -0.39433757, +0.39433757,
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_verticesRef[] = {
- -1.0, -1.0,
- +1.0, -1.0,
- +1.0, +1.0,
- -1.0, +1.0
-};
-
-const int pylith::faults::CohesiveDynLDataHex8::_id = 10;
-
-const char* pylith::faults::CohesiveDynLDataHex8::_label = "fault";
-
-const char* pylith::faults::CohesiveDynLDataHex8::_initialTractFilename =
- "data/hex8_initialtract.spatialdb";
-
-const double pylith::faults::CohesiveDynLDataHex8::_fieldT[] = {
- 4.1, 6.1, 8.1,
- 4.2, 6.2, 8.2,
- 4.3, 6.3, 8.3,
- 4.4, 6.4, 8.4,
- 4.5, 6.5, 8.5, // 6
- 4.6, 6.6, 8.6, // 7
- 4.7, 6.7, 8.7, // 8
- 4.8, 6.8, 8.8, // 9
- 4.9, 6.9, 8.9,
- 4.0, 6.0, 8.0,
- 5.1, 7.1, 9.1,
- 5.2, 7.2, 9.2,
- 5.3, 7.3, 9.3, // 14
- 5.5, 7.5, 9.5, // 15
- 5.7, 7.7, 9.7, // 16
- 5.9, 7.9, 9.9, // 17
- 5.4, 7.4, 9.4, // 18
- 5.6, 7.6, 9.6, // 19
- 5.8, 7.8, 9.8, // 20
- 5.0, 7.0, 9.0, // 21
-};
-
-// :TODO: Make sensible values for Jacobian for DOF on positive and
-// negative sides of the fault. Add semi-random values for other DOF.
-const double pylith::faults::CohesiveDynLDataHex8::_jacobian[] = {
- 1, 0.1, 0.2,
- 0.3, 0.4, 0.5,
- 0.6, 0.7, 0.8,
- 0.9, 1, 1.1,
- 1.2, 1.3, 1.4,
- 1.5, 1.6, 1.7,
- 1.8, 1.9, 2,
- 2.1, 2.2, 2.3,
- 2.4, 2.5, 2.6,
- 2.7, 2.8, 2.9,
- 3, 3.1, 3.2,
- 3.3, 3.4, 3.5,
- 3.6, 3.7, 3.8,
- 3.9, 4, 4.1,
- 4.2, 4.3, 4.4,
- 4.5, 4.6, 4.7,
- 4.8, 4.9, 5,
- 5.1, 5.2, 5.3,
- 5.4, 5.5, 5.6,
- 5.7, 5.8, 5.9,
- 6, 1, 6.1,
- 6.2, 6.3, 6.4,
- 6.5, 6.6, 6.7,
- 6.8, 6.9, 7,
- 7.1, 7.2, 7.3,
- 7.4, 7.5, 7.6,
- 7.7, 7.8, 7.9,
- 8, 8.1, 8.2,
- 8.3, 8.4, 8.5,
- 8.6, 8.7, 8.8,
- 8.9, 9, 9.1,
- 9.2, 9.3, 9.4,
- 9.5, 9.6, 9.7,
- 9.8, 9.9, 10,
- 10.1, 10.2, 10.3,
- 10.4, 10.5, 10.6,
- 10.7, 10.8, 10.9,
- 11, 11.1, 11.2,
- 11.3, 11.4, 11.5,
- 11.6, 11.7, 11.8,
- 11.9, 12, 1,
- 12.1, 12.2, 12.3,
- 12.4, 12.5, 12.6,
- 12.7, 12.8, 12.9,
- 13, 13.1, 13.2,
- 13.3, 13.4, 13.5,
- 13.6, 13.7, 13.8,
- 13.9, 14, 14.1,
- 14.2, 14.3, 14.4,
- 14.5, 14.6, 14.7,
- 14.8, 14.9, 15,
- 15.1, 15.2, 15.3,
- 15.4, 15.5, 15.6,
- 15.7, 15.8, 15.9,
- 16, 16.1, 16.2,
- 16.3, 16.4, 16.5,
- 16.6, 16.7, 16.8,
- 16.9, 17, 17.1,
- 17.2, 17.3, 17.4,
- 17.5, 17.6, 17.7,
- 17.8, 17.9, 18,
- 1, 18.1, 18.2,
- 18.3, 18.4, 18.5,
- 18.6, 18.7, 18.8,
- 18.9, 19, 19.1,
- 19.2, 19.3, 19.4,
- 19.5, 19.6, 19.7,
- 19.8, 19.9, 20,
- 20.1, 20.2, 20.3,
- 20.4, 20.5, 20.6,
- 20.7, 20.8, 20.9,
- 21, 21.1, 21.2,
- 21.3, 21.4, 21.5,
- 21.6, 21.7, 21.8,
- 21.9, 22, 22.1,
- 22.2, 22.3, 22.4,
- 22.5, 22.6, 22.7,
- 22.8, 22.9, 23,
- 23.1, 23.2, 23.3,
- 23.4, 23.5, 23.6,
- 23.7, 23.8, 23.9,
- 24, 1, 24.1,
- 24.2, 24.3, 24.4,
- 24.5, 24.6, 24.7,
- 24.8, 24.9, 25,
- 25.1, 25.2, 25.3,
- 25.4, 25.5, 25.6,
- 25.7, 25.8, 25.9,
- 26, 26.1, 26.2,
- 26.3, 26.4, 26.5,
- 26.6, 26.7, 26.8,
- 26.9, 27, 27.1,
- 27.2, 27.3, 27.4,
- 27.5, 27.6, 27.7,
- 27.8, 27.9, 28,
- 28.1, 28.2, 28.3,
- 28.4, 28.5, 28.6,
- 28.7, 28.8, 28.9,
- 29, 29.1, 29.2,
- 29.3, 29.4, 29.5,
- 29.6, 29.7, 29.8,
- 29.9, 30, 1,
- 30.1, 30.2, 30.3,
- 30.4, 30.5, 30.6,
- 30.7, 30.8, 30.9,
- 31, 31.1, 31.2,
- 31.3, 31.4, 31.5,
- 31.6, 31.7, 31.8,
- 31.9, 32, 32.1,
- 32.2, 32.3, 32.4,
- 32.5, 32.6, 32.7,
- 32.8, 32.9, 33,
- 33.1, 33.2, 33.3,
- 33.4, 33.5, 33.6,
- 33.7, 33.8, 33.9,
- 34, 34.1, 34.2,
- 34.3, 34.4, 34.5,
- 34.6, 34.7, 34.8,
- 34.9, 35, 35.1,
- 35.2, 35.3, 35.4,
- 35.5, 35.6, 35.7,
- 35.8, 35.9, 36,
- 1, 36.1, 36.2,
- 36.3, 36.4, 36.5,
- 36.6, 36.7, 36.8,
- 36.9, 37, 37.1,
- 37.2, 37.3, 37.4,
- 37.5, 37.6, 37.7,
- 37.8, 37.9, 38,
- 38.1, 38.2, 38.3,
- 38.4, 38.5, 38.6,
- 38.7, 38.8, 38.9,
- 39, 39.1, 39.2,
- 39.3, 39.4, 39.5,
- 39.6, 39.7, 39.8,
- 39.9, 40, 40.1,
- 40.2, 40.3, 40.4,
- 40.5, 40.6, 40.7,
- 40.8, 40.9, 41,
- 41.1, 41.2, 41.3,
- 41.4, 41.5, 41.6,
- 41.7, 41.8, 41.9,
- 42, 1, 42.1,
- 42.2, 42.3, 42.4,
- 42.5, 42.6, 42.7,
- 42.8, 42.9, 43,
- 43.1, 43.2, 43.3,
- 43.4, 43.5, 43.6,
- 43.7, 43.8, 43.9,
- 44, 44.1, 44.2,
- 44.3, 44.4, 44.5,
- 44.6, 44.7, 44.8,
- 44.9, 45, 45.1,
- 45.2, 45.3, 45.4,
- 45.5, 45.6, 45.7,
- 45.8, 45.9, 46,
- 46.1, 46.2, 46.3,
- 46.4, 46.5, 46.6,
- 46.7, 46.8, 46.9,
- 47, 47.1, 47.2,
- 47.3, 47.4, 47.5,
- 47.6, 47.7, 47.8,
- 47.9, 48, 1,
- 48.1, 48.2, 48.3,
- 48.4, 48.5, 48.6,
- 48.7, 48.8, 48.9,
- 49, 49.1, 49.2,
- 49.3, 49.4, 49.5,
- 49.6, 49.7, 49.8,
- 49.9, 50, 50.1,
- 50.2, 50.3, 50.4,
- 50.5, 50.6, 50.7,
- 50.8, 50.9, 51,
- 51.1, 51.2, 51.3,
- 51.4, 51.5, 51.6,
- 51.7, 51.8, 51.9,
- 52, 52.1, 52.2,
- 52.3, 52.4, 52.5,
- 52.6, 52.7, 52.8,
- 52.9, 53, 53.1,
- 53.2, 53.3, 53.4,
- 53.5, 53.6, 53.7,
- 53.8, 53.9, 54,
- 1, 54.1, 54.2,
- 54.3, 54.4, 54.5,
- 54.6, 54.7, 54.8,
- 54.9, 55, 55.1,
- 55.2, 55.3, 55.4,
- 55.5, 55.6, 55.7,
- 55.8, 55.9, 56,
- 56.1, 56.2, 56.3,
- 56.4, 56.5, 56.6,
- 56.7, 56.8, 56.9,
- 57, 57.1, 57.2,
- 57.3, 57.4, 57.5,
- 57.6, 57.7, 57.8,
- 57.9, 58, 58.1,
- 58.2, 58.3, 58.4,
- 58.5, 58.6, 58.7,
- 58.8, 58.9, 59,
- 59.1, 59.2, 59.3,
- 59.4, 59.5, 59.6,
- 59.7, 59.8, 59.9,
- 60, 1, 60.1,
- 60.2, 60.3, 60.4,
- 60.5, 60.6, 60.7,
- 60.8, 60.9, 61,
- 61.1, 61.2, 61.3,
- 61.4, 61.5, 61.6,
- 61.7, 61.8, 61.9,
- 62, 62.1, 62.2,
- 62.3, 62.4, 62.5,
- 62.6, 62.7, 62.8,
- 62.9, 63, 63.1,
- 63.2, 63.3, 63.4,
- 63.5, 63.6, 63.7,
- 63.8, 63.9, 64,
- 64.1, 64.2, 64.3,
- 64.4, 64.5, 64.6,
- 64.7, 64.8, 64.9,
- 65, 65.1, 65.2,
- 65.3, 65.4, 65.5,
- 65.6, 65.7, 65.8,
- 65.9, 66, 1,
- 66.1, 66.2, 66.3,
- 66.4, 66.5, 66.6,
- 66.7, 66.8, 66.9,
- 67, 67.1, 67.2,
- 67.3, 67.4, 67.5,
- 67.6, 67.7, 67.8,
- 67.9, 68, 68.1,
- 68.2, 68.3, 68.4,
- 68.5, 68.6, 68.7,
- 68.8, 68.9, 69,
- 69.1, 69.2, 69.3,
- 69.4, 69.5, 69.6,
- 69.7, 69.8, 69.9,
- 70, 70.1, 70.2,
- 70.3, 70.4, 70.5,
- 70.6, 70.7, 70.8,
- 70.9, 71, 71.1,
- 71.2, 71.3, 71.4,
- 71.5, 71.6, 71.7,
- 71.8, 71.9, 72,
- 1, 72.1, 72.2,
- 72.3, 72.4, 72.5,
- 72.6, 72.7, 72.8,
- 72.9, 73, 73.1,
- 73.2, 73.3, 73.4,
- 73.5, 73.6, 73.7,
- 73.8, 73.9, 74,
- 74.1, 74.2, 74.3,
- 74.4, 74.5, 74.6,
- 74.7, 74.8, 74.9,
- 75, 75.1, 75.2,
- 75.3, 75.4, 75.5,
- 75.6, 75.7, 1,
- 75.8, 75.9, 76,
- 76.1, 76.2, 76.3,
- 76.4, 76.5, 76.6,
- 76.7, 76.8, 76.9,
- 77, 77.1, 77.2,
- 77.3, 77.4, 77.5,
- 77.6, 77.7, 77.8,
- 77.9, 1, 78,
- 78.1, 78.2, 78.3,
- 78.4, 78.5, 78.6,
- 78.7, 78.8, 78.9,
- 79, 79.1, 79.2,
- 79.3, 79.4, 79.5,
- 79.6, 79.7, 79.8,
- 79.9, 80, 80.1,
- 80.2, 80.3, 80.4,
- 80.5, 80.6, 80.7,
- 80.8, 80.9, 81,
- 81.1, 81.2, 81.3,
- 1, 81.4, 81.5,
- 81.6, 81.7, 81.8,
- 81.9, 82, 82.1,
- 82.2, 82.3, 82.4,
- 82.5, 82.6, 82.7,
- 82.8, 82.9, 83,
- 83.1, 83.2, 83.3,
- 83.4, 83.5, 83.6,
- 83.7, 83.8, 1,
- 83.9, 84, 84.1,
- 84.2, 84.3, 84.4,
- 84.5, 84.6, 84.7,
- 84.8, 84.9, 85,
- 85.1, 85.2, 85.3,
- 85.4, 85.5, 85.6,
- 85.7, 85.8, 85.9,
- 86, 86.1, 86.2,
- 86.3, 86.4, 86.5,
- 86.6, 86.7, 86.8,
- 86.9, 87, 87.1,
- 87.2, 1, 87.3,
- 87.4, 87.5, 87.6,
- 87.7, 87.8, 87.9,
- 88, 88.1, 88.2,
- 88.3, 88.4, 88.5,
- 88.6, 88.7, 88.8,
- 88.9, 89, 89.1,
- 89.2, 89.3, 89.4,
- 89.5, 89.6, 89.7,
- 1, 89.8, 89.9,
- 90, 90.1, 90.2,
- 90.3, 90.4, 90.5,
- 90.6, 90.7, 90.8,
- 90.9, 91, 91.1,
- 91.2, 91.3, 91.4,
- 91.5, 91.6, 91.7,
- 91.8, 91.9, 92,
- 92.1, 92.2, 92.3,
- 92.4, 92.5, 92.6,
- 92.7, 92.8, 92.9,
- 93, 93.1, 93.2,
- 93.3, 93.4, 1,
- 93.5, 93.6, 93.7,
- 93.8, 93.9, 94,
- 94.1, 94.2, 94.3,
- 94.4, 94.5, 94.6,
- 94.7, 94.8, 94.9,
- 95, 95.1, 95.2,
- 95.3, 95.4, 95.5,
- 95.6, 1, 95.7,
- 95.8, 95.9, 96,
- 96.1, 96.2, 96.3,
- 96.4, 96.5, 96.6,
- 96.7, 96.8, 96.9,
- 97, 97.1, 97.2,
- 97.3, 97.4, 97.5,
- 97.6, 97.7, 97.8,
- 97.9, 98, 98.1,
- 98.2, 98.3, 98.4,
- 98.5, 98.6, 98.7,
- 98.8, 98.9, 99,
- 1, 99.1, 99.2,
- 99.3, 99.4, 99.5,
- 99.6, 99.7, 99.8,
- 99.9, 100,100.1,
-100.2,100.3,100.4,
-100.5,100.6,100.7,
-100.8,100.9, 101,
-101.1,101.2,101.3,
-101.4,101.5, 1,
-101.6,101.7,101.8,
-101.9, 102,102.1,
-102.2,102.3,102.4,
-102.5,102.6,102.7,
-102.8,102.9, 103,
-103.1,103.2,103.3,
-103.4,103.5,103.6,
-103.7,103.8,103.9,
- 104,104.1,104.2,
-104.3,104.4,104.5,
-104.6,104.7,104.8,
-104.9, 1, 105,
-105.1,105.2,105.3,
-105.4,105.5,105.6,
-105.7,105.8,105.9,
- 106,106.1,106.2,
-106.3,106.4,106.5,
-106.6,106.7,106.8,
-106.9, 107,107.1,
-107.2,107.3,107.4,
- 1,107.5,107.6,
-107.7,107.8,107.9,
- 108,108.1,108.2,
-108.3,108.4,108.5,
-108.6,108.7,108.8,
-108.9, 109,109.1,
-109.2,109.3,109.4,
-109.5,109.6,109.7,
-109.8,109.9, 110,
-110.1,110.2,110.3,
-110.4,110.5,110.6,
-110.7,110.8,110.9,
- 111,111.1, 1,
-111.2,111.3,111.4,
-111.5,111.6,111.7,
-111.8,111.9, 112,
-112.1,112.2,112.3,
-112.4,112.5,112.6,
-112.7,112.8,112.9,
- 113,113.1,113.2,
-113.3, 1,113.4,
-113.5,113.6,113.7,
-113.8,113.9, 114,
-114.1,114.2,114.3,
-114.4,114.5,114.6,
-114.7,114.8,114.9,
- 115,115.1,115.2,
-115.3,115.4,115.5,
-115.6,115.7,115.8,
-115.9, 116,116.1,
-116.2,116.3,116.4,
-116.5,116.6,116.7,
- 1,116.8,116.9,
- 117,117.1,117.2,
-117.3,117.4,117.5,
-117.6,117.7,117.8,
-117.9, 118,118.1,
-118.2,118.3,118.4,
-118.5,118.6,118.7,
-118.8,118.9, 119,
-119.1,119.2, 1,
-119.3,119.4,119.5,
-119.6,119.7,119.8,
-119.9, 120,120.1,
-120.2,120.3,120.4,
-120.5,120.6,120.7,
-120.8,120.9, 121,
-121.1,121.2,121.3,
-121.4,121.5,121.6,
-121.7,121.8,121.9,
- 122,122.1,122.2,
-122.3,122.4,122.5,
-122.6, 1,122.7,
-122.8,122.9, 123,
-123.1,123.2,123.3,
-123.4,123.5,123.6,
-123.7,123.8,123.9,
- 124,124.1,124.2,
-124.3,124.4,124.5,
-124.6,124.7,124.8,
-124.9, 125,125.1,
- 1,125.2,125.3,
-125.4,125.5,125.6,
-125.7,125.8,125.9,
- 126,126.1,126.2,
-126.3,126.4,126.5,
-126.6,126.7,126.8,
-126.9, 127,127.1,
-127.2,127.3,127.4,
-127.5,127.6,127.7,
-127.8,127.9, 128,
-128.1,128.2,128.3,
-128.4,128.5,128.6,
-128.7,128.8, 1,
-128.9, 129,129.1,
-129.2,129.3,129.4,
-129.5,129.6,129.7,
-129.8,129.9, 130,
-130.1,130.2,130.3,
-130.4,130.5,130.6,
-130.7,130.8,130.9,
- 131, 1,131.1,
-131.2,131.3,131.4,
-131.5,131.6,131.7,
-131.8,131.9, 132,
-132.1,132.2,132.3,
-132.4,132.5,132.6,
-132.7,132.8,132.9,
- 133,133.1,133.2,
-133.3,133.4,133.5,
-133.6,133.7,133.8,
-133.9, 134,134.1,
-134.2,134.3,134.4,
- 1,134.5,134.6,
-134.7,134.8,134.9,
- 135,135.1,135.2,
-135.3,135.4,135.5,
-135.6,135.7,135.8,
-135.9, 136,136.1,
-136.2,136.3,136.4,
-136.5,136.6,136.7,
-136.8,136.9, 1,
- 137,137.1,137.2,
-137.3,137.4,137.5,
-137.6,137.7,137.8,
-137.9, 138,138.1,
-138.2,138.3,138.4,
-138.5,138.6,138.7,
-138.8,138.9, 139,
-139.1,139.2,139.3,
-139.4,139.5,139.6,
-139.7,139.8,139.9,
- 140,140.1,140.2,
-140.3, 1,140.4,
-140.5,140.6,140.7,
-140.8,140.9, 141,
-141.1,141.2,141.3,
-141.4,141.5,141.6,
-141.7,141.8,141.9,
- 142,142.1,142.2,
-142.3,142.4,142.5,
-142.6,142.7,142.8,
- 1,142.9, 143,
-143.1,143.2,143.3,
-143.4,143.5,143.6,
-143.7,143.8,143.9,
- 144,144.1,144.2,
-144.3,144.4,144.5,
-144.6,144.7,144.8,
-144.9, 145,145.1,
-145.2,145.3,145.4,
-145.5,145.6,145.7,
-145.8,145.9, 146,
-146.1,146.2,146.3,
-146.4,146.5,146.6,
-146.7,146.8,146.9,
- 147,147.1,147.2,
-147.3,147.4,147.5,
-147.6,147.7,147.8,
-147.9, 148,148.1,
-148.2,148.3,148.4,
-148.5,148.6,148.7,
-148.8, 1,148.9,
- 149,149.1,149.2,
-149.3,149.4,149.5,
-149.6,149.7,149.8,
-149.9, 150,150.1,
-150.2,150.3,150.4,
-150.5,150.6,150.7,
-150.8,150.9, 151,
-151.1,151.2,151.3,
-151.4,151.5,151.6,
-151.7,151.8,151.9,
- 152,152.1,152.2,
-152.3,152.4,152.5,
-152.6,152.7,152.8,
-152.9, 153,153.1,
-153.2,153.3,153.4,
-153.5,153.6,153.7,
-153.8,153.9, 154,
-154.1,154.2,154.3,
-154.4,154.5,154.6,
-154.7,154.8, 1,
-154.9, 155,155.1,
-155.2,155.3,155.4,
-155.5,155.6,155.7,
-155.8,155.9, 156,
-156.1,156.2,156.3,
-156.4,156.5,156.6,
-156.7,156.8,156.9,
- 157,157.1,157.2,
-157.3,157.4,157.5,
-157.6,157.7,157.8,
-157.9, 158,158.1,
-158.2,158.3,158.4,
-158.5,158.6,158.7,
-158.8,158.9, 159,
-159.1,159.2,159.3,
-159.4,159.5,159.6,
-159.7,159.8,159.9,
- 160,160.1,160.2,
-160.3,160.4,160.5,
-160.6,160.7,160.8,
- 1,160.9, 161,
-161.1,161.2,161.3,
-161.4,161.5,161.6,
-161.7,161.8,161.9,
- 162,162.1,162.2,
-162.3,162.4,162.5,
-162.6,162.7,162.8,
-162.9, 163,163.1,
-163.2,163.3,163.4,
-163.5,163.6,163.7,
-163.8,163.9, 164,
-164.1,164.2,164.3,
-164.4,164.5,164.6,
-164.7,164.8,164.9,
- 165,165.1,165.2,
-165.3,165.4,165.5,
-165.6,165.7,165.8,
-165.9, 166,166.1,
-166.2,166.3,166.4,
-166.5,166.6,166.7,
-166.8, 1,166.9,
- 167,167.1,167.2,
-167.3,167.4,167.5,
-167.6,167.7,167.8,
-167.9, 168,168.1,
-168.2,168.3,168.4,
-168.5,168.6,168.7,
-168.8,168.9, 169,
-169.1,169.2,169.3,
-169.4,169.5,169.6,
-169.7,169.8,169.9,
- 170,170.1,170.2,
-170.3,170.4,170.5,
-170.6,170.7,170.8,
-170.9, 171,171.1,
-171.2,171.3,171.4,
-171.5,171.6,171.7,
-171.8,171.9, 172,
-172.1,172.2,172.3,
-172.4,172.5,172.6,
-172.7,172.8, 1,
-172.9, 173,173.1,
-173.2,173.3,173.4,
-173.5,173.6,173.7,
-173.8,173.9, 174,
-174.1,174.2,174.3,
-174.4,174.5,174.6,
-174.7,174.8,174.9,
- 175,175.1,175.2,
-175.3,175.4,175.5,
-175.6,175.7,175.8,
-175.9, 176,176.1,
-176.2,176.3,176.4,
-176.5,176.6,176.7,
-176.8,176.9, 177,
-177.1,177.2,177.3,
-177.4,177.5,177.6,
-177.7,177.8,177.9,
- 178,178.1,178.2,
-178.3,178.4,178.5,
-178.6,178.7,178.8,
- 1,178.9, 179,
-179.1,179.2,179.3,
-179.4,179.5,179.6,
-179.7,179.8,179.9,
- 180,180.1,180.2,
-180.3,180.4,180.5,
-180.6,180.7,180.8,
-180.9, 181,181.1,
-181.2,181.3,181.4,
-181.5,181.6,181.7,
-181.8,181.9, 182,
-182.1,182.2,182.3,
-182.4,182.5,182.6,
-182.7,182.8,182.9,
- 183,183.1,183.2,
-183.3,183.4,183.5,
-183.6,183.7,183.8,
-183.9, 184,184.1,
-184.2,184.3,184.4,
-184.5,184.6,184.7,
-184.8, 1,184.9,
- 185,185.1,185.2,
-185.3,185.4,185.5,
-185.6,185.7,185.8,
-185.9, 186,186.1,
-186.2,186.3,186.4,
-186.5,186.6,186.7,
-186.8,186.9, 187,
-187.1,187.2,187.3,
-187.4,187.5,187.6,
-187.7,187.8,187.9,
- 188,188.1,188.2,
-188.3,188.4,188.5,
-188.6,188.7,188.8,
-188.9, 189,189.1,
-189.2,189.3,189.4,
-189.5,189.6,189.7,
-189.8,189.9, 190,
-190.1,190.2,190.3,
-190.4,190.5,190.6,
-190.7,190.8, 1,
-190.9, 191,191.1,
-191.2,191.3,191.4,
-191.5,191.6,191.7,
-191.8,191.9, 192,
-192.1,192.2,192.3,
-192.4,192.5,192.6,
-192.7,192.8,192.9,
- 193,193.1,193.2,
-193.3,193.4,193.5,
-193.6,193.7,193.8,
-193.9, 194,194.1,
-194.2,194.3,194.4,
-194.5,194.6,194.7,
-194.8,194.9, 195,
-195.1,195.2,195.3,
-195.4,195.5,195.6,
-195.7,195.8,195.9,
- 196,196.1,196.2,
-196.3,196.4,196.5,
-196.6,196.7,196.8,
- 1,196.9, 197,
-197.1,197.2,197.3,
-197.4,197.5,197.6,
-197.7,197.8,197.9,
- 198,198.1,198.2,
-198.3,198.4,198.5,
-198.6,198.7,198.8,
-198.9, 199,199.1,
-199.2,199.3,199.4,
-199.5,199.6,199.7,
-199.8,199.9, 200,
-200.1,200.2,200.3,
-200.4,200.5,200.6,
-200.7,200.8,200.9,
- 201,201.1,201.2,
-201.3,201.4,201.5,
-201.6,201.7,201.8,
-201.9, 202,202.1,
-202.2,202.3,202.4,
-202.5,202.6,202.7,
-202.8, 1,202.9,
- 203,203.1,203.2,
-203.3,203.4,203.5,
-203.6,203.7,203.8,
-203.9, 204,204.1,
-204.2,204.3,204.4,
-204.5,204.6,204.7,
-204.8,204.9, 205,
-205.1,205.2,205.3,
-205.4,205.5,205.6,
-205.7,205.8,205.9,
- 206,206.1,206.2,
-206.3,206.4,206.5,
-206.6,206.7,206.8,
-206.9, 207,207.1,
-207.2,207.3,207.4,
-207.5,207.6,207.7,
-207.8,207.9, 208,
-208.1,208.2,208.3,
-208.4,208.5,208.6,
-208.7,208.8, 1,
-208.9, 209,209.1,
-209.2,209.3,209.4,
-209.5,209.6,209.7,
-209.8,209.9, 210,
-210.1,210.2,210.3,
-210.4,210.5,210.6,
-210.7,210.8,210.9,
- 211,211.1,211.2,
-211.3,211.4,211.5,
-211.6,211.7,211.8,
-211.9, 212,212.1,
-212.2,212.3,212.4,
-212.5,212.6,212.7,
-212.8,212.9, 213,
-213.1,213.2,213.3,
-213.4,213.5,213.6,
-213.7,213.8,213.9,
- 214,214.1,214.2,
-214.3,214.4,214.5,
-214.6,214.7,214.8,
- 1,214.9, 215,
-215.1,215.2,215.3,
-215.4,215.5,215.6,
-215.7,215.8,215.9,
- 216,216.1, -1,
-216.2,216.3,216.4,
-216.5,216.6,216.7,
-216.8,216.9, 217,
-217.1,217.2,217.3,
-217.4,217.5,217.6,
-217.7,217.8,217.9,
- 218,218.1,218.2,
-218.3,218.4,218.5,
-218.6,218.7,218.8,
-218.9, 219,219.1,
-219.2,219.3,219.4,
-219.5,219.6,219.7,
-219.8,219.9, 220,
-220.1,220.2,220.3,
-220.4,220.5,220.6,
-220.7, 1,220.8,
-220.9, 221,221.1,
-221.2,221.3,221.4,
-221.5,221.6,221.7,
- -1,221.8,221.9,
- 222,222.1,222.2,
-222.3,222.4,222.5,
-222.6,222.7,222.8,
-222.9, 223,223.1,
-223.2,223.3,223.4,
-223.5,223.6,223.7,
-223.8,223.9, 224,
-224.1,224.2,224.3,
-224.4,224.5,224.6,
-224.7,224.8,224.9,
- 225,225.1,225.2,
-225.3,225.4,225.5,
-225.6,225.7,225.8,
-225.9, 226,226.1,
-226.2,226.3,226.4,
-226.5,226.6, 1,
-226.7,226.8,226.9,
- 227,227.1,227.2,
-227.3,227.4,227.5,
-227.6, -1,227.7,
-227.8,227.9, 228,
-228.1,228.2,228.3,
-228.4,228.5,228.6,
-228.7,228.8,228.9,
- 229,229.1,229.2,
-229.3,229.4,229.5,
-229.6,229.7,229.8,
-229.9, 230,230.1,
-230.2,230.3,230.4,
-230.5,230.6,230.7,
-230.8,230.9, 231,
-231.1,231.2,231.3,
-231.4,231.5,231.6,
-231.7,231.8,231.9,
- 232,232.1,232.2,
-232.3,232.4,232.5,
- 1,232.6,232.7,
-232.8,232.9, 233,
-233.1,233.2,233.3,
-233.4,233.5,233.6,
-233.7,233.8, -1,
-233.9, 234,234.1,
-234.2,234.3,234.4,
-234.5,234.6,234.7,
-234.8,234.9, 235,
-235.1,235.2,235.3,
-235.4,235.5,235.6,
-235.7,235.8,235.9,
- 236,236.1,236.2,
-236.3,236.4,236.5,
-236.6,236.7,236.8,
-236.9, 237,237.1,
-237.2,237.3,237.4,
-237.5,237.6,237.7,
-237.8,237.9, 238,
-238.1,238.2,238.3,
-238.4, 1,238.5,
-238.6,238.7,238.8,
-238.9, 239,239.1,
-239.2,239.3,239.4,
- -1,239.5,239.6,
-239.7,239.8,239.9,
- 240,240.1,240.2,
-240.3,240.4,240.5,
-240.6,240.7,240.8,
-240.9, 241,241.1,
-241.2,241.3,241.4,
-241.5,241.6,241.7,
-241.8,241.9, 242,
-242.1,242.2,242.3,
-242.4,242.5,242.6,
-242.7,242.8,242.9,
- 243,243.1,243.2,
-243.3,243.4,243.5,
-243.6,243.7,243.8,
-243.9, 244,244.1,
-244.2,244.3, 1,
-244.4,244.5,244.6,
-244.7,244.8,244.9,
- 245,245.1,245.2,
-245.3, -1,245.4,
-245.5,245.6,245.7,
-245.8,245.9, 246,
-246.1,246.2,246.3,
-246.4,246.5,246.6,
-246.7,246.8,246.9,
- 247,247.1,247.2,
-247.3,247.4,247.5,
-247.6,247.7,247.8,
-247.9, 248,248.1,
-248.2,248.3,248.4,
-248.5,248.6,248.7,
-248.8,248.9, 249,
-249.1,249.2,249.3,
-249.4,249.5,249.6,
-249.7,249.8,249.9,
- 250,250.1,250.2,
- 1,250.3,250.4,
-250.5,250.6,250.7,
-250.8,250.9, 251,
-251.1,251.2,251.3,
-251.4,251.5, -1,
-251.6,251.7,251.8,
-251.9, 252,252.1,
-252.2,252.3,252.4,
-252.5,252.6,252.7,
-252.8,252.9, 253,
-253.1,253.2,253.3,
-253.4,253.5,253.6,
-253.7,253.8,253.9,
- 254,254.1,254.2,
-254.3,254.4,254.5,
-254.6,254.7,254.8,
-254.9, 255,255.1,
-255.2,255.3,255.4,
-255.5,255.6,255.7,
-255.8,255.9, 256,
-256.1, 1,256.2,
-256.3,256.4,256.5,
-256.6,256.7,256.8,
-256.9, 257,257.1,
- -1,257.2,257.3,
-257.4,257.5,257.6,
-257.7,257.8,257.9,
- 258,258.1,258.2,
-258.3,258.4,258.5,
-258.6,258.7,258.8,
-258.9, 259,259.1,
-259.2,259.3,259.4,
-259.5,259.6,259.7,
-259.8,259.9, 260,
-260.1,260.2,260.3,
-260.4,260.5,260.6,
-260.7,260.8,260.9,
- 261,261.1,261.2,
-261.3,261.4,261.5,
-261.6,261.7,261.8,
-261.9, 262, 1,
-262.1,262.2,262.3,
-262.4,262.5,262.6,
-262.7,262.8,262.9,
- 263, -1,263.1,
-263.2,263.3,263.4,
-263.5,263.6,263.7,
-263.8,263.9, 264,
-264.1,264.2,264.3,
-264.4,264.5,264.6,
-264.7,264.8,264.9,
- 265,265.1,265.2,
-265.3,265.4,265.5,
-265.6,265.7,265.8,
-265.9, 266,266.1,
-266.2,266.3,266.4,
-266.5,266.6,266.7,
-266.8,266.9, 267,
-267.1,267.2,267.3,
-267.4,267.5,267.6,
-267.7,267.8,267.9,
- 1, 268,268.1,
-268.2,268.3,268.4,
-268.5,268.6,268.7,
-268.8,268.9, 269,
-269.1,269.2, -1,
-269.3,269.4,269.5,
-269.6,269.7,269.8,
-269.9, 270,270.1,
-270.2,270.3,270.4,
-270.5,270.6,270.7,
-270.8,270.9, 271,
-271.1,271.2,271.3,
-271.4,271.5,271.6,
-271.7,271.8,271.9,
- 272,272.1,272.2,
-272.3,272.4,272.5,
-272.6,272.7,272.8,
-272.9, 273,273.1,
-273.2,273.3,273.4,
-273.5,273.6,273.7,
-273.8, 1,273.9,
- 274,274.1,274.2,
-274.3,274.4,274.5,
-274.6,274.7,274.8,
- -1,274.9, 275,
-275.1,275.2,275.3,
-275.4,275.5,275.6,
-275.7,275.8,275.9,
- 276,276.1,276.2,
-276.3,276.4,276.5,
-276.6,276.7,276.8,
-276.9, 277,277.1,
-277.2,277.3,277.4,
-277.5,277.6,277.7,
-277.8,277.9, 278,
-278.1,278.2,278.3,
-278.4,278.5,278.6,
-278.7,278.8,278.9,
- 279,279.1,279.2,
-279.3,279.4,279.5,
-279.6,279.7, 1,
-279.8,279.9, 280,
-280.1,280.2,280.3,
-280.4,280.5,280.6,
-280.7, -1,280.8,
-280.9, 281,281.1,
-281.2,281.3,281.4,
-281.5,281.6,281.7,
-281.8,281.9, 282,
-282.1, 1,282.2,
-282.3,282.4,282.5,
-282.6,282.7,282.8,
-282.9, 283,283.1,
-283.2,283.3,283.4,
-283.5,283.6,283.7,
-283.8,283.9, 284,
-284.1,284.2,284.3,
-284.4, -1,284.5,
-284.6,284.7,284.8,
-284.9, 285,285.1,
-285.2,285.3,285.4,
-285.5,285.6,285.7,
-285.8,285.9, 286,
-286.1,286.2,286.3,
-286.4,286.5,286.6,
-286.7,286.8,286.9,
- 287,287.1,287.2,
-287.3,287.4,287.5,
-287.6,287.7,287.8,
-287.9, 288, 1,
-288.1,288.2,288.3,
-288.4,288.5,288.6,
-288.7,288.8,288.9,
- 289,289.1,289.2,
-289.3,289.4,289.5,
-289.6,289.7,289.8,
-289.9, 290,290.1,
-290.2,290.3, -1,
-290.4,290.5,290.6,
-290.7,290.8,290.9,
- 291,291.1,291.2,
-291.3,291.4,291.5,
-291.6,291.7,291.8,
-291.9, 292,292.1,
-292.2,292.3,292.4,
-292.5,292.6,292.7,
-292.8,292.9, 293,
-293.1,293.2,293.3,
-293.4,293.5,293.6,
- 1,293.7,293.8,
-293.9, 294,294.1,
-294.2,294.3,294.4,
-294.5,294.6,294.7,
-294.8,294.9, 295,
-295.1,295.2,295.3,
-295.4,295.5,295.6,
-295.7,295.8,295.9,
- -1, 296,296.1,
-296.2,296.3,296.4,
-296.5,296.6,296.7,
-296.8,296.9, 297,
-297.1,297.2,297.3,
-297.4,297.5,297.6,
-297.7,297.8,297.9,
- 298,298.1,298.2,
-298.3,298.4,298.5,
-298.6,298.7,298.8,
-298.9, 299,299.1,
-299.2,299.3,299.4,
-299.5,299.6,299.7,
-299.8, 1,299.9,
- 300,300.1,300.2,
-300.3,300.4,300.5,
-300.6,300.7,300.8,
-300.9, 301,301.1,
-301.2,301.3,301.4,
-301.5,301.6,301.7,
-301.8,301.9, 302,
-302.1, -1,302.2,
-302.3,302.4,302.5,
-302.6,302.7,302.8,
-302.9, 303,303.1,
-303.2,303.3,303.4,
-303.5,303.6,303.7,
-303.8,303.9, 304,
-304.1,304.2,304.3,
-304.4,304.5,304.6,
-304.7,304.8,304.9,
- 305,305.1,305.2,
-305.3,305.4,305.5,
-305.6,305.7, 1,
-305.8,305.9, 306,
-306.1,306.2,306.3,
-306.4,306.5,306.6,
-306.7,306.8,306.9,
- 307,307.1,307.2,
-307.3,307.4,307.5,
-307.6,307.7,307.8,
-307.9, 308, -1,
-308.1,308.2,308.3,
-308.4,308.5,308.6,
-308.7,308.8,308.9,
- 309,309.1,309.2,
-309.3,309.4,309.5,
-309.6,309.7,309.8,
-309.9, 310,310.1,
-310.2,310.3,310.4,
-310.5,310.6,310.7,
-310.8,310.9, 311,
-311.1,311.2,311.3,
- 1,311.4,311.5,
-311.6,311.7,311.8,
-311.9, 312,312.1,
-312.2,312.3,312.4,
-312.5,312.6,312.7,
-312.8,312.9, 313,
-313.1,313.2,313.3,
-313.4,313.5,313.6,
- -1,313.7,313.8,
-313.9, 314,314.1,
-314.2,314.3,314.4,
-314.5,314.6,314.7,
-314.8,314.9, 315,
-315.1,315.2,315.3,
-315.4,315.5,315.6,
-315.7,315.8,315.9,
- 316,316.1,316.2,
-316.3,316.4,316.5,
-316.6,316.7,316.8,
-316.9, 317,317.1,
-317.2,317.3,317.4,
-317.5, 1,317.6,
-317.7,317.8,317.9,
- 318,318.1,318.2,
-318.3,318.4,318.5,
-318.6,318.7,318.8,
-318.9, 319,319.1,
-319.2,319.3,319.4,
-319.5,319.6,319.7,
-319.8, -1,319.9,
- 320,320.1,320.2,
-320.3,320.4,320.5,
-320.6,320.7,320.8,
-320.9, 321,321.1,
-321.2,321.3,321.4,
-321.5,321.6,321.7,
-321.8,321.9, 322,
-322.1,322.2,322.3,
-322.4,322.5,322.6,
-322.7,322.8,322.9,
- 323,323.1,323.2,
-323.3,323.4, 1,
-323.5,323.6,323.7,
-323.8,323.9, 324,
-324.1,324.2,324.3,
-324.4,324.5,324.6,
-324.7,324.8,324.9,
- 325,325.1,325.2,
-325.3,325.4,325.5,
-325.6,325.7, -1,
-325.8,325.9, 326,
-326.1,326.2,326.3,
-326.4,326.5,326.6,
-326.7,326.8,326.9,
- 327,327.1,327.2,
-327.3,327.4,327.5,
-327.6,327.7,327.8,
-327.9, 328,328.1,
-328.2,328.3,328.4,
-328.5,328.6,328.7,
-328.8,328.9, 329,
- 1,329.1,329.2,
-329.3,329.4,329.5,
-329.6,329.7,329.8,
-329.9, 330,330.1,
-330.2,330.3,330.4,
-330.5,330.6,330.7,
-330.8,330.9, 331,
-331.1,331.2,331.3,
- -1,331.4,331.5,
-331.6,331.7,331.8,
-331.9, 332,332.1,
-332.2,332.3,332.4,
-332.5,332.6,332.7,
-332.8,332.9, 333,
-333.1,333.2,333.3,
-333.4,333.5,333.6,
-333.7,333.8,333.9,
- 334,334.1,334.2,
-334.3,334.4,334.5,
-334.6,334.7,334.8,
-334.9, 335,335.1,
-335.2, 1,335.3,
-335.4,335.5,335.6,
-335.7,335.8,335.9,
- 336,336.1,336.2,
-336.3,336.4,336.5,
-336.6,336.7,336.8,
-336.9, 337,337.1,
-337.2,337.3,337.4,
-337.5, -1,337.6,
-337.7,337.8,337.9,
- 338,338.1,338.2,
-338.3,338.4,338.5,
-338.6,338.7,338.8,
-338.9, 339,339.1,
-339.2,339.3,339.4,
-339.5,339.6,339.7,
-339.8,339.9, 340,
-340.1,340.2,340.3,
-340.4,340.5,340.6,
-340.7,340.8,340.9,
- 341,341.1, 1,
-341.2,341.3,341.4,
-341.5,341.6,341.7,
-341.8,341.9, 342,
-342.1,342.2,342.3,
-342.4,342.5,342.6,
-342.7,342.8,342.9,
- 343,343.1,343.2,
-343.3,343.4, -1,
-343.5,343.6,343.7,
-343.8,343.9, 344,
-344.1,344.2,344.3,
-344.4,344.5,344.6,
-344.7,344.8,344.9,
- 345,345.1,345.2,
-345.3,345.4,345.5,
-345.6,345.7,345.8,
-345.9, 346,346.1,
-346.2,346.3,346.4,
-346.5,346.6,346.7,
- 1,346.8,346.9,
- 347,347.1,347.2,
-347.3,347.4,347.5,
-347.6,347.7,347.8,
-347.9, 348,348.1,
-348.2,348.3,348.4,
-348.5,348.6,348.7,
-348.8,348.9, 349,
- -1,349.1,349.2,
-349.3,349.4,349.5,
-349.6,349.7,349.8,
-349.9, 350,350.1,
-350.2,350.3,350.4,
-};
-
-// ----------------------------------------------------------------------
-// Computed values
-// ----------------------------------------------------------------------
-
-const double pylith::faults::CohesiveDynLDataHex8::_orientation[] = {
- 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
- 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
- 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
- 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_area[] = {
- 1.0, 1.0, 1.0, 1.0
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_initialTractions[] = {
- 1.0, 2.0, -3.0,
- 1.1, 2.1, -3.1,
- 1.2, 2.2, -3.2,
- 1.3, 2.3, -3.3,
-};
-
-
-const int pylith::faults::CohesiveDynLDataHex8::_numConstraintVert = 4;
-const int pylith::faults::CohesiveDynLDataHex8::_constraintVertices[] = {
- 18, 19, 20, 21
-};
-// ----------------------------------------------------------------------
-// Stick case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrStick[] = {
- 0.1, 2.1, 28.1,
- 0.2, 2.2, 28.2,
- 0.3, 2.3, 28.3,
- 0.4, 2.4, 28.4,
- 0.5, 2.5, 28.5, // 6
- 0.6, 2.6, 28.6, // 7
- 0.7, 2.7, 28.7, // 8
- 0.8, 2.8, 28.8, // 9
- 0.9, 2.9, 28.9,
- 0.0, 2.0, 28.0,
- 1.1, 3.1, 29.1,
- 1.2, 3.2, 29.2,
- 1.3, 3.3, 29.3, // 14
- 1.5, 3.5, 29.5, // 15
- 1.7, 3.7, 29.7, // 16
- 1.9, 3.9, 29.9, // 17
- 1.4, 3.4, -29.4, // 18
- 1.6, 3.6, -29.6, // 19
- 1.8, 3.8, -29.8, // 20
- 1.0, 3.0, -29.0, // 21
-};
-
-// No change in fieldIncr
-// Zero slip
-
-// ----------------------------------------------------------------------
-// Slip case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrSlip[] = {
- 5.1, 7.1, 9.1,
- 5.2, 7.2, 9.2,
- 5.3, 7.3, 9.3,
- 5.4, 7.4, 9.4,
- 5.5, 7.5, 9.5, // 6
- 5.6, 7.6, 9.6, // 7
- 5.7, 7.7, 9.7, // 8
- 5.8, 7.8, 9.8, // 9
- 5.9, 7.9, 9.9,
- 5.0, 7.0, 9.0,
- 6.1, 8.1, 10.1,
- 6.2, 8.2, 10.2,
- 6.3, 8.3, 10.3, // 14
- 6.5, 8.5, 10.5, // 15
- 6.7, 8.7, 10.7, // 16
- 6.9, 8.9, 10.9, // 17
- 6.4, 8.4, -10.4, // 18
- 6.6, 8.6, -10.6, // 19
- 6.8, 8.8, -10.8, // 20
- 6.0, 8.0, -10.0, // 21
-};
-
-// Output
-// :TODO: Update Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrSlipE[] = {
- 5.1, 7.1, 9.1,
- 5.2, 7.2, 9.2,
- 5.3, 7.3, 9.3,
- 5.4, 7.4, 9.4,
- 5.5, 7.5, 9.5, // 6
- 5.6, 7.6, 9.6, // 7
- 5.7, 7.7, 9.7, // 8
- 5.8, 7.8, 9.8, // 9
- 5.9, 7.9, 9.9,
- 5.0, 7.0, 9.0,
- 6.1, 8.1, 10.1,
- 6.2, 8.2, 10.2,
- 6.3, 8.3, 10.3, // 14
- 6.5, 8.5, 10.5, // 15
- 6.7, 8.7, 10.7, // 16
- 6.9, 8.9, 10.9, // 17
- -3.963897477671262, -5.477083063322538, -10.4, // 18
- -4.120121221785221, -5.634915064993491, -10.6, // 19
- -4.276416812742042, -5.792739610437928, -10.8, // 20
- -3.474281747841006, -4.919475110692280, -10.0, // 21
-};
-
-// :TODO: Update slip values based on changes in Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataHex8::_slipSlipE[] = {
- 20.727794955342528, 27.754166126645078, 0.0,
- 21.440242443570444, 28.469830129986981, 0.0,
- 22.152833625484085, 29.185479220875859, 0.0,
- 18.948563495682009, 25.838950221384557, 0.0,
-};
-
-// ----------------------------------------------------------------------
-// Open case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrOpen[] = {
- 5.1, 7.1, 9.1,
- 5.2, 7.2, 9.2,
- 5.3, 7.3, 9.3,
- 5.4, 7.4, 9.4,
- 5.5, 7.5, 9.5, // 6
- 5.6, 7.6, 9.6, // 7
- 5.7, 7.7, 9.7, // 8
- 5.8, 7.8, 9.8, // 9
- 5.9, 7.9, 9.9,
- 5.0, 7.0, 9.0,
- 6.1, 8.1, 10.1,
- 6.2, 8.2, 10.2,
- 6.3, 8.3, 10.3, // 14
- 6.5, 8.5, 10.5, // 15
- 6.7, 8.7, 10.7, // 16
- 6.9, 8.9, 10.9, // 17
- 6.4, 8.4, 10.4, // 18
- 6.6, 8.6, 10.6, // 19
- 6.8, 8.8, 10.8, // 20
- 6.0, 8.0, 10.0, // 21
-};
-
-// Output
-const double pylith::faults::CohesiveDynLDataHex8::_fieldIncrOpenE[] = {
- 5.1, 7.1, 9.1,
- 5.2, 7.2, 9.2,
- 5.3, 7.3, 9.3,
- 5.4, 7.4, 9.4,
- 5.5, 7.5, 9.5, // 6
- 5.6, 7.6, 9.6, // 7
- 5.7, 7.7, 9.7, // 8
- 5.8, 7.8, 9.8, // 9
- 5.9, 7.9, 9.9,
- 5.0, 7.0, 9.0,
- 6.1, 8.1, 10.1,
- 6.2, 8.2, 10.2,
- 6.3, 8.3, 10.3, // 14
- 6.5, 8.5, 10.5, // 15
- 6.7, 8.7, 10.7, // 16
- 6.9, 8.9, 10.9, // 17
- -5.4, -7.4, -9.4, // 18
- -5.6, -7.6, -9.6, // 19
- -5.8, -7.8, -9.8, // 20
- -5.0, -7.0, -9.0, // 21
-};
-
-const double pylith::faults::CohesiveDynLDataHex8::_slipOpenE[] = {
- 23.6, 31.6, 39.6,
- 24.4, 32.4, 40.4,
- 25.2, 33.2, 41.2,
- 22.0, 30.0, 38.0,
-};
-
-// ----------------------------------------------------------------------
-pylith::faults::CohesiveDynLDataHex8::CohesiveDynLDataHex8(void)
-{ // constructor
- meshFilename = const_cast<char*>(_meshFilename);
- spaceDim = _spaceDim;
- cellDim = _cellDim;
- numBasis = _numBasis;
- numQuadPts = _numQuadPts;
- quadPts = const_cast<double*>(_quadPts);
- quadWts = const_cast<double*>(_quadWts);
- basis = const_cast<double*>(_basis);
- basisDeriv = const_cast<double*>(_basisDeriv);
- verticesRef = const_cast<double*>(_verticesRef);
- id = _id;
- label = const_cast<char*>(_label);
- initialTractFilename = const_cast<char*>(_initialTractFilename);
-
- fieldT = const_cast<double*>(_fieldT);
- jacobian = const_cast<double*>(_jacobian);
- orientation = const_cast<double*>(_orientation);
- area = const_cast<double*>(_area);
- initialTractions = const_cast<double*>(_initialTractions);
-
- constraintVertices = const_cast<int*>(_constraintVertices);
- numConstraintVert = _numConstraintVert;
-
- // Stick
- fieldIncrStick = const_cast<double*>(_fieldIncrStick);
-
- // Slip
- fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
- fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
- slipSlipE = const_cast<double*>(_slipSlipE);
-
- // Open
- fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
- fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
- slipOpenE = const_cast<double*>(_slipOpenE);
-} // constructor
-
-pylith::faults::CohesiveDynLDataHex8::~CohesiveDynLDataHex8(void)
-{}
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataHex8.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,77 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#if !defined(pylith_faults_cohesivedynldatahex8_hh)
-#define pylith_faults_cohesivedynldatahex8_hh
-
-#include "CohesiveDynLData.hh"
-
-namespace pylith {
- namespace faults {
- class CohesiveDynLDataHex8;
- } // pylith
-} // faults
-
-class pylith::faults::CohesiveDynLDataHex8 : public CohesiveDynLData
-{
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public:
-
- /// Constructor
- CohesiveDynLDataHex8(void);
-
- /// Destructor
- ~CohesiveDynLDataHex8(void);
-
-// PRIVATE MEMBERS //////////////////////////////////////////////////////
-private:
-
- static const char* _meshFilename; ///< Filename of input mesh
-
- static const int _spaceDim; ///< Number of dimensions in vertex coordinates
- static const int _cellDim; ///< Number of dimensions associated with cell
-
- static const int _numBasis; ///< Number of vertices in cell
- static const int _numQuadPts; ///< Number of quadrature points
- static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
- static const double _quadWts[]; ///< Weights of quadrature points
- static const double _basis[]; ///< Basis fns at quadrature points
- static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
- static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
-
- static const int _id; ///< Fault material identifier
- static const char* _label; ///< Label for fault
- static const char* _initialTractFilename; ///< Name of db for initial tractions.
-
- static const double _fieldT[]; ///< Solution field at time t.
- static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
- static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
- static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
- static const double _jacobian[]; ///< Jacobian sparse matrix.
-
- static const double _orientation[]; ///< Expected values for fault orientation.
- static const double _area[]; ///< Expected values for fault area.
- static const double _initialTractions[]; ///< Expected values for initial tractions.
- static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
- static const double _slipSlipE[]; ///< Expected values for slip for slip case.
- static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
- static const double _slipOpenE[]; ///< Expected values for slip for opening case.
- static const int _constraintVertices[]; ///< Expected points for constraint vertices
- static const int _numConstraintVert; ///< Number of constraint vertices
-
-};
-
-#endif // pylith_faults_cohesivedynldatahex8_hh
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,468 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-
-/* Original mesh
- *
- * Cells are 0-1, vertices are 2-7.
- *
- * 3 -------- 5 -------- 7
- * | | |
- * | | |
- * | | |
- * | | |
- * | | |
- * | | |
- * | | |
- * | | |
- * 2 -------- 4 -------- 6
- *
- * After adding cohesive elements
- *
- * Cells are 0-1,10 vertices are 2-9.
- *
- * 3 -------- 5 -11-- 9 -------- 7
- * | | | |
- * | | | |
- * | | | |
- * | | | |
- * | | | |
- * | | | |
- * | | | |
- * | | | |
- * 2 -------- 4 -10-- 8 -------- 6
- */
-
-#include "CohesiveDynLDataQuad4.hh"
-
-const char* pylith::faults::CohesiveDynLDataQuad4::_meshFilename =
- "data/quad4.mesh";
-
-const int pylith::faults::CohesiveDynLDataQuad4::_spaceDim = 2;
-
-const int pylith::faults::CohesiveDynLDataQuad4::_cellDim = 1;
-
-const int pylith::faults::CohesiveDynLDataQuad4::_numBasis = 2;
-
-const int pylith::faults::CohesiveDynLDataQuad4::_numQuadPts = 1;
-
-const double pylith::faults::CohesiveDynLDataQuad4::_quadPts[] = {
- 0.0,
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_quadWts[] = {
- 2.0,
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_basis[] = {
- 0.5,
- 0.5
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_basisDeriv[] = {
- -0.5,
- 0.5
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_verticesRef[] = {
- -1.0, 1.0
-};
-
-const int pylith::faults::CohesiveDynLDataQuad4::_id = 10;
-
-const char* pylith::faults::CohesiveDynLDataQuad4::_label = "fault";
-
-const char* pylith::faults::CohesiveDynLDataQuad4::_initialTractFilename =
- "data/quad4_initialtract.spatialdb";
-
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldT[] = {
- 8.1, 9.1,
- 8.2, 9.2,
- 8.3, 9.3, // 4
- 8.4, 9.4, // 5
- 8.5, 9.5,
- 8.6, 9.6,
- 8.7, 9.7, // 8
- 8.9, 9.9, // 9
- 8.8, 9.8, // 10
- 8.0, 9.0, // 11
-};
-
-// :TODO: Make sensible values for Jacobian for DOF on positive and
-// negative sides of the fault. Add semi-random values for other DOF.
-const double pylith::faults::CohesiveDynLDataQuad4::_jacobian[] = {
- 1, 0.1,
- 0.2, 0.3,
- 0.4, 0.5,
- 0.6, 0.7,
- 0.8, 0.9,
- 1, 1.1,
- 1.2, 1.3,
- 1.4, 1.5,
- 1.6, 1.7,
- 1.8, 1.9,
- 2, 1,
- 2.1, 2.2,
- 2.3, 2.4,
- 2.5, 2.6,
- 2.7, 2.8,
- 2.9, 3,
- 3.1, 3.2,
- 3.3, 3.4,
- 3.5, 3.6,
- 3.7, 3.8,
- 3.9, 4,
- 1, 4.1,
- 4.2, 4.3,
- 4.4, 4.5,
- 4.6, 4.7,
- 4.8, 4.9,
- 5, 5.1,
- 5.2, 5.3,
- 5.4, 5.5,
- 5.6, 5.7,
- 5.8, 5.9,
- 6, 1,
- 6.1, 6.2,
- 6.3, 6.4,
- 6.5, 6.6,
- 6.7, 6.8,
- 6.9, 7,
- 7.1, 7.2,
- 7.3, 7.4,
- 7.5, 7.6,
- 7.7, 7.8,
- 7.9, 8,
- 1, 8.1,
- 8.2, 8.3,
- 8.4, 8.5,
- 8.6, 8.7,
- 8.8, 8.9,
- 9, 9.1,
- 9.2, -1,
- 9.3, 9.4,
- 9.5, 9.6,
- 9.7, 9.8,
- 9.9, 1,
- 10,10.1,
-10.2,10.3,
-10.4,10.5,
-10.6,10.7,
-10.8,10.9,
- -1, 11,
-11.1,11.2,
-11.3,11.4,
-11.5,11.6,
-11.7,11.8,
- 1,11.9,
- 12,12.1,
-12.2,12.3,
-12.4,12.5,
-12.6,12.7,
-12.8,12.9,
- 13, -1,
-13.1,13.2,
-13.3,13.4,
-13.5,13.6,
-13.7, 1,
-13.8,13.9,
- 14,14.1,
-14.2,14.3,
-14.4,14.5,
-14.6,14.7,
- -1,14.8,
-14.9, 15,
-15.1,15.2,
-15.3,15.4,
-15.5,15.6,
- 1,15.7,
-15.8,15.9,
- 16,16.1,
-16.2,16.3,
-16.4,16.5,
-16.6,16.7,
-16.8,16.9,
- 17,17.1,
-17.2,17.3,
-17.4,17.5,
-17.6, 1,
-17.7,17.8,
-17.9, 18,
-18.1,18.2,
-18.3,18.4,
-18.5,18.6,
-18.7,18.8,
-18.9, 19,
-19.1,19.2,
-19.3,19.4,
-19.5,19.6,
- 1,19.7,
-19.8,19.9,
- 20,20.1,
-20.2,20.3,
-20.4,20.5,
-20.6,20.7,
-20.8,20.9,
- 21,21.1,
-21.2,21.3,
-21.4,21.5,
-21.6, 1,
-21.7,21.8,
-21.9, 22,
-22.1,22.2,
-22.3,22.4,
-22.5,22.6,
-22.7,22.8,
-22.9, 23,
-23.1,23.2,
-23.3,23.4,
-23.5,23.6,
- 1,23.7,
-23.8,23.9,
- 24, 1,
-24.1,24.2,
-24.3,24.4,
-24.5,24.6,
-24.7,24.8,
-24.9, 25,
-25.1,25.2,
-25.3,25.4,
-25.5, 1,
-25.6,25.7,
- 1,25.8,
-25.9, 26,
-26.1,26.2,
-26.3,26.4,
-26.5,26.6,
-26.7,26.8,
-26.9, 27,
-27.1,27.2,
-27.3,27.4,
- 1,27.5,
-27.6,27.7,
-27.8, 1,
-27.9, 28,
-28.1,28.2,
-28.3,28.4,
-28.5,28.6,
-28.7,28.8,
-28.9, 29,
-29.1,29.2,
-29.3, 1,
-29.4,29.5,
- 1,29.6,
-29.7,29.8,
-29.9, 30,
-30.1, -1,
-30.2,30.3,
-30.4,30.5,
-30.6,30.7,
-30.8, 1,
-30.9, 31,
-31.1,31.2,
-31.3,31.4,
-31.5,31.6,
-31.7,31.8,
- -1,31.9,
- 32,32.1,
-32.2,32.3,
-32.4,32.5,
- 1,32.6,
-32.7,32.8,
-32.9, 33,
-33.1,33.2,
-33.3,33.4,
-33.5,33.6,
-33.7,33.8,
-33.9, -1,
- 34,34.1,
-34.2,34.3,
-34.4,34.5,
-34.6, 1,
-34.7,34.8,
-34.9, 35,
-35.1,35.2,
-35.3,35.4,
-35.5,35.6,
- -1,35.7,
-35.8,35.9,
- 36,36.1,
-36.2,36.3,
- 1,36.4,
-36.5,36.6,
-36.7,36.8,
-};
-
-// ----------------------------------------------------------------------
-// Computed values
-// ----------------------------------------------------------------------
-
-const double pylith::faults::CohesiveDynLDataQuad4::_orientation[] = {
- 0.0, -1.0, -1.0, 0.0,
- 0.0, -1.0, -1.0, 0.0
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_area[] = {
- 1.0,
- 1.0,
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_initialTractions[] = {
- 1.0, -2.0,
- 1.1, -2.1,
-};
-
-
-const int pylith::faults::CohesiveDynLDataQuad4::_numConstraintVert = 2;
-const int pylith::faults::CohesiveDynLDataQuad4::_constraintVertices[] = {
- 10, 11
-};
-
-// ----------------------------------------------------------------------
-// Stick case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldIncrStick[] = {
- 1.1, 29.1,
- 1.2, 29.2,
- 1.3, 29.3, // 4
- 1.4, 29.4, // 5
- 1.5, 29.5,
- 1.6, 29.6,
- 1.7, 29.7, // 8
- 1.9, 29.9, // 9
- 1.8, -29.8, // 10
- 1.0, -29.0, // 11
-};
-
-// No change in fieldIncr
-// Zero slip
-
-// ----------------------------------------------------------------------
-// Slip case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldIncrSlip[] = {
- 9.1, 10.1,
- 9.2, 10.2,
- 9.3, 10.3, // 4
- 9.4, 10.4, // 5
- 9.5, 10.5,
- 9.6, 10.6,
- 9.7, 10.7, // 8
- 9.9, 10.9, // 9
- 9.8, -10.8, // 10
- 9.0, -10.0, // 11
-};
-
-// Output
-// :TODO: Update Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldIncrSlipE[] = {
- 9.1, 10.1,
- 9.2, 10.2,
- 9.3, 10.3, // 4
- 9.4, 10.4, // 5
- 9.5, 10.5,
- 9.6, 10.6,
- 9.7, 10.7, // 8
- 9.9, 10.9, // 9
- -7.0, -10.8, // 10
- -6.14, -10.0, // 11
-};
-
-// :TODO: Update slip values based on changes in Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataQuad4::_slipSlipE[] = {
- 33.6, 0.0,
- 30.28, 0.0,
-};
-
-// ----------------------------------------------------------------------
-// Open case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldIncrOpen[] = {
- 9.1, 10.1,
- 9.2, 10.2,
- 9.3, 10.3, // 4
- 9.4, 10.4, // 5
- 9.5, 10.5,
- 9.6, 10.6,
- 9.7, 10.7, // 8
- 9.9, 10.9, // 9
- 9.8, 10.8, // 10
- 9.0, 10.0, // 11
-};
-
-// Output
-const double pylith::faults::CohesiveDynLDataQuad4::_fieldIncrOpenE[] = {
- 9.1, 10.1,
- 9.2, 10.2,
- 9.3, 10.3, // 4
- 9.4, 10.4, // 5
- 9.5, 10.5,
- 9.6, 10.6,
- 9.7, 10.7, // 8
- 9.9, 10.9, // 9
- -8.8, -9.8, // 10
- -8.0, -9.0, // 11
-};
-
-const double pylith::faults::CohesiveDynLDataQuad4::_slipOpenE[] = {
- 37.2, 41.2,
- 34.0, 38.0,
-};
-
-// ----------------------------------------------------------------------
-pylith::faults::CohesiveDynLDataQuad4::CohesiveDynLDataQuad4(void)
-{ // constructor
- meshFilename = const_cast<char*>(_meshFilename);
- spaceDim = _spaceDim;
- cellDim = _cellDim;
- numBasis = _numBasis;
- numQuadPts = _numQuadPts;
- quadPts = const_cast<double*>(_quadPts);
- quadWts = const_cast<double*>(_quadWts);
- basis = const_cast<double*>(_basis);
- basisDeriv = const_cast<double*>(_basisDeriv);
- verticesRef = const_cast<double*>(_verticesRef);
- id = _id;
- label = const_cast<char*>(_label);
- initialTractFilename = const_cast<char*>(_initialTractFilename);
-
- fieldT = const_cast<double*>(_fieldT);
- jacobian = const_cast<double*>(_jacobian);
- orientation = const_cast<double*>(_orientation);
- area = const_cast<double*>(_area);
- initialTractions = const_cast<double*>(_initialTractions);
-
- constraintVertices = const_cast<int*>(_constraintVertices);
- numConstraintVert = _numConstraintVert;
-
- // Stick
- fieldIncrStick = const_cast<double*>(_fieldIncrStick);
-
- // Slip
- fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
- fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
- slipSlipE = const_cast<double*>(_slipSlipE);
-
- // Open
- fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
- fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
- slipOpenE = const_cast<double*>(_slipOpenE);
-} // constructor
-
-pylith::faults::CohesiveDynLDataQuad4::~CohesiveDynLDataQuad4(void)
-{}
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataQuad4.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,77 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#if !defined(pylith_faults_cohesivedynldataquad4_hh)
-#define pylith_faults_cohesivedynldataquad4_hh
-
-#include "CohesiveDynLData.hh"
-
-namespace pylith {
- namespace faults {
- class CohesiveDynLDataQuad4;
- } // pylith
-} // faults
-
-class pylith::faults::CohesiveDynLDataQuad4 : public CohesiveDynLData
-{
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public:
-
- /// Constructor
- CohesiveDynLDataQuad4(void);
-
- /// Destructor
- ~CohesiveDynLDataQuad4(void);
-
-// PRIVATE MEMBERS //////////////////////////////////////////////////////
-private:
-
- static const char* _meshFilename; ///< Filename of input mesh
-
- static const int _spaceDim; ///< Number of dimensions in vertex coordinates
- static const int _cellDim; ///< Number of dimensions associated with cell
-
- static const int _numBasis; ///< Number of vertices in cell
- static const int _numQuadPts; ///< Number of quadrature points
- static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
- static const double _quadWts[]; ///< Weights of quadrature points
- static const double _basis[]; ///< Basis fns at quadrature points
- static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
- static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
-
- static const int _id; ///< Fault material identifier
- static const char* _label; ///< Label for fault
- static const char* _initialTractFilename; ///< Name of db for initial tractions.
-
- static const double _fieldT[]; ///< Solution field at time t.
- static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
- static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
- static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
- static const double _jacobian[]; ///< Jacobian sparse matrix.
-
- static const double _orientation[]; ///< Expected values for fault orientation.
- static const double _area[]; ///< Expected values for fault area.
- static const double _initialTractions[]; ///< Expected values for initial tractions.
- static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
- static const double _slipSlipE[]; ///< Expected values for slip for slip case.
- static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
- static const double _slipOpenE[]; ///< Expected values for slip for opening case.
- static const int _constraintVertices[]; ///< Expected points for constraint vertices
- static const int _numConstraintVert; ///< Number of constraint vertices
-
-};
-
-#endif // pylith_faults_cohesivedynldataquad4_hh
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,630 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-
-/* Original mesh
- *
- * Cells are 0-1, vertices are 2-6.
- *
- * 2 3,4,5 6
- *
- * ^^^^^ Face in x-y plane
- *
- * After adding cohesive elements
- *
- * Cells are 0-1,10, vertices are 2-9.
- *
- * 2 3,4,5 7,8,9 6
- * 10,11,12
- * ^^^^^^^^^^^^ Cohesive element in x-y plane.
- */
-
-#include "CohesiveDynLDataTet4.hh"
-
-const char* pylith::faults::CohesiveDynLDataTet4::_meshFilename =
- "data/tet4.mesh";
-
-const int pylith::faults::CohesiveDynLDataTet4::_spaceDim = 3;
-
-const int pylith::faults::CohesiveDynLDataTet4::_cellDim = 2;
-
-const int pylith::faults::CohesiveDynLDataTet4::_numBasis = 3;
-
-const int pylith::faults::CohesiveDynLDataTet4::_numQuadPts = 1;
-
-const double pylith::faults::CohesiveDynLDataTet4::_quadPts[] = {
- 3.33333333e-01, 3.33333333e-01,
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_quadWts[] = {
- 5.00000000e-01,
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_basis[] = {
- 3.33333333e-01, 3.33333333e-01,
- 3.33333333e-01,};
-
-const double pylith::faults::CohesiveDynLDataTet4::_basisDeriv[] = {
- -1.00000000e+00, -1.00000000e+00,
- 1.00000000e+00, 0.00000000e+00,
- 0.00000000e+00, 1.00000000e+00,
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_verticesRef[] = {
- -1.00000000e+00, -1.00000000e+00,
- 1.00000000e+00, -1.00000000e+00,
- -1.00000000e+00, 1.00000000e+00,
-};
-
-const int pylith::faults::CohesiveDynLDataTet4::_id = 10;
-
-const char* pylith::faults::CohesiveDynLDataTet4::_label = "fault";
-
-const char* pylith::faults::CohesiveDynLDataTet4::_initialTractFilename =
- "data/tet4_initialtract.spatialdb";
-
-const double pylith::faults::CohesiveDynLDataTet4::_fieldT[] = {
- 7.1, 8.1, 9.1,
- 7.2, 8.2, 9.2, // 3
- 7.3, 8.3, 9.3, // 4
- 7.4, 8.4, 9.4, // 5
- 7.5, 8.5, 9.5,
- 7.6, 8.6, 9.6, // 7
- 7.8, 8.8, 9.8, // 8
- 7.0, 8.0, 9.0, // 9
- 7.7, 8.7, 9.7, // 10
- 7.9, 8.9, 9.9, // 11
- 7.1, 8.1, 9.1, // 12
-};
-
-// :TODO: Make sensible values for Jacobian for DOF on positive and
-// negative sides of the fault. Add semi-random values for other DOF.
-const double pylith::faults::CohesiveDynLDataTet4::_jacobian[] = {
- 1, 0.1, 0.2,
- 0.3, 0.4, 0.5,
- 0.6, 0.7, 0.8,
- 0.9, 1, 1.1,
- 1.2, 1.3, 1.4,
- 1.5, 1.6, 1.7,
- 1.8, 1.9, 2,
- 2.1, 2.2, 2.3,
- 2.4, 2.5, 2.6,
- 2.7, 2.8, 2.9,
- 3, 3.1, 3.2,
- 3.3, 1, 3.4,
- 3.5, 3.6, 3.7,
- 3.8, 3.9, 4,
- 4.1, 4.2, 4.3,
- 4.4, 4.5, 4.6,
- 4.7, 4.8, 4.9,
- 5, 5.1, 5.2,
- 5.3, 5.4, 5.5,
- 5.6, 5.7, 5.8,
- 5.9, 6, 6.1,
- 6.2, 6.3, 6.4,
- 6.5, 6.6, 1,
- 6.7, 6.8, 6.9,
- 7, 7.1, 7.2,
- 7.3, 7.4, 7.5,
- 7.6, 7.7, 7.8,
- 7.9, 8, 8.1,
- 8.2, 8.3, 8.4,
- 8.5, 8.6, 8.7,
- 8.8, 8.9, 9,
- 9.1, 9.2, 9.3,
- 9.4, 9.5, 9.6,
- 9.7, 9.8, 9.9,
- 1, 10, 10.1,
- 10.2, 10.3, 10.4,
- 10.5, 10.6, 10.7,
- 10.8, 10.9, 11,
- 11.1, 11.2, 11.3,
- 11.4, 11.5, 11.6,
- 11.7, 11.8, 11.9,
- 12, 12.1, -1,
- 12.2, 12.3, 12.4,
- 12.5, 12.6, 12.7,
- 12.8, 12.9, 13,
- 13.1, 1, 13.2,
- 13.3, 13.4, 13.5,
- 13.6, 13.7, 13.8,
- 13.9, 14, 14.1,
- 14.2, 14.3, 14.4,
- 14.5, 14.6, 14.7,
- 14.8, 14.9, 15,
- -1, 15.1, 15.2,
- 15.3, 15.4, 15.5,
- 15.6, 15.7, 15.8,
- 15.9, 16, 16.1,
- 16.2, 16.3, 1,
- 16.4, 16.5, 16.6,
- 16.7, 16.8, 16.9,
- 17, 17.1, 17.2,
- 17.3, 17.4, 17.5,
- 17.6, 17.7, 17.8,
- 17.9, 18, 18.1,
- 18.2, -1, 18.3,
- 18.4, 18.5, 18.6,
- 18.7, 18.8, 18.9,
- 19, 19.1, 19.2,
- 19.3, 19.4, 19.5,
- 1, 19.6, 19.7,
- 19.8, 19.9, 20,
- 20.1, 20.2, 20.3,
- 20.4, 20.5, 20.6,
- 20.7, 20.8, 20.9,
- 21, 21.1, 21.2,
- 21.3, 21.4, 21.5,
- 21.6, 21.7, -1,
- 21.8, 21.9, 22,
- 22.1, 22.2, 22.3,
- 22.4, 22.5, 22.6,
- 22.7, 1, 22.8,
- 22.9, 23, 23.1,
- 23.2, 23.3, 23.4,
- 23.5, 23.6, 23.7,
- 23.8, 23.9, 24,
- 24.1, 24.2, 24.3,
- 24.4, 24.5, 24.6,
- -1, 24.7, 24.8,
- 24.9, 25, 25.1,
- 25.2, 25.3, 25.4,
- 25.5, 25.6, 25.7,
- 25.8, 25.9, 1,
- 26, 26.1, 26.2,
- 26.3, 26.4, 26.5,
- 26.6, 26.7, 26.8,
- 26.9, 27, 27.1,
- 27.2, 27.3, 27.4,
- 27.5, 27.6, 27.7,
- 27.8, -1, 27.9,
- 28, 28.1, 28.2,
- 28.3, 28.4, 28.5,
- 28.6, 28.7, 28.8,
- 28.9, 29, 29.1,
- 1, 29.2, 29.3,
- 29.4, 29.5, 29.6,
- 29.7, 29.8, 29.9,
- 30, 30.1, 30.2,
- 30.3, 30.4, 30.5,
- 30.6, 30.7, 30.8,
- 30.9, 31, 31.1,
- 31.2, 31.3, -1,
- 31.4, 31.5, 31.6,
- 31.7, 31.8, 31.9,
- 32, 32.1, 32.2,
- 32.3, 1, 32.4,
- 32.5, 32.6, 32.7,
- 32.8, 32.9, 33,
- 33.1, 33.2, 33.3,
- 33.4, 33.5, 33.6,
- 33.7, 33.8, 33.9,
- 34, 34.1, 34.2,
- -1, 34.3, 34.4,
- 34.5, 34.6, 34.7,
- 34.8, 34.9, 35,
- 35.1, 35.2, 35.3,
- 35.4, 35.5, 1,
- 35.6, 35.7, 35.8,
- 35.9, 36, 36.1,
- 36.2, 36.3, 36.4,
- 36.5, 36.6, 36.7,
- 36.8, 36.9, 37,
- 37.1, 37.2, 37.3,
- 37.4, -1, 37.5,
- 37.6, 37.7, 37.8,
- 37.9, 38, 38.1,
- 38.2, 38.3, 38.4,
- 38.5, 38.6, 38.7,
- 1, 38.8, 38.9,
- 39, 39.1, 39.2,
- 39.3, 39.4, 39.5,
- 39.6, 39.7, 39.8,
- 39.9, 40, 40.1,
- 40.2, 40.3, 40.4,
- 40.5, 40.6, 40.7,
- 40.8, 40.9, 41,
- 41.1, 41.2, 41.3,
- 41.4, 41.5, 41.6,
- 41.7, 41.8, 41.9,
- 42, 1, 42.1,
- 42.2, 42.3, 42.4,
- 42.5, 42.6, 42.7,
- 42.8, 42.9, 43,
- 43.1, 43.2, 43.3,
- 43.4, 43.5, 43.6,
- 43.7, 43.8, 43.9,
- 44, 44.1, 44.2,
- 44.3, 44.4, 44.5,
- 44.6, 44.7, 44.8,
- 44.9, 45, 45.1,
- 45.2, 45.3, 1,
- 45.4, 45.5, 45.6,
- 45.7, 45.8, 45.9,
- 46, 46.1, 46.2,
- 46.3, 46.4, 46.5,
- 46.6, 46.7, 46.8,
- 46.9, 47, 47.1,
- 47.2, 47.3, 47.4,
- 47.5, 47.6, 47.7,
- 47.8, 47.9, 48,
- 48.1, 48.2, 48.3,
- 48.4, 48.5, 48.6,
- 1, 48.7, 48.8,
- 48.9, 49, 49.1,
- 49.2, 49.3, 49.4,
- 49.5, 49.6, 1,
- 49.7, 49.8, 49.9,
- 50, 50.1, 50.2,
- 50.3, 50.4, 50.5,
- 50.6, 50.7, 50.8,
- 50.9, 51, 51.1,
- 51.2, 51.3, 51.4,
- 51.5, 51.6, 51.7,
- 51.8, 1, 51.9,
- 52, 52.1, 52.2,
- 52.3, 52.4, 52.5,
- 1, 52.6, 52.7,
- 52.8, 52.9, 53,
- 53.1, 53.2, 53.3,
- 53.4, 53.5, 53.6,
- 53.7, 53.8, 53.9,
- 54, 54.1, 54.2,
- 54.3, 54.4, 54.5,
- 54.6, 54.7, 54.8,
- 54.9, 55, 1,
- 55.1, 55.2, 55.3,
- 55.4, 55.5, 55.6,
- 55.7, 1, 55.8,
- 55.9, 56, 56.1,
- 56.2, 56.3, 56.4,
- 56.5, 56.6, 56.7,
- 56.8, 56.9, 57,
- 57.1, 57.2, 57.3,
- 57.4, 57.5, 57.6,
- 57.7, 57.8, 57.9,
- 58, 58.1, 58.2,
- 1, 58.3, 58.4,
- 58.5, 58.6, 58.7,
- 58.8, 58.9, 59,
- 59.1, 59.2, 1,
- 59.3, 59.4, 59.5,
- 59.6, 59.7, 59.8,
- 59.9, 60, 60.1,
- 60.2, 60.3, 60.4,
- 60.5, 60.6, 60.7,
- 60.8, 60.9, 61,
- 61.1, 61.2, 61.3,
- 61.4, 1, 61.5,
- 61.6, 61.7, 61.8,
- 61.9, 62, 62.1,
- 1, 62.2, 62.3,
- 62.4, 62.5, 62.6,
- 62.7, 62.8, 62.9,
- 63, 63.1, 63.2,
- 63.3, 63.4, 63.5,
- 63.6, 63.7, 63.8,
- 63.9, 64, 64.1,
- 64.2, 64.3, 64.4,
- 64.5, 64.6, 1,
- 64.7, 64.8, 64.9,
- 65, 65.1, 65.2,
- 65.3, 1, 65.4,
- 65.5, 65.6, 65.7,
- 65.8, 65.9, 66,
- 66.1, 66.2, 66.3,
- 66.4, 66.5, 66.6,
- 66.7, 66.8, 66.9,
- 67, 67.1, 67.2,
- 67.3, 67.4, 67.5,
- 67.6, 67.7, 67.8,
- 1, 67.9, 68,
- 68.1, 68.2, 68.3,
- 68.4, 68.5, 68.6,
- 68.7, 68.8, 1,
- 68.9, 69, 69.1,
- 69.2, 69.3, 69.4,
- 69.5, 69.6, 69.7,
- 69.8, 69.9, 70,
- 70.1, 70.2, 70.3,
- 70.4, 70.5, 70.6,
- 70.7, 70.8, 70.9,
- 71, 1, 71.1,
- 71.2, 71.3, 71.4,
- 71.5, 71.6, 71.7,
- 1, 71.8, 71.9,
- 72, 72.1, 72.2,
- 72.3, 72.4, 72.5,
- 72.6, 72.7, 72.8,
- 72.9, 73, 73.1,
- 73.2, 73.3, 73.4,
- 73.5, 73.6, 73.7,
- 73.8, 73.9, 74,
- 74.1, 74.2, 1,
- 74.3, 74.4, 74.5,
- 74.6, 74.7, 74.8,
- 74.9, 1, 75,
- 75.1, 75.2, 75.3,
- 75.4, -1, 75.5,
- 75.6, 75.7, 75.8,
- 75.9, 76, 76.1,
- 76.2, 76.3, 76.4,
- 76.5, 1, 76.6,
- 76.7, 76.8, 76.9,
- 77, 77.1, 77.2,
- 77.3, 77.4, 77.5,
- 77.6, 77.7, 77.8,
- 77.9, 78, 78.1,
- 78.2, 78.3, 78.4,
- 78.5, 78.6, -1,
- 78.7, 78.8, 78.9,
- 79, 79.1, 79.2,
- 79.3, 79.4, 79.5,
- 79.6, 79.7, 1,
- 79.8, 79.9, 80,
- 80.1, 80.2, 80.3,
- 80.4, 80.5, 80.6,
- 80.7, 80.8, 80.9,
- 81, 81.1, 81.2,
- 81.3, 81.4, 81.5,
- -1, 81.6, 81.7,
- 81.8, 81.9, 82,
- 82.1, 82.2, 82.3,
- 82.4, 82.5, 82.6,
- 1, 82.7, 82.8,
- 82.9, 83, 83.1,
- 83.2, 83.3, 83.4,
- 83.5, 83.6, 83.7,
- 83.8, 83.9, 84,
- 84.1, 84.2, 84.3,
- 84.4, 84.5, 84.6,
- 84.7, 84.8, 84.9,
- 85, -1, 85.1,
- 85.2, 85.3, 85.4,
- 85.5, 85.6, 85.7,
- 85.8, 85.9, 86,
- 86.1, 1, 86.2,
- 86.3, 86.4, 86.5,
- 86.6, 86.7, 86.8,
- 86.9, 87, 87.1,
- 87.2, 87.3, 87.4,
- 87.5, 87.6, 87.7,
- 87.8, 87.9, 88,
- 88.1, 88.2, -1,
- 88.3, 88.4, 88.5,
- 88.6, 88.7, 88.8,
- 88.9, 89, 89.1,
- 89.2, 89.3, 1,
- 89.4, 89.5, 89.6,
- 89.7, 89.8, 89.9,
- 90, 90.1, 90.2,
- 90.3, 90.4, 90.5,
- 90.6, 90.7, 90.8,
- 90.9, 91, 91.1,
- -1, 91.2, 91.3,
- 91.4, 91.5, 91.6,
- 91.7, 91.8, 91.9,
- 92, 92.1, 92.2,
- 1, 92.3, 92.4,
- 92.5, 92.6, 92.7,
- 92.8, 92.9, 93,
- 93.1, 93.2, 93.3,
- 93.4, 93.5, 93.6,
- 93.7, 93.8, 93.9,
- 94, 94.1, 94.2,
- 94.3, 94.4, 94.5,
- 94.6, -1, 94.7,
- 94.8, 94.9, 95,
- 95.1, 95.2, 95.3,
- 95.4, 95.5, 95.6,
- 95.7, 1, 95.8,
- 95.9, 96, 96.1,
- 96.2, 96.3, 96.4,
- 96.5, 96.6, 96.7,
- 96.8, 96.9, 97,
- 97.1, 97.2, 97.3,
- 97.4, 97.5, 97.6,
- 97.7, 97.8, -1,
- 97.9, 98, 98.1,
- 98.2, 98.3, 98.4,
- 98.5, 98.6, 98.7,
- 98.8, 98.9, 1,
- 99, 99.1, 99.2,
- 99.3, 99.4, 99.5,
- 99.6, 99.7, 99.8,
- 99.9, 100,100.1,
-100.2,100.3,100.4,
-100.5,100.6,100.7,
- -1,100.8,100.9,
- 101,101.1,101.2,
-101.3,101.4,101.5,
-101.6,101.7,101.8,
- 1,101.9, 102,
-102.1,102.2,102.3,
-102.4,102.5,102.6,
-102.7,102.8,102.9,
-};
-
-// ----------------------------------------------------------------------
-// Computed values
-// ----------------------------------------------------------------------
-
-const double pylith::faults::CohesiveDynLDataTet4::_orientation[] = {
- 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
- 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
- 0.0, -1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0,
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_area[] = {
- 1.0/3.0,
- 1.0/3.0,
- 1.0/3.0,
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_initialTractions[] = {
- 1.0, 2.0, -3.0,
- 1.1, 2.1, -3.1,
- 1.2, 2.2, -3.2,
-};
-
-
-const int pylith::faults::CohesiveDynLDataTet4::_numConstraintVert = 3;
-const int pylith::faults::CohesiveDynLDataTet4::_constraintVertices[] = {
- 10, 11, 12
-};
-
-// ----------------------------------------------------------------------
-// Stick case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrStick[] = {
- 1.1, 2.1, 35.1,
- 1.2, 2.2, 35.2, // 3
- 1.3, 2.3, 35.3, // 4
- 1.4, 2.4, 35.4, // 5
- 1.5, 2.5, 35.5,
- 1.6, 2.6, 35.6, // 7
- 1.8, 2.8, 35.8, // 8
- 1.0, 2.0, 35.0, // 9
- 1.7, 2.7, -35.7, // 10
- 1.9, 2.9, -35.9, // 11
- 1.1, 2.1, -35.1, // 12
-};
-
-// No change in fieldIncr
-// Zero slip
-
-// ----------------------------------------------------------------------
-// Slip case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrSlip[] = {
- 8.1, 9.1, 10.1,
- 8.2, 9.2, 10.2, // 3
- 8.3, 9.3, 10.3, // 4
- 8.4, 9.4, 10.4, // 5
- 8.5, 9.5, 10.5,
- 8.6, 9.6, 10.6, // 7
- 8.8, 9.8, 10.8, // 8
- 8.0, 9.0, 10.0, // 9
- 8.7, 9.7, -10.7, // 10
- 8.9, 9.9, -10.9, // 11
- 8.1, 9.1, -10.1, // 12
-};
-
-// Output
-// :TODO: Update Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrSlipE[] = {
- 8.1, 9.1, 10.1,
- 8.2, 9.2, 10.2, // 3
- 8.3, 9.3, 10.3, // 4
- 8.4, 9.4, 10.4, // 5
- 8.5, 9.5, 10.5,
- 8.6, 9.6, 10.6, // 7
- 8.8, 9.8, 10.8, // 8
- 8.0, 9.0, 10.0, // 9
- -6.90156, -7.80418, -10.7, // 10
- -7.08708, -7.9903, -10.9, // 11
- -6.27887, -7.17083, -10.1, // 12
-};
-
-// :TODO: Update slip values based on changes in Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataTet4::_slipSlipE[] = {
- 31.203110740589327, 35.008368147978267, 0.0,
- 31.974152400186210, 35.780599114494088, 0.0,
- 28.757749464750159, 32.541663868006758, 0.0,
-};
-
-// ----------------------------------------------------------------------
-// Open case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrOpen[] = {
- 8.1, 9.1, 10.1,
- 8.2, 9.2, 10.2, // 3
- 8.3, 9.3, 10.3, // 4
- 8.4, 9.4, 10.4, // 5
- 8.5, 9.5, 10.5,
- 8.6, 9.6, 10.6, // 7
- 8.8, 9.8, 10.8, // 8
- 8.0, 9.0, 10.0, // 9
- 8.7, 9.7, 10.7, // 10
- 8.9, 9.9, 10.9, // 11
- 8.1, 9.1, 10.1, // 12
-};
-
-// Output
-const double pylith::faults::CohesiveDynLDataTet4::_fieldIncrOpenE[] = {
- 8.1, 9.1, 10.1,
- 8.2, 9.2, 10.2, // 3
- 8.3, 9.3, 10.3, // 4
- 8.4, 9.4, 10.4, // 5
- 8.5, 9.5, 10.5,
- 8.6, 9.6, 10.6, // 7
- 8.8, 9.8, 10.8, // 8
- 8.0, 9.0, 10.0, // 9
- -7.7, -8.7, -9.7, // 10
- -7.9, -8.9, -9.9, // 11
- -7.1, -8.1, -9.1, // 12
-};
-
-const double pylith::faults::CohesiveDynLDataTet4::_slipOpenE[] = {
- 32.8, 36.8, 40.8,
- 33.6, 37.6, 41.6,
- 30.4, 34.4, 38.4,
-};
-
-// ----------------------------------------------------------------------
-pylith::faults::CohesiveDynLDataTet4::CohesiveDynLDataTet4(void)
-{ // constructor
- meshFilename = const_cast<char*>(_meshFilename);
- spaceDim = _spaceDim;
- cellDim = _cellDim;
- numBasis = _numBasis;
- numQuadPts = _numQuadPts;
- quadPts = const_cast<double*>(_quadPts);
- quadWts = const_cast<double*>(_quadWts);
- basis = const_cast<double*>(_basis);
- basisDeriv = const_cast<double*>(_basisDeriv);
- verticesRef = const_cast<double*>(_verticesRef);
- id = _id;
- label = const_cast<char*>(_label);
- initialTractFilename = const_cast<char*>(_initialTractFilename);
-
- fieldT = const_cast<double*>(_fieldT);
- jacobian = const_cast<double*>(_jacobian);
- orientation = const_cast<double*>(_orientation);
- area = const_cast<double*>(_area);
- initialTractions = const_cast<double*>(_initialTractions);
-
- constraintVertices = const_cast<int*>(_constraintVertices);
- numConstraintVert = _numConstraintVert;
-
- // Stick
- fieldIncrStick = const_cast<double*>(_fieldIncrStick);
-
- // Slip
- fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
- fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
- slipSlipE = const_cast<double*>(_slipSlipE);
-
- // Open
- fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
- fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
- slipOpenE = const_cast<double*>(_slipOpenE);
-} // constructor
-
-pylith::faults::CohesiveDynLDataTet4::~CohesiveDynLDataTet4(void)
-{}
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTet4.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,77 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#if !defined(pylith_faults_cohesivedynldatatet4_hh)
-#define pylith_faults_cohesivedynldatatet4_hh
-
-#include "CohesiveDynLData.hh"
-
-namespace pylith {
- namespace faults {
- class CohesiveDynLDataTet4;
- } // pylith
-} // faults
-
-class pylith::faults::CohesiveDynLDataTet4 : public CohesiveDynLData
-{
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public:
-
- /// Constructor
- CohesiveDynLDataTet4(void);
-
- /// Destructor
- ~CohesiveDynLDataTet4(void);
-
-// PRIVATE MEMBERS //////////////////////////////////////////////////////
-private:
-
- static const char* _meshFilename; ///< Filename of input mesh
-
- static const int _spaceDim; ///< Number of dimensions in vertex coordinates
- static const int _cellDim; ///< Number of dimensions associated with cell
-
- static const int _numBasis; ///< Number of vertices in cell
- static const int _numQuadPts; ///< Number of quadrature points
- static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
- static const double _quadWts[]; ///< Weights of quadrature points
- static const double _basis[]; ///< Basis fns at quadrature points
- static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
- static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
-
- static const int _id; ///< Fault material identifier
- static const char* _label; ///< Label for fault
- static const char* _initialTractFilename; ///< Name of db for initial tractions.
-
- static const double _fieldT[]; ///< Solution field at time t.
- static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
- static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
- static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
- static const double _jacobian[]; ///< Jacobian sparse matrix.
-
- static const double _orientation[]; ///< Expected values for fault orientation.
- static const double _area[]; ///< Expected values for fault area.
- static const double _initialTractions[]; ///< Expected values for initial tractions.
- static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
- static const double _slipSlipE[]; ///< Expected values for slip for slip case.
- static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
- static const double _slipOpenE[]; ///< Expected values for slip for opening case.
- static const int _constraintVertices[]; ///< Expected points for constraint vertices
- static const int _numConstraintVert; ///< Number of constraint vertices
-
-};
-
-#endif // pylith_faults_cohesivedynldatatet4_hh
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,388 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-/* Original mesh using Sieve labels.
- *
- * Cells are 0-1, vertices are 2-5.
- *
- * 3
- * /|\
- * / | \
- * / | \
- * / | \
- * 2 | 5
- * \ | /
- * \ | /
- * \ | /
- * \|/
- * 4
- *
- *
- * After adding cohesive elements using Sieve labels.
- *
- * Cells are 0-1, 8, vertices are 2-7.
- *
- * 6 -8- 3
- * /| |\
- * / | | \
- * / | | \
- * / | | \
- * 2 | | 5
- * \ | | /
- * \ | | /
- * \ | | /
- * \| |/
- * 7 -9- 4
- */
-
-#include "CohesiveDynLDataTri3.hh"
-
-const char* pylith::faults::CohesiveDynLDataTri3::_meshFilename =
- "data/tri3.mesh";
-
-const int pylith::faults::CohesiveDynLDataTri3::_spaceDim = 2;
-
-const int pylith::faults::CohesiveDynLDataTri3::_cellDim = 1;
-
-const int pylith::faults::CohesiveDynLDataTri3::_numBasis = 2;
-
-const int pylith::faults::CohesiveDynLDataTri3::_numQuadPts = 1;
-
-const double pylith::faults::CohesiveDynLDataTri3::_quadPts[] = {
- 0.0,
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_quadWts[] = {
- 2.0,
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_basis[] = {
- 0.5,
- 0.5
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_basisDeriv[] = {
- -0.5,
- 0.5
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_verticesRef[] = {
- -1.0, 1.0
-};
-
-const int pylith::faults::CohesiveDynLDataTri3::_id = 10;
-
-const char* pylith::faults::CohesiveDynLDataTri3::_label = "fault";
-
-const char* pylith::faults::CohesiveDynLDataTri3::_initialTractFilename =
- "data/tri3_initialtract.spatialdb";
-
-const double pylith::faults::CohesiveDynLDataTri3::_fieldT[] = {
- 8.1, 9.1,
- 8.2, 9.2, // 3
- 8.3, 9.3, // 4
- 8.4, 9.4,
- 8.5, 9.5, // 6
- 8.7, 9.7, // 7
- 8.6, 9.6, // 8
- 8.8, 9.8, // 9
-};
-
-// :TODO: Make sensible values for Jacobian for DOF on positive and
-// negative sides of the fault. Add semi-random values for other DOF.
-const double pylith::faults::CohesiveDynLDataTri3::_jacobian[] = {
- 1.0, 1.1, // 2x (values for row associated with vertex with label 2, x DOF)
- 0.1, 1.2,
- 0.2, 1.3,
- 0.3, 1.4,
- 0.4, 1.5,
- 0.5, 1.6,
- 0.6, 1.7,
- 0.7, 1.8,
- 2.1, 1.0, // 2y
- 2.2, 3.1,
- 2.3, 3.2,
- 2.4, 3.3,
- 2.5, 3.4,
- 2.6, 3.5,
- 2.7, 3.6,
- 2.8, 3.7,
- 4.1, 5.1, // 3x (values for row associated with vertex label 3, x DOF)
- 1.0, 5.2,
- 4.2, 5.3,
- 4.3, 5.4,
- 4.4, 5.5,
- 4.5, 5.6,
- 4.6,+1.0, // 8 (column for DOF associated with vertex label 8)
- 4.7, 5.7,
- 6.1, 7.1, // 3y
- 6.2, 1.0,
- 6.3, 7.2,
- 6.4, 7.3,
- 6.5, 7.4,
- 6.6, 7.5,
- +1.0, 7.6, // 8
- 6.7, 7.7,
- 8.1, 9.1, // 4x
- 8.2, 9.2,
- 1.0, 9.3,
- 8.3, 9.4,
- 8.4, 9.5,
- 8.5, 9.6,
- 8.6, 9.7,
- 8.7,+1.0, // 9
- 10.1, 11.1, // 4y
- 10.2, 11.2,
- 10.3, 1.0,
- 10.4, 11.3,
- 10.5, 11.4,
- 10.6, 11.5,
- 10.7, 11.6,
- +1.0, 11.7, // 9
- 12.1, 13.1, // 5x
- 12.2, 13.2,
- 12.3, 13.3,
- 1.0, 13.4,
- 12.4, 13.5,
- 12.5, 13.6,
- 12.6, 13.7,
- 12.7, 13.8,
- 14.1, 15.1, // 5y
- 14.2, 15.2,
- 14.3, 15.3,
- 14.4, 1.0,
- 14.5, 15.4,
- 14.6, 15.5,
- 14.7, 15.6,
- 14.8, 15.7,
- 16.1, 17.1, // 6x
- 16.2, 17.2,
- 16.3, 17.3,
- 16.4, 17.4,
- 1.0, 17.5,
- 16.5, 17.6,
- 16.6,-1.0, // 8
- 16.7, 17.7,
- 18.1, 19.1, // 6y
- 18.2, 19.2,
- 18.3, 19.3,
- 18.4, 19.4,
- 18.5, 1.0,
- 18.6, 19.5,
- -1.0, 19.6, // 8
- 18.7, 19.7,
- 20.1, 21.1, // 7x
- 20.2, 21.2,
- 20.3, 21.3,
- 20.4, 21.4,
- 20.5, 21.5,
- 1.0, 21.6,
- 20.6, 21.7,
- 20.7,-1.0, // 9
- 22.1, 23.1, // 7y
- 22.2, 23.2,
- 22.3, 23.3,
- 22.4, 23.4,
- 22.5, 23.5,
- 22.6, 1.0,
- 22.7, 23.6,
- -1.0, 23.7, // 9
-
- 24.1, 25.1, // 8x (rows associated with Lagrange multiplier vertex label 8)
- 24.2,+1.0, // 3
- 24.3, 25.2,
- 24.4, 25.3,
- 24.5,-1.0, // 6
- 24.6, 25.4,
- 24.7, 25.5,
- 24.8, 25.6,
- 26.1, 27.1, // 8y
- +1.0, 27.2, // 3
- 26.2, 27.3,
- 26.3, 27.4,
- -1.0, 27.5, // 6
- 26.4, 27.6,
- 26.5, 27.7,
- 26.6, 27.8,
-
- 29.1, 30.1, // 9x
- 29.2, 30.2,
- 29.3,+1.0, // 4
- 29.4, 30.3,
- 29.5, 30.4,
- 29.6,-1.0, // 7
- 29.7, 30.5,
- 29.8, 30.6,
- 31.1, 32.1, // 9y
- 31.2, 32.2,
- +1.0, 32.3, // 4
- 31.3, 32.4,
- 31.4, 32.5,
- -1.0, 32.6, // 7
- 31.5, 32.7,
- 31.6, 32.8,
-};
-
-// ----------------------------------------------------------------------
-// Computed values
-// ----------------------------------------------------------------------
-
-const double pylith::faults::CohesiveDynLDataTri3::_orientation[] = {
- 0.0, -1.0, -1.0, 0.0,
- 0.0, -1.0, -1.0, 0.0
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_area[] = {
- 1.0,
- 1.0,
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_initialTractions[] = {
- 1.0, -2.0,
- 1.1, -2.1,
-};
-
-
-const int pylith::faults::CohesiveDynLDataTri3::_numConstraintVert = 2;
-const int pylith::faults::CohesiveDynLDataTri3::_constraintVertices[] = {
- 8, 9
-};
-
-// ----------------------------------------------------------------------
-// Stick case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTri3::_fieldIncrStick[] = {
- 1.1, 29.1,
- 1.2, 29.2, // 3
- 1.3, 29.3, // 4
- 1.4, 29.4,
- 1.5, 29.5, // 6
- 1.7, 29.7, // 7
- 1.6, -29.6, // 8
- 1.8, -29.8, // 9
-};
-
-// No change in fieldIncr
-// Zero slip
-
-// ----------------------------------------------------------------------
-// Slip case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTri3::_fieldIncrSlip[] = {
- 9.1, 10.1,
- 9.2, 10.2, // 3
- 9.3, 10.3, // 4
- 9.4, 10.4,
- 9.5, 10.5, // 6
- 9.7, 10.7, // 7
- 9.6, -10.6, // 8
- 9.8, -10.8, // 9
-};
-
-// Output
-// :TODO: Update Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataTri3::_fieldIncrSlipE[] = {
- 9.1, 10.1,
- 9.2, 10.2, // 3
- 9.3, 10.3, // 4
- 9.4, 10.4,
- 9.5, 10.5, // 6
- 9.7, 10.7, // 7
- -6.8, -10.6, // 8
- -6.94, -10.8, // 9
-};
-
-// :TODO: Update slip values based on changes in Lagrange multiplier values
-const double pylith::faults::CohesiveDynLDataTri3::_slipSlipE[] = {
- 32.8, 0.0,
- 33.48, 0.0,
-};
-
-// ----------------------------------------------------------------------
-// Open case
-// ----------------------------------------------------------------------
-// Input
-const double pylith::faults::CohesiveDynLDataTri3::_fieldIncrOpen[] = {
- 9.1, 10.1,
- 9.2, 10.2, // 3
- 9.3, 10.3, // 4
- 9.4, 10.4,
- 9.5, 10.5, // 6
- 9.7, 10.7, // 7
- 9.6, 10.6, // 8
- 9.8, 10.8, // 9
-};
-
-// Output
-const double pylith::faults::CohesiveDynLDataTri3::_fieldIncrOpenE[] = {
- 9.1, 10.1,
- 9.2, 10.2, // 3
- 9.3, 10.3, // 4
- 9.4, 10.4,
- 9.5, 10.5, // 6
- 9.7, 10.7, // 7
- -8.6, -9.6, // 8
- -8.8, -9.8, // 9
-};
-
-const double pylith::faults::CohesiveDynLDataTri3::_slipOpenE[] = {
- 36.4, 40.4,
- 37.2, 41.2,
-};
-
-// ----------------------------------------------------------------------
-pylith::faults::CohesiveDynLDataTri3::CohesiveDynLDataTri3(void)
-{ // constructor
- meshFilename = const_cast<char*>(_meshFilename);
- spaceDim = _spaceDim;
- cellDim = _cellDim;
- numBasis = _numBasis;
- numQuadPts = _numQuadPts;
- quadPts = const_cast<double*>(_quadPts);
- quadWts = const_cast<double*>(_quadWts);
- basis = const_cast<double*>(_basis);
- basisDeriv = const_cast<double*>(_basisDeriv);
- verticesRef = const_cast<double*>(_verticesRef);
- id = _id;
- label = const_cast<char*>(_label);
- initialTractFilename = const_cast<char*>(_initialTractFilename);
-
- fieldT = const_cast<double*>(_fieldT);
- jacobian = const_cast<double*>(_jacobian);
- orientation = const_cast<double*>(_orientation);
- area = const_cast<double*>(_area);
- initialTractions = const_cast<double*>(_initialTractions);
-
- constraintVertices = const_cast<int*>(_constraintVertices);
- numConstraintVert = _numConstraintVert;
-
- // Stick
- fieldIncrStick = const_cast<double*>(_fieldIncrStick);
-
- // Slip
- fieldIncrSlip = const_cast<double*>(_fieldIncrSlip);
- fieldIncrSlipE = const_cast<double*>(_fieldIncrSlipE);
- slipSlipE = const_cast<double*>(_slipSlipE);
-
- // Open
- fieldIncrOpen = const_cast<double*>(_fieldIncrOpen);
- fieldIncrOpenE = const_cast<double*>(_fieldIncrOpenE);
- slipOpenE = const_cast<double*>(_slipOpenE);
-} // constructor
-
-pylith::faults::CohesiveDynLDataTri3::~CohesiveDynLDataTri3(void)
-{}
-
-
-// End of file
Deleted: short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/faults/data/CohesiveDynLDataTri3.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,77 +0,0 @@
-// -*- C++ -*-
-//
-// ======================================================================
-//
-// Brad T. Aagaard
-// U.S. Geological Survey
-//
-// {LicenseText}
-//
-// ======================================================================
-//
-
-#if !defined(pylith_faults_cohesivedynldatatri3_hh)
-#define pylith_faults_cohesivedynldatatri3_hh
-
-#include "CohesiveDynLData.hh"
-
-namespace pylith {
- namespace faults {
- class CohesiveDynLDataTri3;
- } // pylith
-} // faults
-
-class pylith::faults::CohesiveDynLDataTri3 : public CohesiveDynLData
-{
-
-// PUBLIC METHODS ///////////////////////////////////////////////////////
-public:
-
- /// Constructor
- CohesiveDynLDataTri3(void);
-
- /// Destructor
- ~CohesiveDynLDataTri3(void);
-
-// PRIVATE MEMBERS //////////////////////////////////////////////////////
-private:
-
- static const char* _meshFilename; ///< Filename of input mesh
-
- static const int _spaceDim; ///< Number of dimensions in vertex coordinates
- static const int _cellDim; ///< Number of dimensions associated with cell
-
- static const int _numBasis; ///< Number of vertices in cell
- static const int _numQuadPts; ///< Number of quadrature points
- static const double _quadPts[]; ///< Coordinates of quad pts in ref cell
- static const double _quadWts[]; ///< Weights of quadrature points
- static const double _basis[]; ///< Basis fns at quadrature points
- static const double _basisDeriv[]; ///< Derivatives of basis fns at quad pts
- static const double _verticesRef[]; ///< Coordinates of vertices in ref cell (dual basis)
-
- static const int _id; ///< Fault material identifier
- static const char* _label; ///< Label for fault
- static const char* _initialTractFilename; ///< Name of db for initial tractions.
-
- static const double _fieldT[]; ///< Solution field at time t.
- static const double _fieldIncrStick[]; ///< Solution increment at time t for stick case.
- static const double _fieldIncrSlip[]; ///< Solution increment at time t for slip case.
- static const double _fieldIncrOpen[]; ///< Solution increment at time t for opening case.
- static const double _jacobian[]; ///< Jacobian sparse matrix.
-
- static const double _orientation[]; ///< Expected values for fault orientation.
- static const double _area[]; ///< Expected values for fault area.
- static const double _initialTractions[]; ///< Expected values for initial tractions.
- static const double _fieldIncrSlipE[]; ///< Expected values for solution increment for slip case.
- static const double _slipSlipE[]; ///< Expected values for slip for slip case.
- static const double _fieldIncrOpenE[]; ///< Expected values for solution increment for opening case.
- static const double _slipOpenE[]; ///< Expected values for slip for opening case.
- static const int _constraintVertices[]; ///< Expected points for constraint vertices
- static const int _numConstraintVert; ///< Number of constraint vertices
-
-};
-
-#endif // pylith_faults_cohesivedynldatatri3_hh
-
-
-// End of file
Modified: short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -20,7 +20,7 @@
#include "pylith/topology/Field.hh" // USES Field
#include "pylith/meshio/MeshIOAscii.hh" // USES MeshIOAscii
#include "pylith/friction/StaticFriction.hh" // USES StaticFriction
-#include "pylith/faults/FaultCohesiveDynL.hh" // USES FaultCohesiveDynL
+#include "pylith/faults/FaultCohesiveDyn.hh" // USES FaultCohesiveDyn
#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
#include "pylith/feassemble/GeometryLine2D.hh" // USES GeometryLine2D
@@ -124,7 +124,7 @@
const int numProperties = 1;
topology::Mesh mesh;
- faults::FaultCohesiveDynL fault;
+ faults::FaultCohesiveDyn fault;
StaticFriction friction;
StaticFrictionData data;
_initialize(&mesh, &fault, &friction, &data);
@@ -178,7 +178,7 @@
const int fiberDim = 1;
topology::Mesh mesh;
- faults::FaultCohesiveDynL fault;
+ faults::FaultCohesiveDyn fault;
StaticFriction friction;
StaticFrictionData data;
_initialize(&mesh, &fault, &friction, &data);
@@ -226,7 +226,7 @@
const int vertex = 2;
topology::Mesh mesh;
- faults::FaultCohesiveDynL fault;
+ faults::FaultCohesiveDyn fault;
StaticFriction friction;
StaticFrictionData data;
_initialize(&mesh, &fault, &friction, &data);
@@ -274,7 +274,7 @@
const int vertex = 2;
topology::Mesh mesh;
- faults::FaultCohesiveDynL fault;
+ faults::FaultCohesiveDyn fault;
StaticFriction friction;
StaticFrictionData data;
_initialize(&mesh, &fault, &friction, &data);
@@ -630,7 +630,7 @@
void
pylith::friction::TestFrictionModel::_initialize(
topology::Mesh* mesh,
- faults::FaultCohesiveDynL* fault,
+ faults::FaultCohesiveDyn* fault,
StaticFriction* friction,
const StaticFrictionData* data)
{ // _initialize
Modified: short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestFrictionModel.hh 2010-02-19 20:08:42 UTC (rev 16280)
@@ -149,7 +149,7 @@
* @param data Data with properties for friction model.
*/
void _initialize(topology::Mesh* mesh,
- faults::FaultCohesiveDynL* fault,
+ faults::FaultCohesiveDyn* fault,
StaticFriction* friction,
const StaticFrictionData* data);
Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterVTKFaultMesh.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterVTKFaultMesh.cc 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/TestDataWriterVTKFaultMesh.cc 2010-02-19 20:08:42 UTC (rev 16280)
@@ -221,9 +221,7 @@
fault.label(_data->faultLabel);
fault.id(_data->faultId);
fault.adjustTopology(_mesh, &firstFaultVertex, &firstLagrangeVertex, &firstFaultCell, _flipFault);
- std::map<Mesh::point_type, Mesh::point_type> cohesiveToFault;
- faults::CohesiveTopology::createFaultParallel(_faultMesh, &cohesiveToFault,
- *_mesh, _data->faultId,
+ faults::CohesiveTopology::createFaultParallel(_faultMesh, *_mesh, _data->faultId,
constraintCell);
} // _initialize
Copied: short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py (from rev 16277, short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDynL.py)
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py (rev 0)
+++ short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDyn.py 2010-02-19 20:08:42 UTC (rev 16280)
@@ -0,0 +1,339 @@
+#!/usr/bin/env python
+#
+# ======================================================================
+#
+# Brad T. Aagaard
+# U.S. Geological Survey
+#
+# {LicenseText}
+#
+# ======================================================================
+#
+
+## @file unittests/pytests/faults/TestFaultCohesiveDyn.py
+
+## @brief Unit testing of FaultCohesiveDyn object.
+
+import unittest
+
+from pylith.faults.FaultCohesiveDyn import FaultCohesiveDyn
+
+from spatialdata.geocoords.CSCart import CSCart
+from pyre.units.time import second
+
+# ----------------------------------------------------------------------
+class TestFaultCohesiveDyn(unittest.TestCase):
+ """
+ Unit testing of Fault object.
+ """
+
+ def test_constructor(self):
+ """
+ Test constructor.
+ """
+ fault = FaultCohesiveDyn()
+ return
+
+
+ def test_configure(self):
+ """
+ Test _configure().
+ """
+ fault = FaultCohesiveDyn()
+ fault._configure()
+ return
+
+
+ def test_implementsIntegrator(self):
+ """
+ Test to make sure FaultCohesiveDyn satisfies integrator requirements.
+ """
+ fault = FaultCohesiveDyn()
+ from pylith.feassemble.Integrator import implementsIntegrator
+ self.failUnless(implementsIntegrator(fault))
+ return
+
+
+ def test_adjustTopology(self):
+ """
+ Test adjustTopology().
+
+ WARNING: This is not a rigorous test of adjustTopology() because we
+ neither set the input fields or verify the results.
+ """
+ cs = CSCart()
+ cs.inventory.spaceDim = 2
+ cs._configure()
+
+ from spatialdata.units.Nondimensional import Nondimensional
+ normalizer = Nondimensional()
+ normalizer._configure()
+
+ from pylith.meshio.MeshIOAscii import MeshIOAscii
+ importer = MeshIOAscii()
+ importer.inventory.filename = "data/tri3.mesh"
+ importer.inventory.coordsys = cs
+ importer._configure()
+ mesh = importer.read(debug=False, interpolate=False)
+
+ fault = FaultCohesiveDyn()
+ fault.inventory.matId = 10
+ fault.inventory.faultLabel = "fault"
+ fault._configure()
+
+ nvertices = fault.numVertices(mesh)
+ firstFaultVertex = 0
+ firstLagrangeVertex = nvertices
+ firstFaultCell = 2*nvertices
+ fault.adjustTopology(mesh, firstFaultVertex, firstLagrangeVertex,
+ firstFaultCell)
+
+ # We should really add something here to check to make sure things
+ # actually initialized correctly
+ return
+
+
+ def test_initialize(self):
+ """
+ Test initialize().
+
+ WARNING: This is not a rigorous test of initialize() because we
+ neither set the input fields or verify the results.
+ """
+ (mesh, fault, fields) = self._initialize()
+
+ # We should really add something here to check to make sure things
+ # actually initialized correctly
+ return
+
+
+ def test_timeStep(self):
+ """
+ Test timeStep().
+ """
+ dt = 2.4
+ (mesh, fault, fields) = self._initialize()
+ fault.timeStep(dt)
+
+ # No test of result
+ return
+
+
+ def test_stableTimeStep(self):
+ """
+ Test stableTimeStep().
+ """
+ (mesh, fault, fields) = self._initialize()
+
+ self.assertEqual(1.0e+30, fault.stableTimeStep(mesh))
+ return
+
+
+ def test_needNewJacobian(self):
+ """
+ Test needNewJacobian().
+ """
+ (mesh, fault, fields) = self._initialize()
+ self.assertEqual(True, fault.needNewJacobian())
+ return
+
+
+ def test_useSolnIncr(self):
+ """
+ Test useSolnIncr().
+ """
+ (mesh, fault, fields) = self._initialize()
+ fault.useSolnIncr(True)
+
+ # We should really add something here to check to make sure things
+ # actually initialized correctly
+ return
+
+
+ def test_integrateResidual(self):
+ """
+ Test integrateResidual().
+
+ WARNING: This is not a rigorous test of integrateResidual() because we
+ neither set the input fields or verify the results.
+ """
+ (mesh, fault, fields) = self._initialize()
+
+ residual = fields.get("residual")
+ t = 1.0
+ fault.integrateResidual(residual, t, fields)
+
+ # We should really add something here to check to make sure things
+ # actually initialized correctly
+ return
+
+
+ def test_integrateJacobian(self):
+ """
+ Test integrateJacobian().
+
+ WARNING: This is not a rigorous test of integrateJacobian() because we
+ neither set the input fields or verify the results.
+ """
+ (mesh, fault, fields) = self._initialize()
+
+ from pylith.topology.Jacobian import Jacobian
+ jacobian = Jacobian(fields)
+ jacobian.zero()
+ t = 1.0
+ fault.integrateJacobian(jacobian, t, fields)
+ self.assertEqual(False, fault.needNewJacobian())
+
+ # We should really add something here to check to make sure things
+ # actually initialized correctly
+ return
+
+
+ def test_poststep(self):
+ """
+ Test poststep().
+
+ WARNING: This is not a rigorous test of poststep() because we
+ neither set the input fields or verify the results.
+ """
+ (mesh, fault, fields) = self._initialize()
+
+ t = 0.50
+ residual = fields.get("residual")
+ fault.integrateResidual(residual, t, fields)
+
+ dt = 0.1
+ totalTime = 5
+ fault.poststep(t, dt, totalTime, fields)
+
+ # We should really add something here to check to make sure things
+ # actually initialized correctly
+ return
+
+
+ def test_finalize(self):
+ """
+ Test finalize().
+
+ WARNING: This is not a rigorous test of finalize() because we
+ neither set the input fields or verify the results.
+ """
+ (mesh, fault, fields) = self._initialize()
+
+ fault.finalize()
+
+ # We should really add something here to check to make sure things
+ # actually initialized correctly.
+ return
+
+
+ def test_factory(self):
+ """
+ Test factory method.
+ """
+ from pylith.faults.FaultCohesiveDyn import fault
+ f = fault()
+ return
+
+
+ # PRIVATE METHODS ////////////////////////////////////////////////////
+
+ def _initialize(self):
+ """
+ Initialize fault.
+ """
+ dt = 2.4
+
+ from spatialdata.units.Nondimensional import Nondimensional
+ normalizer = Nondimensional()
+ normalizer._configure()
+
+ # Setup mesh
+ cs = CSCart()
+ cs.inventory.spaceDim = 2
+ cs._configure()
+
+ from pylith.meshio.MeshIOAscii import MeshIOAscii
+ importer = MeshIOAscii()
+ importer.inventory.filename = "data/tri3.mesh"
+ importer.inventory.coordsys = cs
+ importer._configure()
+ mesh = importer.read(debug=False, interpolate=False)
+
+ # Setup quadrature
+ from pylith.feassemble.FIATSimplex import FIATSimplex
+ cell = FIATSimplex()
+ cell.inventory.shape = "line"
+ cell.inventory.degree = 1
+ cell.inventory.order = 1
+ cell._configure()
+ from pylith.feassemble.Quadrature import SubMeshQuadrature
+ quadrature = SubMeshQuadrature()
+ quadrature.inventory.cell = cell
+ quadrature._configure()
+
+ # Setup earthquake source
+ from spatialdata.spatialdb.SimpleDB import SimpleDB
+ from spatialdata.spatialdb.SimpleIOAscii import SimpleIOAscii
+ ioTractions = SimpleIOAscii()
+ ioTractions.inventory.filename = "data/tri3_initialtractions.spatialdb"
+ ioTractions._configure()
+ dbTractions = SimpleDB()
+ dbTractions.inventory.iohandler = ioTractions
+ dbTractions.inventory.label = "initial tractions"
+ dbTractions._configure()
+
+ ioFriction = SimpleIOAscii()
+ ioFriction.inventory.filename = "data/tri3_staticfriction.spatialdb"
+ ioFriction._configure()
+ dbFriction = SimpleDB()
+ dbFriction.inventory.iohandler = ioFriction
+ dbFriction.inventory.label = "friction"
+ dbFriction._configure()
+
+ from pylith.friction.StaticFriction import StaticFriction
+ friction = StaticFriction()
+ friction.inventory.dbProperties = dbFriction
+ friction._configure()
+
+ # Setup fault
+ fault = FaultCohesiveDyn()
+ fault.inventory.output.inventory.writer._configure()
+ fault.inventory.output._configure()
+ fault.inventory.matId = 10
+ fault.inventory.faultLabel = "fault"
+ fault.inventory.upDir = [0, 0, 1]
+ fault.inventory.normalDir = [1, 0, 0]
+ fault.inventory.faultQuadrature = quadrature
+ fault.inventory.friction = friction
+ fault._configure()
+
+ nvertices = fault.numVertices(mesh)
+ firstFaultVertex = 0
+ firstLagrangeVertex = nvertices
+ firstFaultCell = 2*nvertices
+ fault.adjustTopology(mesh, firstFaultVertex, firstLagrangeVertex,
+ firstFaultCell)
+ fault.preinitialize(mesh)
+ fault.timeStep(dt)
+ fault.verifyConfiguration()
+ from pyre.units.time import s
+ fault.initialize(totalTime=0.0*s, numTimeSteps=1, normalizer=normalizer)
+
+ # Setup fields
+ from pylith.topology.SolutionFields import SolutionFields
+ fields = SolutionFields(mesh)
+ fields.add("residual", "residual")
+ fields.add("dispIncr(t->t+dt)", "displacement_increment")
+ fields.add("disp(t)", "displacement")
+ fields.solutionName("dispIncr(t->t+dt)")
+ residual = fields.get("residual")
+ residual.newSection(residual.VERTICES_FIELD, cs.spaceDim())
+ residual.allocate()
+ residual.zero()
+ fields.copyLayout("residual")
+
+ return (mesh, fault, fields)
+
+
+# End of file
Deleted: short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDynL.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDynL.py 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/pytests/faults/TestFaultCohesiveDynL.py 2010-02-19 20:08:42 UTC (rev 16280)
@@ -1,339 +0,0 @@
-#!/usr/bin/env python
-#
-# ======================================================================
-#
-# Brad T. Aagaard
-# U.S. Geological Survey
-#
-# {LicenseText}
-#
-# ======================================================================
-#
-
-## @file unittests/pytests/faults/TestFaultCohesiveDynL.py
-
-## @brief Unit testing of FaultCohesiveDynL object.
-
-import unittest
-
-from pylith.faults.FaultCohesiveDynL import FaultCohesiveDynL
-
-from spatialdata.geocoords.CSCart import CSCart
-from pyre.units.time import second
-
-# ----------------------------------------------------------------------
-class TestFaultCohesiveDynL(unittest.TestCase):
- """
- Unit testing of Fault object.
- """
-
- def test_constructor(self):
- """
- Test constructor.
- """
- fault = FaultCohesiveDynL()
- return
-
-
- def test_configure(self):
- """
- Test _configure().
- """
- fault = FaultCohesiveDynL()
- fault._configure()
- return
-
-
- def test_implementsIntegrator(self):
- """
- Test to make sure FaultCohesiveDynL satisfies integrator requirements.
- """
- fault = FaultCohesiveDynL()
- from pylith.feassemble.Integrator import implementsIntegrator
- self.failUnless(implementsIntegrator(fault))
- return
-
-
- def test_adjustTopology(self):
- """
- Test adjustTopology().
-
- WARNING: This is not a rigorous test of adjustTopology() because we
- neither set the input fields or verify the results.
- """
- cs = CSCart()
- cs.inventory.spaceDim = 2
- cs._configure()
-
- from spatialdata.units.Nondimensional import Nondimensional
- normalizer = Nondimensional()
- normalizer._configure()
-
- from pylith.meshio.MeshIOAscii import MeshIOAscii
- importer = MeshIOAscii()
- importer.inventory.filename = "data/tri3.mesh"
- importer.inventory.coordsys = cs
- importer._configure()
- mesh = importer.read(debug=False, interpolate=False)
-
- fault = FaultCohesiveDynL()
- fault.inventory.matId = 10
- fault.inventory.faultLabel = "fault"
- fault._configure()
-
- nvertices = fault.numVertices(mesh)
- firstFaultVertex = 0
- firstLagrangeVertex = nvertices
- firstFaultCell = 2*nvertices
- fault.adjustTopology(mesh, firstFaultVertex, firstLagrangeVertex,
- firstFaultCell)
-
- # We should really add something here to check to make sure things
- # actually initialized correctly
- return
-
-
- def test_initialize(self):
- """
- Test initialize().
-
- WARNING: This is not a rigorous test of initialize() because we
- neither set the input fields or verify the results.
- """
- (mesh, fault, fields) = self._initialize()
-
- # We should really add something here to check to make sure things
- # actually initialized correctly
- return
-
-
- def test_timeStep(self):
- """
- Test timeStep().
- """
- dt = 2.4
- (mesh, fault, fields) = self._initialize()
- fault.timeStep(dt)
-
- # No test of result
- return
-
-
- def test_stableTimeStep(self):
- """
- Test stableTimeStep().
- """
- (mesh, fault, fields) = self._initialize()
-
- self.assertEqual(1.0e+30, fault.stableTimeStep(mesh))
- return
-
-
- def test_needNewJacobian(self):
- """
- Test needNewJacobian().
- """
- (mesh, fault, fields) = self._initialize()
- self.assertEqual(True, fault.needNewJacobian())
- return
-
-
- def test_useSolnIncr(self):
- """
- Test useSolnIncr().
- """
- (mesh, fault, fields) = self._initialize()
- fault.useSolnIncr(True)
-
- # We should really add something here to check to make sure things
- # actually initialized correctly
- return
-
-
- def test_integrateResidual(self):
- """
- Test integrateResidual().
-
- WARNING: This is not a rigorous test of integrateResidual() because we
- neither set the input fields or verify the results.
- """
- (mesh, fault, fields) = self._initialize()
-
- residual = fields.get("residual")
- t = 1.0
- fault.integrateResidual(residual, t, fields)
-
- # We should really add something here to check to make sure things
- # actually initialized correctly
- return
-
-
- def test_integrateJacobian(self):
- """
- Test integrateJacobian().
-
- WARNING: This is not a rigorous test of integrateJacobian() because we
- neither set the input fields or verify the results.
- """
- (mesh, fault, fields) = self._initialize()
-
- from pylith.topology.Jacobian import Jacobian
- jacobian = Jacobian(fields)
- jacobian.zero()
- t = 1.0
- fault.integrateJacobian(jacobian, t, fields)
- self.assertEqual(False, fault.needNewJacobian())
-
- # We should really add something here to check to make sure things
- # actually initialized correctly
- return
-
-
- def test_poststep(self):
- """
- Test poststep().
-
- WARNING: This is not a rigorous test of poststep() because we
- neither set the input fields or verify the results.
- """
- (mesh, fault, fields) = self._initialize()
-
- t = 0.50
- residual = fields.get("residual")
- fault.integrateResidual(residual, t, fields)
-
- dt = 0.1
- totalTime = 5
- fault.poststep(t, dt, totalTime, fields)
-
- # We should really add something here to check to make sure things
- # actually initialized correctly
- return
-
-
- def test_finalize(self):
- """
- Test finalize().
-
- WARNING: This is not a rigorous test of finalize() because we
- neither set the input fields or verify the results.
- """
- (mesh, fault, fields) = self._initialize()
-
- fault.finalize()
-
- # We should really add something here to check to make sure things
- # actually initialized correctly.
- return
-
-
- def test_factory(self):
- """
- Test factory method.
- """
- from pylith.faults.FaultCohesiveDynL import fault
- f = fault()
- return
-
-
- # PRIVATE METHODS ////////////////////////////////////////////////////
-
- def _initialize(self):
- """
- Initialize fault.
- """
- dt = 2.4
-
- from spatialdata.units.Nondimensional import Nondimensional
- normalizer = Nondimensional()
- normalizer._configure()
-
- # Setup mesh
- cs = CSCart()
- cs.inventory.spaceDim = 2
- cs._configure()
-
- from pylith.meshio.MeshIOAscii import MeshIOAscii
- importer = MeshIOAscii()
- importer.inventory.filename = "data/tri3.mesh"
- importer.inventory.coordsys = cs
- importer._configure()
- mesh = importer.read(debug=False, interpolate=False)
-
- # Setup quadrature
- from pylith.feassemble.FIATSimplex import FIATSimplex
- cell = FIATSimplex()
- cell.inventory.shape = "line"
- cell.inventory.degree = 1
- cell.inventory.order = 1
- cell._configure()
- from pylith.feassemble.Quadrature import SubMeshQuadrature
- quadrature = SubMeshQuadrature()
- quadrature.inventory.cell = cell
- quadrature._configure()
-
- # Setup earthquake source
- from spatialdata.spatialdb.SimpleDB import SimpleDB
- from spatialdata.spatialdb.SimpleIOAscii import SimpleIOAscii
- ioTractions = SimpleIOAscii()
- ioTractions.inventory.filename = "data/tri3_initialtractions.spatialdb"
- ioTractions._configure()
- dbTractions = SimpleDB()
- dbTractions.inventory.iohandler = ioTractions
- dbTractions.inventory.label = "initial tractions"
- dbTractions._configure()
-
- ioFriction = SimpleIOAscii()
- ioFriction.inventory.filename = "data/tri3_staticfriction.spatialdb"
- ioFriction._configure()
- dbFriction = SimpleDB()
- dbFriction.inventory.iohandler = ioFriction
- dbFriction.inventory.label = "friction"
- dbFriction._configure()
-
- from pylith.friction.StaticFriction import StaticFriction
- friction = StaticFriction()
- friction.inventory.dbProperties = dbFriction
- friction._configure()
-
- # Setup fault
- fault = FaultCohesiveDynL()
- fault.inventory.output.inventory.writer._configure()
- fault.inventory.output._configure()
- fault.inventory.matId = 10
- fault.inventory.faultLabel = "fault"
- fault.inventory.upDir = [0, 0, 1]
- fault.inventory.normalDir = [1, 0, 0]
- fault.inventory.faultQuadrature = quadrature
- fault.inventory.friction = friction
- fault._configure()
-
- nvertices = fault.numVertices(mesh)
- firstFaultVertex = 0
- firstLagrangeVertex = nvertices
- firstFaultCell = 2*nvertices
- fault.adjustTopology(mesh, firstFaultVertex, firstLagrangeVertex,
- firstFaultCell)
- fault.preinitialize(mesh)
- fault.timeStep(dt)
- fault.verifyConfiguration()
- from pyre.units.time import s
- fault.initialize(totalTime=0.0*s, numTimeSteps=1, normalizer=normalizer)
-
- # Setup fields
- from pylith.topology.SolutionFields import SolutionFields
- fields = SolutionFields(mesh)
- fields.add("residual", "residual")
- fields.add("dispIncr(t->t+dt)", "displacement_increment")
- fields.add("disp(t)", "displacement")
- fields.solutionName("dispIncr(t->t+dt)")
- residual = fields.get("residual")
- residual.newSection(residual.VERTICES_FIELD, cs.spaceDim())
- residual.allocate()
- residual.zero()
- fields.copyLayout("residual")
-
- return (mesh, fault, fields)
-
-
-# End of file
Modified: short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py 2010-02-18 21:19:26 UTC (rev 16279)
+++ short/3D/PyLith/trunk/unittests/pytests/faults/testfaults.py 2010-02-19 20:08:42 UTC (rev 16280)
@@ -77,8 +77,8 @@
from TestFaultCohesiveKin import TestFaultCohesiveKin
suite.addTest(unittest.makeSuite(TestFaultCohesiveKin))
- from TestFaultCohesiveDynL import TestFaultCohesiveDynL
- suite.addTest(unittest.makeSuite(TestFaultCohesiveDynL))
+ from TestFaultCohesiveDyn import TestFaultCohesiveDyn
+ suite.addTest(unittest.makeSuite(TestFaultCohesiveDyn))
from TestSingleRupture import TestSingleRupture
suite.addTest(unittest.makeSuite(TestSingleRupture))
More information about the CIG-COMMITS
mailing list