[cig-commits] r20857 - in short/3D/PyLith/trunk: . applications/utilities doc/releasenotes doc/userguide doc/userguide/benchmarks doc/userguide/benchmarks/savageprescott doc/userguide/benchmarks/strikeslip doc/userguide/boundaryconditions doc/userguide/cover doc/userguide/extending doc/userguide/fileformats doc/userguide/governingeqns doc/userguide/install doc/userguide/intro doc/userguide/materials doc/userguide/runpylith doc/userguide/tutorials doc/userguide/tutorials/3dhex8 doc/userguide/tutorials/3dhex8/dike doc/userguide/tutorials/3dhex8/friction doc/userguide/tutorials/3dhex8/gravity doc/userguide/tutorials/3dhex8/quasistatic doc/userguide/tutorials/3dhex8/static doc/userguide/tutorials/3dhex8/surfload doc/userguide/tutorials/3dtet4 doc/userguide/tutorials/greensfns2d doc/userguide/tutorials/shearwave doc/userguide/tutorials/subduction doc/userguide/tutorials/twohex8 doc/userguide/tutorials/twoquad4 doc/userguide/tutorials/twotet4 doc/userguide/tutorials/twotet4-geoproj doc/userguide/tutorials/twotri3 examples examples/3d/hex8 examples/bar_shearwave/hex8 examples/bar_shearwave/quad4 examples/bar_shearwave/tet4 examples/bar_shearwave/tri3 examples/meshing examples/meshing/surface_nurbs libsrc/pylith/bc libsrc/pylith/faults libsrc/pylith/feassemble libsrc/pylith/friction libsrc/pylith/materials libsrc/pylith/meshio libsrc/pylith/problems libsrc/pylith/topology modulesrc/feassemble modulesrc/friction modulesrc/materials modulesrc/mpi modulesrc/problems pylith pylith/apps pylith/feassemble pylith/friction pylith/materials pylith/problems tests/2d tests/2d/faultstrip tests/2d/frictionslide tests/2d/plasticity/cyclic tests/3d/cyclicfriction tests/3d/plasticity/dynamic tests_auto tests_auto/1d unittests/libtests/feassemble unittests/libtests/feassemble/data unittests/libtests/friction unittests/libtests/materials unittests/libtests/materials/data unittests/libtests/meshio unittests/libtests/meshio/data unittests/pytests/feassemble unittests/pytests/mpi unittests/pytests/problems

brad at geodynamics.org brad at geodynamics.org
Fri Oct 19 14:28:16 PDT 2012


Author: brad
Date: 2012-10-19 14:28:12 -0700 (Fri, 19 Oct 2012)
New Revision: 20857

Added:
   short/3D/PyLith/trunk/applications/utilities/pylith_eqinfo.in
   short/3D/PyLith/trunk/doc/releasenotes/announce_v1.8.0.txt
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_risetime.spatialdb
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_slip.spatialdb
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_sliptime.spatialdb
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_ratestateageing.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_slipweakening.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_staticfriction.cfg
   short/3D/PyLith/trunk/examples/meshing/cubit_cellsize/
   short/3D/PyLith/trunk/examples/meshing/surface_nurbs/merge_surfs/
   short/3D/PyLith/trunk/modulesrc/mpi/mpi_reduce.i
   short/3D/PyLith/trunk/pylith/apps/EqInfoApp.py
   short/3D/PyLith/trunk/pylith/problems/ExplicitTet4.py
   short/3D/PyLith/trunk/pylith/problems/ExplicitTri3.py
   short/3D/PyLith/trunk/tests/2d/stressoutput/
   short/3D/PyLith/trunk/tests_auto/eqinfo/
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell.xmf
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex.xmf
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell.xmf
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex.xmf
   short/3D/PyLith/trunk/unittests/pytests/mpi/TestReduce.py
Removed:
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_ratestateageing.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_slipweakening.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_staticfriction.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_risetime.spatialdb
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_slip.spatialdb
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_sliptime.spatialdb
   short/3D/PyLith/trunk/examples/meshing/surface_nurbs/shiftrot.py
   short/3D/PyLith/trunk/pylith/problems/ExplicitLumped.py
   short/3D/PyLith/trunk/pylith/problems/ExplicitLumpedTet4.py
   short/3D/PyLith/trunk/pylith/problems/ExplicitLumpedTri3.py
Modified:
   short/3D/PyLith/trunk/README
   short/3D/PyLith/trunk/TODO
   short/3D/PyLith/trunk/applications/utilities/Makefile.am
   short/3D/PyLith/trunk/configure.ac
   short/3D/PyLith/trunk/doc/userguide/benchmarks/benchmarks.lyx
   short/3D/PyLith/trunk/doc/userguide/benchmarks/savageprescott/savageprescott.lyx
   short/3D/PyLith/trunk/doc/userguide/benchmarks/strikeslip/strikeslip.lyx
   short/3D/PyLith/trunk/doc/userguide/boundaryconditions/boundaryconditions.lyx
   short/3D/PyLith/trunk/doc/userguide/components.lyx
   short/3D/PyLith/trunk/doc/userguide/cover/cover.pdf
   short/3D/PyLith/trunk/doc/userguide/cover/cover.svg.gz
   short/3D/PyLith/trunk/doc/userguide/cover/cover_small.jpg
   short/3D/PyLith/trunk/doc/userguide/extending/extending.lyx
   short/3D/PyLith/trunk/doc/userguide/fileformats/fileformats.lyx
   short/3D/PyLith/trunk/doc/userguide/governingeqns/governingeqns.lyx
   short/3D/PyLith/trunk/doc/userguide/install/install.lyx
   short/3D/PyLith/trunk/doc/userguide/intro/intro.lyx
   short/3D/PyLith/trunk/doc/userguide/materials/altformulations.lyx
   short/3D/PyLith/trunk/doc/userguide/materials/materials.lyx
   short/3D/PyLith/trunk/doc/userguide/preface.lyx
   short/3D/PyLith/trunk/doc/userguide/runpylith/runpylith.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/3dhex8.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/dike/dike.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/friction/friction.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/gravity/gravity.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/quasistatic/quasistatic.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/static/static.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/surfload/surfload.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/3dtet4/3dtet4.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/greensfns2d/greensfns2d.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/hex8.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/quad4.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/tri3.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/subduction/subduction.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/tutorials.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/twohex8/twohex8.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/twoquad4/twoquad4.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/twotet4-geoproj/twotet4-geoproj.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/twotet4/twotet4.lyx
   short/3D/PyLith/trunk/doc/userguide/tutorials/twotri3/twotri3.lyx
   short/3D/PyLith/trunk/doc/userguide/userguide.lyx
   short/3D/PyLith/trunk/examples/3d/hex8/step14.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/hex8/pylithapp.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/Makefile.am
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/README
   short/3D/PyLith/trunk/examples/bar_shearwave/quad4/pylithapp.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/tet4/pylithapp.cfg
   short/3D/PyLith/trunk/examples/bar_shearwave/tri3/pylithapp.cfg
   short/3D/PyLith/trunk/examples/meshing/Makefile.am
   short/3D/PyLith/trunk/examples/meshing/surface_nurbs/Makefile.am
   short/3D/PyLith/trunk/examples/run_examples.sh
   short/3D/PyLith/trunk/libsrc/pylith/bc/AbsorbingDampers.cc
   short/3D/PyLith/trunk/libsrc/pylith/bc/DirichletBC.cc
   short/3D/PyLith/trunk/libsrc/pylith/bc/Neumann.cc
   short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesive.cc
   short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveDyn.cc
   short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveLagrange.cc
   short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveLagrange.hh
   short/3D/PyLith/trunk/libsrc/pylith/faults/TopologyOps.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/CellGeometry.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.icc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicit.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicit.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitLgDeform.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitLgDeform.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTet4.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTet4.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTri3.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTri3.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicit.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicit.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitCUDA.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitLgDeform.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitLgDeform.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryHex3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryHex3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine1D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine1D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine2D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine2D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint1D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint1D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint2D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint2D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad2D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad2D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTet3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTet3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri2D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri2D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.icc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticity.cc
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticity.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticityLgDeform.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/Quadrature.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/QuadratureRefCell.hh
   short/3D/PyLith/trunk/libsrc/pylith/feassemble/QuadratureRefCell.icc
   short/3D/PyLith/trunk/libsrc/pylith/friction/FrictionModel.cc
   short/3D/PyLith/trunk/libsrc/pylith/friction/RateStateAgeing.cc
   short/3D/PyLith/trunk/libsrc/pylith/friction/RateStateAgeing.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPrager3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPrager3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPragerPlaneStrain.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPragerPlaneStrain.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticIsotropic3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticIsotropic3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticMaterial.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticMaterial.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStrain.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStrain.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStress.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStress.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStrain1D.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStrain1D.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStress1D.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStress1D.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellIsotropic3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellIsotropic3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellPlaneStrain.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellPlaneStrain.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellQpQsIsotropic3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellQpQsIsotropic3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/Material.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/Material.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellIsotropic3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellIsotropic3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellPlaneStrain.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellPlaneStrain.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLaw3D.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLaw3D.hh
   short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLawPlaneStrain.cc
   short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLawPlaneStrain.hh
   short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.cc
   short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.cc
   short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterVTK.cc
   short/3D/PyLith/trunk/libsrc/pylith/meshio/ExodusII.cc
   short/3D/PyLith/trunk/libsrc/pylith/meshio/ExodusII.hh
   short/3D/PyLith/trunk/libsrc/pylith/meshio/OutputSolnPoints.cc
   short/3D/PyLith/trunk/libsrc/pylith/meshio/OutputSolnPoints.hh
   short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.cc
   short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.hh
   short/3D/PyLith/trunk/libsrc/pylith/problems/Explicit.cc
   short/3D/PyLith/trunk/libsrc/pylith/problems/Formulation.cc
   short/3D/PyLith/trunk/libsrc/pylith/problems/Formulation.hh
   short/3D/PyLith/trunk/libsrc/pylith/problems/Implicit.cc
   short/3D/PyLith/trunk/libsrc/pylith/problems/SolverLinear.cc
   short/3D/PyLith/trunk/libsrc/pylith/problems/SolverNonlinear.cc
   short/3D/PyLith/trunk/libsrc/pylith/topology/RefineUniform.cc
   short/3D/PyLith/trunk/libsrc/pylith/topology/RefineUniform.hh
   short/3D/PyLith/trunk/modulesrc/feassemble/Constraint.i
   short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicit.i
   short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitLgDeform.i
   short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitTet4.i
   short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitTri3.i
   short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicit.i
   short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicitCUDA.i
   short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicitLgDeform.i
   short/3D/PyLith/trunk/modulesrc/feassemble/Integrator.i
   short/3D/PyLith/trunk/modulesrc/feassemble/IntegratorElasticity.i
   short/3D/PyLith/trunk/modulesrc/friction/RateStateAgeing.i
   short/3D/PyLith/trunk/modulesrc/materials/DruckerPrager3D.i
   short/3D/PyLith/trunk/modulesrc/materials/DruckerPragerPlaneStrain.i
   short/3D/PyLith/trunk/modulesrc/materials/ElasticIsotropic3D.i
   short/3D/PyLith/trunk/modulesrc/materials/ElasticMaterial.i
   short/3D/PyLith/trunk/modulesrc/materials/ElasticPlaneStrain.i
   short/3D/PyLith/trunk/modulesrc/materials/ElasticPlaneStress.i
   short/3D/PyLith/trunk/modulesrc/materials/ElasticStrain1D.i
   short/3D/PyLith/trunk/modulesrc/materials/ElasticStress1D.i
   short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellIsotropic3D.i
   short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellPlaneStrain.i
   short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellQpQsIsotropic3D.i
   short/3D/PyLith/trunk/modulesrc/materials/MaxwellIsotropic3D.i
   short/3D/PyLith/trunk/modulesrc/materials/MaxwellPlaneStrain.i
   short/3D/PyLith/trunk/modulesrc/materials/PowerLaw3D.i
   short/3D/PyLith/trunk/modulesrc/materials/PowerLawPlaneStrain.i
   short/3D/PyLith/trunk/modulesrc/mpi/Makefile.am
   short/3D/PyLith/trunk/modulesrc/mpi/mpi.i
   short/3D/PyLith/trunk/modulesrc/problems/Formulation.i
   short/3D/PyLith/trunk/pylith/Makefile.am
   short/3D/PyLith/trunk/pylith/apps/PyLithApp.py
   short/3D/PyLith/trunk/pylith/feassemble/Constraint.py
   short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicit.py
   short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitLgDeform.py
   short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitTet4.py
   short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitTri3.py
   short/3D/PyLith/trunk/pylith/feassemble/ElasticityImplicit.py
   short/3D/PyLith/trunk/pylith/feassemble/ElasticityImplicitLgDeform.py
   short/3D/PyLith/trunk/pylith/feassemble/Integrator.py
   short/3D/PyLith/trunk/pylith/feassemble/IntegratorElasticity.py
   short/3D/PyLith/trunk/pylith/friction/RateStateAgeing.py
   short/3D/PyLith/trunk/pylith/materials/DruckerPrager3D.py
   short/3D/PyLith/trunk/pylith/materials/DruckerPragerPlaneStrain.py
   short/3D/PyLith/trunk/pylith/materials/ElasticIsotropic3D.py
   short/3D/PyLith/trunk/pylith/materials/ElasticPlaneStrain.py
   short/3D/PyLith/trunk/pylith/materials/ElasticPlaneStress.py
   short/3D/PyLith/trunk/pylith/materials/ElasticStrain1D.py
   short/3D/PyLith/trunk/pylith/materials/ElasticStress1D.py
   short/3D/PyLith/trunk/pylith/materials/GenMaxwellIsotropic3D.py
   short/3D/PyLith/trunk/pylith/materials/GenMaxwellPlaneStrain.py
   short/3D/PyLith/trunk/pylith/materials/GenMaxwellQpQsIsotropic3D.py
   short/3D/PyLith/trunk/pylith/materials/MaxwellIsotropic3D.py
   short/3D/PyLith/trunk/pylith/materials/MaxwellPlaneStrain.py
   short/3D/PyLith/trunk/pylith/materials/PowerLaw3D.py
   short/3D/PyLith/trunk/pylith/materials/PowerLawPlaneStrain.py
   short/3D/PyLith/trunk/pylith/problems/Explicit.py
   short/3D/PyLith/trunk/pylith/problems/ExplicitLgDeform.py
   short/3D/PyLith/trunk/pylith/problems/TimeStep.py
   short/3D/PyLith/trunk/tests/2d/faultstrip/pylithapp.cfg
   short/3D/PyLith/trunk/tests/2d/frictionslide/pylithapp.cfg
   short/3D/PyLith/trunk/tests/2d/frictionslide/ratestate_stable.cfg
   short/3D/PyLith/trunk/tests/2d/frictionslide/ratestate_weak.cfg
   short/3D/PyLith/trunk/tests/2d/plasticity/cyclic/dynamic.cfg
   short/3D/PyLith/trunk/tests/3d/cyclicfriction/pylithapp.cfg
   short/3D/PyLith/trunk/tests/3d/plasticity/dynamic/pylithapp.cfg
   short/3D/PyLith/trunk/tests/3d/plasticity/dynamic/tet4.cfg
   short/3D/PyLith/trunk/tests_auto/1d/Makefile.am
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit1DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit1DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit2DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit2DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit3DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit3DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav1DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav1DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav2DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav2DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav3DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav3DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform1DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform1DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform2DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform2DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform3DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform3DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav1DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav1DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav2DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav2DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav3DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav3DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityImplicit.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityImplicit.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/TestIntegrator.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicit.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitApp.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeform.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DLinear.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DLinear.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.cc
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.hh
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityLgDeformExplicitApp.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1DLinear.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1DQuadratic.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din2DLinear.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din2DQuadratic.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din3DLinear.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din3DQuadratic.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2DLinear.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2DQuadratic.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearXY.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearXYZ.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearYZ.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh3DLinear.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh3DQuadratic.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Quadrature2DLinear.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Solution1DLinear.py
   short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Solution1DQuadratic.py
   short/3D/PyLith/trunk/unittests/libtests/friction/TestRateStateAgeing.cc
   short/3D/PyLith/trunk/unittests/libtests/friction/TestRateStateAgeing.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestDruckerPrager3D.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestDruckerPragerPlaneStrain.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticIsotropic3D.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticMaterial.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticMaterial.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticPlaneStrain.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticPlaneStress.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticStrain1D.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticStress1D.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellIsotropic3D.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellPlaneStrain.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellQpQsIsotropic3D.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestMaxwellIsotropic3D.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestMaxwellPlaneStrain.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestPowerLaw3D.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/TestPowerLawPlaneStrain.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElastic.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElasticData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElasticData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDep.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDepData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDepData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElastic.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElasticData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElasticData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDep.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDepData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDepData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3D.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3DData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3DData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialApp.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrain.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrainData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrainData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStress.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStressData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStressData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1D.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1DData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1DData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1D.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1DData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1DData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElastic.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElasticData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElasticData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDep.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDepData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDepData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElastic.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElasticData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElasticData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDep.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDepData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDepData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElastic.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElasticData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElasticData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDep.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDepData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDepData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElastic.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElasticData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElasticData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDep.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDepData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDepData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElastic.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElasticData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElasticData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDep.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDepData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDepData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElastic.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElasticData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElasticData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDep.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDepData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDepData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElastic.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElasticData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElasticData.hh
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDep.py
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDepData.cc
   short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDepData.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/TestXdmf.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/TestXdmf.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterData.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterData.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshLine2.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshLine2.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshLine2.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshLine2.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshLine2.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshLine2.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshLine2.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshLine2.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshLine2.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshLine2.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshHex8.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshHex8.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshLine2.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshLine2.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshQuad4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshQuad4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTet4.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTet4.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTri3.cc
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTri3.hh
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/Makefile.am
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_points_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_points_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell.xmf
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_points_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex.xmf
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell.xmf
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_points_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_cell.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_cell_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex.h5
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex.xmf
   short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex_t10.vtk
   short/3D/PyLith/trunk/unittests/pytests/feassemble/TestElasticityExplicit.py
   short/3D/PyLith/trunk/unittests/pytests/feassemble/TestElasticityExplicitLgDeform.py
   short/3D/PyLith/trunk/unittests/pytests/mpi/Makefile.am
   short/3D/PyLith/trunk/unittests/pytests/mpi/testmpi.py
   short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepAdapt.py
   short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepUniform.py
   short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepUser.py
Log:
Merge from v1.7-trunk.

Modified: short/3D/PyLith/trunk/README
===================================================================
--- short/3D/PyLith/trunk/README	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/README	2012-10-19 21:28:12 UTC (rev 20857)
@@ -34,33 +34,103 @@
 TIPS
 ======================================================================
 
-  * For most crustal deformation problems, we recommend using the
-    Additive Schwartz preconditioner via the following PETSc
-    settings:
+  * If the linear solve takes more than a few hundred iterations for a
+    large problem (use the --petsc.ksp_monitor=1 and
+    --petsc.ksp_view=1 to see diagnostic information for the solver),
+    this is usually an indication that something is wrong. Either the
+    preconditioner is inappropriate for the type of problem you are
+    solving or there is an error in the problem setup.
 
-      - Command line arguments
 
-        --petsc.pc_type=asm
-        --petsc.ksp_max_it=400
-        --petsc.ksp_gmres_restart=100
-        --petsc.ksp_rtol=1.0e-08
+======================================================================
+MIGRATING FROM VERSION 1.7 TO 1.8
+======================================================================
 
-      - pylithapp.cfg (or your other favorite .cfg file)
+Explicit time stepping with a non-lumped Jacobian has been eliminated
+and ExplicitLumped is now Explicit.
 
-        [pylithapp.petsc]
-        pc_type = asm
-        ksp_max_it = 400
-        ksp_gmres_restart = 100
-        ksp_rtol = 1.0e-08
+  Old setting
+  ------------------------------------------------
+  formulation = pylith.problems.ExplicitLumped
+  formulation = pylith.problems.ExplicitLumpedTri3
+  formulation = pylith.problems.ExplicitLumpedTet4
 
-  * If the solve takes more than a few hundred iterations for a large
-    problem (use the --petsc.ksp_monitor=1 and --petsc.ksp_view=1 to
-    see diagnostic information for the solver), this is usually an
-    indication that something is wrong. Either the preconditioner is
-    inappropriate for the type of problem you are solving or there is
-    an error in the problem setup.
+  New setting
+  ------------------------------------------------
+  formulation = pylith.problems.Explicit
+  formulation = pylith.problems.ExplicitTri3
+  formulation = pylith.problems.ExplicitTet4
 
+----------------------------------------------------------------------
+Version 1.8.0
+----------------------------------------------------------------------
 
+* New features
+
+  * Additional flexibility in PETSc nonlinear solver parameters
+
+    The default line search type for the PETSc nonlinear (SNES) solver
+    is a customized backtrace method included in PyLith. The user may
+    now select alternative line search types (basic, bt, l2, cp)
+    available in PETSc.
+
+  * Post-processing utility pylith_eqinfo to compute slip information.
+
+    This post-processing utility computes the moment magnitude,
+    seismic moment, seismic potency, and average slip at
+    user-specified snapshots in time from PyLith HDF5 output.
+    Information is given for each fault and across all faults. See
+    the Post-processing section in the Running PyLith
+    chapter of the manual for more information.
+
+  * Computation of the stable time step for explicit time-stepping.
+
+    The stable time step for explicit time-stepping is computed based
+    on the CFL condition and minimum edge lengths. For triangular and
+    tetrahedral cells we also account for a reduction in the stable
+    time step due to distorted cells (e.g., slivers and needles). See
+    the Stable time step section in the Materials chapter of the
+    manual for more information.
+
+  * Output the stable time step for each cell in a material.
+ 
+    Output cell_info_fields "stable_dt_implicit" and
+    "stable_dt_explicit" can be included in material output.
+
+* Bug fixes
+
+  - Fixed omission of synchronization of stable time step computation
+    among processors. Minimum time step among all processors rather
+    than local value should be used.
+
+  - Fixed density scale not being set in NondimElasticQuasistatic.
+    Density scale should be set based on shear modulus, length scale,
+    and relaxation time.
+
+  - Added warning when initial state for a fault constitutive model is
+    not set. If an initial state value is not given, for rate-state
+    friction using a default value of L / reference slip rate. Other
+    fault constitutive models use a default value of 0.0 for initial
+    state variables.
+
+  - Separated tensor components in Xdmf files to avoid confusion. The
+    corresponding HDF5 files remain unchanged.
+
+  - Removed explicit time-stepping formulation with non-lumped
+    Jacobian. This formulation was not setup properly for spontaneous
+    rupture models and is too computationally expensive for practical
+    problems. The ExplicitLumped* formulations are now simply Explicit*.
+
+  - Fixed parallel bug that resulting in inconsistent orientation of
+    fault slip directions. Flipping the fault orientation was not
+    synchronized across processors. This bug would only appear when
+    running in parallel with faults that change from dipping in one
+    direction to dipping in the opposite direction.
+
+  - Fixed bug in setting name of field in OutputSolnPoints when output
+    multiple fields. This bug caused the name of the first output
+    field to be used and output data to overrite each other.
+
 ======================================================================
 MIGRATING FROM VERSION 1.6 TO 1.7
 ======================================================================
@@ -79,7 +149,9 @@
 (2) Prescribed fault tractions for spontaneous earthquake rupture use
     a new, more flexible implementation that follows the same
     functional form for spatial and temporal variation as that used in
-    the Dirichlet and Neumann boundary conditions.
+    the Dirichlet and Neumann boundary conditions. Consequently, the
+    output info fields are also different and follow the naming scheme
+    used in the other time-dependent boundary conditions.
 
   Old settings
   --------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/TODO
===================================================================
--- short/3D/PyLith/trunk/TODO	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/TODO	2012-10-19 21:28:12 UTC (rev 20857)
@@ -11,10 +11,6 @@
     pylith step02.cfg ../../../share/debug_malloc.cfg
     pylith step04.cfg ../../../share/debug_malloc.cfg
 
-* Prescribed fault with opening has zero tractions (step20) Appears to
-  be a feature/artifact associated with how we implement slip with
-  Lagrange multipliers.
-
 ======================================================================
 CURRENT ISSUES/PRIORITIES
 ======================================================================
@@ -36,6 +32,10 @@
     Add elasticPrestep() to Formulation (called from Problem)
     Remove solnIncr, keep setField()
 
+* Prescribed fault with opening has zero tractions (step20) Appears to
+  be a feature/artifact associated with how we implement slip with
+  Lagrange multipliers.
+
 ======================================================================
 1.8.0
 ======================================================================

Modified: short/3D/PyLith/trunk/applications/utilities/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/applications/utilities/Makefile.am	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/applications/utilities/Makefile.am	2012-10-19 21:28:12 UTC (rev 20857)
@@ -19,6 +19,7 @@
 bin_SCRIPTS = \
 	pylithinfo \
 	pylith_genxdmf \
+	pylith_eqinfo \
 	powerlaw_gendb.py
 
 
@@ -36,6 +37,10 @@
 	$(do_build) <  $(srcdir)/pylith_genxdmf.in > $@ || (rm -f $@ && exit 1)
 	chmod +x $@
 
+pylith_eqinfo:  $(srcdir)/pylith_eqinfo.in Makefile
+	$(do_build) <  $(srcdir)/pylith_eqinfo.in > $@ || (rm -f $@ && exit 1)
+	chmod +x $@
+
 install-binSCRIPTS: $(bin_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
@@ -58,11 +63,13 @@
 EXTRA_DIST = \
 	pylithinfo.in \
 	pylith_genxdmf.in \
+	pylith_eqinfo.in \
 	powerlaw_gendb.py
 
 CLEANFILES = \
 	pylithinfo \
-	pylith_genxdmf
+	pylith_genxdmf \
+	pylith_eqinfo
 
 
 # End of file 

Copied: short/3D/PyLith/trunk/applications/utilities/pylith_eqinfo.in (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/applications/utilities/pylith_eqinfo.in)
===================================================================
--- short/3D/PyLith/trunk/applications/utilities/pylith_eqinfo.in	                        (rev 0)
+++ short/3D/PyLith/trunk/applications/utilities/pylith_eqinfo.in	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,54 @@
+#!@INTERPRETER@
+# -*- Python -*-
+#
+# ======================================================================
+#
+# Brad T. Aagaard, U.S. Geological Survey
+# Charles A. Williams, GNS Science
+# Matthew G. Knepley, University of Chicago
+#
+# This code was developed as part of the Computational Infrastructure
+# for Geodynamics (http://geodynamics.org).
+#
+# Copyright (c) 2010-2012 University of California, Davis
+#
+# See COPYING for license information.
+#
+# ======================================================================
+#
+
+# This script creates a Python file with earthquake rupture
+# information computed from PyLith output. The rupture information
+# includes:
+#
+#   Rupture area
+#   Average slip
+#   Seismic potency
+#   Seismic moment
+#   Moment magnitude
+#
+# Usage: pylith_eqinfo [command line arguments]
+#
+# NOTE: Works with HDF5 files, not VTK files.
+
+__requires__ = "PyLith"
+
+
+# ----------------------------------------------------------------------
+if __name__ == "__main__":
+
+    # re-create the PYTHONPATH at 'configure' time
+    import os.path, sys, site
+    path = '@PYTHONPATH@'.split(':')
+    path.reverse()
+    for directory in path:
+        if directory:
+            directory = os.path.abspath(directory)
+            sys.path.insert(1, directory)
+            site.addsitedir(directory)
+
+    from pylith.apps.EqInfoApp import EqInfoApp
+    from pyre.applications import start
+    start(applicationClass=EqInfoApp)
+
+# End of file 

Modified: short/3D/PyLith/trunk/configure.ac
===================================================================
--- short/3D/PyLith/trunk/configure.ac	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/configure.ac	2012-10-19 21:28:12 UTC (rev 20857)
@@ -317,6 +317,7 @@
 		tests_auto/2d/tri3/Makefile
 		tests_auto/2d/quad4/Makefile
 		tests_auto/petsc/Makefile
+		tests_auto/eqinfo/Makefile
 		tests/Makefile
 		tests/2d/Makefile
 		tests/2d/maxwell/Makefile
@@ -381,6 +382,8 @@
 		examples/meshing/surface_nurbs/dem/ulines/Makefile
 		examples/meshing/surface_nurbs/dem/vlines/Makefile
 		examples/meshing/surface_nurbs/triangles/Makefile
+		examples/meshing/surface_nurbs/merge_surfs/Makefile
+		examples/meshing/cubit_cellsize/Makefile
 		templates/Makefile
 		share/Makefile
 		])

Copied: short/3D/PyLith/trunk/doc/releasenotes/announce_v1.8.0.txt (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/doc/releasenotes/announce_v1.8.0.txt)
===================================================================
--- short/3D/PyLith/trunk/doc/releasenotes/announce_v1.8.0.txt	                        (rev 0)
+++ short/3D/PyLith/trunk/doc/releasenotes/announce_v1.8.0.txt	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,94 @@
+Greetings,
+
+I am pleased to announce the release of PyLith 1.8.0, a finite-element
+code designed to solve dynamic elastic problems and quasi-static
+viscoelastic problems in tectonic deformation.
+
+This release adds estimating the stable time step for explicit time
+stepping, adds a post-processing utility for computing the moment
+magnitude and average slip for any fault output snapshot, includes a
+couple of additional examples of CUBIT meshing techniques, fixes
+several bugs in PyLith v1.7.1 and corrects some typos in the
+manual. We strongly recommend all users of previous PyLith releases
+switch to this latest release.
+
+See the README file for changes required to switch to the v1.8.0
+release series from previous versions.
+
+You can download the source code and binaries from
+
+    http://geodynamics.org/cig/software/packages/short/pylith
+
+Detailed installation instructions for the binary packages are in the
+User Manual with detailed building instructions for a few platforms in
+the INSTALL file bundled with the PyLith Installer utility.
+
+
+RELEASE NOTES - PyLith v1.8.0
+
+* New features
+
+  * Additional flexibility in PETSc nonlinear solver parameters
+
+    The default line search type for the PETSc nonlinear (SNES) solver
+    is a customized backtrace method included in PyLith. The user may
+    now select alternative line search types (basic, bt, l2, cp)
+    available in PETSc.
+
+  * Post-processing utility pylith_eqinfo to compute slip information.
+
+    This post-processing utility computes the moment magnitude,
+    seismic moment, seismic potency, and average slip at
+    user-specified snapshots in time from PyLith HDF5 output.
+    Information is given for each fault and across all faults. See
+    the Post-processing section of the manual in the Running PyLith
+    chapter for more information.
+
+  * Computation of the stable time step for explicit time-stepping.
+
+    The stable time step for explicit time-stepping is computed based
+    on the CFL condition and minimum edge lengths. For triangular and
+    tetrahedral cells we also account for a reduction in the stable
+    time step due to distorted cells (e.g., slivers and needles). See
+    the Stable time step section in the Materials chapter of the
+    manual for more information.
+
+  * Output the stable time step for each cell in a material.
+ 
+    Output cell_info_fields "stable_dt_implicit" and
+    "stable_dt_explicit" can be included in material output.
+
+* Bug fixes
+
+  - Fixed omission of synchronization of stable time step computation
+    among processors. Minimum time step among all processors rather
+    than local value should be used.
+
+  - Fixed density scale not being set in NondimElasticQuasistatic.
+    Density scale should be set based on shear modulus, length scale,
+    and relaxation time.
+
+  - Added warning when initial state for a fault constitutive model is
+    not set. If an initial state value is not given, for rate-state
+    friction using a default value of L / reference slip rate. Other
+    fault constitutive models use a default value of 0.0 for initial
+    state variables.
+
+  - Separated tensor components in Xdmf files to avoid confusion. The
+    corresponding HDF5 files remain unchanged.
+
+  - Removed explicit time-stepping formulation with non-lumped
+    Jacobian. This formulation was not setup properly for spontaneous
+    rupture models and is too computationally expensive for practical
+    problems. The ExplicitLumped* formulations are now simply Explicit*.
+
+  - Fixed parallel bug that resulting in inconsistent orientation of
+    fault slip directions. Flipping the fault orientation was not
+    synchronized across processors. This bug would only appear when
+    running in parallel with faults that change from dipping in one
+    direction to dipping in the opposite direction.
+
+  - Fixed bug in setting name of field in OutputSolnPoints when output
+    multiple fields. This bug caused the name of the first output
+    field to be used and output data to overrite each other.
+

Modified: short/3D/PyLith/trunk/doc/userguide/benchmarks/benchmarks.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/benchmarks/benchmarks.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/benchmarks/benchmarks.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,197 +1,197 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 1
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 2in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 2
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Chapter
-\begin_inset CommandInset label
-LatexCommand label
-name "cha:Benchmarks"
-
-\end_inset
-
-Benchmarks
-\end_layout
-
-\begin_layout Section
-Overview
-\end_layout
-
-\begin_layout Standard
-The Crustal Deformation Modeling and Earthquake Source Physics Focus Groups
- within the Southern California Earthquake Center and the Short-Term Tectonics
- Working Group within CIG have developed a suite of benchmarks to test the
- accuracy and performance of 3D numerical codes for quasi-static crustal
- deformation and earthquake rupture dynamics.
- The benchmark definitions for the quasi-static crustal deformation benchmarks
- are posted on the CIG website at Short-Term Tectonics Benchmarks 
-\begin_inset Flex URL
-status open
-
-\begin_layout Plain Layout
-
-geodynamics.org/cig/workinggroups/short/workarea/benchmarks/
-\end_layout
-
-\end_inset
-
- and the definitions for the earthquake rupture benchmarks are posted on
- the SCEC website 
-\begin_inset Flex URL
-status open
-
-\begin_layout Plain Layout
-
-scecdata.usc.edu/cvws/cgi-bin/cvws.cgi
-\end_layout
-
-\end_inset
-
-.
- This suite of benchmarks permits evaluating the relative performance of
- different types of basis functions, quadrature schemes, and discretizations
- for geophysical applications.
- The files needed to run the 3D benchmarks are in the CIG SVN Repository
- 
-\begin_inset Flex URL
-status open
-
-\begin_layout Plain Layout
-
-geodynamics.org/svn/cig/short/3D/PyLith/benchmarks
-\end_layout
-
-\end_inset
-
-.
- In addition to evaluating the efficiency and accuracy of numerical codes,
- the benchmarks also make good test problems, where users can perform simulation
-s based on actual geophysical problems.
- The benchmarks are performed at various resolutions and using different
- element types.
- By comparing the runtime and accuracy for different resolutions and element
- types, users can evaluate which combination will be best for their problems
- of interest.
-\end_layout
-
-\begin_layout Standard
-\begin_inset CommandInset include
-LatexCommand input
-filename "strikeslip/strikeslip.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "savageprescott/savageprescott.lyx"
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Section
-SCEC Dynamic Rupture Benchmarks
-\end_layout
-
-\begin_layout Standard
-The SCEC website 
-\begin_inset Flex URL
-status open
-
-\begin_layout Plain Layout
-
-scecdata.usc.edu/cvws/cgi-bin/cvws.cgi
-\end_layout
-
-\end_inset
-
- includes a graphical user interface for examining the benchmark results.
- Benchmark results for PyLith are available for TPV205-2D (horizontal slice
- through a vertical strike-slip fault), TPV205 (vertical strike-slip fault
- with high and low stress asperities), TPV210-2D (vertical slice through
- a 60 degree dipping normal fault), TPV210 (60 degree dipping normal fault),
- TPV11, TPV12, TPV13, TPV14-2D and TPV15-2D (horizontal slice through a
- verticel strike-slip fault with a branch), TPV14 and TPV15 (vertical strike-sli
-p fault with a branch), and TPV 16 and 17.
-\end_layout
-
-\begin_layout Standard
-The benchmark results indicate that triangular and tetrahedral cells generate
- less numerical noise than quadrilateral or hexahedral cells.
- Results for all of the benchmarks listed above except TPV14-2D, TPV15-2D,
- TPV14, and TPV15 have been updated using PyLith 1.7, which provides much
- closer agreement with the other codes compared to previous versions of
- PyLith.
- We attribute the closer agreement to small adjustments of the fault implementat
-ion and some small bugfixes to the slip-weakening friction formulation.
- 
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 1
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 2in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 2
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Chapter
+\begin_inset CommandInset label
+LatexCommand label
+name "cha:Benchmarks"
+
+\end_inset
+
+Benchmarks
+\end_layout
+
+\begin_layout Section
+Overview
+\end_layout
+
+\begin_layout Standard
+The Crustal Deformation Modeling and Earthquake Source Physics Focus Groups
+ within the Southern California Earthquake Center and the Short-Term Tectonics
+ Working Group within CIG have developed a suite of benchmarks to test the
+ accuracy and performance of 3D numerical codes for quasi-static crustal
+ deformation and earthquake rupture dynamics.
+ The benchmark definitions for the quasi-static crustal deformation benchmarks
+ are posted on the CIG website at Short-Term Tectonics Benchmarks 
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+geodynamics.org/cig/workinggroups/short/workarea/benchmarks/
+\end_layout
+
+\end_inset
+
+ and the definitions for the earthquake rupture benchmarks are posted on
+ the SCEC website 
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+scecdata.usc.edu/cvws/cgi-bin/cvws.cgi
+\end_layout
+
+\end_inset
+
+.
+ This suite of benchmarks permits evaluating the relative performance of
+ different types of basis functions, quadrature schemes, and discretizations
+ for geophysical applications.
+ The files needed to run the 3D benchmarks are in the CIG SVN Repository
+ 
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+geodynamics.org/svn/cig/short/3D/PyLith/benchmarks
+\end_layout
+
+\end_inset
+
+.
+ In addition to evaluating the efficiency and accuracy of numerical codes,
+ the benchmarks also make good test problems, where users can perform simulation
+s based on actual geophysical problems.
+ The benchmarks are performed at various resolutions and using different
+ element types.
+ By comparing the runtime and accuracy for different resolutions and element
+ types, users can evaluate which combination will be best for their problems
+ of interest.
+\end_layout
+
+\begin_layout Standard
+\begin_inset CommandInset include
+LatexCommand input
+filename "strikeslip/strikeslip.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "savageprescott/savageprescott.lyx"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+SCEC Dynamic Rupture Benchmarks
+\end_layout
+
+\begin_layout Standard
+The SCEC website 
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+scecdata.usc.edu/cvws/cgi-bin/cvws.cgi
+\end_layout
+
+\end_inset
+
+ includes a graphical user interface for examining the benchmark results.
+ Benchmark results for PyLith are available for TPV205-2D (horizontal slice
+ through a vertical strike-slip fault), TPV205 (vertical strike-slip fault
+ with high and low stress asperities), TPV210-2D (vertical slice through
+ a 60-degree dipping normal fault), TPV210 (60-degree dipping normal fault),
+ TPV11, TPV12, TPV13, TPV14-2D and TPV15-2D (horizontal slice through a
+ verticel strike-slip fault with a branch), TPV14 and TPV15 (vertical strike-sli
+p fault with a branch), and TPV 16 and 17.
+\end_layout
+
+\begin_layout Standard
+The benchmark results indicate that triangular and tetrahedral cells generate
+ less numerical noise than quadrilateral or hexahedral cells.
+ Results for all of the benchmarks listed above except TPV14-2D, TPV15-2D,
+ TPV14, and TPV15 have been updated using PyLith 1.7, which provides much
+ closer agreement with the other codes compared to previous versions of
+ PyLith.
+ We attribute the closer agreement to small adjustments of the fault implementat
+ion and some small bugfixes to the slip-weakening friction formulation.
+ 
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/benchmarks/savageprescott/savageprescott.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/benchmarks/savageprescott/savageprescott.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/benchmarks/savageprescott/savageprescott.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,523 +1,530 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 0
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 1in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:benchmarks:savageprescott"
-
-\end_inset
-
-Savage and Prescott Benchmark
-\end_layout
-
-\begin_layout Standard
-This benchmark problem computes the viscoelastic (Maxwell) relaxation of
- stresses from repeated infinite, strike-slip earthquakes in 3D without
- gravity.
- The files needed to run the benchmark may be found at 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-geodynamics.org/svn/cig/short/2.5D/benchmarks/savageprescott
-\end_layout
-
-\end_inset
-
-.
- An analytical solution to this problem is described by Savage and Prescott
- 
-\begin_inset CommandInset citation
-LatexCommand cite
-key "Savage:Prescott:1978"
-
-\end_inset
-
-, which provides a simple way to check our numerical solution.
- A python utility code is provided in the utils directory to compute the
- analytical solution.
- Although this problem is actually 2.5D (infinite along-strike), we solve
- it using a 3D finite element model.
-\end_layout
-
-\begin_layout Subsection
-Problem Description
-\end_layout
-
-\begin_layout Standard
-Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:benchmark:savageprescott:geometry"
-
-\end_inset
-
- shows the geometry of the problem, as described by 
-\begin_inset CommandInset citation
-LatexCommand cite
-key "Savage:Prescott:1978"
-
-\end_inset
-
-.
- The analytical solution describes the surface deformation due to repeated
- earthquakes on an infinite strike-slip fault embedded in an elastic layer
- overlying a Maxwell viscoelastic half-space.
- The upper portion of the fault (red in the figure) is locked between earthquake
-s, while the lower portion (blue in the figure) creeps at plate velocity.
- At regular recurrence intervals, the upper portion of the fault abruptly
- slips by an amount equal to the plate velocity multiplied by the recurrence
- interval, thus 'catching up' with the lower part of the fault.
-\end_layout
-
-\begin_layout Standard
-There are some differences between the analytical solution and our numerical
- representation.
- First, the analytical solution represents the earthquake cycle as the superposi
-tion of uniform fault creep and an elementary earthquake cycle.
- Uniform fault creep is simply the uniform movement of the two plates past
- each other at plate velocity.
- For the elementary earthquake cycle, no slip occurs below the locked portion
- of the fault (blue portion in the figure).
- On the locked (red) portion of the fault, backslip equal to plate velocity
- occurs until the earthquake recurrence interval, at which point abrupt
- forward slip occurs.
- In the finite element solution, we perform the simulation as described
- in the figure.
- Velocity boundary conditions are applied at the extreme edges of the model
- to simulate block motion, steady creep is applied along the blue portion
- of the fault, and regular earthquakes are applied along the upper portion
- of the fault.
- It takes several earthquake cycles for the velocity boundary conditions
- to approximate the steady flow due to steady block motion, so we would
- not expect the analytical and numerical solutions to match until several
- earthquakes have occurred.
- Another difference lies in the dimensions of the domain.
- The analytical solution assumes an infinite strike-slip fault in an elastic
- layer overlying a Maxwell viscoelastic half-space.
- In our finite element model we are restricted to finite dimensions.
- We therefore extend the outer boundaries far enough from the region of
- interest to approximate boundaries at infinity.
-\end_layout
-
-\begin_layout Standard
-Due to the difficulties in representing solutions in an infinite domain,
- there are several meshes that have been tested for this problem.
- The simplest meshes have uniform resolution (all cells have equal dimensions);
- however, such meshes typically do not provide accurate solutions since
- the resolution is too coarse in the region of interest.
- For that reason, we also tested meshes where the mesh resolution decreases
- away from the center.
- In the problem description that follows, we will focus on the hexahedral
- mesh with finer discretization neear the fault (meshes/hex8_6.7km.exo.gz),
- which provides a good match with the analytical solution.
- It will first be necessary to gunzip this mesh so that it may be used by
- PyLith.
-\end_layout
-
-\begin_layout Description
-Domain The domain for this mesh spans the region
-\begin_inset Formula 
-\begin{gather*}
--1000\leq x\leq1000\ km,\\
--500\leq y\leq500\ km,\\
--400\ km\leq z\leq0.
-\end{gather*}
-
-\end_inset
-
-The top (elastic) layer occupies the region 
-\begin_inset Formula $-40\ km\ \leq z\leq0$
-\end_inset
-
- and the bottom (viscoelastic) layer occupies the region 
-\begin_inset Formula $-400\ km\ \leq z\leq-40\ km$
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Description
-Material
-\begin_inset space ~
-\end_inset
-
-properties The material is a Poisson solid with a shear modulus (
-\begin_inset Formula $\mu$
-\end_inset
-
-) of 30 GPa.
- The domain is modeled using an elastic isotropic material for the top layer
- and a Maxwell viscoelastic material for the bottom layer.
- The bottom layer has a viscosity (
-\begin_inset Formula $\eta$
-\end_inset
-
-) of 2.36682e+19 Pa-s, yielding a relaxation time (
-\begin_inset Formula $2\eta/\mu$
-\end_inset
-
-) of 50 years.
-\end_layout
-
-\begin_layout Description
-Fault The fault is a vertical, left-lateral strike-slip fault.
- The strike is parallel to the y-direction at the center of the model:
-\begin_inset Formula 
-\begin{gather*}
-x=0\ km,\\
--500\leq y\leq500\ km,\\
--40\ km\leq z\leq0.
-\end{gather*}
-
-\end_inset
-
-The locked portion of the fault (red section in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:benchmark:savageprescott:geometry"
-
-\end_inset
-
-) extends from 
-\begin_inset Formula $-20\: km\leq z\leq0$
-\end_inset
-
-, while the creeping section (blue) extends from 
-\begin_inset Formula $-40\: km\leq z\leq0$
-\end_inset
-
-.
- Along the line where the two sections coincide (
-\begin_inset Formula $z=-20\: km$
-\end_inset
-
-), half of the coseismic displacement and half of the steady creep is applied
- (see 
-\family typewriter
-finalslip.spatialdb
-\family default
- and 
-\family typewriter
-creeprate.spatialdb
-\family default
-).
-\end_layout
-
-\begin_layout Description
-Boundary
-\begin_inset space ~
-\end_inset
-
-conditions On the bottom boundary, vertical displacements are set to zero,
- while on the y-boundaries the x-displacements are set to zero.
- On the x-boundaries, the x-displacements are set to zero, while constant
- velocities of +/- 1 cm/yr are applied in the y-direction, giving a relative
- plate motion of 2 cm/year.
-\end_layout
-
-\begin_layout Description
-Discretization For the nonuniform hexahedral mesh, the resolution at the
- outer boundaries is 20 km.
- An inner region is then put through one level of refinement, so that near
- the center of the mesh the resolution is 6.7 km.
- All meshes were generated with CUBIT.
-\end_layout
-
-\begin_layout Description
-Basis
-\begin_inset space ~
-\end_inset
-
-functions We use trilinear hexahedral cells.
-\end_layout
-
-\begin_layout Description
-Solution We compute the surface displacements and compare these to the analytica
-l solution 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:benchmark:savageprescott:solution"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/model_descript.eps
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Problem description for the Savage and Prescott strike-slip benchmark problem.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:benchmark:savageprescott:geometry"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Running the Benchmark
-\end_layout
-
-\begin_layout Standard
-After checking out the benchmark files from the CIG SVN repository, change
- to the 
-\family typewriter
-meshes
-\family default
- directory.
- Decompress the gzipped files in the 
-\family typewriter
-mesh
-\family default
- directory,
-\end_layout
-
-\begin_layout LyX-Code
-gunzip *.gz
-\end_layout
-
-\begin_layout Standard
-Alternatively, simply gunzip the mesh you want to use.
- There are a number of 
-\family typewriter
-.cfg
-\family default
- files corresponding to the different meshes, as well as a 
-\family typewriter
-pylithapp.cfg
-\family default
- file defining parameters common to all problems.
- Each problem uses four 
-\family typewriter
-.cfg
-\family default
- files: 
-\family typewriter
-pylithapp.cfg
-\family default
-, 
-\family typewriter
-fieldsplit.cfg
-\family default
- (algrebraic multigrid preconditioner), a cell-specific file (e.g., 
-\family typewriter
-hex8.cfg
-\family default
-), and a resolution specific file (e.g., hex8_6.7km.cfg).
- You can then run the problem by typing
-\end_layout
-
-\begin_layout LyX-Code
-pylith hex8.cfg hex8_6.7km.cfg fieldsplit.cfg
-\end_layout
-
-\begin_layout Standard
-This will run the problem for 10 earthquake cycles of 200 years each, using
- a time-step size of 10 years, for a total simulation time of 2000 years.
- Ground surface output occurs every 10 years, while all other outputs occur
- every 50 years.
-\end_layout
-
-\begin_layout Standard
-Once the problem has run, results will be placed in the 
-\family typewriter
-output
-\family default
- directory.
- These results may be viewed directly with a package such as ParaView; however,
- to compare results to the analytical solution, some postprocessing is required.
- First, generate the analytical results by running the 
-\family typewriter
-calc_analytic.py
-\family default
- script.
- This will produce files with displacements and velocities (
-\family typewriter
-analytic_disp.txt
-\family default
- and 
-\family typewriter
-analytic_vel.txt
-\family default
-) in the 
-\family typewriter
-output
-\family default
- directory that are easy to use with a plotting package, such as matplotlib
- or Matlab.
-\end_layout
-
-\begin_layout Subsection
-Benchmark Results
-\end_layout
-
-\begin_layout Standard
-Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:benchmark:savageprescott:solution"
-
-\end_inset
-
- shows the computed surface displacements for the 10th earthquake cycle
- compared with the analytical solution.
- The profile results were obtained as described above, and then all results
- (analytical and numerical) were referenced to the displacements immediately
- following the last earthquake.
- We find very good agreement between the analytical and numerical solutions,
- even for meshes with uniform refinement.
- We have not yet explored quantitative fits as a function of mesh resolution.
- For this benchmark, it is also important to consider the distance of the
- boundary from the region of interest.
- Also note that the agreement between analytical and numerical solutions
- is poor for early earthquake cycles, due to the differences in simulating
- the problem, as noted above.
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/soln_profiles.eps
-	scale 66
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Displacement profiles perpendicular to the fault for a PyLith simulation
- with hex8 cells and the analytical solution for earthquake cycle 10.
- 
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:benchmark:savageprescott:solution"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 0
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 1in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:benchmarks:savageprescott"
+
+\end_inset
+
+Savage and Prescott Benchmark
+\end_layout
+
+\begin_layout Standard
+This benchmark problem computes the viscoelastic (Maxwell) relaxation of
+ stresses from repeated infinite, strike-slip earthquakes in 3D without
+ gravity.
+ The files needed to run the benchmark may be found at 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+geodynamics.org/svn/cig/short/2.5D/benchmarks/savageprescott
+\end_layout
+
+\end_inset
+
+.
+ An analytical solution to this problem is described by Savage and Prescott
+ 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Savage:Prescott:1978"
+
+\end_inset
+
+, which provides a simple way to check our numerical solution.
+ A python utility code is provided in the utils directory to compute the
+ analytical solution.
+ Although this problem is actually 2.5D (infinite along-strike), we solve
+ it using a 3D finite element model.
+\end_layout
+
+\begin_layout Subsection
+Problem Description
+\end_layout
+
+\begin_layout Standard
+Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:savageprescott:geometry"
+
+\end_inset
+
+ shows the geometry of the problem, as described by 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Savage:Prescott:1978"
+
+\end_inset
+
+.
+ The analytical solution describes the surface deformation due to repeated
+ earthquakes on an infinite strike-slip fault embedded in an elastic layer
+ overlying a Maxwell viscoelastic half-space.
+ The upper portion of the fault (red in the figure) is locked between earthquake
+s, while the lower portion (blue in the figure) creeps at plate velocity.
+ At regular recurrence intervals, the upper portion of the fault abruptly
+ slips by an amount equal to the plate velocity multiplied by the recurrence
+ interval, thus 'catching up' with the lower part of the fault.
+\end_layout
+
+\begin_layout Standard
+There are some differences between the analytical solution and our numerical
+ representation.
+ First, the analytical solution represents the earthquake cycle as the superposi
+tion of uniform fault creep and an elementary earthquake cycle.
+ Uniform fault creep is simply the uniform movement of the two plates past
+ each other at plate velocity.
+ For the elementary earthquake cycle, no slip occurs below the locked portion
+ of the fault (blue portion in the figure).
+ On the locked (red) portion of the fault, backslip equal to plate velocity
+ occurs until the earthquake recurrence interval, at which point abrupt
+ forward slip occurs.
+ In the finite element solution, we perform the simulation as described
+ in the figure.
+ Velocity boundary conditions are applied at the extreme edges of the model
+ to simulate block motion, steady creep is applied along the blue portion
+ of the fault, and regular earthquakes are applied along the upper portion
+ of the fault.
+ It takes several earthquake cycles for the velocity boundary conditions
+ to approximate the steady flow due to steady block motion, so we would
+ not expect the analytical and numerical solutions to match until several
+ earthquakes have occurred.
+ Another difference lies in the dimensions of the domain.
+ The analytical solution assumes an infinite strike-slip fault in an elastic
+ layer overlying a Maxwell viscoelastic half-space.
+ In our finite element model we are restricted to finite dimensions.
+ We therefore extend the outer boundaries far enough from the region of
+ interest to approximate boundaries at infinity.
+\end_layout
+
+\begin_layout Standard
+Due to the difficulties in representing solutions in an infinite domain,
+ there are several meshes that have been tested for this problem.
+ The simplest meshes have uniform resolution (all cells have equal dimensions);
+ however, such meshes typically do not provide accurate solutions since
+ the resolution is too coarse in the region of interest.
+ For that reason, we also tested meshes where the mesh resolution decreases
+ away from the center.
+ In the problem description that follows, we will focus on the hexahedral
+ mesh with finer discretization near the fault 
+\begin_inset Newline linebreak
+\end_inset
+
+(
+\family typewriter
+meshes/hex8_6.7km.exo.gz
+\family default
+), which provides a good match with the analytical solution.
+ It will first be necessary to gunzip this mesh so that it may be used by
+ PyLith.
+\end_layout
+
+\begin_layout Description
+Domain The domain for this mesh spans the region
+\begin_inset Formula 
+\begin{gather*}
+-1000\leq x\leq1000\ km,\\
+-500\leq y\leq500\ km,\\
+-400\ km\leq z\leq0.
+\end{gather*}
+
+\end_inset
+
+The top (elastic) layer occupies the region 
+\begin_inset Formula $-40\ km\ \leq z\leq0$
+\end_inset
+
+ and the bottom (viscoelastic) layer occupies the region 
+\begin_inset Formula $-400\ km\ \leq z\leq-40\ km$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+Material
+\begin_inset space ~
+\end_inset
+
+properties The material is a Poisson solid with a shear modulus (
+\begin_inset Formula $\mu$
+\end_inset
+
+) of 30 GPa.
+ The domain is modeled using an elastic isotropic material for the top layer
+ and a Maxwell viscoelastic material for the bottom layer.
+ The bottom layer has a viscosity (
+\begin_inset Formula $\eta$
+\end_inset
+
+) of 2.36682e+19 Pa-s, yielding a relaxation time (
+\begin_inset Formula $2\eta/\mu$
+\end_inset
+
+) of 50 years.
+\end_layout
+
+\begin_layout Description
+Fault The fault is a vertical, left-lateral strike-slip fault.
+ The strike is parallel to the y-direction at the center of the model:
+\begin_inset Formula 
+\begin{gather*}
+x=0\ km,\\
+-500\leq y\leq500\ km,\\
+-40\ km\leq z\leq0.
+\end{gather*}
+
+\end_inset
+
+The locked portion of the fault (red section in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:savageprescott:geometry"
+
+\end_inset
+
+) extends from 
+\begin_inset Formula $-20\: km\leq z\leq0$
+\end_inset
+
+, while the creeping section (blue) extends from 
+\begin_inset Formula $-40\: km\leq z\leq0$
+\end_inset
+
+.
+ Along the line where the two sections coincide (
+\begin_inset Formula $z=-20\: km$
+\end_inset
+
+), half of the coseismic displacement and half of the steady creep is applied
+ (see 
+\family typewriter
+finalslip.spatialdb
+\family default
+ and 
+\family typewriter
+creeprate.spatialdb
+\family default
+).
+\end_layout
+
+\begin_layout Description
+Boundary
+\begin_inset space ~
+\end_inset
+
+conditions On the bottom boundary, vertical displacements are set to zero,
+ while on the y-boundaries the x-displacements are set to zero.
+ On the x-boundaries, the x-displacements are set to zero, while constant
+ velocities of +/- 1 cm/yr are applied in the y-direction, giving a relative
+ plate motion of 2 cm/year.
+\end_layout
+
+\begin_layout Description
+Discretization For the nonuniform hexahedral mesh, the resolution at the
+ outer boundaries is 20 km.
+ An inner region is then put through one level of refinement, so that near
+ the center of the mesh the resolution is 6.7 km.
+ All meshes were generated with CUBIT.
+\end_layout
+
+\begin_layout Description
+Basis
+\begin_inset space ~
+\end_inset
+
+functions We use trilinear hexahedral cells.
+\end_layout
+
+\begin_layout Description
+Solution We compute the surface displacements and compare these to the analytica
+l solution in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:savageprescott:solution"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/model_descript.eps
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Problem description for the Savage and Prescott strike-slip benchmark problem.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:savageprescott:geometry"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Running the Benchmark
+\end_layout
+
+\begin_layout Standard
+After checking out the benchmark files from the CIG SVN repository, change
+ to the 
+\family typewriter
+meshes
+\family default
+ directory.
+ Decompress the gzipped files in the 
+\family typewriter
+mesh
+\family default
+ directory,
+\end_layout
+
+\begin_layout LyX-Code
+gunzip *.gz
+\end_layout
+
+\begin_layout Standard
+Alternatively, simply gunzip the mesh you want to use.
+ There are a number of 
+\family typewriter
+.cfg
+\family default
+ files corresponding to the different meshes, as well as a 
+\family typewriter
+pylithapp.cfg
+\family default
+ file defining parameters common to all problems.
+ Each problem uses four 
+\family typewriter
+.cfg
+\family default
+ files: 
+\family typewriter
+pylithapp.cfg
+\family default
+, 
+\family typewriter
+fieldsplit.cfg
+\family default
+ (algrebraic multigrid preconditioner), a cell-specific file (e.g., 
+\family typewriter
+hex8.cfg
+\family default
+), and a resolution specific file (e.g., hex8_6.7km.cfg).
+ You can then run the problem by typing
+\end_layout
+
+\begin_layout LyX-Code
+pylith hex8.cfg hex8_6.7km.cfg fieldsplit.cfg
+\end_layout
+
+\begin_layout Standard
+This will run the problem for 10 earthquake cycles of 200 years each, using
+ a time-step size of 10 years, for a total simulation time of 2000 years.
+ Ground surface output occurs every 10 years, while all other outputs occur
+ every 50 years.
+\end_layout
+
+\begin_layout Standard
+Once the problem has run, results will be placed in the 
+\family typewriter
+output
+\family default
+ directory.
+ These results may be viewed directly with a package such as ParaView; however,
+ to compare results to the analytical solution, some postprocessing is required.
+ First, generate the analytical results by running the 
+\family typewriter
+calc_analytic.py
+\family default
+ script.
+ This will produce files with displacements and velocities (
+\family typewriter
+analytic_disp.txt
+\family default
+ and 
+\family typewriter
+analytic_vel.txt
+\family default
+) in the 
+\family typewriter
+output
+\family default
+ directory that are easy to use with a plotting package, such as matplotlib
+ or Matlab.
+\end_layout
+
+\begin_layout Subsection
+Benchmark Results
+\end_layout
+
+\begin_layout Standard
+Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:savageprescott:solution"
+
+\end_inset
+
+ shows the computed surface displacements for the 10th earthquake cycle
+ compared with the analytical solution.
+ The profile results were obtained as described above, and then all results
+ (analytical and numerical) were referenced to the displacements immediately
+ following the last earthquake.
+ We find very good agreement between the analytical and numerical solutions,
+ even for meshes with uniform refinement.
+ We have not yet explored quantitative fits as a function of mesh resolution.
+ For this benchmark, it is also important to consider the distance of the
+ boundary from the region of interest.
+ Also note that the agreement between analytical and numerical solutions
+ is poor for early earthquake cycles, due to the differences in simulating
+ the problem, as noted above.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/soln_profiles.eps
+	scale 66
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Displacement profiles perpendicular to the fault for a PyLith simulation
+ with hex8 cells and the analytical solution for earthquake cycle 10.
+ 
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:savageprescott:solution"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/benchmarks/strikeslip/strikeslip.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/benchmarks/strikeslip/strikeslip.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/benchmarks/strikeslip/strikeslip.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,918 +1,982 @@
-#LyX 1.5.6 created this file. For more info see http://www.lyx.org/
-\lyxformat 276
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\language english
-\inputencoding latin1
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-\graphics default
-\paperfontsize default
-\spacing single
-\papersize default
-\use_geometry true
-\use_amsmath 0
-\use_esint 0
-\cite_engine basic
-\use_bibtopic false
-\paperorientation portrait
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 1in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\defskip medskip
-\quotes_language english
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\author "" 
-\author "" 
-\end_header
-
-\begin_body
-
-\begin_layout Section
-\begin_inset LatexCommand label
-name "sec:benchmarks:strikeslip"
-
-\end_inset
-
-Strike-Slip Benchmark
-\end_layout
-
-\begin_layout Standard
-This benchmark problem computes the viscoelastic (Maxwell) relaxation of
- stresses from a single, finite, strike-slip earthquake in 3D without gravity.
-  Dirichlet boundary conditions equal to the analytical elastic solution
- are imposed on the sides of a cube with sides of length 24 km.
- Anti-plane strain boundary conditions are imposed at y = 0, so the solution
- is equivalent to that for a domain with a 48 km length in the y direction.
- We can use the analytical solution of 
-\begin_inset LatexCommand cite
-key "Okada:1992"
-
-\end_inset
-
- both to apply the boundary conditions and to compare against the numerically-co
-mputed elastic solution.
-\end_layout
-
-\begin_layout Standard
-
-\end_layout
-
-\begin_layout Subsection
-Problem Description
-\end_layout
-
-\begin_layout Standard
-Figure 
-\begin_inset LatexCommand ref
-reference "fig:benchmark:strikeslip:geometry"
-
-\end_inset
-
- shows the geometry of the strike-slip fault (red surface) embedded in the
- cube consisting of an elastic material (yellow block) over a Maxwell viscoelast
-ic material (blue block).
- 
-\end_layout
-
-\begin_layout Description
-Domain The domain spans the region
-\begin_inset Formula \begin{gather*}
-0\leq x\leq24\ km,\\
-0\leq y\leq24\ km,\\
--24\ km\leq z\leq0.\end{gather*}
-
-\end_inset
-
-The top (elastic) layer occupies the region 
-\begin_inset Formula $-12\ km\ \leq z\leq0$
-\end_inset
-
- and the bottom (viscoelastic) layer occupies the region 
-\begin_inset Formula $-24\ km\ \leq z\leq-12\ km$
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Description
-Material\InsetSpace ~
-properties The material is a Poisson solid with a shear modulus
- of 30 GPa.
- The domain is modeled using an elastic isotropic material for the top layer
- and a Maxwell viscoelastic material for the bottom layer.
- The bottom layer has a viscosity of 1.0e+18 Pa-s.
-\end_layout
-
-\begin_layout Description
-Fault The fault is a vertical, right-lateral strike-slip fault.
- The strike is parallel to the y-direction at the center of the model:
-\begin_inset Formula \begin{gather*}
-x=12\ km,\\
-0\leq y\leq16\ km,\\
--16\ km\leq z\leq0.\end{gather*}
-
-\end_inset
-
-Uniform slip of 1 m is applied over the region 
-\begin_inset Formula $0\leq y\leq12\ km$
-\end_inset
-
- and 
-\begin_inset Formula $-12\ km\leq z\leq0$
-\end_inset
-
- with a linear taper to 0 at y = 16 km and z = -16 km.
- The tapered region is the light red portion of the fault surface in Figure
- 
-\begin_inset LatexCommand ref
-reference "fig:benchmark:strikeslip:geometry"
-
-\end_inset
-
-.
- In the region where the two tapers overlap, each slip value is the minimum
- of the two tapers (so that the taper remains linear).
-\end_layout
-
-\begin_layout Description
-Boundary\InsetSpace ~
-conditions Bottom and side displacements are set to the elastic
- analytical solution, and the top of the model is a free surface.
- There are two exceptions to these applied boundary conditions.
- The first is on the y=0 plane, where y-displacements are left free to preserve
- symmetry, and the x- and z-displacements are set to zero.
- The second is along the line segment between (12, 0, -24) and (12, 24,
- -24), where the analytical solution blows up in some cases.
- Along this line segment, all three displacement components are left free.
-\end_layout
-
-\begin_layout Description
-Discretization The model is discretized with nominal spatial resolutions
- of 1000 m, 500 m, and 250 m.
-\end_layout
-
-\begin_layout Description
-Basis\InsetSpace ~
-functions We use trilinear hexahedral cells and linear tetrahedral
- cells.
-\end_layout
-
-\begin_layout Description
-Solution We compute the error in the elastic solution and compare the solution
- over the domain after 0, 1, 5, and 10 years.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/geometry.png
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Geometry of strike-slip benchmark problem.
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:geometry"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Running the Benchmark
-\end_layout
-
-\begin_layout Standard
-After checking out the benchmark files from the CIG SVN repository, change
- to the 
-\family typewriter
-quasistatic/strikeslip
-\family default
- directory.
- Decompress the gzipped files in the meshes and parameters directories,
-\end_layout
-
-\begin_layout LyX-Code
-gunzip meshes/*.gz parameters/*.gz
-\end_layout
-
-\begin_layout Standard
-Change to the parameters directory.
- Each benchmark uses three 
-\family typewriter
-.cfg
-\family default
- files: 
-\family typewriter
-pylithapp.cfg
-\family default
-, a mesher related file (
-\family typewriter
-strikeslip_cubit.cfg
-\family default
- or 
-\family typewriter
-strikeslip_lagrit.cfg
-\family default
-), and a resolution and cell related file (e.g., 
-\family typewriter
-strikeslip_hex8_1000m.cfg
-\family default
-).
- A few examples of running the benchmarks (elastic solution only) are
-\end_layout
-
-\begin_layout LyX-Code
-pylith strikeslip_cubit.cfg strikeslip_hex8_1000m.cfg
-\end_layout
-
-\begin_layout LyX-Code
-pylith strikeslip_cubit.cfg strikeslip_hex8_0500m.cfg
-\end_layout
-
-\begin_layout LyX-Code
-pylith strikeslip_lagrit.cfg strikeslip_tet4_1000m.cfg
-\end_layout
-
-\begin_layout Standard
-To run the time-dependent (viscoelastic) problem, it is necessary to append
- 
-\family typewriter
-timedep.cfg
-\family default
- to the above commands, for example
-\end_layout
-
-\begin_layout LyX-Code
-pylith strikeslip_cubit.cfg strikeslip_hex8_1000m.cfg timedep.cfg
-\end_layout
-
-\begin_layout Standard
-This will run the problem for 10 years, using a time-step size of 0.1 years,
- and results will be output for each year.
- The benchmarks at resolutions of 1000 m, 500 m, and 250 m require  approximatel
-y 150 MB, 960 MB, and 8 GB, respectively.
-\end_layout
-
-\begin_layout Subsection
-Benchmark Results
-\end_layout
-
-\begin_layout Standard
-Figure 
-\begin_inset LatexCommand ref
-reference "fig:benchmark:strikeslip:solution"
-
-\end_inset
-
- shows the displacement field from the simulation with hexahedral cells
- using trilinear basis functions at a resolution of 1000 m.
- For each resolution and set of basis functions, we measure the accuracy
- by comparing the numerical solution against the semi-analytical Okada solution
-\begin_inset LatexCommand cite
-key "Okada:1992"
-
-\end_inset
-
-.
- We also compare the accuracy and runtime across resolutions and different
- cell types.
- This provides practical information about what cell types and resolutions
- are required to achieve a given level of accuracy with the shortest runtime.
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/soln.png
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Displacement field for strike-slip benchmark problem.
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:solution"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Solution Accuracy
-\end_layout
-
-\begin_layout Standard
-We quantify the error in the finite-element solution by integrating the
- L2 norm of the difference between the finite-element solution  and the
- semi-analytical solution evaluated at the quadrature points.
- We define the local error (error for each finite-element cell) to be
-\begin_inset Formula \begin{equation}
-\epsilon_{local}=\frac{1}{V_{cell}}\sqrt{\intop_{cell}\left(u_{i}^{t}-u_{i}^{fem}\right)^{2}\: dV},\end{equation}
-
-\end_inset
-
-where 
-\begin_inset Formula $u_{i}^{t}$
-\end_inset
-
- is the ith component of the displacement field for the semi-analytical
-  solution, and 
-\begin_inset Formula $u_{i}^{fem}$
-\end_inset
-
- is the ith component of the displacement field for the finite-element 
- solution.
-  Taking the square root of the L2 norm and normalizing by  the volume of
- the cell results in an error metric with dimensions of length.
-  This roughly corresponds to the error in the magnitude of the displacement
- field in the finite element solution.
- We define the global error in a similar fashion,
-\begin_inset Formula \begin{equation}
-\epsilon_{global}=\frac{1}{V_{domain}}\sqrt{\intop_{domain}\left(u_{i}^{t}-u_{i}^{fem}\right)^{2}\: dV},\end{equation}
-
-\end_inset
-
- where we sum the L2 norm computed for the local error over all of the 
- cells before taking the square root and dividing by the volume of the domain.
- CIG has developed a package called 
-\begin_inset LatexCommand htmlurl
-name "Cigma"
-target "geodynamics.org/cig/software/packages/cs/cigma"
-
-\end_inset
-
- that computes these local and global error metrics.
-\end_layout
-
-\begin_layout Standard
-Figures 
-\begin_inset LatexCommand ref
-reference "fig:benchmark:strikeslip:tet4:1000m"
-
-\end_inset
-
- through 
-\begin_inset LatexCommand ref
-reference "fig:benchmark:strikeslip:hex8:250m"
-
-\end_inset
-
- show the local error for each of the three resolutions and two cell types.
- The error decreases with decreasing cell size as expected for a converging
- solution.
- The largest errors, which approach 1 mm for 1 m of slip for a discretization
- size of 250 m, occur where the gradient in slip is discontinuous at the
- boundary between the region of uniform slip and linear taper in slip.
- The linear basis functions cannot match this higher order variation.
- The trilinear basis functions in the hexahedral element provide more terms
- in the polynomial defining the variation in the displacement field within
- each cell compared to the linear basis functions for the tetrahedral cell.
- Consequently, for this problem the error for the hexahedral cells at a
- given resolution is smaller than that for the tetrahedral cells.
- Both sets of cell types and basis functions provide the same rate of convergenc
-e as shown in Figure 
-\begin_inset LatexCommand vref
-reference "fig:benchmark:strikeslip:convergence"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/error_tet4_1000m.png
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Local error for strike-slip benchmark problem with tetrahedral cells and
- linear basis functions with a uniform discretization size of 1000 m.
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:tet4:1000m"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/error_hex8_1000m.png
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Local error for strike-slip benchmark problem with hexahedral cells and
- trilinear basis functions with a uniform discretization size of 1000 m.
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:hex8:1000m"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/error_tet4_0500m.png
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Local error for strike-slip benchmark problem with tetrahedral cells and
- linear basis functions with a uniform discretization size of 500 m.
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:tet4:500m"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/error_hex8_0500m.png
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Local error for strike-slip benchmark problem with hexahedral cells and
- trilinear basis functions with a uniform discretization size of 500 m.
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:hex8:500m"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/error_tet4_0250m.png
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Local error for strike-slip benchmark problem with tetrahedral cells and
- linear basis functions with a uniform discretization size of 250 m.
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:tet4:250m"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/error_hex8_0250m.png
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Local error for strike-slip benchmark problem with hexahedral cells and
- trilinear basis functions with a uniform discretization size of 250 m.
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:hex8:250m"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/convergence.png
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Convergence rate for the strike-slip benchmark problem with tetrahedral
- cells and linear basis functions and with hexahedral cells with trilinear
- basis functions.
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:convergence"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Performance
-\end_layout
-
-\begin_layout Standard
-Figure 
-\begin_inset LatexCommand ref
-reference "fig:benchmark:strikeslip:summary"
-
-\end_inset
-
- summarizes the overall performance of each of the six simulations.
- Although at a given resolution, the number of degrees of freedom in the
- hexahedral and tetrahedral meshes are the the same, the number of cells
- in the tetrahedral mesh is about six times greater.
- However, we use only one integration point per tetrahedral cell compared
- to eight for the hexahedral cell.
- This leads to approximately the same number of integration points for the
- two meshes, but the time required to unpack/pack information for each cell
- from the Sieve data structure is greater than the time required to do the
- calculation for each quadrature point (which can take advantage of the
- very fast, small memory cache in the processor).
- As a result, the runtime for the simulations with hexahedral cells is significa
-ntly less than that for the tetrahedral cells at the same resolution.
- 
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/summary.pdf
-	scale 50
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Summary of performance of PyLith for the six simulations of the strike-slip
- benchmark.
- For a given discretization size, hexahedral cells with trilinear basis
- functions provide greater accuracy with a shorter runtime compared with
- tetrahedral cells and linear basis functions.
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:summary"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-Figure 
-\begin_inset LatexCommand vref
-reference "fig:benchmark:strikeslip:scaling"
-
-\end_inset
-
- compares the runtime for the benchmark (elastic solution only) at 500 m
- resolution for 1 to 16 processors.
- The total runtime is the time required for the entire simulation, including
- initialization, distributing the mesh over the processors, solving the
- problem in parallel, and writing the output to VTK files.
- Some initialization steps, writing the output to VTK files, and distributing
- the mesh are essentially serial processes.
- For simulations with many time steps these steps will generally occupy
- only a fraction of the runtime, and the runtime will be dominated by the
- solution of the equations.
- Figure 
-\begin_inset LatexCommand ref
-reference "fig:benchmark:strikeslip:scaling"
-
-\end_inset
-
- also shows the total time required to form the Jacobian of the system,
- form the residual, and solve the system.
- These steps provide a more accurate representation of the parallel-performance
- of the computational portion of the code and show excellent performance
- as evident in the approximately linear slope of 0.7.
- S linear decrease with a slope of 1 would indicate strong scaling, which
- is rarely achieved in real applications.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Standard
-\align center
-\begin_inset Graphics
-	filename figs/scaling.pdf
-	scale 75
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset Caption
-
-\begin_layout Standard
-Parallel performance of PyLith for the strike-slip benchmark problem with
- tetrahedral cells and linear basis functions with a uniform discretization
- size of 500 m.
- The total runtime (total) and the runtime to compute the Jacobian and residual
- and solve the system (compute) are shown.
- The compute runtime decreases with a slope of about 0.7; a linear decrease
- with a slope of 1 would indicate strong scaling,  which is rarely achieved
- in any real application.
- 
-\begin_inset LatexCommand label
-name "fig:benchmark:strikeslip:scaling"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 0
+\use_esint 0
+\use_mhchem 0
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 1in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:benchmarks:strikeslip"
+
+\end_inset
+
+Strike-Slip Benchmark
+\end_layout
+
+\begin_layout Standard
+This benchmark problem computes the viscoelastic (Maxwell) relaxation of
+ stresses from a single, finite, strike-slip earthquake in 3D without gravity.
+  Dirichlet boundary conditions equal to the analytical elastic solution
+ are imposed on the sides of a cube with sides of length 24 km.
+ Anti-plane strain boundary conditions are imposed at y = 0, so the solution
+ is equivalent to that for a domain with a 48 km length in the y direction.
+ We can use the analytical solution of 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Okada:1992"
+
+\end_inset
+
+ both to apply the boundary conditions and to compare against the numerically-co
+mputed elastic solution.
+\end_layout
+
+\begin_layout Standard
+
+\end_layout
+
+\begin_layout Subsection
+Problem Description
+\end_layout
+
+\begin_layout Standard
+Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:strikeslip:geometry"
+
+\end_inset
+
+ shows the geometry of the strike-slip fault (red surface) embedded in the
+ cube consisting of an elastic material (yellow block) over a Maxwell viscoelast
+ic material (blue block).
+ 
+\end_layout
+
+\begin_layout Description
+Domain The domain spans the region
+\begin_inset Formula 
+\begin{gather*}
+0\leq x\leq24\ km,\\
+0\leq y\leq24\ km,\\
+-24\ km\leq z\leq0.
+\end{gather*}
+
+\end_inset
+
+The top (elastic) layer occupies the region 
+\begin_inset Formula $-12\ km\ \leq z\leq0$
+\end_inset
+
+ and the bottom (viscoelastic) layer occupies the region 
+\begin_inset Formula $-24\ km\ \leq z\leq-12\ km$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+Material
+\begin_inset space ~
+\end_inset
+
+properties The material is a Poisson solid with a shear modulus of 30 GPa.
+ The domain is modeled using an elastic isotropic material for the top layer
+ and a Maxwell viscoelastic material for the bottom layer.
+ The bottom layer has a viscosity of 1.0e+18 Pa-s.
+\end_layout
+
+\begin_layout Description
+Fault The fault is a vertical, right-lateral strike-slip fault.
+ The strike is parallel to the y-direction at the center of the model:
+\begin_inset Formula 
+\begin{gather*}
+x=12\ km,\\
+0\leq y\leq16\ km,\\
+-16\ km\leq z\leq0.
+\end{gather*}
+
+\end_inset
+
+Uniform slip of 1 m is applied over the region 
+\begin_inset Formula $0\leq y\leq12\ km$
+\end_inset
+
+ and 
+\begin_inset Formula $-12\ km\leq z\leq0$
+\end_inset
+
+ with a linear taper to 0 at y = 16 km and z = -16 km.
+ The tapered region is the light red portion of the fault surface in Figure
+ 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:strikeslip:geometry"
+
+\end_inset
+
+.
+ In the region where the two tapers overlap, each slip value is the minimum
+ of the two tapers (so that the taper remains linear).
+\end_layout
+
+\begin_layout Description
+Boundary
+\begin_inset space ~
+\end_inset
+
+conditions Bottom and side displacements are set to the elastic analytical
+ solution, and the top of the model is a free surface.
+ There are two exceptions to these applied boundary conditions.
+ The first is on the y=0 plane, where y-displacements are left free to preserve
+ symmetry, and the x- and z-displacements are set to zero.
+ The second is along the line segment between (12, 0, -24) and (12, 24,
+ -24), where the analytical solution blows up in some cases.
+ Along this line segment, all three displacement components are left free.
+\end_layout
+
+\begin_layout Description
+Discretization The model is discretized with nominal spatial resolutions
+ of 1000 m, 500 m, and 250 m.
+\end_layout
+
+\begin_layout Description
+Basis
+\begin_inset space ~
+\end_inset
+
+functions We use trilinear hexahedral cells and linear tetrahedral cells.
+\end_layout
+
+\begin_layout Description
+Solution We compute the error in the elastic solution and compare the solution
+ over the domain after 0, 1, 5, and 10 years.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/geometry.png
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Geometry of strike-slip benchmark problem.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:geometry"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Running the Benchmark
+\end_layout
+
+\begin_layout Standard
+After checking out the benchmark files from the CIG SVN repository, change
+ to the 
+\family typewriter
+quasistatic/strikeslip
+\family default
+ directory.
+ Decompress the gzipped files in the meshes and parameters directories,
+\end_layout
+
+\begin_layout LyX-Code
+gunzip meshes/*.gz parameters/*.gz
+\end_layout
+
+\begin_layout Standard
+Change to the parameters directory.
+ Each benchmark uses three 
+\family typewriter
+.cfg
+\family default
+ files: 
+\family typewriter
+pylithapp.cfg
+\family default
+, a mesher related file (
+\family typewriter
+strikeslip_cubit.cfg
+\family default
+ or 
+\family typewriter
+strikeslip_lagrit.cfg
+\family default
+), and a resolution and cell related file (e.g., 
+\family typewriter
+strikeslip_hex8_1000m.cfg
+\family default
+).
+ A few examples of running the benchmarks (elastic solution only) are
+\end_layout
+
+\begin_layout LyX-Code
+pylith strikeslip_cubit.cfg strikeslip_hex8_1000m.cfg
+\end_layout
+
+\begin_layout LyX-Code
+pylith strikeslip_cubit.cfg strikeslip_hex8_0500m.cfg
+\end_layout
+
+\begin_layout LyX-Code
+pylith strikeslip_lagrit.cfg strikeslip_tet4_1000m.cfg
+\end_layout
+
+\begin_layout Standard
+To run the time-dependent (viscoelastic) problem, it is necessary to append
+ 
+\family typewriter
+timedep.cfg
+\family default
+ to the above commands, for example
+\end_layout
+
+\begin_layout LyX-Code
+pylith strikeslip_cubit.cfg strikeslip_hex8_1000m.cfg timedep.cfg
+\end_layout
+
+\begin_layout Standard
+This will run the problem for 10 years, using a time-step size of 0.1 years,
+ and results will be output for each year.
+ The benchmarks at resolutions of 1000 m, 500 m, and 250 m require  approximatel
+y 150 MB, 960 MB, and 8 GB, respectively.
+\end_layout
+
+\begin_layout Subsection
+Benchmark Results
+\end_layout
+
+\begin_layout Standard
+Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:strikeslip:solution"
+
+\end_inset
+
+ shows the displacement field from the simulation with hexahedral cells
+ using trilinear basis functions at a resolution of 1000 m.
+ For each resolution and set of basis functions, we measure the accuracy
+ by comparing the numerical solution against the semi-analytical Okada solution
+ 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Okada:1992"
+
+\end_inset
+
+.
+ We also compare the accuracy and runtime across resolutions and different
+ cell types.
+ This provides practical information about what cell types and resolutions
+ are required to achieve a given level of accuracy with the shortest runtime.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/soln.png
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Displacement field for strike-slip benchmark problem.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:solution"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Solution Accuracy
+\end_layout
+
+\begin_layout Standard
+We quantify the error in the finite-element solution by integrating the
+ L2 norm of the difference between the finite-element solution  and the
+ semi-analytical solution evaluated at the quadrature points.
+ We define the local error (error for each finite-element cell) to be
+\begin_inset Formula 
+\begin{equation}
+\epsilon_{local}=\frac{1}{V_{cell}}\sqrt{\intop_{cell}\left(u_{i}^{t}-u_{i}^{fem}\right)^{2}\: dV},
+\end{equation}
+
+\end_inset
+
+where 
+\begin_inset Formula $u_{i}^{t}$
+\end_inset
+
+ is the ith component of the displacement field for the semi-analytical
+  solution, and 
+\begin_inset Formula $u_{i}^{fem}$
+\end_inset
+
+ is the ith component of the displacement field for the finite-element 
+ solution.
+  Taking the square root of the L2 norm and normalizing by  the volume of
+ the cell results in an error metric with dimensions of length.
+  This roughly corresponds to the error in the magnitude of the displacement
+ field in the finite element solution.
+ We define the global error in a similar fashion,
+\begin_inset Formula 
+\begin{equation}
+\epsilon_{global}=\frac{1}{V_{domain}}\sqrt{\intop_{domain}\left(u_{i}^{t}-u_{i}^{fem}\right)^{2}\: dV},
+\end{equation}
+
+\end_inset
+
+ where we sum the L2 norm computed for the local error over all of the 
+ cells before taking the square root and dividing by the volume of the domain.
+ CIG has developed a package called Cigma 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+geodynamics.org/cig/software/packages/cs/cigma
+\end_layout
+
+\end_inset
+
+ that computes these local and global error metrics.
+\end_layout
+
+\begin_layout Standard
+Figures 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:strikeslip:tet4:1000m"
+
+\end_inset
+
+ through 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:strikeslip:hex8:250m"
+
+\end_inset
+
+ show the local error for each of the three resolutions and two cell types.
+ The error decreases with decreasing cell size as expected for a converging
+ solution.
+ The largest errors, which approach 1 mm for 1 m of slip for a discretization
+ size of 250 m, occur where the gradient in slip is discontinuous at the
+ boundary between the region of uniform slip and linear taper in slip.
+ The linear basis functions cannot match this higher order variation.
+ The trilinear basis functions in the hexahedral element provide more terms
+ in the polynomial defining the variation in the displacement field within
+ each cell compared to the linear basis functions for the tetrahedral cell.
+ Consequently, for this problem the error for the hexahedral cells at a
+ given resolution is smaller than that for the tetrahedral cells.
+ Both sets of cell types and basis functions provide the same rate of convergenc
+e as shown in Figure 
+\begin_inset CommandInset ref
+LatexCommand vref
+reference "fig:benchmark:strikeslip:convergence"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/error_tet4_1000m.png
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Local error for strike-slip benchmark problem with tetrahedral cells and
+ linear basis functions with a uniform discretization size of 1000 m.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:tet4:1000m"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/error_hex8_1000m.png
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Local error for strike-slip benchmark problem with hexahedral cells and
+ trilinear basis functions with a uniform discretization size of 1000 m.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:hex8:1000m"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/error_tet4_0500m.png
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Local error for strike-slip benchmark problem with tetrahedral cells and
+ linear basis functions with a uniform discretization size of 500 m.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:tet4:500m"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/error_hex8_0500m.png
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Local error for strike-slip benchmark problem with hexahedral cells and
+ trilinear basis functions with a uniform discretization size of 500 m.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:hex8:500m"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/error_tet4_0250m.png
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Local error for strike-slip benchmark problem with tetrahedral cells and
+ linear basis functions with a uniform discretization size of 250 m.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:tet4:250m"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/error_hex8_0250m.png
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Local error for strike-slip benchmark problem with hexahedral cells and
+ trilinear basis functions with a uniform discretization size of 250 m.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:hex8:250m"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/convergence.png
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Convergence rate for the strike-slip benchmark problem with tetrahedral
+ cells and linear basis functions and with hexahedral cells with trilinear
+ basis functions.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:convergence"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Performance
+\end_layout
+
+\begin_layout Standard
+Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:strikeslip:summary"
+
+\end_inset
+
+ summarizes the overall performance of each of the six simulations.
+ Although at a given resolution, the number of degrees of freedom in the
+ hexahedral and tetrahedral meshes are the same, the number of cells in
+ the tetrahedral mesh is about six times greater.
+ However, we use only one integration point per tetrahedral cell compared
+ to eight for the hexahedral cell.
+ This leads to approximately the same number of integration points for the
+ two meshes, but the time required to unpack/pack information for each cell
+ from the Sieve data structure is greater than the time required to do the
+ calculation for each quadrature point (which can take advantage of the
+ very fast, small memory cache in the processor).
+ As a result, the runtime for the simulations with hexahedral cells is significa
+ntly less than that for the tetrahedral cells at the same resolution.
+ 
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/summary.pdf
+	scale 50
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Summary of performance of PyLith for the six simulations of the strike-slip
+ benchmark.
+ For a given discretization size, hexahedral cells with trilinear basis
+ functions provide greater accuracy with a shorter runtime compared with
+ tetrahedral cells and linear basis functions.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:summary"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Figure 
+\begin_inset CommandInset ref
+LatexCommand vref
+reference "fig:benchmark:strikeslip:scaling"
+
+\end_inset
+
+ compares the runtime for the benchmark (elastic solution only) at 500 m
+ resolution for 1 to 16 processors.
+ The total runtime is the time required for the entire simulation, including
+ initialization, distributing the mesh over the processors, solving the
+ problem in parallel, and writing the output to VTK files.
+ Some initialization steps, writing the output to VTK files, and distributing
+ the mesh are essentially serial processes.
+ For simulations with many time steps these steps will generally occupy
+ only a fraction of the runtime, and the runtime will be dominated by the
+ solution of the equations.
+ Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:benchmark:strikeslip:scaling"
+
+\end_inset
+
+ also shows the total time required to form the Jacobian of the system,
+ form the residual, and solve the system.
+ These steps provide a more accurate representation of the parallel-performance
+ of the computational portion of the code and show excellent performance
+ as evident in the approximately linear slope of 0.7.
+ S linear decrease with a slope of 1 would indicate strong scaling, which
+ is rarely achieved in real applications.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/scaling.pdf
+	scale 75
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Parallel performance of PyLith for the strike-slip benchmark problem with
+ tetrahedral cells and linear basis functions with a uniform discretization
+ size of 500 m.
+ The total runtime (total) and the runtime to compute the Jacobian and residual
+ and solve the system (compute) are shown.
+ The compute runtime decreases with a slope of about 0.7; a linear decrease
+ with a slope of 1 would indicate strong scaling,  which is rarely achieved
+ in any real application.
+ 
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:benchmark:strikeslip:scaling"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/boundaryconditions/boundaryconditions.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/boundaryconditions/boundaryconditions.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/boundaryconditions/boundaryconditions.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,7860 +1,7952 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding auto
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 1
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 1in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Chapter
-\begin_inset CommandInset label
-LatexCommand label
-name "cha:boundary:interface:conditions"
-
-\end_inset
-
-Boundary and Interface Conditions
-\end_layout
-
-\begin_layout Section
-Assigning Boundary Conditions
-\end_layout
-
-\begin_layout Standard
-There are four basic steps in assigning a specific boundary condition to
- a portion of the domain.
-\end_layout
-
-\begin_layout Enumerate
-Create sets of vertices in the mesh generation process for each boundary
- condition.
-\end_layout
-
-\begin_layout Enumerate
-Define boundary condition groups corresponding to the vertex sets.
-\end_layout
-
-\begin_layout Enumerate
-Set the parameters for each boundary condition group using 
-\family typewriter
-.cfg
-\family default
- or 
-\family typewriter
-.pml
-\family default
- files and/or command line arguments.
-\end_layout
-
-\begin_layout Enumerate
-Specify the spatial variation in parameters for the boundary condition using
- a spatial database file.
-\end_layout
-
-\begin_layout Subsection
-Creating Sets of Vertices
-\end_layout
-
-\begin_layout Standard
-The procedure for creating sets of vertices differs depending on the mesh
- generator.
- For meshes specified using the PyLith mesh ASCII format, the sets of vertices
- are specified using groups (see Appendix 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:MeshIOAscii"
-
-\end_inset
-
-).
- In CUBIT the groups of vertices are created using nodesets.
- Similarly, in LaGriT, psets are used.
- Note that we chose to associated boundary conditions with groups of vertices
- because nearly every mesh generation package supports associating a string
- or integer with groups of vertices.
- Note also that we currently associate boundary conditions with string identifie
-rs, so even if the mesh generator uses integers, the name is specified as
- the digits of the integer value.
- Finally, note that every vertex set that ultimately is associated with
- a boundary condition on a cell face (e.g., Neumann boundary conditions and
- fault interface conditions) must correspond to a simply-connected surface.
-\end_layout
-
-\begin_layout Subsection
-Arrays of Boundary Condition Components
-\end_layout
-
-\begin_layout Standard
-A dynamic array of boundary condition components associates a name (string)
- with each boundary condition.
- This dynamic array of boundary conditions replaces the boundary condition
- container in PyLith 1.0.
- User-defined containers are no longer necessary, and the predefined containers
- are no longer available (or necessary).
- The default boundary condition for each component in the array is the Dirichlet
-Points object.
- Other boundary conditions can be bound to the named items in the array
- via a 
-\family typewriter
-.cfg
-\family default
- file, 
-\family typewriter
-.pml
-\family default
- file, or the command line.
- The parameters for the boundary condition are set using the name of the
- boundary condition.
- An example of setting the array of boundary condition components and changing
- the types of boundary conditions in a 
-\family typewriter
-.cfg
-\family default
- file:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem]
-\end_layout
-
-\begin_layout LyX-Code
-bc = [x_neg,x_pos,y_pos,z_neg] ; Array of boundary conditions
-\end_layout
-
-\begin_layout LyX-Code
-# Default boundary condition is DirichletPoints
-\end_layout
-
-\begin_layout LyX-Code
-# Keep default value for bc.x_neg
-\end_layout
-
-\begin_layout LyX-Code
-bc.x_pos = pylith.bc.DirichletBoundary ; change BC type to DirichletBoundary
-\end_layout
-
-\begin_layout LyX-Code
-bc.y_pos = pylith.bc.AbsorbingDampers ; change BC type to AbsorbingDampers
-\end_layout
-
-\begin_layout LyX-Code
-bc.z_neg = pylith.bc.Neumann ; change BC type to Neumann (traction)
-\end_layout
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:Time:Dependent:BC"
-
-\end_inset
-
-Time-Dependent Boundary Conditions
-\end_layout
-
-\begin_layout Standard
-Several boundary conditions use a common formulation for the spatial and
- temporal variation of the boundary condition parameters,
-\begin_inset Formula 
-\begin{equation}
-f(\vec{x})=f_{0}(\vec{x})+\dot{f}_{0}(\vec{x})(t-t_{0}(\vec{x}))+f_{1}(\vec{x})a(t-t_{1}(\vec{x})),
-\end{equation}
-
-\end_inset
-
-where 
-\begin_inset Formula $f(\vec{x})$
-\end_inset
-
- may be a scalar or vector parameter, 
-\begin_inset Formula $f_{0}(\vec{x})$
-\end_inset
-
- is a constant value, 
-\begin_inset Formula $\dot{f}_{0}(\vec{x})$
-\end_inset
-
- is a constant rate of change in the value, 
-\begin_inset Formula $t_{0}(\vec{x})$
-\end_inset
-
- is the onset time for the constant rate of change, 
-\begin_inset Formula $f_{1}(\vec{x})$
-\end_inset
-
- is the amplitude for the temporal modulation, 
-\begin_inset Formula $a(t)$
-\end_inset
-
- is the variation in amplitude with time, 
-\begin_inset Formula $t_{1}(\vec{x})$
-\end_inset
-
- is the onset time for the temporal modulation, and 
-\begin_inset Formula $\vec{x}$
-\end_inset
-
- is the position of a location in space.
- This common formulation permits easy specification of a scalar or vector
- with a constant value, constant rate of change of a value, and/or modulation
- of a value in time.
- One can specify just the initial value, just the rate of change of the
- value (along with the corresponding onset time), or just the modulation
- in amplitude (along with the corresponding temporal variation and onset
- time), or any combination of the three.
- The facilities associated with this formulation are:
-\end_layout
-
-\begin_layout Description
-db_initial Spatial database specifying the spatial variation in the initial
- value (default is none).
-\end_layout
-
-\begin_layout Description
-db_rate Spatial database specifying rate of change in the value (default
- is none).
-\end_layout
-
-\begin_layout Description
-db_change Spatial database specifying the amplitude of the temporal modulation
- (default is none).
-\end_layout
-
-\begin_layout Description
-th_change Time history database specifying the temporal change in amplitude
- (default is none).
-\end_layout
-
-\begin_layout Subsection
-Dirichlet Boundary Conditions
-\end_layout
-
-\begin_layout Standard
-Dirichlet boundary conditions in PyLith prescribe the displacement of a
- subset of the vertices of the finite-element mesh.
- While Dirichlet boundary conditions can be applied to any vertex, usually
- they are applied to vertices on the lateral and bottom boundaries of the
- domain.
- There are two types of Dirichlet boundary conditions, DirichletBC and Dirichlet
-Boundary.
- Both provide identical constraints on the solution, but DirichletBoundary
- is limited to vertices of a simply-connected surface, which allows diagnostic
- output of the prescribed displacements.
- DirichletBC can be applied to a set of unconnected vertices.
-\end_layout
-
-\begin_layout Subsubsection
-Dirichlet Boundary Condition Parameters
-\end_layout
-
-\begin_layout Standard
-The properties and components common to both the DirichletPoints and DirichletBo
-undary boundary conditions are:
-\end_layout
-
-\begin_layout Description
-label Label of the group of vertices associated with the boundary condition.
-\end_layout
-
-\begin_layout Description
-bc_dof Array of degrees of freedom to be fixed (first degree of freedom
- is 0).
-\end_layout
-
-\begin_layout Standard
-DirichletBoundary contains an additional component:
-\end_layout
-
-\begin_layout Description
-output Manager for output of displacements on boundary with specified displaceme
-nts.
-\end_layout
-
-\begin_layout Standard
-By default the output manager does not output any information.
- The specified displacements and velocities can be output by including ``displac
-ements'' and ``velocities'' in the output manager's 
-\family typewriter
-vertex_info_fields
-\family default
- array parameter.
- An example of setting the Dirichlet boundary condition parameters in a
- 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem]
-\end_layout
-
-\begin_layout LyX-Code
-bc = [mybc]
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.bc.mybc]
-\end_layout
-
-\begin_layout LyX-Code
-label = group A 
-\end_layout
-
-\begin_layout LyX-Code
-bc_dof = [2] ; fixed displacement in z direction
-\end_layout
-
-\begin_layout LyX-Code
-db_initial = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.iohandler.filename = disp_A.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.query_type = nearest ; change query type to nearest point algorithm
-\end_layout
-
-\begin_layout LyX-Code
-db_rate = spatialdata.spatialdb.UniformDB
-\end_layout
-
-\begin_layout LyX-Code
-db_rate.values = [displacement-rate-z]
-\end_layout
-
-\begin_layout LyX-Code
-db_rate.data = [1.0e-06*m/s] ; velocity is 1.0e-06 m/s
-\end_layout
-
-\begin_layout Standard
-We have created an array with one boundary condition, mybc.
- The group of vertices associated with the boundary condition is group A.
- For the database associated with the constant displacement, we use a SimpleDB.
- We set the filename and query type for the database.
- For the rate of change of values, we use a UniformDB and specify the velocity
- in the z-direction to be 1.0e-06 m/s.
- See Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:spatial:databases"
-
-\end_inset
-
- for a discussion of the different types of spatial databases available.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:dirichlet:output"
-
-\end_inset
-
-Fields available in output of DirichletBoundary boundary condition information.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="6" columns="3">
-<features tabularvalignment="middle">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="3in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Field Type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Field
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-vertex_info_fields
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-displacement_initial
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Initial displacement field in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-velocity
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rate of change of displacement field in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-velocity_start_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Onset time in seconds for rate of change in displacement field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-displacement_change
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amplitude of change in displacement field in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-change_start_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Onset time in seconds for the amplitude change in the displacement field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Dirichlet Boundary Condition Spatial Database Files
-\end_layout
-
-\begin_layout Standard
-The spatial database files for the Dirichlet boundary condition specify
- the fixed displacements.
- The spatial database file may contain displacements at more degrees of
- freedom than those specified in the Dirichlet boundary condition settings
- using the 
-\family typewriter
-bc_dof
-\family default
- setting.
- Only those listed in 
-\family typewriter
-bc_dof
-\family default
- will be used.
- This permits using the same spatial database file for multiple Dirichlet
- boundary conditions with the same displacement field.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Values in the spatial databases used for Dirichlet boundary conditions.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="4" columns="2">
-<features tabularvalignment="middle">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="4in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Spatial database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Name in Spatial Database
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_initial
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-displacement-x, displacement-y, displacement-z
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_rate
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-displacement-rate-x, displacement-rate-y, displacement-rate-z, rate-start-time
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_change
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-displacement-x, displacement-y, displacement-z, change-start-time
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Neumann Boundary Conditions
-\end_layout
-
-\begin_layout Standard
-Neumann boundary conditions are surface tractions applied over a subset
- of the mesh.
- As with the DirichletBoundary condition, each Neumann boundary condition
- can only be applied to a simply-connected surface.
- The surface over which the tractions are applied always has a spatial dimension
- that is one less than the dimension of the finite-element mesh.
- Traction values are computed at the integration points of each cell on
- the surface, using values from a spatial database.
- The tractions are integrated over each cell and assembled to obtain the
- forces applied at the vertices.
- See Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sub:Tutorial-twoquad4-traction"
-
-\end_inset
-
- for a tutorial that uses Neumann boundary conditions.
-\end_layout
-
-\begin_layout Subsubsection
-Neumann Boundary Condition Parameters
-\end_layout
-
-\begin_layout Standard
-The Neumann boundary condition properties and components are:
-\end_layout
-
-\begin_layout Description
-label Name of the group of vertices defining the mesh boundary for the Neumann
- boundary condition.
-\end_layout
-
-\begin_layout Description
-up_dir This is a 3-vector that provides a hint for the direction perpendicular
- to the horizontal tangent direction that is not collinear with the direction
- normal to the surface.
- The default value is (0,0,1), which assumes that the z-axis is positive
- upward.
- This vector is only needed for three-dimensional problems where the positive
- upward direction differs from the default.
-\end_layout
-
-\begin_layout Description
-output The output manager associated with diagnostic output (traction vector).
-\end_layout
-
-\begin_layout Description
-quadrature The quadrature object to be used for numerical integration.
- Since we are integrating over a surface that is one dimension lower than
- the problem domain, this would typically be set to something like 
-\family typewriter
-Quadrature2Din3D
-\family default
- (for a three-dimensional problem).
-\end_layout
-
-\begin_layout Standard
-By default the output manager does not output any information.
- The specified tractions can be output in global coordinates by including
- ``tractions'' in the output manager's 
-\family typewriter
-cell_info_fields
-\family default
- array parameter.
- An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent]
-\end_layout
-
-\begin_layout LyX-Code
-bc = [x_neg,x_pos,y_neg]
-\end_layout
-
-\begin_layout LyX-Code
-bc.x_pos = pylith.bc.Neumann ; Change BC type to Neumann
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.bc.x_pos]
-\end_layout
-
-\begin_layout LyX-Code
-label = x_pos ; Name of group of vertices for +x boundary
-\end_layout
-
-\begin_layout LyX-Code
-db_initial = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.label = Neumann BC +x edge
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.iohandler.filename = axialtract.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.query_type = nearest
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell = pylith.feassemble.FIATLagrange
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell.dimension = 1
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell.quad_order = 2
-\end_layout
-
-\begin_layout Standard
-These settings correspond to the example problem described in Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sub:Tutorial-twoquad4-traction"
-
-\end_inset
-
-.
- It is necessary to set the boundary condition type to 
-\family typewriter
-pylith.bc.Neumann
-\family default
-, since the default value is 
-\family typewriter
-Dirichlet
-\family default
-BC.
- Constant tractions are used for this particular problem, so a quadrature
- order of one would have been sufficient; however, for problems involving
- more complex variations (e.g., a linear variation), a quadrature order of
- two will provide more accurate results.
- Note that there is no advantage to specifying an integration order higher
- than two, since linear elements are being used for this problem.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:neumann:output"
-
-\end_inset
-
-Fields available in output of Neumann boundary condition information.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="6" columns="3">
-<features tabularvalignment="middle">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="3in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Field Type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Field
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-cell_info_fields
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-tracton_initial
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Initial traction field in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction_rate
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rate of change of traction field in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-rate_start_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Onset time in seconds for rate of change in traction field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction_change
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amplitude of change in traction field in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-change_start_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Onset time in seconds for the amplitude change in the traction field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Neumann Boundary Condition Spatial Database Files
-\end_layout
-
-\begin_layout Standard
-The spatial database files for the Neumann boundary condition specify the
- applied tractions.
- The number of traction components is equal to the spatial dimension for
- the problem.
- The tractions are specified in a local coordinate system for the boundary.
- The names of the components of the traction vector are:
-\end_layout
-
-\begin_layout Description
-one-dimensional 
-\family typewriter
-normal
-\end_layout
-
-\begin_layout Description
-two-dimensional 
-\family typewriter
-shear
-\family default
-, 
-\family typewriter
-normal
-\end_layout
-
-\begin_layout Description
-three-dimensional 
-\family typewriter
-horiz-shear
-\family default
-, 
-\family typewriter
-vert-shear
-\family default
-, 
-\family typewriter
-normal
-\end_layout
-
-\begin_layout Standard
-Ambiguities in specifying the shear tractions in 3D problems are resolved
- using the 
-\family typewriter
-up_dir
-\family default
- parameter.
- In the case of a horizontal surface, users will need to pick an alternative
- vector, as the default 
-\family typewriter
-up_dir
-\family default
- would coincide with the normal direction.
- In this case, the orientation for the 
-\family typewriter
-vert-shear-traction
-\family default
- component will correspond to whatever the user specifies for 
-\family typewriter
-up_dir
-\family default
-, rather than the actual vertical direction.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Values in the spatial databases used for Dirichlet boundary conditions in
- three dimensions.
- In one- and two-dimensional problems, the names of the components are slightly
- different as described earlier in this section.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="4" columns="2">
-<features tabularvalignment="middle">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="4in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Spatial database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Name in Spatial Database
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_initial
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-shear-horiz, traction-shear-vert, traction-normal
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_rate
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-rate-horiz-shear, traction-rate-vert-shear, traction-rate-normal,
- rate-start-time
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_change
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-horiz-shear, traction-vert-shear, traction-normal, change-start-time
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Point Force Boundary Conditions
-\end_layout
-
-\begin_layout Standard
-Point force boundary conditions in PyLith prescribe the application of point
- forces to a subset of the vertices of the finite-element mesh.
- While point force boundary conditions can be applied to any vertex, usually
- they are applied to vertices on the lateral, top, and bottom boundaries
- of the domain.
-\end_layout
-
-\begin_layout Subsubsection
-Point Force Parameters
-\end_layout
-
-\begin_layout Standard
-The properties and components common to both the DirichletBC and DirichletBounda
-ry boundary conditions are:
-\end_layout
-
-\begin_layout Description
-label Label of the group of vertices associated with the boundary condition.
-\end_layout
-
-\begin_layout Description
-bc_dof Array of degrees of freedom to which forces are applied (first degree
- of freedom is 0).
-\end_layout
-
-\begin_layout Standard
-An example of setting the point force boundary condition parameters in a
- 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem]
-\end_layout
-
-\begin_layout LyX-Code
-bc = [mybc]
-\end_layout
-
-\begin_layout LyX-Code
-bc.mybc = pylith.bc.PointForce
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.bc.mybc]
-\end_layout
-
-\begin_layout LyX-Code
-label = group A 
-\end_layout
-
-\begin_layout LyX-Code
-bc_dof = [2] ; fixed displacement in z direction
-\end_layout
-
-\begin_layout LyX-Code
-db_initial = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.iohandler.filename = force_A.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.query_type = nearest ; change query type to nearest point algorithm
-\end_layout
-
-\begin_layout LyX-Code
-db_rate = spatialdata.spatialdb.UniformDB
-\end_layout
-
-\begin_layout LyX-Code
-db_rate.values = [force-rate-z]
-\end_layout
-
-\begin_layout LyX-Code
-db_rate.data = [1.0e+5*newton/s]
-\end_layout
-
-\begin_layout Standard
-We have created an array with one boundary condition, mybc.
- The group of vertices associated with the boundary condition is group A.
- For the database associated with the constant force, we use a SimpleDB.
- We set the filename and query type for the database.
- For the rate of change of values, we use a UniformDB and specify the rate
- of change in the force to be 1.0e+5 Newton/s.
- See Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:spatial:databases"
-
-\end_inset
-
- for a discussion of the different types of spatial databases available.
-\end_layout
-
-\begin_layout Subsubsection
-Point Force Spatial Database Files
-\end_layout
-
-\begin_layout Standard
-The spatial database files for the Dirichlet boundary condition specify
- the fixed displacements.
- The spatial database file may contain displacements at more degrees of
- freedom than those specified in the Dirichlet boundary condition settings
- using the 
-\family typewriter
-bc_dof
-\family default
- setting.
- Only those listed in 
-\family typewriter
-bc_dof
-\family default
- will be used.
- This permits using the same spatial database file for multiple Dirichlet
- boundary conditions with the same displacement field.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Values in the spatial databases used for point force boundary conditions.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="4" columns="2">
-<features tabularvalignment="middle">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="4in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Spatial database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Name in Spatial Database
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_initial
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-force-x, force-y, force-z
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_rate
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-force-rate-x, force-rate-y, force-rate-z, rate-start-time
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_change
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-force-x, force-y, force-z, change-start-time
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:absorbing:boundaries"
-
-\end_inset
-
-Absorbing Boundary Conditions
-\end_layout
-
-\begin_layout Standard
-This boundary condition attempts to prevent seismic waves reflecting off
- of a boundary by placing simple dashpots on the boundary.
- Normally incident dilatational and shear waves are perfectly absorbed.
- Waves incident at other angles are only partially absorbed.
- This boundary condition is simpler than a perfectly matched layer (PML)
- boundary condition but does not perform quite as well, especially for surface
- waves.
- If the waves arriving at the absorbing boundary are relatively small in
- amplitude compared to the amplitudes of primary interest, this boundary
- condition gives reasonable results.
-\end_layout
-
-\begin_layout Standard
-The Absorbing boundary condition properties and components are:
-\end_layout
-
-\begin_layout Description
-label Name of the group of vertices defining the mesh boundary for the absorbing
- boundary condition.
-\end_layout
-
-\begin_layout Description
-up_dir This is a 3-vector that provides a hint for the direction perpendicular
- to the horizontal tangent direction that is not collinear with the direction
- normal to the surface.
- The default value is (0,0,1), which assumes that the z-axis is positive
- upward.
- This vector is only needed for three-dimensional problems where the positive
- upward direction differs from the default.
-\end_layout
-
-\begin_layout Description
-db The spatial database specifying the material properties for the seismic
- velocities.
-\end_layout
-
-\begin_layout Description
-quadrature The quadrature object to be used for numerical integration.
- Since we are integrating over a surface that is one dimension lower than
- the problem domain, this would typically be set to something like 
-\family typewriter
-Quadrature2Din3D
-\family default
- (for a three-dimensional problem).
-\end_layout
-
-\begin_layout Subsection
-Finite-Element Implementation of Absorbing Boundary
-\end_layout
-
-\begin_layout Standard
-Consider a plane wave propagating at a velocity 
-\begin_inset Formula $c$
-\end_inset
-
-.
- We can write the displacement field as
-\begin_inset Formula 
-\begin{equation}
-\vec{u}(\vec{x},t)=\vec{u^{t}}(t-\frac{\vec{x}}{c}),
-\end{equation}
-
-\end_inset
-
-where 
-\begin_inset Formula $\vec{x}$
-\end_inset
-
- is position, 
-\begin_inset Formula $t$
-\end_inset
-
- is time, and 
-\begin_inset Formula $\vec{u^{t}}$
-\end_inset
-
- is the shape of the propagating wave.
- For an absorbing boundary we want the traction on the boundary to be equal
- to the traction associated with wave propagating out of the domain.
- Starting with the expression for the traction on a boundary, 
-\begin_inset Formula $T_{i}=\sigma_{ij}n_{j},$
-\end_inset
-
- and using the local coordinate system for the boundary 
-\begin_inset Formula $s_{h}s_{v}n,$
-\end_inset
-
- where 
-\begin_inset Formula $\vec{n}$
-\end_inset
-
- is the direction normal to the boundary, 
-\begin_inset Formula $\overrightarrow{s}_{h}$
-\end_inset
-
- is the horizontal direction tangent to the boundary, and 
-\begin_inset Formula $\overrightarrow{s}_{v}$
-\end_inset
-
- is the vertical direction tangent to the boundary, the tractions on the
- boundary are
-\begin_inset Formula 
-\begin{gather}
-T_{s_{h}}=\sigma_{s_{h}n}\\
-T_{s_{v}}=\sigma_{s_{v}n}\\
-T_{n}=\sigma_{nn}.
-\end{gather}
-
-\end_inset
-
-In the case of a horizontal boundary, we can define an auxiliary direction
- in order to assign unique tangential directions.
- For a linear elastic isotropic material, 
-\begin_inset Formula $\sigma_{ij}=\lambda\epsilon_{kk}\delta_{ij}+2\mu\epsilon_{ij},$
-\end_inset
-
- and we can write the tractions as 
-\begin_inset Formula 
-\begin{gather}
-T_{s_{h}}=2\mu\epsilon_{s_{h}n}\\
-T_{s_{v}}=2\epsilon_{s_{v}n}\\
-T_{n}=(\lambda+2\mu)\epsilon_{nn}+\lambda(\epsilon_{s_{h}s_{h}}+\epsilon_{s_{v}s_{v}}).
-\end{gather}
-
-\end_inset
-
-For infinitesimal strains, 
-\begin_inset Formula $\epsilon_{ij}=\frac{1}{2}(u_{i,j}+u_{j,i})$
-\end_inset
-
- and we have
-\begin_inset Formula 
-\begin{gather}
-\epsilon_{s_{h}n}=\frac{1}{2}(u_{s_{h},n}+u_{n,s_{h}})\\
-\epsilon_{s_{v}n}=\frac{1}{2}(u_{s_{v},n}+u_{n,s_{v}})\\
-\epsilon_{nn}=u_{n,n}.
-\end{gather}
-
-\end_inset
-
-For our propagating plane wave, we recognize that
-\begin_inset Formula 
-\begin{equation}
-\frac{\partial\vec{u^{t}}(t-\frac{\vec{x}}{c})}{\partial x_{i}}=-\frac{1}{c}\frac{\partial\vec{u^{t}}(t-\frac{\vec{x}}{c})}{\partial t},
-\end{equation}
-
-\end_inset
-
-so that our expressions for the tractions become
-\begin_inset Formula 
-\begin{gather}
-T_{s_{h}}=-\frac{\mu}{c}\left(\frac{\partial u_{s_{h}}^{t}(t-\frac{\vec{x}}{c})}{\partial t}+\frac{\partial u_{n}^{t}(t-\frac{\vec{x}}{c})}{\partial t}\right),\\
-T_{s_{v}}=-\frac{\mu}{c}\left(\frac{\partial u_{s_{v}}^{t}(t-\frac{\vec{x}}{c})}{\partial t}+\frac{\partial u_{n}^{t}(t-\frac{\vec{x}}{c})}{\partial t}\right).
-\end{gather}
-
-\end_inset
-
-For the normal traction, consider a dilatational wave propagating normal
- to the boundary at speed 
-\begin_inset Formula $v_{p}$
-\end_inset
-
-; in this case 
-\begin_inset Formula $u_{s_{h}}=u_{s_{v}}=0$
-\end_inset
-
- and 
-\begin_inset Formula $c=v_{p}$
-\end_inset
-
-.
- For the shear tractions, consider a shear wave propagating normal to the
- boundary at speed 
-\begin_inset Formula $v_{s}$
-\end_inset
-
-; we can decompose this into one case where 
-\begin_inset Formula $u_{n}=u_{s_{v}}=0$
-\end_inset
-
- and another case where 
-\begin_inset Formula $u_{n}=u_{s_{h}}=0$
-\end_inset
-
-, with 
-\begin_inset Formula $c=v_{s}$
-\end_inset
-
- in both cases.
- We also recognize that 
-\begin_inset Formula $\mu=\rho v_{s}^{2}$
-\end_inset
-
- and 
-\begin_inset Formula $\lambda+2\mu=\rho v_{p}^{2}$
-\end_inset
-
-.
- This leads to the following expressions for the tractions:
-\begin_inset Formula 
-\begin{gather}
-T_{s_{h}}=-\rho v_{s}\frac{\partial u_{s_{h}}^{t}(t-\frac{\vec{x}}{c})}{\partial t}\\
-T_{s_{v}}=-\rho v_{s}\frac{\partial u_{v}^{t}(t-\frac{\vec{x}}{c})}{\partial t}\\
-T_{n}=-\rho v_{p}\frac{\partial u_{n}^{t}(t-\frac{\vec{x}}{c})}{\partial t}
-\end{gather}
-
-\end_inset
-
-We write the weak form of the boundary condition as
-\begin_inset Formula 
-\[
-\int_{S_{T}}T_{i}\phi_{i}\, dS=\int_{S_{T}}-\rho c_{i}\frac{\partial u_{i}}{\partial t}\phi_{i}\, dS,
-\]
-
-\end_inset
-
-where 
-\begin_inset Formula $c_{i}$
-\end_inset
-
- equals 
-\begin_inset Formula $v_{p}$
-\end_inset
-
- for the normal traction and 
-\begin_inset Formula $v_{s}$
-\end_inset
-
- for the shear tractions, and 
-\begin_inset Formula $\phi_{i}$
-\end_inset
-
- is our weighting function.
- We express the trial solution and weighting function as linear combinations
- of basis functions,
-\begin_inset Formula 
-\begin{gather}
-u_{i}=\sum_{m}a_{i}^{m}N^{m},\\
-\phi_{i}=\sum_{n}c_{i}^{n}N^{n}.
-\end{gather}
-
-\end_inset
-
-Substituting into our integral over the absorbing boundaries yields
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-\int_{S_{T}}T_{i}\phi_{i}\, dS=\int_{S_{T}}-\rho c_{i}\sum_{m}\dot{a}_{i}^{m}N^{m}\sum_{n}c_{i}^{n}N^{n}\, dS.
-\end{equation}
-
-\end_inset
-
-In the derivation of the governing equations, we recognized that the weighting
- function is arbitrary, so we form the residual by setting the terms associated
- with the coefficients 
-\begin_inset Formula $c_{i}^{n}$
-\end_inset
-
- to zero,
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-r_{i}^{n}=\sum_{\text{tract cells}}\sum_{\text{quad pts}}-\rho(x_{q})c_{i}(x_{q})\sum_{m}\dot{a}_{i}^{m}N^{m}(x_{q})N^{n}(x_{q})w_{q}|J_{cell}(x_{q})|,
-\end{equation}
-
-\end_inset
-
- where 
-\begin_inset Formula $x_{q}$
-\end_inset
-
- are the coordinates of the quadrature points, 
-\begin_inset Formula $w_{q}$
-\end_inset
-
- are the weights of the quadrature points, and 
-\begin_inset Formula $|J_{cell}(x_{q})|$
-\end_inset
-
- is the determinant of the Jacobian matrix evaluated at the quadrature points
- associated with mapping the reference cell to the actual cell.
-\end_layout
-
-\begin_layout Standard
-The appearance of velocity in the expression for the residual means that
- the absorbing dampers also contribute to the system Jacobian matrix.
- Use the central difference method, the velocity is written in terms of
- the displacements,
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-\dot{u}_{i}(t)=\frac{1}{2\Delta t}(u_{i}(t+\Delta t)-u_{i}(t-\Delta t)).
-\end{equation}
-
-\end_inset
-
-Expressing the displacement at time 
-\begin_inset Formula $t+\Delta t$
-\end_inset
-
- in terms of the displacement at time 
-\begin_inset Formula $t$
-\end_inset
-
- (
-\begin_inset Formula $u_{i}(t)$
-\end_inset
-
-) and the increment in the displacement at time 
-\begin_inset Formula $t$
-\end_inset
-
- (
-\begin_inset Formula $du_{i}(t)$
-\end_inset
-
-) leads to
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-\dot{u}_{i}(t)=\frac{1}{2\Delta t}(du_{i}(t)+u_{i}(t)-u_{i}(t-\Delta t))
-\end{equation}
-
-\end_inset
-
-The terms contributing to the system Jacobian are associated with the increment
- in the displacement at time time.
- Substituting into the governing equations and isolating the term associated
- with the increment in the displacement at time t yields
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-A_{ij}^{nm}=\sum_{\text{tract cells}}\sum_{\text{quad pts}}\delta_{ij}\frac{1}{2\Delta t}\rho(x_{q})v_{i}(x_{q})N^{m}(x_{q})N^{n}(x_{q})w_{q}|J_{cells}(x_{q})|,
-\end{equation}
-
-\end_inset
-
-where 
-\begin_inset Formula $A_{ij}^{mn}$
-\end_inset
-
- is a 
-\begin_inset Formula $nd$
-\end_inset
-
- by 
-\begin_inset Formula $md$
-\end_inset
-
- matrix (
-\begin_inset Formula $d$
-\end_inset
-
- is the dimension of the vector space), 
-\begin_inset Formula $m$
-\end_inset
-
- and 
-\begin_inset Formula $n$
-\end_inset
-
- refer to the basis functions and 
-\begin_inset Formula $i$
-\end_inset
-
- and 
-\begin_inset Formula $j$
-\end_inset
-
- are vector space components.
-\end_layout
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:fault"
-
-\end_inset
-
-Fault Interface Conditions
-\end_layout
-
-\begin_layout Standard
-Fault interfaces are used to create dislocations (jumps in the displacement
- field) in the model.
- The dislocations arise from slip across a fault surface.
- Both shear and tensile dislocations are supported.
- For fault interfaces, dislocations in 1D correspond to fault-opening (and
- closing), in 2D lateral-slip and fault opening, and in 3D lateral-slip,
- reverse-slip, and fault opening.
- PyLith supports kinematic (prescribed) slip and dynamic (spontaneous) rupture
- simulations.
-\end_layout
-
-\begin_layout Subsection
-Conventions
-\end_layout
-
-\begin_layout Standard
-Slip corresponds to relative motion across a fault surface.
- Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:fault:orientation"
-
-\end_inset
-
- shows the orientation of the slip vector in 3D with respect to the fault
- surface and coordinate axes.
- PyLith automatically determines the orientation of the fault surface.
- This alleviates the user from having to compute the strike, dip, and rake
- angles over potentially complex, nonplanar fault surfaces.
- Instead, the user specifies fault parameters in terms of lateral motion,
- reverse motion, and fault opening as shown in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:fault:slip:motions"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/faultOrientation.eps
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Orientation of a fault surface in 3D, where 
-\begin_inset Formula $\phi$
-\end_inset
-
- denotes the angle of the fault strike, 
-\begin_inset Formula $\delta$
-\end_inset
-
- denotes the angle of the fault dip, and 
-\begin_inset Formula $\lambda$
-\end_inset
-
- the rake angle.
- 
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:fault:orientation"
-
-\end_inset
-
- 
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/slipmotions.eps
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Sign conventions associated with fault slip.
- Positive values are associated with left-lateral, reverse, and fault opening
- motions.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:fault:slip:motions"
-
-\end_inset
-
- 
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Fault Implementation
-\end_layout
-
-\begin_layout Standard
-In order to create relative motion across the fault surface in the finite-elemen
-t mesh, additional degrees of freedom are added along with adjustment of
- the topology of the mesh.
- These additional degrees of freedom are associated with cohesive cells.
- These zero-volume cells allow control of the relative motion between vertices
- on the two sides of the fault.
- PyLith automatically adds cohesive cells for each fault surface.
- Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:fault:cohesive:quad4"
-
-\end_inset
-
- illustrates the results of inserting a cohesive cell in a mesh consisting
- of two quadrilateral cells.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/quad4cohesivekin.eps
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Example of cohesive cell inserted into a mesh of two quadrilateral cells.
- The zero thickness cohesive cell (shown with dashed lines) controls slip
- on the fault via the relative motion between vertices 3 and 7 and 2 and
- 6.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:fault:cohesive:quad4"
-
-\end_inset
-
- 
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Fault Parameters
-\end_layout
-
-\begin_layout Standard
-The principal parameters for fault interface conditions are:
-\end_layout
-
-\begin_layout Description
-id This is an integer identifier for the fault surface.
- It is used to specify the 
-\family typewriter
-material-id
-\family default
- of the cohesive cells in the mesh.
- Material identifiers must be unique so this value cannot be the same as
- any of the material models or any other fault.
-\end_layout
-
-\begin_layout Description
-name Name or label for the fault.
- This associates sets of vertices with the fault surface in addition to
- being used in error and diagnostic reports.
-\end_layout
-
-\begin_layout Description
-up_dir Up-dir or up direction (used in 2D and 3D simulations).
- In 2D the default in-plane slip is left-lateral, so we use the up-direction
- to resolve the ambiguity in specifying reverse slip.
- In 3D the up-direction is used to resolve the ambiguity in the along-strike
- and dip-dir directions.
- If the fault plane is horizontal, then the up-dir corresponds to the reverse-mo
-tion on the +z side of the fault.
- The only requirement for this direction is that it not be collinear with
- the fault normal direction.
- The default value of [0, 0, 1] is appropriate for most 3D problems.
-\end_layout
-
-\begin_layout Description
-quadrature Quadrature object used in integrating fault quantities.
-\end_layout
-
-\begin_layout Description
-output Manager for output of diagnostic and data fields for the fault.
-\end_layout
-
-\begin_layout Standard
-By default the output manager outputs both diagnostic information (e.g., fault
- normal direction) and the slip at each time step.
- Tables 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:fault:kin:output"
-
-\end_inset
-
- and 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:fault:dyn:output"
-
-\end_inset
-
- list the fields available for output for a fault with kinematic (prescribed)
- earthquake rupture and a fault with dynamic rupture, respectively.
- The fault coordinate system is shown in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:fault:slip:motions"
-
-\end_inset
-
-.
- The vectors in the fault coordinate system can be transformed to the global
- coordinate system using the direction vectors in the diagnostic output.
- An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem]
-\end_layout
-
-\begin_layout LyX-Code
-interfaces = [fault]
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces]
-\end_layout
-
-\begin_layout LyX-Code
-fault = pylith.faults.FaultCohesiveKin ; default
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-label = fault A ; Group of vertices defining the fault surface
-\end_layout
-
-\begin_layout LyX-Code
-id = 100 ; Value for material identifier associated with fault's cohesive
- cells
-\end_layout
-
-\begin_layout LyX-Code
-up_dir = [0, 0, 1] ; default
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell = pylith.feassemble.FIATLagrange
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell.dimension = 2
-\end_layout
-
-\begin_layout Standard
-The group of vertices has the label ``fault A.'' We replicate the default
- values for the fault ``up'' direction.
- These settings apply to a 2D fault surface embedded within a 3D mesh, so
- we use 2D Lagrange reference cells.
- The spatial database for elastic properties is used to determine the approximat
-e shear modulus and condition the equations for faster convergence rates.
-\end_layout
-
-\begin_layout Subsection
-Kinematic Earthquake Rupture
-\end_layout
-
-\begin_layout Standard
-Kinematic earthquake ruptures use the FaultCohesiveKin object to specify
- the slip as a function of time on the fault surface.
- Slip may evolve simultaneously over the fault surface instantaneously in
- a single time step (as is usually done in quasi-static simulations) or
- propagate over the fault surface over hundreds and up to thousands of time
- steps (as is usually done in a dynamic simulation).
-\end_layout
-
-\begin_layout Subsubsection
-Governing Equations
-\end_layout
-
-\begin_layout Standard
-The insertion of cohesive cells into the finite-element mesh has the effect
- of decoupling the motion of the two sides of the fault surface.
- In order to impose the desired relative motion, we must adjust the governing
- equations.
- PyLith employs Lagrange multiplier constraints to enforce the constraint
- of the relative motion in the strong sense.
- That is, we enforce the slip across the fault at each degree of freedom.
-\end_layout
-
-\begin_layout Standard
-In conventional implementations the additional degrees of freedom associated
- with the Lagrange multipliers results in a complex implementation.
- However, the use of Lagrange multiplier constraints with cohesive cells
- provides for a simple formulation; we simply add the additional degrees
- of freedom associated with the Lagrange multipliers to the cohesive cells
- as shown in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:fault:cohesive:quad4"
-
-\end_inset
-
-.
- As a result, the fault implementation is completely confined to the cohesive
- cell.
- Furthermore, the Lagrange multiplier constraints correspond to forces required
- to impose the relative motions, so they are related to the change in stress
- on the fault surface associated with fault slip.
- If we write the algebraic system of equations we are solving in the form
-\begin_inset Formula 
-\begin{equation}
-\underline{A}\overrightarrow{u}=\overrightarrow{b}\,,
-\end{equation}
-
-\end_inset
-
-then including the Lagrange multiplier constraints results in
-\begin_inset Formula 
-\begin{equation}
-\left[\begin{array}{cc}
-\underline{A} & \underline{C}^{T}\\
-\underline{C} & 0
-\end{array}\right]\left[\begin{array}{c}
-\overrightarrow{u}\\
-\overrightarrow{l}
-\end{array}\right]=\left[\begin{array}{c}
-\overrightarrow{b}\\
-\overrightarrow{d}
-\end{array}\right]\,,\label{eq:fault:cohesive:lagrange}
-\end{equation}
-
-\end_inset
-
-where 
-\begin_inset Formula $\overrightarrow{l}$
-\end_inset
-
- is the vector of Lagrange multipliers and 
-\begin_inset Formula $\underline{C}$
-\end_inset
-
- is composed of rotation submatrices, 
-\begin_inset Formula $\underline{R}$
-\end_inset
-
-, associated with the direction cosines relating the relative displacements
- across the fault to the vector of fault slip, 
-\begin_inset Formula $\overrightarrow{d}$
-\end_inset
-
-.
- Note that by using the direction cosines to relate the relative motion
- across the fault, the slip vector and Lagrange multipliers (forces required
- to impose the slip) are in the local fault coordinate system (lateral motion,
- reverse motion, and fault opening).
- 
-\end_layout
-
-\begin_layout Paragraph
-Non-diagonal A
-\end_layout
-
-\begin_layout Standard
-The Lagrange multipliers contribute to both the system Jacobian matrix and
- the residual.
- Because we enforce the constraints in a strong sense, the terms do not
- involve integrals over the fault surface.
- The additional terms in the residual are
-\begin_inset Formula 
-\begin{gather}
-r_{i}^{n}=-C_{ji}^{pn}l_{j}^{p},\\
-r_{i}^{p}=d_{i}^{p}-C_{ij}^{pn}u_{j}^{n},
-\end{gather}
-
-\end_inset
-
-where 
-\begin_inset Formula $n$
-\end_inset
-
- denotes a conventional degree of freedom and 
-\begin_inset Formula $p$
-\end_inset
-
- denotes a degree of freedom associated with a Lagrange multiplier.
- The additional terms in the system Jacobian matrix are simply the direction
- cosines,
-\begin_inset Formula 
-\begin{gather}
-J_{ij}^{np}=C_{ji}^{pn},\\
-J_{ij}^{pn}=C_{ij}^{pn}.
-\end{gather}
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Paragraph
-Diagonal A
-\end_layout
-
-\begin_layout Standard
-When we use a lumped system Jacobian matrix, we cannot lump the terms associated
- with the Lagrange multipliers.
- Instead, we formulate the Jacobian ignoring the contributions from the
- Lagrange multipliers, and then adjust the solution after the solve to account
- for their presence.
- Including the Lagrange multipliers in the general expression for the residual
- at time 
-\begin_inset Formula $t+\Delta t$
-\end_inset
-
-, we have
-\begin_inset Formula 
-\begin{equation}
-r_{i}^{n}(t+\Delta t)=A_{ij}^{nm}(u_{j}^{m}(t)+du_{j}^{m}(t))+C_{ki}^{pn}(l_{k}^{p}(t)+dl_{k}^{p}(t)),
-\end{equation}
-
-\end_inset
-
-where we have written the displacements and Lagrange multipliers at time
- 
-\begin_inset Formula $t+\Delta t$
-\end_inset
-
- in terms of the values at time 
-\begin_inset Formula $t$
-\end_inset
-
- and the increment from time 
-\begin_inset Formula $t$
-\end_inset
-
- to 
-\begin_inset Formula $t+\Delta t$
-\end_inset
-
-.
- When we solve the lumped system ignoring the Lagrange multipliers contributions
- to the Jacobian, we formulate the residual assuming the values 
-\begin_inset Formula $du_{i}^{n}$
-\end_inset
-
-(t) and 
-\begin_inset Formula $dl_{k}^{p}(t)$
-\end_inset
-
- are zero.
- So our task is to determine the increment in the Lagrange multiplier, 
-\begin_inset Formula $dl_{k}^{p}$
-\end_inset
-
-, and the correction to the displacement increment, 
-\begin_inset Formula $du_{i}^{n}$
-\end_inset
-
-, and by setting the residual with all terms included to zero; thus, we
- have
-\begin_inset Formula 
-\begin{gather}
-A_{ij}^{nm}(u_{j}^{m}(t)+du_{j}^{m}(t))+C_{ki}^{pn}(l_{k}^{p}(t)+dl_{k}^{p}(t))=0\text{ subject to}\\
-C_{ij}^{pn}(u_{j}^{n}(t)+du_{j}^{n}(t))=d_{i}^{p}.
-\end{gather}
-
-\end_inset
-
-Making use of the residual computed with 
-\begin_inset Formula $du_{i}^{n}(t)=0$
-\end_inset
-
- and 
-\begin_inset Formula $dl_{k}^{p}(t)=0$
-\end_inset
-
-,
-\begin_inset Formula 
-\begin{gather}
-r_{i}^{n}+A_{ij}^{nm}du_{j}^{m}+C_{ki}^{pn}dl_{k}^{p}=0\text{ subject to}\\
-C_{ij}^{pn}(u_{j}^{n}(t)+du_{j}^{n}(t))=d_{i}^{p}.
-\end{gather}
-
-\end_inset
-
-Explicitly writing the equations for the vertices on the negative and positive
- sides of the fault yields
-\begin_inset Formula 
-\begin{gather}
-r_{i}^{n-}+A_{ij}^{nm-}du_{j}^{m-}+R_{ki}^{pn}dl_{k}^{p}=0,\\
-r_{i}^{n+}+A_{ij}^{nm+}du_{j}^{m+}+R_{ki}^{pn}dl_{k}^{p}=0,\\
-R_{ij}^{pn}(u_{j}^{n+}+du_{j}^{n+}-u_{j}^{n-}-du_{j}^{n-})=d_{i}^{p}.
-\end{gather}
-
-\end_inset
-
-Solving the first two equations for 
-\begin_inset Formula $du_{j}^{m-}$
-\end_inset
-
- and 
-\begin_inset Formula $du_{j}^{m+}$
-\end_inset
-
- and combining them using the third equation leads to
-\begin_inset Formula 
-\begin{multline}
-R_{ij}^{pn}\left((A_{ij}^{nm+})^{-1}+(A_{ij}^{nm+})^{-1}\right)R_{ki}^{pn}dl_{k}^{p}=d_{i}^{p}-R_{ij}^{pn}(u_{j}^{n+}-u_{j}^{n-})\\
-+R_{ij}^{pn}\left((A_{ij}^{nm+})^{-1}r_{i}^{n+}-(A_{ij}^{nm-})^{-1}r_{i}^{n-}\right).
-\end{multline}
-
-\end_inset
-
-We do not allow overlap between the fault interface and the absorbing boundary,
- so 
-\begin_inset Formula $A_{ij}^{nm}$
-\end_inset
-
- is the same for all components at a vertex.
- As a result the matrix on the left hand side simplifies to
-\begin_inset Formula 
-\begin{equation}
-S_{ik}^{pn}=\delta_{ik}\left(\frac{1}{A^{nm+}}+\frac{1}{A^{nm-}}\right),
-\end{equation}
-
-\end_inset
-
-and
-\begin_inset Formula 
-\begin{equation}
-dl_{k}^{p}=(S_{ik}^{pn})^{-1}\left(d_{i}^{p}-R_{ij}^{pn}(u_{j}^{n+}-u_{j}^{n-})+R_{ij}^{pn}\left((A_{ij}^{nm+})^{-1}r_{i}^{n+}-(A_{ij}^{nm-})^{-1}r_{i}^{n-}\right)\right).
-\end{equation}
-
-\end_inset
-
-Now that we know the value of the increment in the Lagrange multiplier from
- time 
-\begin_inset Formula $t$
-\end_inset
-
- to time 
-\begin_inset Formula $t+\Delta t$
-\end_inset
-
-, we can correct the value for the displacement increment from time 
-\begin_inset Formula $t$
-\end_inset
-
- to 
-\begin_inset Formula $t+\Delta t$
-\end_inset
-
- using
-\begin_inset Formula 
-\begin{gather}
-\Delta du_{j}^{n-}=(A_{ij}^{nm-})^{-1}C_{ki}^{pn}dl_{k}^{p}\text{ and}\\
-\Delta du_{j}^{n+}=-(A_{ij}^{nm+})^{-1}C_{ki}^{pn}dl_{k}^{p}.
-\end{gather}
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Arrays of Kinematic Rupture Components
-\end_layout
-
-\begin_layout Standard
-Multiple earthquake ruptures can be specified on a single fault surface.
- This permits repeatedly rupturing the same portion of a fault or combining
- earthquake rupture on one subset of the fault surface with steady aseismic
- slip on another subset (the two subsets may overlap in both time and space).
- A dynamic array of kinematic earthquake rupture components associates a
- name (string) with each kinematic rupture.
- The default dynamic array contains a single earthquake rupture, ``rupture''.
- The 
-\family typewriter
-eq_srcs
-\family default
- is the 
-\family typewriter
-FaultCohesiveKin
-\family default
- facility for this dynamic array.
- An example of setting the array of kinematic rupture components in a 
-\family typewriter
-.cfg
-\family default
- file:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault]
-\end_layout
-
-\begin_layout LyX-Code
-eq_srcs = [earthquake,creep]
-\end_layout
-
-\begin_layout Standard
-The output manager includes generic fault information (orientation) as well
- as the final slip or slip rate (as in the case of the constant slip rate
- slip time function) and slip initiation time for each kinematic rupture.
- The name of the slip and slip initiation time vertex fields are of the
- form 
-\family typewriter
-final_slip_NAME
-\family default
- and 
-\family typewriter
-slip_time_NAME
-\family default
-, respectively, where 
-\family typewriter
-NAME
-\family default
- refers to the name used in the dynamic array of kinematic ruptures, 
-\family typewriter
-eq_srcs
-\family default
-.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:fault:kin:output"
-
-\end_inset
-
-Fields available in output of fault information.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="8" columns="3">
-<features tabularvalignment="middle">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="3.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Field Type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Field
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-vertex_info_fields
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-normal_dir
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Direction of fault normal in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-strike_dir
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Direction of fault strike in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-dip_dir
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Up-dip direction on hanging wall in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-final_slip_NAME
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Vector of final slip (in fault coordinate system) in meters
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip_time
-\family default
-_
-\family typewriter
-\noun on
-NAME
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Time at which slip begins in seconds
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-vertex_data_fields
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip vector at time step (in fault coordinate system) in meters
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction_change
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Change in fault tractions (in fault coordinate system) in Pa
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Kinematic Rupture Parameters
-\end_layout
-
-\begin_layout Standard
-The kinematic rupture parameters include the origin time and slip time function.
- The slip initiation time in the slip time function is relative to the origin
- time (default is 0).
- This means that slip initiates at a point at a time corresponding to the
- sum of the kinematic rupture's origin time and the slip initiation time
- for that point.
- An example of specifying the kinematic earthquake rupture properties and
- components in a 
-\family typewriter
-.cfg
-\family default
- file:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault]
-\end_layout
-
-\begin_layout LyX-Code
-eq_srcs = [earthquake,creep]
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.eq_srcs.earthquake]
-\end_layout
-
-\begin_layout LyX-Code
-origin_time = 0.0*s ; default origin time
-\end_layout
-
-\begin_layout LyX-Code
-slip_function = pylith.faults.StepSlipFn ; default slip time function
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.eq_srcs.creep]
-\end_layout
-
-\begin_layout LyX-Code
-origin_time = 10.0*year ; start creep at 10.0 years
-\end_layout
-
-\begin_layout LyX-Code
-slip_function = pylith.faults.ConstRateSlipFn ; switch to constant slip rate
- slip function
-\end_layout
-
-\begin_layout Subsubsection
-Slip Time Function
-\end_layout
-
-\begin_layout Standard
-The current release of PyLith supports specification of the evolution of
- fault slip using analytical expressions for the slip time history at each
- point, where the parameters for the slip time function may vary over the
- fault surface.
- Currently, three slip time functions are available: (1) a step-function
- for quasi-static modeling of earthquake rupture, (2) a constant slip rate
- time function for modeling steady aseismic slip, and (3) the integral of
- Brune's far-field time function 
-\begin_inset CommandInset citation
-LatexCommand cite
-key "Brune:1970"
-
-\end_inset
-
- for modeling the dynamics of earthquake rupture.
- Additional slip time functions will likely be available in future releases.
- The default slip time function is the step-function slip function.
-\end_layout
-
-\begin_layout Paragraph
-Step-Function Slip Time Function
-\end_layout
-
-\begin_layout Standard
-This slip function prescribes a step in slip at a given time at a point:
- 
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{gather}
-D(t)=\left\{ \begin{array}{cc}
-0 & 0\leq t<t_{r}\\
-D_{final} & t\ge t_{r}
-\end{array}\right.\,,
-\end{gather}
-
-\end_inset
-
-where 
-\begin_inset Formula $D(t)$
-\end_inset
-
- is slip at time 
-\begin_inset Formula $t$
-\end_inset
-
-, 
-\begin_inset Formula $D_{final}$
-\end_inset
-
- is the final slip, and 
-\begin_inset Formula $t_{r}$
-\end_inset
-
- is the slip initiation time (time when rupture reaches the location).
- The slip is specified independently for each of the components of slip,
- and the slip and slip starting time may vary over the fault surface.
-\end_layout
-
-\begin_layout Description
-final_slip Spatial database of slip (
-\begin_inset Formula $D_{final})$
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Description
-slip_time Spatial database of slip initiation times (
-\begin_inset Formula $t_{r}$
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Standard
-An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.eq_srcs.rupture]
-\end_layout
-
-\begin_layout LyX-Code
-slip_function = pylith.faults.StepSlipFn
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.eq_srcs.rupture.slip_function]
-\end_layout
-
-\begin_layout LyX-Code
-final_slip.iohandler.filename = final_slip.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-slip_time.iohandler.filename = sliptime.spatialdb
-\end_layout
-
-\begin_layout Standard
-The spatial database files for the slip time function specify the spatial
- variation in the parameters for the slip time function, as shown in Table
- 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:step-function-db-params"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:step-function-db-params"
-
-\end_inset
-
-Values in spatial database used as parameters in the step function slip
- time function.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="5" columns="3">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="2.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Spatial database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-final_slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-left-lateral-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amount of left-lateral final slip in meters.
- Use negative values for right-lateral slip.
- Applies to faults in 2D and 3D only.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-reverse-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amount of reverse slip in meters.
- Use negative values for normal slip.
- Applies to faults in 3D only.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fault-opening
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amount of fault opening in meters.
- Negative values imply penetration.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip-time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip initiation time (
-\begin_inset Formula $t_{t})$
-\end_inset
-
- in seconds.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Paragraph
-Constant Slip Rate Slip Time Function
-\end_layout
-
-\begin_layout Standard
-This slip function prescribes a constant slip rate for the evolution of
- slip at a point: 
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{gather}
-D(t)=\left\{ \begin{array}{cc}
-0 & 0\leq t<t_{r}\\
-V(t-t_{r}) & t\ge t_{r}
-\end{array}\right.\,,
-\end{gather}
-
-\end_inset
-
-where 
-\begin_inset Formula $D(t)$
-\end_inset
-
- is slip at time 
-\begin_inset Formula $t$
-\end_inset
-
-, 
-\begin_inset Formula $V$
-\end_inset
-
- is the slip rate, and 
-\begin_inset Formula $t_{r}$
-\end_inset
-
- is the slip initiation time (time when rupture reaches the location).
- The slip rate is specified independently for each of the components of
- slip, and the slip rate and slip starting time may vary over the fault
- surface.
-\end_layout
-
-\begin_layout Description
-slip_rate Spatial database of slip rate (
-\begin_inset Formula $V)$
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Description
-slip_time Spatial database of slip initiation times (
-\begin_inset Formula $t_{r}$
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Standard
-An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.eq_srcs.ruptures]
-\end_layout
-
-\begin_layout LyX-Code
-slip_function = pylith.faults.ConstRateSlipFn
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.eq_srcs.ruptures.slip_function]
-\end_layout
-
-\begin_layout LyX-Code
-slip_rate.iohandler.filename = slip_rate.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-slip_time.iohandler.filename = sliptime.spatialdb
-\end_layout
-
-\begin_layout Standard
-The spatial database files for the slip time function specify the spatial
- variation in the parameters for the slip time function, as shown in Table
- 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:const-slip-rate-db-params"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:const-slip-rate-db-params"
-
-\end_inset
-
-Values in spatial database used as parameters in the constant slip rate
- slip time function.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="5" columns="3">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="2.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Spatial database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip_rate
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-left-lateral-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip rate for left-lateral final slip in meters per second.
- Use negative values for right-lateral slip.
- Applies to faults in 2D and 3D only.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-reverse-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip rate for reverse slip in meters per second.
- Use negative values for normal slip.
- Applies to faults in 3D only.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fault-opening
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip rate for fault opening in meters per second.
- Negative values imply penetration.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip-time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip initiation time (
-\begin_inset Formula $t_{t})$
-\end_inset
-
- in seconds.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Paragraph
-Brune Slip Time Function
-\end_layout
-
-\begin_layout Standard
-We use an integral of Brune's far-field time function 
-\begin_inset CommandInset citation
-LatexCommand cite
-key "Brune:1970"
-
-\end_inset
-
- to describe the evolution in time of slip at a point: 
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{gather}
-D(t)=\left\{ \begin{array}{cc}
-0 & 0\leq t<t_{r}\\
-D_{final}\left(1-exp\left(-\frac{t-t_{r}}{t_{0}}\right)\left(1+\frac{t-t_{r}}{t_{0}}\right)\right) & t\ge t_{r}
-\end{array}\right.\,,\\
-t_{0}=0.6195t_{\mathit{rise}}\,,
-\end{gather}
-
-\end_inset
-
-where 
-\begin_inset Formula $D(t)$
-\end_inset
-
- is slip at time 
-\begin_inset Formula $t$
-\end_inset
-
-, 
-\begin_inset Formula $D_{final}$
-\end_inset
-
- is the final slip at the location, 
-\begin_inset Formula $t_{r}$
-\end_inset
-
- is the slip initiation time (time when rupture reaches the location), and
- 
-\begin_inset Formula $t_{\mathit{rise}}$
-\end_inset
-
- is the rise time.
-\end_layout
-
-\begin_layout Description
-slip Spatial database of final slip distribution (
-\begin_inset Formula $D_{final})$
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Description
-slip_time Spatial database of slip initiation times (
-\begin_inset Formula $t_{r}$
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Description
-rise_time Spatial database for rise time (
-\begin_inset Formula $t_{\mathit{rise}}$
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Standard
-An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.eq_srcs.ruptures]
-\end_layout
-
-\begin_layout LyX-Code
-slip_function = pylith.faults.BruneSlipFn
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.eq_srcs.rupture.slip_function]
-\end_layout
-
-\begin_layout LyX-Code
-slip.iohandler.filename = finalslip.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-rise_time.iohandler.filename = risetime.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-slip_time.iohandler.filename = sliptime.spatialdb
-\end_layout
-
-\begin_layout Standard
-The spatial database files for the slip time function specify the spatial
- variation in the parameters for the slip time function, as shown in Table
- 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:Brune-slip-db-params"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:Brune-slip-db-params"
-
-\end_inset
-
-Values in spatial database used as parameters in the Brune slip time function.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="6" columns="3">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="2.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Spatial database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-left-lateral-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amount of left-lateral final slip in meters.
- Use negative values for right-lateral slip.
- Applies to faults in 2D and 3D only.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-reverse-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amount of reverse slip in meters.
- Use negative values for normal slip.
- Applies to faults in 3D only.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fault-opening
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amount of fault opening in meters.
- Negative values imply penetration.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-rise_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-rise-time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rise time (
-\begin_inset Formula $t_{r})$
-\end_inset
-
- in seconds.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip-time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip initiation time (
-\begin_inset Formula $t_{t})$
-\end_inset
-
- in meters.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Paragraph
-Liu-Cosine Slip Time Function
-\end_layout
-
-\begin_layout Standard
-This slip time function, proposed by Liu, Archuleta, and Hartzell for use
- in ground-motion modeling
-\begin_inset CommandInset citation
-LatexCommand cite
-key "Liu:etal:2006"
-
-\end_inset
-
-, combines several cosine and sine functions together to create a slip time
- history with a sharp rise and gradual termination with a finite duration
- of slip.
- The evolution of slip at a point follows: 
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{gather}
-D(t)=\left\{ \begin{array}{cc}
-D_{\mathit{final}}C_{n}\left(0.7t-0.7\frac{t_{1}}{\pi}\sin\frac{\pi t}{t_{1}}-1.2\frac{t_{1}}{\pi}\left(\cos\frac{\pi t}{2t_{1}}-1\right)\right) & 0\leq t<t_{1}\\
-D_{\mathit{final}}C_{n}\left(1.0t-0.7\frac{t1}{\pi}\sin\frac{\pi t}{t_{1}}+0.3\frac{t2}{\pi}\sin\frac{\pi(t-t1)}{t_{2}}+\frac{1.2}{\pi}t_{1}-0.3t_{1}\right) & t_{1}\leq t<2t_{1}\\
-D_{\mathit{final}}C_{n}\left(0.7-0.7\cos\frac{\pi t}{t_{1}}+0.6\sin\frac{\pi t}{2t_{1}}\right) & 2t_{1}\leq t\leq t_{0}
-\end{array}\right.\,,\\
-C_{n}=\frac{\pi}{1.4\pi t_{1}+1.2t_{1}+0.3\pi t_{2}},\\
-t_{0}=1.525t_{\mathit{rise}},\\
-t_{1}=0.13t_{0},\\
-t_{2}=t_{0}-t_{1},
-\end{gather}
-
-\end_inset
-
-where 
-\begin_inset Formula $D(t)$
-\end_inset
-
- is slip at time 
-\begin_inset Formula $t$
-\end_inset
-
-, 
-\begin_inset Formula $D_{final}$
-\end_inset
-
- is the final slip at the location, 
-\begin_inset Formula $t_{r}$
-\end_inset
-
- is the slip initiation time (time when rupture reaches the location), and
- 
-\begin_inset Formula $t_{\mathit{rise}}$
-\end_inset
-
- is the rise time.
-\end_layout
-
-\begin_layout Description
-slip Spatial database of final slip distribution (
-\begin_inset Formula $D_{final})$
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Description
-slip_time Spatial database of slip initiation times (
-\begin_inset Formula $t_{r}$
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Description
-rise_time Spatial database for rise time (
-\begin_inset Formula $t_{\mathit{rise}}$
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Standard
-The spatial database files for the slip time function use the same parameters
- for the slip time function as the Brune slip time function shown in Table
- 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:Brune-slip-db-params"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Paragraph
-Time-History Slip Time Function
-\end_layout
-
-\begin_layout Standard
-This slip time function reads the slip time function from a data file, so
- it can have an arbitrary shape.
- The slip and slip initiation times are specified using spatial databases,
- so the slip time function, in general, will use a normalized amplitude.
-\end_layout
-
-\begin_layout Description
-slip Spatial database of final slip distribution (
-\begin_inset Formula $D_{final})$
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Description
-slip_time Spatial database of slip initiation times (
-\begin_inset Formula $t_{r}$
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Description
-time_history Temporal database for slip evolution.
-\end_layout
-
-\begin_layout Standard
-An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.eq_srcs.ruptures]
-\end_layout
-
-\begin_layout LyX-Code
-slip_function = pylith.faults.TimeHistorySlipFn
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.eq_srcs.rupture.slip_function]
-\end_layout
-
-\begin_layout LyX-Code
-slip.iohandler.filename = finalslip.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-slip_time.iohandler.filename = sliptime.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-time_history.iohandler.filename = myfunction.timedb
-\end_layout
-
-\begin_layout Standard
-The spatial database files for the slip time function specify the spatial
- variation in the parameters for the slip time function, as shown in Table
- 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:Brune-slip-db-params-2"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:Brune-slip-db-params-2"
-
-\end_inset
-
-Values in spatial database used as parameters in the time history slip time
- function.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="6" columns="3">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="2.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Spatial database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-left-lateral-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amount of left-lateral final slip in meters.
- Use negative values for right-lateral slip.
- Applies to faults in 2D and 3D only.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-reverse-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amount of reverse slip in meters.
- Use negative values for normal slip.
- Applies to faults in 3D only.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fault-opening
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Amount of fault opening in meters.
- Negative values imply penetration.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-rise_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-rise-time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rise time (
-\begin_inset Formula $t_{r})$
-\end_inset
-
- in seconds.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip-time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip initiation time (
-\begin_inset Formula $t_{t})$
-\end_inset
-
- in meters.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Dynamic Earthquake Rupture
-\end_layout
-
-\begin_layout Standard
-Dynamic fault interfaces use the FaultCohesiveDyn object to specify a fault
- constitutive model to govern the fault tractions (friction) and the resulting
- slip.
- When friction is large enough such that there is no sliding on the fault,
- the fault is locked (slip is zero) and the Lagrange multipliers assume
- their values just as they do in kinematic ruptures.
- In this case, the Lagrange multipliers correspond to the forces necessary
- to keep the slip zero.
- When the driving forces exceed those allowed by friction, we reduce the
- values of the Lagrange multipliers to those consistent with friction from
- the fault constitutive model.
- When we reduce the Lagrange multipliers, we must increment the slip accordingly
- to maintain consistency in the algebraic system of equations.
-\end_layout
-
-\begin_layout Subsubsection
-Governing Equations
-\end_layout
-
-\begin_layout Standard
-The algebraic systems of equations for dynamic earthquake rupture are the
- same as those for kinematic rupture
-\begin_inset Formula 
-\begin{equation}
-\left[\begin{array}{cc}
-\underline{A} & \underline{C}^{T}\\
-\underline{C} & 0
-\end{array}\right]\left[\begin{array}{c}
-\overrightarrow{u}\\
-\overrightarrow{l}
-\end{array}\right]=\left[\begin{array}{c}
-\overrightarrow{b}\\
-\overrightarrow{d}
-\end{array}\right].
-\end{equation}
-
-\end_inset
-
-Enforcing the limits imposed on the Lagrange multipliers by the fault constituti
-ve model requires determining the increment in slip for an increment in
- the Lagrange multipliers.
- The increment in the Lagrange multipliers is the difference between the
- value computed for the current slip (either zero or the slip at the previous
- time step) and the value computed from the fault constitutive model.
- Starting from our system of algebraic equations,
-\begin_inset Formula 
-\begin{equation}
-A_{ij}^{nm}u_{j}^{m}+C_{ji}^{pn}l_{j}^{p}=b_{i}^{n},
-\end{equation}
-
-\end_inset
-
-we compute the sensitivity for the given loading and boundary conditions,
-\begin_inset Formula 
-\begin{equation}
-A_{ij}^{nm}\partial u_{j}^{m}=-C_{ji}^{pn}\partial l_{j}^{p}.
-\end{equation}
-
-\end_inset
-
-Computing the increment in the slip requires computing the increment in
- the displacements.
- Solving this equation rigorously would require inverting the system Jacobian,
- which we do not want to do unless it is diagonal (as it is in the case
- of the lumped formulations).
- 
-\end_layout
-
-\begin_layout Paragraph
-Non-diagonal A
-\end_layout
-
-\begin_layout Standard
-In general A is a sparse matrix with off-diagonal terms of the form
-\begin_inset Formula 
-\begin{equation}
-A=\left(\begin{array}{ccc}
-A_{0} & A_{1} & A_{2}\\
-A_{3} & A_{n-} & 0\\
-A_{4} & 0 & A_{n+}
-\end{array}\right),
-\end{equation}
-
-\end_inset
-
-where the degrees of freedom on either side of the fault are uncoupled.
- We formulate two small linear systems involving just the degrees of freedom
- associated with vertices on either the positive or negative sides of the
- fault,
-\begin_inset Formula 
-\begin{gather}
-A_{ij}^{nm-}\partial u_{j}^{m-}=-R_{ij}^{pn}\partial l_{j}^{p},\\
-A_{ij}^{nm+}\partial u_{j}^{m+}=R_{ij}^{pn}\partial l_{j}^{p},
-\end{gather}
-
-\end_inset
-
-where we have replaced 
-\begin_inset Formula $\underline{C}$
-\end_inset
-
- with 
-\begin_inset Formula $\underline{R}$
-\end_inset
-
- to denote the explicit inclusion of the signs for the terms in 
-\begin_inset Formula $\underline{C}$
-\end_inset
-
- associated with the positive (
-\begin_inset Formula $n^{+}$
-\end_inset
-
-) and negative (
-\begin_inset Formula $n^{-}$
-\end_inset
-
-) sides of the fault.
- After solving these two linear systems of equations, we compute the increment
- in slip using
-\begin_inset Formula 
-\begin{equation}
-\partial d_{i}^{p}=R_{ij}^{pn}(\partial u_{j}^{n+}-\partial u_{j}^{n-}).
-\end{equation}
-
-\end_inset
-
-The solution of these two linear systems gives the increment in slip assuming
- all the degrees of freedom except those immediately adjacent to the fault
- remain fixed.
- In real applications where the deformation associated with fault slip is
- localized around the fault, this provides good enough approximations so
- that the nonlinear solver converges quickly.
- In problems where deformation associated with slip on the fault is not
- localized (as in the case in some of the example problems), the increment
- in slip computed by solving these two linear systems is not a good approximatio
-n and the nonlinear solve requires a large number of iterations.
-\end_layout
-
-\begin_layout Standard
-We use the PETSc Krylov subspace solver (KSP) to solve these two linear
- systems.
- The PETSc settings for the KSP object are set in the same manner as the
- main solver, except we use the prefix friction_ in all of the settings
- related to the KSP solver for these two linear systems.
- For example, to use the recommended additive Schwarz preconditioner in
- the friction sensitivity solves, the settings in a .cfg file are:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.petsc]
-\end_layout
-
-\begin_layout LyX-Code
-friction_pc_type = asm
-\end_layout
-
-\begin_layout Standard
-See the examples in Sections 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Tutorial-3d-hex8-friction"
-
-\end_inset
-
- and 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:tutorial:shearwave:quad4"
-
-\end_inset
-
- for details.
-\end_layout
-
-\begin_layout Paragraph
-Diagonal A
-\end_layout
-
-\begin_layout Standard
-With a lumped Jacobian matrix, we can solve for the increment in slip directly,
-\begin_inset Formula 
-\begin{equation}
-\partial d_{i}^{p}=-C_{ij}^{pn}(A_{jk}^{nm})^{-1}C_{lk}^{pm}\partial l_{l}^{p}.
-\end{equation}
-
-\end_inset
-
-By not allowing the fault interface to overlap with the absorbing boundary,
- the terms in 
-\begin_inset Formula $A$
-\end_inset
-
- for a given vertex are identical and the expression on the right-hand side
- reduces to
-\begin_inset Formula 
-\begin{equation}
-\partial d_{i}^{p}=-\left(\frac{1}{A^{n+}}+\frac{1}{A^{n-}}\right)\partial l_{i}^{p}.
-\end{equation}
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Dynamic Rupture Parameters
-\end_layout
-
-\begin_layout Standard
-The components of the FaultCohesiveDyn object include
-\end_layout
-
-\begin_layout Description
-open_free_surface If true, enforce traction free surface when the fault
- opens, otherwise apply prescribed tractions even when the fault opens (default
- is true); to mimic a dike opening use false.
-\end_layout
-
-\begin_layout Description
-zero_tolerance Tolerance for detecting zero values (default is 1.0e-10);
- should be larger than absolute tolerance in KSP solves.
-\end_layout
-
-\begin_layout Description
-traction_perturbation Prescribed tractions on fault surface (generally used
- for nucleating earthquake ruptures, default is none).
-\end_layout
-
-\begin_layout Description
-friction Fault constitutive model.
-\end_layout
-
-\begin_layout Standard
-An example of specifying the dynamic earthquake rupture properties and component
-s in a 
-\family typewriter
-.cfg
-\family default
- file:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault]
-\end_layout
-
-\begin_layout LyX-Code
-open_free_surface = True ; default
-\end_layout
-
-\begin_layout LyX-Code
-traction_perturbation = pylith.faults.TractPerturbation ; not default
-\end_layout
-
-\begin_layout LyX-Code
-traction_perturbation.db_initial = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-traction_perturbation.db_initial.iohandler.filename = tractions.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-friction = pylith.friction.StaticFriction
-\end_layout
-
-\begin_layout LyX-Code
-friction.db_properties = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-friction.db_properties.iohandler.filename = friction.spatialdb
-\end_layout
-
-\begin_layout Standard
-The prescribed traction perturbation is specified using the same fault coordinat
-e system as the slip directions in the kinematic ruptures.
- The perurbation has the same functional form as the time-dependent boundary
- conditions (and same spatial databases).
- Table 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:fault:cohesive:dyn:prescribed:tractions"
-
-\end_inset
-
- gives the values in the spatial database for the prescribed tractions.
- Table 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:fault:dyn:output"
-
-\end_inset
-
- shows the fields available for output.
- Additional fields are available depending on the fault constitutive model.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:fault:cohesive:dyn:prescribed:tractions"
-
-\end_inset
-
-Values in spatial databases for prescribed tractions.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="22" columns="4">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="2.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Spatial database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Dimension
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_initial
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-1-D
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-normal
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Normal traction (tension is positive)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-2-D
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-shear
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Left-lateral shear traction (reverse shear for dipping faults)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-normal
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Normal traction (tension is positive)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-3-D
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-shear-leftlateral
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Left-lateral shear traction
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-shear-updip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Reverse shear traction
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-normal
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Normal traction (tension is positive)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_rate
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-1-D
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-rate-normal
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rate of change of normal traction (tension is positive)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-2-D
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-rate-shear
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rate of change of left-lateral shear traction (reverse shear for dipping
- faults)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-rate-normal
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rate of change of normal traction (tension is positive)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-3-D
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-rate-leftlateral
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rate of change of eft-lateral shear traction
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-rate-shear-updip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rate of change of reverse shear traction
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-rate-normal
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rate of change of normal traction (tension is positive)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-all
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-rate-start-time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Time at which rate of change begins
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_change
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-1-D
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-normal
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Change in normal traction (tension is positive)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-2-D
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-shear
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Change in left-lateral shear traction (reverse shear for dipping faults)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-normal
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Change in normal traction (tension is positive)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-3-D
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-leftlateral
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Change in left-lateral shear traction
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-shear-updip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Change in reverse shear traction
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction-normal
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Change in normal traction (tension is positive)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-all
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-change-start-time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Time at which change begins
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-th_change
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-all
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-None
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Time history for change
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:fault:dyn:output"
-
-\end_inset
-
-Fields available in output of fault information.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="11" columns="3">
-<features tabularvalignment="middle">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="3.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Field Type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Field
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-vertex_info_fields
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-normal_dir
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Direction of fault normal in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-strike_dir
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Direction of fault strike in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-dip_dir
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Up-dip direction on hanging wall in global coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction_initial
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Initial tractions (if specified) in fault coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction_rate
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Rate of change in tractions (if specified) in fault coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-rate_start_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Time at which rate of change begins (if specified)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction_change
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Change in tractions (if specified) in fault coordinate system
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-change_start_time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Time at which change occurs (if specified)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-vertex_data_fields
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip vector at time step (in fault coordinate system) in meters
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-traction
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Fault tractions (in fault coordinate system) in Pa
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Fault Constitutive Models
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:fault:constitutive:models"
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-PyLith provides four fault constitutive models.
- Future releases may contain additional models, and a template is provided
- for you to construct your own (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Extending:FaultConstitutiveModels"
-
-\end_inset
-
-).
- The fault constitutive model implementations are independent of dimension
- and work in both 2-D and 3-D.
- In solving the governing equations, PyLith will use a scalar representation
- of the shear traction in 2-D and a vector representation of the shear traction
- in 3-D, with the shear traction resolved in the direction of current slip.
- The fault constitutive models contain a common set of properties and components
-:
-\end_layout
-
-\begin_layout Description
-label Name of the friction model.
-\end_layout
-
-\begin_layout Description
-db_properties Spatial database of the friction model parameters (default
- is SimpleDB).
-\end_layout
-
-\begin_layout Description
-db_initial_state Spatial database for initial state variables (default is
- none).
-\end_layout
-
-\begin_layout Paragraph
-Static Friction
-\end_layout
-
-\begin_layout Standard
-The static friction model produces shear tractions proportional to the fault
- normal traction plus a cohesive stress,
-\begin_inset Formula 
-\begin{equation}
-T_{f}=\begin{cases}
-T_{c}-\mu_{f}T_{n} & T_{n}\leq0\\
-0 & T_{n}>0
-\end{cases}.
-\end{equation}
-
-\end_inset
-
-The spatial database file for the static friction model properties specifies
- the spatial variation of the parameters given in Table 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:static:friction:properties"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:static:friction:properties"
-
-\end_inset
-
-Values in the spatial database for constant friction parameters.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="3" columns="2">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="2.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-friction-coefficient
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Coefficient of friction, 
-\begin_inset Formula $\mu_{f}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-cohesion
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Cohesive stress, 
-\begin_inset Formula $T_{c}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Paragraph
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:friction:slip:weakening"
-
-\end_inset
-
-Slip-Weakening Friction
-\end_layout
-
-\begin_layout Standard
-The linear slip-weakening friction model produces shear tractions equal
- to the cohesive stress plus a contribution proportional to the fault normal
- traction that decreases from a static value to a dynamic value as slip
- progresses,
-\begin_inset Formula 
-\begin{equation}
-T_{f}=\begin{cases}
-T_{c}-(\mu_{s}-(\mu_{s}-\mu_{d})\frac{d}{d_{0}})T_{n} & d\leq d_{0}\text{ and }T_{n}\leq0\\
-T_{c}-\mu_{d}T_{n} & d>d_{0}\text{ and }T_{n}\leq0\\
-0 & T_{n}>0
-\end{cases}
-\end{equation}
-
-\end_inset
-
-The spatial database files for the slip-weakening friction model properties
- and state variables specify the spatial variation of the fault constitutive
- model parameters given in Table 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:slip:weakening:properties:statevars"
-
-\end_inset
-
-.
- As long as the fault is locked, the initial state variables are zero, so
- specifying the initial state variables for slip-weakening friction is rare.
- The slip-weakening friction also includes a parameter, 
-\family typewriter
-force_healing
-\family default
-, to control healing.
- In quasi-static simulations, one usually wants slip confined to a single
- time step (
-\family typewriter
-force_healing
-\family default
- = True), whereas in a dynamic simulation slip occurs over many time steps
- (
-\family typewriter
-force_healing
-\family default
- = False; default behavior) and fault healing is often neglected.
- The properties include:
-\end_layout
-
-\begin_layout Description
-force_healing Flag indicating whether healing (cumalative slip state variable
- reset to zero) is forced after every time step.
-\end_layout
-
-\begin_layout Standard
-An example of setting the properties for the rate and state friction component
- in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault]
-\end_layout
-
-\begin_layout LyX-Code
-friction = pylith.friction.SlipWeakening ; Change friction model from the
- default
-\end_layout
-
-\begin_layout LyX-Code
-friction.force_healing = False ; default value
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:slip:weakening:properties:statevars"
-
-\end_inset
-
-Values in spatial databases for slip-weakening friction.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="7" columns="3">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="2.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Spatial database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_properties
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-static-coefficient
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Static coefficient of friction, 
-\begin_inset Formula $\mu_{s}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-dynamic-coefficient
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Dynamic coefficient of friction, 
-\begin_inset Formula $\mu_{d}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-slip-weakening-parameter
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip-weakening parameter, 
-\begin_inset Formula $d_{0}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-cohesion
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Cohesive stress, 
-\begin_inset Formula $T_{c}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-db_initial_state
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-cumulative-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Cumulative slip, 
-\begin_inset Formula $d$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-previous-slip
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip at previous time step, 
-\begin_inset Formula $d(t-\Delta t)$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Paragraph
-Time-Weakening Friction
-\end_layout
-
-\begin_layout Standard
-The linear time-weakening friction model is analogous to the linear slip-weakeni
-ng friction model with time replacing slip.
- It produces shear tractions equal to the cohesive stress plus a contribution
- proportional to the fault normal traction that decreases from a static
- value to a dynamic value as time progresses,
-\begin_inset Formula 
-\begin{equation}
-T_{f}=\begin{cases}
-T_{c}-(\mu_{s}-(\mu_{s}-\mu_{d})\frac{t}{t_{0}})T_{n} & t\leq t_{0}\text{ and }T_{n}\leq0\\
-T_{c}-\mu_{d}T_{n} & t>t_{0}\text{ and }T_{n}\leq0\\
-0 & T_{n}>0
-\end{cases}
-\end{equation}
-
-\end_inset
-
-The spatial database files for the time-weakening friction model properties
- and state variables specify the spatial variation of the fault constitutive
- model parameters given in Table 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:time:weakening:properties:statevars"
-
-\end_inset
-
-.
- As long as the fault is locked, the initial state variable is zero, so
- specifying the initial state variable for time-weakening friction is rare.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:time:weakening:properties:statevars"
-
-\end_inset
-
-Values in spatial databases for time-weakening friction.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="6" columns="3">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="2.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-db_properties
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-static-coefficient
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Static coefficient of friction, 
-\begin_inset Formula $\mu_{s}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-dynamic-coefficient
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Dynamic coefficient of friction, 
-\begin_inset Formula $\mu_{d}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-time-weakening-parameter
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Time-weakening parameter, 
-\begin_inset Formula $t_{0}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-cohesion
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Cohesive stress, 
-\begin_inset Formula $T_{c}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-db_initial_state
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-elapsed-time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Elasped time of slip, 
-\begin_inset Formula $t$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Paragraph
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:friction:rate:state:ageing"
-
-\end_inset
-
-Rate- and State-Friction with Ageing Law
-\end_layout
-
-\begin_layout Standard
-The Dieterich-Ruina rate and state friction model produces shear tractions
- equal to the cohesive stress plus a contribution proportional to the fault
- normal traction that depends on a state variable,
-\begin_inset Formula 
-\begin{gather}
-T_{f}=\begin{cases}
-T_{c}-\mu_{f}T_{n} & T_{n}\leq0\\
-0 & T_{n}>0
-\end{cases}\\
-\mu_{f}=\begin{cases}
-\mu_{0}+a\ln\left(\frac{V}{V_{0}}\right)+b\ln\left(\frac{V_{0}\theta}{L}\right) & V\ge V_{\mathit{min}}\\
-\mu_{0}+a\ln\left(\frac{V_{min}}{V}\right)+b\ln\left(\frac{V_{0}\theta}{L}\right)-a\left(1-\frac{V}{V_{min}}\right) & V<V_{min}
-\end{cases}\\
-\frac{d\theta}{dt}=1-\frac{V\theta}{L}
-\end{gather}
-
-\end_inset
-
-where 
-\begin_inset Formula $V$
-\end_inset
-
- is slip rate, 
-\begin_inset Formula $V_{min}$
-\end_inset
-
- is a minimum slip rate, 
-\begin_inset Formula $a$
-\end_inset
-
- and 
-\begin_inset Formula $b$
-\end_inset
-
- are coefficients, 
-\begin_inset Formula $L$
-\end_inset
-
- is the characteristic slip distance, 
-\begin_inset Formula $\theta$
-\end_inset
-
- is a state variable.
- With an interative solver in quasi-static simulations with a small, but
- nonzero residual tolerance we never encounter zero slip rates in quasi-static
- simulations.
- Instead we want to avoid significant variations in the coefficient of friction
- for slip rates on the same order as our residual tolerance.
- We regularize the rate and state friction model by iposing a linearization
- of the variation of the coefficient of friction with slip rate when the
- slip rate drops below a minimum slip rate, 
-\begin_inset Formula $V_{min}$
-\end_inset
-
- (
-\family typewriter
-min_slip_rate
-\family default
- property with a default value of 1.0e-12).
- Note that this is different than the popular inverse hypoerbolic sine regulariz
-ation proposed by Ben-Zion and Rice 
-\begin_inset CommandInset citation
-LatexCommand cite
-key "BenZion:Rice:1997"
-
-\end_inset
-
- to permit zero slip rates.
- Following Kaneko 
-\shape italic
-et al.
-
-\shape default
- 
-\begin_inset CommandInset citation
-LatexCommand cite
-key "Kaneko:etal:2008"
-
-\end_inset
-
-, we integrate the evolution equation for the state variable keeping slip
- rate constant to get
-\begin_inset Formula 
-\begin{equation}
-\theta(t+\Delta t)=\theta(t)\exp\left(\frac{-V(t)\Delta t}{L}\right)+\frac{L}{V(t)}\left(1-\exp\left(-\frac{V(t)\Delta t}{L}\right)\right).
-\end{equation}
-
-\end_inset
-
-As the slip rate approaches zero, the first exponential term approaches
- 1.
- Using the first three terms of the Taylor series expansion of the second
- exponential yields
-\begin_inset Formula 
-\begin{equation}
-\theta(t+\Delta t)=\begin{cases}
-\theta(t)\exp\left(-\frac{V(t)\Delta t}{L}\right)+\Delta t-\frac{1}{2}\frac{V(t)\Delta t^{2}}{L} & \frac{V(t)\Delta t}{L}<0.00001\\
-\theta(t)\exp\left(-\frac{V(t)\Delta t}{L}\right)+\frac{L}{V(t)}\left(1-\exp\left(-\frac{V(t)\Delta t}{L}\right)\right) & \frac{V(t)\Delta t}{L}\ge0.00001
-\end{cases}.
-\end{equation}
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-The properties include:
-\end_layout
-
-\begin_layout Description
-min_slip_rate Slip rate at which linearization occurs, 
-\begin_inset Formula $V_{min}$
-\end_inset
-
-.
- Should be about one order of magnitude larger than absolute tolerance in
- solve.
-\end_layout
-
-\begin_layout Standard
-An example of setting the properties for the rate and state friction component
- in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault]
-\end_layout
-
-\begin_layout LyX-Code
-friction = pylith.friction.RateStateAgeing ; Change friction model from the
- default
-\end_layout
-
-\begin_layout LyX-Code
-friction.min_slip_rate = 1.0e-12 ; default value
-\end_layout
-
-\begin_layout Standard
-The spatial database files for the rate and state friction model properties
- and state variables specify the spatial variation of the fault constitutive
- model parameters given in Table 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:rate:state:ageing:properties:statevars"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:rate:state:ageing:properties:statevars"
-
-\end_inset
-
-Values in spatial databases for Dieterich-Ruina rate-state friction.
-\end_layout
-
-\end_inset
-
-
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="8" columns="3">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="0">
-<column alignment="left" valignment="top" width="2.5in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Database
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-db_properties
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-reference-friction-coefficient
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Steady-state coefficient of friction at slip rate 
-\begin_inset Formula $V_{0}$
-\end_inset
-
-, 
-\begin_inset Formula $\mu_{s}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-reference-slip-rate
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Reference slip rate, 
-\begin_inset Formula $V_{0}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-characteristic-slip-distance
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Slip-weakening parameter, 
-\begin_inset Formula $L$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-constitutive-parameter-a
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Coefficient for the 
-\begin_inset Formula $\ln$
-\end_inset
-
- slip rate term, 
-\begin_inset Formula $a$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-constitutive-parameter-b
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Coefficient for the 
-\begin_inset Formula $\ln$
-\end_inset
-
- state variable term, 
-\begin_inset Formula $b$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-cohesion
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Cohesive stress, 
-\begin_inset Formula $T_{c}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-db_initial_state
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-state-variable
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-State variable, 
-\begin_inset Formula $\theta$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:fault:cohesive:impulses"
-
-\end_inset
-
-Slip Impulses for Green's Functions
-\end_layout
-
-\begin_layout Standard
-Computing static Green's functions using the GreensFns problem requires
- a specialized fault implementation, FaultCohesiveImpulses, to setup the
- slip impulses.
- The parameters controlling the slip impulses include the components involved
- (lateral, reverse, and/or fault opening) and the amplitude of the pulses
- (e.g., selecting a subset of a fault or including a spatial variation).
- The GreensFns properties and facilities include:
-\end_layout
-
-\begin_layout Description
-threshold Threshold for non-zero amplitude; impulses will only be generated
- at locations on the fault where the amplitude excees this threshold.
-\end_layout
-
-\begin_layout Description
-impulse_dof Array of components associated with impulses, e.g., [0, 1] for
- slip involving the lateral and up-dip components.
-\end_layout
-
-\begin_layout Description
-db_impulse_amplitude Spatial database for amplitude of slip impulse (scalar
- field).
- Default is SimpleDB.
-\end_layout
-
-\begin_layout Standard
-An example of setting the properties and facilities for FaultCohesiveImpulses
- in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces]
-\end_layout
-
-\begin_layout LyX-Code
-fault = pylith.faults.FaultCohesiveImpulses ; Change from the default
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault]
-\end_layout
-
-\begin_layout LyX-Code
-threshold = 1.0e-6*m ; default
-\end_layout
-
-\begin_layout LyX-Code
-impulse_dof = [0] ; lateral slip-only
-\end_layout
-
-\begin_layout LyX-Code
-db_impulse_amplitude.iohandler.filename = myimpulse.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-db_impulse_amplitude.label = Impulse amplitude
-\end_layout
-
-\begin_layout Section
-Gravitational Body Forces
-\end_layout
-
-\begin_layout Standard
-Many problems in geophysics require the consideration of gravitational body
- forces.
- For example, it is often important to include the effects of the lithostatic
- (overburden) pressure.
- In future releases of PyLith that permit nonlinear bulk rheologies, body
- forces will affect plastic yield criteria and the deformation field for
- large deformation/finite strain problems.
- As described in Chapter 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:Governing-Equations"
-
-\end_inset
-
-, the body forces contribute to the residual,
-\begin_inset Formula 
-\begin{equation}
-r_{i}^{n}=\int_{V}f_{i}N^{n}\: dV.
-\end{equation}
-
-\end_inset
-
-For gravitational body forces the body force per unit volume, 
-\begin_inset Formula $f_{i}$
-\end_inset
-
-, is given as the product of the mass density, 
-\begin_inset Formula $\rho$
-\end_inset
-
-, the scalar gravitational acceleration value, 
-\begin_inset Formula $g$
-\end_inset
-
-, and the gravitational acceleration orientation vector, 
-\begin_inset Formula $a_{i}$
-\end_inset
-
-:
-\begin_inset Formula 
-\begin{equation}
-f_{i}=\rho ga_{i}.
-\end{equation}
-
-\end_inset
-
-The mass density is a property of every material model, and is thus included
- in the spatial database with the physical properties for each material.
- The gravitational acceleration is assumed to be uniform and constant for
- a given problem, with a default value of 9.80665 m/s
-\begin_inset Formula $^{\text{2}}$
-\end_inset
-
-.
- The orientation vector will depend on the dimension of the problem as well
- as the coordinate system being used.
- The default orientation vector has components (0, 0, -1).
- This is appropriate for three-dimensional problems where the gravity vector
- is aligned with the negative z-axis, as would be the case in a geographic-proje
-cted coordinate system or a generic Cartesian coordinate system.
- For cases in which the curvature of the earth should be considered, the
- spatialdata package provides an earth-centered, earth-fixed (ECEF) coordinate
- system and a local georeferenced Cartesian system; in each of these cases
- the orientation vector is computed automatically, although this feature
- has not been tested.
- For problems in one or two dimensions where the orientation vector is constant,
- the vector will need to be explicitly specified.
- For example, in a two-dimensional problem, the vector might be specified
- as (0, -1, 0).
- The vector still has three components, although the extra component is
- not used.
-\end_layout
-
-\begin_layout Standard
-Gravity is turned off by default.
- To include gravitational effects in a simulation, you can turn it on as
- follows:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent]
-\end_layout
-
-\begin_layout LyX-Code
-use_gravity = true
-\end_layout
-
-\begin_layout Standard
-By simply adding this flag, the default gravity field values will be used
- and a 
-\family typewriter
-gravity_field
-\family default
- component will be assigned for the problem.
- The default values may be changed by altering the properties of 
-\family typewriter
-gravity_field
-\family default
-:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.gravity_field]
-\end_layout
-
-\begin_layout LyX-Code
-acceleration = 100.0*m*s**-2
-\end_layout
-
-\begin_layout LyX-Code
-gravity_dir = [0, -1, 0]
-\end_layout
-
-\begin_layout Standard
-An example problem using gravity is described in Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Tutorial-3d-hex8-gravity"
-
-\end_inset
-
-.
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding auto
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 1
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 1in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Chapter
+\begin_inset CommandInset label
+LatexCommand label
+name "cha:boundary:interface:conditions"
+
+\end_inset
+
+Boundary and Interface Conditions
+\end_layout
+
+\begin_layout Section
+Assigning Boundary Conditions
+\end_layout
+
+\begin_layout Standard
+There are four basic steps in assigning a specific boundary condition to
+ a portion of the domain.
+\end_layout
+
+\begin_layout Enumerate
+Create sets of vertices in the mesh generation process for each boundary
+ condition.
+\end_layout
+
+\begin_layout Enumerate
+Define boundary condition groups corresponding to the vertex sets.
+\end_layout
+
+\begin_layout Enumerate
+Set the parameters for each boundary condition group using 
+\family typewriter
+.cfg
+\family default
+ or 
+\family typewriter
+.pml
+\family default
+ files and/or command line arguments.
+\end_layout
+
+\begin_layout Enumerate
+Specify the spatial variation in parameters for the boundary condition using
+ a spatial database file.
+\end_layout
+
+\begin_layout Subsection
+Creating Sets of Vertices
+\end_layout
+
+\begin_layout Standard
+The procedure for creating sets of vertices differs depending on the mesh
+ generator.
+ For meshes specified using the PyLith mesh ASCII format, the sets of vertices
+ are specified using groups (see Appendix 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:MeshIOAscii"
+
+\end_inset
+
+).
+ In CUBIT the groups of vertices are created using nodesets.
+ Similarly, in LaGriT, psets are used.
+ Note that we chose to associate boundary conditions with groups of vertices
+ because nearly every mesh generation package supports associating a string
+ or integer with groups of vertices.
+ Note also that we currently associate boundary conditions with string identifie
+rs, so even if the mesh generator uses integers, the name is specified as
+ the digits of the integer value.
+ Finally, note that every vertex set that ultimately is associated with
+ a boundary condition on a cell face (e.g., Neumann boundary conditions and
+ fault interface conditions) must correspond to a simply-connected surface.
+\end_layout
+
+\begin_layout Subsection
+Arrays of Boundary Condition Components
+\end_layout
+
+\begin_layout Standard
+A dynamic array of boundary condition components associates a name (string)
+ with each boundary condition.
+ This dynamic array of boundary conditions replaces the boundary condition
+ container in PyLith 1.0.
+ User-defined containers are no longer necessary, and the predefined containers
+ are no longer available (or necessary).
+ The default boundary condition for each component in the array is the Dirichlet
+Points object.
+ Other boundary conditions can be bound to the named items in the array
+ via a 
+\family typewriter
+.cfg
+\family default
+ file, 
+\family typewriter
+.pml
+\family default
+ file, or the command line.
+ The parameters for the boundary condition are set using the name of the
+ boundary condition.
+ An example of setting the array of boundary condition components and changing
+ the types of boundary conditions in a 
+\family typewriter
+.cfg
+\family default
+ file:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem]
+\end_layout
+
+\begin_layout LyX-Code
+bc = [x_neg,x_pos,y_pos,z_neg] ; Array of boundary conditions
+\end_layout
+
+\begin_layout LyX-Code
+# Default boundary condition is DirichletPoints
+\end_layout
+
+\begin_layout LyX-Code
+# Keep default value for bc.x_neg
+\end_layout
+
+\begin_layout LyX-Code
+bc.x_pos = pylith.bc.DirichletBoundary ; change BC type to DirichletBoundary
+\end_layout
+
+\begin_layout LyX-Code
+bc.y_pos = pylith.bc.AbsorbingDampers ; change BC type to AbsorbingDampers
+\end_layout
+
+\begin_layout LyX-Code
+bc.z_neg = pylith.bc.Neumann ; change BC type to Neumann (traction)
+\end_layout
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Time:Dependent:BC"
+
+\end_inset
+
+Time-Dependent Boundary Conditions
+\end_layout
+
+\begin_layout Standard
+Several boundary conditions use a common formulation for the spatial and
+ temporal variation of the boundary condition parameters,
+\begin_inset Formula 
+\begin{equation}
+f(\vec{x})=f_{0}(\vec{x})+\dot{f}_{0}(\vec{x})(t-t_{0}(\vec{x}))+f_{1}(\vec{x})a(t-t_{1}(\vec{x})),
+\end{equation}
+
+\end_inset
+
+where 
+\begin_inset Formula $f(\vec{x})$
+\end_inset
+
+ may be a scalar or vector parameter, 
+\begin_inset Formula $f_{0}(\vec{x})$
+\end_inset
+
+ is a constant value, 
+\begin_inset Formula $\dot{f}_{0}(\vec{x})$
+\end_inset
+
+ is a constant rate of change in the value, 
+\begin_inset Formula $t_{0}(\vec{x})$
+\end_inset
+
+ is the onset time for the constant rate of change, 
+\begin_inset Formula $f_{1}(\vec{x})$
+\end_inset
+
+ is the amplitude for the temporal modulation, 
+\begin_inset Formula $a(t)$
+\end_inset
+
+ is the variation in amplitude with time, 
+\begin_inset Formula $t_{1}(\vec{x})$
+\end_inset
+
+ is the onset time for the temporal modulation, and 
+\begin_inset Formula $\vec{x}$
+\end_inset
+
+ is the position of a location in space.
+ This common formulation permits easy specification of a scalar or vector
+ with a constant value, constant rate of change of a value, and/or modulation
+ of a value in time.
+ One can specify just the initial value, just the rate of change of the
+ value (along with the corresponding onset time), or just the modulation
+ in amplitude (along with the corresponding temporal variation and onset
+ time), or any combination of the three.
+ The facilities associated with this formulation are:
+\end_layout
+
+\begin_layout Description
+db_initial Spatial database specifying the spatial variation in the initial
+ value (default is none).
+\end_layout
+
+\begin_layout Description
+db_rate Spatial database specifying rate of change in the value (default
+ is none).
+\end_layout
+
+\begin_layout Description
+db_change Spatial database specifying the amplitude of the temporal modulation
+ (default is none).
+\end_layout
+
+\begin_layout Description
+th_change Time history database specifying the temporal change in amplitude
+ (default is none).
+\end_layout
+
+\begin_layout Subsection
+Dirichlet Boundary Conditions
+\end_layout
+
+\begin_layout Standard
+Dirichlet boundary conditions in PyLith prescribe the displacement of a
+ subset of the vertices of the finite-element mesh.
+ While Dirichlet boundary conditions can be applied to any vertex, usually
+ they are applied to vertices on the lateral and bottom boundaries of the
+ domain.
+ There are two types of Dirichlet boundary conditions, DirichletBC and Dirichlet
+Boundary.
+ Both provide identical constraints on the solution, but DirichletBoundary
+ is limited to vertices of a simply-connected surface, which allows diagnostic
+ output of the prescribed displacements.
+ DirichletBC can be applied to a set of unconnected vertices.
+\end_layout
+
+\begin_layout Subsubsection
+Dirichlet Boundary Condition Parameters
+\end_layout
+
+\begin_layout Standard
+The properties and components common to both the DirichletPoints and DirichletBo
+undary boundary conditions are:
+\end_layout
+
+\begin_layout Description
+label Label of the group of vertices associated with the boundary condition.
+\end_layout
+
+\begin_layout Description
+bc_dof Array of degrees of freedom to be fixed (first degree of freedom
+ is 0).
+\end_layout
+
+\begin_layout Standard
+DirichletBoundary contains an additional component:
+\end_layout
+
+\begin_layout Description
+output Manager for output of displacements on boundary with specified displaceme
+nts.
+\end_layout
+
+\begin_layout Standard
+By default the output manager does not output any information.
+ The specified displacements and velocities can be output by including ``displac
+ements'' and ``velocities'' in the output manager's 
+\family typewriter
+vertex_info_fields
+\family default
+ array parameter.
+ An example of setting the Dirichlet boundary condition parameters in a
+ 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem]
+\end_layout
+
+\begin_layout LyX-Code
+bc = [mybc]
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+[pylithapp.problem.bc.mybc]
+\end_layout
+
+\begin_layout LyX-Code
+label = group A 
+\end_layout
+
+\begin_layout LyX-Code
+bc_dof = [2] ; fixed displacement in z direction
+\end_layout
+
+\begin_layout LyX-Code
+db_initial = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.iohandler.filename = disp_A.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.query_type = nearest ; change query type to nearest point algorithm
+\end_layout
+
+\begin_layout LyX-Code
+db_rate = spatialdata.spatialdb.UniformDB
+\end_layout
+
+\begin_layout LyX-Code
+db_rate.values = [displacement-rate-z]
+\end_layout
+
+\begin_layout LyX-Code
+db_rate.data = [1.0e-06*m/s] ; velocity is 1.0e-06 m/s
+\end_layout
+
+\begin_layout Standard
+We have created an array with one boundary condition, mybc.
+ The group of vertices associated with the boundary condition is group A.
+ For the database associated with the constant displacement, we use a SimpleDB.
+ We set the filename and query type for the database.
+ For the rate of change of values, we use a UniformDB and specify the velocity
+ in the z-direction to be 1.0e-06 m/s.
+ See Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:spatial:databases"
+
+\end_inset
+
+ for a discussion of the different types of spatial databases available.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:dirichlet:output"
+
+\end_inset
+
+Fields available in output of DirichletBoundary boundary condition information.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="3">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="3in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Field Type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Field
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+vertex_info_fields
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+displacement_initial
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Initial displacement field in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+velocity
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Rate of change of displacement field in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+velocity_start_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Onset time in seconds for rate of change in displacement field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+displacement_change
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amplitude of change in displacement field in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+change_start_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Onset time in seconds for the amplitude change in the displacement field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Dirichlet Boundary Condition Spatial Database Files
+\end_layout
+
+\begin_layout Standard
+The spatial database files for the Dirichlet boundary condition specify
+ the fixed displacements.
+ The spatial database file may contain displacements at more degrees of
+ freedom than those specified in the Dirichlet boundary condition settings
+ using the 
+\family typewriter
+bc_dof
+\family default
+ setting.
+ Only those listed in 
+\family typewriter
+bc_dof
+\family default
+ will be used.
+ This permits using the same spatial database file for multiple Dirichlet
+ boundary conditions with the same displacement field.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Values in the spatial databases used for Dirichlet boundary conditions.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="4" columns="2">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="4in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Spatial database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Name in Spatial Database
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_initial
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+displacement-x, displacement-y, displacement-z
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_rate
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+displacement-rate-x, displacement-rate-y, displacement-rate-z, rate-start-time
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_change
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+displacement-x, displacement-y, displacement-z, change-start-time
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Neumann Boundary Conditions
+\end_layout
+
+\begin_layout Standard
+Neumann boundary conditions are surface tractions applied over a subset
+ of the mesh.
+ As with the DirichletBoundary condition, each Neumann boundary condition
+ can only be applied to a simply-connected surface.
+ The surface over which the tractions are applied always has a spatial dimension
+ that is one less than the dimension of the finite-element mesh.
+ Traction values are computed at the integration points of each cell on
+ the surface, using values from a spatial database.
+ The tractions are integrated over each cell and assembled to obtain the
+ forces applied at the vertices.
+ See Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sub:Tutorial-twoquad4-traction"
+
+\end_inset
+
+ for a tutorial that uses Neumann boundary conditions.
+\end_layout
+
+\begin_layout Subsubsection
+Neumann Boundary Condition Parameters
+\end_layout
+
+\begin_layout Standard
+The Neumann boundary condition properties and components are:
+\end_layout
+
+\begin_layout Description
+label Name of the group of vertices defining the mesh boundary for the Neumann
+ boundary condition.
+\end_layout
+
+\begin_layout Description
+up_dir This is a 3-vector that provides a hint for the direction perpendicular
+ to the horizontal tangent direction that is not collinear with the direction
+ normal to the surface.
+ The default value is (0,0,1), which assumes that the z-axis is positive
+ upward.
+ This vector is only needed for three-dimensional problems where the positive
+ upward direction differs from the default.
+\end_layout
+
+\begin_layout Description
+output The output manager associated with diagnostic output (traction vector).
+\end_layout
+
+\begin_layout Description
+quadrature The quadrature object to be used for numerical integration.
+ Since we are integrating over a surface that is one dimension lower than
+ the problem domain, this would typically be set to something like 
+\family typewriter
+Quadrature2Din3D
+\family default
+ (for a three-dimensional problem).
+\end_layout
+
+\begin_layout Standard
+By default the output manager does not output any information.
+ The specified tractions can be output in global coordinates by including
+ ``tractions'' in the output manager's 
+\family typewriter
+cell_info_fields
+\family default
+ array parameter.
+ An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent]
+\end_layout
+
+\begin_layout LyX-Code
+bc = [x_neg,x_pos,y_neg]
+\end_layout
+
+\begin_layout LyX-Code
+bc.x_pos = pylith.bc.Neumann ; Change BC type to Neumann
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.bc.x_pos]
+\end_layout
+
+\begin_layout LyX-Code
+label = x_pos ; Name of group of vertices for +x boundary
+\end_layout
+
+\begin_layout LyX-Code
+db_initial = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.label = Neumann BC +x edge
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.iohandler.filename = axialtract.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.query_type = nearest
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell = pylith.feassemble.FIATLagrange
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell.dimension = 1
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell.quad_order = 2
+\end_layout
+
+\begin_layout Standard
+These settings correspond to the example problem described in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sub:Tutorial-twoquad4-traction"
+
+\end_inset
+
+.
+ It is necessary to set the boundary condition type to 
+\family typewriter
+pylith.bc.Neumann
+\family default
+, since the default value is 
+\family typewriter
+DirichletBC
+\family default
+.
+ Constant tractions are used for this particular problem, so a quadrature
+ order of one would have been sufficient; however, for problems involving
+ more complex variations (e.g., a linear variation), a quadrature order of
+ two will provide more accurate results.
+ Note that there is no advantage to specifying an integration order higher
+ than two, since linear elements are being used for this problem.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:neumann:output"
+
+\end_inset
+
+Fields available in output of Neumann boundary condition information.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="3">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="3in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Field Type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Field
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+cell_info_fields
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+tracton_initial
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Initial traction field in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction_rate
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Rate of change of traction field in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+rate_start_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Onset time in seconds for rate of change in traction field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction_change
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amplitude of change in traction field in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+change_start_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Onset time in seconds for the amplitude change in the traction field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Neumann Boundary Condition Spatial Database Files
+\end_layout
+
+\begin_layout Standard
+The spatial database files for the Neumann boundary condition specify the
+ applied tractions.
+ The number of traction components is equal to the spatial dimension for
+ the problem.
+ The tractions are specified in a local coordinate system for the boundary.
+ The names of the components of the traction vector are:
+\end_layout
+
+\begin_layout Description
+one-dimensional 
+\family typewriter
+normal
+\end_layout
+
+\begin_layout Description
+two-dimensional 
+\family typewriter
+shear
+\family default
+, 
+\family typewriter
+normal
+\end_layout
+
+\begin_layout Description
+three-dimensional 
+\family typewriter
+horiz-shear
+\family default
+, 
+\family typewriter
+vert-shear
+\family default
+, 
+\family typewriter
+normal
+\end_layout
+
+\begin_layout Standard
+Ambiguities in specifying the shear tractions in 3D problems are resolved
+ using the 
+\family typewriter
+up_dir
+\family default
+ parameter.
+ In the case of a horizontal surface, users will need to pick an alternative
+ vector, as the default 
+\family typewriter
+up_dir
+\family default
+ would coincide with the normal direction.
+ In this case, the orientation for the 
+\family typewriter
+vert-shear-traction
+\family default
+ component will correspond to whatever the user specifies for 
+\family typewriter
+up_dir
+\family default
+, rather than the actual vertical direction.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Values in the spatial databases used for Dirichlet boundary conditions in
+ three dimensions.
+ In one- and two-dimensional problems, the names of the components are slightly
+ different as described earlier in this section.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="4" columns="2">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="4in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Spatial database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Name in Spatial Database
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_initial
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-shear-horiz, traction-shear-vert, traction-normal
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_rate
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-rate-horiz-shear, traction-rate-vert-shear, traction-rate-normal,
+ rate-start-time
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_change
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-horiz-shear, traction-vert-shear, traction-normal, change-start-time
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Point Force Boundary Conditions
+\end_layout
+
+\begin_layout Standard
+Point force boundary conditions in PyLith prescribe the application of point
+ forces to a subset of the vertices of the finite-element mesh.
+ While point force boundary conditions can be applied to any vertex, usually
+ they are applied to vertices on the lateral, top, and bottom boundaries
+ of the domain.
+\end_layout
+
+\begin_layout Subsubsection
+Point Force Parameters
+\end_layout
+
+\begin_layout Standard
+The properties and components common to both the DirichletBC and DirichletBounda
+ry boundary conditions are:
+\end_layout
+
+\begin_layout Description
+label Label of the group of vertices associated with the boundary condition.
+\end_layout
+
+\begin_layout Description
+bc_dof Array of degrees of freedom to which forces are applied (first degree
+ of freedom is 0).
+\end_layout
+
+\begin_layout Standard
+An example of setting the point force boundary condition parameters in a
+ 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem]
+\end_layout
+
+\begin_layout LyX-Code
+bc = [mybc]
+\end_layout
+
+\begin_layout LyX-Code
+bc.mybc = pylith.bc.PointForce
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.bc.mybc]
+\end_layout
+
+\begin_layout LyX-Code
+label = group A 
+\end_layout
+
+\begin_layout LyX-Code
+bc_dof = [2] ; fixed displacement in z direction
+\end_layout
+
+\begin_layout LyX-Code
+db_initial = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.iohandler.filename = force_A.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.query_type = nearest ; change query type to nearest point algorithm
+\end_layout
+
+\begin_layout LyX-Code
+db_rate = spatialdata.spatialdb.UniformDB
+\end_layout
+
+\begin_layout LyX-Code
+db_rate.values = [force-rate-z]
+\end_layout
+
+\begin_layout LyX-Code
+db_rate.data = [1.0e+5*newton/s]
+\end_layout
+
+\begin_layout Standard
+We have created an array with one boundary condition, mybc.
+ The group of vertices associated with the boundary condition is group A.
+ For the database associated with the constant force, we use a SimpleDB.
+ We set the filename and query type for the database.
+ For the rate of change of values, we use a UniformDB and specify the rate
+ of change in the force to be 1.0e+5 Newton/s.
+ See Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:spatial:databases"
+
+\end_inset
+
+ for a discussion of the different types of spatial databases available.
+\end_layout
+
+\begin_layout Subsubsection
+Point Force Spatial Database Files
+\end_layout
+
+\begin_layout Standard
+The spatial database files for the Dirichlet boundary condition specify
+ the fixed displacements.
+ The spatial database file may contain displacements at more degrees of
+ freedom than those specified in the Dirichlet boundary condition settings
+ using the 
+\family typewriter
+bc_dof
+\family default
+ setting.
+ Only those listed in 
+\family typewriter
+bc_dof
+\family default
+ will be used.
+ This permits using the same spatial database file for multiple Dirichlet
+ boundary conditions with the same displacement field.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Values in the spatial databases used for point force boundary conditions.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="4" columns="2">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="4in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Spatial database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Name in Spatial Database
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_initial
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+force-x, force-y, force-z
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_rate
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+force-rate-x, force-rate-y, force-rate-z, rate-start-time
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_change
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+force-x, force-y, force-z, change-start-time
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:absorbing:boundaries"
+
+\end_inset
+
+Absorbing Boundary Conditions
+\end_layout
+
+\begin_layout Standard
+This boundary condition attempts to prevent seismic waves reflecting off
+ of a boundary by placing simple dashpots on the boundary.
+ Normally incident dilatational and shear waves are perfectly absorbed.
+ Waves incident at other angles are only partially absorbed.
+ This boundary condition is simpler than a perfectly matched layer (PML)
+ boundary condition but does not perform quite as well, especially for surface
+ waves.
+ If the waves arriving at the absorbing boundary are relatively small in
+ amplitude compared to the amplitudes of primary interest, this boundary
+ condition gives reasonable results.
+\end_layout
+
+\begin_layout Standard
+The Absorbing boundary condition properties and components are:
+\end_layout
+
+\begin_layout Description
+label Name of the group of vertices defining the mesh boundary for the absorbing
+ boundary condition.
+\end_layout
+
+\begin_layout Description
+up_dir This is a 3-vector that provides a hint for the direction perpendicular
+ to the horizontal tangent direction that is not collinear with the direction
+ normal to the surface.
+ The default value is (0,0,1), which assumes that the z-axis is positive
+ upward.
+ This vector is only needed for three-dimensional problems where the positive
+ upward direction differs from the default.
+\end_layout
+
+\begin_layout Description
+db The spatial database specifying the material properties for the seismic
+ velocities.
+\end_layout
+
+\begin_layout Description
+quadrature The quadrature object to be used for numerical integration.
+ Since we are integrating over a surface that is one dimension lower than
+ the problem domain, this would typically be set to something like 
+\family typewriter
+Quadrature2Din3D
+\family default
+ (for a three-dimensional problem).
+\end_layout
+
+\begin_layout Subsection
+Finite-Element Implementation of Absorbing Boundary
+\end_layout
+
+\begin_layout Standard
+Consider a plane wave propagating at a velocity 
+\begin_inset Formula $c$
+\end_inset
+
+.
+ We can write the displacement field as
+\begin_inset Formula 
+\begin{equation}
+\vec{u}(\vec{x},t)=\vec{u^{t}}(t-\frac{\vec{x}}{c}),
+\end{equation}
+
+\end_inset
+
+where 
+\begin_inset Formula $\vec{x}$
+\end_inset
+
+ is position, 
+\begin_inset Formula $t$
+\end_inset
+
+ is time, and 
+\begin_inset Formula $\vec{u^{t}}$
+\end_inset
+
+ is the shape of the propagating wave.
+ For an absorbing boundary we want the traction on the boundary to be equal
+ to the traction associated with the wave propagating out of the domain.
+ Starting with the expression for the traction on a boundary, 
+\begin_inset Formula $T_{i}=\sigma_{ij}n_{j},$
+\end_inset
+
+ and using the local coordinate system for the boundary 
+\begin_inset Formula $s_{h}s_{v}n,$
+\end_inset
+
+ where 
+\begin_inset Formula $\vec{n}$
+\end_inset
+
+ is the direction normal to the boundary, 
+\begin_inset Formula $\overrightarrow{s}_{h}$
+\end_inset
+
+ is the horizontal direction tangent to the boundary, and 
+\begin_inset Formula $\overrightarrow{s}_{v}$
+\end_inset
+
+ is the vertical direction tangent to the boundary, the tractions on the
+ boundary are
+\begin_inset Formula 
+\begin{gather}
+T_{s_{h}}=\sigma_{s_{h}n}\\
+T_{s_{v}}=\sigma_{s_{v}n}\\
+T_{n}=\sigma_{nn}.
+\end{gather}
+
+\end_inset
+
+In the case of a horizontal boundary, we can define an auxiliary direction
+ in order to assign unique tangential directions.
+ For a linear elastic isotropic material, 
+\begin_inset Formula $\sigma_{ij}=\lambda\epsilon_{kk}\delta_{ij}+2\mu\epsilon_{ij},$
+\end_inset
+
+ and we can write the tractions as 
+\begin_inset Formula 
+\begin{gather}
+T_{s_{h}}=2\mu\epsilon_{s_{h}n}\\
+T_{s_{v}}=2\epsilon_{s_{v}n}\\
+T_{n}=(\lambda+2\mu)\epsilon_{nn}+\lambda(\epsilon_{s_{h}s_{h}}+\epsilon_{s_{v}s_{v}}).
+\end{gather}
+
+\end_inset
+
+For infinitesimal strains, 
+\begin_inset Formula $\epsilon_{ij}=\frac{1}{2}(u_{i,j}+u_{j,i})$
+\end_inset
+
+ and we have
+\begin_inset Formula 
+\begin{gather}
+\epsilon_{s_{h}n}=\frac{1}{2}(u_{s_{h},n}+u_{n,s_{h}})\\
+\epsilon_{s_{v}n}=\frac{1}{2}(u_{s_{v},n}+u_{n,s_{v}})\\
+\epsilon_{nn}=u_{n,n}.
+\end{gather}
+
+\end_inset
+
+For our propagating plane wave, we recognize that
+\begin_inset Formula 
+\begin{equation}
+\frac{\partial\vec{u^{t}}(t-\frac{\vec{x}}{c})}{\partial x_{i}}=-\frac{1}{c}\frac{\partial\vec{u^{t}}(t-\frac{\vec{x}}{c})}{\partial t},
+\end{equation}
+
+\end_inset
+
+so that our expressions for the tractions become
+\begin_inset Formula 
+\begin{gather}
+T_{s_{h}}=-\frac{\mu}{c}\left(\frac{\partial u_{s_{h}}^{t}(t-\frac{\vec{x}}{c})}{\partial t}+\frac{\partial u_{n}^{t}(t-\frac{\vec{x}}{c})}{\partial t}\right),\\
+T_{s_{v}}=-\frac{\mu}{c}\left(\frac{\partial u_{s_{v}}^{t}(t-\frac{\vec{x}}{c})}{\partial t}+\frac{\partial u_{n}^{t}(t-\frac{\vec{x}}{c})}{\partial t}\right).
+\end{gather}
+
+\end_inset
+
+For the normal traction, consider a dilatational wave propagating normal
+ to the boundary at speed 
+\begin_inset Formula $v_{p}$
+\end_inset
+
+; in this case 
+\begin_inset Formula $u_{s_{h}}=u_{s_{v}}=0$
+\end_inset
+
+ and 
+\begin_inset Formula $c=v_{p}$
+\end_inset
+
+.
+ For the shear tractions, consider a shear wave propagating normal to the
+ boundary at speed 
+\begin_inset Formula $v_{s}$
+\end_inset
+
+; we can decompose this into one case where 
+\begin_inset Formula $u_{n}=u_{s_{v}}=0$
+\end_inset
+
+ and another case where 
+\begin_inset Formula $u_{n}=u_{s_{h}}=0$
+\end_inset
+
+, with 
+\begin_inset Formula $c=v_{s}$
+\end_inset
+
+ in both cases.
+ We also recognize that 
+\begin_inset Formula $\mu=\rho v_{s}^{2}$
+\end_inset
+
+ and 
+\begin_inset Formula $\lambda+2\mu=\rho v_{p}^{2}$
+\end_inset
+
+.
+ This leads to the following expressions for the tractions:
+\begin_inset Formula 
+\begin{gather}
+T_{s_{h}}=-\rho v_{s}\frac{\partial u_{s_{h}}^{t}(t-\frac{\vec{x}}{c})}{\partial t}\\
+T_{s_{v}}=-\rho v_{s}\frac{\partial u_{v}^{t}(t-\frac{\vec{x}}{c})}{\partial t}\\
+T_{n}=-\rho v_{p}\frac{\partial u_{n}^{t}(t-\frac{\vec{x}}{c})}{\partial t}
+\end{gather}
+
+\end_inset
+
+We write the weak form of the boundary condition as
+\begin_inset Formula 
+\[
+\int_{S_{T}}T_{i}\phi_{i}\, dS=\int_{S_{T}}-\rho c_{i}\frac{\partial u_{i}}{\partial t}\phi_{i}\, dS,
+\]
+
+\end_inset
+
+where 
+\begin_inset Formula $c_{i}$
+\end_inset
+
+ equals 
+\begin_inset Formula $v_{p}$
+\end_inset
+
+ for the normal traction and 
+\begin_inset Formula $v_{s}$
+\end_inset
+
+ for the shear tractions, and 
+\begin_inset Formula $\phi_{i}$
+\end_inset
+
+ is our weighting function.
+ We express the trial solution and weighting function as linear combinations
+ of basis functions,
+\begin_inset Formula 
+\begin{gather}
+u_{i}=\sum_{m}a_{i}^{m}N^{m},\\
+\phi_{i}=\sum_{n}c_{i}^{n}N^{n}.
+\end{gather}
+
+\end_inset
+
+Substituting into our integral over the absorbing boundaries yields
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+\int_{S_{T}}T_{i}\phi_{i}\, dS=\int_{S_{T}}-\rho c_{i}\sum_{m}\dot{a}_{i}^{m}N^{m}\sum_{n}c_{i}^{n}N^{n}\, dS.
+\end{equation}
+
+\end_inset
+
+In the derivation of the governing equations, we recognized that the weighting
+ function is arbitrary, so we form the residual by setting the terms associated
+ with the coefficients 
+\begin_inset Formula $c_{i}^{n}$
+\end_inset
+
+ to zero,
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+r_{i}^{n}=\sum_{\text{tract cells}}\sum_{\text{quad pts}}-\rho(x_{q})c_{i}(x_{q})\sum_{m}\dot{a}_{i}^{m}N^{m}(x_{q})N^{n}(x_{q})w_{q}|J_{cell}(x_{q})|,
+\end{equation}
+
+\end_inset
+
+ where 
+\begin_inset Formula $x_{q}$
+\end_inset
+
+ are the coordinates of the quadrature points, 
+\begin_inset Formula $w_{q}$
+\end_inset
+
+ are the weights of the quadrature points, and 
+\begin_inset Formula $|J_{cell}(x_{q})|$
+\end_inset
+
+ is the determinant of the Jacobian matrix evaluated at the quadrature points
+ associated with mapping the reference cell to the actual cell.
+\end_layout
+
+\begin_layout Standard
+The appearance of velocity in the expression for the residual means that
+ the absorbing dampers also contribute to the system Jacobian matrix.
+ Using the central difference method, the velocity is written in terms of
+ the displacements,
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+\dot{u}_{i}(t)=\frac{1}{2\Delta t}(u_{i}(t+\Delta t)-u_{i}(t-\Delta t)).
+\end{equation}
+
+\end_inset
+
+Expressing the displacement at time 
+\begin_inset Formula $t+\Delta t$
+\end_inset
+
+ in terms of the displacement at time 
+\begin_inset Formula $t$
+\end_inset
+
+ (
+\begin_inset Formula $u_{i}(t)$
+\end_inset
+
+) and the increment in the displacement at time 
+\begin_inset Formula $t$
+\end_inset
+
+ (
+\begin_inset Formula $du_{i}(t)$
+\end_inset
+
+) leads to
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+\dot{u}_{i}(t)=\frac{1}{2\Delta t}(du_{i}(t)+u_{i}(t)-u_{i}(t-\Delta t))
+\end{equation}
+
+\end_inset
+
+The terms contributing to the system Jacobian are associated with the increment
+ in the displacement at time 
+\begin_inset Formula $t$
+\end_inset
+
+.
+ Substituting into the governing equations and isolating the term associated
+ with the increment in the displacement at time t yields
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+A_{ij}^{nm}=\sum_{\text{tract cells}}\sum_{\text{quad pts}}\delta_{ij}\frac{1}{2\Delta t}\rho(x_{q})v_{i}(x_{q})N^{m}(x_{q})N^{n}(x_{q})w_{q}|J_{cells}(x_{q})|,
+\end{equation}
+
+\end_inset
+
+where 
+\begin_inset Formula $A_{ij}^{mn}$
+\end_inset
+
+ is an 
+\begin_inset Formula $nd$
+\end_inset
+
+ by 
+\begin_inset Formula $md$
+\end_inset
+
+ matrix (
+\begin_inset Formula $d$
+\end_inset
+
+ is the dimension of the vector space), 
+\begin_inset Formula $m$
+\end_inset
+
+ and 
+\begin_inset Formula $n$
+\end_inset
+
+ refer to the basis functions and 
+\begin_inset Formula $i$
+\end_inset
+
+ and 
+\begin_inset Formula $j$
+\end_inset
+
+ are vector space components.
+\end_layout
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:fault"
+
+\end_inset
+
+Fault Interface Conditions
+\end_layout
+
+\begin_layout Standard
+Fault interfaces are used to create dislocations (jumps in the displacement
+ field) in the model.
+ The dislocations arise from slip across a fault surface.
+ Both shear and tensile dislocations are supported.
+ For fault interfaces, dislocations in 1D correspond to fault-opening (and
+ closing), in 2D lateral-slip and fault opening, and in 3D lateral-slip,
+ reverse-slip, and fault opening.
+ PyLith supports kinematic (prescribed) slip and dynamic (spontaneous) rupture
+ simulations.
+\end_layout
+
+\begin_layout Subsection
+Conventions
+\end_layout
+
+\begin_layout Standard
+Slip corresponds to relative motion across a fault surface.
+ Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:fault:orientation"
+
+\end_inset
+
+ shows the orientation of the slip vector in 3D with respect to the fault
+ surface and coordinate axes.
+ PyLith automatically determines the orientation of the fault surface.
+ This alleviates the user from having to compute the strike, dip, and rake
+ angles over potentially complex, nonplanar fault surfaces.
+ Instead, the user specifies fault parameters in terms of lateral motion,
+ reverse motion, and fault opening as shown in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:fault:slip:motions"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/faultOrientation.eps
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Orientation of a fault surface in 3D, where 
+\begin_inset Formula $\phi$
+\end_inset
+
+ denotes the angle of the fault strike, 
+\begin_inset Formula $\delta$
+\end_inset
+
+ denotes the angle of the fault dip, and 
+\begin_inset Formula $\lambda$
+\end_inset
+
+ the rake angle.
+ 
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:fault:orientation"
+
+\end_inset
+
+ 
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/slipmotions.eps
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Sign conventions associated with fault slip.
+ Positive values are associated with left-lateral, reverse, and fault opening
+ motions.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:fault:slip:motions"
+
+\end_inset
+
+ 
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Fault Implementation
+\end_layout
+
+\begin_layout Standard
+In order to create relative motion across the fault surface in the finite-elemen
+t mesh, additional degrees of freedom are added along with adjustment of
+ the topology of the mesh.
+ These additional degrees of freedom are associated with cohesive cells.
+ These zero-volume cells allow control of the relative motion between vertices
+ on the two sides of the fault.
+ PyLith automatically adds cohesive cells for each fault surface.
+ Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:fault:cohesive:quad4"
+
+\end_inset
+
+ illustrates the results of inserting a cohesive cell in a mesh consisting
+ of two quadrilateral cells.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/quad4cohesivekin.eps
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Example of cohesive cell inserted into a mesh of two quadrilateral cells.
+ The zero thickness cohesive cell (shown with dashed lines) controls slip
+ on the fault via the relative motion between vertices 3 and 7 and 2 and
+ 6.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:fault:cohesive:quad4"
+
+\end_inset
+
+ 
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Fault Parameters
+\end_layout
+
+\begin_layout Standard
+The principal parameters for fault interface conditions are:
+\end_layout
+
+\begin_layout Description
+id This is an integer identifier for the fault surface.
+ It is used to specify the 
+\family typewriter
+material-id
+\family default
+ of the cohesive cells in the mesh.
+ Material identifiers must be unique so this value cannot be the same as
+ any of the material models or any other fault.
+\end_layout
+
+\begin_layout Description
+name Name or label for the fault.
+ This associates sets of vertices with the fault surface in addition to
+ being used in error and diagnostic reports.
+\end_layout
+
+\begin_layout Description
+up_dir Up-dir or up direction (used in 2D and 3D simulations).
+ In 2D the default in-plane slip is left-lateral, so we use the up-direction
+ to resolve the ambiguity in specifying reverse slip.
+ In 3D the up-direction is used to resolve the ambiguity in the along-strike
+ and dip-dir directions.
+ If the fault plane is horizontal, then the up-dir corresponds to the reverse-mo
+tion on the +z side of the fault.
+ The only requirement for this direction is that it not be collinear with
+ the fault normal direction.
+ The default value of [0, 0, 1] is appropriate for most 3D problems.
+\end_layout
+
+\begin_layout Description
+quadrature Quadrature object used in integrating fault quantities.
+\end_layout
+
+\begin_layout Description
+output Manager for output of diagnostic and data fields for the fault.
+\end_layout
+
+\begin_layout Standard
+By default the output manager outputs both diagnostic information (e.g., fault
+ normal direction) and the slip at each time step.
+ Tables 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:fault:kin:output"
+
+\end_inset
+
+ and 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:fault:dyn:output"
+
+\end_inset
+
+ list the fields available for output for a fault with kinematic (prescribed)
+ earthquake rupture and a fault with dynamic rupture, respectively.
+ The fault coordinate system is shown in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:fault:slip:motions"
+
+\end_inset
+
+.
+ The vectors in the fault coordinate system can be transformed to the global
+ coordinate system using the direction vectors in the diagnostic output.
+ An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem]
+\end_layout
+
+\begin_layout LyX-Code
+interfaces = [fault]
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+[pylithapp.problem.interfaces]
+\end_layout
+
+\begin_layout LyX-Code
+fault = pylith.faults.FaultCohesiveKin ; default
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+label = fault A ; Group of vertices defining the fault surface
+\end_layout
+
+\begin_layout LyX-Code
+id = 100 ; Value for material identifier associated with fault's cohesive
+ cells
+\end_layout
+
+\begin_layout LyX-Code
+up_dir = [0, 0, 1] ; default
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell = pylith.feassemble.FIATLagrange
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell.dimension = 2
+\end_layout
+
+\begin_layout Standard
+The group of vertices has the label ``fault A.'' We replicate the default
+ values for the fault ``up'' direction.
+ These settings apply to a 2D fault surface embedded within a 3D mesh, so
+ we use 2D Lagrange reference cells.
+ The spatial database for elastic properties is used to determine the approximat
+e shear modulus and condition the equations for faster convergence rates.
+\end_layout
+
+\begin_layout Subsection
+Kinematic Earthquake Rupture
+\end_layout
+
+\begin_layout Standard
+Kinematic earthquake ruptures use the FaultCohesiveKin object to specify
+ the slip as a function of time on the fault surface.
+ Slip may evolve simultaneously over the fault surface instantaneously in
+ a single time step (as is usually done in quasi-static simulations) or
+ propagate over the fault surface over hundreds and up to thousands of time
+ steps (as is usually done in a dynamic simulation).
+\end_layout
+
+\begin_layout Subsubsection
+Governing Equations
+\end_layout
+
+\begin_layout Standard
+The insertion of cohesive cells into the finite-element mesh has the effect
+ of decoupling the motion of the two sides of the fault surface.
+ In order to impose the desired relative motion, we must adjust the governing
+ equations.
+ PyLith employs Lagrange multiplier constraints to enforce the constraint
+ of the relative motion in the strong sense.
+ That is, we enforce the slip across the fault at each degree of freedom.
+\end_layout
+
+\begin_layout Standard
+In conventional implementations the additional degrees of freedom associated
+ with the Lagrange multipliers result in a complex implementation.
+ However, the use of Lagrange multiplier constraints with cohesive cells
+ provides for a simple formulation; we simply add the additional degrees
+ of freedom associated with the Lagrange multipliers to the cohesive cells
+ as shown in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:fault:cohesive:quad4"
+
+\end_inset
+
+.
+ As a result, the fault implementation is completely confined to the cohesive
+ cell.
+ Furthermore, the Lagrange multiplier constraints correspond to forces required
+ to impose the relative motions, so they are related to the change in stress
+ on the fault surface associated with fault slip.
+ If we write the algebraic system of equations associated with elasticity
+ in the form
+\begin_inset Formula 
+\begin{equation}
+\underline{A}\overrightarrow{u}=\overrightarrow{b}\,,
+\end{equation}
+
+\end_inset
+
+then adding in the Lagrange multiplier constraints associated with fault
+ slip leads to a new system of equations of the form 
+\begin_inset Formula 
+\begin{equation}
+\left[\begin{array}{cc}
+\underline{A} & \underline{C}^{T}\\
+\underline{C} & 0
+\end{array}\right]\left[\begin{array}{c}
+\overrightarrow{u}\\
+\overrightarrow{l}
+\end{array}\right]=\left[\begin{array}{c}
+\overrightarrow{b}\\
+\overrightarrow{d}
+\end{array}\right]\,,\label{eq:fault:cohesive:lagrange}
+\end{equation}
+
+\end_inset
+
+where 
+\begin_inset Formula $\overrightarrow{l}$
+\end_inset
+
+ is the vector of Lagrange multipliers and 
+\begin_inset Formula $\underline{C}$
+\end_inset
+
+ is composed of rotation submatrices, 
+\begin_inset Formula $\underline{R}$
+\end_inset
+
+, associated with the direction cosines relating the relative displacements
+ across the fault to the vector of fault slip, 
+\begin_inset Formula $\overrightarrow{d}$
+\end_inset
+
+.
+ Note that by using the direction cosines to relate the relative motion
+ across the fault, the slip vector and Lagrange multipliers (forces required
+ to impose the slip) are in the local fault coordinate system (lateral motion,
+ reverse motion, and fault opening).
+ 
+\end_layout
+
+\begin_layout Paragraph
+Non-diagonal A
+\end_layout
+
+\begin_layout Standard
+The Lagrange multipliers contribute to both the system Jacobian matrix and
+ the residual.
+ Because we enforce the constraints in a strong sense, the terms do not
+ involve integrals over the fault surface.
+ The additional terms in the residual are
+\begin_inset Formula 
+\begin{gather}
+r_{i}^{n}=-C_{ji}^{pn}l_{j}^{p},\\
+r_{i}^{p}=d_{i}^{p}-C_{ij}^{pn}u_{j}^{n},
+\end{gather}
+
+\end_inset
+
+where 
+\begin_inset Formula $n$
+\end_inset
+
+ denotes a conventional degree of freedom and 
+\begin_inset Formula $p$
+\end_inset
+
+ denotes a degree of freedom associated with a Lagrange multiplier.
+ The additional terms in the system Jacobian matrix are simply the direction
+ cosines,
+\begin_inset Formula 
+\begin{gather}
+J_{ij}^{np}=C_{ji}^{pn},\\
+J_{ij}^{pn}=C_{ij}^{pn}.
+\end{gather}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Paragraph
+Diagonal A
+\end_layout
+
+\begin_layout Standard
+When we use a lumped system Jacobian matrix, we cannot lump the terms associated
+ with the Lagrange multipliers.
+ Instead, we formulate the Jacobian ignoring the contributions from the
+ Lagrange multipliers, and then adjust the solution after the solve to account
+ for their presence.
+ Including the Lagrange multipliers in the general expression for the residual
+ at time 
+\begin_inset Formula $t+\Delta t$
+\end_inset
+
+, we have
+\begin_inset Formula 
+\begin{equation}
+r_{i}^{n}(t+\Delta t)=A_{ij}^{nm}(u_{j}^{m}(t)+du_{j}^{m}(t))+C_{ki}^{pn}(l_{k}^{p}(t)+dl_{k}^{p}(t)),
+\end{equation}
+
+\end_inset
+
+where we have written the displacements and Lagrange multipliers at time
+ 
+\begin_inset Formula $t+\Delta t$
+\end_inset
+
+ in terms of the values at time 
+\begin_inset Formula $t$
+\end_inset
+
+ and the increment from time 
+\begin_inset Formula $t$
+\end_inset
+
+ to 
+\begin_inset Formula $t+\Delta t$
+\end_inset
+
+.
+ When we solve the lumped system ignoring the Lagrange multipliers contributions
+ to the Jacobian, we formulate the residual assuming the values 
+\begin_inset Formula $du_{i}^{n}$
+\end_inset
+
+(t) and 
+\begin_inset Formula $dl_{k}^{p}(t)$
+\end_inset
+
+ are zero.
+ So our task is to determine the increment in the Lagrange multiplier, 
+\begin_inset Formula $dl_{k}^{p}$
+\end_inset
+
+, and the correction to the displacement increment, 
+\begin_inset Formula $du_{i}^{n}$
+\end_inset
+
+, and by setting the residual with all terms included to zero; thus, we
+ have
+\begin_inset Formula 
+\begin{gather}
+A_{ij}^{nm}(u_{j}^{m}(t)+du_{j}^{m}(t))+C_{ki}^{pn}(l_{k}^{p}(t)+dl_{k}^{p}(t))=0\text{ subject to}\\
+C_{ij}^{pn}(u_{j}^{n}(t)+du_{j}^{n}(t))=d_{i}^{p}.
+\end{gather}
+
+\end_inset
+
+Making use of the residual computed with 
+\begin_inset Formula $du_{i}^{n}(t)=0$
+\end_inset
+
+ and 
+\begin_inset Formula $dl_{k}^{p}(t)=0$
+\end_inset
+
+,
+\begin_inset Formula 
+\begin{gather}
+r_{i}^{n}+A_{ij}^{nm}du_{j}^{m}+C_{ki}^{pn}dl_{k}^{p}=0\text{ subject to}\\
+C_{ij}^{pn}(u_{j}^{n}(t)+du_{j}^{n}(t))=d_{i}^{p}.
+\end{gather}
+
+\end_inset
+
+Explicitly writing the equations for the vertices on the negative and positive
+ sides of the fault yields
+\begin_inset Formula 
+\begin{gather}
+r_{i}^{n-}+A_{ij}^{nm-}du_{j}^{m-}+R_{ki}^{pn}dl_{k}^{p}=0,\\
+r_{i}^{n+}+A_{ij}^{nm+}du_{j}^{m+}+R_{ki}^{pn}dl_{k}^{p}=0,\\
+R_{ij}^{pn}(u_{j}^{n+}+du_{j}^{n+}-u_{j}^{n-}-du_{j}^{n-})=d_{i}^{p}.
+\end{gather}
+
+\end_inset
+
+Solving the first two equations for 
+\begin_inset Formula $du_{j}^{m-}$
+\end_inset
+
+ and 
+\begin_inset Formula $du_{j}^{m+}$
+\end_inset
+
+ and combining them using the third equation leads to
+\begin_inset Formula 
+\begin{multline}
+R_{ij}^{pn}\left((A_{ij}^{nm+})^{-1}+(A_{ij}^{nm+})^{-1}\right)R_{ki}^{pn}dl_{k}^{p}=d_{i}^{p}-R_{ij}^{pn}(u_{j}^{n+}-u_{j}^{n-})\\
++R_{ij}^{pn}\left((A_{ij}^{nm+})^{-1}r_{i}^{n+}-(A_{ij}^{nm-})^{-1}r_{i}^{n-}\right).
+\end{multline}
+
+\end_inset
+
+We do not allow overlap between the fault interface and the absorbing boundary,
+ so 
+\begin_inset Formula $A_{ij}^{nm}$
+\end_inset
+
+ is the same for all components at a vertex.
+ As a result the matrix on the left hand side simplifies to
+\begin_inset Formula 
+\begin{equation}
+S_{ik}^{pn}=\delta_{ik}\left(\frac{1}{A^{nm+}}+\frac{1}{A^{nm-}}\right),
+\end{equation}
+
+\end_inset
+
+and
+\begin_inset Formula 
+\begin{equation}
+dl_{k}^{p}=(S_{ik}^{pn})^{-1}\left(d_{i}^{p}-R_{ij}^{pn}(u_{j}^{n+}-u_{j}^{n-})+R_{ij}^{pn}\left((A_{ij}^{nm+})^{-1}r_{i}^{n+}-(A_{ij}^{nm-})^{-1}r_{i}^{n-}\right)\right).
+\end{equation}
+
+\end_inset
+
+Now that we know the value of the increment in the Lagrange multiplier from
+ time 
+\begin_inset Formula $t$
+\end_inset
+
+ to time 
+\begin_inset Formula $t+\Delta t$
+\end_inset
+
+, we can correct the value for the displacement increment from time 
+\begin_inset Formula $t$
+\end_inset
+
+ to 
+\begin_inset Formula $t+\Delta t$
+\end_inset
+
+ using
+\begin_inset Formula 
+\begin{gather}
+\Delta du_{j}^{n-}=(A_{ij}^{nm-})^{-1}C_{ki}^{pn}dl_{k}^{p}\text{ and}\\
+\Delta du_{j}^{n+}=-(A_{ij}^{nm+})^{-1}C_{ki}^{pn}dl_{k}^{p}.
+\end{gather}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Arrays of Kinematic Rupture Components
+\end_layout
+
+\begin_layout Standard
+Multiple earthquake ruptures can be specified on a single fault surface.
+ This permits repeatedly rupturing the same portion of a fault or combining
+ earthquake rupture on one subset of the fault surface with steady aseismic
+ slip on another subset (the two subsets may overlap in both time and space).
+ A dynamic array of kinematic earthquake rupture components associates a
+ name (string) with each kinematic rupture.
+ The default dynamic array contains a single earthquake rupture, ``rupture''.
+ The 
+\family typewriter
+eq_srcs
+\family default
+ is the 
+\family typewriter
+FaultCohesiveKin
+\family default
+ facility for this dynamic array.
+ An example of setting the array of kinematic rupture components in a 
+\family typewriter
+.cfg
+\family default
+ file:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.interfaces.fault]
+\end_layout
+
+\begin_layout LyX-Code
+eq_srcs = [earthquake,creep]
+\end_layout
+
+\begin_layout Standard
+The output manager includes generic fault information (orientation) as well
+ as the final slip or slip rate (as in the case of the constant slip rate
+ slip time function) and slip initiation time for each kinematic rupture.
+ The name of the slip and slip initiation time vertex fields are of the
+ form 
+\family typewriter
+final_slip_NAME
+\family default
+ and 
+\family typewriter
+slip_time_NAME
+\family default
+, respectively, where 
+\family typewriter
+NAME
+\family default
+ refers to the name used in the dynamic array of kinematic ruptures, 
+\family typewriter
+eq_srcs
+\family default
+.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:fault:kin:output"
+
+\end_inset
+
+Fields available in output of fault information.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="8" columns="3">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="3.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Field Type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Field
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+vertex_info_fields
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+normal_dir
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Direction of fault normal in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+strike_dir
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Direction of fault strike in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+dip_dir
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Up-dip direction on hanging wall in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+final_slip_NAME
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Vector of final slip (in fault coordinate system) in meters
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip_time
+\family default
+_
+\family typewriter
+\noun on
+NAME
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Time at which slip begins in seconds
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+vertex_data_fields
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip vector at time step (in fault coordinate system) in meters
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction_change
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Change in fault tractions (in fault coordinate system) in Pa
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Kinematic Rupture Parameters
+\end_layout
+
+\begin_layout Standard
+The kinematic rupture parameters include the origin time and slip time function.
+ The slip initiation time in the slip time function is relative to the origin
+ time (default is 0).
+ This means that slip initiates at a point at a time corresponding to the
+ sum of the kinematic rupture's origin time and the slip initiation time
+ for that point.
+ An example of specifying the kinematic earthquake rupture properties and
+ components in a 
+\family typewriter
+.cfg
+\family default
+ file:
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+[pylithapp.problem.interfaces.fault]
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+eq_srcs = [earthquake,creep]
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+[pylithapp.problem.interfaces.fault.eq_srcs.earthquake]
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+origin_time = 0.0*s ; default origin time
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+slip_function = pylith.faults.StepSlipFn ; default slip time function
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+[pylithapp.problem.interfaces.fault.eq_srcs.creep]
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+origin_time = 10.0*year ; start creep at 10.0 years
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+slip_function = pylith.faults.ConstRateSlipFn ; switch to constant slip rate
+ slip function
+\end_layout
+
+\begin_layout Subsubsection
+Slip Time Function
+\end_layout
+
+\begin_layout Standard
+The current release of PyLith supports specification of the evolution of
+ fault slip using analytical expressions for the slip time history at each
+ point, where the parameters for the slip time function may vary over the
+ fault surface.
+ Currently, three slip time functions are available: (1) a step-function
+ for quasi-static modeling of earthquake rupture, (2) a constant slip rate
+ time function for modeling steady aseismic slip, and (3) the integral of
+ Brune's far-field time function 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Brune:1970"
+
+\end_inset
+
+ for modeling the dynamics of earthquake rupture.
+ Additional slip time functions will likely be available in future releases.
+ The default slip time function is the step-function slip function.
+\end_layout
+
+\begin_layout Paragraph
+Step-Function Slip Time Function
+\end_layout
+
+\begin_layout Standard
+This slip function prescribes a step in slip at a given time at a point:
+ 
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{gather}
+D(t)=\left\{ \begin{array}{cc}
+0 & 0\leq t<t_{r}\\
+D_{final} & t\ge t_{r}
+\end{array}\right.\,,
+\end{gather}
+
+\end_inset
+
+where 
+\begin_inset Formula $D(t)$
+\end_inset
+
+ is slip at time 
+\begin_inset Formula $t$
+\end_inset
+
+, 
+\begin_inset Formula $D_{final}$
+\end_inset
+
+ is the final slip, and 
+\begin_inset Formula $t_{r}$
+\end_inset
+
+ is the slip initiation time (time when rupture reaches the location).
+ The slip is specified independently for each of the components of slip,
+ and the slip and slip starting time may vary over the fault surface.
+\end_layout
+
+\begin_layout Description
+final_slip Spatial database of slip (
+\begin_inset Formula $D_{final})$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+slip_time Spatial database of slip initiation times (
+\begin_inset Formula $t_{r}$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Standard
+An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.interfaces.fault.eq_srcs.rupture]
+\end_layout
+
+\begin_layout LyX-Code
+slip_function = pylith.faults.StepSlipFn
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+[pylithapp.problem.interfaces.fault.eq_srcs.rupture.slip_function]
+\end_layout
+
+\begin_layout LyX-Code
+final_slip.iohandler.filename = final_slip.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+slip_time.iohandler.filename = sliptime.spatialdb
+\end_layout
+
+\begin_layout Standard
+The spatial database files for the slip time function specify the spatial
+ variation in the parameters for the slip time function, as shown in Table
+ 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:step-function-db-params"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:step-function-db-params"
+
+\end_inset
+
+Values in spatial database used as parameters in the step function slip
+ time function.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="5" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="2.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Spatial database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+final_slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+left-lateral-slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amount of left-lateral final slip in meters.
+ Use negative values for right-lateral slip.
+ Applies to faults in 2D and 3D only.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+reverse-slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amount of reverse slip in meters.
+ Use negative values for normal slip.
+ Applies to faults in 3D only.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+fault-opening
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amount of fault opening in meters.
+ Negative values imply penetration.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip-time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip initiation time (
+\begin_inset Formula $t_{t})$
+\end_inset
+
+ in seconds.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Paragraph
+Constant Slip Rate Slip Time Function
+\end_layout
+
+\begin_layout Standard
+This slip function prescribes a constant slip rate for the evolution of
+ slip at a point: 
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{gather}
+D(t)=\left\{ \begin{array}{cc}
+0 & 0\leq t<t_{r}\\
+V(t-t_{r}) & t\ge t_{r}
+\end{array}\right.\,,
+\end{gather}
+
+\end_inset
+
+where 
+\begin_inset Formula $D(t)$
+\end_inset
+
+ is slip at time 
+\begin_inset Formula $t$
+\end_inset
+
+, 
+\begin_inset Formula $V$
+\end_inset
+
+ is the slip rate, and 
+\begin_inset Formula $t_{r}$
+\end_inset
+
+ is the slip initiation time (time when rupture reaches the location).
+ The slip rate is specified independently for each of the components of
+ slip, and the slip rate and slip starting time may vary over the fault
+ surface.
+\end_layout
+
+\begin_layout Description
+slip_rate Spatial database of slip rate (
+\begin_inset Formula $V)$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+slip_time Spatial database of slip initiation times (
+\begin_inset Formula $t_{r}$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Standard
+An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.interfaces.fault.eq_srcs.ruptures]
+\end_layout
+
+\begin_layout LyX-Code
+slip_function = pylith.faults.ConstRateSlipFn
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+[pylithapp.problem.interfaces.fault.eq_srcs.ruptures.slip_function]
+\end_layout
+
+\begin_layout LyX-Code
+slip_rate.iohandler.filename = slip_rate.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+slip_time.iohandler.filename = sliptime.spatialdb
+\end_layout
+
+\begin_layout Standard
+The spatial database files for the slip time function specify the spatial
+ variation in the parameters for the slip time function, as shown in Table
+ 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:const-slip-rate-db-params"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:const-slip-rate-db-params"
+
+\end_inset
+
+Values in spatial database used as parameters in the constant slip rate
+ slip time function.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="5" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="2.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Spatial database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip_rate
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+left-lateral-slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip rate for left-lateral final slip in meters per second.
+ Use negative values for right-lateral slip.
+ Applies to faults in 2D and 3D only.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+reverse-slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip rate for reverse slip in meters per second.
+ Use negative values for normal slip.
+ Applies to faults in 3D only.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+fault-opening
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip rate for fault opening in meters per second.
+ Negative values imply penetration.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip-time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip initiation time (
+\begin_inset Formula $t_{t})$
+\end_inset
+
+ in seconds.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Paragraph
+Brune Slip Time Function
+\end_layout
+
+\begin_layout Standard
+We use an integral of Brune's far-field time function 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Brune:1970"
+
+\end_inset
+
+ to describe the evolution in time of slip at a point: 
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{gather}
+D(t)=\left\{ \begin{array}{cc}
+0 & 0\leq t<t_{r}\\
+D_{final}\left(1-exp\left(-\frac{t-t_{r}}{t_{0}}\right)\left(1+\frac{t-t_{r}}{t_{0}}\right)\right) & t\ge t_{r}
+\end{array}\right.\,,\\
+t_{0}=0.6195t_{\mathit{rise}}\,,
+\end{gather}
+
+\end_inset
+
+where 
+\begin_inset Formula $D(t)$
+\end_inset
+
+ is slip at time 
+\begin_inset Formula $t$
+\end_inset
+
+, 
+\begin_inset Formula $D_{final}$
+\end_inset
+
+ is the final slip at the location, 
+\begin_inset Formula $t_{r}$
+\end_inset
+
+ is the slip initiation time (time when rupture reaches the location), and
+ 
+\begin_inset Formula $t_{\mathit{rise}}$
+\end_inset
+
+ is the rise time.
+\end_layout
+
+\begin_layout Description
+slip Spatial database of final slip distribution (
+\begin_inset Formula $D_{final})$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+slip_time Spatial database of slip initiation times (
+\begin_inset Formula $t_{r}$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Description
+rise_time Spatial database for rise time (
+\begin_inset Formula $t_{\mathit{rise}}$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Standard
+An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.interfaces.fault.eq_srcs.ruptures]
+\end_layout
+
+\begin_layout LyX-Code
+slip_function = pylith.faults.BruneSlipFn
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+[pylithapp.problem.interfaces.fault.eq_srcs.rupture.slip_function]
+\end_layout
+
+\begin_layout LyX-Code
+slip.iohandler.filename = finalslip.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+rise_time.iohandler.filename = risetime.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+slip_time.iohandler.filename = sliptime.spatialdb
+\end_layout
+
+\begin_layout Standard
+The spatial database files for the slip time function specify the spatial
+ variation in the parameters for the slip time function, as shown in Table
+ 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:Brune-slip-db-params"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:Brune-slip-db-params"
+
+\end_inset
+
+Values in spatial database used as parameters in the Brune slip time function.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="2.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Spatial database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+left-lateral-slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amount of left-lateral final slip in meters.
+ Use negative values for right-lateral slip.
+ Applies to faults in 2D and 3D only.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+reverse-slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amount of reverse slip in meters.
+ Use negative values for normal slip.
+ Applies to faults in 3D only.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+fault-opening
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amount of fault opening in meters.
+ Negative values imply penetration.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+rise_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+rise-time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Rise time (
+\begin_inset Formula $t_{r})$
+\end_inset
+
+ in seconds.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip-time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip initiation time (
+\begin_inset Formula $t_{t})$
+\end_inset
+
+ in meters.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Paragraph
+Liu-Cosine Slip Time Function
+\end_layout
+
+\begin_layout Standard
+This slip time function, proposed by Liu, Archuleta, and Hartzell for use
+ in ground-motion modeling
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Liu:etal:2006"
+
+\end_inset
+
+, combines several cosine and sine functions together to create a slip time
+ history with a sharp rise and gradual termination with a finite duration
+ of slip.
+ The evolution of slip at a point follows: 
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{gather}
+D(t)=\left\{ \begin{array}{cc}
+D_{\mathit{final}}C_{n}\left(0.7t-0.7\frac{t_{1}}{\pi}\sin\frac{\pi t}{t_{1}}-1.2\frac{t_{1}}{\pi}\left(\cos\frac{\pi t}{2t_{1}}-1\right)\right) & 0\leq t<t_{1}\\
+D_{\mathit{final}}C_{n}\left(1.0t-0.7\frac{t1}{\pi}\sin\frac{\pi t}{t_{1}}+0.3\frac{t2}{\pi}\sin\frac{\pi(t-t1)}{t_{2}}+\frac{1.2}{\pi}t_{1}-0.3t_{1}\right) & t_{1}\leq t<2t_{1}\\
+D_{\mathit{final}}C_{n}\left(0.7-0.7\cos\frac{\pi t}{t_{1}}+0.6\sin\frac{\pi t}{2t_{1}}\right) & 2t_{1}\leq t\leq t_{0}
+\end{array}\right.\,,\\
+C_{n}=\frac{\pi}{1.4\pi t_{1}+1.2t_{1}+0.3\pi t_{2}},\\
+t_{0}=1.525t_{\mathit{rise}},\\
+t_{1}=0.13t_{0},\\
+t_{2}=t_{0}-t_{1},
+\end{gather}
+
+\end_inset
+
+where 
+\begin_inset Formula $D(t)$
+\end_inset
+
+ is slip at time 
+\begin_inset Formula $t$
+\end_inset
+
+, 
+\begin_inset Formula $D_{final}$
+\end_inset
+
+ is the final slip at the location, 
+\begin_inset Formula $t_{r}$
+\end_inset
+
+ is the slip initiation time (time when rupture reaches the location), and
+ 
+\begin_inset Formula $t_{\mathit{rise}}$
+\end_inset
+
+ is the rise time.
+\end_layout
+
+\begin_layout Description
+slip Spatial database of final slip distribution (
+\begin_inset Formula $D_{final})$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+slip_time Spatial database of slip initiation times (
+\begin_inset Formula $t_{r}$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Description
+rise_time Spatial database for rise time (
+\begin_inset Formula $t_{\mathit{rise}}$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Standard
+The spatial database files for the slip time function use the same parameters
+ for the slip time function as the Brune slip time function shown in Table
+ 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:Brune-slip-db-params"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Paragraph
+Time-History Slip Time Function
+\end_layout
+
+\begin_layout Standard
+This slip time function reads the slip time function from a data file, so
+ it can have an arbitrary shape.
+ The slip and slip initiation times are specified using spatial databases,
+ so the slip time function, in general, will use a normalized amplitude.
+\end_layout
+
+\begin_layout Description
+slip Spatial database of final slip distribution (
+\begin_inset Formula $D_{final})$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+slip_time Spatial database of slip initiation times (
+\begin_inset Formula $t_{r}$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Description
+time_history Temporal database for slip evolution.
+\end_layout
+
+\begin_layout Standard
+An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.interfaces.fault.eq_srcs.ruptures]
+\end_layout
+
+\begin_layout LyX-Code
+slip_function = pylith.faults.TimeHistorySlipFn
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+[pylithapp.problem.interfaces.fault.eq_srcs.rupture.slip_function]
+\end_layout
+
+\begin_layout LyX-Code
+slip.iohandler.filename = finalslip.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+slip_time.iohandler.filename = sliptime.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+time_history.iohandler.filename = myfunction.timedb
+\end_layout
+
+\begin_layout Standard
+The spatial database files for the slip time function specify the spatial
+ variation in the parameters for the slip time function, as shown in Table
+ 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:Brune-slip-db-params-2"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:Brune-slip-db-params-2"
+
+\end_inset
+
+Values in spatial database used as parameters in the time history slip time
+ function.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="2.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Spatial database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+left-lateral-slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amount of left-lateral final slip in meters.
+ Use negative values for right-lateral slip.
+ Applies to faults in 2D and 3D only.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+reverse-slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amount of reverse slip in meters.
+ Use negative values for normal slip.
+ Applies to faults in 3D only.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+fault-opening
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Amount of fault opening in meters.
+ Negative values imply penetration.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+rise_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+rise-time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Rise time (
+\begin_inset Formula $t_{r})$
+\end_inset
+
+ in seconds.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip-time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip initiation time (
+\begin_inset Formula $t_{t})$
+\end_inset
+
+ in meters.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Dynamic Earthquake Rupture
+\end_layout
+
+\begin_layout Standard
+Dynamic fault interfaces use the FaultCohesiveDyn object to specify a fault
+ constitutive model to govern the fault tractions (friction) and the resulting
+ slip.
+ When friction is large enough such that there is no sliding on the fault,
+ the fault is locked (slip is zero) and the Lagrange multipliers assume
+ their values just as they do in kinematic ruptures.
+ In this case, the Lagrange multipliers correspond to the forces necessary
+ to keep the slip zero.
+ When the driving forces exceed those allowed by friction, we reduce the
+ values of the Lagrange multipliers to those consistent with friction from
+ the fault constitutive model.
+ When we reduce the Lagrange multipliers, we must increment the slip accordingly
+ to maintain consistency in the algebraic system of equations.
+\end_layout
+
+\begin_layout Subsubsection
+Governing Equations
+\end_layout
+
+\begin_layout Standard
+The algebraic systems of equations for dynamic earthquake rupture are the
+ same as those for kinematic rupture
+\begin_inset Formula 
+\begin{equation}
+\left[\begin{array}{cc}
+\underline{A} & \underline{C}^{T}\\
+\underline{C} & 0
+\end{array}\right]\left[\begin{array}{c}
+\overrightarrow{u}\\
+\overrightarrow{l}
+\end{array}\right]=\left[\begin{array}{c}
+\overrightarrow{b}\\
+\overrightarrow{d}
+\end{array}\right].
+\end{equation}
+
+\end_inset
+
+Enforcing the limits imposed on the Lagrange multipliers by the fault constituti
+ve model requires determining the increment in slip for an increment in
+ the Lagrange multipliers.
+ The increment in the Lagrange multipliers is the difference between the
+ value computed for the current slip (either zero or the slip at the previous
+ time step) and the value computed from the fault constitutive model.
+ Starting from our system of algebraic equations,
+\begin_inset Formula 
+\begin{equation}
+A_{ij}^{nm}u_{j}^{m}+C_{ji}^{pn}l_{j}^{p}=b_{i}^{n},
+\end{equation}
+
+\end_inset
+
+we compute the sensitivity for the given loading and boundary conditions,
+\begin_inset Formula 
+\begin{equation}
+A_{ij}^{nm}\partial u_{j}^{m}=-C_{ji}^{pn}\partial l_{j}^{p}.
+\end{equation}
+
+\end_inset
+
+Computing the increment in the slip requires computing the increment in
+ the displacements.
+ Solving this equation rigorously would require inverting the system Jacobian,
+ which we do not want to do unless it is diagonal (as it is in the case
+ of the lumped formulations).
+ 
+\end_layout
+
+\begin_layout Paragraph
+Non-Diagonal A
+\end_layout
+
+\begin_layout Standard
+In general A is a sparse matrix with off-diagonal terms of the form
+\begin_inset Formula 
+\begin{equation}
+A=\left(\begin{array}{ccc}
+A_{0} & A_{1} & A_{2}\\
+A_{3} & A_{n-} & 0\\
+A_{4} & 0 & A_{n+}
+\end{array}\right),
+\end{equation}
+
+\end_inset
+
+where the degrees of freedom on either side of the fault are uncoupled.
+ We formulate two small linear systems involving just the degrees of freedom
+ associated with vertices on either the positive or negative sides of the
+ fault,
+\begin_inset Formula 
+\begin{gather}
+A_{ij}^{nm-}\partial u_{j}^{m-}=-R_{ij}^{pn}\partial l_{j}^{p},\\
+A_{ij}^{nm+}\partial u_{j}^{m+}=R_{ij}^{pn}\partial l_{j}^{p},
+\end{gather}
+
+\end_inset
+
+where we have replaced 
+\begin_inset Formula $\underline{C}$
+\end_inset
+
+ with 
+\begin_inset Formula $\underline{R}$
+\end_inset
+
+ to denote the explicit inclusion of the signs for the terms in 
+\begin_inset Formula $\underline{C}$
+\end_inset
+
+ associated with the positive (
+\begin_inset Formula $n^{+}$
+\end_inset
+
+) and negative (
+\begin_inset Formula $n^{-}$
+\end_inset
+
+) sides of the fault.
+ After solving these two linear systems of equations, we compute the increment
+ in slip using
+\begin_inset Formula 
+\begin{equation}
+\partial d_{i}^{p}=R_{ij}^{pn}(\partial u_{j}^{n+}-\partial u_{j}^{n-}).
+\end{equation}
+
+\end_inset
+
+The solution of these two linear systems gives the increment in slip assuming
+ all the degrees of freedom except those immediately adjacent to the fault
+ remain fixed.
+ In real applications where the deformation associated with fault slip is
+ localized around the fault, this provides good enough approximations so
+ that the nonlinear solver converges quickly.
+ In problems where deformation associated with slip on the fault is not
+ localized (as in the case in some of the example problems), the increment
+ in slip computed by solving these two linear systems is not a good approximatio
+n and the nonlinear solve requires a large number of iterations.
+\end_layout
+
+\begin_layout Standard
+We use the PETSc Krylov subspace solver (KSP) to solve these two linear
+ systems.
+ The PETSc settings for the KSP object are set in the same manner as the
+ main solver, except we use the prefix 
+\family typewriter
+friction_
+\family default
+ in all of the settings related to the KSP solver for these two linear systems.
+ For example, to use the recommended additive Schwarz preconditioner in
+ the friction sensitivity solves, the settings in a 
+\family typewriter
+.cfg
+\family default
+ file are:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.petsc]
+\end_layout
+
+\begin_layout LyX-Code
+friction_pc_type = asm
+\end_layout
+
+\begin_layout Standard
+See the examples in Sections 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Tutorial-3d-hex8-friction"
+
+\end_inset
+
+ and 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:tutorial:shearwave:quad4"
+
+\end_inset
+
+ for details.
+\end_layout
+
+\begin_layout Paragraph
+Diagonal A
+\end_layout
+
+\begin_layout Standard
+With a lumped Jacobian matrix, we can solve for the increment in slip directly,
+\begin_inset Formula 
+\begin{equation}
+\partial d_{i}^{p}=-C_{ij}^{pn}(A_{jk}^{nm})^{-1}C_{lk}^{pm}\partial l_{l}^{p}.
+\end{equation}
+
+\end_inset
+
+By not allowing the fault interface to overlap with the absorbing boundary,
+ the terms in 
+\begin_inset Formula $A$
+\end_inset
+
+ for a given vertex are identical and the expression on the right-hand side
+ reduces to
+\begin_inset Formula 
+\begin{equation}
+\partial d_{i}^{p}=-\left(\frac{1}{A^{n+}}+\frac{1}{A^{n-}}\right)\partial l_{i}^{p}.
+\end{equation}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Dynamic Rupture Parameters
+\end_layout
+
+\begin_layout Standard
+The components of the FaultCohesiveDyn object include
+\end_layout
+
+\begin_layout Description
+open_free_surface If true, enforce traction free surface when the fault
+ opens, otherwise apply prescribed tractions even when the fault opens (default
+ is true); to mimic a dike opening, use false.
+\end_layout
+
+\begin_layout Description
+zero_tolerance Tolerance for detecting zero values (default is 1.0e-10);
+ should be larger than absolute tolerance in KSP solves.
+\end_layout
+
+\begin_layout Description
+traction_perturbation Prescribed tractions on fault surface (generally used
+ for nucleating earthquake ruptures; default is none).
+\end_layout
+
+\begin_layout Description
+friction Fault constitutive model.
+\end_layout
+
+\begin_layout Standard
+An example of specifying the dynamic earthquake rupture properties and component
+s in a 
+\family typewriter
+.cfg
+\family default
+ file:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.interfaces.fault]
+\end_layout
+
+\begin_layout LyX-Code
+open_free_surface = True ; default
+\end_layout
+
+\begin_layout LyX-Code
+traction_perturbation = pylith.faults.TractPerturbation ; not default
+\end_layout
+
+\begin_layout LyX-Code
+traction_perturbation.db_initial = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+traction_perturbation.db_initial.iohandler.filename = tractions.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+friction = pylith.friction.StaticFriction
+\end_layout
+
+\begin_layout LyX-Code
+friction.db_properties = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+friction.db_properties.iohandler.filename = friction.spatialdb
+\end_layout
+
+\begin_layout Standard
+The prescribed traction perturbation is specified using the same fault coordinat
+e system as the slip directions in the kinematic ruptures.
+ The perurbation has the same functional form as the time-dependent boundary
+ conditions (and same spatial databases).
+ Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:fault:cohesive:dyn:prescribed:tractions"
+
+\end_inset
+
+ gives the values in the spatial database for the prescribed tractions.
+ Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:fault:dyn:output"
+
+\end_inset
+
+ shows the fields available for output.
+ Additional fields are available depending on the fault constitutive model.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:fault:cohesive:dyn:prescribed:tractions"
+
+\end_inset
+
+Values in spatial databases for prescribed tractions.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="22" columns="4">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="2.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Spatial database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Dimension
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_initial
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+1D
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-normal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Normal traction (tension is positive)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+2D
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-shear
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Left-lateral shear traction (reverse shear for dipping faults)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-normal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Normal traction (tension is positive)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+3D
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-shear-leftlateral
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Left-lateral shear traction
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-shear-updip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Reverse shear traction
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-normal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Normal traction (tension is positive)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_rate
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+1D
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-rate-normal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Rate of change of normal traction (tension is positive)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+2D
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-rate-shear
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Rate of change of left-lateral shear traction (reverse shear for dipping
+ faults)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-rate-normal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Rate of change of normal traction (tension is positive)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+3D
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-rate-leftlateral
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Rate of change of left-lateral shear traction
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-rate-shear-updip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Rate of change of reverse shear traction
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-rate-normal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Rate of change of normal traction (tension is positive)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+all
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+rate-start-time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Time at which rate of change begins
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_change
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+1D
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-normal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Change in normal traction (tension is positive)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+2D
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-shear
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Change in left-lateral shear traction (reverse shear for dipping faults)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-normal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Change in normal traction (tension is positive)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+3D
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-leftlateral
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Change in left-lateral shear traction
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-shear-updip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Change in reverse shear traction
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction-normal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Change in normal traction (tension is positive)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+all
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+change-start-time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Time at which change begins
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+th_change
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+all
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+None
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Time history for change
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:fault:dyn:output"
+
+\end_inset
+
+Fields available in output of fault information.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="11" columns="3">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="3.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Field Type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Field
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+vertex_info_fields
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+normal_dir
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align left
+Direction of fault normal in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+strike_dir
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align left
+Direction of fault strike in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+dip_dir
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align left
+Up-dip direction on hanging wall in global coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction_initial
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align left
+Initial tractions (if specified) in fault coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction_rate
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align left
+Rate of change in tractions (if specified) in fault coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+rate_start_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align left
+Time at which rate of change begins (if specified)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction_change
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align left
+Change in tractions (if specified) in fault coordinate system
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+change_start_time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align left
+Time at which change occurs (if specified)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+vertex_data_fields
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align left
+Slip vector at time step (in fault coordinate system) in meters
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+traction
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align left
+Fault tractions (in fault coordinate system) in Pa
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Fault Constitutive Models
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:fault:constitutive:models"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+PyLith provides four fault constitutive models.
+ Future releases may contain additional models, and a template is provided
+ for you to construct your own (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Extending:FaultConstitutiveModels"
+
+\end_inset
+
+).
+ The fault constitutive model implementations are independent of dimension
+ and work in both 2D and 3D.
+ In solving the governing equations, PyLith will use a scalar representation
+ of the shear traction in 2D and a vector representation of the shear traction
+ in 3D, with the shear traction resolved in the direction of current slip.
+ The fault constitutive models contain a common set of properties and components
+:
+\end_layout
+
+\begin_layout Description
+label Name of the friction model.
+\end_layout
+
+\begin_layout Description
+db_properties Spatial database of the friction model parameters (default
+ is SimpleDB).
+\end_layout
+
+\begin_layout Description
+db_initial_state Spatial database for initial state variables.
+ A warning will be given when a spatial database for the initial state is
+ not specified.
+ The default is none which results in initial state values of 0.0.
+ For some friction models, we provide more meaningful values for default
+ values.
+\end_layout
+
+\begin_layout Paragraph
+Static Friction
+\end_layout
+
+\begin_layout Standard
+The static friction model produces shear tractions proportional to the fault
+ normal traction plus a cohesive stress,
+\begin_inset Formula 
+\begin{equation}
+T_{f}=\begin{cases}
+T_{c}-\mu_{f}T_{n} & T_{n}\leq0\\
+0 & T_{n}>0
+\end{cases}.
+\end{equation}
+
+\end_inset
+
+The spatial database file for the static friction model properties specifies
+ the spatial variation of the parameters given in Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:static:friction:properties"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:static:friction:properties"
+
+\end_inset
+
+Values in the spatial database for constant friction parameters.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="3" columns="2">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="left" valignment="top" width="2.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align center
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+friction-coefficient
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align center
+Coefficient of friction, 
+\begin_inset Formula $\mu_{f}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+cohesion
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\align center
+Cohesive stress, 
+\begin_inset Formula $T_{c}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Paragraph
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:friction:slip:weakening"
+
+\end_inset
+
+Slip-Weakening Friction
+\end_layout
+
+\begin_layout Standard
+The linear slip-weakening friction model produces shear tractions equal
+ to the cohesive stress plus a contribution proportional to the fault normal
+ traction that decreases from a static value to a dynamic value as slip
+ progresses,
+\begin_inset Formula 
+\begin{equation}
+T_{f}=\begin{cases}
+T_{c}-(\mu_{s}-(\mu_{s}-\mu_{d})\frac{d}{d_{0}})T_{n} & d\leq d_{0}\text{ and }T_{n}\leq0\\
+T_{c}-\mu_{d}T_{n} & d>d_{0}\text{ and }T_{n}\leq0\\
+0 & T_{n}>0
+\end{cases}
+\end{equation}
+
+\end_inset
+
+The spatial database files for the slip-weakening friction model properties
+ and state variables specify the spatial variation of the fault constitutive
+ model parameters given in Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:slip:weakening:properties:statevars"
+
+\end_inset
+
+.
+ As long as the fault is locked, the initial state variables are zero, so
+ specifying the initial state variables for slip-weakening friction is rare.
+ The slip-weakening friction also includes a parameter, 
+\family typewriter
+force_healing
+\family default
+, to control healing.
+ In quasi-static simulations, one usually wants slip confined to a single
+ time step (
+\family typewriter
+force_healing
+\family default
+ = True), whereas in a dynamic simulation slip occurs over many time steps
+ (
+\family typewriter
+force_healing
+\family default
+ = False; default behavior) and fault healing is often neglected.
+ The properties include:
+\end_layout
+
+\begin_layout Description
+force_healing Flag indicating whether healing (cumalative slip state variable
+ reset to zero) is forced after every time step.
+\end_layout
+
+\begin_layout Standard
+An example of setting the properties for the rate and state friction component
+ in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.interfaces.fault]
+\end_layout
+
+\begin_layout LyX-Code
+friction = pylith.friction.SlipWeakening ; Change friction model from the
+ default
+\end_layout
+
+\begin_layout LyX-Code
+friction.force_healing = False ; default value
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:slip:weakening:properties:statevars"
+
+\end_inset
+
+Values in spatial databases for slip-weakening friction.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="7" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="2.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Spatial database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_properties
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+static-coefficient
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Static coefficient of friction, 
+\begin_inset Formula $\mu_{s}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+dynamic-coefficient
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Dynamic coefficient of friction, 
+\begin_inset Formula $\mu_{d}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+slip-weakening-parameter
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip-weakening parameter, 
+\begin_inset Formula $d_{0}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+cohesion
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Cohesive stress, 
+\begin_inset Formula $T_{c}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_initial_state
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+cumulative-slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Cumulative slip, 
+\begin_inset Formula $d$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+previous-slip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip at previous time step, 
+\begin_inset Formula $d(t-\Delta t)$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Paragraph
+Time-Weakening Friction
+\end_layout
+
+\begin_layout Standard
+The linear time-weakening friction model is analogous to the linear slip-weakeni
+ng friction model with time replacing slip.
+ It produces shear tractions equal to the cohesive stress plus a contribution
+ proportional to the fault normal traction that decreases from a static
+ value to a dynamic value as time progresses,
+\begin_inset Formula 
+\begin{equation}
+T_{f}=\begin{cases}
+T_{c}-(\mu_{s}-(\mu_{s}-\mu_{d})\frac{t}{t_{0}})T_{n} & t\leq t_{0}\text{ and }T_{n}\leq0\\
+T_{c}-\mu_{d}T_{n} & t>t_{0}\text{ and }T_{n}\leq0\\
+0 & T_{n}>0
+\end{cases}
+\end{equation}
+
+\end_inset
+
+The spatial database files for the time-weakening friction model properties
+ and state variables specify the spatial variation of the fault constitutive
+ model parameters given in Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:time:weakening:properties:statevars"
+
+\end_inset
+
+.
+ As long as the fault is locked, the initial state variable is zero, so
+ specifying the initial state variable for time-weakening friction is rare.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:time:weakening:properties:statevars"
+
+\end_inset
+
+Values in spatial databases for time-weakening friction.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="2.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_properties
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+static-coefficient
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Static coefficient of friction, 
+\begin_inset Formula $\mu_{s}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+dynamic-coefficient
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Dynamic coefficient of friction, 
+\begin_inset Formula $\mu_{d}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+time-weakening-parameter
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Time-weakening parameter, 
+\begin_inset Formula $t_{0}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+cohesion
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Cohesive stress, 
+\begin_inset Formula $T_{c}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_initial_state
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+elapsed-time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Elasped time of slip, 
+\begin_inset Formula $t$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Paragraph
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:friction:rate:state:ageing"
+
+\end_inset
+
+Rate- and State-Friction with Ageing Law
+\end_layout
+
+\begin_layout Standard
+The Dieterich-Ruina rate and state friction model produces shear tractions
+ equal to the cohesive stress plus a contribution proportional to the fault
+ normal traction that depends on a state variable,
+\begin_inset Formula 
+\begin{gather}
+T_{f}=\begin{cases}
+T_{c}-\mu_{f}T_{n} & T_{n}\leq0\\
+0 & T_{n}>0
+\end{cases}\\
+\mu_{f}=\begin{cases}
+\mu_{0}+a\ln\left(\frac{V}{V_{0}}\right)+b\ln\left(\frac{V_{0}\theta}{L}\right) & V\ge V_{\mathit{linear}}\\
+\mu_{0}+a\ln\left(\frac{V_{linear}}{V_{0}}\right)+b\ln\left(\frac{V_{0}\theta}{L}\right)-a\left(1-\frac{V}{V_{linear}}\right) & V<V_{linear}
+\end{cases}\\
+\frac{d\theta}{dt}=1-\frac{V\theta}{L}
+\end{gather}
+
+\end_inset
+
+where 
+\begin_inset Formula $V$
+\end_inset
+
+ is slip rate, 
+\begin_inset Formula $V_{linear}$
+\end_inset
+
+ is a cutoff for a linear slip rate dependence, 
+\begin_inset Formula $a$
+\end_inset
+
+ and 
+\begin_inset Formula $b$
+\end_inset
+
+ are coefficients, 
+\begin_inset Formula $L$
+\end_inset
+
+ is the characteristic slip distance, 
+\begin_inset Formula $\theta$
+\end_inset
+
+ is a state variable.
+ With an interative solver in quasi-static simulations with its small, but
+ nonzero residual tolerance we never encounter zero slip rates in quasi-static
+ simulations.
+ Instead we want to avoid significant variations in the coefficient of friction
+ for slip rates on the same order as our residual tolerance.
+ We regularize the rate and state friction model by imposing a linearization
+ of the variation of the coefficient of friction with slip rate when the
+ slip rate drops below a cutoff slip rate, 
+\begin_inset Formula $V_{linear}$
+\end_inset
+
+ (
+\family typewriter
+linear_slip_rate
+\family default
+ property with a default value of 1.0e-12).
+ Note that this is different than the popular inverse hyperbolic sine regulariza
+tion proposed by Ben-Zion and Rice 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "BenZion:Rice:1997"
+
+\end_inset
+
+ to permit zero slip rates.
+ Following Kaneko 
+\shape italic
+et al.
+
+\shape default
+ 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Kaneko:etal:2008"
+
+\end_inset
+
+, we integrate the evolution equation for the state variable, keeping slip
+ rate constant, to get
+\begin_inset Formula 
+\begin{equation}
+\theta(t+\Delta t)=\theta(t)\exp\left(\frac{-V(t)\Delta t}{L}\right)+\frac{L}{V(t)}\left(1-\exp\left(-\frac{V(t)\Delta t}{L}\right)\right).
+\end{equation}
+
+\end_inset
+
+As the slip rate approaches zero, the first exponential term approaches
+ 1.
+ Using the first three terms of the Taylor series expansion of the second
+ exponential yields
+\begin_inset Formula 
+\begin{equation}
+\theta(t+\Delta t)=\begin{cases}
+\theta(t)\exp\left(-\frac{V(t)\Delta t}{L}\right)+\Delta t-\frac{1}{2}\frac{V(t)\Delta t^{2}}{L} & \frac{V(t)\Delta t}{L}<0.00001\\
+\theta(t)\exp\left(-\frac{V(t)\Delta t}{L}\right)+\frac{L}{V(t)}\left(1-\exp\left(-\frac{V(t)\Delta t}{L}\right)\right) & \frac{V(t)\Delta t}{L}\ge0.00001
+\end{cases}.
+\end{equation}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+A zero value for the initial state results in infinite values for the coefficien
+t of friction.
+ To avoid such behavior when the user fails to provide nonzero values for
+ the initial state, we set the state variable to 
+\begin_inset Formula $L/V_{0}$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+The properties include:
+\end_layout
+
+\begin_layout Description
+linear_slip_rate Nondimensional slip rate at which linearization occurs,
+ 
+\begin_inset Formula $V_{linear}$
+\end_inset
+
+.
+ In quasi-static simulations it should be about one order of magnitude larger
+ than absolute tolerance in solve.
+\end_layout
+
+\begin_layout Standard
+An example of setting the properties for the rate- and state-friction component
+ in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+[pylithapp.problem.interfaces.fault]
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+friction = pylith.friction.RateStateAgeing ; Change friction model from the
+ default
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+friction.linear_slip_rate = 1.0e-12 ; default value
+\end_layout
+
+\begin_layout Standard
+The spatial database files for the rate- and state-friction model properties
+ and state variables specify the spatial variation of the fault constitutive
+ model parameters given in Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:rate:state:ageing:properties:statevars"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:rate:state:ageing:properties:statevars"
+
+\end_inset
+
+Values in spatial databases for Dieterich-Ruina rate-state friction.
+\end_layout
+
+\end_inset
+
+
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="8" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="2.5in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Database
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_properties
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+reference-friction-coefficient
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Steady-state coefficient of friction at slip rate 
+\begin_inset Formula $V_{0}$
+\end_inset
+
+, 
+\begin_inset Formula $\mu_{s}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+reference-slip-rate
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Reference slip rate, 
+\begin_inset Formula $V_{0}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+characteristic-slip-distance
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Slip-weakening parameter, 
+\begin_inset Formula $L$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+constitutive-parameter-a
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Coefficient for the 
+\begin_inset Formula $\ln$
+\end_inset
+
+ slip rate term, 
+\begin_inset Formula $a$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+constitutive-parameter-b
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Coefficient for the 
+\begin_inset Formula $\ln$
+\end_inset
+
+ state variable term, 
+\begin_inset Formula $b$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+cohesion
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Cohesive stress, 
+\begin_inset Formula $T_{c}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+db_initial_state
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+state-variable
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+State variable, 
+\begin_inset Formula $\theta$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:fault:cohesive:impulses"
+
+\end_inset
+
+Slip Impulses for Green's Functions
+\end_layout
+
+\begin_layout Standard
+Computing static Green's functions using the GreensFns problem requires
+ a specialized fault implementation, FaultCohesiveImpulses, to set up the
+ slip impulses.
+ The parameters controlling the slip impulses include the components involved
+ (lateral, reverse, and/or fault opening) and the amplitude of the pulses
+ (e.g., selecting a subset of a fault or including a spatial variation).
+ The GreensFns properties and facilities include:
+\end_layout
+
+\begin_layout Description
+threshold Threshold for non-zero amplitude; impulses will only be generated
+ at locations on the fault where the amplitude exceeds this threshold.
+\end_layout
+
+\begin_layout Description
+impulse_dof Array of components associated with impulses, e.g., [0, 1] for
+ slip involving the lateral and up-dip components.
+\end_layout
+
+\begin_layout Description
+db_impulse_amplitude Spatial database for amplitude of slip impulse (scalar
+ field).
+ Default is SimpleDB.
+\end_layout
+
+\begin_layout Standard
+An example of setting the properties and facilities for FaultCohesiveImpulses
+ in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.interfaces]
+\end_layout
+
+\begin_layout LyX-Code
+fault = pylith.faults.FaultCohesiveImpulses ; Change from the default
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+[pylithapp.problem.interfaces.fault]
+\end_layout
+
+\begin_layout LyX-Code
+threshold = 1.0e-6*m ; default
+\end_layout
+
+\begin_layout LyX-Code
+impulse_dof = [0] ; lateral slip-only
+\end_layout
+
+\begin_layout LyX-Code
+db_impulse_amplitude.iohandler.filename = myimpulse.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+db_impulse_amplitude.label = Impulse amplitude
+\end_layout
+
+\begin_layout Section
+Gravitational Body Forces
+\end_layout
+
+\begin_layout Standard
+Many problems in geophysics require the consideration of gravitational body
+ forces.
+ For example, it is often important to include the effects of the lithostatic
+ (overburden) pressure.
+ In future releases of PyLith that permit nonlinear bulk rheologies, body
+ forces will affect plastic yield criteria and the deformation field for
+ large deformation/finite strain problems.
+ As described in Chapter 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Governing-Equations"
+
+\end_inset
+
+, the body forces contribute to the residual,
+\begin_inset Formula 
+\begin{equation}
+r_{i}^{n}=\int_{V}f_{i}N^{n}\: dV.
+\end{equation}
+
+\end_inset
+
+For gravitational body forces, the body force per unit volume, 
+\begin_inset Formula $f_{i}$
+\end_inset
+
+, is given as the product of the mass density, 
+\begin_inset Formula $\rho$
+\end_inset
+
+, the scalar gravitational acceleration value, 
+\begin_inset Formula $g$
+\end_inset
+
+, and the gravitational acceleration orientation vector, 
+\begin_inset Formula $a_{i}$
+\end_inset
+
+:
+\begin_inset Formula 
+\begin{equation}
+f_{i}=\rho ga_{i}.
+\end{equation}
+
+\end_inset
+
+The mass density is a property of every material model, and is thus included
+ in the spatial database with the physical properties for each material.
+ The gravitational acceleration is assumed to be uniform and constant for
+ a given problem, with a default value of 9.80665 m/s
+\begin_inset Formula $^{\text{2}}$
+\end_inset
+
+.
+ The orientation vector will depend on the dimension of the problem as well
+ as the coordinate system being used.
+ The default orientation vector has components (0, 0, -1).
+ This is appropriate for three-dimensional problems where the gravity vector
+ is aligned with the negative z-axis, as would be the case in a geographic-proje
+cted coordinate system or a generic Cartesian coordinate system.
+ For cases in which the curvature of the earth should be considered, the
+ spatialdata package provides an earth-centered, earth-fixed (ECEF) coordinate
+ system and a local georeferenced Cartesian system; in each of these cases
+ the orientation vector is computed automatically, although this feature
+ has not been tested.
+ For problems in one or two dimensions where the orientation vector is constant,
+ the vector will need to be explicitly specified.
+ For example, in a two-dimensional problem, the vector might be specified
+ as (0, -1, 0).
+ The vector still has three components, although the extra component is
+ not used.
+\end_layout
+
+\begin_layout Standard
+Gravity is turned off by default.
+ To include gravitational effects in a simulation, you can turn it on as
+ follows:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent]
+\end_layout
+
+\begin_layout LyX-Code
+use_gravity = true
+\end_layout
+
+\begin_layout Standard
+By simply adding this flag, the default gravity field values will be used
+ and a 
+\family typewriter
+gravity_field
+\family default
+ component will be assigned for the problem.
+ The default values may be changed by altering the properties of 
+\family typewriter
+gravity_field
+\family default
+:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.gravity_field]
+\end_layout
+
+\begin_layout LyX-Code
+acceleration = 100.0*m*s**-2
+\end_layout
+
+\begin_layout LyX-Code
+gravity_dir = [0, -1, 0]
+\end_layout
+
+\begin_layout Standard
+An example problem using gravity is described in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Tutorial-3d-hex8-gravity"
+
+\end_inset
+
+.
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/components.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/components.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/components.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -104,7 +104,7 @@
 \end_layout
 
 \begin_layout Subsection
-Problem components
+Problem Components
 \end_layout
 
 \begin_layout Description
@@ -166,7 +166,8 @@
 \begin_inset Newline newline
 \end_inset
 
-Explicit time stepping for dynamic simulations with infinitesimal strains.
+Explicit time stepping for dynamic simulations with a lumped system Jacobian
+ matrix.
 \end_layout
 
 \begin_layout Description
@@ -179,31 +180,18 @@
 \end_inset
 
 Explicit time stepping for dynamic simulations including the effects of
- rigid body motion and small strains.
+ rigid body motion and small strains with a lumped system Jacobian matrix.
 \end_layout
 
 \begin_layout Description
 
 \family typewriter
-ExplicitLumped pylith.problems.ExplicitLumped
+ExplicitTri3 pylith.problems.ExplicitTri3
 \family default
 
 \begin_inset Newline newline
 \end_inset
 
-Explicit time stepping for dynamic simulations with a lumped system Jacobian
- matrix.
-\end_layout
-
-\begin_layout Description
-
-\family typewriter
-ExplicitLumpedTri3 pylith.problems.ExplicitLumpedTri3
-\family default
-
-\begin_inset Newline newline
-\end_inset
-
 Optimized elasticity formulation for linear triangular cells and one quadrature
  point for explicit time stepping in dynamic simulations.
 \end_layout
@@ -211,7 +199,7 @@
 \begin_layout Description
 
 \family typewriter
-ExplicitLumpedTet4 pylith.problems.ExplicitLumpedTet4
+ExplicitTet4 pylith.problems.ExplicitTet4
 \family default
 
 \begin_inset Newline newline
@@ -295,7 +283,7 @@
 \end_layout
 
 \begin_layout Subsection
-Utility components
+Utility Components
 \end_layout
 
 \begin_layout Description
@@ -337,20 +325,24 @@
 \begin_layout Description
 
 \family typewriter
-VTKDataReader pylith.utils.
+VTKDataReader pylith.utils.VTKDataReader
 \family default
-VTKDataReader
+
 \begin_inset Newline newline
 \end_inset
 
 Data reader for VTK files, requires TVTK Enthought package available from
  
 \family typewriter
+
+\begin_inset Newline newline
+\end_inset
+
 https://github.com/enthought/mayavi.
 \end_layout
 
 \begin_layout Subsection
-Topology components
+Topology Components
 \end_layout
 
 \begin_layout Description
@@ -404,9 +396,9 @@
 \begin_layout Description
 
 \family typewriter
-MeshRefiner pylith.topology.Mesh
+MeshRefiner pylith.topology.MeshRefiner
 \family default
-Refiner
+
 \begin_inset Newline newline
 \end_inset
 
@@ -416,9 +408,9 @@
 \begin_layout Description
 
 \family typewriter
-RefineUniform pylith.topology.
+RefineUniform pylith.topology.RefineUniform
 \family default
-RefineUniform
+
 \begin_inset Newline newline
 \end_inset
 
@@ -428,9 +420,9 @@
 \begin_layout Description
 
 \family typewriter
-ReverseCuthillMcKee pylith.topology.
+ReverseCuthillMcKee pylith.topology.ReverseCuthillMcKee
 \family default
-ReverseCuthillMcKee
+
 \begin_inset Newline newline
 \end_inset
 
@@ -439,7 +431,7 @@
 \end_layout
 
 \begin_layout Subsection
-Material components
+Material Components
 \end_layout
 
 \begin_layout Description
@@ -451,7 +443,7 @@
 \begin_inset Newline newline
 \end_inset
 
-Linearly elastic 1-D bulk constitutive model with 1-D strain (
+Linearly elastic 1D bulk constitutive model with 1D strain (
 \begin_inset Formula $\epsilon_{yy}=\epsilon_{zz}=0$
 \end_inset
 
@@ -467,7 +459,7 @@
 \begin_inset Newline newline
 \end_inset
 
-Linearly elastic 1-D bulk constitutive model with 1-D stress (
+Linearly elastic 1D bulk constitutive model with 1D stress (
 \begin_inset Formula $\sigma_{yy}=\sigma_{zz}=0$
 \end_inset
 
@@ -483,7 +475,7 @@
 \begin_inset Newline newline
 \end_inset
 
-Linearly elastic 2-D bulk constitutive model with plane strain (
+Linearly elastic 2D bulk constitutive model with plane strain (
 \begin_inset Formula $\epsilon_{zz}=0$
 \end_inset
 
@@ -499,7 +491,7 @@
 \begin_inset Newline newline
 \end_inset
 
-Linearly elastic 2-D bulk constitutive model with plane stress (
+Linearly elastic 2D bulk constitutive model with plane stress (
 \begin_inset Formula $\sigma_{zz}=0$
 \end_inset
 
@@ -515,7 +507,7 @@
 \begin_inset Newline newline
 \end_inset
 
-Linearly elastic 3-D bulk constitutive model.
+Linearly elastic 3D bulk constitutive model.
 \end_layout
 
 \begin_layout Description
@@ -628,7 +620,7 @@
 \end_layout
 
 \begin_layout Subsection
-Boundary condition components
+Boundary Condition Components
 \end_layout
 
 \begin_layout Description
@@ -706,7 +698,7 @@
 \end_layout
 
 \begin_layout Subsection
-Fault components
+Fault Components
 \end_layout
 
 \begin_layout Description
@@ -725,9 +717,9 @@
 \begin_layout Description
 
 \family typewriter
-FaultCohesiveDyn pylith.faults.FaultCohesive
+FaultCohesiveDyn pylith.faults.FaultCohesiveDyn
 \family default
-Dyn
+
 \begin_inset Newline newline
 \end_inset
 
@@ -737,9 +729,9 @@
 \begin_layout Description
 
 \family typewriter
-FaultCohesiveImpulses pylith.faults.FaultCohesive
+FaultCohesiveImpulses pylith.faults.FaultCohesiveImpulses
 \family default
-Impulses
+
 \begin_inset Newline newline
 \end_inset
 
@@ -848,7 +840,7 @@
 \end_layout
 
 \begin_layout Subsection
-Friction components
+Friction Components
 \end_layout
 
 \begin_layout Description
@@ -900,7 +892,7 @@
 \end_layout
 
 \begin_layout Subsection
-Discretization components
+Discretization Components
 \end_layout
 
 \begin_layout Description
@@ -914,7 +906,7 @@
 
 Finite-element basis functions and quadrature rules for a Lagrange reference
  finite-element cell (point, line, quadrilateral, or hexahedron) using FIAT.
- The basis functions are constructed from the tensor produce of 1-D Lagrange
+ The basis functions are constructed from the tensor produce of 1D Lagrange
  reference cells.
 \end_layout
 
@@ -932,7 +924,7 @@
 \end_layout
 
 \begin_layout Subsection
-Output components
+Output Components
 \end_layout
 
 \begin_layout Description
@@ -1022,9 +1014,9 @@
 \begin_layout Description
 
 \family typewriter
-OutputSolnPoints pylith.meshio.OutputSoln
+OutputSolnPoints pylith.meshio.OutputSolnPoints
 \family default
-Points
+
 \begin_inset Newline newline
 \end_inset
 
@@ -1291,11 +1283,11 @@
 \end_layout
 
 \begin_layout Section
-Spatialdata components
+Spatialdata Components
 \end_layout
 
 \begin_layout Subsection
-Coordinate system components
+Coordinate System Components
 \end_layout
 
 \begin_layout Description
@@ -1307,7 +1299,7 @@
 \begin_inset Newline newline
 \end_inset
 
-Cartesian coordinate system (0-D, 1-D, 2-D, or 3-D).
+Cartesian coordinate system (0D, 1D, 2D, or 3D).
 \end_layout
 
 \begin_layout Description
@@ -1372,7 +1364,7 @@
 \end_layout
 
 \begin_layout Subsection
-Spatial database components
+Spatial database Components
 \end_layout
 
 \begin_layout Description
@@ -1398,7 +1390,7 @@
 
 Simple spatial database that defines fields using a point cloud.
  Values are determined using a nearest neighbor search or linear interpolation
- in 0-D, 1-D, 2-D, or 3-D.
+ in 0D, 1D, 2D, or 3D.
 \end_layout
 
 \begin_layout Description

Modified: short/3D/PyLith/trunk/doc/userguide/cover/cover.pdf
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/doc/userguide/cover/cover.svg.gz
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/doc/userguide/cover/cover_small.jpg
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/doc/userguide/extending/extending.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/extending/extending.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/extending/extending.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -200,8 +200,8 @@
 \end_layout
 
 \begin_layout Standard
-The UniformVelModel component provides uniform physical properties: P wave
- speed, S wave speed, and density.
+The UniformVelModel component provides uniform physical properties: P-wave
+ speed, S-wave speed, and density.
  Although this is a rather trivial specification of physical properties
  that could be easily done using a UniformDB, this example demonstrates
  how to create a user-defined component that matches the requirements of
@@ -225,7 +225,7 @@
  known names might be necessary.
  Are there other parameters that control the behavior of the component,
  such as a minimum shear wave speed? In our example the user supplies values
- for the P wave speed, S wave speed, and density.
+ for the P-wave speed, S-wave speed, and density.
  The user-supplied parameters become Pyre properties and facilities in the
  Python source file.
  Because our user supplied parameters are floating point values with dimensions,
@@ -270,7 +270,7 @@
 \family default
 .
  The C++ object also includes the accessor functions that allow us to set
- the P wave speed, S wave speed, and density values to the user-specified
+ the P-wave speed, S-wave speed, and density values to the user-specified
  values in the Python object.
  Additional information, such as a file name, parameters defined as data
  structures, etc., would be set via similar accessor functions.
@@ -386,9 +386,9 @@
  example must also use georeferenced coordinates.
  The dislocation example in the PyLith 
 \family typewriter
-examples/twocells/twotet4-geopro
+examples/twocells/twotet4-geoproj
 \family default
-j directory uses UTM zone 11 coordinates.
+ directory uses UTM zone 11 coordinates.
  The spatial database package will transform the coordinates between the
  two projections as defined in the UniformVelModel 
 \family typewriter
@@ -464,8 +464,7 @@
 \family default
 , is not particularly useful, but it illustrates the basic steps involved
  in creating a bulk constitutive model with state variables.
- The sources files are included with the main PyLith source code in the
- 
+ The source files are included with the main PyLith source code in the 
 \family typewriter
 templates/materials
 \family default
@@ -489,8 +488,8 @@
  The specification of the physical properties and state variables associated
  with the constitutive model is handled directly in the C++ code.
  As a result, the Python object for the constitutive model component is
- very simple and customization is limited to simply changing the names of
- objects and labels.
+ very simple, and customization is limited to simply changing the names
+ of objects and labels.
 \end_layout
 
 \begin_layout Standard
@@ -589,7 +588,7 @@
 \begin_layout Standard
 Because it is sometimes convenient to supply physical properties for a bulk
  constitutive model that are equivalent but different from the ones that
- appear in the constitutive equations (e.g., P wave speed, S wave speed, and
+ appear in the constitutive equations (e.g., P-wave speed, S-wave speed, and
  density rather then Lame's constants 
 \begin_inset Formula $\mu,$
 \end_inset
@@ -620,7 +619,7 @@
 \end_layout
 
 \begin_layout Standard
-The SWIG interface files for a bulk constitutive component are setup in
+The SWIG interface files for a bulk constitutive component are set up in
  the same manner as in the previous example of creating a customized spatial
  database component.
  The ``main'' SWIG interface file (
@@ -666,9 +665,12 @@
 \family typewriter
 Makefile.am
 \family default
- file as necessary, then generate the configure script, run configure, and
- then build and install the library and module (see the 
+ file as necessary, then generate the configure script, run 
 \family typewriter
+configure
+\family default
+, and then build and install the library and module (see the 
+\family typewriter
 README
 \family default
  file for detailed instructions).
@@ -782,8 +784,7 @@
 \family default
 , is not particularly useful, but it illustrates the basic steps involved
  in creating a fault constitutive model.
- The sources files are included with the main PyLith source code in the
- 
+ The source files are included with the main PyLith source code in the 
 \family typewriter
 templates/friction
 \family default
@@ -922,7 +923,7 @@
 \end_layout
 
 \begin_layout Standard
-The SWIG interface files for a fault constitutive component are setup in
+The SWIG interface files for a fault constitutive component are set up in
  the same manner as in the previous examples of creating a bulk constitutive
  model or a customized spatial database component.
  The ``main'' SWIG interface file (
@@ -968,9 +969,12 @@
 \family typewriter
 Makefile.am
 \family default
- file as necessary, then generate the configure script, run configure, and
- then build and install the library and module (see the 
+ file as necessary, then generate the configure script, run 
 \family typewriter
+configure
+\family default
+, and then build and install the library and module (see the 
+\family typewriter
 README
 \family default
  file for detailed instructions).
@@ -1016,8 +1020,12 @@
  You can try using it in any of the 2D or 3D examples.
  For the examples in 
 \family typewriter
-examples/bar_shearwave/quad4, in shearwave_staticfriction.cfg
+examples/bar_shearwave/quad4,
 \family default
+ in 
+\family typewriter
+shearwave_staticfriction.cfg
+\family default
  replace the line
 \end_layout
 

Modified: short/3D/PyLith/trunk/doc/userguide/fileformats/fileformats.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/fileformats/fileformats.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/fileformats/fileformats.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,1694 +1,1694 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 1
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 2in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 2
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Chapter
-\begin_inset CommandInset label
-LatexCommand label
-name "cha:File-Formats"
-
-\end_inset
-
-File Formats
-\end_layout
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:MeshIOAscii"
-
-\end_inset
-
-PyLith Mesh ASCII Files
-\end_layout
-
-\begin_layout Standard
-PyLith mesh ASCII files allow quick specification of the mesh information
- for very small, simple meshes that are most easily written by hand.
- We do not recommend using this format for anything other than these very
- small, simple meshes.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Graphics
-	filename figs/meshquad4.eps
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Diagram of mesh specified in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:meshioascii:format"
-
-\end_inset
-
-.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:meshioascii:diagram"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-// This mesh file defines a finite-element mesh composed of two
-\end_layout
-
-\begin_layout LyX-Code
-// square cells of edge length 2.
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-// Comments can appear almost anywhere in these files and are
-\end_layout
-
-\begin_layout LyX-Code
-// delimited with two slashes (//) just like in C++.
- All text and 
-\end_layout
-
-\begin_layout LyX-Code
-// whitespace after the delimiter on a given line is ignored.
-\end_layout
-
-\begin_layout LyX-Code
-mesh = { // begin specification of the mesh
-\end_layout
-
-\begin_layout LyX-Code
-  dimension = 2 // spatial dimension of the mesh
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-  // Begin vertex and cell labels with 0.
- This is the default so 
-\end_layout
-
-\begin_layout LyX-Code
-  // this next line is optional
-\end_layout
-
-\begin_layout LyX-Code
-  use-index-zero = true
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-  vertices = { // vertices or nodes of the finite-element cells
-\end_layout
-
-\begin_layout LyX-Code
-    dimension = 2 // spatial dimension of the vertex coordinates
-\end_layout
-
-\begin_layout LyX-Code
-    count = 6 // number of vertices in the mesh
-\end_layout
-
-\begin_layout LyX-Code
-    coordinates = { // list of vertex index and coordinates
-\end_layout
-
-\begin_layout LyX-Code
-      // the coordinates must coincide with the coordinate 
-\end_layout
-
-\begin_layout LyX-Code
-      // system specified in the Mesh object
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-      // exactly one vertex must appear on each line
-\end_layout
-
-\begin_layout LyX-Code
-      // (excluding whitespace)
-\end_layout
-
-\begin_layout LyX-Code
-      0    -2.0  -1.0
-\end_layout
-
-\begin_layout LyX-Code
-      1    -2.0  +1.0
-\end_layout
-
-\begin_layout LyX-Code
-      2     0.0  -1.0
-\end_layout
-
-\begin_layout LyX-Code
-      3     0.0  +1.0
-\end_layout
-
-\begin_layout LyX-Code
-      4    +2.0  -1.0
-\end_layout
-
-\begin_layout LyX-Code
-      5    +2.0  +1.0
-\end_layout
-
-\begin_layout LyX-Code
-    } // end of coordinates list
-\end_layout
-
-\begin_layout LyX-Code
-  } // end of vertices
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  cells = { // finite-element cells
-\end_layout
-
-\begin_layout LyX-Code
-    count = 2 // number of cells in the mesh
-\end_layout
-
-\begin_layout LyX-Code
-    num-corners = 4 // number of vertices defining the cell
-\end_layout
-
-\begin_layout LyX-Code
-    simplices = { // list of vertices in each cell
-\end_layout
-
-\begin_layout LyX-Code
-      // see Section 4.2 for diagrams giving the order for each 
-\end_layout
-
-\begin_layout LyX-Code
-      // type of cell supported in PyLith
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-      // index of cell precedes the list of vertices for the cell 
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-      // exactly one cell must appear on each line
-\end_layout
-
-\begin_layout LyX-Code
-      // (excluding whitespace)
-\end_layout
-
-\begin_layout LyX-Code
-      0    0  2  3  1
-\end_layout
-
-\begin_layout LyX-Code
-      1    4  5  3  2
-\end_layout
-
-\begin_layout LyX-Code
-    } // end of simplices list
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-    material-ids = { // associated each cell with a material model
-\end_layout
-
-\begin_layout LyX-Code
-      // the material id is specified using the index of the cell 
-\end_layout
-
-\begin_layout LyX-Code
-      // and then the corresponding material id
-\end_layout
-
-\begin_layout LyX-Code
-      0   0 // cell 0 has a material id of 0
-\end_layout
-
-\begin_layout LyX-Code
-      1   2 // cell 1 has a material id of 2
-\end_layout
-
-\begin_layout LyX-Code
-    } // end of material-ids list
-\end_layout
-
-\begin_layout LyX-Code
-  } // end of cells
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // This next section lists groups of vertices that can be used
-\end_layout
-
-\begin_layout LyX-Code
-  // in applying boundary conditions to portions of the domain
-\end_layout
-
-\begin_layout LyX-Code
-  group = { // start of a group
-\end_layout
-
-\begin_layout LyX-Code
-    // the name can have whitespace, so no comments are allowed
-\end_layout
-
-\begin_layout LyX-Code
-    // after the name
-\end_layout
-
-\begin_layout LyX-Code
-    name = face +y
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-    // Either groups of vertices or groups of cells can be     
-\end_layout
-
-\begin_layout LyX-Code
-    // specified, but currently PyLith only makes use of groups 
-\end_layout
-
-\begin_layout LyX-Code
-    // of vertices
-\end_layout
-
-\begin_layout LyX-Code
-    type = vertices // 'vertices' or 'cells'
-\end_layout
-
-\begin_layout LyX-Code
-    count = 2 // number of vertices in the group
-\end_layout
-
-\begin_layout LyX-Code
-    indices = { // list of vertex indices in the group
-\end_layout
-
-\begin_layout LyX-Code
-      // multiple vertices may appear on a line
-\end_layout
-
-\begin_layout LyX-Code
-      0  4 // this group contains vertices 0 and 4
-\end_layout
-
-\begin_layout LyX-Code
-    } // end of list of vertices
-\end_layout
-
-\begin_layout LyX-Code
-  } // end of group
-\end_layout
-
-\begin_layout LyX-Code
-  // additional groups can be listed here
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Format of 
-\family typewriter
-PyLith
-\family default
- mesh ASCII files.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:meshioascii:format"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:Spatialdata:SimpleIOAscii"
-
-\end_inset
-
-SimpleDB Spatial Database Files
-\end_layout
-
-\begin_layout Standard
-SimpleDB spatial database files contain a header describing the set of points
- and then the data with each line listing the coordinates of a point followed
- by the values of the fields for that point.
- 
-\end_layout
-
-\begin_layout LyX-Code
-// This spatial database specifies the distribution of slip on the
-\end_layout
-
-\begin_layout LyX-Code
-// fault surface.
- In this case we prescribe a piecewise linear, 
-\end_layout
-
-\begin_layout LyX-Code
-// depth dependent distribution of slip.
- The slip is 2.0 m 
-\end_layout
-
-\begin_layout LyX-Code
-// right-lateral with 0.25 m of reverse slip at the surface with
-\end_layout
-
-\begin_layout LyX-Code
-// a linear taper from 2.0 m to 0.0 m from -2 km to -4 km.
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-// Comments can appear almost anywhere in these files and are
-\end_layout
-
-\begin_layout LyX-Code
-// delimited with two slashes (//) just like in C++.
- All text and 
-\end_layout
-
-\begin_layout LyX-Code
-// whitespace after the delimiter on a given line is ignored.
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-// The next line is the magic header for spatial database files 
-\end_layout
-
-\begin_layout LyX-Code
-// in ASCII format.
-\end_layout
-
-\begin_layout LyX-Code
-#SPATIAL.ascii 1
-\end_layout
-
-\begin_layout LyX-Code
-SimpleDB { // start specifying the database parameters
-\end_layout
-
-\begin_layout LyX-Code
-  num-values = 3 // number of values in the database
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Specify the names and the order of the values as they appear 
-\end_layout
-
-\begin_layout LyX-Code
-  // in the data.
- The names of the values must correspond to the 
-\end_layout
-
-\begin_layout LyX-Code
-  // names PyLith requests in querying the database.
-\end_layout
-
-\begin_layout LyX-Code
-  value-names =  left-lateral-slip  reverse-slip  fault-opening
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Specify the units of the values in Python syntax (e.g., kg/m**3).
-\end_layout
-
-\begin_layout LyX-Code
-  value-units =  m  m  m
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-  num-locs = 3 // Number of locations where values are given
-\end_layout
-
-\begin_layout LyX-Code
-  data-dim = 1 // Locations of data points form a line
-\end_layout
-
-\begin_layout LyX-Code
-  space-dim = 3 // Spatial dimension in which data resides
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Specify the coordinate system associated with the 
-\end_layout
-
-\begin_layout LyX-Code
-  // coordinates of the locations where data is given
-\end_layout
-
-\begin_layout LyX-Code
-  cs-data = cartesian { // Use a Cartesian coordinate system
-\end_layout
-
-\begin_layout LyX-Code
-    to-meters = 1.0e+3 // Coordinates are in km
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-    // Specify the spatial dimension of the coordinate system
-\end_layout
-
-\begin_layout LyX-Code
-    // This value must match the one associated with the database
-\end_layout
-
-\begin_layout LyX-Code
-    space-dim = 3
-\end_layout
-
-\begin_layout LyX-Code
-  } // cs-data // end of coordinate system specification
-\end_layout
-
-\begin_layout LyX-Code
-} // end of SimpleDB specification
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-// The locations and values are listed after the parameters.
-\end_layout
-
-\begin_layout LyX-Code
-// Columns are coordinates of the points (1 column for each 
-\end_layout
-
-\begin_layout LyX-Code
-// spatial dimension) followed by the data values in the order 
-\end_layout
-
-\begin_layout LyX-Code
-// specified by the value-names field.
-\end_layout
-
-\begin_layout LyX-Code
-0.0  0.0  0.0    -2.00  0.25  0.00
-\end_layout
-
-\begin_layout LyX-Code
-0.0  0.0 -2.0    -2.00  0.00  0.00
-\end_layout
-
-\begin_layout LyX-Code
-0.0  0.0 -4.0     0.00  0.00  0.00
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Format of spatial database files.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Spatial Database Coordinate Systems
-\end_layout
-
-\begin_layout Standard
-The spatial database files support four different types of coordinate systems.
- Conversions among the three geographic coordinate systems are supported
- in 3D.
- Conversions among the geographic and geographic projected coordinate systems
- are supported in 2D.
- In using the coordinate systems, we assume that you have installed the
- 
-\family typewriter
-proj
-\family default
- program in addition to the Proj.4 libraries, so that you can obtain a list
- of support projections, datums, and ellipsoids.
- Alternatively, refer to the documentation for the Proj.4 Cartographic Projection
-s library 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-trac.osgeo.org/proj
-\end_layout
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Subsubsection
-Cartesian
-\end_layout
-
-\begin_layout Standard
-This is a conventional Cartesian coordinate system.
- Conversions to other Cartesian coordinate systems are possible.
-\end_layout
-
-\begin_layout LyX-Code
-cs-data = cartesian {
-\end_layout
-
-\begin_layout LyX-Code
-  to-meters = 1.0e+3 // Locations in km
-\end_layout
-
-\begin_layout LyX-Code
-  space-dim = 2 // 1, 2, or 3 dimensions
-\end_layout
-
-\begin_layout LyX-Code
-}
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Format for Cartesian coordinate systems in spatial database files.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Geographic
-\end_layout
-
-\begin_layout Standard
-This coordinate system is for geographic coordinates, such as longitude
- and latitude.
- Specification of the location in three-dimensions is supported.
- The vertical datum can be either the reference ellipsoid or mean sea level.
- The vertical coordinate is positive upwards.
-\end_layout
-
-\begin_layout LyX-Code
-cs-data = geographic {
-\end_layout
-
-\begin_layout LyX-Code
-  // Conversion factor to get to meters (only applies to vertical 
-\end_layout
-
-\begin_layout LyX-Code
-  // coordinate unless you are using a geocentric coordinate system).
-\end_layout
-
-\begin_layout LyX-Code
-  to-meters = 1.0e+3
-\end_layout
-
-\begin_layout LyX-Code
-  space-dim = 2 // 2 or 3 dimensions
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Run 
-\begin_inset Quotes eld
-\end_inset
-
-proj -le
-\begin_inset Quotes erd
-\end_inset
-
- to see a list of available reference ellipsoids.
-\end_layout
-
-\begin_layout LyX-Code
-  // Comments are not allowed at the end of the next line.
-\end_layout
-
-\begin_layout LyX-Code
-  ellipsoid = WGS84
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Run 
-\begin_inset Quotes eld
-\end_inset
-
-proj -ld
-\begin_inset Quotes erd
-\end_inset
-
- to see a list of available datums.
-\end_layout
-
-\begin_layout LyX-Code
-  // Comments are not allowed at the end of the next line.
-\end_layout
-
-\begin_layout LyX-Code
-  datum-horiz = WGS84
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // 
-\begin_inset Quotes eld
-\end_inset
-
-ellipsoid
-\begin_inset Quotes erd
-\end_inset
-
- or 
-\begin_inset Quotes eld
-\end_inset
-
-mean sea level
-\begin_inset Quotes erd
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-  // Comments are not allowed at the end of the next line.
-\end_layout
-
-\begin_layout LyX-Code
-  datum-vert = ellipsoid
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Use a geocentric coordinate system?
-\end_layout
-
-\begin_layout LyX-Code
-  is-geocentric = false // true or false
-\end_layout
-
-\begin_layout LyX-Code
-}
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Format for geographic coordinate systems in spatial database files.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Geographic Projection
-\end_layout
-
-\begin_layout Standard
-This coordinate system applies to geographic projections.
- As in the geographic coordinate system, the vertical coordinate (if used)
- can be specified with respect to either the reference ellipsoid or mean
- sea level.
-\end_layout
-
-\begin_layout LyX-Code
-cs-data = geo-projected {
-\end_layout
-
-\begin_layout LyX-Code
-  to-meters = 1.0e+3 // Conversion factor to get to meters.
-\end_layout
-
-\begin_layout LyX-Code
-  space-dim = 2 // 2 or 3 dimensions
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-  // Run 
-\begin_inset Quotes eld
-\end_inset
-
-proj -le
-\begin_inset Quotes erd
-\end_inset
-
- to see a list of available reference ellipsoids.
-\end_layout
-
-\begin_layout LyX-Code
-  // Comments are not allowed at the end of the next line.
-\end_layout
-
-\begin_layout LyX-Code
-  ellipsoid = WGS84
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Run 
-\begin_inset Quotes eld
-\end_inset
-
-proj -ld
-\begin_inset Quotes erd
-\end_inset
-
- to see a list of available datums.
-\end_layout
-
-\begin_layout LyX-Code
-  // Comments are not allowed at the end of the next line.
-\end_layout
-
-\begin_layout LyX-Code
-  datum-horiz = WGS84
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // 
-\begin_inset Quotes eld
-\end_inset
-
-ellipsoid
-\begin_inset Quotes erd
-\end_inset
-
- or 
-\begin_inset Quotes eld
-\end_inset
-
-mean sea level
-\begin_inset Quotes erd
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-  // Comments are not allowed at the end of the next line.
-\end_layout
-
-\begin_layout LyX-Code
-  datum-vert = ellipsoid
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Run 
-\begin_inset Quotes eld
-\end_inset
-
-proj -lp
-\begin_inset Quotes erd
-\end_inset
-
- to see a list of available geographic 
-\end_layout
-
-\begin_layout LyX-Code
-  // projections.
-\end_layout
-
-\begin_layout LyX-Code
-    projector = projection {
-\end_layout
-
-\begin_layout LyX-Code
-    // Name of the projection.
- run 
-\begin_inset Quotes eld
-\end_inset
-
-proj -lp
-\begin_inset Quotes erd
-\end_inset
-
- to see a list of 
-\end_layout
-
-\begin_layout LyX-Code
-    // supported projections.
- Use the Universal Transverse Mercator
-\end_layout
-
-\begin_layout LyX-Code
-    // projection.
-\end_layout
-
-\begin_layout LyX-Code
-    projection = utm
-\end_layout
-
-\begin_layout LyX-Code
-    units = m // Units in the projection.
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-    // Provide a list of projection options; these are the command 
-\end_layout
-
-\begin_layout LyX-Code
-    // line arguments you would use with the proj program.
- Refer to
-\end_layout
-
-\begin_layout LyX-Code
-    // the Proj.4 library documentation for complete details.
-\end_layout
-
-\begin_layout LyX-Code
-    // Comments are not allowed at the end of the next line.
-\end_layout
-
-\begin_layout LyX-Code
-    proj-options = +zone=10
-\end_layout
-
-\begin_layout LyX-Code
-}
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Format for geographic projection coordinate systems in spatial database
- files.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Geographic Local Cartesian
-\end_layout
-
-\begin_layout Standard
-This coordinate system is a geographically referenced, local 3D Cartesian
- coordinate system.
- This allows use of a conventional Cartesian coordinate system with accurate
- georeferencing.
- For example, one can construct a finite-element model in this coordinate
- system and use spatial databases in geographic coordinates.
- This coordinate system provides an alternative to using a geographic projection
- as the Cartesian grip.
- The advantage of this coordinate system is that it retains the curvature
- of the Earth, while a geographic projection does not.
-\end_layout
-
-\begin_layout LyX-Code
-cs-data = geo-local-cartesian {
-\end_layout
-
-\begin_layout LyX-Code
-  // Conversion factor to get to meters (only applies to vertical
-\end_layout
-
-\begin_layout LyX-Code
-  // coordinate unless you are using a geocentric coordinate system).
-\end_layout
-
-\begin_layout LyX-Code
-  to-meters = 1.0 // use meters
-\end_layout
-
-\begin_layout LyX-Code
-  space-dim = 2 // 2 or 3 dimensions
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Run 
-\begin_inset Quotes eld
-\end_inset
-
-proj -le
-\begin_inset Quotes erd
-\end_inset
-
- to see a list of available reference ellipsoids.
-\end_layout
-
-\begin_layout LyX-Code
-  // Comments are not allowed at the end of the next line.
-\end_layout
-
-\begin_layout LyX-Code
-  ellipsoid = WGS84
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Run 
-\begin_inset Quotes eld
-\end_inset
-
-proj -ld
-\begin_inset Quotes erd
-\end_inset
-
- to see a list of available datums.
-\end_layout
-
-\begin_layout LyX-Code
-  // Comments are not allowed at the end of the next line.
-\end_layout
-
-\begin_layout LyX-Code
-  datum-horiz = WGS84
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // 
-\begin_inset Quotes eld
-\end_inset
-
-ellipsoid
-\begin_inset Quotes erd
-\end_inset
-
- or 
-\begin_inset Quotes eld
-\end_inset
-
-mean sea level
-\begin_inset Quotes erd
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-  // Comments are not allowed at the end of the next line.
-\end_layout
-
-\begin_layout LyX-Code
-  datum-vert = ellipsoid
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Origin of the local Cartesian coordinate system.
- To avoid
-\end_layout
-
-\begin_layout LyX-Code
-  // round-off errors it is best to pick a location near the center of
-\end_layout
-
-\begin_layout LyX-Code
-  // the region of interest.
- An elevation on the surface of the Earth
-\end_layout
-
-\begin_layout LyX-Code
-  // in the middle of the region also works well (and makes the
-\end_layout
-
-\begin_layout LyX-Code
-  // vertical coordinate easy to interpret).
-\end_layout
-
-\begin_layout LyX-Code
-  origin-lon = -116.7094 // Longitude of the origin in decimal degrees
-\end_layout
-
-\begin_layout LyX-Code
-                         // (west is negative).
-\end_layout
-
-\begin_layout LyX-Code
-  origin-lat = 36.3874 // Latitude of the origin in decimal degrees 
-\end_layout
-
-\begin_layout LyX-Code
-                       // (north is positive).
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Elevation with respect to the vertical datum.
- Units are the
-\end_layout
-
-\begin_layout LyX-Code
-  // same as the Cartesian coordinate system (in this case meters).
-\end_layout
-
-\begin_layout LyX-Code
-  origin-elev = 3.5
-\end_layout
-
-\begin_layout LyX-Code
-}
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Format for the geographic local Cartesian coordinate system in spatial database
- files.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:Spatialdata:TimeHistoryIO"
-
-\end_inset
-
-Time History Database Files
-\end_layout
-
-\begin_layout Standard
-Time history database files contain a header describing the numer of points
- in the time history and the units for the time stamps followed by a list
- with pairs of time stamps and amplitude values.
- The amplitude at an arbitraty point in time is computed via interpolation
- of the values in the database.
- This means that the time history database must span the range of time values
- of interest.
- The points in the time history must also be ordered in time.
-\end_layout
-
-\begin_layout LyX-Code
-// This time history database specifies temporal variation in
-\end_layout
-
-\begin_layout LyX-Code
-// amplitude.
- In this case we prescribe a triangular slip time
-\end_layout
-
-\begin_layout LyX-Code
-// history.
- 
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-// Comments can appear almost anywhere in these files and are
-\end_layout
-
-\begin_layout LyX-Code
-// delimited with two slashes (//) just like in C++.
- All text and 
-\end_layout
-
-\begin_layout LyX-Code
-// whitespace after the delimiter on a given line is ignored.
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-// The next line is the magic header for spatial database files 
-\end_layout
-
-\begin_layout LyX-Code
-// in ASCII format.
-\end_layout
-
-\begin_layout LyX-Code
-#TIME HISTORY ascii
-\end_layout
-
-\begin_layout LyX-Code
-TimeHistory { // start specifying the database parameters
-\end_layout
-
-\begin_layout LyX-Code
-  num-points = 5 // number of points in time history
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-  // Specify the units used in the time stamps.
-\end_layout
-
-\begin_layout LyX-Code
-  time-units = year
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-} // end of TimeHistory header
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-// The time history values are listed after the parameters.
-\end_layout
-
-\begin_layout LyX-Code
-// Columns time and amplitude where the amplitude values are unitless.
-\end_layout
-
-\begin_layout LyX-Code
- 0.0     0.00
-\end_layout
-
-\begin_layout LyX-Code
- 2.0     1.00
-\end_layout
-
-\begin_layout LyX-Code
- 6.0     4.00
-\end_layout
-
-\begin_layout LyX-Code
-10.0     2.00
-\end_layout
-
-\begin_layout LyX-Code
-11.0     0.00
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Format of time history database files.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:FileFormat:TimeStepUser"
-
-\end_inset
-
-User-Specified Time Step File
-\end_layout
-
-\begin_layout Standard
-This file lists the time step sizes for nonuniform, user-specified time
- steps.
- The file's format is an ASCII file that includes the units for the time
- step sizes and then a list of the time steps.
- 
-\end_layout
-
-\begin_layout LyX-Code
-// This time step file specifies five time steps with the units in years.
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-// Comments can appear almost anywhere in these files and are
-\end_layout
-
-\begin_layout LyX-Code
-// delimited with two slashes (//) just like in C++.
- All text and 
-\end_layout
-
-\begin_layout LyX-Code
-// whitespace after the delimiter on a given line is ignored.
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-// Units for the time steps
-\end_layout
-
-\begin_layout LyX-Code
-units = year
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-1.0 // Comment
-\end_layout
-
-\begin_layout LyX-Code
-2.0
-\end_layout
-
-\begin_layout LyX-Code
-3.0
-\end_layout
-
-\begin_layout LyX-Code
-2.5
-\end_layout
-
-\begin_layout LyX-Code
-3.0
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Format of user-specified time step files.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:FileFormat:PointsList"
-
-\end_inset
-
-Points List File
-\end_layout
-
-\begin_layout Standard
-This file lists the coordinates of the locations where output is requested
- for the 
-\family typewriter
-OutputSolnPoints
-\family default
- component.
- The coordinate system is specified in the 
-\family typewriter
-OutputSolnPoints
-\family default
- component.
- 
-\end_layout
-
-\begin_layout LyX-Code
-# This time step file specifies five time steps with the units in years.
-\end_layout
-
-\begin_layout LyX-Code
-#
-\end_layout
-
-\begin_layout LyX-Code
-# Comments are limited to complete lines.
- The default delimiter for comments
-\end_layout
-
-\begin_layout LyX-Code
-# is '#', which can be changed via parameters.
- Additionally, the delimiter 
-\end_layout
-
-\begin_layout LyX-Code
-# separating values can also be customized (default is whitespace).
-\end_layout
-
-\begin_layout LyX-Code
-1.0  -2.0   0.0
-\end_layout
-
-\begin_layout LyX-Code
-2.0  -4.0  -0.1
-\end_layout
-
-\begin_layout LyX-Code
-0.0  +2.0   0.0
-\end_layout
-
-\begin_layout LyX-Code
-2.5  -0.2  -0.2 
-\end_layout
-
-\begin_layout LyX-Code
-0.0   2.0  +0.2
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Format of files with coordinates of points for output.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 1
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 2in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 2
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Chapter
+\begin_inset CommandInset label
+LatexCommand label
+name "cha:File-Formats"
+
+\end_inset
+
+File Formats
+\end_layout
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:MeshIOAscii"
+
+\end_inset
+
+PyLith Mesh ASCII Files
+\end_layout
+
+\begin_layout Standard
+PyLith mesh ASCII files allow quick specification of the mesh information
+ for very small, simple meshes that are most easily written by hand.
+ We do not recommend using this format for anything other than these very
+ small, simple meshes.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Graphics
+	filename figs/meshquad4.eps
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Diagram of mesh specified in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:meshioascii:format"
+
+\end_inset
+
+.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:meshioascii:diagram"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+// This mesh file defines a finite-element mesh composed of two
+\end_layout
+
+\begin_layout LyX-Code
+// square cells of edge length 2.
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+// Comments can appear almost anywhere in these files and are
+\end_layout
+
+\begin_layout LyX-Code
+// delimited with two slashes (//) just like in C++.
+ All text and 
+\end_layout
+
+\begin_layout LyX-Code
+// whitespace after the delimiter on a given line is ignored.
+\end_layout
+
+\begin_layout LyX-Code
+mesh = { // begin specification of the mesh
+\end_layout
+
+\begin_layout LyX-Code
+  dimension = 2 // spatial dimension of the mesh
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+  // Begin vertex and cell labels with 0.
+ This is the default so 
+\end_layout
+
+\begin_layout LyX-Code
+  // this next line is optional
+\end_layout
+
+\begin_layout LyX-Code
+  use-index-zero = true
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+  vertices = { // vertices or nodes of the finite-element cells
+\end_layout
+
+\begin_layout LyX-Code
+    dimension = 2 // spatial dimension of the vertex coordinates
+\end_layout
+
+\begin_layout LyX-Code
+    count = 6 // number of vertices in the mesh
+\end_layout
+
+\begin_layout LyX-Code
+    coordinates = { // list of vertex index and coordinates
+\end_layout
+
+\begin_layout LyX-Code
+      // the coordinates must coincide with the coordinate 
+\end_layout
+
+\begin_layout LyX-Code
+      // system specified in the Mesh object
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+      // exactly one vertex must appear on each line
+\end_layout
+
+\begin_layout LyX-Code
+      // (excluding whitespace)
+\end_layout
+
+\begin_layout LyX-Code
+      0    -2.0  -1.0
+\end_layout
+
+\begin_layout LyX-Code
+      1    -2.0  +1.0
+\end_layout
+
+\begin_layout LyX-Code
+      2     0.0  -1.0
+\end_layout
+
+\begin_layout LyX-Code
+      3     0.0  +1.0
+\end_layout
+
+\begin_layout LyX-Code
+      4    +2.0  -1.0
+\end_layout
+
+\begin_layout LyX-Code
+      5    +2.0  +1.0
+\end_layout
+
+\begin_layout LyX-Code
+    } // end of coordinates list
+\end_layout
+
+\begin_layout LyX-Code
+  } // end of vertices
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  cells = { // finite-element cells
+\end_layout
+
+\begin_layout LyX-Code
+    count = 2 // number of cells in the mesh
+\end_layout
+
+\begin_layout LyX-Code
+    num-corners = 4 // number of vertices defining the cell
+\end_layout
+
+\begin_layout LyX-Code
+    simplices = { // list of vertices in each cell
+\end_layout
+
+\begin_layout LyX-Code
+      // see Section 4.2 for diagrams giving the order for each 
+\end_layout
+
+\begin_layout LyX-Code
+      // type of cell supported in PyLith
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+      // index of cell precedes the list of vertices for the cell 
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+      // exactly one cell must appear on each line
+\end_layout
+
+\begin_layout LyX-Code
+      // (excluding whitespace)
+\end_layout
+
+\begin_layout LyX-Code
+      0    0  2  3  1
+\end_layout
+
+\begin_layout LyX-Code
+      1    4  5  3  2
+\end_layout
+
+\begin_layout LyX-Code
+    } // end of simplices list
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+    material-ids = { // associated each cell with a material model
+\end_layout
+
+\begin_layout LyX-Code
+      // the material id is specified using the index of the cell 
+\end_layout
+
+\begin_layout LyX-Code
+      // and then the corresponding material id
+\end_layout
+
+\begin_layout LyX-Code
+      0   0 // cell 0 has a material id of 0
+\end_layout
+
+\begin_layout LyX-Code
+      1   2 // cell 1 has a material id of 2
+\end_layout
+
+\begin_layout LyX-Code
+    } // end of material-ids list
+\end_layout
+
+\begin_layout LyX-Code
+  } // end of cells
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // This next section lists groups of vertices that can be used
+\end_layout
+
+\begin_layout LyX-Code
+  // in applying boundary conditions to portions of the domain
+\end_layout
+
+\begin_layout LyX-Code
+  group = { // start of a group
+\end_layout
+
+\begin_layout LyX-Code
+    // the name can have whitespace, so no comments are allowed
+\end_layout
+
+\begin_layout LyX-Code
+    // after the name
+\end_layout
+
+\begin_layout LyX-Code
+    name = face +y
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+    // Either groups of vertices or groups of cells can be     
+\end_layout
+
+\begin_layout LyX-Code
+    // specified, but currently PyLith only makes use of groups 
+\end_layout
+
+\begin_layout LyX-Code
+    // of vertices
+\end_layout
+
+\begin_layout LyX-Code
+    type = vertices // 'vertices' or 'cells'
+\end_layout
+
+\begin_layout LyX-Code
+    count = 2 // number of vertices in the group
+\end_layout
+
+\begin_layout LyX-Code
+    indices = { // list of vertex indices in the group
+\end_layout
+
+\begin_layout LyX-Code
+      // multiple vertices may appear on a line
+\end_layout
+
+\begin_layout LyX-Code
+      0  4 // this group contains vertices 0 and 4
+\end_layout
+
+\begin_layout LyX-Code
+    } // end of list of vertices
+\end_layout
+
+\begin_layout LyX-Code
+  } // end of group
+\end_layout
+
+\begin_layout LyX-Code
+  // additional groups can be listed here
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Format of 
+\family typewriter
+PyLith
+\family default
+ mesh ASCII files.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:meshioascii:format"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Spatialdata:SimpleIOAscii"
+
+\end_inset
+
+SimpleDB Spatial Database Files
+\end_layout
+
+\begin_layout Standard
+SimpleDB spatial database files contain a header describing the set of points
+ and then the data with each line listing the coordinates of a point followed
+ by the values of the fields for that point.
+ 
+\end_layout
+
+\begin_layout LyX-Code
+// This spatial database specifies the distribution of slip on the
+\end_layout
+
+\begin_layout LyX-Code
+// fault surface.
+ In this case we prescribe a piecewise linear, 
+\end_layout
+
+\begin_layout LyX-Code
+// depth dependent distribution of slip.
+ The slip is 2.0 m 
+\end_layout
+
+\begin_layout LyX-Code
+// right-lateral with 0.25 m of reverse slip at the surface with
+\end_layout
+
+\begin_layout LyX-Code
+// a linear taper from 2.0 m to 0.0 m from -2 km to -4 km.
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+// Comments can appear almost anywhere in these files and are
+\end_layout
+
+\begin_layout LyX-Code
+// delimited with two slashes (//) just like in C++.
+ All text and 
+\end_layout
+
+\begin_layout LyX-Code
+// whitespace after the delimiter on a given line is ignored.
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+// The next line is the magic header for spatial database files 
+\end_layout
+
+\begin_layout LyX-Code
+// in ASCII format.
+\end_layout
+
+\begin_layout LyX-Code
+#SPATIAL.ascii 1
+\end_layout
+
+\begin_layout LyX-Code
+SimpleDB { // start specifying the database parameters
+\end_layout
+
+\begin_layout LyX-Code
+  num-values = 3 // number of values in the database
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Specify the names and the order of the values as they appear 
+\end_layout
+
+\begin_layout LyX-Code
+  // in the data.
+ The names of the values must correspond to the 
+\end_layout
+
+\begin_layout LyX-Code
+  // names PyLith requests in querying the database.
+\end_layout
+
+\begin_layout LyX-Code
+  value-names =  left-lateral-slip  reverse-slip  fault-opening
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Specify the units of the values in Python syntax (e.g., kg/m**3).
+\end_layout
+
+\begin_layout LyX-Code
+  value-units =  m  m  m
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+  num-locs = 3 // Number of locations where values are given
+\end_layout
+
+\begin_layout LyX-Code
+  data-dim = 1 // Locations of data points form a line
+\end_layout
+
+\begin_layout LyX-Code
+  space-dim = 3 // Spatial dimension in which data resides
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Specify the coordinate system associated with the 
+\end_layout
+
+\begin_layout LyX-Code
+  // coordinates of the locations where data is given
+\end_layout
+
+\begin_layout LyX-Code
+  cs-data = cartesian { // Use a Cartesian coordinate system
+\end_layout
+
+\begin_layout LyX-Code
+    to-meters = 1.0e+3 // Coordinates are in km
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+    // Specify the spatial dimension of the coordinate system
+\end_layout
+
+\begin_layout LyX-Code
+    // This value must match the one associated with the database
+\end_layout
+
+\begin_layout LyX-Code
+    space-dim = 3
+\end_layout
+
+\begin_layout LyX-Code
+  } // cs-data // end of coordinate system specification
+\end_layout
+
+\begin_layout LyX-Code
+} // end of SimpleDB specification
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+// The locations and values are listed after the parameters.
+\end_layout
+
+\begin_layout LyX-Code
+// Columns are coordinates of the points (1 column for each 
+\end_layout
+
+\begin_layout LyX-Code
+// spatial dimension) followed by the data values in the order 
+\end_layout
+
+\begin_layout LyX-Code
+// specified by the value-names field.
+\end_layout
+
+\begin_layout LyX-Code
+0.0  0.0  0.0    -2.00  0.25  0.00
+\end_layout
+
+\begin_layout LyX-Code
+0.0  0.0 -2.0    -2.00  0.00  0.00
+\end_layout
+
+\begin_layout LyX-Code
+0.0  0.0 -4.0     0.00  0.00  0.00
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Format of spatial database files.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Spatial Database Coordinate Systems
+\end_layout
+
+\begin_layout Standard
+The spatial database files support four different types of coordinate systems.
+ Conversions among the three geographic coordinate systems are supported
+ in 3D.
+ Conversions among the geographic and geographic projected coordinate systems
+ are supported in 2D.
+ In using the coordinate systems, we assume that you have installed the
+ 
+\family typewriter
+proj
+\family default
+ program in addition to the Proj.4 libraries, so that you can obtain a list
+ of support projections, datums, and ellipsoids.
+ Alternatively, refer to the documentation for the Proj.4 Cartographic Projection
+s library 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+trac.osgeo.org/proj
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Subsubsection
+Cartesian
+\end_layout
+
+\begin_layout Standard
+This is a conventional Cartesian coordinate system.
+ Conversions to other Cartesian coordinate systems are possible.
+\end_layout
+
+\begin_layout LyX-Code
+cs-data = cartesian {
+\end_layout
+
+\begin_layout LyX-Code
+  to-meters = 1.0e+3 // Locations in km
+\end_layout
+
+\begin_layout LyX-Code
+  space-dim = 2 // 1, 2, or 3 dimensions
+\end_layout
+
+\begin_layout LyX-Code
+}
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Format for Cartesian coordinate systems in spatial database files.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Geographic
+\end_layout
+
+\begin_layout Standard
+This coordinate system is for geographic coordinates, such as longitude
+ and latitude.
+ Specification of the location in three-dimensions is supported.
+ The vertical datum can be either the reference ellipsoid or mean sea level.
+ The vertical coordinate is positive upwards.
+\end_layout
+
+\begin_layout LyX-Code
+cs-data = geographic {
+\end_layout
+
+\begin_layout LyX-Code
+  // Conversion factor to get to meters (only applies to vertical 
+\end_layout
+
+\begin_layout LyX-Code
+  // coordinate unless you are using a geocentric coordinate system).
+\end_layout
+
+\begin_layout LyX-Code
+  to-meters = 1.0e+3
+\end_layout
+
+\begin_layout LyX-Code
+  space-dim = 2 // 2 or 3 dimensions
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Run 
+\begin_inset Quotes eld
+\end_inset
+
+proj -le
+\begin_inset Quotes erd
+\end_inset
+
+ to see a list of available reference ellipsoids.
+\end_layout
+
+\begin_layout LyX-Code
+  // Comments are not allowed at the end of the next line.
+\end_layout
+
+\begin_layout LyX-Code
+  ellipsoid = WGS84
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Run 
+\begin_inset Quotes eld
+\end_inset
+
+proj -ld
+\begin_inset Quotes erd
+\end_inset
+
+ to see a list of available datums.
+\end_layout
+
+\begin_layout LyX-Code
+  // Comments are not allowed at the end of the next line.
+\end_layout
+
+\begin_layout LyX-Code
+  datum-horiz = WGS84
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // 
+\begin_inset Quotes eld
+\end_inset
+
+ellipsoid
+\begin_inset Quotes erd
+\end_inset
+
+ or 
+\begin_inset Quotes eld
+\end_inset
+
+mean sea level
+\begin_inset Quotes erd
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+  // Comments are not allowed at the end of the next line.
+\end_layout
+
+\begin_layout LyX-Code
+  datum-vert = ellipsoid
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Use a geocentric coordinate system?
+\end_layout
+
+\begin_layout LyX-Code
+  is-geocentric = false // true or false
+\end_layout
+
+\begin_layout LyX-Code
+}
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Format for geographic coordinate systems in spatial database files.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Geographic Projection
+\end_layout
+
+\begin_layout Standard
+This coordinate system applies to geographic projections.
+ As in the geographic coordinate system, the vertical coordinate (if used)
+ can be specified with respect to either the reference ellipsoid or mean
+ sea level.
+\end_layout
+
+\begin_layout LyX-Code
+cs-data = geo-projected {
+\end_layout
+
+\begin_layout LyX-Code
+  to-meters = 1.0e+3 // Conversion factor to get to meters.
+\end_layout
+
+\begin_layout LyX-Code
+  space-dim = 2 // 2 or 3 dimensions
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+  // Run 
+\begin_inset Quotes eld
+\end_inset
+
+proj -le
+\begin_inset Quotes erd
+\end_inset
+
+ to see a list of available reference ellipsoids.
+\end_layout
+
+\begin_layout LyX-Code
+  // Comments are not allowed at the end of the next line.
+\end_layout
+
+\begin_layout LyX-Code
+  ellipsoid = WGS84
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Run 
+\begin_inset Quotes eld
+\end_inset
+
+proj -ld
+\begin_inset Quotes erd
+\end_inset
+
+ to see a list of available datums.
+\end_layout
+
+\begin_layout LyX-Code
+  // Comments are not allowed at the end of the next line.
+\end_layout
+
+\begin_layout LyX-Code
+  datum-horiz = WGS84
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // 
+\begin_inset Quotes eld
+\end_inset
+
+ellipsoid
+\begin_inset Quotes erd
+\end_inset
+
+ or 
+\begin_inset Quotes eld
+\end_inset
+
+mean sea level
+\begin_inset Quotes erd
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+  // Comments are not allowed at the end of the next line.
+\end_layout
+
+\begin_layout LyX-Code
+  datum-vert = ellipsoid
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Run 
+\begin_inset Quotes eld
+\end_inset
+
+proj -lp
+\begin_inset Quotes erd
+\end_inset
+
+ to see a list of available geographic 
+\end_layout
+
+\begin_layout LyX-Code
+  // projections.
+\end_layout
+
+\begin_layout LyX-Code
+    projector = projection {
+\end_layout
+
+\begin_layout LyX-Code
+    // Name of the projection.
+ run 
+\begin_inset Quotes eld
+\end_inset
+
+proj -lp
+\begin_inset Quotes erd
+\end_inset
+
+ to see a list of 
+\end_layout
+
+\begin_layout LyX-Code
+    // supported projections.
+ Use the Universal Transverse Mercator
+\end_layout
+
+\begin_layout LyX-Code
+    // projection.
+\end_layout
+
+\begin_layout LyX-Code
+    projection = utm
+\end_layout
+
+\begin_layout LyX-Code
+    units = m // Units in the projection.
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+    // Provide a list of projection options; these are the command 
+\end_layout
+
+\begin_layout LyX-Code
+    // line arguments you would use with the proj program.
+ Refer to
+\end_layout
+
+\begin_layout LyX-Code
+    // the Proj.4 library documentation for complete details.
+\end_layout
+
+\begin_layout LyX-Code
+    // Comments are not allowed at the end of the next line.
+\end_layout
+
+\begin_layout LyX-Code
+    proj-options = +zone=10
+\end_layout
+
+\begin_layout LyX-Code
+}
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Format for geographic projection coordinate systems in spatial database
+ files.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Geographic Local Cartesian
+\end_layout
+
+\begin_layout Standard
+This coordinate system is a geographically referenced, local 3D Cartesian
+ coordinate system.
+ This allows use of a conventional Cartesian coordinate system with accurate
+ georeferencing.
+ For example, one can construct a finite-element model in this coordinate
+ system and use spatial databases in geographic coordinates.
+ This coordinate system provides an alternative to using a geographic projection
+ as the Cartesian grip.
+ The advantage of this coordinate system is that it retains the curvature
+ of the Earth, while a geographic projection does not.
+\end_layout
+
+\begin_layout LyX-Code
+cs-data = geo-local-cartesian {
+\end_layout
+
+\begin_layout LyX-Code
+  // Conversion factor to get to meters (only applies to vertical
+\end_layout
+
+\begin_layout LyX-Code
+  // coordinate unless you are using a geocentric coordinate system).
+\end_layout
+
+\begin_layout LyX-Code
+  to-meters = 1.0 // use meters
+\end_layout
+
+\begin_layout LyX-Code
+  space-dim = 2 // 2 or 3 dimensions
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Run 
+\begin_inset Quotes eld
+\end_inset
+
+proj -le
+\begin_inset Quotes erd
+\end_inset
+
+ to see a list of available reference ellipsoids.
+\end_layout
+
+\begin_layout LyX-Code
+  // Comments are not allowed at the end of the next line.
+\end_layout
+
+\begin_layout LyX-Code
+  ellipsoid = WGS84
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Run 
+\begin_inset Quotes eld
+\end_inset
+
+proj -ld
+\begin_inset Quotes erd
+\end_inset
+
+ to see a list of available datums.
+\end_layout
+
+\begin_layout LyX-Code
+  // Comments are not allowed at the end of the next line.
+\end_layout
+
+\begin_layout LyX-Code
+  datum-horiz = WGS84
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // 
+\begin_inset Quotes eld
+\end_inset
+
+ellipsoid
+\begin_inset Quotes erd
+\end_inset
+
+ or 
+\begin_inset Quotes eld
+\end_inset
+
+mean sea level
+\begin_inset Quotes erd
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+  // Comments are not allowed at the end of the next line.
+\end_layout
+
+\begin_layout LyX-Code
+  datum-vert = ellipsoid
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Origin of the local Cartesian coordinate system.
+ To avoid
+\end_layout
+
+\begin_layout LyX-Code
+  // round-off errors it is best to pick a location near the center of
+\end_layout
+
+\begin_layout LyX-Code
+  // the region of interest.
+ An elevation on the surface of the Earth
+\end_layout
+
+\begin_layout LyX-Code
+  // in the middle of the region also works well (and makes the
+\end_layout
+
+\begin_layout LyX-Code
+  // vertical coordinate easy to interpret).
+\end_layout
+
+\begin_layout LyX-Code
+  origin-lon = -116.7094 // Longitude of the origin in decimal degrees
+\end_layout
+
+\begin_layout LyX-Code
+                         // (west is negative).
+\end_layout
+
+\begin_layout LyX-Code
+  origin-lat = 36.3874 // Latitude of the origin in decimal degrees 
+\end_layout
+
+\begin_layout LyX-Code
+                       // (north is positive).
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Elevation with respect to the vertical datum.
+ Units are the
+\end_layout
+
+\begin_layout LyX-Code
+  // same as the Cartesian coordinate system (in this case meters).
+\end_layout
+
+\begin_layout LyX-Code
+  origin-elev = 3.5
+\end_layout
+
+\begin_layout LyX-Code
+}
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Format for the geographic local Cartesian coordinate system in spatial database
+ files.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Spatialdata:TimeHistoryIO"
+
+\end_inset
+
+Time History Database Files
+\end_layout
+
+\begin_layout Standard
+Time history database files contain a header describing the number of points
+ in the time history and the units for the time stamps followed by a list
+ with pairs of time stamps and amplitude values.
+ The amplitude at an arbitrary point in time is computed via interpolation
+ of the values in the database.
+ This means that the time history database must span the range of time values
+ of interest.
+ The points in the time history must also be ordered in time.
+\end_layout
+
+\begin_layout LyX-Code
+// This time history database specifies temporal variation in
+\end_layout
+
+\begin_layout LyX-Code
+// amplitude.
+ In this case we prescribe a triangular slip time
+\end_layout
+
+\begin_layout LyX-Code
+// history.
+ 
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+// Comments can appear almost anywhere in these files and are
+\end_layout
+
+\begin_layout LyX-Code
+// delimited with two slashes (//) just like in C++.
+ All text and 
+\end_layout
+
+\begin_layout LyX-Code
+// whitespace after the delimiter on a given line is ignored.
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+// The next line is the magic header for spatial database files 
+\end_layout
+
+\begin_layout LyX-Code
+// in ASCII format.
+\end_layout
+
+\begin_layout LyX-Code
+#TIME HISTORY ascii
+\end_layout
+
+\begin_layout LyX-Code
+TimeHistory { // start specifying the database parameters
+\end_layout
+
+\begin_layout LyX-Code
+  num-points = 5 // number of points in time history
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+  // Specify the units used in the time stamps.
+\end_layout
+
+\begin_layout LyX-Code
+  time-units = year
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+} // end of TimeHistory header
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+// The time history values are listed after the parameters.
+\end_layout
+
+\begin_layout LyX-Code
+// Columns time and amplitude where the amplitude values are unitless.
+\end_layout
+
+\begin_layout LyX-Code
+ 0.0     0.00
+\end_layout
+
+\begin_layout LyX-Code
+ 2.0     1.00
+\end_layout
+
+\begin_layout LyX-Code
+ 6.0     4.00
+\end_layout
+
+\begin_layout LyX-Code
+10.0     2.00
+\end_layout
+
+\begin_layout LyX-Code
+11.0     0.00
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Format of time history database files.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:FileFormat:TimeStepUser"
+
+\end_inset
+
+User-Specified Time-Step File
+\end_layout
+
+\begin_layout Standard
+This file lists the time-step sizes for nonuniform, user-specified time
+ steps.
+ The file's format is an ASCII file that includes the units for the time-step
+ sizes and then a list of the time steps.
+ 
+\end_layout
+
+\begin_layout LyX-Code
+// This time step file specifies five time steps with the units in years.
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+// Comments can appear almost anywhere in these files and are
+\end_layout
+
+\begin_layout LyX-Code
+// delimited with two slashes (//) just like in C++.
+ All text and 
+\end_layout
+
+\begin_layout LyX-Code
+// whitespace after the delimiter on a given line is ignored.
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+// Units for the time steps
+\end_layout
+
+\begin_layout LyX-Code
+units = year
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+1.0 // Comment
+\end_layout
+
+\begin_layout LyX-Code
+2.0
+\end_layout
+
+\begin_layout LyX-Code
+3.0
+\end_layout
+
+\begin_layout LyX-Code
+2.5
+\end_layout
+
+\begin_layout LyX-Code
+3.0
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Format of user-specified time-step files.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:FileFormat:PointsList"
+
+\end_inset
+
+Points List File
+\end_layout
+
+\begin_layout Standard
+This file lists the coordinates of the locations where output is requested
+ for the 
+\family typewriter
+OutputSolnPoints
+\family default
+ component.
+ The coordinate system is specified in the 
+\family typewriter
+OutputSolnPoints
+\family default
+ component.
+ 
+\end_layout
+
+\begin_layout LyX-Code
+# This time step file specifies five time steps with the units in years.
+\end_layout
+
+\begin_layout LyX-Code
+#
+\end_layout
+
+\begin_layout LyX-Code
+# Comments are limited to complete lines.
+ The default delimiter for comments
+\end_layout
+
+\begin_layout LyX-Code
+# is '#', which can be changed via parameters.
+ Additionally, the delimiter 
+\end_layout
+
+\begin_layout LyX-Code
+# separating values can also be customized (default is whitespace).
+\end_layout
+
+\begin_layout LyX-Code
+1.0  -2.0   0.0
+\end_layout
+
+\begin_layout LyX-Code
+2.0  -4.0  -0.1
+\end_layout
+
+\begin_layout LyX-Code
+0.0  +2.0   0.0
+\end_layout
+
+\begin_layout LyX-Code
+2.5  -0.2  -0.2 
+\end_layout
+
+\begin_layout LyX-Code
+0.0   2.0  +0.2
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Format of files with coordinates of points for output.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/governingeqns/governingeqns.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/governingeqns/governingeqns.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/governingeqns/governingeqns.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,1859 +1,1859 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding auto
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 1
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 1in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Chapter
-\begin_inset CommandInset label
-LatexCommand label
-name "cha:Governing-Equations"
-
-\end_inset
-
-Governing Equations
-\end_layout
-
-\begin_layout Standard
-We present here a brief derivation of the equations for both quasi-static
- and dynamic computations.
- Since the general equations are the same (except for the absence of inertial
- terms in the quasi-static case), we first derive these equations.
- We then present solution methods for each specific case.
- In all of our derivations, we use the notation described in Table 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:Mathematical-notation"
-
-\end_inset
-
- for both index and vector notation.
- When using index notation, we use the common convention that repeated indices
- indicate summation over the range of the index.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:Mathematical-notation"
-
-\end_inset
-
-Mathematical notation
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset VSpace defskip
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="11" columns="3">
-<features tabularvalignment="middle">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" width="0">
-<row>
-<cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Symbol
-\end_layout
-
-\end_inset
-</cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Index notation
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Vector Notation
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $a_{i}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\overrightarrow{a}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Vector field a
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $a_{ij}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\underline{a}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Second order tensor field a
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $u_{i}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\overrightarrow{u}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Displacement vector field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $d_{i}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\vec{{d}}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Fault slip vector field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $f_{i}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\overrightarrow{f}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Body force vector field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $T_{i}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\overrightarrow{T}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Traction vector field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\sigma_{ij}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\underline{\sigma}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Stress tensor field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $n_{i}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\overrightarrow{n}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Normal vector field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\rho$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\rho$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Mass density scalar field
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Section
-Derivation of Elasticity Equation
-\end_layout
-
-\begin_layout Subsection
-Index Notation
-\end_layout
-
-\begin_layout Standard
-Consider volume 
-\begin_inset Formula $V$
-\end_inset
-
- bounded by surface 
-\begin_inset Formula $S$
-\end_inset
-
-.
- Applying a Lagrangian description of the conservation of momentum gives
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial u_{i}}{\partial t}\, dV=\int_{V}f_{i}\, dV+\int_{S}T_{i}\, dS.\label{eqn:momentum:index}
-\end{equation}
-
-\end_inset
-
-The traction vector field is related to the stress tensor through
-\begin_inset Formula 
-\begin{equation}
-T_{i}=\sigma_{ij}n_{j},
-\end{equation}
-
-\end_inset
-
-where 
-\begin_inset Formula $n_{j}$
-\end_inset
-
- is the vector normal to 
-\begin_inset Formula $S$
-\end_inset
-
-.
- Substituting into equation 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eqn:momentum:index"
-
-\end_inset
-
- yields
-\begin_inset Formula 
-\begin{equation}
-\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial u_{i}}{\partial t}\, dV=\int_{V}f_{i}\, dV+\int_{S}\sigma_{ij}n_{j}\, dS.
-\end{equation}
-
-\end_inset
-
-Applying the divergence theorem,
-\begin_inset Formula 
-\begin{equation}
-\int_{V}a_{i,j}\: dV=\int_{S}a_{j}n_{j}\: dS,
-\end{equation}
-
-\end_inset
-
-to the surface integral results in
-\begin_inset Formula 
-\begin{equation}
-\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial u_{i}}{\partial t}\, dV=\int_{V}f_{i}\, dV+\int_{V}\sigma_{ij,j}\, dV,
-\end{equation}
-
-\end_inset
-
-which we can rewrite as
-\begin_inset Formula 
-\begin{equation}
-\int_{V}\left(\rho\frac{\partial^{2}u_{i}}{\partial t^{2}}-f_{i}-\sigma_{ij,j}\right)\, dV=0.
-\end{equation}
-
-\end_inset
-
-Because the volume 
-\begin_inset Formula $V$
-\end_inset
-
- is arbitrary, the integrand must be zero at every location in the volume,
- so that we end up with
-\begin_inset Formula 
-\begin{gather}
-\rho\frac{\partial^{2}u_{i}}{\partial t^{2}}-f_{i}-\sigma_{ij,j}=0\text{ in }V,\\
-\sigma_{ij}n_{j}=T_{i}\text{ on }S_{T}\text{,}\\
-u_{i}=u_{i}^{o}\text{ on }S_{u}\text{, and}\\
-R_{ki}(u_{i}^{+}-u_{i}^{-})=d_{k}\text{ on }S_{f}.
-\end{gather}
-
-\end_inset
-
-We specify tractions, 
-\begin_inset Formula $T_{i}$
-\end_inset
-
-, on surface 
-\begin_inset Formula $S_{f}$
-\end_inset
-
-, displacements, 
-\begin_inset Formula $u_{i}^{o}$
-\end_inset
-
-, on surface 
-\begin_inset Formula $S_{u}$
-\end_inset
-
-, and slip, 
-\begin_inset Formula $d_{k}$
-\end_inset
-
-, on fault surface 
-\begin_inset Formula $S_{f}$
-\end_inset
-
- (we will consider the case of fault constitutive models in Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:fault"
-
-\end_inset
-
-).
- The rotation matrix 
-\begin_inset Formula $R_{ki}$
-\end_inset
-
- transforms vectors from the global coordinate system to the fault coordinate
- system.
- Note that since both 
-\begin_inset Formula $T_{i}$
-\end_inset
-
- and 
-\begin_inset Formula $u_{i}$
-\end_inset
-
- are vector quantities, there can be some spatial overlap of the surfaces
- 
-\begin_inset Formula $S_{T}$
-\end_inset
-
- and 
-\begin_inset Formula $S_{u}$
-\end_inset
-
-; however, the same degree of freedom cannot simultaneously have both types
- of boundary conditions.
-\end_layout
-
-\begin_layout Subsection
-Vector Notation
-\end_layout
-
-\begin_layout Standard
-Consider volume 
-\begin_inset Formula $V$
-\end_inset
-
- bounded by surface 
-\begin_inset Formula $S$
-\end_inset
-
-.
- Applying a Lagrangian description of the conservation of momentum gives
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial\vec{u}}{\partial t}\, dV=\int_{V}\overrightarrow{f}\, dV+\int_{S}\overrightarrow{T}\, dS.\label{eqn:momentum:vec}
-\end{equation}
-
-\end_inset
-
-The traction vector field is related to the stress tensor through
-\begin_inset Formula 
-\begin{equation}
-\overrightarrow{T}=\underline{\sigma}\cdot\overrightarrow{n},
-\end{equation}
-
-\end_inset
-
-where 
-\begin_inset Formula $\overrightarrow{n}$
-\end_inset
-
- is the vector normal to 
-\begin_inset Formula $S$
-\end_inset
-
-.
- Substituting into equation 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eqn:momentum:vec"
-
-\end_inset
-
- yields
-\begin_inset Formula 
-\begin{equation}
-\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial\overrightarrow{u}}{\partial t}\, dV=\int_{V}\overrightarrow{f}\, dV+\int_{S}\underline{\sigma}\cdot\overrightarrow{n}\, dS.
-\end{equation}
-
-\end_inset
-
-Applying the divergence theorem,
-\begin_inset Formula 
-\begin{equation}
-\int_{V}\nabla\cdot\overrightarrow{a}\: dV=\int_{S}\overrightarrow{a}\cdot\overrightarrow{n}\: dS,
-\end{equation}
-
-\end_inset
-
-to the surface integral results in
-\begin_inset Formula 
-\begin{equation}
-\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial\overrightarrow{u}}{\partial t}\, dV=\int_{V}\overrightarrow{f}\, dV+\int_{V}\nabla\cdot\underline{\sigma}\, dV,
-\end{equation}
-
-\end_inset
-
-which we can rewrite as
-\begin_inset Formula 
-\begin{equation}
-\int_{V}\left(\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}-\overrightarrow{f}-\nabla\cdot\overrightarrow{\sigma}\right)\, dV=\vec{0}.
-\end{equation}
-
-\end_inset
-
-Because the volume 
-\begin_inset Formula $V$
-\end_inset
-
- is arbitrary, the integrand must be the zero vector at every location in
- the volume, so that we end up with
-\begin_inset Formula 
-\begin{gather}
-\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}-\overrightarrow{f}-\nabla\cdot\overrightarrow{\sigma}=\vec{0}\text{ in }V,\\
-\underline{\sigma}\cdot\overrightarrow{n}=\overrightarrow{T}\text{ on }S_{T}\text{,}\\
-\overrightarrow{u}=\overrightarrow{u^{o}}\text{ on }S_{u},\text{ and}\\
-\underbar{R}\cdot(\vec{u^{+}}-\vec{u^{-}})=\vec{d}\text{ on }S_{f}.
-\end{gather}
-
-\end_inset
-
-We specify tractions, 
-\begin_inset Formula $\vec{T}$
-\end_inset
-
-, on surface 
-\begin_inset Formula $S_{f}$
-\end_inset
-
-, displacements, 
-\begin_inset Formula $\overrightarrow{u^{o}}$
-\end_inset
-
-, on surface 
-\begin_inset Formula $S_{u}$
-\end_inset
-
-, and slip, 
-\begin_inset Formula $\vec{d}$
-\end_inset
-
-, on fault surface 
-\begin_inset Formula $S_{f}$
-\end_inset
-
- (we will consider the case of fault constitutive models in Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:fault"
-
-\end_inset
-
-).
- The rotation matrix 
-\begin_inset Formula $\underline{R}$
-\end_inset
-
- transforms vectors from the global coordinate system to the fault coordinate
- system.
- Note that since both 
-\begin_inset Formula $\overrightarrow{T}$
-\end_inset
-
- and 
-\begin_inset Formula $\overrightarrow{u}$
-\end_inset
-
- are vector quantities, there can be some spatial overlap of the surfaces
- 
-\begin_inset Formula $S_{T}$
-\end_inset
-
- and 
-\begin_inset Formula $S_{u}$
-\end_inset
-
-; however, the same degree of freedom cannot simultaneously have both types
- of boundary conditions.
-\end_layout
-
-\begin_layout Section
-Finite-Element Formulation of Elasticity Equation
-\end_layout
-
-\begin_layout Standard
-We formulate a set of algebraic equations using Galerkin's method.
- We consider (1) a trial solution, 
-\begin_inset Formula $\vec{u}$
-\end_inset
-
-, that is a piecewise differentiable vector field and satisfies the Dirichlet
- boundary conditions on 
-\begin_inset Formula $S_{u}$
-\end_inset
-
-, and (2) a weighting function, 
-\begin_inset Formula $\vec{\phi}$
-\end_inset
-
-, that is a piecewise differentiable vector field and is zero on 
-\begin_inset Formula $S_{u}$
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Subsection
-Index Notation
-\end_layout
-
-\begin_layout Standard
-We start with the wave equation (strong form),
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{gather}
-\sigma_{ij,j}+f_{i}=\rho\ddot{u_{i}}\text{ in }V,\\
-\sigma_{ij}n_{j}=T_{i}\text{ on }S_{T},\\
-u_{i}=u_{i}^{o}\text{ on }S_{u},\\
-R_{ki}(u_{i}^{+}-u_{i}^{-})=d_{k}\text{ on }S_{f},\text{ and}\\
-\sigma_{ij}=\sigma_{ji}\text{ (symmetric).}
-\end{gather}
-
-\end_inset
-
-We construct the weak form by computing the dot product of the wave equation
- and weighting function and setting the integral over the domain to zero:
-\begin_inset Formula 
-\begin{gather}
-\int_{V}\left(\sigma_{ij,j}+f_{i}-\rho\ddot{u}_{i}\right)\phi_{i}\, dV=0\text{, or }\\
-\int_{V}\sigma_{ij,j}\phi_{i}\: dV+\int_{V}f_{i}\phi_{i}\: dV-\int_{V}\rho\ddot{u}_{i}\phi_{i}\: dV=0.
-\end{gather}
-
-\end_inset
-
- Consider the divergence theorem applied to the dot product of the stress
- tensor and the weighting function, 
-\begin_inset Formula $\sigma_{ij}\phi_{i}$
-\end_inset
-
-,
-\begin_inset Formula 
-\begin{equation}
-\int_{V}(\sigma_{ij}\phi_{i})_{,j}\, dV=\int_{S}(\sigma_{ij}\phi_{i})n_{i}\, dS.
-\end{equation}
-
-\end_inset
-
-Expanding the left-hand side yields
-\begin_inset Formula 
-\begin{gather}
-\int_{V}\sigma_{ij,j}\phi_{i}\: dV+\int_{V}\sigma_{ij}\phi_{i,j}\: dV=\int_{S}\sigma_{ij}\phi_{i}n_{i}\: dS,\text{ or}\\
-\int_{V}\sigma_{ij,j}\phi_{i}\: dV=-\int_{V}\sigma_{ij}\phi_{i,j}\, dV+\int_{S}\sigma_{ij}\phi_{i}n_{i}\, dS.
-\end{gather}
-
-\end_inset
-
-Substituting into the weak form gives
-\begin_inset Formula 
-\begin{equation}
--\int_{V}\sigma_{ij}\phi_{i,j}\, dV+\int_{S}\sigma_{ij}\phi_{i}n_{i}\, dS+\int_{V}f_{i}\phi_{i}\, dV-\int_{V}\rho\ddot{u}_{i}\phi_{i}\, dV=0.
-\end{equation}
-
-\end_inset
-
-Turning our attention to the second term, we separate the integration over
- 
-\begin_inset Formula $S$
-\end_inset
-
- into integration over 
-\begin_inset Formula $S_{T}$
-\end_inset
-
- and 
-\begin_inset Formula $S_{u}$
-\end_inset
-
- (we will consider tractions over the fault surface, 
-\begin_inset Formula $S_{f}$
-\end_inset
-
-, associated with the fault constitutive model in Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:fault"
-
-\end_inset
-
-),
-\begin_inset Formula 
-\begin{equation}
--\int_{V}\sigma_{ij}\phi_{i,j}\, dV+\int_{S_{T}}\sigma_{ij}\phi_{i}n_{i}\, dS+\int_{S_{u}}\sigma_{ij}\phi_{i}n_{i}\, dS+\int_{V}f_{i}\phi_{i}\, dV-\int_{V}\rho\ddot{u}_{i}\phi_{i}\, dV=0,
-\end{equation}
-
-\end_inset
-
-and recognize that
-\begin_inset Formula 
-\begin{gather}
-\sigma_{ij}n_{i}=T_{i}\text{ on }S_{T}\text{ and}\\
-\phi_{i}=0\text{ on }S_{u},
-\end{gather}
-
-\end_inset
-
-so that the equation reduces to
-\begin_inset Formula 
-\begin{equation}
--\int_{V}\sigma_{ij}\phi_{i,j}\: dV+\int_{S_{T}}T_{i}\phi_{i}\, dS+\int_{V}f_{i}\phi_{i}\, dV-\int_{V}\rho\ddot{u}_{i}\phi_{i}\, dV=0.\label{eq:elasticity:integral}
-\end{equation}
-
-\end_inset
-
-We express the trial solution and weighting function as linear combinations
- of basis functions,
-\begin_inset Formula 
-\begin{gather}
-u_{i}=\sum_{m}a_{i}^{m}N^{m},\\
-\phi_{i}=\sum_{n}c_{i}^{n}N^{n}.
-\end{gather}
-
-\end_inset
-
-Note that because the trial solution satisfies the Dirichlet boundary condition,
- the number of basis functions for 
-\begin_inset Formula $u$
-\end_inset
-
- is generally greater than the number of basis functions for 
-\begin_inset Formula $\phi$
-\end_inset
-
-, i.e., 
-\begin_inset Formula $m>n$
-\end_inset
-
-.
- Substituting in the expressions for the trial solution and weighting function
- yields
-\begin_inset Formula 
-\begin{gather}
--\int_{V}\sigma_{ij}\sum_{n}c_{i}^{n}N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}\sum_{n}c_{i}^{n}N^{n}\, dS+\int_{V}f_{i}\sum_{n}c_{i}^{n}N^{n}\, dV-\int_{V}\rho\sum_{m}\ddot{a}_{i}^{m}N^{m}\sum_{n}c_{i}^{n}N^{n}\ dV=0,\text{ or}\\
-\sum_{n}c_{i}^{n}(-\int_{V}\sigma_{ij}N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}N^{n}\, dS+\int_{V}f_{i}N^{n}\, dV-\int_{V}\rho\sum_{m}\ddot{a}_{i}^{m}N^{m}N^{n}\ dV)=0.
-\end{gather}
-
-\end_inset
-
- Because the weighting function is arbitrary, this equation must hold for
- all 
-\begin_inset Formula $c_{i}^{n}$
-\end_inset
-
-, so that the quantity in parenthesis is zero for each 
-\begin_inset Formula $c_{i}^{n}$
-\end_inset
-
-
-\begin_inset Formula 
-\begin{equation}
--\int_{V}\sigma_{ij}N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}N^{n}\, dS+\int_{V}f_{i}N^{n}\, dV-\int_{V}\rho\sum_{m}\ddot{a}_{i}^{m}N^{m}N^{n}\ dV=\vec{0}.\label{eq:elasticity:integral:discretized}
-\end{equation}
-
-\end_inset
-
-We want to solve this equation for the unknown coefficients 
-\begin_inset Formula $a_{i}^{m}$
-\end_inset
-
- subject to
-\end_layout
-
-\begin_layout Standard
-
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-\begin_inset Formula 
-\begin{gather}
-u_{i}=u_{i}^{o}\text{ on }S_{u},\text{ and}\\
-R_{ki}(u_{i}^{+}-u_{i}^{-})=d_{k}\text{ on }S_{f},
-\end{gather}
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Vector Notation
-\end_layout
-
-\begin_layout Standard
-We start with the wave equation (strong form),
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{gather}
-\nabla\cdot\underline{\sigma}+\overrightarrow{f}=\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\text{ in }V,\\
-\underline{\sigma}\cdot\overrightarrow{n}=\overrightarrow{T}\text{ on }S_{T},\\
-\overrightarrow{u}=\overrightarrow{u^{o}}\text{ on }S_{u},\\
-\underbar{R}\cdot(\overrightarrow{u^{+}}-\overrightarrow{u^{-}})=\vec{d}\text{ on }S_{f}\\
-\underline{\sigma}=\underline{\sigma}^{T}\text{ (symmetric).}
-\end{gather}
-
-\end_inset
-
-We construct the weak form by multiplying the wave equation by a weighting
- function and setting the integral over the domain to zero.
- The weighting function is a piecewise differential vector field, 
-\begin_inset Formula $\overrightarrow{\phi}$
-\end_inset
-
-, where 
-\begin_inset Formula $\overrightarrow{\phi}=0$
-\end_inset
-
- on 
-\begin_inset Formula $S_{u}.$
-\end_inset
-
- Hence our weak form is
-\begin_inset Formula 
-\begin{gather}
-\int_{V}\left(\nabla\cdot\underline{\sigma}+\overrightarrow{f}-\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\right)\cdot\overrightarrow{\phi}\, dV=0\text{, or }\\
-\int_{V}(\nabla\cdot\underline{\sigma})\cdot\overrightarrow{\phi}\: dV+\int_{V}\overrightarrow{f}\cdot\overrightarrow{\phi}\: dV-\int_{V}\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\cdot\overrightarrow{\phi}\: dV=0.
-\end{gather}
-
-\end_inset
-
- Consider the divergence theorem applied to the dot product of the stress
- tensor and the trial function, 
-\begin_inset Formula $\underline{\sigma}\cdot\overrightarrow{\phi}$
-\end_inset
-
-,
-\begin_inset Formula 
-\begin{equation}
-\int_{V}\nabla\cdot(\underline{\sigma}\cdot\overrightarrow{\phi})\, dV=\int_{S}(\underline{\sigma}\cdot\overrightarrow{\phi})\cdot\overrightarrow{n}\, dS.
-\end{equation}
-
-\end_inset
-
-Expanding the left-hand side yields
-\begin_inset Formula 
-\begin{equation}
-\int_{V}(\nabla\cdot\underline{\sigma})\cdot\overrightarrow{\phi}\: dV+\int_{V}\underline{\sigma}:\nabla\overrightarrow{\phi}\: dV=\int_{S}(\underline{\sigma}\cdot\overrightarrow{\phi})\cdot\overrightarrow{n}\: dS,\text{ or}
-\end{equation}
-
-\end_inset
-
-
-\begin_inset Formula 
-\begin{equation}
-\int_{V}(\nabla\cdot\underline{\sigma})\cdot\overrightarrow{\phi}\: dV=-\int_{V}\underline{\sigma}:\nabla\overrightarrow{\phi}\, dV+\int_{S}\underline{\sigma}\cdot\overrightarrow{n}\cdot\overrightarrow{\phi}\, dS.
-\end{equation}
-
-\end_inset
-
-Substituting into the weak form gives
-\begin_inset Formula 
-\begin{equation}
--\int_{V}\underline{\sigma}:\nabla\overrightarrow{\phi}\, dV+\int_{S}\underline{\sigma}\cdot\overrightarrow{n}\cdot\overrightarrow{\phi}\, dS+\int_{V}\overrightarrow{f}\cdot\overrightarrow{\phi}\, dV-\int_{V}\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\cdot\overrightarrow{\phi}\, dV=0.
-\end{equation}
-
-\end_inset
-
-We separate the integration over 
-\begin_inset Formula $S$
-\end_inset
-
- into integration over 
-\begin_inset Formula $S_{T}$
-\end_inset
-
- and 
-\begin_inset Formula $S_{u}$
-\end_inset
-
-,
-\begin_inset Formula 
-\begin{multline}
--\int_{V}\underline{\sigma}:\nabla\overrightarrow{\phi}\, dV+\int_{S_{T}}\underline{\sigma}\cdot\overrightarrow{n}\cdot\overrightarrow{\phi}\, dS+\int_{S_{u}}\underline{\sigma}\cdot\overrightarrow{n}\cdot\overrightarrow{\phi}\, dS+\int_{V}\overrightarrow{f}\cdot\overrightarrow{\phi}\, dV-\int_{V}\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\cdot\overrightarrow{\phi}\, dV=0,
-\end{multline}
-
-\end_inset
-
-and recognize that
-\begin_inset Formula 
-\begin{gather}
-\underline{\sigma}\cdot\overrightarrow{n}=\overrightarrow{T}\text{ on }S_{T}\text{ and}\\
-\overrightarrow{\phi}=0\text{ on }S_{u},
-\end{gather}
-
-\end_inset
-
-so that the equation reduces to
-\begin_inset Formula 
-\begin{equation}
--\int_{V}\underline{\sigma}:\nabla\overrightarrow{\phi}\: dV+\int_{S_{T}}\overrightarrow{T}\cdot\overrightarrow{\phi}\, dS+\int_{V}\overrightarrow{f}\cdot\overrightarrow{\phi}\, dV-\int_{V}\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\cdot\overrightarrow{\phi}\, dV=0.
-\end{equation}
-
-\end_inset
-
-We express the trial solution and weighting function as linear combinations
- of basis functions,
-\begin_inset Formula 
-\begin{gather}
-\vec{u}=\sum_{m}\overrightarrow{a^{m}}N^{m},\\
-\vec{\phi}=\sum_{n}\overrightarrow{c^{n}}N^{n}.
-\end{gather}
-
-\end_inset
-
-Note that because the weighting function is zero on 
-\begin_inset Formula $S_{u}$
-\end_inset
-
-, the number of basis functions for 
-\begin_inset Formula $\vec{u}$
-\end_inset
-
- is generally greater than the number of basis functions for 
-\begin_inset Formula $\vec{\phi}$
-\end_inset
-
-, i.e., 
-\begin_inset Formula $m>n$
-\end_inset
-
-.
- Substituting in the expressions for the trial solution and weighting function
- yields
-\begin_inset Formula 
-\begin{multline}
--\int_{V}\underline{\sigma}:\sum_{n}\overrightarrow{c^{n}}\nabla N_{,}^{n}\, dV+\int_{S_{T}}\vec{T}\cdot\sum_{n}\overrightarrow{c^{n}}N^{n}\, dS+\int_{V}\vec{f}\cdot\sum_{n}\overrightarrow{c^{n}}N^{n}\, dV\\
--\int_{V}\rho\sum_{m}\frac{\partial^{2}\overrightarrow{a^{m}}}{\partial t^{2}}N^{m}\cdot\sum_{n}\overrightarrow{c^{n}}N^{n}\ dV=0.
-\end{multline}
-
-\end_inset
-
- Because the weighting function is arbitrary, this equation must hold for
- all 
-\begin_inset Formula $\overrightarrow{c^{n}}$
-\end_inset
-
-, so that
-\begin_inset Formula 
-\begin{equation}
--\int_{V}\underline{\sigma}:\nabla N^{n}\, dV+\int_{S_{T}}\vec{T}N^{n}\, dS+\int_{V}\vec{f}N^{n}\, dV-\int_{V}\rho\sum_{m}\frac{\partial^{2}\overrightarrow{a^{m}}}{\partial t^{2}}N^{m}N^{n}\, dV=\vec{0}.
-\end{equation}
-
-\end_inset
-
-We want to solve this equation for the unknown coefficients 
-\begin_inset Formula $\overrightarrow{a^{m}}$
-\end_inset
-
- subject to
-\end_layout
-
-\begin_layout Standard
-
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-\begin_inset Formula 
-\begin{gather}
-\vec{u}=u^{o}\overrightarrow{}\text{ on }S_{u},\text{ and}\\
-\underline{R}(\overrightarrow{u^{+}}-\overrightarrow{u^{-}})=\vec{d}\text{ on }S_{f},
-\end{gather}
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Section
-Solution Method for Quasi-Static Problems
-\end_layout
-
-\begin_layout Standard
-For brevity we outline the solution method for quasi-static problems using
- only index notation.
- In quasi-static problems we neglect the inertial terms, so equation 
-\begin_inset CommandInset ref
-LatexCommand eqref
-reference "eq:elasticity:integral:discretized"
-
-\end_inset
-
- reduces to
-\begin_inset Formula 
-\begin{equation}
--\int_{V}\sigma_{ij}N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}N^{n}\, dS+\int_{V}f_{i}N^{n}\, dV=\vec{0}.
-\end{equation}
-
-\end_inset
-
-As a result, time-dependence only enters through the constitutive relationships
- and the loading conditions.
- We consider the deformation at time 
-\begin_inset Formula $t+\Delta t$
-\end_inset
-
-,
-\begin_inset Formula 
-\begin{equation}
--\int_{V}\sigma_{ij}(t+\Delta t)N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}(t+\Delta t)N^{n}\, dS+\int_{V}f_{i}(t+\Delta t)N^{n}\, dV=\vec{0}.\label{eq:elasticity:integral:quasistatic}
-\end{equation}
-
-\end_inset
-
-We solve this equation through formulation of a linear algebraic system
- of equations (
-\begin_inset Formula $Au=b$
-\end_inset
-
-), involving the residual (
-\begin_inset Formula $r=b-Au$
-\end_inset
-
-) and Jacobian (
-\begin_inset Formula $A$
-\end_inset
-
-).
- The residual is simply
-\begin_inset Formula 
-\begin{equation}
-r_{i}^{n}=-\int_{V}\sigma_{ij}(t+\Delta t)N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}(t+\Delta t)N^{n}\, dS+\int_{V}f_{i}(t+\Delta t)N^{n}\, dV.
-\end{equation}
-
-\end_inset
-
-We employ numerical quadrature in the finite-element discretization and
- replace the integrals with sums over the cells and quadrature points,
-\begin_inset Formula 
-\begin{multline}
-r_{i}^{n}=-\sum_{\text{vol cells}}\sum_{\text{quad pts}}\sigma_{ij}(x_{q},t+\Delta t)N_{,j}^{n}(x_{q})\: w_{q}|J_{cell}(x_{q})|+\sum_{\text{vol cells}}\sum_{\text{quad pt}s}f_{i}(x_{q},t+\Delta t)N^{n}(x_{q})\, w_{q}|J_{cell}(x_{q})|\\
-+\sum_{\text{tract cells}}\sum_{\text{quad pts}}T_{i}(x_{q},t+\Delta t)N^{n}(x_{q})\, w_{q}|J_{cell}(x_{q})|,
-\end{multline}
-
-\end_inset
-
-where 
-\begin_inset Formula $r_{i}^{n}$
-\end_inset
-
- is an 
-\begin_inset Formula $nd$
-\end_inset
-
- vector (
-\begin_inset Formula $d$
-\end_inset
-
- is the dimension of the vector space) and 
-\begin_inset Formula $i$
-\end_inset
-
- is a vector space component, 
-\begin_inset Formula $x_{q}$
-\end_inset
-
- are the coordinates of the quadrature points, 
-\begin_inset Formula $w_{q}$
-\end_inset
-
- are the weights of the quadrature points, and 
-\begin_inset Formula $|J_{cell}(x_{q})|$
-\end_inset
-
- is the determinant of the Jacobian matrix evaluated at the quadrature points
- associated with mapping the reference cell to the actual cell.
- The quadrature scheme for the integral over the tractions is one dimension
- lower than the one used in integrating the terms for the volume cells.
-\end_layout
-
-\begin_layout Standard
-In order to find the Jacobian of the system, we let
-\begin_inset Formula 
-\begin{equation}
-\sigma_{ij}(t+\Delta t)=\sigma_{ij}(t)+d\sigma_{ij}(t).
-\end{equation}
-
-\end_inset
-
-Isolating the term associated with the increment in stresses yields
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-\int_{V}d\sigma_{ij}(t)N_{j}^{n}\ dV=-\int_{V}\sigma_{ij}(t)N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}(t+\Delta t)N^{n}\, dS+\int_{V}f_{i}(t+\Delta t)N^{n}\, dV
-\end{equation}
-
-\end_inset
-
-We associate the term on the left-hand-side with the action of the system
- Jacobian on the increment of the displacement field.
- We approximate the increment in stresses using linear elasticity and infinitesi
-mal strains,
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{gather}
-d\sigma_{ij}(t)=C_{ijkl}(t)d\varepsilon_{kl}(t)\\
-d\sigma_{ij}(t)=\frac{1}{2}C_{ijkl}(t)(du_{k.l}(t)+du_{l,k}(t))\\
-d\sigma_{ij}(t)=\frac{1}{2}C_{ijkl}(t)(\sum_{m}da_{k,l}^{m}(t)N^{m}+\sum_{m}da_{l,k}^{m}(t)N^{m})
-\end{gather}
-
-\end_inset
-
-Now, 
-\begin_inset Formula $d\sigma_{ij}\phi_{i,j}$
-\end_inset
-
- is a scalar, so it is symmetric,
-\begin_inset Formula 
-\begin{equation}
-d\sigma_{ij}\phi_{i,j}=d\sigma_{ji}\phi_{j,i},
-\end{equation}
-
-\end_inset
-
-and we know that 
-\begin_inset Formula $d\sigma_{ij}$
-\end_inset
-
- is symmetric, so
-\begin_inset Formula 
-\begin{equation}
-d\sigma_{ij}\phi_{i,j}=d\sigma_{ij}\phi_{j,i},
-\end{equation}
-
-\end_inset
-
-which means
-\begin_inset Formula 
-\begin{equation}
-\phi_{i,j}=\phi_{j,i},
-\end{equation}
-
-\end_inset
-
-which we can write as
-\begin_inset Formula 
-\begin{equation}
-\phi_{i,j}=\frac{1}{2}(\phi_{i,j}+\phi_{j,i}).
-\end{equation}
-
-\end_inset
-
-In terms of the basis functions, we have
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-\sum_{n}c_{i}^{n}N_{,j}^{n}=\frac{1}{2}(\sum_{n}c_{i}^{n}N_{,j}^{n}+\sum_{n}c_{j}^{n}N_{,i}^{n}).
-\end{equation}
-
-\end_inset
-
-Combining these expressions for the increment in stresses and making use
- of the symmetry of the weighting functions, we find the system Jacobian
- is
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-A_{ij}^{nm}=\int_{V}\frac{1}{4}C_{ijkl}(N_{,l}^{m}+N_{,k}^{m})(N_{,j}^{n}+N_{,i}^{n})\ dV.
-\end{equation}
-
-\end_inset
-
-We employ numerical quadrature in the finite-element discretization and
- replace the integral with a sum over the cells and quadrature points,
-\begin_inset Formula 
-\begin{equation}
-A_{ij}^{nm}=\sum_{\text{vol cells}}\sum_{\text{quad pts}}\frac{1}{4}C_{ijkl}(N_{,l}^{m}(x_{q})+N_{,k}^{m}(x_{q}))(N_{,j}^{n}(x_{q})+N_{,i}^{n}(x_{q}))w_{q}|J_{cell}(x_{q}).
-\end{equation}
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Section
-Solution Method for Dynamic Problems
-\end_layout
-
-\begin_layout Standard
-For brevity we outline the solution method for dynamic problems using only
- index notation.
- Time-dependence enters through the constitutive relationships, loading
- conditions, and the inertial terms.
- We consider the deformation at time 
-\begin_inset Formula $t$
-\end_inset
-
-,
-\begin_inset Formula 
-\begin{equation}
--\int_{V}\sigma_{ij}(t)N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}(t)N^{n}\, dS+\int_{V}f_{i}(t)N^{n}\, dV-\int_{V}\rho\sum_{m}\ddot{a}_{i}^{m}(t)N^{m}N^{n}\ dV=\vec{0}.\label{eq:elasticity:integral:dynamic:t}
-\end{equation}
-
-\end_inset
-
-We solve this equation through formulation of a linear algebraic system
- of equations (
-\begin_inset Formula $Au=b$
-\end_inset
-
-), involving the residual (
-\begin_inset Formula $r=b-Au$
-\end_inset
-
-) and Jacobian (
-\begin_inset Formula $A$
-\end_inset
-
-).
- The residual is simply
-\begin_inset Formula 
-\begin{equation}
-r_{i}^{n}=-\int_{V}\sigma_{ij}(t)N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}(t)N^{n}\, dS+\int_{V}f_{i}(t)N^{n}\, dV-\int_{V}\rho\sum_{m}\ddot{a}_{i}^{m}(t)N^{m}N^{n}\ dV.
-\end{equation}
-
-\end_inset
-
-We employ numerical quadrature in the finite-element discretization and
- replace the integrals with sums over the cells and quadrature points,
-\begin_inset Formula 
-\begin{multline}
-r_{i}^{n}=-\sum_{\text{vol cells}}\sum_{\text{quad pts}}\sigma_{ij}(x_{q},t)N^{n}(x_{q})\: w_{q}|J_{cell}(x_{q})|+\sum_{\text{vol cells}}\sum_{\text{quad pt}s}f_{i}(x_{q},t)N^{n}(x_{q})\, w_{q}|J_{cell}(x_{q})|\\
-+\sum_{\text{tract cells}}\sum_{\text{quad pts}}T_{i}(x_{q},t)N^{n}(x_{q})\, w_{q}|J_{cell}(x_{q})|-\sum_{\text{vol cells}}\sum_{\text{quad pts}}\rho\sum_{m}\ddot{a}_{i}^{m}(t)N^{m}N^{n}\ w_{q|J_{cell}(x_{q})},
-\end{multline}
-
-\end_inset
-
-where 
-\begin_inset Formula $x_{q}$
-\end_inset
-
- are the coordinates of the quadrature points, 
-\begin_inset Formula $w_{q}$
-\end_inset
-
- are the weights of the quadrature points, and 
-\begin_inset Formula $|J_{cell}(x_{q})|$
-\end_inset
-
- is the determinant of the Jacobian matrix evaluated at the quadrature points
- associated with mapping the reference cell to the actual cell.
- The quadrature scheme for the integral over the tractions is one dimension
- lower than the one used in integrating the terms for the volume cells.
- 
-\end_layout
-
-\begin_layout Standard
-We find the system Jacobian matrix by making use of the temporal discretization
- and isolating the term for the increment in the displacement field at time
- 
-\begin_inset Formula $t$
-\end_inset
-
-.
- Using the central difference method to approximate the acceleration (and
- velocity),
-\begin_inset Formula 
-\begin{gather}
-\ddot{u}_{i}(t)=\frac{1}{\Delta t^{2}}\left(u_{i}(t+\Delta t)-2u_{i}(t)+u_{i}(t-\Delta t)\right)\\
-\dot{u}_{i}(t)=\frac{1}{2\Delta t}\left(u_{i}(t+\Delta t)-u_{i}(t-\Delta t)\right)
-\end{gather}
-
-\end_inset
-
-and writing the displacement at time 
-\begin_inset Formula $t+\Delta t$
-\end_inset
-
- in terms of the displacement at 
-\begin_inset Formula $t$
-\end_inset
-
- (for consistency with the displacement increment quasi-static formulation),
-\begin_inset Formula 
-\begin{gather}
-u_{i}(t+\Delta t)=u_{i}(t)+du_{i}(t),\\
-\ddot{u}_{i}(t)=\frac{1}{\Delta t^{2}}\left(du_{i}(t)-u_{i}(t)+u_{i}(t-\Delta t)\right),\\
-\dot{u}_{i}(t)=\frac{1}{2\Delta t}\left(du_{i}(t)+u_{i}(t)-u_{i}(t-\Delta t)\right).
-\end{gather}
-
-\end_inset
-
-Substituting into equation 
-\begin_inset CommandInset ref
-LatexCommand eqref
-reference "eq:elasticity:integral:dynamic:t"
-
-\end_inset
-
- yields
-\begin_inset Formula 
-\begin{multline}
-\frac{1}{\Delta t^{2}}\int_{V}\rho\sum_{m}da_{i}^{m}(t)N^{m}N^{n}\ dV=-\int_{V}\sigma_{ij}N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}N^{n}\, dS+\int_{V}f_{i}N^{n}\, dV\\
--\frac{1}{\Delta t^{2}}\int_{V}\rho\sum_{m}(a_{i}^{m}(t)-a_{i}^{m}(t-\Delta t))N^{m}N^{n}\ dV.
-\end{multline}
-
-\end_inset
-
-Thus, the Jacobian for the system is
-\begin_inset Formula 
-\begin{equation}
-A_{ij}^{nm}=\delta_{ij}\frac{1}{\Delta t^{2}}\int_{V}\rho N^{m}N^{n}\ dV,
-\end{equation}
-
-\end_inset
-
-and using numerical quadrature in the finite-element discretization to replace
- the integrals with sums over the cells and quadrature points,
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-A_{ij}^{nm}=\delta_{ij}\frac{1}{\Delta t^{2}}\sum_{\text{vol cells}}\sum_{\text{quad pts}}\rho(x_{q})N^{m}(x_{q})N^{n}(x_{q}),
-\end{equation}
-
-\end_inset
-
-where 
-\begin_inset Formula $A_{ij}^{mn}$
-\end_inset
-
- is a 
-\begin_inset Formula $nd$
-\end_inset
-
- by 
-\begin_inset Formula $md$
-\end_inset
-
- matrix (
-\begin_inset Formula $d$
-\end_inset
-
- is the dimension of the vector space), 
-\begin_inset Formula $m$
-\end_inset
-
- and 
-\begin_inset Formula $n$
-\end_inset
-
- refer to the basis functions and 
-\begin_inset Formula $i$
-\end_inset
-
- and 
-\begin_inset Formula $j$
-\end_inset
-
- are vector space components.
- We consider the contributions associated with the fault in section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:fault"
-
-\end_inset
-
- and with absorbing boundaries is section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:absorbing:boundaries"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Section
-Small Strain Formulation
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:Small-Strain-Formulation"
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-In some crustal deformation problems sufficient deformation may occur that
- the assumptions associated with infinitesimal strains no longer hold.
- This is often the case for problems when one wants to include the effects
- of gravitational body forces and deformation on the overburden pressure.
- In such cases we want to account for both rigid body motion and small strains.
- The elasticity formulation in PyLith for small strains uses the Green-Lagrange
- strain tensor and the Second Piola-Kirchhoff stress tensor as is based
- on the one presented by Bathe 
-\begin_inset CommandInset citation
-LatexCommand cite
-key "Bathe:1995"
-
-\end_inset
-
-.
- The Green-Lagrange strain provides a measure of the strain relative to
- the original, undeformed configuration.
-\begin_inset Formula 
-\begin{gather}
-\varepsilon_{ij}=\frac{1}{2}(u_{i,j}+u_{j,i}+u_{k,i}u_{k,j}),\text{ or}\\
-\varepsilon_{ij}=X_{ji}X_{ij}-\delta_{ij},\text{ where}\\
-X_{ij}=x_{i,j}(t)=\frac{\partial}{\partial x_{j}}(x_{i}(0)+u_{i}(t)),
-\end{gather}
-
-\end_inset
-
-and 
-\begin_inset Formula $X_{ij}$
-\end_inset
-
- is the deformation tensor.
- The Second Piola-Kirchhoff stress tensor, 
-\begin_inset Formula $S_{ij}$
-\end_inset
-
-, is related to the Green-Lagrange strain tensor through the elasticity
- constants,
-\end_layout
-
-\begin_layout Standard
-\begin_inset Formula 
-\begin{equation}
-S_{ij}=C_{ijkl}\varepsilon_{kl},
-\end{equation}
-
-\end_inset
-
-in the same manner as in the infinitesimal strain formulation.
-\end_layout
-
-\begin_layout Standard
-The elasticity integral in the finite-element formulation includes additional
- terms when we account for small strains.
- Recognizing the similarity between the weighting function and an increment
- in strain in the infinitesimal formulation (many finite-element texts derive
- the finite-element formulation for elasticity using the Principle of Virtual
- Work), we replace 
-\begin_inset Formula $\int_{V}\sigma_{ij}\phi_{i,j}\: dV$
-\end_inset
-
- with 
-\begin_inset Formula $\int_{V}S_{ij}\delta\varepsilon_{ij}\: dV$
-\end_inset
-
- in equation 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:elasticity:integral"
-
-\end_inset
-
-, where 
-\begin_inset Formula $\delta\varepsilon_{ij}$
-\end_inset
-
- is the 
-\begin_inset Quotes eld
-\end_inset
-
-virtual
-\begin_inset Quotes erd
-\end_inset
-
- strain.
- Using the definition of the Green-Lagrangian strain, we have
-\begin_inset Formula 
-\begin{equation}
-\int_{V}S_{ij}\delta\varepsilon_{ij}\: dV=\int_{V}\frac{1}{2}S_{ij}(\delta u_{i,j}+\delta u_{j,i}+u_{k,i}\delta u_{k,j}+u_{k,j}\delta u_{k,i})\: dV.
-\end{equation}
-
-\end_inset
-
-Writing the displacements in terms of the basis functions and forcing the
- terms associated with the arbitrary weighting function (
-\begin_inset Quotes eld
-\end_inset
-
-virtual
-\begin_inset Quotes erd
-\end_inset
-
- strain) to zero yields the elastic term in the residual,
-\begin_inset Formula 
-\begin{equation}
-r_{i}^{n}=\int_{V}S_{ij}(N_{,i}^{n}+(\sum_{m}a_{k}^{m}N_{,j}^{m})N_{,i}^{n})\: dV.
-\end{equation}
-
-\end_inset
-
-Thus, we have one additional term (the second term) compared with the residual
- for infinitesimal strains.
- Just as in the infinitesimal formulation, we evaluate the integral over
- the volume using numerical quadrature with sums over the quadrature points
- of each cell.
-\end_layout
-
-\begin_layout Subsection
-Quasi-static Problems
-\end_layout
-
-\begin_layout Standard
-The system Jacobian for quasi-static problems includes terms associated
- with elasticity.
- For the small strain formulation, we write the elasticity term at time
- 
-\begin_inset Formula $t+\Delta t$
-\end_inset
-
- and consider the first terms of the Taylor series expansion,
-\begin_inset Formula 
-\begin{equation}
-\int_{v}S_{ij}(t+\Delta t)\delta\varepsilon_{ij}(t+\Delta t)\: dV=\int_{V}(S_{ij}(t)\delta\varepsilon_{ij}(t)+dS_{ij}(t)\delta\varepsilon_{ij}(t)+S_{ij}(t)d\delta\varepsilon_{ij}(t))\: dV.
-\end{equation}
-
-\end_inset
-
-We approximate the increment in the stress tensor using the elastic constants,
-\begin_inset Formula 
-\begin{equation}
-dS_{ij}=C_{ijkl}d\varepsilon_{kl},
-\end{equation}
-
-\end_inset
-
-and the increment in the 
-\begin_inset Quotes eld
-\end_inset
-
-virtual
-\begin_inset Quotes erd
-\end_inset
-
- strain via
-\begin_inset Formula 
-\begin{equation}
-d\delta\varepsilon_{ij}=\frac{1}{2}(du_{k,i}\delta u_{k,j}+du_{k,j}\delta u_{k,i}).
-\end{equation}
-
-\end_inset
-
-We associate the system Jacobian with the terms involving the increment
- in displacements.
- After substituting in the expressions for the increment in the stresses
- and the increment in the 
-\begin_inset Quotes eld
-\end_inset
-
-virtual
-\begin_inset Quotes erd
-\end_inset
-
- strains, we have
-\begin_inset Formula 
-\begin{equation}
-A_{ij}^{nm}=\int_{V}\frac{1}{4}C_{ijkl}(N_{,k}^{m}+(\sum_{r}a_{p}^{r}N_{,l}^{r})N_{,k}^{m})(N_{,i}^{n}+(\sum_{r}a_{p}^{r}N_{,j}^{r})N_{,i}^{n})+\frac{1}{2}S_{kl}N_{,l}^{m}N_{,l}^{n}\delta_{ij}\: dV.
-\end{equation}
-
-\end_inset
-
-The small strain formulation produces additional terms associated with the
- elastic constants and new a new term associated with the stress tensor.
-\end_layout
-
-\begin_layout Subsection
-Dynamic Problems
-\end_layout
-
-\begin_layout Standard
-The system Jacobian matrix in dynamic problems does not include any terms
- associated with elasticity, so the system Jacobian matrix in the small
- strain formulation matches the one used in the infinitesimal strain formulation.
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding auto
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 1
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 1in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Chapter
+\begin_inset CommandInset label
+LatexCommand label
+name "cha:Governing-Equations"
+
+\end_inset
+
+Governing Equations
+\end_layout
+
+\begin_layout Standard
+We present here a brief derivation of the equations for both quasi-static
+ and dynamic computations.
+ Since the general equations are the same (except for the absence of inertial
+ terms in the quasi-static case), we first derive these equations.
+ We then present solution methods for each specific case.
+ In all of our derivations, we use the notation described in Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:Mathematical-notation"
+
+\end_inset
+
+ for both index and vector notation.
+ When using index notation, we use the common convention that repeated indices
+ indicate summation over the range of the index.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:Mathematical-notation"
+
+\end_inset
+
+Mathematical notation
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset VSpace defskip
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="11" columns="3">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="0">
+<row>
+<cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Symbol
+\end_layout
+
+\end_inset
+</cell>
+<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Index notation
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Vector Notation
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $a_{i}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\overrightarrow{a}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Vector field a
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $a_{ij}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\underline{a}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Second order tensor field a
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $u_{i}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\overrightarrow{u}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Displacement vector field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $d_{i}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\vec{{d}}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Fault slip vector field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $f_{i}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\overrightarrow{f}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Body force vector field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $T_{i}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\overrightarrow{T}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Traction vector field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\sigma_{ij}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\underline{\sigma}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Stress tensor field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $n_{i}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\overrightarrow{n}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Normal vector field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\rho$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset Formula $\rho$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Mass density scalar field
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Derivation of Elasticity Equation
+\end_layout
+
+\begin_layout Subsection
+Index Notation
+\end_layout
+
+\begin_layout Standard
+Consider volume 
+\begin_inset Formula $V$
+\end_inset
+
+ bounded by surface 
+\begin_inset Formula $S$
+\end_inset
+
+.
+ Applying a Lagrangian description of the conservation of momentum gives
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial u_{i}}{\partial t}\, dV=\int_{V}f_{i}\, dV+\int_{S}T_{i}\, dS.\label{eqn:momentum:index}
+\end{equation}
+
+\end_inset
+
+The traction vector field is related to the stress tensor through
+\begin_inset Formula 
+\begin{equation}
+T_{i}=\sigma_{ij}n_{j},
+\end{equation}
+
+\end_inset
+
+where 
+\begin_inset Formula $n_{j}$
+\end_inset
+
+ is the vector normal to 
+\begin_inset Formula $S$
+\end_inset
+
+.
+ Substituting into equation 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eqn:momentum:index"
+
+\end_inset
+
+ yields
+\begin_inset Formula 
+\begin{equation}
+\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial u_{i}}{\partial t}\, dV=\int_{V}f_{i}\, dV+\int_{S}\sigma_{ij}n_{j}\, dS.
+\end{equation}
+
+\end_inset
+
+Applying the divergence theorem,
+\begin_inset Formula 
+\begin{equation}
+\int_{V}a_{i,j}\: dV=\int_{S}a_{j}n_{j}\: dS,
+\end{equation}
+
+\end_inset
+
+to the surface integral results in
+\begin_inset Formula 
+\begin{equation}
+\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial u_{i}}{\partial t}\, dV=\int_{V}f_{i}\, dV+\int_{V}\sigma_{ij,j}\, dV,
+\end{equation}
+
+\end_inset
+
+which we can rewrite as
+\begin_inset Formula 
+\begin{equation}
+\int_{V}\left(\rho\frac{\partial^{2}u_{i}}{\partial t^{2}}-f_{i}-\sigma_{ij,j}\right)\, dV=0.
+\end{equation}
+
+\end_inset
+
+Because the volume 
+\begin_inset Formula $V$
+\end_inset
+
+ is arbitrary, the integrand must be zero at every location in the volume,
+ so that we end up with
+\begin_inset Formula 
+\begin{gather}
+\rho\frac{\partial^{2}u_{i}}{\partial t^{2}}-f_{i}-\sigma_{ij,j}=0\text{ in }V,\\
+\sigma_{ij}n_{j}=T_{i}\text{ on }S_{T}\text{,}\\
+u_{i}=u_{i}^{o}\text{ on }S_{u}\text{, and}\\
+R_{ki}(u_{i}^{+}-u_{i}^{-})=d_{k}\text{ on }S_{f}.
+\end{gather}
+
+\end_inset
+
+We specify tractions, 
+\begin_inset Formula $T_{i}$
+\end_inset
+
+, on surface 
+\begin_inset Formula $S_{f}$
+\end_inset
+
+, displacements, 
+\begin_inset Formula $u_{i}^{o}$
+\end_inset
+
+, on surface 
+\begin_inset Formula $S_{u}$
+\end_inset
+
+, and slip, 
+\begin_inset Formula $d_{k}$
+\end_inset
+
+, on fault surface 
+\begin_inset Formula $S_{f}$
+\end_inset
+
+ (we will consider the case of fault constitutive models in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:fault"
+
+\end_inset
+
+).
+ The rotation matrix 
+\begin_inset Formula $R_{ki}$
+\end_inset
+
+ transforms vectors from the global coordinate system to the fault coordinate
+ system.
+ Note that since both 
+\begin_inset Formula $T_{i}$
+\end_inset
+
+ and 
+\begin_inset Formula $u_{i}$
+\end_inset
+
+ are vector quantities, there can be some spatial overlap of the surfaces
+ 
+\begin_inset Formula $S_{T}$
+\end_inset
+
+ and 
+\begin_inset Formula $S_{u}$
+\end_inset
+
+; however, the same degree of freedom cannot simultaneously have both types
+ of boundary conditions.
+\end_layout
+
+\begin_layout Subsection
+Vector Notation
+\end_layout
+
+\begin_layout Standard
+Consider volume 
+\begin_inset Formula $V$
+\end_inset
+
+ bounded by surface 
+\begin_inset Formula $S$
+\end_inset
+
+.
+ Applying a Lagrangian description of the conservation of momentum gives
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial\vec{u}}{\partial t}\, dV=\int_{V}\overrightarrow{f}\, dV+\int_{S}\overrightarrow{T}\, dS.\label{eqn:momentum:vec}
+\end{equation}
+
+\end_inset
+
+The traction vector field is related to the stress tensor through
+\begin_inset Formula 
+\begin{equation}
+\overrightarrow{T}=\underline{\sigma}\cdot\overrightarrow{n},
+\end{equation}
+
+\end_inset
+
+where 
+\begin_inset Formula $\overrightarrow{n}$
+\end_inset
+
+ is the vector normal to 
+\begin_inset Formula $S$
+\end_inset
+
+.
+ Substituting into equation 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eqn:momentum:vec"
+
+\end_inset
+
+ yields
+\begin_inset Formula 
+\begin{equation}
+\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial\overrightarrow{u}}{\partial t}\, dV=\int_{V}\overrightarrow{f}\, dV+\int_{S}\underline{\sigma}\cdot\overrightarrow{n}\, dS.
+\end{equation}
+
+\end_inset
+
+Applying the divergence theorem,
+\begin_inset Formula 
+\begin{equation}
+\int_{V}\nabla\cdot\overrightarrow{a}\: dV=\int_{S}\overrightarrow{a}\cdot\overrightarrow{n}\: dS,
+\end{equation}
+
+\end_inset
+
+to the surface integral results in
+\begin_inset Formula 
+\begin{equation}
+\frac{\partial}{\partial t}\int_{V}\rho\frac{\partial\overrightarrow{u}}{\partial t}\, dV=\int_{V}\overrightarrow{f}\, dV+\int_{V}\nabla\cdot\underline{\sigma}\, dV,
+\end{equation}
+
+\end_inset
+
+which we can rewrite as
+\begin_inset Formula 
+\begin{equation}
+\int_{V}\left(\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}-\overrightarrow{f}-\nabla\cdot\overrightarrow{\sigma}\right)\, dV=\vec{0}.
+\end{equation}
+
+\end_inset
+
+Because the volume 
+\begin_inset Formula $V$
+\end_inset
+
+ is arbitrary, the integrand must be the zero vector at every location in
+ the volume, so that we end up with
+\begin_inset Formula 
+\begin{gather}
+\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}-\overrightarrow{f}-\nabla\cdot\overrightarrow{\sigma}=\vec{0}\text{ in }V,\\
+\underline{\sigma}\cdot\overrightarrow{n}=\overrightarrow{T}\text{ on }S_{T}\text{,}\\
+\overrightarrow{u}=\overrightarrow{u^{o}}\text{ on }S_{u},\text{ and}\\
+\underbar{R}\cdot(\vec{u^{+}}-\vec{u^{-}})=\vec{d}\text{ on }S_{f}.
+\end{gather}
+
+\end_inset
+
+We specify tractions, 
+\begin_inset Formula $\vec{T}$
+\end_inset
+
+, on surface 
+\begin_inset Formula $S_{f}$
+\end_inset
+
+, displacements, 
+\begin_inset Formula $\overrightarrow{u^{o}}$
+\end_inset
+
+, on surface 
+\begin_inset Formula $S_{u}$
+\end_inset
+
+, and slip, 
+\begin_inset Formula $\vec{d}$
+\end_inset
+
+, on fault surface 
+\begin_inset Formula $S_{f}$
+\end_inset
+
+ (we will consider the case of fault constitutive models in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:fault"
+
+\end_inset
+
+).
+ The rotation matrix 
+\begin_inset Formula $\underline{R}$
+\end_inset
+
+ transforms vectors from the global coordinate system to the fault coordinate
+ system.
+ Note that since both 
+\begin_inset Formula $\overrightarrow{T}$
+\end_inset
+
+ and 
+\begin_inset Formula $\overrightarrow{u}$
+\end_inset
+
+ are vector quantities, there can be some spatial overlap of the surfaces
+ 
+\begin_inset Formula $S_{T}$
+\end_inset
+
+ and 
+\begin_inset Formula $S_{u}$
+\end_inset
+
+; however, the same degree of freedom cannot simultaneously have both types
+ of boundary conditions.
+\end_layout
+
+\begin_layout Section
+Finite-Element Formulation of Elasticity Equation
+\end_layout
+
+\begin_layout Standard
+We formulate a set of algebraic equations using Galerkin's method.
+ We consider (1) a trial solution, 
+\begin_inset Formula $\vec{u}$
+\end_inset
+
+, that is a piecewise differentiable vector field and satisfies the Dirichlet
+ boundary conditions on 
+\begin_inset Formula $S_{u}$
+\end_inset
+
+, and (2) a weighting function, 
+\begin_inset Formula $\vec{\phi}$
+\end_inset
+
+, that is a piecewise differentiable vector field and is zero on 
+\begin_inset Formula $S_{u}$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Subsection
+Index Notation
+\end_layout
+
+\begin_layout Standard
+We start with the wave equation (strong form),
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{gather}
+\sigma_{ij,j}+f_{i}=\rho\ddot{u_{i}}\text{ in }V,\\
+\sigma_{ij}n_{j}=T_{i}\text{ on }S_{T},\\
+u_{i}=u_{i}^{o}\text{ on }S_{u},\\
+R_{ki}(u_{i}^{+}-u_{i}^{-})=d_{k}\text{ on }S_{f},\text{ and}\\
+\sigma_{ij}=\sigma_{ji}\text{ (symmetric).}
+\end{gather}
+
+\end_inset
+
+We construct the weak form by computing the dot product of the wave equation
+ and weighting function and setting the integral over the domain to zero:
+\begin_inset Formula 
+\begin{gather}
+\int_{V}\left(\sigma_{ij,j}+f_{i}-\rho\ddot{u}_{i}\right)\phi_{i}\, dV=0\text{, or }\\
+\int_{V}\sigma_{ij,j}\phi_{i}\: dV+\int_{V}f_{i}\phi_{i}\: dV-\int_{V}\rho\ddot{u}_{i}\phi_{i}\: dV=0.
+\end{gather}
+
+\end_inset
+
+ Consider the divergence theorem applied to the dot product of the stress
+ tensor and the weighting function, 
+\begin_inset Formula $\sigma_{ij}\phi_{i}$
+\end_inset
+
+,
+\begin_inset Formula 
+\begin{equation}
+\int_{V}(\sigma_{ij}\phi_{i})_{,j}\, dV=\int_{S}(\sigma_{ij}\phi_{i})n_{i}\, dS.
+\end{equation}
+
+\end_inset
+
+Expanding the left-hand side yields
+\begin_inset Formula 
+\begin{gather}
+\int_{V}\sigma_{ij,j}\phi_{i}\: dV+\int_{V}\sigma_{ij}\phi_{i,j}\: dV=\int_{S}\sigma_{ij}\phi_{i}n_{i}\: dS,\text{ or}\\
+\int_{V}\sigma_{ij,j}\phi_{i}\: dV=-\int_{V}\sigma_{ij}\phi_{i,j}\, dV+\int_{S}\sigma_{ij}\phi_{i}n_{i}\, dS.
+\end{gather}
+
+\end_inset
+
+Substituting into the weak form gives
+\begin_inset Formula 
+\begin{equation}
+-\int_{V}\sigma_{ij}\phi_{i,j}\, dV+\int_{S}\sigma_{ij}\phi_{i}n_{i}\, dS+\int_{V}f_{i}\phi_{i}\, dV-\int_{V}\rho\ddot{u}_{i}\phi_{i}\, dV=0.
+\end{equation}
+
+\end_inset
+
+Turning our attention to the second term, we separate the integration over
+ 
+\begin_inset Formula $S$
+\end_inset
+
+ into integration over 
+\begin_inset Formula $S_{T}$
+\end_inset
+
+ and 
+\begin_inset Formula $S_{u}$
+\end_inset
+
+ (we will consider tractions over the fault surface, 
+\begin_inset Formula $S_{f}$
+\end_inset
+
+, associated with the fault constitutive model in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:fault"
+
+\end_inset
+
+),
+\begin_inset Formula 
+\begin{equation}
+-\int_{V}\sigma_{ij}\phi_{i,j}\, dV+\int_{S_{T}}\sigma_{ij}\phi_{i}n_{i}\, dS+\int_{S_{u}}\sigma_{ij}\phi_{i}n_{i}\, dS+\int_{V}f_{i}\phi_{i}\, dV-\int_{V}\rho\ddot{u}_{i}\phi_{i}\, dV=0,
+\end{equation}
+
+\end_inset
+
+and recognize that
+\begin_inset Formula 
+\begin{gather}
+\sigma_{ij}n_{i}=T_{i}\text{ on }S_{T}\text{ and}\\
+\phi_{i}=0\text{ on }S_{u},
+\end{gather}
+
+\end_inset
+
+so that the equation reduces to
+\begin_inset Formula 
+\begin{equation}
+-\int_{V}\sigma_{ij}\phi_{i,j}\: dV+\int_{S_{T}}T_{i}\phi_{i}\, dS+\int_{V}f_{i}\phi_{i}\, dV-\int_{V}\rho\ddot{u}_{i}\phi_{i}\, dV=0.\label{eq:elasticity:integral}
+\end{equation}
+
+\end_inset
+
+We express the trial solution and weighting function as linear combinations
+ of basis functions,
+\begin_inset Formula 
+\begin{gather}
+u_{i}=\sum_{m}a_{i}^{m}N^{m},\\
+\phi_{i}=\sum_{n}c_{i}^{n}N^{n}.
+\end{gather}
+
+\end_inset
+
+Note that because the trial solution satisfies the Dirichlet boundary condition,
+ the number of basis functions for 
+\begin_inset Formula $u$
+\end_inset
+
+ is generally greater than the number of basis functions for 
+\begin_inset Formula $\phi$
+\end_inset
+
+, i.e., 
+\begin_inset Formula $m>n$
+\end_inset
+
+.
+ Substituting in the expressions for the trial solution and weighting function
+ yields
+\begin_inset Formula 
+\begin{gather}
+-\int_{V}\sigma_{ij}\sum_{n}c_{i}^{n}N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}\sum_{n}c_{i}^{n}N^{n}\, dS+\int_{V}f_{i}\sum_{n}c_{i}^{n}N^{n}\, dV-\int_{V}\rho\sum_{m}\ddot{a}_{i}^{m}N^{m}\sum_{n}c_{i}^{n}N^{n}\ dV=0,\text{ or}\\
+\sum_{n}c_{i}^{n}(-\int_{V}\sigma_{ij}N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}N^{n}\, dS+\int_{V}f_{i}N^{n}\, dV-\int_{V}\rho\sum_{m}\ddot{a}_{i}^{m}N^{m}N^{n}\ dV)=0.
+\end{gather}
+
+\end_inset
+
+ Because the weighting function is arbitrary, this equation must hold for
+ all 
+\begin_inset Formula $c_{i}^{n}$
+\end_inset
+
+, so that the quantity in parenthesis is zero for each 
+\begin_inset Formula $c_{i}^{n}$
+\end_inset
+
+
+\begin_inset Formula 
+\begin{equation}
+-\int_{V}\sigma_{ij}N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}N^{n}\, dS+\int_{V}f_{i}N^{n}\, dV-\int_{V}\rho\sum_{m}\ddot{a}_{i}^{m}N^{m}N^{n}\ dV=\vec{0}.\label{eq:elasticity:integral:discretized}
+\end{equation}
+
+\end_inset
+
+We want to solve this equation for the unknown coefficients 
+\begin_inset Formula $a_{i}^{m}$
+\end_inset
+
+ subject to
+\end_layout
+
+\begin_layout Standard
+
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+\begin_inset Formula 
+\begin{gather}
+u_{i}=u_{i}^{o}\text{ on }S_{u},\text{ and}\\
+R_{ki}(u_{i}^{+}-u_{i}^{-})=d_{k}\text{ on }S_{f},
+\end{gather}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Vector Notation
+\end_layout
+
+\begin_layout Standard
+We start with the wave equation (strong form),
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{gather}
+\nabla\cdot\underline{\sigma}+\overrightarrow{f}=\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\text{ in }V,\\
+\underline{\sigma}\cdot\overrightarrow{n}=\overrightarrow{T}\text{ on }S_{T},\\
+\overrightarrow{u}=\overrightarrow{u^{o}}\text{ on }S_{u},\\
+\underbar{R}\cdot(\overrightarrow{u^{+}}-\overrightarrow{u^{-}})=\vec{d}\text{ on }S_{f}\\
+\underline{\sigma}=\underline{\sigma}^{T}\text{ (symmetric).}
+\end{gather}
+
+\end_inset
+
+We construct the weak form by multiplying the wave equation by a weighting
+ function and setting the integral over the domain to zero.
+ The weighting function is a piecewise differential vector field, 
+\begin_inset Formula $\overrightarrow{\phi}$
+\end_inset
+
+, where 
+\begin_inset Formula $\overrightarrow{\phi}=0$
+\end_inset
+
+ on 
+\begin_inset Formula $S_{u}.$
+\end_inset
+
+ Hence our weak form is
+\begin_inset Formula 
+\begin{gather}
+\int_{V}\left(\nabla\cdot\underline{\sigma}+\overrightarrow{f}-\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\right)\cdot\overrightarrow{\phi}\, dV=0\text{, or }\\
+\int_{V}(\nabla\cdot\underline{\sigma})\cdot\overrightarrow{\phi}\: dV+\int_{V}\overrightarrow{f}\cdot\overrightarrow{\phi}\: dV-\int_{V}\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\cdot\overrightarrow{\phi}\: dV=0.
+\end{gather}
+
+\end_inset
+
+ Consider the divergence theorem applied to the dot product of the stress
+ tensor and the trial function, 
+\begin_inset Formula $\underline{\sigma}\cdot\overrightarrow{\phi}$
+\end_inset
+
+,
+\begin_inset Formula 
+\begin{equation}
+\int_{V}\nabla\cdot(\underline{\sigma}\cdot\overrightarrow{\phi})\, dV=\int_{S}(\underline{\sigma}\cdot\overrightarrow{\phi})\cdot\overrightarrow{n}\, dS.
+\end{equation}
+
+\end_inset
+
+Expanding the left-hand side yields
+\begin_inset Formula 
+\begin{equation}
+\int_{V}(\nabla\cdot\underline{\sigma})\cdot\overrightarrow{\phi}\: dV+\int_{V}\underline{\sigma}:\nabla\overrightarrow{\phi}\: dV=\int_{S}(\underline{\sigma}\cdot\overrightarrow{\phi})\cdot\overrightarrow{n}\: dS,\text{ or}
+\end{equation}
+
+\end_inset
+
+
+\begin_inset Formula 
+\begin{equation}
+\int_{V}(\nabla\cdot\underline{\sigma})\cdot\overrightarrow{\phi}\: dV=-\int_{V}\underline{\sigma}:\nabla\overrightarrow{\phi}\, dV+\int_{S}\underline{\sigma}\cdot\overrightarrow{n}\cdot\overrightarrow{\phi}\, dS.
+\end{equation}
+
+\end_inset
+
+Substituting into the weak form gives
+\begin_inset Formula 
+\begin{equation}
+-\int_{V}\underline{\sigma}:\nabla\overrightarrow{\phi}\, dV+\int_{S}\underline{\sigma}\cdot\overrightarrow{n}\cdot\overrightarrow{\phi}\, dS+\int_{V}\overrightarrow{f}\cdot\overrightarrow{\phi}\, dV-\int_{V}\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\cdot\overrightarrow{\phi}\, dV=0.
+\end{equation}
+
+\end_inset
+
+We separate the integration over 
+\begin_inset Formula $S$
+\end_inset
+
+ into integration over 
+\begin_inset Formula $S_{T}$
+\end_inset
+
+ and 
+\begin_inset Formula $S_{u}$
+\end_inset
+
+,
+\begin_inset Formula 
+\begin{multline}
+-\int_{V}\underline{\sigma}:\nabla\overrightarrow{\phi}\, dV+\int_{S_{T}}\underline{\sigma}\cdot\overrightarrow{n}\cdot\overrightarrow{\phi}\, dS+\int_{S_{u}}\underline{\sigma}\cdot\overrightarrow{n}\cdot\overrightarrow{\phi}\, dS+\int_{V}\overrightarrow{f}\cdot\overrightarrow{\phi}\, dV-\int_{V}\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\cdot\overrightarrow{\phi}\, dV=0,
+\end{multline}
+
+\end_inset
+
+and recognize that
+\begin_inset Formula 
+\begin{gather}
+\underline{\sigma}\cdot\overrightarrow{n}=\overrightarrow{T}\text{ on }S_{T}\text{ and}\\
+\overrightarrow{\phi}=0\text{ on }S_{u},
+\end{gather}
+
+\end_inset
+
+so that the equation reduces to
+\begin_inset Formula 
+\begin{equation}
+-\int_{V}\underline{\sigma}:\nabla\overrightarrow{\phi}\: dV+\int_{S_{T}}\overrightarrow{T}\cdot\overrightarrow{\phi}\, dS+\int_{V}\overrightarrow{f}\cdot\overrightarrow{\phi}\, dV-\int_{V}\rho\frac{\partial^{2}\overrightarrow{u}}{\partial t^{2}}\cdot\overrightarrow{\phi}\, dV=0.
+\end{equation}
+
+\end_inset
+
+We express the trial solution and weighting function as linear combinations
+ of basis functions,
+\begin_inset Formula 
+\begin{gather}
+\vec{u}=\sum_{m}\overrightarrow{a^{m}}N^{m},\\
+\vec{\phi}=\sum_{n}\overrightarrow{c^{n}}N^{n}.
+\end{gather}
+
+\end_inset
+
+Note that because the weighting function is zero on 
+\begin_inset Formula $S_{u}$
+\end_inset
+
+, the number of basis functions for 
+\begin_inset Formula $\vec{u}$
+\end_inset
+
+ is generally greater than the number of basis functions for 
+\begin_inset Formula $\vec{\phi}$
+\end_inset
+
+, i.e., 
+\begin_inset Formula $m>n$
+\end_inset
+
+.
+ Substituting in the expressions for the trial solution and weighting function
+ yields
+\begin_inset Formula 
+\begin{multline}
+-\int_{V}\underline{\sigma}:\sum_{n}\overrightarrow{c^{n}}\nabla N_{,}^{n}\, dV+\int_{S_{T}}\vec{T}\cdot\sum_{n}\overrightarrow{c^{n}}N^{n}\, dS+\int_{V}\vec{f}\cdot\sum_{n}\overrightarrow{c^{n}}N^{n}\, dV\\
+-\int_{V}\rho\sum_{m}\frac{\partial^{2}\overrightarrow{a^{m}}}{\partial t^{2}}N^{m}\cdot\sum_{n}\overrightarrow{c^{n}}N^{n}\ dV=0.
+\end{multline}
+
+\end_inset
+
+ Because the weighting function is arbitrary, this equation must hold for
+ all 
+\begin_inset Formula $\overrightarrow{c^{n}}$
+\end_inset
+
+, so that
+\begin_inset Formula 
+\begin{equation}
+-\int_{V}\underline{\sigma}:\nabla N^{n}\, dV+\int_{S_{T}}\vec{T}N^{n}\, dS+\int_{V}\vec{f}N^{n}\, dV-\int_{V}\rho\sum_{m}\frac{\partial^{2}\overrightarrow{a^{m}}}{\partial t^{2}}N^{m}N^{n}\, dV=\vec{0}.
+\end{equation}
+
+\end_inset
+
+We want to solve this equation for the unknown coefficients 
+\begin_inset Formula $\overrightarrow{a^{m}}$
+\end_inset
+
+ subject to
+\end_layout
+
+\begin_layout Standard
+
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+\begin_inset Formula 
+\begin{gather}
+\vec{u}=u^{o}\overrightarrow{}\text{ on }S_{u},\text{ and}\\
+\underline{R}(\overrightarrow{u^{+}}-\overrightarrow{u^{-}})=\vec{d}\text{ on }S_{f},
+\end{gather}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Solution Method for Quasi-Static Problems
+\end_layout
+
+\begin_layout Standard
+For brevity we outline the solution method for quasi-static problems using
+ only index notation.
+ In quasi-static problems we neglect the inertial terms, so equation 
+\begin_inset CommandInset ref
+LatexCommand eqref
+reference "eq:elasticity:integral:discretized"
+
+\end_inset
+
+ reduces to
+\begin_inset Formula 
+\begin{equation}
+-\int_{V}\sigma_{ij}N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}N^{n}\, dS+\int_{V}f_{i}N^{n}\, dV=\vec{0}.
+\end{equation}
+
+\end_inset
+
+As a result, time-dependence only enters through the constitutive relationships
+ and the loading conditions.
+ We consider the deformation at time 
+\begin_inset Formula $t+\Delta t$
+\end_inset
+
+,
+\begin_inset Formula 
+\begin{equation}
+-\int_{V}\sigma_{ij}(t+\Delta t)N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}(t+\Delta t)N^{n}\, dS+\int_{V}f_{i}(t+\Delta t)N^{n}\, dV=\vec{0}.\label{eq:elasticity:integral:quasistatic}
+\end{equation}
+
+\end_inset
+
+We solve this equation through formulation of a linear algebraic system
+ of equations (
+\begin_inset Formula $Au=b$
+\end_inset
+
+), involving the residual (
+\begin_inset Formula $r=b-Au$
+\end_inset
+
+) and Jacobian (
+\begin_inset Formula $A$
+\end_inset
+
+).
+ The residual is simply
+\begin_inset Formula 
+\begin{equation}
+r_{i}^{n}=-\int_{V}\sigma_{ij}(t+\Delta t)N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}(t+\Delta t)N^{n}\, dS+\int_{V}f_{i}(t+\Delta t)N^{n}\, dV.
+\end{equation}
+
+\end_inset
+
+We employ numerical quadrature in the finite-element discretization and
+ replace the integrals with sums over the cells and quadrature points,
+\begin_inset Formula 
+\begin{multline}
+r_{i}^{n}=-\sum_{\text{vol cells}}\sum_{\text{quad pts}}\sigma_{ij}(x_{q},t+\Delta t)N_{,j}^{n}(x_{q})\: w_{q}|J_{cell}(x_{q})|+\sum_{\text{vol cells}}\sum_{\text{quad pt}s}f_{i}(x_{q},t+\Delta t)N^{n}(x_{q})\, w_{q}|J_{cell}(x_{q})|\\
++\sum_{\text{tract cells}}\sum_{\text{quad pts}}T_{i}(x_{q},t+\Delta t)N^{n}(x_{q})\, w_{q}|J_{cell}(x_{q})|,
+\end{multline}
+
+\end_inset
+
+where 
+\begin_inset Formula $r_{i}^{n}$
+\end_inset
+
+ is an 
+\begin_inset Formula $nd$
+\end_inset
+
+ vector (
+\begin_inset Formula $d$
+\end_inset
+
+ is the dimension of the vector space) and 
+\begin_inset Formula $i$
+\end_inset
+
+ is a vector space component, 
+\begin_inset Formula $x_{q}$
+\end_inset
+
+ are the coordinates of the quadrature points, 
+\begin_inset Formula $w_{q}$
+\end_inset
+
+ are the weights of the quadrature points, and 
+\begin_inset Formula $|J_{cell}(x_{q})|$
+\end_inset
+
+ is the determinant of the Jacobian matrix evaluated at the quadrature points
+ associated with mapping the reference cell to the actual cell.
+ The quadrature scheme for the integral over the tractions is one dimension
+ lower than the one used in integrating the terms for the volume cells.
+\end_layout
+
+\begin_layout Standard
+In order to find the Jacobian of the system, we let
+\begin_inset Formula 
+\begin{equation}
+\sigma_{ij}(t+\Delta t)=\sigma_{ij}(t)+d\sigma_{ij}(t).
+\end{equation}
+
+\end_inset
+
+Isolating the term associated with the increment in stresses yields
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+\int_{V}d\sigma_{ij}(t)N_{j}^{n}\ dV=-\int_{V}\sigma_{ij}(t)N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}(t+\Delta t)N^{n}\, dS+\int_{V}f_{i}(t+\Delta t)N^{n}\, dV
+\end{equation}
+
+\end_inset
+
+We associate the term on the left-hand-side with the action of the system
+ Jacobian on the increment of the displacement field.
+ We approximate the increment in stresses using linear elasticity and infinitesi
+mal strains,
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{gather}
+d\sigma_{ij}(t)=C_{ijkl}(t)d\varepsilon_{kl}(t)\\
+d\sigma_{ij}(t)=\frac{1}{2}C_{ijkl}(t)(du_{k.l}(t)+du_{l,k}(t))\\
+d\sigma_{ij}(t)=\frac{1}{2}C_{ijkl}(t)(\sum_{m}da_{k,l}^{m}(t)N^{m}+\sum_{m}da_{l,k}^{m}(t)N^{m})
+\end{gather}
+
+\end_inset
+
+Now, 
+\begin_inset Formula $d\sigma_{ij}\phi_{i,j}$
+\end_inset
+
+ is a scalar, so it is symmetric,
+\begin_inset Formula 
+\begin{equation}
+d\sigma_{ij}\phi_{i,j}=d\sigma_{ji}\phi_{j,i},
+\end{equation}
+
+\end_inset
+
+and we know that 
+\begin_inset Formula $d\sigma_{ij}$
+\end_inset
+
+ is symmetric, so
+\begin_inset Formula 
+\begin{equation}
+d\sigma_{ij}\phi_{i,j}=d\sigma_{ij}\phi_{j,i},
+\end{equation}
+
+\end_inset
+
+which means
+\begin_inset Formula 
+\begin{equation}
+\phi_{i,j}=\phi_{j,i},
+\end{equation}
+
+\end_inset
+
+which we can write as
+\begin_inset Formula 
+\begin{equation}
+\phi_{i,j}=\frac{1}{2}(\phi_{i,j}+\phi_{j,i}).
+\end{equation}
+
+\end_inset
+
+In terms of the basis functions, we have
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+\sum_{n}c_{i}^{n}N_{,j}^{n}=\frac{1}{2}(\sum_{n}c_{i}^{n}N_{,j}^{n}+\sum_{n}c_{j}^{n}N_{,i}^{n}).
+\end{equation}
+
+\end_inset
+
+Combining these expressions for the increment in stresses and making use
+ of the symmetry of the weighting functions, we find the system Jacobian
+ is
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+A_{ij}^{nm}=\int_{V}\frac{1}{4}C_{ijkl}(N_{,l}^{m}+N_{,k}^{m})(N_{,j}^{n}+N_{,i}^{n})\ dV.
+\end{equation}
+
+\end_inset
+
+We employ numerical quadrature in the finite-element discretization and
+ replace the integral with a sum over the cells and quadrature points,
+\begin_inset Formula 
+\begin{equation}
+A_{ij}^{nm}=\sum_{\text{vol cells}}\sum_{\text{quad pts}}\frac{1}{4}C_{ijkl}(N_{,l}^{m}(x_{q})+N_{,k}^{m}(x_{q}))(N_{,j}^{n}(x_{q})+N_{,i}^{n}(x_{q}))w_{q}|J_{cell}(x_{q}).
+\end{equation}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Solution Method for Dynamic Problems
+\end_layout
+
+\begin_layout Standard
+For brevity we outline the solution method for dynamic problems using only
+ index notation.
+ Time-dependence enters through the constitutive relationships, loading
+ conditions, and the inertial terms.
+ We consider the deformation at time 
+\begin_inset Formula $t$
+\end_inset
+
+,
+\begin_inset Formula 
+\begin{equation}
+-\int_{V}\sigma_{ij}(t)N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}(t)N^{n}\, dS+\int_{V}f_{i}(t)N^{n}\, dV-\int_{V}\rho\sum_{m}\ddot{a}_{i}^{m}(t)N^{m}N^{n}\ dV=\vec{0}.\label{eq:elasticity:integral:dynamic:t}
+\end{equation}
+
+\end_inset
+
+We solve this equation through formulation of a linear algebraic system
+ of equations (
+\begin_inset Formula $Au=b$
+\end_inset
+
+), involving the residual (
+\begin_inset Formula $r=b-Au$
+\end_inset
+
+) and Jacobian (
+\begin_inset Formula $A$
+\end_inset
+
+).
+ The residual is simply
+\begin_inset Formula 
+\begin{equation}
+r_{i}^{n}=-\int_{V}\sigma_{ij}(t)N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}(t)N^{n}\, dS+\int_{V}f_{i}(t)N^{n}\, dV-\int_{V}\rho\sum_{m}\ddot{a}_{i}^{m}(t)N^{m}N^{n}\ dV.
+\end{equation}
+
+\end_inset
+
+We employ numerical quadrature in the finite-element discretization and
+ replace the integrals with sums over the cells and quadrature points,
+\begin_inset Formula 
+\begin{multline}
+r_{i}^{n}=-\sum_{\text{vol cells}}\sum_{\text{quad pts}}\sigma_{ij}(x_{q},t)N^{n}(x_{q})\: w_{q}|J_{cell}(x_{q})|+\sum_{\text{vol cells}}\sum_{\text{quad pt}s}f_{i}(x_{q},t)N^{n}(x_{q})\, w_{q}|J_{cell}(x_{q})|\\
++\sum_{\text{tract cells}}\sum_{\text{quad pts}}T_{i}(x_{q},t)N^{n}(x_{q})\, w_{q}|J_{cell}(x_{q})|-\sum_{\text{vol cells}}\sum_{\text{quad pts}}\rho\sum_{m}\ddot{a}_{i}^{m}(t)N^{m}N^{n}\ w_{q|J_{cell}(x_{q})},
+\end{multline}
+
+\end_inset
+
+where 
+\begin_inset Formula $x_{q}$
+\end_inset
+
+ are the coordinates of the quadrature points, 
+\begin_inset Formula $w_{q}$
+\end_inset
+
+ are the weights of the quadrature points, and 
+\begin_inset Formula $|J_{cell}(x_{q})|$
+\end_inset
+
+ is the determinant of the Jacobian matrix evaluated at the quadrature points
+ associated with mapping the reference cell to the actual cell.
+ The quadrature scheme for the integral over the tractions is one dimension
+ lower than the one used in integrating the terms for the volume cells.
+ 
+\end_layout
+
+\begin_layout Standard
+We find the system Jacobian matrix by making use of the temporal discretization
+ and isolating the term for the increment in the displacement field at time
+ 
+\begin_inset Formula $t$
+\end_inset
+
+.
+ Using the central difference method to approximate the acceleration (and
+ velocity),
+\begin_inset Formula 
+\begin{gather}
+\ddot{u}_{i}(t)=\frac{1}{\Delta t^{2}}\left(u_{i}(t+\Delta t)-2u_{i}(t)+u_{i}(t-\Delta t)\right)\\
+\dot{u}_{i}(t)=\frac{1}{2\Delta t}\left(u_{i}(t+\Delta t)-u_{i}(t-\Delta t)\right)
+\end{gather}
+
+\end_inset
+
+and writing the displacement at time 
+\begin_inset Formula $t+\Delta t$
+\end_inset
+
+ in terms of the displacement at 
+\begin_inset Formula $t$
+\end_inset
+
+ (for consistency with the displacement increment quasi-static formulation),
+\begin_inset Formula 
+\begin{gather}
+u_{i}(t+\Delta t)=u_{i}(t)+du_{i}(t),\\
+\ddot{u}_{i}(t)=\frac{1}{\Delta t^{2}}\left(du_{i}(t)-u_{i}(t)+u_{i}(t-\Delta t)\right),\\
+\dot{u}_{i}(t)=\frac{1}{2\Delta t}\left(du_{i}(t)+u_{i}(t)-u_{i}(t-\Delta t)\right).
+\end{gather}
+
+\end_inset
+
+Substituting into equation 
+\begin_inset CommandInset ref
+LatexCommand eqref
+reference "eq:elasticity:integral:dynamic:t"
+
+\end_inset
+
+ yields
+\begin_inset Formula 
+\begin{multline}
+\frac{1}{\Delta t^{2}}\int_{V}\rho\sum_{m}da_{i}^{m}(t)N^{m}N^{n}\ dV=-\int_{V}\sigma_{ij}N_{,j}^{n}\: dV+\int_{S_{T}}T_{i}N^{n}\, dS+\int_{V}f_{i}N^{n}\, dV\\
+-\frac{1}{\Delta t^{2}}\int_{V}\rho\sum_{m}(a_{i}^{m}(t)-a_{i}^{m}(t-\Delta t))N^{m}N^{n}\ dV.
+\end{multline}
+
+\end_inset
+
+Thus, the Jacobian for the system is
+\begin_inset Formula 
+\begin{equation}
+A_{ij}^{nm}=\delta_{ij}\frac{1}{\Delta t^{2}}\int_{V}\rho N^{m}N^{n}\ dV,
+\end{equation}
+
+\end_inset
+
+and using numerical quadrature in the finite-element discretization to replace
+ the integrals with sums over the cells and quadrature points,
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+A_{ij}^{nm}=\delta_{ij}\frac{1}{\Delta t^{2}}\sum_{\text{vol cells}}\sum_{\text{quad pts}}\rho(x_{q})N^{m}(x_{q})N^{n}(x_{q}),
+\end{equation}
+
+\end_inset
+
+where 
+\begin_inset Formula $A_{ij}^{mn}$
+\end_inset
+
+ is a 
+\begin_inset Formula $nd$
+\end_inset
+
+ by 
+\begin_inset Formula $md$
+\end_inset
+
+ matrix (
+\begin_inset Formula $d$
+\end_inset
+
+ is the dimension of the vector space), 
+\begin_inset Formula $m$
+\end_inset
+
+ and 
+\begin_inset Formula $n$
+\end_inset
+
+ refer to the basis functions and 
+\begin_inset Formula $i$
+\end_inset
+
+ and 
+\begin_inset Formula $j$
+\end_inset
+
+ are vector space components.
+ We consider the contributions associated with the fault in section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:fault"
+
+\end_inset
+
+ and with absorbing boundaries is section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:absorbing:boundaries"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Section
+Small Strain Formulation
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Small-Strain-Formulation"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+In some crustal deformation problems sufficient deformation may occur that
+ the assumptions associated with infinitesimal strains no longer hold.
+ This is often the case for problems when one wants to include the effects
+ of gravitational body forces and deformation on the overburden pressure.
+ In such cases we want to account for both rigid body motion and small strains.
+ The elasticity formulation in PyLith for small strains uses the Green-Lagrange
+ strain tensor and the Second Piola-Kirchhoff stress tensor as is based
+ on the one presented by Bathe 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Bathe:1995"
+
+\end_inset
+
+.
+ The Green-Lagrange strain provides a measure of the strain relative to
+ the original, undeformed configuration.
+\begin_inset Formula 
+\begin{gather}
+\varepsilon_{ij}=\frac{1}{2}(u_{i,j}+u_{j,i}+u_{k,i}u_{k,j}),\text{ or}\\
+\varepsilon_{ij}=X_{ji}X_{ij}-\delta_{ij},\text{ where}\\
+X_{ij}=x_{i,j}(t)=\frac{\partial}{\partial x_{j}}(x_{i}(0)+u_{i}(t)),
+\end{gather}
+
+\end_inset
+
+and 
+\begin_inset Formula $X_{ij}$
+\end_inset
+
+ is the deformation tensor.
+ The Second Piola-Kirchhoff stress tensor, 
+\begin_inset Formula $S_{ij}$
+\end_inset
+
+, is related to the Green-Lagrange strain tensor through the elasticity
+ constants,
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula 
+\begin{equation}
+S_{ij}=C_{ijkl}\varepsilon_{kl},
+\end{equation}
+
+\end_inset
+
+in the same manner as in the infinitesimal strain formulation.
+\end_layout
+
+\begin_layout Standard
+The elasticity integral in the finite-element formulation includes additional
+ terms when we account for small strains.
+ Recognizing the similarity between the weighting function and an increment
+ in strain in the infinitesimal formulation (many finite-element texts derive
+ the finite-element formulation for elasticity using the Principle of Virtual
+ Work), we replace 
+\begin_inset Formula $\int_{V}\sigma_{ij}\phi_{i,j}\: dV$
+\end_inset
+
+ with 
+\begin_inset Formula $\int_{V}S_{ij}\delta\varepsilon_{ij}\: dV$
+\end_inset
+
+ in equation 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:elasticity:integral"
+
+\end_inset
+
+, where 
+\begin_inset Formula $\delta\varepsilon_{ij}$
+\end_inset
+
+ is the 
+\begin_inset Quotes eld
+\end_inset
+
+virtual
+\begin_inset Quotes erd
+\end_inset
+
+ strain.
+ Using the definition of the Green-Lagrangian strain, we have
+\begin_inset Formula 
+\begin{equation}
+\int_{V}S_{ij}\delta\varepsilon_{ij}\: dV=\int_{V}\frac{1}{2}S_{ij}(\delta u_{i,j}+\delta u_{j,i}+u_{k,i}\delta u_{k,j}+u_{k,j}\delta u_{k,i})\: dV.
+\end{equation}
+
+\end_inset
+
+Writing the displacements in terms of the basis functions and forcing the
+ terms associated with the arbitrary weighting function (
+\begin_inset Quotes eld
+\end_inset
+
+virtual
+\begin_inset Quotes erd
+\end_inset
+
+ strain) to zero yields the elastic term in the residual,
+\begin_inset Formula 
+\begin{equation}
+r_{i}^{n}=\int_{V}S_{ij}(N_{,i}^{n}+(\sum_{m}a_{k}^{m}N_{,j}^{m})N_{,i}^{n})\: dV.
+\end{equation}
+
+\end_inset
+
+Thus, we have one additional term (the second term) compared with the residual
+ for infinitesimal strains.
+ Just as in the infinitesimal formulation, we evaluate the integral over
+ the volume using numerical quadrature with sums over the quadrature points
+ of each cell.
+\end_layout
+
+\begin_layout Subsection
+Quasi-static Problems
+\end_layout
+
+\begin_layout Standard
+The system Jacobian for quasi-static problems includes terms associated
+ with elasticity.
+ For the small strain formulation, we write the elasticity term at time
+ 
+\begin_inset Formula $t+\Delta t$
+\end_inset
+
+ and consider the first terms of the Taylor series expansion,
+\begin_inset Formula 
+\begin{equation}
+\int_{v}S_{ij}(t+\Delta t)\delta\varepsilon_{ij}(t+\Delta t)\: dV=\int_{V}(S_{ij}(t)\delta\varepsilon_{ij}(t)+dS_{ij}(t)\delta\varepsilon_{ij}(t)+S_{ij}(t)d\delta\varepsilon_{ij}(t))\: dV.
+\end{equation}
+
+\end_inset
+
+We approximate the increment in the stress tensor using the elastic constants,
+\begin_inset Formula 
+\begin{equation}
+dS_{ij}=C_{ijkl}d\varepsilon_{kl},
+\end{equation}
+
+\end_inset
+
+and the increment in the 
+\begin_inset Quotes eld
+\end_inset
+
+virtual
+\begin_inset Quotes erd
+\end_inset
+
+ strain via
+\begin_inset Formula 
+\begin{equation}
+d\delta\varepsilon_{ij}=\frac{1}{2}(du_{k,i}\delta u_{k,j}+du_{k,j}\delta u_{k,i}).
+\end{equation}
+
+\end_inset
+
+We associate the system Jacobian with the terms involving the increment
+ in displacements.
+ After substituting in the expressions for the increment in the stresses
+ and the increment in the 
+\begin_inset Quotes eld
+\end_inset
+
+virtual
+\begin_inset Quotes erd
+\end_inset
+
+ strains, we have
+\begin_inset Formula 
+\begin{equation}
+A_{ij}^{nm}=\int_{V}\frac{1}{4}C_{ijkl}(N_{,k}^{m}+(\sum_{r}a_{p}^{r}N_{,l}^{r})N_{,k}^{m})(N_{,i}^{n}+(\sum_{r}a_{p}^{r}N_{,j}^{r})N_{,i}^{n})+\frac{1}{2}S_{kl}N_{,l}^{m}N_{,l}^{n}\delta_{ij}\: dV.
+\end{equation}
+
+\end_inset
+
+The small strain formulation produces additional terms associated with the
+ elastic constants and a new term associated with the stress tensor.
+\end_layout
+
+\begin_layout Subsection
+Dynamic Problems
+\end_layout
+
+\begin_layout Standard
+The system Jacobian matrix in dynamic problems does not include any terms
+ associated with elasticity, so the system Jacobian matrix in the small
+ strain formulation matches the one used in the infinitesimal strain formulation.
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/install/install.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/install/install.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/install/install.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -253,7 +253,7 @@
 
 \begin_deeper
 \begin_layout LyX-Code
-$ tar -xzf pylith-1.7.1-linux-i686.tgz
+$ tar -xzf pylith-1.8.0-linux-i686.tgz
 \end_layout
 
 \end_deeper
@@ -328,7 +328,7 @@
 
 \begin_deeper
 \begin_layout LyX-Code
-$ tar -xzf pylith-1.7.1-darwin-10.5.tgz
+$ tar -xzf pylith-1.8.0-darwin-10.5.tgz
 \end_layout
 
 \end_deeper

Modified: short/3D/PyLith/trunk/doc/userguide/intro/intro.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/intro/intro.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/intro/intro.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,542 +1,542 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 1
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 2in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 2
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Chapter
-Introduction
-\end_layout
-
-\begin_layout Section
-Overview
-\end_layout
-
-\begin_layout Standard
-PyLith is a multi-scale simulation software package for earthquake physics.
- It is portable, scalable software for simulation of crustal deformation
- across spatial scales ranging from meters to hundreds of kilometers and
- temporal scales ranging from milliseconds to thousands of years.
-\end_layout
-
-\begin_layout Section
-History
-\end_layout
-
-\begin_layout Standard
-PyLith 1.0 was the first version to allow the solution of both implicit (quasi-st
-atic) and explicit (dynamic) problems and was a complete rewrite of the
- original PyLith (version 0.8).
- PyLith 1.0 combines the functionality of EqSim 
-\begin_inset CommandInset citation
-LatexCommand cite
-key "Aagaard:etal:2001a,Aagaard:etal:2001b"
-
-\end_inset
-
- and PyLith 0.8.
- PyLith 0.8 was a direct descendant of LithoMop and was the first version
- that ran in parallel, as well as providing several other improvements over
- LithoMop.
- LithoMop was the product of major reengineering of Tecton, a finite-element
- code for simulating static and quasi-static crustal deformation.
- The major new features present in LithoMop included dynamic memory allocation
- and the use of the Pyre simulation framework and PETSc solvers.
- EqSim was written by Brad Aagaard to solve problems in earthquake dynamics,
- including rupture propagation and seismic wave propagation.
-\end_layout
-
-\begin_layout Standard
-The release of PyLith 1.0 has been followed by additional releases that expand
- the number of features as well as improve performance.
- The PyLith 1.x series of releases allows the solution of both quasi-static
- and dynamic problems in one, two, or three dimensions.
- The code runs in either serial or parallel, and the design allows for relativel
-y easy scripting using the Python programming language.
- Material properties and values for boundary and fault conditions are specified
- using spatial databases, which permit easy prescription of complex spatial
- variations of properties and parameters.
- Simulation parameters are generally specified through the use of simple
- ASCII files or the command line.
- At present, mesh information may be provided using a simple ASCII file
- (PyLith mesh ASCII format) or imported from CUBIT or LaGriT, two widely-used
- meshing packages.
- The elements currently available include a linear bar in 1-D, linear triangles
- and quadrilaterals in 2-D, and linear tetrahedra and hexahedra in 3-D.
- Materials presently available include isotropic elastic, linear Maxwell
- viscoelastic, generalized Maxwell viscoelastic, power-law viscoelastic,
- and Drucker-Prager elastoplastic.
- Boundary conditions include Dirichlet (prescribed displacements and velocities)
-, Neumann (traction), point forces, and absorbing boundaries.
- Cohesive elements are used to implement slip across interior surfaces (faults)
- with both kinematically-specified fault slip and slip governed by fault
- constitutive models.
- PyLith also includes an interface for computing static Green's functions
- for fault slip.
-\end_layout
-
-\begin_layout Standard
-PyLith is under active development and we expect a number of additions and
- improvements in the near future.
- Likely enhancements will include additional bulk and fault constitutive
- models, coupled quasi-static and dynamic simulations for earthquake cycle
- modeling, and coupling between elasticity, heat flow, and/or fluid flow.
-\end_layout
-
-\begin_layout Section
-PyLith Workflow
-\end_layout
-
-\begin_layout Standard
-PyLith is one component in the process of investigating problems in tectonics
- (Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:Workflow-summary"
-
-\end_inset
-
-).
- Given a geological problem of interest, a scientist must first provide
- a geometrical representation of the desired structure.
- Once the structure has been defined, a computational mesh must be created.
- PyLith presently provides three mesh importing options: CUBIT Exodus format,
- LaGriT GMV and Pset files, and PyLith mesh ASCII format.
- The modeling of the physical processes of interest is performed by a code
- such as PyLith.
- Present output consists of VTK or HDF5/Xdmf files which can be used by
- a number of visualization codes (e.g., ParaView, Visit, MayaVi, and Matlab).
- 
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/workflow.eps
-	scale 67
-	keepAspectRatio
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:Workflow-summary"
-
-\end_inset
-
-Workflow involved in going from geologic structure to problem analysis.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Section
-PyLith Design
-\end_layout
-
-\begin_layout Standard
-PyLith is separated into modules to encapsulate behavior and facilitate
- use across multiple applications.
- This allows expert users to replace functionality of a wide variety of
- components without recompiling or polluting the main code.
- PyLith employs external packages (see Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:pylith-dependencies"
-
-\end_inset
-
-) to reduce development time and enhance computational efficiency; for example,
- PyLith 0.8 ran two times faster when the PETSc linear solver was used.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/packages.eps
-	scale 40
-
-\end_inset
-
-
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:pylith-dependencies"
-
-\end_inset
-
-PyLith dependencies.
- PyLith makes direct use of several other packages, some of which have their
- own dependencies.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-PyLith is written in two programming languages.
- High-level code is written in Python; this rich, expressive interpreted
- language with dynamic typing reduces development time and permits flexible
- addition of user-contributed modules.
- This high-level code makes use of Pyre, a science-neutral simulation framework
- developed at Caltech, to link the modules together at runtime and gather
- user-input.
- Low-level code is written in C++, providing fast execution while still
- allowing an object-oriented implementation.
- This low-level code relies on PETSc to perform operations on matrices and
- vectors in parallel.
- We also make extensive use of two Python packages.
- SWIG is a package that simplifies the task of adding C++ extensions to
- Python code, and FIAT provides tabulated basis functions and numerical
- quadrature points.
- 
-\end_layout
-
-\begin_layout Standard
-In writing PyLith 1.0, the code was designed to be object-oriented and modular.
- Each type of module is accessed through a specified interface (set of functions
-).
- This permits adding, replacing, and rewriting modules without affecting
- other parts of the code.
- This code structure simplifies code maintenance and development.
- Extending the set of code features is also easier, since developers can
- create new modules derived from the existing ones.
-\end_layout
-
-\begin_layout Standard
-The new code design leverages Pyre, Sieve, and PETSc much more extensively
- than the previous version.
-  Pyre is used to glue together the various modules used to construct a
- simulation and specify the parameters.
- Sieve is used for all finite-element  storage and manipulation and handles
- the creation of the PETSc matrices and vectors.
-  As a result, most of the PyLith source code pertains to implementing the
- geodynamics, such as bulk rheology, boundary conditions, and slip on faults.
- 
-\end_layout
-
-\begin_layout Standard
-PyLith also uses FIAT to tabulate the finite-element basis functions  at
- the numerical integration (quadrature) points.
- Nemesis allows PyLith to run Python using the Message Passing Interface
- (MPI) for parallel processing.
- Additional, indirect dependencies (see Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:pylith-dependencies"
-
-\end_inset
-
-) include numpy (efficient operations on numerical arrays in Python), Proj.4
- (geographic projections), and SWIG (calling C++ functions from Python).
-\end_layout
-
-\begin_layout Standard
-During development, tests were constructed for nearly every module function.
- These unit tests are distributed with the source code.
- These tests are run throughout the development cycle to expose bugs and
- isolate their origin.
- As additional changes are made to the code, the tests are rerun to help
- prevent introduction of new bugs.
- A number of simple, full-scale tests, such as axial compression and extension,
- simple shear, and slip on through-going faults, have been used to test
- the code.
- Additionally, we have run the Southern California Earthquake Center crustal
- deformation and several of the spontaneous rupture benchmarks for strike-slip
- and reverse-slip to determine the relative local and global error (see
- Chapter 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:Benchmarks"
-
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Subsection
-Pyre
-\end_layout
-
-\begin_layout Standard
-Pyre is an object-oriented environment capable of specifying and launching
- numerical simulations on multiple platforms, including Beowulf-class parallel
- computers and grid computing systems.
- Pyre allows the binding of multiple components such as solid and fluid
- models used in Earth science simulations, and different meshers.
- The Pyre framework enables the elegant setup, modification and launching
- of massively parallel solver applications.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/pyre_overview.png
-	width 4in
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:Pyre:Architecture"
-
-\end_inset
-
-Pyre Architecture.
- The integration framework is a set of cooperating abstract services.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-Pyre is a framework, a combination of software and design philosophy that
- promotes the reuse of code.
- In their canonical software design book, 
-\emph on
-Design Patterns
-\emph default
-, Erich Gamma 
-\shape italic
-et al
-\shape default
-.
- condense the concept of a framework concept down to, ``When you use a framework
-, you reuse the main body and write the code it calls.'' In the context of
- frameworks and object-oriented programming, Pyre can be thought of as a
- collection of classes and the way their instances interact.
- Programming applications based on Pyre will look similar to those written
- in any other object-oriented language.
- The Pyre framework contains a subset of parts that make up the overall
- framework.
- Each of those parts is designed to solve a specific problem.
-\end_layout
-
-\begin_layout Standard
-The framework approach to computation offers many advantages.
- It permits the exchange of codes and promotes the reuse of standardized
- software while preserving efficiency.
- Frameworks are also an efficient way to handle changes in computer architecture.
- They present programmers and scientists with a unified and well-defined
- task and allow for shared costs of the housekeeping aspects of software
- development.
- They provide greater institutional continuity to model development than
- piecemeal approaches.
-\end_layout
-
-\begin_layout Standard
-The Pyre framework incorporates features aimed at enabling the scientific
- non-expert to perform tasks easily without hindering the expert.
- Target features for end users allow complete and intuitive simulation specifica
-tion, reasonable defaults, consistency checks of input, good diagnostics,
- easy access to remote facilities, and status monitoring.
- Target features for developers include easy access to user input, a shorter
- development cycle, and good debugging support.
-\end_layout
-
-\begin_layout Subsection
-Sieve and PETSc
-\end_layout
-
-\begin_layout Standard
-PyLith 1.x makes use of a set of data structures and routines in PETSc called
- 
-\family typewriter
-Sieve
-\family default
-, which is still under active development.
- 
-\family typewriter
-Sieve
-\family default
- provides data structures and routines for for representing and manipulating
- computational meshes, and it greatly simplifies finite-element computations.
-
-\family typewriter
- Sieve
-\family default
- represents the topology of the domain.
- Zero volume elements are inserted along all fault surfaces to implement
- kinematic (prescribed) or dynamic (constitutive model) implementations
- of fault slip.
- Material properties and other parameters are represented as sections (scalar
- and vector fields) over the mesh, and values for a vertex or cell can be
- retrieved by restricting the section to the vertex or cell.
- For each problem, functions are provided to calculate the residual and
- its Jacobian.
- All numerical integration is done in these functions, and parallel assembly
- is accomplished using the restrict/update paradigm of the 
-\family typewriter
-Sieve
-\family default
- framework.
- We assemble into PETSc linear algebra objects and then call PETSc solvers.
- The solution is mapped back into a section, which can be output in VTK
- format.
-\end_layout
-
-\begin_layout Standard
-PETSc 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-www-unix.mcs.anl.gov/petsc/petsc-as
-\end_layout
-
-\end_inset
-
-, the Portable, Extensible Toolkit for Scientific computation, provides
- a suite of routines for parallel, numerical solution of partial differential
- equations for linear and nonlinear systems with large, sparse systems of
- equations.
- PETSc includes solvers that implement a variety of Newton and Krylov subspace
- methods.
- It can also interface with many external packages, including ESSL, MUMPS,
- Matlab, ParMETIS, PVODE, and Hypre, thereby providing additional solvers
- and interaction with other software packages.
-\end_layout
-
-\begin_layout Standard
-PETSc includes interfaces for FORTRAN 77/90, C, C++, and Python for nearly
- all of the routines, and PETSc can be installed on most Unix systems.
- PETSc can be built with user-supplied, highly optimized linear algebra
- routines (e.g., ATLAS and commercial versions of BLAS/LAPACK), thereby improving
- application performance.
- Users can use PETSc parallel matrices, vectors, and other data structures
- for most parallel operations, eliminating the need for explicit calls to
- Message Passing Interface (MPI) routines.
- Many settings and options can be controlled with PETSc-specific command-line
- arguments, including selection of preconditions, solvers, and generation
- of performance logs.
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 1
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 2in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 2
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Chapter
+Introduction
+\end_layout
+
+\begin_layout Section
+Overview
+\end_layout
+
+\begin_layout Standard
+PyLith is a multi-scale simulation software package for earthquake physics.
+ It is portable, scalable software for simulation of crustal deformation
+ across spatial scales ranging from meters to hundreds of kilometers and
+ temporal scales ranging from milliseconds to thousands of years.
+\end_layout
+
+\begin_layout Section
+History
+\end_layout
+
+\begin_layout Standard
+PyLith 1.0 was the first version to allow the solution of both implicit (quasi-st
+atic) and explicit (dynamic) problems and was a complete rewrite of the
+ original PyLith (version 0.8).
+ PyLith 1.0 combines the functionality of EqSim 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Aagaard:etal:2001a,Aagaard:etal:2001b"
+
+\end_inset
+
+ and PyLith 0.8.
+ PyLith 0.8 was a direct descendant of LithoMop and was the first version
+ that ran in parallel, as well as providing several other improvements over
+ LithoMop.
+ LithoMop was the product of major reengineering of Tecton, a finite-element
+ code for simulating static and quasi-static crustal deformation.
+ The major new features present in LithoMop included dynamic memory allocation
+ and the use of the Pyre simulation framework and PETSc solvers.
+ EqSim was written by Brad Aagaard to solve problems in earthquake dynamics,
+ including rupture propagation and seismic wave propagation.
+\end_layout
+
+\begin_layout Standard
+The release of PyLith 1.0 has been followed by additional releases that expand
+ the number of features as well as improve performance.
+ The PyLith 1.x series of releases allows the solution of both quasi-static
+ and dynamic problems in one, two, or three dimensions.
+ The code runs in either serial or parallel, and the design allows for relativel
+y easy scripting using the Python programming language.
+ Material properties and values for boundary and fault conditions are specified
+ using spatial databases, which permit easy prescription of complex spatial
+ variations of properties and parameters.
+ Simulation parameters are generally specified through the use of simple
+ ASCII files or the command line.
+ At present, mesh information may be provided using a simple ASCII file
+ (PyLith mesh ASCII format) or imported from CUBIT or LaGriT, two widely-used
+ meshing packages.
+ The elements currently available include a linear bar in 1D, linear triangles
+ and quadrilaterals in 2D, and linear tetrahedra and hexahedra in 3D.
+ Materials presently available include isotropic elastic, linear Maxwell
+ viscoelastic, generalized Maxwell viscoelastic, power-law viscoelastic,
+ and Drucker-Prager elastoplastic.
+ Boundary conditions include Dirichlet (prescribed displacements and velocities)
+, Neumann (traction), point forces, and absorbing boundaries.
+ Cohesive elements are used to implement slip across interior surfaces (faults)
+ with both kinematically-specified fault slip and slip governed by fault
+ constitutive models.
+ PyLith also includes an interface for computing static Green's functions
+ for fault slip.
+\end_layout
+
+\begin_layout Standard
+PyLith is under active development and we expect a number of additions and
+ improvements in the near future.
+ Likely enhancements will include additional bulk and fault constitutive
+ models, coupled quasi-static and dynamic simulations for earthquake cycle
+ modeling, and coupling between elasticity, heat flow, and/or fluid flow.
+\end_layout
+
+\begin_layout Section
+PyLith Workflow
+\end_layout
+
+\begin_layout Standard
+PyLith is one component in the process of investigating problems in tectonics
+ (Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:Workflow-summary"
+
+\end_inset
+
+).
+ Given a geological problem of interest, a scientist must first provide
+ a geometrical representation of the desired structure.
+ Once the structure has been defined, a computational mesh must be created.
+ PyLith presently provides three mesh importing options: CUBIT Exodus format,
+ LaGriT GMV and Pset files, and PyLith mesh ASCII format.
+ The modeling of the physical processes of interest is performed by a code
+ such as PyLith.
+ Present output consists of VTK or HDF5/Xdmf files which can be used by
+ a number of visualization codes (e.g., ParaView, Visit, MayaVi, and Matlab).
+ 
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/workflow.eps
+	scale 67
+	keepAspectRatio
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:Workflow-summary"
+
+\end_inset
+
+Workflow involved in going from geologic structure to problem analysis.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+PyLith Design
+\end_layout
+
+\begin_layout Standard
+PyLith is separated into modules to encapsulate behavior and facilitate
+ use across multiple applications.
+ This allows expert users to replace functionality of a wide variety of
+ components without recompiling or polluting the main code.
+ PyLith employs external packages (see Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:pylith-dependencies"
+
+\end_inset
+
+) to reduce development time and enhance computational efficiency; for example,
+ PyLith 0.8 ran two times faster when the PETSc linear solver was used.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/packages.eps
+	scale 40
+
+\end_inset
+
+
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:pylith-dependencies"
+
+\end_inset
+
+PyLith dependencies.
+ PyLith makes direct use of several other packages, some of which have their
+ own dependencies.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+PyLith is written in two programming languages.
+ High-level code is written in Python; this rich, expressive interpreted
+ language with dynamic typing reduces development time and permits flexible
+ addition of user-contributed modules.
+ This high-level code makes use of Pyre, a science-neutral simulation framework
+ developed at Caltech, to link the modules together at runtime and gather
+ user-input.
+ Low-level code is written in C++, providing fast execution while still
+ allowing an object-oriented implementation.
+ This low-level code relies on PETSc to perform operations on matrices and
+ vectors in parallel.
+ We also make extensive use of two Python packages.
+ SWIG is a package that simplifies the task of adding C++ extensions to
+ Python code, and FIAT provides tabulated basis functions and numerical
+ quadrature points.
+ 
+\end_layout
+
+\begin_layout Standard
+In writing PyLith 1.0, the code was designed to be object-oriented and modular.
+ Each type of module is accessed through a specified interface (set of functions
+).
+ This permits adding, replacing, and rewriting modules without affecting
+ other parts of the code.
+ This code structure simplifies code maintenance and development.
+ Extending the set of code features is also easier, since developers can
+ create new modules derived from the existing ones.
+\end_layout
+
+\begin_layout Standard
+The new code design leverages Pyre, Sieve, and PETSc much more extensively
+ than the previous version.
+  Pyre is used to glue together the various modules used to construct a
+ simulation and specify the parameters.
+ Sieve is used for all finite-element  storage and manipulation and handles
+ the creation of the PETSc matrices and vectors.
+  As a result, most of the PyLith source code pertains to implementing the
+ geodynamics, such as bulk rheology, boundary conditions, and slip on faults.
+ 
+\end_layout
+
+\begin_layout Standard
+PyLith also uses FIAT to tabulate the finite-element basis functions  at
+ the numerical integration (quadrature) points.
+ Nemesis allows PyLith to run Python using the Message Passing Interface
+ (MPI) for parallel processing.
+ Additional, indirect dependencies (see Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:pylith-dependencies"
+
+\end_inset
+
+) include numpy (efficient operations on numerical arrays in Python), Proj.4
+ (geographic projections), and SWIG (calling C++ functions from Python).
+\end_layout
+
+\begin_layout Standard
+During development, tests were constructed for nearly every module function.
+ These unit tests are distributed with the source code.
+ These tests are run throughout the development cycle to expose bugs and
+ isolate their origin.
+ As additional changes are made to the code, the tests are rerun to help
+ prevent introduction of new bugs.
+ A number of simple, full-scale tests, such as axial compression and extension,
+ simple shear, and slip on through-going faults, have been used to test
+ the code.
+ Additionally, we have run the Southern California Earthquake Center crustal
+ deformation and several of the spontaneous rupture benchmarks for strike-slip
+ and reverse-slip to determine the relative local and global error (see
+ Chapter 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Benchmarks"
+
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Subsection
+Pyre
+\end_layout
+
+\begin_layout Standard
+Pyre is an object-oriented environment capable of specifying and launching
+ numerical simulations on multiple platforms, including Beowulf-class parallel
+ computers and grid computing systems.
+ Pyre allows the binding of multiple components such as solid and fluid
+ models used in Earth science simulations, and different meshers.
+ The Pyre framework enables the elegant setup, modification and launching
+ of massively parallel solver applications.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/pyre_overview.png
+	width 4in
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:Pyre:Architecture"
+
+\end_inset
+
+Pyre Architecture.
+ The integration framework is a set of cooperating abstract services.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Pyre is a framework, a combination of software and design philosophy that
+ promotes the reuse of code.
+ In their canonical software design book, 
+\emph on
+Design Patterns
+\emph default
+, Erich Gamma 
+\shape italic
+et al
+\shape default
+.
+ condense the concept of a framework concept down to, ``When you use a framework
+, you reuse the main body and write the code it calls.'' In the context of
+ frameworks and object-oriented programming, Pyre can be thought of as a
+ collection of classes and the way their instances interact.
+ Programming applications based on Pyre will look similar to those written
+ in any other object-oriented language.
+ The Pyre framework contains a subset of parts that make up the overall
+ framework.
+ Each of those parts is designed to solve a specific problem.
+\end_layout
+
+\begin_layout Standard
+The framework approach to computation offers many advantages.
+ It permits the exchange of codes and promotes the reuse of standardized
+ software while preserving efficiency.
+ Frameworks are also an efficient way to handle changes in computer architecture.
+ They present programmers and scientists with a unified and well-defined
+ task and allow for shared costs of the housekeeping aspects of software
+ development.
+ They provide greater institutional continuity to model development than
+ piecemeal approaches.
+\end_layout
+
+\begin_layout Standard
+The Pyre framework incorporates features aimed at enabling the scientific
+ non-expert to perform tasks easily without hindering the expert.
+ Target features for end users allow complete and intuitive simulation specifica
+tion, reasonable defaults, consistency checks of input, good diagnostics,
+ easy access to remote facilities, and status monitoring.
+ Target features for developers include easy access to user input, a shorter
+ development cycle, and good debugging support.
+\end_layout
+
+\begin_layout Subsection
+Sieve and PETSc
+\end_layout
+
+\begin_layout Standard
+PyLith 1.x makes use of a set of data structures and routines in PETSc called
+ 
+\family typewriter
+Sieve
+\family default
+, which is still under active development.
+ 
+\family typewriter
+Sieve
+\family default
+ provides data structures and routines for for representing and manipulating
+ computational meshes, and it greatly simplifies finite-element computations.
+
+\family typewriter
+ Sieve
+\family default
+ represents the topology of the domain.
+ Zero volume elements are inserted along all fault surfaces to implement
+ kinematic (prescribed) or dynamic (constitutive model) implementations
+ of fault slip.
+ Material properties and other parameters are represented as sections (scalar
+ and vector fields) over the mesh, and values for a vertex or cell can be
+ retrieved by restricting the section to the vertex or cell.
+ For each problem, functions are provided to calculate the residual and
+ its Jacobian.
+ All numerical integration is done in these functions, and parallel assembly
+ is accomplished using the restrict/update paradigm of the 
+\family typewriter
+Sieve
+\family default
+ framework.
+ We assemble into PETSc linear algebra objects and then call PETSc solvers.
+ The solution is mapped back into a section, which can be output in VTK
+ format.
+\end_layout
+
+\begin_layout Standard
+PETSc 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+www-unix.mcs.anl.gov/petsc/petsc-as
+\end_layout
+
+\end_inset
+
+, the Portable, Extensible Toolkit for Scientific computation, provides
+ a suite of routines for parallel, numerical solution of partial differential
+ equations for linear and nonlinear systems with large, sparse systems of
+ equations.
+ PETSc includes solvers that implement a variety of Newton and Krylov subspace
+ methods.
+ It can also interface with many external packages, including ESSL, MUMPS,
+ Matlab, ParMETIS, PVODE, and Hypre, thereby providing additional solvers
+ and interaction with other software packages.
+\end_layout
+
+\begin_layout Standard
+PETSc includes interfaces for FORTRAN 77/90, C, C++, and Python for nearly
+ all of the routines, and PETSc can be installed on most Unix systems.
+ PETSc can be built with user-supplied, highly optimized linear algebra
+ routines (e.g., ATLAS and commercial versions of BLAS/LAPACK), thereby improving
+ application performance.
+ Users can use PETSc parallel matrices, vectors, and other data structures
+ for most parallel operations, eliminating the need for explicit calls to
+ Message Passing Interface (MPI) routines.
+ Many settings and options can be controlled with PETSc-specific command-line
+ arguments, including selection of preconditions, solvers, and generation
+ of performance logs.
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/materials/altformulations.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/materials/altformulations.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/materials/altformulations.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,320 +1,321 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 1
-\use_esint 0
-\use_mhchem 0
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 2in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 2
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Chapter
-\begin_inset CommandInset label
-LatexCommand label
-name "cha:Alternative-Formulations"
-
-\end_inset
-
-Alternative Material Model Formulations
-\end_layout
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:ViscoelasticFormulations"
-
-\end_inset
-
-Viscoelastic Formulations
-\end_layout
-
-\begin_layout Standard
-The viscoelastic formulations presently used in PyLith are described in
- 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Viscoelastic-Materials"
-
-\end_inset
-
-.
- In some cases there are alternative formulations that may be used in future
- versions of PyLith, and those are described here.
-\end_layout
-
-\begin_layout Subsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sub:Effective-Stress-Formulation-Maxwell"
-
-\end_inset
-
-Effective Stress Formulation for a Linear Maxwell Viscoelastic Material
-\end_layout
-
-\begin_layout Standard
-An alternative technique for solving the equations for a Maxwell viscoelastic
- material is based on the effective stress formulation described in 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sub:Effective-Stress-Formulations-Viscoelastic"
-
-\end_inset
-
-.
- A linear Maxwell viscoelastic material may be characterized by the same
- elastic parameters as an isotropic elastic material (
-\begin_inset Formula $E$
-\end_inset
-
- and 
-\begin_inset Formula $\nu$
-\end_inset
-
-), as well as the viscosity, 
-\begin_inset Formula $\eta$
-\end_inset
-
-.
- The creep strain increment is
-\begin_inset Formula 
-\begin{gather}
-\underline{\Delta e}^{C}=\frac{\Delta t\phantom{}^{\tau}\underline{S}}{2\eta}\,\,.\label{eq:D1}
-\end{gather}
-
-\end_inset
-
-Therefore,
-\begin_inset Formula 
-\begin{gather}
-\Delta\overline{e}^{C}=\frac{\Delta t\sqrt{^{\tau}J_{2}^{\prime}}}{\sqrt{3\eta}}=\frac{\Delta t\phantom{}^{\tau}\overline{\sigma}}{3\eta}\,,\,\mathrm{and}\,^{\tau}\gamma=\frac{1}{2\eta}\,\,.\label{eq:D2}
-\end{gather}
-
-\end_inset
-
-Substituting Equations 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:46"
-
-\end_inset
-
-, 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:D1"
-
-\end_inset
-
-, and 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:D2"
-
-\end_inset
-
- into 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:43"
-
-\end_inset
-
-, we obtain
-\begin_inset Formula 
-\begin{gather}
-^{t+\Delta t}\underline{S}=\frac{1}{a_{E}}\left\{ ^{t+\Delta t}\underline{e}^{\prime}-\frac{\Delta t}{2\eta}\left[(1-\alpha)^{t}\underline{S}+\alpha\phantom{}^{t+\Delta t}\underline{S}\right]\right\} +\underline{S}^{I}\,\,.\label{eq:D3}
-\end{gather}
-
-\end_inset
-
-Solving for 
-\begin_inset Formula $^{t+\Delta t}\underline{S}$
-\end_inset
-
-,
-\begin_inset Formula 
-\begin{gather}
-^{t+\Delta t}\underline{S}=\frac{1}{a_{E}+\frac{\alpha\Delta t}{2\eta}}\left[^{t+\Delta t}\underline{e}^{\prime}-\frac{\Delta t}{2\eta}(1-\alpha)^{t}\underline{S}+\frac{1+\mathrm{\nu}}{E}\underline{S}^{I}\right]\,\,.\label{eq:D4}
-\end{gather}
-
-\end_inset
-
-In this case it is possible to solve directly for the deviatoric stresses,
- and the effective stress function approach is not needed.
- To obtain the total stress, we simply use
-\begin_inset Formula 
-\begin{gather}
-^{t+\Delta t}\sigma_{ij}=\phantom{}^{t+\Delta t}S_{ij}+\frac{\mathit{1}}{a_{m}}\left(\,^{t+\Delta t}\theta-\theta^{I}\right)\delta_{ij}+P^{I}\delta_{ij}\,\,.\label{eq:D5}
-\end{gather}
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-To compute the viscoelastic tangent material matrix relating stress and
- strain, we need to compute the first term in 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:58"
-
-\end_inset
-
-.
- From Equation 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:D4"
-
-\end_inset
-
-, we have
-\begin_inset Formula 
-\begin{gather}
-\frac{\partial\phantom{}^{t+\Delta t}S_{i}}{\partial\phantom{}^{t+\Delta t}e_{k}^{\prime}}=\frac{\delta_{ik}}{a_{E}+\frac{\alpha\Delta t}{2\eta}}\,\,.\label{eq:D12}
-\end{gather}
-
-\end_inset
-
-Using this, along with 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:58"
-
-\end_inset
-
-, 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:59"
-
-\end_inset
-
-, and 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:60"
-
-\end_inset
-
-, the final material matrix relating stress and tensor strain is
-\begin_inset Formula 
-\begin{gather}
-C_{ij}^{VE}=\frac{1}{3a_{m}}\left[\begin{array}{cccccc}
-1 & 1 & 1 & 0 & 0 & 0\\
-1 & 1 & 1 & 0 & 0 & 0\\
-1 & 1 & 1 & 0 & 0 & 0\\
-0 & 0 & 0 & 0 & 0 & 0\\
-0 & 0 & 0 & 0 & 0 & 0\\
-0 & 0 & 0 & 0 & 0 & 0
-\end{array}\right]+\frac{1}{3\left(a_{E}+\frac{\alpha\Delta t}{2\eta}\right)}\left[\begin{array}{cccccc}
-2 & -1 & -1 & 0 & 0 & 0\\
--1 & 2 & -1 & 0 & 0 & 0\\
--1 & -1 & 2 & 0 & 0 & 0\\
-0 & 0 & 0 & 3 & 0 & 0\\
-0 & 0 & 0 & 0 & 3 & 0\\
-0 & 0 & 0 & 0 & 0 & 3
-\end{array}\right]\,.\label{eq:D13}
-\end{gather}
-
-\end_inset
-
-Note that the coefficient of the second matrix approaches 
-\begin_inset Formula $E/3(1+\nu)=1/3a_{E}$
-\end_inset
-
- as 
-\begin_inset Formula $\eta$
-\end_inset
-
- goes to infinity.
- To check the results we make sure that the regular elastic constitutive
- matrix is obtained for selected terms in the case where 
-\begin_inset Formula $\eta$
-\end_inset
-
- goes to infinity.
-\begin_inset Formula 
-\begin{gather}
-C_{11}^{E}=\frac{E(1-\nu)}{(1+\nu)(1-2\nu)}\,\,\nonumber \\
-C_{12}^{E}=\frac{E\nu}{(1+\nu)(1-2\nu)}\,.\label{eq:D14}\\
-C_{44}^{E}=\frac{E}{1+\nu}\,\,\nonumber 
-\end{gather}
-
-\end_inset
-
-This is consistent with the regular elasticity matrix, and Equation 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:D13"
-
-\end_inset
-
- should thus be used when forming the stiffness matrix.
- We do not presently use this formulation, but it may be included in future
- versions.
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 1
+\use_esint 0
+\use_mhchem 0
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 2in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 2
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Chapter
+\begin_inset CommandInset label
+LatexCommand label
+name "cha:Alternative-Formulations"
+
+\end_inset
+
+Alternative Material Model Formulations
+\end_layout
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:ViscoelasticFormulations"
+
+\end_inset
+
+Viscoelastic Formulations
+\end_layout
+
+\begin_layout Standard
+The viscoelastic formulations presently used in PyLith are described in
+ Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Viscoelastic-Materials"
+
+\end_inset
+
+.
+ In some cases there are alternative formulations that may be used in future
+ versions of PyLith, and those are described here.
+\end_layout
+
+\begin_layout Subsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sub:Effective-Stress-Formulation-Maxwell"
+
+\end_inset
+
+Effective Stress Formulation for a Linear Maxwell Viscoelastic Material
+\end_layout
+
+\begin_layout Standard
+An alternative technique for solving the equations for a Maxwell viscoelastic
+ material is based on the effective stress formulation described in Section
+ 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sub:Effective-Stress-Formulations-Viscoelastic"
+
+\end_inset
+
+.
+ A linear Maxwell viscoelastic material may be characterized by the same
+ elastic parameters as an isotropic elastic material (
+\begin_inset Formula $E$
+\end_inset
+
+ and 
+\begin_inset Formula $\nu$
+\end_inset
+
+), as well as the viscosity, 
+\begin_inset Formula $\eta$
+\end_inset
+
+.
+ The creep strain increment is
+\begin_inset Formula 
+\begin{gather}
+\underline{\Delta e}^{C}=\frac{\Delta t\phantom{}^{\tau}\underline{S}}{2\eta}\,\,.\label{eq:D1}
+\end{gather}
+
+\end_inset
+
+Therefore,
+\begin_inset Formula 
+\begin{gather}
+\Delta\overline{e}^{C}=\frac{\Delta t\sqrt{^{\tau}J_{2}^{\prime}}}{\sqrt{3\eta}}=\frac{\Delta t\phantom{}^{\tau}\overline{\sigma}}{3\eta}\,,\,\mathrm{and}\,^{\tau}\gamma=\frac{1}{2\eta}\,\,.\label{eq:D2}
+\end{gather}
+
+\end_inset
+
+Substituting Equations 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:46"
+
+\end_inset
+
+, 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:D1"
+
+\end_inset
+
+, and 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:D2"
+
+\end_inset
+
+ into 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:43"
+
+\end_inset
+
+, we obtain
+\begin_inset Formula 
+\begin{gather}
+^{t+\Delta t}\underline{S}=\frac{1}{a_{E}}\left\{ ^{t+\Delta t}\underline{e}^{\prime}-\frac{\Delta t}{2\eta}\left[(1-\alpha)^{t}\underline{S}+\alpha\phantom{}^{t+\Delta t}\underline{S}\right]\right\} +\underline{S}^{I}\,\,.\label{eq:D3}
+\end{gather}
+
+\end_inset
+
+Solving for 
+\begin_inset Formula $^{t+\Delta t}\underline{S}$
+\end_inset
+
+,
+\begin_inset Formula 
+\begin{gather}
+^{t+\Delta t}\underline{S}=\frac{1}{a_{E}+\frac{\alpha\Delta t}{2\eta}}\left[^{t+\Delta t}\underline{e}^{\prime}-\frac{\Delta t}{2\eta}(1-\alpha)^{t}\underline{S}+\frac{1+\mathrm{\nu}}{E}\underline{S}^{I}\right]\,\,.\label{eq:D4}
+\end{gather}
+
+\end_inset
+
+In this case it is possible to solve directly for the deviatoric stresses,
+ and the effective stress function approach is not needed.
+ To obtain the total stress, we simply use
+\begin_inset Formula 
+\begin{gather}
+^{t+\Delta t}\sigma_{ij}=\phantom{}^{t+\Delta t}S_{ij}+\frac{\mathit{1}}{a_{m}}\left(\,^{t+\Delta t}\theta-\theta^{I}\right)\delta_{ij}+P^{I}\delta_{ij}\,\,.\label{eq:D5}
+\end{gather}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+To compute the viscoelastic tangent material matrix relating stress and
+ strain, we need to compute the first term in Equation 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:58"
+
+\end_inset
+
+.
+ From Equation 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:D4"
+
+\end_inset
+
+, we have
+\begin_inset Formula 
+\begin{gather}
+\frac{\partial\phantom{}^{t+\Delta t}S_{i}}{\partial\phantom{}^{t+\Delta t}e_{k}^{\prime}}=\frac{\delta_{ik}}{a_{E}+\frac{\alpha\Delta t}{2\eta}}\,\,.\label{eq:D12}
+\end{gather}
+
+\end_inset
+
+Using this, along with Equations 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:58"
+
+\end_inset
+
+, 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:59"
+
+\end_inset
+
+, and 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:60"
+
+\end_inset
+
+, the final material matrix relating stress and tensor strain is
+\begin_inset Formula 
+\begin{gather}
+C_{ij}^{VE}=\frac{1}{3a_{m}}\left[\begin{array}{cccccc}
+1 & 1 & 1 & 0 & 0 & 0\\
+1 & 1 & 1 & 0 & 0 & 0\\
+1 & 1 & 1 & 0 & 0 & 0\\
+0 & 0 & 0 & 0 & 0 & 0\\
+0 & 0 & 0 & 0 & 0 & 0\\
+0 & 0 & 0 & 0 & 0 & 0
+\end{array}\right]+\frac{1}{3\left(a_{E}+\frac{\alpha\Delta t}{2\eta}\right)}\left[\begin{array}{cccccc}
+2 & -1 & -1 & 0 & 0 & 0\\
+-1 & 2 & -1 & 0 & 0 & 0\\
+-1 & -1 & 2 & 0 & 0 & 0\\
+0 & 0 & 0 & 3 & 0 & 0\\
+0 & 0 & 0 & 0 & 3 & 0\\
+0 & 0 & 0 & 0 & 0 & 3
+\end{array}\right]\,.\label{eq:D13}
+\end{gather}
+
+\end_inset
+
+Note that the coefficient of the second matrix approaches 
+\begin_inset Formula $E/3(1+\nu)=1/3a_{E}$
+\end_inset
+
+ as 
+\begin_inset Formula $\eta$
+\end_inset
+
+ goes to infinity.
+ To check the results we make sure that the regular elastic constitutive
+ matrix is obtained for selected terms in the case where 
+\begin_inset Formula $\eta$
+\end_inset
+
+ goes to infinity.
+\begin_inset Formula 
+\begin{gather}
+C_{11}^{E}=\frac{E(1-\nu)}{(1+\nu)(1-2\nu)}\,\,\nonumber \\
+C_{12}^{E}=\frac{E\nu}{(1+\nu)(1-2\nu)}\,.\label{eq:D14}\\
+C_{44}^{E}=\frac{E}{1+\nu}\,\,\nonumber 
+\end{gather}
+
+\end_inset
+
+This is consistent with the regular elasticity matrix, and Equation 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:D13"
+
+\end_inset
+
+ should thus be used when forming the stiffness matrix.
+ We do not presently use this formulation, but it may be included in future
+ versions.
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/materials/materials.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/materials/materials.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/materials/materials.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -191,11 +191,7 @@
 
 \end_inset
 
-for examples 
-\family typewriter
-that
-\family default
- demonstrate how to specify more than one material model.
+ for examples that demonstrate how to specify more than one material model.
 \end_layout
 
 \begin_layout Subsection
@@ -325,11 +321,7 @@
 \end_layout
 
 \begin_layout Standard
-These settings correspond to the the problem in 
-\family typewriter
-Section 
-\family default
-
+These settings correspond to the the problem in Section 
 \begin_inset CommandInset ref
 LatexCommand ref
 reference "sec:Tutorial-3d-hex8"
@@ -396,11 +388,7 @@
 \end_layout
 
 \begin_layout Standard
-These settings again correspond to the problem in 
-\family typewriter
-Section 
-\family default
-
+These settings again correspond to the problem in Section 
 \begin_inset CommandInset ref
 LatexCommand ref
 reference "sec:Tutorial-3d-hex8"
@@ -443,11 +431,7 @@
  Similarly, other material models require state variables in addition to
  the default stress and strain variables that are used by all material models.
  Additional output may be requested for a material model, as in this example
- (
-\family typewriter
-see Section 
-\family default
-
+ (see Section 
 \begin_inset CommandInset ref
 LatexCommand ref
 reference "sec:Tutorial-Two-hexahedra"
@@ -816,9 +800,9 @@
 \begin_layout Plain Layout
 
 \family typewriter
-mu, lambda, density, 
+mu, lambda, density, alpha_yield
 \family default
-alpha_yield,
+,
 \family typewriter
  beta, alpha_flow 
 \end_layout
@@ -1224,234 +1208,111 @@
 \end_inset
 
 
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:material:output:components"
-
-\end_inset
-
-Order of components in tensor values in Xdmf files for 3-D material models.
- All nine tensor components are available even though the tensor is symmetric
- with six independent components.
 \end_layout
 
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="7" columns="2">
-<features tabularvalignment="middle">
-<column alignment="center" valignment="top" width="1.25in">
-<column alignment="center" valignment="top" width="2.25in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Index
+\begin_layout Subsection
+Stable time step
 \end_layout
 
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Component
+\begin_layout Standard
+PyLith computes the stable time step in both quasi-static and dynamic simulation
+s.
+ In quasi-static simulations the stability of the implicit time stepping
+ scheme does not depend on the time step; instead, the stable time step
+ is associated with the accuracy of the solution.
+ In purely elastic materials, the accuracy is independent of the time step,
+ so the stable time step is infinite.
+ For viscoelastic materials we set the stable time step to be 1/5 of the
+ relaxation time.
+ In quasi-static simulations we check the stable time step at every time
+ step.
 \end_layout
 
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+\begin_layout Standard
+In dynamic simulations the stability of the explicit time stepping scheme
+ integration does depend on the time step via the Courant-Friderichs-Lewy
+ condition 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Courant:etal:1967"
 
-\begin_layout Plain Layout
-0
-\end_layout
-
 \end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
-\begin_inset Formula $\epsilon_{xx}$
-\end_inset
+.
+ This condition states that the critical time step is the time it takes
+ for the P wave to travel across the shortest dimension of a cell.
+ In most cases this is the shortest edge length.
+ However, distorted cells which have relatively small areas in 2-D or relatively
+ small volumes in 3-D for the given edge lengths also require small time
+ steps due to the artificially high stiffness associated with the distorted
+ shape.
+ As a result, we set the stable time step to be the smaller of the shortest
+ edge length and a scaling factor times the radius of an inscribed circle
+ (in 2-D), 
+\begin_inset Formula 
+\begin{gather}
+dt=\min(e_{\mathit{min}},3.0r_{inscribed})\\
+r_{inscribed}=\sqrt{\frac{k(k-e_{0})(k-e_{1})(k-e_{2})}{k}}\\
+k=\frac{1}{2}(e_{0}+e_{1}+e_{2})
+\end{gather}
 
-, 
-\begin_inset Formula $\sigma_{xx}$
 \end_inset
 
+and sphere (in 3-D),
+\begin_inset Formula 
+\begin{gather}
+dt=\min(e_{\mathit{min}},6.38r_{inscribed})\\
+r_{inscribed}=3V/(A_{0}+A_{1}+A_{2}+A_{3}),
+\end{gather}
 
-\end_layout
-
 \end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
-1, 3
-\end_layout
-
+where 
+\begin_inset Formula $e_{i}$
 \end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
-\begin_inset Formula $\epsilon_{xy}$
+ denotes the length of edge 
+\begin_inset Formula $i$
 \end_inset
 
 , 
-\begin_inset Formula $\sigma_{xy}$
+\begin_inset Formula $A_{i}$
 \end_inset
 
-
-\end_layout
-
+ denotes the area of face 
+\begin_inset Formula $i$
 \end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
-2, 6
-\end_layout
-
+, and 
+\begin_inset Formula $V$
 \end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
-\begin_inset Formula $\epsilon_{xz}$
-\end_inset
-
-, 
-\begin_inset Formula $\sigma_{xz}$
-\end_inset
-
-
+ is the volume of the cell.
+ We determined the scaling factoring empirically using several benchmarks.
+ In dynamic simulations we check the stable time step only at the beginning
+ of the simulation.
+ That is, we assume the elastic properties and mesh do not change, so that
+ the stable time step is constant throughout the simulation.
 \end_layout
 
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-4
+\begin_layout Standard
+The stable time steps for each cell can be included in the output with the
+ other 
+\family typewriter
+cell_info_fields
+\family default
+.
+ For implicit time stepping the field is 
+\family typewriter
+stable_dt_implicit
+\family default
+ and for explicit time stepping the field is 
+\family typewriter
+stable_dt_explicit
+\family default
+.
 \end_layout
 
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\epsilon_{yy}$
-\end_inset
-
-, 
-\begin_inset Formula $\sigma_{yy}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-5, 7
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\epsilon_{yz}$
-\end_inset
-
-, 
-\begin_inset Formula $\sigma_{yz}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-8
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset Formula $\epsilon_{zz}$
-\end_inset
-
-, 
-\begin_inset Formula $\sigma_{zz}$
-\end_inset
-
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
 \begin_layout Section
 Elastic Material Models
 \end_layout
@@ -4378,7 +4239,7 @@
 
 \end_inset
 
-Where
+where
 \begin_inset Formula 
 \begin{gather}
 ^{t+\Delta t}T_{i}=\phantom{}^{t+\Delta t}S_{i}\:;\:\:1\leq i\leq3\label{eq:91}\\
@@ -4920,14 +4781,14 @@
 \begin_inset Formula $\theta$
 \end_inset
 
- into equation (
+ into Equation (
 \begin_inset CommandInset ref
 LatexCommand ref
 reference "eq:drucker:prager:haigh:westergaard"
 
 \end_inset
 
-) and casting it into the same form as equation (
+) and casting it into the same form as Equation (
 \begin_inset CommandInset ref
 LatexCommand ref
 reference "eq:101"
@@ -5945,7 +5806,7 @@
 
 \begin_layout Description
 fit_mohr_coulomb Fit to the yield surface to the Mohr-Coulomb model (default
- is a inscribed).
+ is inscribed).
 \end_layout
 
 \begin_layout Description

Modified: short/3D/PyLith/trunk/doc/userguide/preface.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/preface.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/preface.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,280 +1,280 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 1
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 2in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 2
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Chapter
-Preface
-\end_layout
-
-\begin_layout Section
-About This Document
-\end_layout
-
-\begin_layout Standard
-This document is organized into two parts.
- The first part begins with an introduction to PyLith and discusses the
- types of problems that PyLith can solve and how to run the software; the
- second part provides appendices and references.
-\end_layout
-
-\begin_layout Section
-Who Will Use This Documentation
-\end_layout
-
-\begin_layout Standard
-This documentation is aimed at two categories of users: scientists who prefer
- to use prepackaged and specialized analysis tools, and experienced computationa
-l Earth scientists.
- Of the latter, there are likely to be two classes of users: those who just
- run models, and those who modify the source code.
- Users who modify the source are likely to have familiarity with scripting,
- software installation, and programming, but are not necessarily professional
- programmers.
-\end_layout
-
-\begin_layout Section
-Citation
-\end_layout
-
-\begin_layout Standard
-The Computational Infrastructure for Geodynamics (CIG) 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-geodynamics.org
-\end_layout
-
-\end_inset
-
- is making this source code available to you at no cost in hopes that the
- software will enhance your research in geophysics.
- A number of individuals have contributed a significant portion of their
- careers toward the development of this software.
- It is essential that you recognize these individuals in the normal scientific
- practice by citing the appropriate peer-reviewed papers and making appropriate
- acknowledgements in talks and publications.
- At this time there are no refereed journal articles discussing the design
- and implementation of PyLith, so we request that you cite four AGU meeting
- abstracts associated with PyLith:
-\end_layout
-
-\begin_layout Itemize
-Williams, C.A., B.
- Aagaard, M.G.
- Knepley (2005), Development of software for studying earthquakes across
- multiple spatial and temporal scales by coupling quasi-static and dynamic
- simulations, 
-\emph on
-Eos Trans.
- AGU, 86
-\emph default
-(52), Fall Meet.
- Suppl., Abstract S53A-1072.
-\end_layout
-
-\begin_layout Itemize
-Williams, C.A.
- (2006), Development of a package for modeling stress in the lithosphere,
- 
-\emph on
-Eos Trans.
- AGU, 87
-\emph default
-(36), Jt.
- Assem.
- Suppl., Abstract T24A-01 Invited.
-\end_layout
-
-\begin_layout Itemize
-Aagaard, B., C.
- Williams, M.
- Knepley (2007), PyLith: A finite-element code for modeling quasi-static
- and dynamic crustal deformation, 
-\emph on
-Eos Trans.
- AGU, 8
-\emph default
-8(52), Fall Meet.
- Suppl., Abstract T21B-0592.
-\end_layout
-
-\begin_layout Itemize
-Aagaard, B., C.
- Williams, M.
- Knepley (2008), PyLith: A finite-element code for modeling quasi-static
- and dynamic crustal deformation, 
-\emph on
-Eos Trans.
- AGU, 89
-\emph default
-(53), Fall Meet.
- Suppl., Abstract T41A-1925.
-\end_layout
-
-\begin_layout Standard
-To cite this manual, use:
-\end_layout
-
-\begin_layout Itemize
-Aagaard, B., S.
- Kientz, M.
- Knepley, S.
- Somala, L.
- Strand, and C.
- Williams (2011), 
-\emph on
-PyLith User Manual, Version 1.7.1.
-
-\emph default
- Davis, CA: Computational Infrastructure of Geodynamics.
-\begin_inset Newline newline
-\end_inset
-
-URL: geodynamics.org/cig/software/pylith/pylith_manual-1.7.pdf
-\end_layout
-
-\begin_layout Section
-Support
-\end_layout
-
-\begin_layout Standard
-Current PyLith development is supported by the CIG, and internal GNS Science
- 
-\begin_inset Flex URL
-status open
-
-\begin_layout Plain Layout
-
-www.gns.cri.nz
-\end_layout
-
-\end_inset
-
- and U.S.
- Geological Survey 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-www.usgs.gov
-\end_layout
-
-\end_inset
-
- funding.
- Pyre development was funded by the Department of Energy's 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-www.doe.gov/engine/content.do
-\end_layout
-
-\end_inset
-
- Advanced Simulation and Computing program and the National Science Foundation's
- Information Technology Research (ITR) program.
-\end_layout
-
-\begin_layout Standard
-This material is based upon work supported by the National Science Foundation
- under Grants No.
- 0313238, 0745391, and EAR-0949446.
- Any opinions, findings, and conclusions or recommendations expressed in
- this material are those of the author(s) and do not necessarily reflect
- the views of the National Science Foundation.
-\end_layout
-
-\begin_layout Section
-Request for Comments
-\end_layout
-
-\begin_layout Standard
-Your suggestions and corrections can only improve this documentation.
- Please report any errors, inaccuracies, or typos to the CIG Short-Term
- Tectonics email list 
-\begin_inset Flex URL
-status open
-
-\begin_layout Plain Layout
-
-cig-short at geodynamics.org
-\end_layout
-
-\end_inset
-
-.
- 
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 1
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 2in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 2
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Chapter
+Preface
+\end_layout
+
+\begin_layout Section
+About This Document
+\end_layout
+
+\begin_layout Standard
+This document is organized into two parts.
+ The first part begins with an introduction to PyLith and discusses the
+ types of problems that PyLith can solve and how to run the software; the
+ second part provides appendices and references.
+\end_layout
+
+\begin_layout Section
+Who Will Use This Documentation
+\end_layout
+
+\begin_layout Standard
+This documentation is aimed at two categories of users: scientists who prefer
+ to use prepackaged and specialized analysis tools, and experienced computationa
+l Earth scientists.
+ Of the latter, there are likely to be two classes of users: those who just
+ run models, and those who modify the source code.
+ Users who modify the source are likely to have familiarity with scripting,
+ software installation, and programming, but are not necessarily professional
+ programmers.
+\end_layout
+
+\begin_layout Section
+Citation
+\end_layout
+
+\begin_layout Standard
+The Computational Infrastructure for Geodynamics (CIG) 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+geodynamics.org
+\end_layout
+
+\end_inset
+
+ is making this source code available to you at no cost in hopes that the
+ software will enhance your research in geophysics.
+ A number of individuals have contributed a significant portion of their
+ careers toward the development of this software.
+ It is essential that you recognize these individuals in the normal scientific
+ practice by citing the appropriate peer-reviewed papers and making appropriate
+ acknowledgements in talks and publications.
+ At this time there are no refereed journal articles discussing the design
+ and implementation of PyLith, so we request that you cite four AGU meeting
+ abstracts associated with PyLith:
+\end_layout
+
+\begin_layout Itemize
+Williams, C.A., B.
+ Aagaard, M.G.
+ Knepley (2005), Development of software for studying earthquakes across
+ multiple spatial and temporal scales by coupling quasi-static and dynamic
+ simulations, 
+\emph on
+Eos Trans.
+ AGU, 86
+\emph default
+(52), Fall Meet.
+ Suppl., Abstract S53A-1072.
+\end_layout
+
+\begin_layout Itemize
+Williams, C.A.
+ (2006), Development of a package for modeling stress in the lithosphere,
+ 
+\emph on
+Eos Trans.
+ AGU, 87
+\emph default
+(36), Jt.
+ Assem.
+ Suppl., Abstract T24A-01 Invited.
+\end_layout
+
+\begin_layout Itemize
+Aagaard, B., C.
+ Williams, M.
+ Knepley (2007), PyLith: A finite-element code for modeling quasi-static
+ and dynamic crustal deformation, 
+\emph on
+Eos Trans.
+ AGU, 8
+\emph default
+8(52), Fall Meet.
+ Suppl., Abstract T21B-0592.
+\end_layout
+
+\begin_layout Itemize
+Aagaard, B., C.
+ Williams, M.
+ Knepley (2008), PyLith: A finite-element code for modeling quasi-static
+ and dynamic crustal deformation, 
+\emph on
+Eos Trans.
+ AGU, 89
+\emph default
+(53), Fall Meet.
+ Suppl., Abstract T41A-1925.
+\end_layout
+
+\begin_layout Standard
+To cite this manual, use:
+\end_layout
+
+\begin_layout Itemize
+Aagaard, B., S.
+ Kientz, M.
+ Knepley, S.
+ Somala, L.
+ Strand, and C.
+ Williams (2011), 
+\emph on
+PyLith User Manual, Version 1.8.0.
+
+\emph default
+ Davis, CA: Computational Infrastructure of Geodynamics.
+\begin_inset Newline newline
+\end_inset
+
+URL: geodynamics.org/cig/software/pylith/pylith_manual-1.8.0.pdf
+\end_layout
+
+\begin_layout Section
+Support
+\end_layout
+
+\begin_layout Standard
+Current PyLith development is supported by the CIG, and internal GNS Science
+ 
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+www.gns.cri.nz
+\end_layout
+
+\end_inset
+
+ and U.S.
+ Geological Survey 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+www.usgs.gov
+\end_layout
+
+\end_inset
+
+ funding.
+ Pyre development was funded by the Department of Energy's 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+www.doe.gov/engine/content.do
+\end_layout
+
+\end_inset
+
+ Advanced Simulation and Computing program and the National Science Foundation's
+ Information Technology Research (ITR) program.
+\end_layout
+
+\begin_layout Standard
+This material is based upon work supported by the National Science Foundation
+ under Grants No.
+ 0313238, 0745391, and EAR-0949446.
+ Any opinions, findings, and conclusions or recommendations expressed in
+ this material are those of the author(s) and do not necessarily reflect
+ the views of the National Science Foundation.
+\end_layout
+
+\begin_layout Section
+Request for Comments
+\end_layout
+
+\begin_layout Standard
+Your suggestions and corrections can only improve this documentation.
+ Please report any errors, inaccuracies, or typos to the CIG Short-Term
+ Tectonics email list 
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+cig-short at geodynamics.org
+\end_layout
+
+\end_inset
+
+.
+ 
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/runpylith/runpylith.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/runpylith/runpylith.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/runpylith/runpylith.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,5601 +1,5883 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 1
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 2in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 2
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Chapter
-Running PyLith
-\end_layout
-
-\begin_layout Standard
-There are essentially three major inputs needed to run a problem with PyLith:
-\end_layout
-
-\begin_layout Enumerate
-A set of parameters describing the problem.
- These parameters describe the type of problem to be run, solver information,
- time-stepping information, boundary conditions, materials, etc.
- This information can be provided from the command-line or by using a 
-\family typewriter
-.cfg
-\family default
- or 
-\family typewriter
-.pml
-\family default
- file.
-\end_layout
-
-\begin_layout Enumerate
-Mesh information.
- This includes the topology of the finite-element mesh (coordinates of vertices
- and how the vertices are connected into cells), a material identifier for
- each cell, and sets of vertices associated with boundary conditions, faults,
- and output (for subsets of the mesh).
- This information can be provided using the PyLith mesh ASCII format (see
- Chapter 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:Tutorials"
-
-\end_inset
-
- for examples and Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:MeshIOAscii"
-
-\end_inset
-
- for the format specification) or by importing the information from the
- LaGriT or CUBIT meshing packages (see Chapter 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:Tutorials"
-
-\end_inset
-
- for examples).
-\end_layout
-
-\begin_layout Enumerate
-Databases specifying the material property values and boundary condition
- values to be used.
- Arbitrarily complex spatial variations in boundary and fault conditions
- and material properties may be given in the spatial database (see Chapter
- 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:Tutorials"
-
-\end_inset
-
- for examples and Appendix 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Spatialdata:SimpleIOAscii"
-
-\end_inset
-
- for the format specification).
-\end_layout
-
-\begin_layout Section
-Defining the Simulation
-\end_layout
-
-\begin_layout Standard
-The parameters for PyLith are specified as a hierarchy or tree of modules.
- The application assembles the hierarchy of modules from user input and
- then calls the 
-\family typewriter
-main
-\family default
- function in the top-level module in the same manner as a C or C++ program.
- The behavior of the application is determined by the modules included in
- the hierarchy as specified by the user.
- The Pyre framework provides the interface for defining this hierarchy.
- Pyre properties correspond to simple settings in the form of strings, integers,
- and real numbers.
- Pyre facilities correspond to software modules.
- Facilities may have their own facilities (branches in the tree) and any
- number of properties.
- See Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:Pyre:Architecture"
-
-\end_inset
-
- for the general concept of Pyre facilities and properties.
- The top-level object is the PyLith application with three facilities: 
-\family typewriter
-mesher
-\family default
-, 
-\family typewriter
-problem
-\family default
-, and 
-\family typewriter
-petsc
-\family default
-.
- The 
-\family typewriter
-mesher
-\family default
- specifies how to import the mesh, the 
-\family typewriter
-problem
-\family default
- specifies the physical properties, boundary conditions, etc., and 
-\family typewriter
-petsc
-\family default
- is used to specify PETSc settings.
- Appendix 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:components"
-
-\end_inset
-
- contains a list of the components provided by PyLith and spatialdata.
-\end_layout
-
-\begin_layout Subsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:setting:parameters"
-
-\end_inset
-
-Setting PyLith Parameters
-\end_layout
-
-\begin_layout Standard
-There are several methods for setting input parameters for the 
-\family typewriter
-pylith
-\family default
- executable: via the command line or by using a text file in 
-\family typewriter
-.cfg
-\family default
- or 
-\family typewriter
-.pml
-\family default
- format.
- Both facilities and properties have default values provided, so you only
- need to set values when you want to deviate from the default behavior.
-\end_layout
-
-\begin_layout Subsubsection
-Units
-\end_layout
-
-\begin_layout Standard
-All dimensional parameters require units.
- The units are specified using Python and FORTRAN syntax, so square meters
- is m**2.
- Whitespace is not allowed in the string, for units and dimensioned quantities
- are multiplied by the units string; for example, two meters per second
- is 2.0*m/s.
- Available units are shown in Table 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:pyre:units"
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:pyre:units"
-
-\end_inset
-
-Pyre supported units.
- Aliases are in parentheses.
-\end_layout
-
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="5" columns="2">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0.9in">
-<column alignment="left" valignment="top" width="4in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Scale
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Available Units
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-length
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-meter (m), micrometer (um, micron), millimeter (mm), centimeter (cm), kilometer
- (km), inch, foot, yard, mile
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-time
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-second (s), nanosecond (ns), microsecond (us), millisecond (ms), minute,
- hour, day, year
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-mass
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-kilogram (kg), gram (g), centigram (cg), milligram (mg), ounce, pound, ton
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-pressure
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-pascal (Pa), kPa, MPa, GPa, bar, millibar, atmosphere (atm)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Using the Command Line
-\end_layout
-
-\begin_layout Standard
-Pyre uses the following syntax to change properties from the command line.
- To change the value of a property of a component, use:
-\end_layout
-
-\begin_layout LyX-Code
-
-\family typewriter
---[component].[property]=[value]
-\end_layout
-
-\begin_layout Standard
-Each component is attached to a facility, so the option above can also be
- written as: 
-\end_layout
-
-\begin_layout LyX-Code
-
-\family typewriter
---[facility].[property]=[value]
-\end_layout
-
-\begin_layout Standard
-Each facility has a default component attached to it.
- A different component can be attached to a facility by:
-\end_layout
-
-\begin_layout LyX-Code
-
-\family typewriter
---[facility]=[new_component] 
-\end_layout
-
-\begin_layout Standard
-PyLith's command-line arguments can control Pyre and PyLith properties and
- facilities, MPI settings, and PETSc settings.
- You can get more information on the available options by typing
-\end_layout
-
-\begin_layout LyX-Code
-
-\family typewriter
-$ pylith --help
-\end_layout
-
-\begin_layout Standard
-All PyLith-related properties are associated with the 
-\family typewriter
-pylithapp
-\family default
- component.
- You can get a list of all of these top-level properties along with a descriptio
-n of what they do by running PyLith with the 
-\family typewriter
---help-properties
-\family default
- command-line argument.
- To get information on user-configurable facilities and components, you
- can run PyLith with the 
-\family typewriter
---help-components
-\family default
- command-line argument.
- To find out about the properties associated with a given component, you
- can run PyLith with the 
-\family typewriter
---[component].help-properties
-\family default
- flag:
-\end_layout
-
-\begin_layout LyX-Code
-$ pylith --problem.help-properties
-\end_layout
-
-\begin_layout Standard
-Each component may also have sub-components associated with it:
-\end_layout
-
-\begin_layout LyX-Code
-$ pylith -- problem.help-components
-\end_layout
-
-\begin_layout Standard
-By starting at the top-level components, you can determine the components
- and properties at each level by working down to lower-level components:
-\end_layout
-
-\begin_layout LyX-Code
-$ pylith --problem.bc.help-components
-\end_layout
-
-\begin_layout LyX-Code
-$ pylith --problem.bc.help-properties
-\end_layout
-
-\begin_layout Standard
-Using the 
-\family typewriter
---help-components
-\family default
- and 
-\family typewriter
---help-properties
-\family default
- flags for the various components and sub-components is a good way to discover
- potential problems in a simulation.
-\end_layout
-
-\begin_layout Subsubsection
-Using a 
-\family typewriter
-.cfg
-\family default
- File
-\end_layout
-
-\begin_layout Standard
-Entering all those parameters via the command line involves the risk of
- typographical errors, which can lead to undesired results.
- You will generally find it easier to write a brief 
-\family typewriter
-.cfg
-\family default
- input file that contains the parameters.
- This file has a format similar to a Windows INI file.
- The file is composed of one or more sections which are formatted as follows:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.subcomponent1.subcomponent2]
-\end_layout
-
-\begin_layout LyX-Code
-# this is a comment
-\end_layout
-
-\begin_layout LyX-Code
-property1 = value1
-\end_layout
-
-\begin_layout LyX-Code
-property2 = value2 ; this is another comment
-\end_layout
-
-\begin_layout Standard
-We strongly recommend that you use 
-\family typewriter
-.cfg
-\family default
- files for your work.
- The files are syntax-colored in the vim editor.
-\end_layout
-
-\begin_layout Subsubsection
-Using a 
-\family typewriter
-.pml
-\family default
- File
-\end_layout
-
-\begin_layout Standard
-A 
-\family typewriter
-.pml
-\family default
- file is an XML file that specifies parameter values in a highly structured
- format.
- It is composed of nested sections which are formatted as follows:
-\end_layout
-
-\begin_layout LyX-Code
-<component name='component1'>
-\end_layout
-
-\begin_layout LyX-Code
-    <component name='component2'>
-\end_layout
-
-\begin_layout LyX-Code
-        <property name='property1'>value1</property>
-\end_layout
-
-\begin_layout LyX-Code
-        <property name='property2'>value2</property>
-\end_layout
-
-\begin_layout LyX-Code
-    </component>
-\end_layout
-
-\begin_layout LyX-Code
-</component>
-\end_layout
-
-\begin_layout Standard
-XML files are intended to be read and written by machines, not edited manually
- by humans.
- The 
-\family typewriter
-.pml
-\family default
- file format is intended for applications in which PyLith input files are
- generated by another program, e.g., a GUI, web application, or a high-level
- structured editor.
- This file format will not be discussed further here, but if you are interested
- in using 
-\family typewriter
-.pml
-\family default
- files, note that 
-\family typewriter
-.pml
-\family default
- files and 
-\family typewriter
-.cfg
-\family default
- files can be used interchangeably; in the following discussion, a file
- with a 
-\family typewriter
-.pml
-\family default
- extension can be substituted anywhere a 
-\family typewriter
-.cfg
-\family default
- file can be used.
-\end_layout
-
-\begin_layout Subsubsection
-Specification and Placement of Configuration Files
-\end_layout
-
-\begin_layout Standard
-Configuration files may be specified on the command line:
-\end_layout
-
-\begin_layout LyX-Code
-$ pylith example.cfg
-\end_layout
-
-\begin_layout Standard
-In addition, the Pyre framework searches for configuration files named 
-\family typewriter
-pylithapp.cfg
-\family default
- in several predefined locations.
- You may put settings in any or all of these locations, depending on the
- scope you want the settings to have:
-\end_layout
-
-\begin_layout Enumerate
-
-\family typewriter
-$PREFIX/etc/pylithapp.cfg
-\family default
-, for system-wide settings;
-\end_layout
-
-\begin_layout Enumerate
-
-\family typewriter
-$HOME/.pyre/pylithapp/pylithapp.cfg
-\family default
-, for user settings and preferences;
-\end_layout
-
-\begin_layout Enumerate
-the current directory (
-\family typewriter
-./pylithapp.cfg
-\family default
-), for local overrides.
- 
-\end_layout
-
-\begin_layout Standard
-Parameters given directly on the command line will override any input contained
- in a configuration file.
- Configuration files given on the command line override all others.
- The 
-\family typewriter
-pylithapp.cfg
-\family default
- files placed in (3) will override those in (2), (2) overrides (1), and
- (1) overrides only the built-in defaults.
-\end_layout
-
-\begin_layout Standard
-All of the example problems are set up using configuration files in the
- example directory, and specific problems are defined by including the appropria
-te configuration file on the command-line.
- Referring to the directory 
-\family typewriter
-examples/twocells/twohex8
-\family default
-, the following configuration files are present:
-\end_layout
-
-\begin_layout LyX-Code
-axialdisp.cfg
-\end_layout
-
-\begin_layout LyX-Code
-dislocation.cfg
-\end_layout
-
-\begin_layout LyX-Code
-pylithapp.cfg
-\end_layout
-
-\begin_layout LyX-Code
-sheardisp.cfg
-\end_layout
-
-\begin_layout Standard
-The settings in pylithapp.cfg will be read automatically, and additional
- settings are included by specifying one of the other files on the command-line:
-\end_layout
-
-\begin_layout LyX-Code
-$ pylith axialdisp.cfg
-\end_layout
-
-\begin_layout Standard
-If you want to see what settings are being used, you can either examine
- the 
-\family typewriter
-.cfg
-\family default
- files, or use the help flags as described above:
-\end_layout
-
-\begin_layout LyX-Code
-$ pylith axialdisp.cfg --problem.help-components
-\end_layout
-
-\begin_layout LyX-Code
-$ pylith axialdisp.cfg --problem.help-properties
-\end_layout
-
-\begin_layout LyX-Code
-$ pylith axialdisp.cfg --problem.bc.help-components
-\end_layout
-
-\begin_layout LyX-Code
-$ pylith axialdisp.cfg --problem.bc.help-properties
-\end_layout
-
-\begin_layout Standard
-This is generally a more useful way of determining problem settings, since
- it includes default values as well as those that have been specified in
- the 
-\family typewriter
-.cfg
-\family default
- file.
-\end_layout
-
-\begin_layout Subsubsection
-List of PyLith Parameters (
-\family typewriter
-pylithinfo
-\family default
-)
-\end_layout
-
-\begin_layout Standard
-The Python application 
-\family typewriter
-pylithinfo
-\family default
- writes all of the current parameters to a text file.
- The default name of the text file is 
-\family typewriter
-pylith_parameters.txt
-\family default
-.
- The usage synopsis is
-\end_layout
-
-\begin_layout LyX-Code
-$ pylithinfo [--verbose] [--fileout=pylith_parameters.txt] [PyLith args]
-\end_layout
-
-\begin_layout Standard
-where 
-\family typewriter
---verbose
-\family default
- (or 
-\family typewriter
--v
-\family default
-) turns on printing the descriptions of the properties and components as
- well as the location where the current value was set, and 
-\family typewriter
---fileout=pylith_parameters.txt
-\family default
- (or 
-\family typewriter
--o pylith_parameters.txt
-\family default
-) sets the name of the output file.
- The lines in the text file are indented to show the hierarchy of the properties
- and components.
- 
-\end_layout
-
-\begin_layout Subsection
-Mesh Information (
-\family typewriter
-mesher
-\family default
-)
-\end_layout
-
-\begin_layout Standard
-Geometrical and topological information for the finite element mesh may
- be provided by exporting an Exodus II format file from CUBIT, by exporting
- a GMV file and an accompanying Pset file from LaGriT, or by specifying
- the information in PyLith mesh ASCII format.
- See Chapter 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:Tutorials"
-
-\end_inset
-
- for examples.
-\end_layout
-
-\begin_layout Standard
-PyLith supports linear cells in 1D (Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:1D-linear-elements"
-
-\end_inset
-
-), 2D (Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:2D-linear-elements"
-
-\end_inset
-
-), and 3D (Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:3D-linear-elements"
-
-\end_inset
-
-).
- The vertex ordering must follow the convention shown in Figures 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:1D-linear-elements"
-
-\end_inset
-
--
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:3D-linear-elements"
-
-\end_inset
-
-.
- Quadratic cells are also supported, but at present the only method for
- using these cells in PyLith is using PyLith ASCII format.
- PyLith does not yet support automatic generation of a quadratic mesh from
- the linear meshes created by CUBIT or LaGriT.
-\end_layout
-
-\begin_layout Standard
-The mesh information defines the vertex coordinates and specifies the vertices
- composing each cell in the mesh.
- The mesh information must also define at least one set of vertices for
- which displacement (Dirichlet) boundary conditions will be provided.
- In most realistic problems, there will be several vertex groups, each with
- a unique identifying label.
- For example, one group might define a surface of the mesh where displacement
- (Dirichlet) boundary conditions will be applied, another might define a
- surface where traction (Neumann) boundary conditions will be applied, while
- a third might specify a surface that defines a fault.
- Similarly, the mesh information contains cell labels that define the material
- type for each cell in the mesh.
- For a mesh with a single material type, there will only be a single label
- for every cell in the mesh.
- See Chapters 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:material:models"
-
-\end_inset
-
- and 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:boundary:interface:conditions"
-
-\end_inset
-
- for more detailed discussions of setting the materials and boundary conditions.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Graphics
-	filename figs/bar2.eps
-
-\end_inset
-
- 
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Linear bar cell available for 1D problems.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:1D-linear-elements"
-
-\end_inset
-
- 
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Graphics
-	filename figs/tri3.eps
-
-\end_inset
-
-
-\begin_inset ERT
-status open
-
-\begin_layout Plain Layout
-
-
-\backslash
-hspace*{0.5in}
-\end_layout
-
-\end_inset
-
-
-\begin_inset Graphics
-	filename figs/quad4.eps
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Linear cells available for 2D problems are the triangle (left) and the quadrilat
-eral (right).
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:2D-linear-elements"
-
-\end_inset
-
- 
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Graphics
-	filename figs/tet4.eps
-
-\end_inset
-
-
-\begin_inset ERT
-status open
-
-\begin_layout Plain Layout
-
-
-\backslash
-hspace*{0.5in}
-\end_layout
-
-\end_inset
-
-
-\begin_inset Graphics
-	filename figs/hex8.eps
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Linear cells available for 3D problems are the tetrahedron (left) and the
- hexahedron (right).
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:3D-linear-elements"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Mesh Importer
-\end_layout
-
-\begin_layout Standard
-The default mesher component is MeshImporter, which provides the capabilities
- of reading the mesh from files.
- The MeshImporter has several properties and facilities:
-\end_layout
-
-\begin_layout Description
-reorder_mesh Reorder the vertices and cells using the reverse Cuthill-McKee
- algorithm (default is False).
-\end_layout
-
-\begin_layout Description
-reader Reader for a given type of mesh (default is MeshIOAscii).
-\end_layout
-
-\begin_layout Description
-distributor Handles distribution of the mesh among processors.
-\end_layout
-
-\begin_layout Description
-refiner Perform global uniform mesh refinement after distribution among
- processors (default is False).
-\end_layout
-
-\begin_layout Standard
-Reordering the mesh so that vertices and cells connected topologically also
- reside close together in memory improves overall performance and can improve
- solver performance as well.
-\end_layout
-
-\begin_layout Quote
-
-\color red
-Note:
-\color inherit
- The coordinate system associated with the mesh must be a Cartesian coordinate
- system.
- This includes generic Cartesian coordinate systems as well as geographic
- projections.
-\end_layout
-
-\begin_layout Subsubsection
-MeshIOAscii
-\end_layout
-
-\begin_layout Standard
-The MeshIOAscii object is intended for reading small, simple ASCII files
- containing a mesh constructed by hand.
- We use this file format extensively in the examples.
- Appendix 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:MeshIOAscii"
-
-\end_inset
-
- describes the format of the files.
- The properties and facilities of the MeshIOAscii object include:
-\end_layout
-
-\begin_layout Description
-filename Name of the mesh file.
-\end_layout
-
-\begin_layout Description
-coordsys Coordinate system associated with the mesh.
-\end_layout
-
-\begin_layout Subsubsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:MeshIOCubit"
-
-\end_inset
-
-MeshIOCubit
-\end_layout
-
-\begin_layout Standard
-The MeshIOCubit object reads the NetCDF Exodus II files output from CUBIT.
- Beginning with CUBIT 11.0, the names of the nodesets are included in the
- Exodus II files and PyLith can use these nodeset names or revert to using
- the nodeset ids.
- The properties and facilities associated with the MeshIOCubit object are:
-\end_layout
-
-\begin_layout Description
-filename Name of the Exodus II file.
-\end_layout
-
-\begin_layout Description
-use_nodeset_names Identify nodesets by name rather than id (default is True).
-\end_layout
-
-\begin_layout Description
-coordsys Coordinate system associated with the mesh.
-\end_layout
-
-\begin_layout Subsubsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:MeshIOLagrit"
-
-\end_inset
-
-MeshIOLagrit
-\end_layout
-
-\begin_layout Standard
-The MeshIOLagrit object is used to read ASCII and binary GMV and PSET files
- output from LaGriT.
- PyLith will automatically detect whether the files are ASCII or binary.
- We attempt to provide support for experimental 64-bit versions of LaGriT
- via flags indicating whether the FORTRAN code is using 32-bit or 64-bit
- integers.
- The MeshIOLagrit properties and facilities are:
-\end_layout
-
-\begin_layout Description
-filename_gmv Name of GMV file.
-\end_layout
-
-\begin_layout Description
-filename_pset Name of the PSET file.
-\end_layout
-
-\begin_layout Description
-flip_endian Flip the endian of values when reading binary files (default
- is False).
-\end_layout
-
-\begin_layout Description
-io_int32 Flag indicating that PSET files use 32-bit integers (default is
- True).
-\end_layout
-
-\begin_layout Description
-record_header_32bt Flag indicating FORTRAN record header is 32-bit (default
- is True)
-\end_layout
-
-\begin_layout Description
-coordsys Coordinate system associated with mesh.
-\end_layout
-
-\begin_layout Subsubsection
-Distributor
-\end_layout
-
-\begin_layout Standard
-The distributor users a partitioner to compute which cells should be placed
- on each processor, computes the overlap among the processors, and then
- distributes the mesh among the processors.
- The properties and facilities of the Distributor include:
-\end_layout
-
-\begin_layout Description
-partitioner Choice of partitioner (
-\begin_inset Quotes eld
-\end_inset
-
-parmetis
-\begin_inset Quotes erd
-\end_inset
-
- or 
-\begin_inset Quotes eld
-\end_inset
-
-chaco
-\begin_inset Quotes erd
-\end_inset
-
-, default is 
-\begin_inset Quotes eld
-\end_inset
-
-chaco
-\begin_inset Quotes erd
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Description
-writer_partition Flag indicating that the partition information should be
- written to a file (default is False).
-\end_layout
-
-\begin_layout Description
-data_writer Writer for partition information (default is DataWriterVTKMesh
- for VTK output).
-\end_layout
-
-\begin_layout Standard
-ParMETIS is not included in the PyLith binaries due to licensing issues.
-\end_layout
-
-\begin_layout Subsubsection
-Refiner
-\end_layout
-
-\begin_layout Standard
-The refiner is used to decrease node spacing by a factor of two by subdividing
- each cell.
- In a 2D triangular mesh a node is inserted at the midpoint of each edge,
- splitting each cell into four cells (see Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:uniform:refinement:2x"
-
-\end_inset
-
-).
- In a 2D quadrilateral mesh a node is inserted at the midpoint of each edge
- and at the centroid of the cell, splitting each cell into four cells.
- In a 3D tetrahedral mesh a node is inserted at the midpoint of each edge,
- splitting each cell into eight cells.
- In a 3D hexahedral mesh a node is inserted at the midpoint of each edge,
- the centroid of each face, and at the centroid of the cell, splitting each
- cell into eight cells.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Graphics
-	filename figs/refinement2x.eps
-	scale 125
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Global uniform mesh refinement of 2D and 3D linear cells.
- The blue lines and orange circles identify the edges and vertices in the
- original cells.
- The purple lines and green circles identify the new edges and vertices
- added to the original cells to refine the mesh by a factor of two.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:uniform:refinement:2x"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-Refinement occurs after distribution of the mesh among processors.
- This allows one to run much larger simulations by (1) permitting the mesh
- generator to construct a mesh with a node spacing twice as large as that
- needed in the simulation and (2) operations performed in serial during
- the simulation setup phase, such as, adjusting the topology to insert cohesive
- cells and distribution of the mesh among processors uses this much smaller
- coarse mesh.
- For 2D problems the global mesh refinement increases the maximum problem
- size by a factor of four, and for 3D problems it increases the maximum
- problem size by a factor of eight.
-\end_layout
-
-\begin_layout Subsection
-Problem Specification (
-\family typewriter
-problem
-\family default
-)
-\end_layout
-
-\begin_layout Standard
-The problem component specifies the basic parameters of the simulation,
- including the physical properties, the boundary conditions, and interface
- conditions (faults).
- The current release of PyLith contains two types of problem, 
-\family typewriter
-TimeDependent
-\family default
- for use in static, quasi-static, and dynamic simulations and 
-\family typewriter
-GreensFns
-\family default
- for computing static Green's functions.
- The general facilities include:
-\end_layout
-
-\begin_layout Description
-normalizer Scales used to nondimensionalize the problem (default is NondimElasti
-cQuasistatic).
-\end_layout
-
-\begin_layout Description
-materials Array of materials comprising the domain (default is 
-\family typewriter
-[material]
-\family default
-).
-\end_layout
-
-\begin_layout Description
-bc Array of boundary conditions (default is none).
-\end_layout
-
-\begin_layout Description
-interfaces Array of interface conditions, i.e., faults (default is none).
-\end_layout
-
-\begin_layout Description
-gravity_field Gravity field used to construct body forces (default is none).
-\end_layout
-
-\begin_layout Standard
-The properties for each material group are:
-\end_layout
-
-\begin_layout Description
-dimension Spatial dimension of the problem (default is 3)
-\end_layout
-
-\begin_layout Standard
-An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file for a problem is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent]
-\end_layout
-
-\begin_layout LyX-Code
-dimension = 3
-\end_layout
-
-\begin_layout LyX-Code
-normalizer = spatialdata.units.NondimElasticQuasistatic
-\end_layout
-
-\begin_layout LyX-Code
-materials = [elastic,viscoelastic]
-\end_layout
-
-\begin_layout LyX-Code
-bc = [boundary_east,boundary_bottom,boundary_west]
-\end_layout
-
-\begin_layout LyX-Code
-interfaces = [SanAndreas,SanJacinto]
-\end_layout
-
-\begin_layout LyX-Code
-gravity_field = spatialdata.spatialdb.GravityField
-\end_layout
-
-\begin_layout Subsubsection
-Nondimensionalization
-\end_layout
-
-\begin_layout Standard
-PyLith nondimensionalizes all parameters provided by the user so that the
- simulation solves the equations using nondimensional quantities.
- This permits application of PyLith to problems across a vast range of spatial
- and temporal scales.
- The scales used to nondimensionalize the problem are length, pressure,
- density, and time.
- PyLith provides two normalizer objects to make it easy to provide reasonable
- scales for the nondimensionalization.
- The 
-\family typewriter
-NondimElasticQuasistatic
-\family default
- normalizer has the following properties:
-\end_layout
-
-\begin_layout Description
-length_scale Length to nondimensionalize length (default is 1.0 km).
-\end_layout
-
-\begin_layout Description
-shear_modulus Shear modulus to nondimensionalize pressure (default is 3.0e+10
- Pa).
-\end_layout
-
-\begin_layout Description
-relaxation_time Relaxation time to nondimensionalize time (default is 1.0
- year).
-\end_layout
-
-\begin_layout Standard
-An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file for a problem is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.normalizer]
-\end_layout
-
-\begin_layout LyX-Code
-length_scale = 1.0*km
-\end_layout
-
-\begin_layout LyX-Code
-shear_modules = 3.0e+10*Pa
-\end_layout
-
-\begin_layout LyX-Code
-relaxation_time = 1.0*yr
-\end_layout
-
-\begin_layout Standard
-The 
-\family typewriter
-NondimElasticDynamic
-\family default
- normalizer has the following properties:
-\end_layout
-
-\begin_layout Description
-shear_wave_speed Shear wave speed used to nondimensionalize length and pressure
- (default is 3.0 km/s).
-\end_layout
-
-\begin_layout Description
-mass_density Mass density to nondimensionalize density and pressure (default
- is 3.0e+3 kg/m
-\begin_inset Formula $^{3}$
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Description
-wave_period Period of seismic waves used to nondimensionalize time (default
- is 1.0 s).
-\end_layout
-
-\begin_layout Standard
-An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file for a problem is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.normalizer]
-\end_layout
-
-\begin_layout LyX-Code
-shear_wave_speed = 3.0*km/s
-\end_layout
-
-\begin_layout LyX-Code
-mass_density = 3.0e+3*kg/m**3
-\end_layout
-
-\begin_layout LyX-Code
-wave_period = 1.0*s
-\end_layout
-
-\begin_layout Subsection
-Finite-Element Integration Settings
-\end_layout
-
-\begin_layout Standard
-PyLith uses numerical quadrature to evaluate the finite-element integrals
- for the residual and system Jacobian (see Chapter 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:Governing-Equations"
-
-\end_inset
-
-).
- PyLith employs FIAT (finite element automatic tabulator) to compute the
- basis functions and their derivatives at the quadrature points for various
- quadrature schemes and cell shapes.
- The parameters for Lagrange cells (lines, quadrilaterals, hexahedra) are
- specified using the FIATLagrange object, whereas the parameters for Simplex
- cells (lines, triangles, tetrahedra) are specified using the FIATSimplex
- object.
- Both objects use the same set of parameters and PyLith will setup the basis
- functions and quadrature scheme appropriately for the two families of cells.
- The quadrature scheme and basis functions must be set for each material
- and boundary condition involving finite-element integrations (Dirichlet
- boundary conditions are constraints and do not involve integrations).
- Furthermore, the integration schemes can be set independently.
- The current version of PyLith supports basis functions with linear variations
- in the field (P1); support for higher order cells will be added in the
- future.
- The properties for the FIATLagrange and FIATSimplex objects are
-\end_layout
-
-\begin_layout Description
-dimension Dimension of the cell (0,1,2,3; default is 3).
-\end_layout
-
-\begin_layout Description
-degree Degree of the finite-element cell (default is 1).
-\end_layout
-
-\begin_layout Description
-order Order of quadrature rule (default is degree+1); hardwired to be equal
- to degree for faults.
-\end_layout
-
-\begin_layout Description
-collocate_quad Collocate quadrature points with vertices (default is False);
- hardwired to True for faults.
-\end_layout
-
-\begin_layout Standard
-See Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:material:parameters"
-
-\end_inset
-
- for an example of setting these properties for a material.
-\end_layout
-
-\begin_layout Subsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:petsc:options"
-
-\end_inset
-
-PETSc Settings (
-\family typewriter
-petsc
-\family default
-)
-\end_layout
-
-\begin_layout Standard
-In quasti-static problems with implicit time-stepping, PyLith relies on
- PETSc for the linear algebra computations, including linear Krylov subspace
- solvers and nonlinear solvers.
- For dynamic problems, lumping the mass matrix and using explicit time-stepping
- is much more efficient; this permits solving the linear system with a trivial
- solver so we do not use a PETSc solver in this case (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:solvers"
-
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Standard
-PETSc options can be set in 
-\family typewriter
-.cfg
-\family default
- files in sections beginning with 
-\family typewriter
-[pylithapp.petsc]
-\family default
-.
- The options of primary interest in the case of PyLith are shown in Table
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:petsc:options:defaults"
-
-\end_inset
-
-.
- PETSc options are used to control the selection and settings for the solvers
- underlying the SolverLinear and SolverNonlinear objects discussed in Section
- 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:solvers"
-
-\end_inset
-
-.
- A very wide range of elasticity problems in quasi-static simulations can
- be solved with reasonable runtimes by replacing the default Jacobi precondition
-er with the Additive Schwarz Method (ASM) using Incomplete LU (ILU) factorizatio
-n by default (see Table
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:petsc:options:recommended"
-
-\end_inset
-
-).
- A more advanced set of solver settings that may provide better performance
- in many elasticity problems are given in Table 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:petsc:options:advanced"
-
-\end_inset
-
-.
- These settings are limited to problems where we store the stiffness matrix
- as a nonsymmetric sparse matrix and require additional settings for the
- formulation,
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.formulation]
-\end_layout
-
-\begin_layout LyX-Code
-split_fields = True
-\end_layout
-
-\begin_layout LyX-Code
-use_custom_constraint_pc = True ; Use only if problem contains a fault
-\end_layout
-
-\begin_layout LyX-Code
-matrix_type = aij
-\end_layout
-
-\begin_layout Quote
-
-\series bold
-\color red
-Warning:
-\color inherit
- 
-\series default
-\color none
-These settings are only available if you build PETSc with Fortran enabled
- and the ML package.
- These features are included in the PyLith binary packages.
-\end_layout
-
-\begin_layout Quote
-
-\series bold
-\color red
-Warning:
-\color inherit
- 
-\series default
-\color none
-The split fields and algebraic multigrid preconditioning currently fails
- in problems with a nonzero null space.
- This most often occurs when a problem contains multiple faults that extend
- through the entire domain and create subdomains without any Dirichlet boundary
- conditions.
- The current workaround is to use the 
-\color inherit
-Additive Schwarz 
-\color none
-preconditioner without split fields.
- See Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Troubleshooting"
-
-\end_inset
-
- for the error message encountered in this situation.
- 
-\end_layout
-
-\begin_layout Standard
-These more advanced settings allow the displacement fields and Lagrange
- multipliers for fault tractions to be preconditioned separately.
- This usually results in a much stronger preconditioner.
- In simulations with fault slip, the degrees of freedom associated with
- the Lagrange multipliers should be preconditioned with a custom preconditioner
- that uses a diagonal approximation of the Schur complement.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:petsc:options:defaults"
-
-\end_inset
-
-Useful command-line arguments for setting PETSc options.
-\end_layout
-
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="10" columns="3">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="1.2in">
-<column alignment="center" valignment="middle" width="0.6in">
-<column alignment="left" valignment="top" width="3.8in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Property
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Default Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-log_summary
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-false
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Print logging objects and events.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-ksp_monitor
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-false
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Dump preconditioned residual norm to stdout.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-ksp_view
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-false
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Print linear solver parameters.
- 
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-ksp_rtol
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-1.0e-05
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Convergence tolerance for relative decrease in residual norm.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-snes_monitor
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-false
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Dump residual norm to stdout for each nonlinear solve iteration.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-snes_view
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-false
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Print nonlinear solver parameters.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-snes_rtol
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-1.0e-5
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Convergence tolerance for relative decrease in residual norm.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-pc_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-jacobi
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Set preconditioner type.
- See 
-\begin_inset CommandInset href
-LatexCommand href
-name "PETSc documentation"
-target "http://www.mcs.anl.gov/petsc/petsc-as/documentation/linearsolvertable.html"
-
-\end_inset
-
- for a list of all preconditioner types.
- 
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-ksp_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-gmres
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Set linear solver type.
- See 
-\begin_inset CommandInset href
-LatexCommand href
-name "PETSc documentation"
-target "http://www.mcs.anl.gov/petsc/petsc-as/documentation/linearsolvertable.html"
-
-\end_inset
-
- for a list of all solver types.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:petsc:options:recommended"
-
-\end_inset
-
-PETSc options that provide moderate performance in a wide range of quasi-static
- elasticity problems.
-\end_layout
-
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="13" columns="3">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="2in">
-<column alignment="center" valignment="middle" width="0.75in">
-<column alignment="left" valignment="top" width="3in">
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Property
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-pc_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-asm
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Additive Schwarz method.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-ksp_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-gmres
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-GMRES method from Saad and Schultz.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-sub_pc_factor_shift_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\emph on
-nonzero
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Turn on nonzero shifting for factorization.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-ksp_max_it
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\emph on
-100
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Maximum number of iterations permitted in linear solve.
- Depends on problem size.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-ksp_gmres_restart
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-50
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Number of iterations after which Gram-Schmidt orthogonalization is restarted.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-ksp_rtol
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-1.0e-08
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Linear solve convergence tolerance for relative decrease in residual norm.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-ksp_atol
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-\emph on
-1.0e-12
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Linear solve convergence tolerance for absolute value of residual norm.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-ksp_converged_reason
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-true
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Indicate why iterating stopped in linear solve.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-snes_max_it
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-100
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Maximum number of iterations permitted in nonlinear solve.
- Depends on how nonlinear the problem is.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-snes_rtol
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-1.0e-08
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Nonlinear solve convergence tolerance for relative decrease in residual
- norm.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-snes_atol
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-1.0e-12
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Nonlinear solve convergence tolerance for absolute value of residual norm.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-snes_converged_reason
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-true
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Indicate why iterating stopped in nonlinear solve.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float table
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Caption
-
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:petsc:options:advanced"
-
-\end_inset
-
-PETSc options used with split fields algebraic multigrid preconditioning
- that often provide improved performance in quasi-static elasticity problems.
-\end_layout
-
-\end_inset
-
-
-\begin_inset Tabular
-<lyxtabular version="3" rows="8" columns="3">
-<features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="2.25in">
-<column alignment="center" valignment="middle" width="0.75in">
-<column alignment="left" valignment="top" width="3in">
-<row>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Property
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Value
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\series bold
-Description
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fs_pc_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-field_split
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Precondition fields separately.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fs_pc_fieldsplit_real_diagonal
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-true
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Use diagonal blocks from the true operator, rather than the preconditioner.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fs_pc_fieldsplit_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-multiplicative
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Apply each field preconditioning in sequence, which is stronger than all-at-once
- (additive).
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fs_fieldsplit_0_pc_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-ml
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Multilevel algebraic multigrid preconditioning using Trilinos/ML via PETSc.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fs_fieldsplit_1_pc_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-jacobi
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Jacobi preconditioning for Lagrange multiplier block (only use if there
- is at least one fault)
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fs_fieldsplit_0_ksp_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-preonly
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Apply only the preconditioner.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\family typewriter
-fs_fieldsplit_1_ksp_type
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\shape italic
-preonly
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-Apply only the preconditioner.
-\end_layout
-
-\end_inset
-</cell>
-</row>
-</lyxtabular>
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-PETSc Solvers and nVidia GPUs
-\end_layout
-
-\begin_layout Standard
-The development version of PETSc contains some support for using PETSc solvers
- and nVidia GPUs via CUDA.
- Building PETSc requires some additional dependencies as described in 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-http://www.mcs.anl.gov/petsc/documentation/installation.html#CUDA
-\end_layout
-
-\end_inset
-
-.
- Additionally, PyLith must be configured with the 
-\family typewriter
---enable-cuda
-\family default
- option.
- See the PyLith Installer documentation for how to enable support for CUDA
- when building PETSc and PyLith with the installer (the installer does not
- install CUDA or cusp).
-\end_layout
-
-\begin_layout Quote
-
-\series bold
-\color red
-Warning:
-\color inherit
- 
-\series default
-\color none
-Development of PETSc solvers leveraging nVidia GPUs to accelerate the computatio
-ns is still a work in progress.
- This feature requires building PETSc and PyLith from source after installing
- CUDA and the development version of cusp.
- If your GPU only supports single-precision floating point operations, then
- PETSc must be built with single precision and without support for ML and
- ParMetis/Metis.
-\end_layout
-
-\begin_layout Standard
-Solver and preconditioning options are relatively limited when using CUDA.
- CUDA works with the Additive Schwarz preconditioner and GMRES linear solver.
- Enabling use of CUDA with the PETSc solver involves just one setting:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.formulation.solver]
-\begin_inset Newline newline
-\end_inset
-
-use_cuda = True
-\end_layout
-
-\begin_layout Standard
-If the matrix type and vector types have not already been set, this will
- set matrix type and vector types to 
-\family typewriter
-aijcusp
-\family default
- and 
-\family typewriter
-cusp
-\family default
-, respectively, to indicate to PETSc that CUDA should be used by the solver.
- If they have already been set to a value, then the values will not be changed
- even if they are incompatible with using CUDA.
-\end_layout
-
-\begin_layout Section
-Time-Dependent Problem
-\end_layout
-
-\begin_layout Standard
-This type of problem applies to transient static, quasi-static, and dynamic
- simulations.
- The time-dependent problem adds the 
-\family typewriter
-formulation
-\family default
- facility to the general-problem.
- The formulation specifies the time-stepping formulation to integrate the
- elasticity equation.
- PyLith provides several alternative formulations, each specific to a different
- type of problem.
-\end_layout
-
-\begin_layout Description
-Implicit Implicit time stepping for static and quasi-static problems with
- infinitesimal strains.
- The implicit formulation neglects inertial terms (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:elasticity:integral:quasistatic"
-
-\end_inset
-
-).
- 
-\end_layout
-
-\begin_layout Description
-ImplicitLgDeform Implicit time stepping for static and quasi-static problems
- including the effects of rigid body motion and small strains.
- This formulation requires the use of the nonlinear solver, which is selected
- automatically.
-\end_layout
-
-\begin_layout Description
-Explicit Explicit time stepping for dynamic problems with infinitesimal
- strains.
- This formulation uses consistent mass and damping matrices for the system
- Jacobian matrix.
-\end_layout
-
-\begin_layout Description
-ExplicitLgDeform Explicit time stepping for dynamic problems including the
- effects of rigid body motion and small strains.
- This formulation requires the use of the nonlinear solver, which is selected
- automatically.
-\end_layout
-
-\begin_layout Description
-ExplicitLumped Explicit time stepping for dynamic problems with infinitesimal
- strains and lumped system Jacobian.
- The cell matrices are lumped before assembly, permitting use of a vector
- for the diagonal system Jacobian matrix.
- The built-in lumped solver is selected automatically.
-\end_layout
-
-\begin_layout Description
-ExplicitLumpedTri3 Optimized elasticity formulation for linear triangular
- cells with one point quadrature for dynamic problems with infinitesimal
- strains and lumped system Jacobian.
- The built-in lumped solver is selected automatically.
-\end_layout
-
-\begin_layout Description
-ExplicitLumpedTet4 Optimized elasticity formulation for linear tetrahedral
- cells with one point quadrature for dynamic problems with infinitesimal
- strains and lumped system Jacobian.The built-in lumped solver is selected
- automatically.
-\end_layout
-
-\begin_layout Standard
-In many quasi-static simulations it is convenient to compute a static problem
- with elastic deformation prior to computing a transient response.
- Up through PyLith version 1.6 this was hardwired into the Implicit Forumulation
- as advancing from time step 
-\begin_inset Formula $t=-\Delta t$
-\end_inset
-
- to 
-\begin_inset Formula $t=0$
-\end_inset
-
-, and it could not be turned off.
- PyLith now includes a property, 
-\family typewriter
-elastic_prestep
-\family default
- in the TimeDependent component to turn on/off this behavior (the default
- is to retain the previous behavior of computing the elastic deformation).
- 
-\end_layout
-
-\begin_layout Quote
-
-\series bold
-\color red
-Warning:
-\color inherit
- 
-\series default
-\color none
-Turning off the elastic prestep calculation means the model only deforms
- when an 
-\family typewriter
-\shape italic
-\color inherit
-increment
-\family default
-\shape default
-\color none
- in loading or deformation is applied, because we the time-stepping formulation
- is implemented using the increment in displacement.
-\end_layout
-
-\begin_layout Standard
-The TimeDependent properties and facilities include
-\end_layout
-
-\begin_layout Description
-elastic_preset If true, perform a static calculation with elastic behavior
- before time stepping (default is True).
-\end_layout
-
-\begin_layout Description
-formulation Formulation for solving the partial differential equation.
-\end_layout
-
-\begin_layout Standard
-An example of setting the properties and components in a .cfg file is
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent]
-\end_layout
-
-\begin_layout LyX-Code
-formulation = pylith.problems.Implicit ; default
-\end_layout
-
-\begin_layout LyX-Code
-elastic_preset = True ; default
-\end_layout
-
-\begin_layout Standard
-The formulation value can be set to the other formulations in a similar
- fashion.
- 
-\end_layout
-
-\begin_layout Subsection
-Time-Stepping Formulation
-\end_layout
-
-\begin_layout Standard
-The explicit and implicit time stepping formulations use a common set of
- facilities and properties.
- The facilities include
-\end_layout
-
-\begin_layout Description
-time_step Time step size specification (default is uniform time step).
-\end_layout
-
-\begin_layout Description
-solver Type of solver to use (default is SolverLinear).
-\end_layout
-
-\begin_layout Description
-output Array of output managers for output of the solution (default is [output]).
-\end_layout
-
-\begin_layout Description
-jacobian_viewer Viewer to dump the system Jacobian (sparse matrix) to a
- file for analysis (default is PETSc binary).
-\end_layout
-
-\begin_layout Standard
-The formulation properties include
-\end_layout
-
-\begin_layout Description
-matrix_type Type of PETSc matrix for the system Jacobian (sparse matrix,
- default is symmetric, block matrix with a block size of 1).
-\end_layout
-
-\begin_layout Description
-view_jacobian Flag to indicate if system Jacobian (sparse matrix) should
- be written to a file (default is false).
-\end_layout
-
-\begin_layout Description
-split_fields Split solution field into a displacement portion (fields 0..ndim-1)
- and a Lagrange multiplier portion (field ndim) to permit application of
- sophisticated PETSc preconditioners (default is false).
-\end_layout
-
-\begin_layout Standard
-An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file is
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.formulation]
-\end_layout
-
-\begin_layout LyX-Code
-time_step = pylith.problems.TimeStepUniform
-\end_layout
-
-\begin_layout LyX-Code
-solver = pylith.problems.SolverLinear ; Nonlinear solver is pylith.problems.SolverNo
-nlinear
-\end_layout
-
-\begin_layout LyX-Code
-output = [domain,ground_surface]
-\end_layout
-
-\begin_layout LyX-Code
-matrix_type = sbaij ; To use a non-symmetric sparse matrix, set it to aij
-\end_layout
-
-\begin_layout LyX-Code
-view_jacobian = false
-\end_layout
-
-\begin_layout Subsection
-Numerical Damping in Explicit Time Stepping
-\end_layout
-
-\begin_layout Standard
-In explicit time-stepping formulations for elasticity, boundary conditions
- and fault slip can excite short waveform elastic waves that are not accurately
- resolved by the discretization.
- We use numerical damping via an artificial viscosity
-\begin_inset CommandInset citation
-LatexCommand cite
-key "Knopoff:Ni:2001,Day:Ely:2002"
-
-\end_inset
-
- to reduce these high frequency oscillations.
- In computing the strains for the elasticity term in equation 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "eq:elasticity:integral:dynamic:t"
-
-\end_inset
-
-, we use an adjusted displacement rather than the actual displacement, where
- 
-\begin_inset Formula 
-\begin{equation}
-\vec{u}^{adj}(t)=\vec{u}(t)+\eta^{*}\Delta t\vec{\dot{u}}(t),
-\end{equation}
-
-\end_inset
-
-
-\begin_inset Formula $\vec{u}^{adj}(t)$
-\end_inset
-
- is the adjusted displacement at time t, 
-\begin_inset Formula $\vec{u}(t)$
-\end_inset
-
-is the original displacement at time (t), 
-\begin_inset Formula $\eta^{*}$
-\end_inset
-
-is the normalized artificial viscosity, 
-\begin_inset Formula $\Delta t$
-\end_inset
-
- is the time step, and 
-\begin_inset Formula $\vec{\dot{u}}(t)$
-\end_inset
-
- is the velocity at time 
-\begin_inset Formula $t$
-\end_inset
-
-.
- The default value for the normalized artificial viscosity is 0.1.
- We have found values in the range 0.1-0.4 sufficiently suppress numerical
- noise while not excessively reducing the peak velocity.
- An example of setting the normalized artificial viscosity in a 
-\family typewriter
-.cfg
-\family default
- file is
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.formulation]
-\end_layout
-
-\begin_layout LyX-Code
-norm_viscosity = 0.2
-\end_layout
-
-\begin_layout Subsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:solvers"
-
-\end_inset
-
-Solvers
-\end_layout
-
-\begin_layout Standard
-PyLith supports three types of solvers.
- The linear solver, SolverLinear, corresponds to the PETSc KSP solver and
- is used in linear problems with linear elastic and viscoelastic bulk constituti
-ve models and kinematic fault ruptures.
- The nonlinear solver, SolverNonlinear, corresponds to the PETSc SNES solver
- and is used in nonlinear problems with nonlinear viscoelastic or elastoplastic
- bulk constitutive models, dynamic fault ruptures, or problems involving
- finite strain (small strain formulation).
- The lumped solver (SolverLumped) is a specialized solver used with the
- lumped system Jacobian matrix.
- The options for the PETSc KSP and SNES solvers are set via the top-level
- PETSc options (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:petsc:options"
-
-\end_inset
-
- and the PETSc documentation 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-www.mcs.anl.gov/petsc/petsc-as/documentation/index.html
-\end_layout
-
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Subsection
-Time Stepping
-\end_layout
-
-\begin_layout Standard
-PyLith provides three choices for controlling the time step in time-dependent
- simulations.
- These include (1) a uniform, user-specified time step (which is the default),
- (2) nonuniform, user-specified time steps, and (3) nonuniform, automatically
- calculated time steps.
- The procedure for automatically selecting time steps requires that the
- material models provide a reasonable estimate of the time step for stable
- time integration.
- In general, quasi-static simulations should use automatically calculated
- time steps and dynamic simulations should use a uniform, user-specified
- time step.
-\end_layout
-
-\begin_layout Standard
-
-\series bold
-\color red
-Warning:
-\series default
-\color none
- 
-\color inherit
-Changing the time step requires recomputing the Jacobian of the system,
- which can greatly increase the runtime if the time-step size changes frequently.
-\end_layout
-
-\begin_layout Subsubsection
-Uniform, User-Specified Time Step
-\end_layout
-
-\begin_layout Standard
-With a uniform, user-specified time step, the user selects the time step
- that is used over the entire duration of the simulation.
- This value is used whether or not it yields a stable solution, so users
- should be careful when selecting the time-step value.
- The properties for the uniform, user-specified time step are:
-\end_layout
-
-\begin_layout Description
-total_time Time duration for simulation (default is 0.0 s).
-\end_layout
-
-\begin_layout Description
-start_time Start time for simulation (default is 0.0 s)
-\end_layout
-
-\begin_layout Description
-dt Time step for simulation.
-\end_layout
-
-\begin_layout Standard
-An example of setting a uniform, user-specified time step in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.formulation]
-\end_layout
-
-\begin_layout LyX-Code
-time_step = pylith.problems.TimeStepUniform ; Default value
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.formulation.time_step]
-\end_layout
-
-\begin_layout LyX-Code
-total_time = 1000.0*year
-\end_layout
-
-\begin_layout LyX-Code
-dt = 0.5*year
-\end_layout
-
-\begin_layout Subsubsection
-Nonuniform, User-Specified Time Step
-\end_layout
-
-\begin_layout Standard
-The nonuniform, user-specified, time-step implementation allows the user
- to specify the time steps in an ASCII file (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:FileFormat:TimeStepUser"
-
-\end_inset
-
- for the format specification of the time-step file).
- If the total duration exceeds the time associated with the time steps,
- then a flag determines whether to cycle through the time steps or to use
- the last specified time step for the time remaining.
- The properties for the nonuniform, user-specified time step are:
-\end_layout
-
-\begin_layout Description
-total_time Time duration for simulation.
-\end_layout
-
-\begin_layout Description
-filename Name of file with time-step sizes.
-\end_layout
-
-\begin_layout Description
-loop_steps If true, cycle through time steps, otherwise keep using last
- time-step size for any time remaining.
-\end_layout
-
-\begin_layout Standard
-An example of setting the properties for nonuniform, user-specified time
- steps in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.formulation]
-\end_layout
-
-\begin_layout LyX-Code
-time_step = pylith.problems.TimeStepUser ; Change the time step algorithm
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.formulation.time_step]
-\end_layout
-
-\begin_layout LyX-Code
-total_time = 1000.0*year
-\end_layout
-
-\begin_layout LyX-Code
-filename = timesteps.txt
-\end_layout
-
-\begin_layout LyX-Code
-loop_steps = false ; Default value
-\end_layout
-
-\begin_layout Subsubsection
-Nonuniform, Automatic Time Step
-\end_layout
-
-\begin_layout Standard
-This time-step implementation automatically calculates a stable time step
- based on the constitutive model and rate of deformation.
- As a result, this choice for choosing the time step relies on accurate
- calculation of a stable time step within each finite-element cell by the
- constitutive models.
- In order to provide some control over the time-step selection, the user
- can control the frequency that a new time step is calculated, the time
- step to use relative to the value determined by the constitutive models,
- and a maximum value for the time step.
- The properties for controlling the automatic time-step selection are:
-\end_layout
-
-\begin_layout Description
-total_time Time duration for simulation.
-\end_layout
-
-\begin_layout Description
-max_dt Maximum time step permitted.
-\end_layout
-
-\begin_layout Description
-adapt_skip Number of time steps to skip between calculating new stable time
- step.
-\end_layout
-
-\begin_layout Description
-stability_factor Safety factor for stable time step (default is 2.0).
-\end_layout
-
-\begin_layout Standard
-An example of setting the properties for the automatic time step in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.formulation]
-\end_layout
-
-\begin_layout LyX-Code
-time_step = pylith.problems.TimeStepAdapt ; Change the time step algorithm
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.formulation.time_step]
-\end_layout
-
-\begin_layout LyX-Code
-total_time = 1000.0*year
-\end_layout
-
-\begin_layout LyX-Code
-max_dt = 10.0*year
-\end_layout
-
-\begin_layout LyX-Code
-adapt_skip = 10 ; Default value
-\end_layout
-
-\begin_layout LyX-Code
-stability_factor = 2.0 ; Default value
-\end_layout
-
-\begin_layout Section
-Green's Functions Problem
-\end_layout
-
-\begin_layout Standard
-This type of problem applies to computing static Green's functions for elastic
- deformation.
- The 
-\family typewriter
-GreensFns
-\family default
- problem specializes the time-dependent facility to the case of static simulatio
-ns with slip impulses on a fault.
- The default formulation is the Implicit formulation and should not be changed
- as the other formulations are not applicable to static Green's functions.
- In the output files, the deformation at each 
-\begin_inset Quotes eld
-\end_inset
-
-time step
-\begin_inset Quotes erd
-\end_inset
-
- is the deformation for a different slip impulse.
- The properties provide the ability to select which fault to use for slip
- impulses.
- The only fault component available for use with the 
-\family typewriter
-GreensFns
-\family default
- problem is the 
-\family typewriter
-FaultCohesiveImpulses
-\family default
- component discussed in Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:fault:cohesive:impulses"
-
-\end_inset
-
-.
- The 
-\family typewriter
-GreensFns
-\family default
- properties include:
-\end_layout
-
-\begin_layout Description
-fault_id Id of fault on which to impose slip impulses.
-\end_layout
-
-\begin_layout Standard
-An example of setting the properties for the GreensFns problem in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp]
-\end_layout
-
-\begin_layout LyX-Code
-problem = pylith.problems.GreensFns ; Change problem type from the default
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.greensfns]
-\end_layout
-
-\begin_layout LyX-Code
-fault_id = 100 ; Default value
-\end_layout
-
-\begin_layout Standard
-
-\series bold
-\color red
-Warning:
-\series default
-\color none
- 
-\color inherit
-The 
-\family typewriter
-GreensFns
-\family default
- problem generates slip impulses on a fault.
- The current version of PyLith requires that impulses can only be applied
- to a single fault and the fault facility must be set to 
-\family typewriter
-FaultCohesiveImpulses
-\family default
-.
-\end_layout
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:spatial:databases"
-
-\end_inset
-
-Databases for Boundaries, Interfaces, and Material Properties
-\end_layout
-
-\begin_layout Standard
-Once the problem has been defined with PyLith parameters, and the mesh informati
-on has been provided, the final step is to specify the boundary conditions
- and material properties to be used.
- The mesh information provides labels defining sets of vertices to which
- boundary conditions or fault conditions will be applied, as well as cell
- labels that will be used to define the material type of each cell.
- For boundary conditions, the 
-\family typewriter
-.cfg
-\family default
- file is used to associate boundary condition types and spatial databases
- with each vertex group (see Chapter 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:boundary:interface:conditions"
-
-\end_inset
-
-).
- For materials, the 
-\family typewriter
-.cfg
-\family default
- file is used to associate material types and spatial databases with cells
- identified by the material identifier (see Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:Material-models"
-
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Standard
-The spatial databases define how the boundary conditions or material property
- values vary spatially, and they can be arbitrarily complex.
- The simplest example for a material database would be a mesh where all
- the cells of a given type have uniform properties (
-\begin_inset Quotes eld
-\end_inset
-
-point
-\begin_inset Quotes erd
-\end_inset
-
- or 0D variation).
- A slightly more complex case would be a mesh where the cells of a given
- type have properties that vary linearly along a given direction (
-\begin_inset Quotes eld
-\end_inset
-
-line
-\begin_inset Quotes erd
-\end_inset
-
- or 1D variation).
- In more complex models, the material properties might have different values
- at each point in the mesh (
-\begin_inset Quotes eld
-\end_inset
-
-volume
-\begin_inset Quotes erd
-\end_inset
-
- or 3D variation).
- This might be the case, for example, if the material properties are provided
- by a database of seismic velocities and densities.
- For boundary conditions the simplest case would be where all vertices in
- a given group have the same boundary condition parameters (
-\begin_inset Quotes eld
-\end_inset
-
-point
-\begin_inset Quotes erd
-\end_inset
-
- or 0D variation).
- A more complex case might specify a variation in the conditions on a given
- surface (
-\begin_inset Quotes eld
-\end_inset
-
-area
-\begin_inset Quotes erd
-\end_inset
-
- or 2D variation).
- This sort of condition might be used, for example, to specify the variation
- of slip on a fault plane.
- The examples discussed in Chapter 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:Tutorials"
-
-\end_inset
-
- also contain more information regarding the specification and use of the
- spatial database files.
-\end_layout
-
-\begin_layout Subsection
-SimpleDB Spatial Database
-\end_layout
-
-\begin_layout Standard
-In most cases the default type of spatial database for faults, boundary
- conditions, and materials is 
-\family typewriter
-SimpleDB
-\family default
-.
- Spatial database files provide specification of a field over some set of
- points.
- There is no topology associated with the points.
- Although multiple values can be specified at each point with more than
- one value included in a search query, the interpolation of each value will
- be done independently.
- Time dependent variations of a field are not supported in these files.
- Spatial database files can specify spatial variations over zero, one, two,
- and three dimensions.
- Zero dimensional variations correspond to uniform values.
- One-dimensional spatial variations correspond to piecewise linear variations,
- which need not coincide with coordinate axes.
- Likewise, two-dimensional spatial variations correspond to variations on
- a planar surface (which need not coincide with the coordinate axes) and
- three-dimensional spatial variations correspond to variations over a volume.
- In one, two, or three dimensions, queries can use a 
-\begin_inset Quotes eld
-\end_inset
-
-nearest value
-\begin_inset Quotes erd
-\end_inset
-
- search or linear interpolation.
-\end_layout
-
-\begin_layout Standard
-The spatial database files need not provide the data using the same coordinate
- system as the mesh coordinate system, provided the two coordinate systems
- are compatible.
- Examples of compatible coordinate systems include geographic coordinates
- (longitude/latitude/elevation), and projected coordinates (e.g., coordinates
- in a transverse Mercator projection).
- Spatial database queries use the Proj.4 Cartographic Projections library
- 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-proj.maptools.org
-\end_layout
-
-\end_inset
-
- to convert between coordinate systems, so a large number of geographic
- projections are available with support for converting between NAD27 and
- WGS84 horizontal datums as well as several other frequently used datums.
- Because the interpolation is done in the coordinate system of the spatial
- database, geographic coordinates should only be used for very simple datasets,
- or undesirable results will occur.
- This is especially true when the spatial database coordinate system combines
- latitude, longitude, and elevation in meters (longitude and latitude in
- degrees are often much smaller than elevations in meters leading to distorted
- 
-\begin_inset Quotes eld
-\end_inset
-
-distance
-\begin_inset Quotes erd
-\end_inset
-
- between locations and interpolation).
-\end_layout
-
-\begin_layout Standard
-SimpleDB uses a simple ASCII file to specify the variation of values (e.g.,
- displacement field, slip field, physical properties) in space.
- The file format is described in Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Spatialdata:SimpleIOAscii"
-
-\end_inset
-
-.
- The tutorials in Chapter 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:Tutorials"
-
-\end_inset
-
- use SimpleDB files to specify the values for the boundary conditions, 
- physical properties, and fault slip.
-\end_layout
-
-\begin_layout Standard
-As in the other Pyre objects, spatial database objects contain parameters
- that can be set from the command line or using 
-\family typewriter
-.cfg or .pml
-\family default
- files.
- The parameters for a spatial database are:
-\end_layout
-
-\begin_layout Description
-label Label for the database, which is used in diagnostic messages.
-\end_layout
-
-\begin_layout Description
-query_type Type of search query to perform.
- Values for this parameter are ``linear'' and ``nearest'' (default).
-\end_layout
-
-\begin_layout Description
-iohandler Database importer.
- Only one importer is implemented, so you do not need to change this setting.
-\end_layout
-
-\begin_layout Description
-iohandler.filename Filename for the spatial database.
-\end_layout
-
-\begin_layout Standard
-An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-label = Material properties
-\end_layout
-
-\begin_layout LyX-Code
-query_type = linear
-\end_layout
-
-\begin_layout LyX-Code
-iohandler.filename = mydb.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout Subsection
-UniformDB Spatial Database
-\end_layout
-
-\begin_layout Standard
-The SimpleDB spatial database is quite general, but when the values are
- uniform, it is often easier to use the UniformDB spatial database instead.
- With the UniformDB, you specify the values directly either on the command
- line or in a parameter-setting (
-\family typewriter
-.cfg
-\family default
-) file.
- On the other hand, if the values are used in more than one place, it is
- easier to place the values in a SimpleDB file, because they can then be
- referred to using the filename of the spatial database rather than having
- to repeatedly list all of the values on the command line or in a parameter-sett
-ing (
-\family typewriter
-.cfg
-\family default
-) file.
- The Pyre properties for a UniformDB are:
-\end_layout
-
-\begin_layout Description
-values Array of names of values in spatial database
-\end_layout
-
-\begin_layout Description
-data Array of values in spatial database
-\end_layout
-
-\begin_layout Subsubsection
-Example
-\end_layout
-
-\begin_layout Standard
-Specify the physical properties of a linearly elastic, isotropic material
- in a 
-\family typewriter
-pylithapp.cfg
-\family default
- file.
- The data values are dimensioned with the appropriate units using Python
- syntax.
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-[pylithapp.timedependent.materials.material]
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-db_properties = spatialdata.spatialdb.UniformDB ; Set the db to a UniformDB
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-db_properties.values = [vp,vs,density] ; Set the names of the values in the
- database
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-db_properties.data = [5773.5*m/s, 3333.3*m/s, 2700.0*kg/m**3] ; Set the values
- in the database
-\end_layout
-
-\begin_layout Subsubsection
-ZeroDispDB
-\end_layout
-
-\begin_layout Standard
-The ZeroDispDB is a a special case of the UniformDB for the Dirichlet boundary
- conditions.
- The values in the database are the ones requested by the Dirichlet boundary
- conditions, 
-\family typewriter
-displacement-x
-\family default
-, 
-\family typewriter
-displacement-y
-\family default
-, and 
-\family typewriter
-displacement-z
-\family default
-, and are all set to zero.
- This makes it trivial to set displacements to zero on a boundary.
- The examples discussed in Chapter 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:Tutorials"
-
-\end_inset
-
- use this database.
-\end_layout
-
-\begin_layout Subsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sub:SCECCVMH-Impl"
-
-\end_inset
-
-SCEC CVM-H Spatial Database
-\end_layout
-
-\begin_layout Standard
-Although the SimpleDB implementation is able to specify arbitrarily complex
- spatial variations, there are existing databases for physical properties,
- and when they are available, it is desirable to access these directly.
- One such database is the SCEC CVM-H database, which provides seismic velocities
- and density information for much of southern California.
- Spatialdata provides a direct interface to this database.
- See Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Tutorial-Two-tet4-geoproj"
-
-\end_inset
-
- for an example of using the SCEC CVM-H database for physical properties
- of an elastic material.
- The interface is known to work with versions 5.2 and 5.3 of the SCEC CVM-H.
- Setting a minimum wave speed can be used to replace water and very soft
- soils that are incompressible or nearly incompressible with stiffer, compressib
-le materials.
- The Pyre properties for the SCEC CVM-H are:
-\end_layout
-
-\begin_layout Description
-data_dir Directory containing the SCEC CVM-H data files
-\end_layout
-
-\begin_layout Description
-min_vs Minimum shear wave speed.
- Corresponding minimum values for the dilatational wave speed (Vp) and density
- are computed.
- Default value is 500 m/s.
-\end_layout
-
-\begin_layout Description
-squash Squash topography/bathymetry to sea level (make the earth's surface
- flat)
-\end_layout
-
-\begin_layout Description
-squash_limit Elevation above which topography is squashed (geometry below
- this elevation remains undistorted)
-\end_layout
-
-\begin_layout Subsubsection
-Example
-\end_layout
-
-\begin_layout Standard
-Specify the physical properties of a linearly elastic, isotropic material
- using the SCEC CVM-H in a 
-\family typewriter
-pylithapp.cfg
-\family default
- file.
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-[pylithapp.timedependent.materials.material]
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-db_properties = spatialdata.spatialdb.SCECCVMH ; Set the database to the SCEC
- CVM-H
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-db_properties.data_dir = /home/johndoe/data/sceccvm-h/vx53 ; Directory containing
-\begin_inset Newline newline
-\end_inset
-
-the database data files
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-db_properties.min_vs = 500*m/s
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-db_properties.squash = True ; Turn on squashing
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-db_properties.squash_limit = -1000.0 ; Only distort the geometry above z =
- -1 km in 
-\begin_inset Newline newline
-\end_inset
-
-flattening the earth
-\end_layout
-
-\begin_layout Subsection
-CompositeDB Spatial Database
-\end_layout
-
-\begin_layout Standard
-For some problems, a boundary condition or material property may have subsets
- with different spatial variations.
- One example would be when we have separate databases to describe the elastic
- and inelastic bulk material properties for a region.
- In this case, it would be useful to have two different spatial databases,
- e.g., a seismic velocity model with Vp, Vs, and density values, and another
- database with the inelastic physical properties.
- We can use the 
-\family typewriter
-CompositeDB
-\family default
- spatial database for these cases.
- An example would be:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.materials.maxwell]
-\end_layout
-
-\begin_layout LyX-Code
-label = Maxwell material
-\end_layout
-
-\begin_layout LyX-Code
-id = 1
-\end_layout
-
-\begin_layout LyX-Code
-db_properties = spatialdata.spatialdb.CompositeDB
-\end_layout
-
-\begin_layout LyX-Code
-db_properties.db_A = spatialdata.spatialdb.SCECCVMH
-\end_layout
-
-\begin_layout LyX-Code
-db_properties.db_B = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell = pylith.feassemble.FIATSimplex
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell.dimension = 3
-\end_layout
-
-\begin_layout LyX-Code
- 
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.materials.maxwell.db_properties]
-\end_layout
-
-\begin_layout LyX-Code
-values_A = [density,vs,vp]
-\end_layout
-
-\begin_layout LyX-Code
-db_A.label = Elastic properties from CVM-H
-\end_layout
-
-\begin_layout LyX-Code
-db_A.data_dir = /Users/willic3/geoframe/tools/vx53/bin
-\end_layout
-
-\begin_layout LyX-Code
-db_A.squash = False
-\end_layout
-
-\begin_layout LyX-Code
-values_B = [viscosity]
-\end_layout
-
-\begin_layout LyX-Code
-db_B.label = Vertically varying Maxwell material
-\end_layout
-
-\begin_layout LyX-Code
-db_B.iohandler.filename = ../spatialdb/mat_vert_var_maxwell.spatialdb
-\end_layout
-
-\begin_layout Standard
-Here we have specified a 
-\family typewriter
-CompositeDB
-\family default
- where the elastic properties (
-\family typewriter
-density
-\family default
-, 
-\family typewriter
-vs
-\family default
-, 
-\family typewriter
-vp
-\family default
-) are given by the SCEC CVM-H, and 
-\family typewriter
-viscosity
-\family default
- is described by a 
-\family typewriter
-SimpleDB
-\family default
- (
-\family typewriter
-mat_vert_var_maxwell.spatialdb
-\family default
-).
- The user must first specify 
-\family typewriter
-db_properties
-\family default
- as a 
-\family typewriter
-CompositeDB
-\family default
-, and must then give the two components of this database (
-\family typewriter
-SCECCVMH
-\family default
- and 
-\family typewriter
-SimpleDB
-\family default
-).
- The values to query in each of these databases is also required.
- This is followed by the usual parameters for each of the spatial databases.
- The 
-\family typewriter
-CompositeDB
-\family default
- provides a flexible mechanism for specifying material properties or boundary
- conditions where the variations come from two different sources.
-\end_layout
-
-\begin_layout Subsection
-Time History Database
-\end_layout
-
-\begin_layout Standard
-The time history database specifies the temporal variation in the amplitude
- of a field associated with a boundary condition.
- It is used in conjunction with spatial databases to provide spatial and
- temporal variation of parameters for boundary conditions.
- The same time history is applied to all of the locations, but the time
- history may be shifted with a spatial variation in the onset time and scaled
- with a spatial variation in the amplitude.
- The time history database uses a simple ASCII file which is simpler than
- the one used by the SimpleDB spatial database.
- The file format is described in Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Spatialdata:TimeHistoryIO"
-
-\end_inset
-
-.
- 
-\end_layout
-
-\begin_layout Standard
-As in the other Pyre objects, spatial database objects contain parameters
- that can be set from the command line or using 
-\family typewriter
-.cfg or .pml
-\family default
- files.
- The parameters for a spatial database are:
-\end_layout
-
-\begin_layout Description
-label Label for the time history database, which is used in diagnostic messages.
-\end_layout
-
-\begin_layout Description
-filename Filename for the time history database.
-\end_layout
-
-\begin_layout Standard
-An example of setting these parameters in a 
-\family typewriter
-.cfg
-\family default
- file is:
-\end_layout
-
-\begin_layout LyX-Code
-label = Displacement time history
-\end_layout
-
-\begin_layout LyX-Code
-filename = mytimehistory.timedb
-\end_layout
-
-\begin_layout Section
-Labels and Identifiers for Materials, Boundary Conditions, and Faults
-\end_layout
-
-\begin_layout Standard
-For materials, the ``label'' is a string used only for error messages.
- The ``id'' is an integer that corresponds to the material identifier in
- LaGriT (itetclr) and CUBIT (block id).
- The id also tags the cells in the mesh for associating cells with a specific
- material model and quadrature rule.
- For boundary conditions, the ``label'' is a string used to associate groups
- of vertices (psets in LaGriT and nodesets in CUBIT) with a boundary condition.
- Some mesh generators use strings (LaGriT) to identify groups of nodes while
- others (CUBIT) use strings and integers.
- The default behavior in PyLith is to use strings to identify groups for
- both LaGriT and CUBIT meshes, but the behavior for CUBIT meshes can be
- changed to use the nodeset id (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:MeshIOCubit"
-
-\end_inset
-
-).
- PyLith 1.0 had an ``id'' for boundary conditions, but we removed it from
- subsequent releases because it was not used.
- For faults the ``label'' is used in the same manner as the ``label'' for
- boundary conditions.
- That is, it associates a string with a group of vertices (pset in LaGriT
- and nodeset in CUBIT).
- The fault ``id'' is a integer used to tag the cohesive cells in the mesh
- with a specific fault and quadrature rule.
- Because we use the fault ``id'' to tag cohesive cells in the mesh the same
- way we tag normal cells to materials, it must be unique among the faults
- as well as the materials.
-\end_layout
-
-\begin_layout Section
-PyLith Output
-\end_layout
-
-\begin_layout Standard
-PyLith currently supports output to VTK and HDF5/Xdmf files, which can be
- imported directly into a number of visualization tools, such as ParaView,
- Visit, and MayaVi.
- The HDF5 files can also be directly accessed via Matlab and PyTables.
- PyLith 1.1 significantly expanded the information available for output,
- including fault information and state variables.
- Output of solution information for the domain, faults, materials, and boundary
- conditions is controlled by an output manager for each module.
- This allows the user to tailor the output to the problem.
- By default PyLith will write a number of files.
- Diagnostic information for each fault and material is written into a separate
- file as are the solution and state variables for the domain, each fault,
- and each material.
- For a fault the diagnostic fields include the final slip, the slip initiation
- time, and the fault normal vector.
- For a material the diagnostic fields include the density and the elastic
- constants.
- Additional diagnostic information can be included by setting the appropriate
- output parameters.
- See Chapters 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:material:models"
-
-\end_inset
-
- and 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "cha:boundary:interface:conditions"
-
-\end_inset
-
- for more information on the available fields and the next section for output
- parameters.
- The other files for each fault and material include solution information
- at each time step where output was requested (also customizable by the
- user).
- For a fault the solution information includes the slip and the change in
- tractions on the fault surface.
- For a material the solution information includes the total strain and stress.
- For some materials fields for additional state variables may be available.
- For output via VTK files, each time step is written to a separate file,
- whereas for HDF5 files all of the time steps for a given domain, fault,
- or material are written into the same file.
- A single Xdmf metadata file is created for each HDF5 file.
-\end_layout
-
-\begin_layout Subsection
-Output Manager
-\end_layout
-
-\begin_layout Standard
-The OutputManager object controls the type of files written, the fields
- included in the output, and how often output is written.
- PyLith includes some specialized OutputManagers that prescribe what fields
- are output by default.
- In some cases, additional fields are available but not included by default.
- For example, in 3D problems, the along-strike and up-dip directions over
- the fault surface can be included in the diagnostic information.
- These are not included by default, because 1D problems have neither an
- along-strike nor up-dip direction and 2D problems do not have an up-dip
- direction.
-\end_layout
-
-\begin_layout Subsubsection
-Output Manager Parameters
-\end_layout
-
-\begin_layout Standard
-The parameters for the OutputManager are:
-\end_layout
-
-\begin_layout Description
-output_freq Flag indicating whether to write output based on the time or
- number of time steps since the last output.
- Permissible values are ``time_step'' and ``skip'' (default).
-\end_layout
-
-\begin_layout Description
-time_step Minimum time between output if 
-\family typewriter
-output_freq
-\family default
- is set to ``time_step''.
-\end_layout
-
-\begin_layout Description
-skip Number of time steps between output if 
-\family typewriter
-output_freq
-\family default
- is set to ``skip''.
- A value of 0 means every time step is written.
-\end_layout
-
-\begin_layout Description
-writer Writer for data (VTK writer or HDF5 writer).
-\end_layout
-
-\begin_layout Description
-coordsys Coordinate system for vertex coordinates (currently ignored).
-\end_layout
-
-\begin_layout Description
-vertex_filter Filter to apply to all vertex fields (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sub:vertex:field:filters"
-
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Description
-cell_filter Filter to apply to all cell fields (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sub:cell:field:filters"
-
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Standard
-An example of setting the output parameters for a material in a 
-\family typewriter
-.cfg
-\family default
- file is
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.materials.elastic.output]
-\end_layout
-
-\begin_layout LyX-Code
-output_freq = time_step
-\end_layout
-
-\begin_layout LyX-Code
-time_step = 1.0*yr
-\end_layout
-
-\begin_layout LyX-Code
-cell_filter = pylith.meshio.CellFilterAvgMesh
-\end_layout
-
-\begin_layout LyX-Code
-cell_info_fields = [density] ; limit diagnostic data to density
-\end_layout
-
-\begin_layout LyX-Code
-cell_data_fields = [total-strain,stress] ; default
-\end_layout
-
-\begin_layout LyX-Code
-writer.filename = dislocation-elastic.vtk
-\end_layout
-
-\begin_layout Subsubsection
-Output Over Subdomain
-\end_layout
-
-\begin_layout Standard
-Output of the solution over the entire domain for large problems generates
- very large data files.
- In some cases one is primarily interested in the solution over the ground
- surface.
- PyLith supports output of the solution on any boundary of the domain by
- associating an output manager with a group of vertices corresponding to
- the surface of the boundary.
- As with several of the boundary conditions, the boundary must be a simply-conne
-cted surface.
- The 
-\family typewriter
-OutputSolnSubset
-\family default
- is the specialized OutputManager that implements this feature and, by default,
- includes the displacement field in the output.
- In addition to the 
-\family typewriter
-OutputManager
-\family default
- parameters, the 
-\family typewriter
-OutputSolnSubset
-\family default
- includes:
-\end_layout
-
-\begin_layout Description
-label Label of group of vertices defining boundary surface.
-\end_layout
-
-\begin_layout Description
-vertex_data_fields Names of vertex data fields to output (default is [``displace
-ments'']).
-\end_layout
-
-\begin_layout Subsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:output:points"
-
-\end_inset
-
-Output at Arbitrary Points
-\end_layout
-
-\begin_layout Standard
-In many situations with recorded observations, one would like to extract
- the solution at the same locations as the recorded observation.
- Rather than forcing the finite-element discretization to be consistent
- with the observation points, PyLith includes a specialized output manager,
- 
-\family typewriter
-OutputSolnPoints
-\family default
-, to interpolate the solution to arbitrary points.
- By default, the output manager will include the displaceent time histories
- in the output.
- The locations are specified in a text file.
- In addition to the 
-\family typewriter
-OutputManager
-\family default
- parameters, the 
-\family typewriter
-OutputSolnSubset
-\family default
- includes:
-\end_layout
-
-\begin_layout Description
-vertex_data_fields Names of vertex data fields to output (default is [``displace
-ments'']).
-\end_layout
-
-\begin_layout Description
-reader Reader for points list (default is 
-\family typewriter
-PointsList
-\family default
-).
-\end_layout
-
-\begin_layout Description
-writer Writer for output (default is 
-\family typewriter
-DataWriterVTKPoints
-\family default
-).
- In most cases users will want to use the 
-\family typewriter
-DataWriterHDF5Mesh
-\family default
-.
-\end_layout
-
-\begin_layout Subsubsection
-PointsList Reader
-\end_layout
-
-\begin_layout Standard
-This object corresponds to a simple text file containing a list of points
- (one per line) where output is desired.
- The points are specified in the coordinate system specified by OutputSolnPoints.
- The coordinates will be transformed into the coordinate system of the mesh
- prior to interpolation.
- The properties available to customize the behavior of 
-\family typewriter
-PointsList
-\family default
- are:
-\end_layout
-
-\begin_layout Description
-filename Names of file containing list of points.
-\end_layout
-
-\begin_layout Description
-comment_delimiter Delimiter at beginning of line to identify comments (default
- is #).
-\end_layout
-
-\begin_layout Description
-value_delimiter Delimiter used to separate values (default is whitespace).
-\end_layout
-
-\begin_layout Subsection
-Output Field Filters
-\end_layout
-
-\begin_layout Standard
-Output fields may not directly correspond to the information a user desires.
- For example, the default output for the state variables includes the physical
- properties at each quadrature point.
- Most visualization packages cannot handle cell fields with multiple points
- in a cell (the locations of the points within the cell are not included
- in the data file).
- In order to reduce the field to a single point within the cell, we would
- like to average the values.
- This is best done within PyLith before output, because it reduces the file
- size and the quadrature information provides the information necessary
- (the weights of the quadrature points) to compute the appropriate average
- over the cell.
-\end_layout
-
-\begin_layout Subsubsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sub:vertex:field:filters"
-
-\end_inset
-
-Vertex Field Filters
-\end_layout
-
-\begin_layout Standard
-Currently the only filter available for vertex fields computes the magnitude
- of a vector at each location.
- Most visualization packages support this operation, so this filter is not
- very useful.
-\end_layout
-
-\begin_layout Description
-VertexFilterVecNorm Computes the magnitude of a vector field at each location.
-\end_layout
-
-\begin_layout Subsubsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sub:cell:field:filters"
-
-\end_inset
-
-Cell Field Filters
-\end_layout
-
-\begin_layout Standard
-Most users will want to apply a filter to cell fields to average the fields
- over the cell, producing values at one location per cell for visualization.
-\end_layout
-
-\begin_layout Description
-CellFilterAvgMesh Compute the weighted average of the values within a bulk
- cell.
- The weights are determined from the quadrature associated with the cells.
-\end_layout
-
-\begin_layout Description
-CellFilterAvgSubMesh Compute the weighted average of the values for a boundary
- cell.
- The weights are determined from the quadrature associated with the cells.
-\end_layout
-
-\begin_layout Subsection
-VTK Output
-\end_layout
-
-\begin_layout Standard
-PyLith writes legacy (non-XML) VTK files.
- These are simple files with vertex coordinates, the mesh topology, and
- fields over vertices and/or cells.
- Each time step is written to a different file.
- The time stamp is included in the filename with the decimal point removed.
- This allows automatic generation of animations with many visualization
- packages that use VTK files.
- The default time stamp is the time in seconds, but this can be changed
- using the normalization constant to give a time stamp in years, tens of
- years, or any other value.
-\end_layout
-
-\begin_layout Subsubsection
-DataWriterVTK Parameters
-\end_layout
-
-\begin_layout Standard
-The parameters for the VTK writer are:
-\end_layout
-
-\begin_layout Description
-filename Name of VTK file
-\end_layout
-
-\begin_layout Description
-time_format C-style format string for time stamp in filename.
- The decimal point in the time stamp will be removed for compatibility with
- VTK visualization packages that provide seamless animation of data from
- multiple VTK files.
-\end_layout
-
-\begin_layout Description
-time_constant Value used to normalize time stamp in VTK files (default is
- 1.0 s).
-\end_layout
-
-\begin_layout Subsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sub:HDF5/Xdmf-Output"
-
-\end_inset
-
-HDF5/Xdmf Output
-\end_layout
-
-\begin_layout Standard
-HDF5 files provide a flexible framework for storing simulation data with
- datasets in groups logically organized in a tree structure analogous to
- files in directories.
- HDF5 output offers parallel, multi-dimensional array output in binary files,
- so it is much faster and more convenient than the VTK output which uses
- ASCII files and separate files for each time step.
- Standards for organizing datasets and groups in HDF5 files do not exist
- for general finite-element software in geodynamics.
- Consequently, PyLith uses its own simple layout show in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:hdf5:layout"
-
-\end_inset
-
-.
- In order for visualization tools, such as ParaView, to determine which
- datasets to read and where to find them in the hierarchy of groups within
- the HDF5 file, we create an Xdmf (eXtensible Data Model and Format, 
-\begin_inset Flex URL
-status open
-
-\begin_layout Plain Layout
-
-www.xdmf.org
-\end_layout
-
-\end_inset
-
-) metadata file that provides this information.
- This file is written when PyLith closes the HDF5 file at the end of the
- simulation.
- In order to visualize the datasets in an HDF5 file, one simply opens the
- corresponding Xdmf file (the extension is 
-\family typewriter
-.xmf
-\family default
-) in ParaView or Visit.
- The Xdmf file contains the relative path to the HDF5 file so the files
- can be moved but must be located together in the same directory.
- 
-\end_layout
-
-\begin_layout Quote
-
-\series bold
-\color red
-Note:
-\color inherit
- 
-\series default
-The Xdmf format supports representation of two- and three-dimensional coordinate
-s of points, scalar vector field types, and three-dimensional vector and
- tensor vector field types but not two-dimensional vector or tensor vector
- field types.
- As a result, we separate the components of two-dimensional vector and tensor
- vector field objects and add the component as a suffix to the name of the
- field.
- The vector can be reconstructed within ParaView using the Calculator (see
- Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Tutorial-Subduction"
-
-\end_inset
-
- for an example).
- Accessing the datasets in the HDF5 files using tools such as h5py (included
- with the PyLith binary and installed by default with the PyLith Installer)
- and PyTables with visualization through MayaVi circumvents this problem,
- but requires writing Python scripts and a deeper knowledge of the visualization
- interface.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Graphics
-	filename figs/hdf5layout.eps
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Layout of PyLith HDF5 file.
- The orange rectangles with rounded corners identify the groups and the
- blue rectangles with sharp corners identify the datasets.
- The dimensions of the data sets are shown in parentheses.
- Most HDF5 files will contain either 
-\family typewriter
-vertex_fields
-\family default
- or 
-\family typewriter
-cell_fields
-\family default
- but not both.
- 
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:hdf5:layout"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-HDF5 files do not contain self-correcting features that allow a file to
- be read if part of a dataset is corrupted.
- This type of error can occur if a job terminates abnormally in the middle
- or at the end of a simulation on a large cluster or other parallel machine.
- Fortunately, HDF5 also offers the ability to store datasets in external
- binary files with the locations specified by links in the HDF5 file.
- Note that the use of external data files results in one data file per dataset
- in addition to the HDF5 and Xdmf files.
- The external data files use the name of the HDF5 file with the dataset
- name added to the prefix and the 
-\family typewriter
-.h5
-\family default
- suffix replaced by 
-\family typewriter
-.dat
-\family default
-).
- The HDF5 files include relative paths to the external data files, so these
- files can also be moved, but they, too, must be kept together in the same
- directory.
- This provides a more robust method of output because one can generate an
- HDF5 file associated with the uncorrupted portions of the external data
- files should an error occur.
- Currently, PyLith does not include a utility to do this, but we plan to
- add one in a future release.
- Thus, there are two options when writing PyLith output to HDF5 files: (1)
- including the datasets directly in the HDF5 files themselves or (2) storing
- the datasets in external binary files with just metadata in the HDF5 files.
- Both methods provide similar performance because they will use MPI I/O
- if it is available.
- 
-\end_layout
-
-\begin_layout Quote
-
-\series bold
-\color red
-Warning:
-\color inherit
- 
-\series default
-Storing the datasets within the HDF5 file in a parallel simulation requires
- that the HDF5 library be configured with the 
-\family typewriter
---enable-parallel
-\family default
- option.
- 
-\color none
-The binary PyLith packages include this feature and it is a default setting
- in building HDF5 via the PyLith Installer.
-\end_layout
-
-\begin_layout Standard
-Accessing the datasets for additional analysis or visualization is nearly
- identical in the two methods because the use of external data files is
- completely transparent to the user except for the presence of the additional
- files.
- Note that in order for ParaView to find the HDF5 and external data files,
- it must be run from the same relative location where the simulation was
- run.
- For example, if the simulation was run from a directory called 
-\begin_inset Quotes eld
-\end_inset
-
-work
-\begin_inset Quotes erd
-\end_inset
-
- and the HDF5/Xdmf files were written to 
-\begin_inset Quotes eld
-\end_inset
-
-work/output
-\begin_inset Quotes erd
-\end_inset
-
-, then ParaView should be run from the 
-\begin_inset Quotes eld
-\end_inset
-
-work
-\begin_inset Quotes erd
-\end_inset
-
- directory.
- See Table 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "tab:material:output:components"
-
-\end_inset
-
- in Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:material:parameters"
-
-\end_inset
-
-for a table of component values for tensor output.
-\end_layout
-
-\begin_layout Subsubsection
-HDF5 Utilities
-\end_layout
-
-\begin_layout Standard
-HDF5 includes several utilities for examining the contents of HDF5 files.
- 
-\family typewriter
-h5dump
-\family default
- is very handy for displaying the hierarchy, dimensions of datasets, attributes,
- and even the dataset values.
- 
-\end_layout
-
-\begin_layout Quote
-Dump the entire HDF5 file to stdout (not practical or useful for large files):
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-h5dump mydata.h5
-\end_layout
-
-\end_deeper
-\begin_layout Quote
-Dump the hierarchy of an HDF5 file to stdout:
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-h5dump -n mydata.h5
-\end_layout
-
-\end_deeper
-\begin_layout Quote
-Dump the hierarchy with dataset dimensions and attributes to stdout:
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-h5dump -H mydata.h5
-\end_layout
-
-\end_deeper
-\begin_layout Quote
-Dump dataset 'vertices' in group '/geometry' to stdout:
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-h5dump -d /geometry/vertices mydata.h5
-\end_layout
-
-\end_deeper
-\begin_layout Subsubsection
-DataWriterHDF5 Parameters
-\end_layout
-
-\begin_layout Standard
-This HDF5 writer stores the datasets inside the HDF5 file and the parameters
- are:
-\end_layout
-
-\begin_layout Description
-filename Name of HDF5 file (the Xdmf filename is generated from the same
- prefix).
-\end_layout
-
-\begin_layout Subsubsection
-DataWriterHDF5Ext Parameters
-\end_layout
-
-\begin_layout Standard
-This HDF5 writer stores the datasets using external data files (a more robust
- method for parallel runs) and the parameters are:
-\end_layout
-
-\begin_layout Description
-filename Name of HDF5 file (the external dataset filenames and the Xdmf
- filename are generated from the same prefix).
-\end_layout
-
-\begin_layout Standard
-An example of changing the writer from the default VTK writer to the HDF5
- writer with external datasets for output over the domain in a 
-\family typewriter
-.cfg
-\family default
- file is
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.domain.output]
-\end_layout
-
-\begin_layout LyX-Code
-output_freq = time_step
-\end_layout
-
-\begin_layout LyX-Code
-time_step = 1.0*yr
-\end_layout
-
-\begin_layout LyX-Code
-cell_data_fields = [displacement,velocity]
-\end_layout
-
-\begin_layout LyX-Code
-writer = pylith.meshio.DataWriterHDF5ExtMesh
-\end_layout
-
-\begin_layout LyX-Code
-writer.filename = dislocation.h5
-\end_layout
-
-\begin_layout Section
-Tips and Hints
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:Tips:Hints"
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Tips and Hints For Running PyLith
-\end_layout
-
-\begin_layout Itemize
-Examine the examples for a problem similar to the one you want to run and
- dissect it in detail.
-\end_layout
-
-\begin_layout Itemize
-Start with a uniform-resolution coarse mesh to debug the problem setup.
- Increase the resolution as necessary to resolve the solution fields of
- interest (resolving stresses/strains may require a higher resolution than
- that for resolving displacements).
-\end_layout
-
-\begin_layout Itemize
-Merge materials using the same material model.
- This will result in only one VTK or HDF5 file for each material model rather
- than several files.
-\end_layout
-
-\begin_layout Itemize
-The rate of convergence in quasi-static (implicit) problems can sometimes
- be improved by renumbering the vertices in the finite-element mesh to reduce
- the bandwidth of the sparse matrix.
- PyLith can use the reverse Cuthill-McKee algorithm to reorder the vertices
- and cells.
-\end_layout
-
-\begin_layout Itemize
-If you encounter errors or warnings, run 
-\family typewriter
-pylithinfo
-\family default
- or use the 
-\family typewriter
---help
-\family default
-, 
-\family typewriter
---help-components
-\family default
-, and 
-\family typewriter
---help-properties
-\family default
- command line arguments when running PyLith to check the parameters to make
- sure PyLith is using the parameters you intended.
-\end_layout
-
-\begin_layout Itemize
-Use the 
-\family typewriter
---petsc.log_summary
-\family default
-, 
-\family typewriter
---petsc.ksp_monitor
-\family default
-, 
-\family typewriter
---petsc.ksp_view
-\family default
-, 
-\family typewriter
---petsc.ksp_converged_reason
-\family default
-, and 
-\family typewriter
---petsc.snes_converged_reason
-\family default
- command line arguments (or set them in a parameter file) to view PyLith
- performance and monitor the convergence.
-\end_layout
-
-\begin_layout Itemize
-Turn on the journals (see the examples) to monitor the progress of the code.
-\end_layout
-
-\begin_layout Subsection
-Troubleshooting
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:Troubleshooting"
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Itemize
-Consult the PyLith FAQ webpage (
-\begin_inset Flex URL
-status open
-
-\begin_layout Plain Layout
-
-http://www.geodynamics.org/cig/community/workinggroups/short/workarea/pylith-wiki
-\end_layout
-
-\end_inset
-
-) which contains a growing list of common problems and their corresponding
- solutions.
-\end_layout
-
-\begin_layout Itemize
-
-\family typewriter
-ImportError: liblapack.so.2: cannot open shared object file: No such file
- or directory
-\end_layout
-
-\begin_layout Quote
-PyLith cannot find one of the libraries.
- You need to set up your environment variables (e.g., PATH, PYTHONPATH, and
- LD_LIBRARY_PATH) to match your installation.
- If you are using the PyLith binary on Linux or Mac OS X, run the command
- 
-\family typewriter
-source setup.sh 
-\family default
-in the directory where you unpacked the distribution.
- This will set up your environment variables for you.
- If you are building PyLith from source, please consult the instructions
- for building from source.
-\end_layout
-
-\begin_layout Itemize
-\paragraph_spacing single
-
-\family typewriter
->> {command line}:: 
-\begin_inset Newline newline
-\end_inset
-
--- pyre.inventory(error) 
-\begin_inset Newline newline
-\end_inset
-
--- p4wd <- 'true' 
-\begin_inset Newline newline
-\end_inset
-
--- unrecognized property 'p4wd' 
-\begin_inset Newline newline
-\end_inset
-
->> {command line}:: 
-\begin_inset Newline newline
-\end_inset
-
--- pyre.inventory(error) 
-\begin_inset Newline newline
-\end_inset
-
--- p4pg <- 'true' 
-\begin_inset Newline newline
-\end_inset
-
--- unrecognized property ' p4pg'
-\end_layout
-
-\begin_layout Quote
-Verify that the `mpirun' command included in the PyLith package is the first
- one on your PATH:
-\end_layout
-
-\begin_layout Quote
-
-\family typewriter
-$ which mpirun
-\end_layout
-
-\begin_layout Quote
-If it is not, adjust your PATH environment variable accordingly.
-\end_layout
-
-\begin_layout Itemize
-
-\family typewriter
-"merlin.DistributionNotFound: Cheetah" error
-\end_layout
-
-\begin_layout Quote
-This error occurs when trying to use the 32-bit linux binary on some 64-bit
- linux systems.
- One of the Python packages PyLith uses does not know how to determine the
- system architecture at runtime.
- The workaround is:
-\end_layout
-
-\begin_layout Enumerate
-Go to the lib/python2.6/site-packages directory.
-\end_layout
-
-\begin_layout Enumerate
-Unzip merlin-1.7-py2.6.egg (if it is a file and not a directory).
-\end_layout
-
-\begin_layout Enumerate
-Go to the merlin directory.
-\end_layout
-
-\begin_layout Enumerate
-Edit __init__.py.
- Replace line 308 plat = get_platform() with plat = "linux-i686"
-\end_layout
-
-\begin_layout Enumerate
-If merlin-1.7-py2.6.egg is a file, rezip merlin.
- Go to the site-packages directory and enter "zip -r merlin-1.7-py2.6.egg merlin".
-\end_layout
-
-\begin_layout Itemize
-
-\family typewriter
--- Solving equations.
-\begin_inset Newline newline
-\end_inset
-
-[0]PETSC ERROR: ---------------- Error Message -------------------------------
- 
-\begin_inset Newline newline
-\end_inset
-
-[0]PETSC ERROR: Detected zero pivot in LU factorization
-\begin_inset Newline newline
-\end_inset
-
- see http://www.mcs.anl.gov/petsc/petsc-as/documentation/faq.html#ZeroPivot!
-\end_layout
-
-\begin_layout Quote
-This usually occurs when the null space of the system Jacobian is nonzero,
- such as the case of a problem without Dirichlet boundary conditions on
- any boundary.
- If this arises when using the split fields and algebraic multigrid precondition
-ing and no additional Dirichlet boundary conditions are desired, then the
- workaround is to revert to using the Additive Schwarz preconditioning without
- split fields as discussed in Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:petsc:options"
-
-\end_inset
-
-.
- 
-\end_layout
-
-\begin_layout Itemize
-PyLith crashes with a bus error.
-\end_layout
-
-\begin_layout Quote
-This often indicates that PyLith is using incompatible versions of libraries.
- This can result from changing your environment variables after configuring
- or installing PyLith (when building from source) or errors in setting the
- environment variables (PATH, LD_LIBRARY_PATH, and PYTHONPATH).
- If the former case, simply reconfigure and rebuild PyLith.
- In the latter case, check your environment variables (order matters!) to
- make sure PyLith finds the desired directories before system directories.
- 
-\end_layout
-
-\begin_layout Itemize
-PyLith crashes with a segmentation fault.
-\end_layout
-
-\begin_layout Quote
-A segmentation fault might be caused by an error that wasn't trapped or
- a bug in the code.
- Please report these cases so that we can fix these problems (either trap
- the error and provide the user with an informative error message, or fix
- the bug).
- If this occurs with any of the problems distributed with PyLith, simply
- submit a bug report (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Getting-Help-and"
-
-\end_inset
-
-) indicating which problem you ran and your platform.
- If the crash occurs for a problem you created, it is a great help if you
- can try to reproduce the crash with a very simple problem (e.g., adjust the
- boundary conditions or other parameters of one of the examples to reproduce
- the segmentation fault).
- Submit a bug report along with log files showing the backtrace from a debugger
- (e.g., gdb) and the valgrind log file (only available on Linux platforms).
- You can generate a backtrace using the debugger by using the 
-\family typewriter
---petsc.start_in_debugger
-\family default
- command line argument:
-\end_layout
-
-\begin_layout LyX-Code
-pylith [..args..] --petsc.start_in_debugger
-\end_layout
-
-\begin_layout LyX-Code
-(gdb) continue
-\end_layout
-
-\begin_layout LyX-Code
-(gdb) backtrace
-\end_layout
-
-\begin_layout Quote
-To use valgrind to detect the memory error, first go to your working directory
- and run the problem with 
-\family typewriter
---launcher.dry
-\family default
-:
-\end_layout
-
-\begin_layout LyX-Code
-pylith [..args..] --launcher.dry
-\end_layout
-
-\begin_layout Quote
-Instead of actually running the problem, this causes PyLith to dump the
- mpirun/mpiexec command it will execute.
- Copy and paste this command into your shell so you can run it directly.
- Insert the full path to valgrind before the full path to mpinemesis and
- tell valgrind to use a log file:
-\end_layout
-
-\begin_layout LyX-Code
-
-\size small
-mpirun -np 1 /path/to/valgrind --log-file=valgrind-log  /path/to/mpinemesis
- --pyre-start [..lots of junk..]
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 1
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 2in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 2
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Chapter
+Running PyLith
+\end_layout
+
+\begin_layout Standard
+There are essentially three major inputs needed to run a problem with PyLith:
+\end_layout
+
+\begin_layout Enumerate
+A set of parameters describing the problem.
+ These parameters describe the type of problem to be run, solver information,
+ time-stepping information, boundary conditions, materials, etc.
+ This information can be provided from the command-line or by using a 
+\family typewriter
+.cfg
+\family default
+ or 
+\family typewriter
+.pml
+\family default
+ file.
+\end_layout
+
+\begin_layout Enumerate
+Mesh information.
+ This includes the topology of the finite-element mesh (coordinates of vertices
+ and how the vertices are connected into cells), a material identifier for
+ each cell, and sets of vertices associated with boundary conditions, faults,
+ and output (for subsets of the mesh).
+ This information can be provided using the PyLith mesh ASCII format (see
+ Chapter 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Tutorials"
+
+\end_inset
+
+ for examples and Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:MeshIOAscii"
+
+\end_inset
+
+ for the format specification) or by importing the information from the
+ LaGriT or CUBIT meshing packages (see Chapter 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Tutorials"
+
+\end_inset
+
+ for examples).
+\end_layout
+
+\begin_layout Enumerate
+Databases specifying the material property values and boundary condition
+ values to be used.
+ Arbitrarily complex spatial variations in boundary and fault conditions
+ and material properties may be given in the spatial database (see Chapter
+ 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Tutorials"
+
+\end_inset
+
+ for examples and Appendix 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Spatialdata:SimpleIOAscii"
+
+\end_inset
+
+ for the format specification).
+\end_layout
+
+\begin_layout Section
+Defining the Simulation
+\end_layout
+
+\begin_layout Standard
+The parameters for PyLith are specified as a hierarchy or tree of modules.
+ The application assembles the hierarchy of modules from user input and
+ then calls the 
+\family typewriter
+main
+\family default
+ function in the top-level module in the same manner as a C or C++ program.
+ The behavior of the application is determined by the modules included in
+ the hierarchy as specified by the user.
+ The Pyre framework provides the interface for defining this hierarchy.
+ Pyre properties correspond to simple settings in the form of strings, integers,
+ and real numbers.
+ Pyre facilities correspond to software modules.
+ Facilities may have their own facilities (branches in the tree) and any
+ number of properties.
+ See Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:Pyre:Architecture"
+
+\end_inset
+
+ for the general concept of Pyre facilities and properties.
+ The top-level object is the PyLith application with three facilities: 
+\family typewriter
+mesher
+\family default
+, 
+\family typewriter
+problem
+\family default
+, and 
+\family typewriter
+petsc
+\family default
+.
+ The 
+\family typewriter
+mesher
+\family default
+ specifies how to import the mesh, the 
+\family typewriter
+problem
+\family default
+ specifies the physical properties, boundary conditions, etc., and 
+\family typewriter
+petsc
+\family default
+ is used to specify PETSc settings.
+ Appendix 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:components"
+
+\end_inset
+
+ contains a list of the components provided by PyLith and spatialdata.
+\end_layout
+
+\begin_layout Subsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:setting:parameters"
+
+\end_inset
+
+Setting PyLith Parameters
+\end_layout
+
+\begin_layout Standard
+There are several methods for setting input parameters for the 
+\family typewriter
+pylith
+\family default
+ executable: via the command line or by using a text file in 
+\family typewriter
+.cfg
+\family default
+ or 
+\family typewriter
+.pml
+\family default
+ format.
+ Both facilities and properties have default values provided, so you only
+ need to set values when you want to deviate from the default behavior.
+\end_layout
+
+\begin_layout Subsubsection
+Units
+\end_layout
+
+\begin_layout Standard
+All dimensional parameters require units.
+ The units are specified using Python and FORTRAN syntax, so square meters
+ is m**2.
+ Whitespace is not allowed in the string, for units and dimensioned quantities
+ are multiplied by the units string; for example, two meters per second
+ is 2.0*m/s.
+ Available units are shown in Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:pyre:units"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:pyre:units"
+
+\end_inset
+
+Pyre supported units.
+ Aliases are in parentheses.
+\end_layout
+
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="5" columns="2">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0.9in">
+<column alignment="left" valignment="top" width="4in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Scale
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Available Units
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+length
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+meter (m), micrometer (um, micron), millimeter (mm), centimeter (cm), kilometer
+ (km), inch, foot, yard, mile
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+time
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+second (s), nanosecond (ns), microsecond (us), millisecond (ms), minute,
+ hour, day, year
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+mass
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+kilogram (kg), gram (g), centigram (cg), milligram (mg), ounce, pound, ton
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+pressure
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+pascal (Pa), kPa, MPa, GPa, bar, millibar, atmosphere (atm)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Using the Command Line
+\end_layout
+
+\begin_layout Standard
+Pyre uses the following syntax to change properties from the command line.
+ To change the value of a property of a component, use:
+\end_layout
+
+\begin_layout LyX-Code
+
+\family typewriter
+--[component].[property]=[value]
+\end_layout
+
+\begin_layout Standard
+Each component is attached to a facility, so the option above can also be
+ written as: 
+\end_layout
+
+\begin_layout LyX-Code
+
+\family typewriter
+--[facility].[property]=[value]
+\end_layout
+
+\begin_layout Standard
+Each facility has a default component attached to it.
+ A different component can be attached to a facility by:
+\end_layout
+
+\begin_layout LyX-Code
+
+\family typewriter
+--[facility]=[new_component] 
+\end_layout
+
+\begin_layout Standard
+PyLith's command-line arguments can control Pyre and PyLith properties and
+ facilities, MPI settings, and PETSc settings.
+ You can get more information on the available options by typing
+\end_layout
+
+\begin_layout LyX-Code
+
+\family typewriter
+$ pylith --help
+\end_layout
+
+\begin_layout Standard
+All PyLith-related properties are associated with the 
+\family typewriter
+pylithapp
+\family default
+ component.
+ You can get a list of all of these top-level properties along with a descriptio
+n of what they do by running PyLith with the 
+\family typewriter
+--help-properties
+\family default
+ command-line argument.
+ To get information on user-configurable facilities and components, you
+ can run PyLith with the 
+\family typewriter
+--help-components
+\family default
+ command-line argument.
+ To find out about the properties associated with a given component, you
+ can run PyLith with the 
+\family typewriter
+--[component].help-properties
+\family default
+ flag:
+\end_layout
+
+\begin_layout LyX-Code
+$ pylith --problem.help-properties
+\end_layout
+
+\begin_layout Standard
+Each component may also have sub-components associated with it:
+\end_layout
+
+\begin_layout LyX-Code
+$ pylith -- problem.help-components
+\end_layout
+
+\begin_layout Standard
+By starting at the top-level components, you can determine the components
+ and properties at each level by working down to lower-level components:
+\end_layout
+
+\begin_layout LyX-Code
+$ pylith --problem.bc.help-components
+\end_layout
+
+\begin_layout LyX-Code
+$ pylith --problem.bc.help-properties
+\end_layout
+
+\begin_layout Standard
+Using the 
+\family typewriter
+--help-components
+\family default
+ and 
+\family typewriter
+--help-properties
+\family default
+ flags for the various components and sub-components is a good way to discover
+ potential problems in a simulation.
+\end_layout
+
+\begin_layout Subsubsection
+Using a 
+\family typewriter
+.cfg
+\family default
+ File
+\end_layout
+
+\begin_layout Standard
+Entering all those parameters via the command line involves the risk of
+ typographical errors, which can lead to undesired results.
+ You will generally find it easier to write a brief 
+\family typewriter
+.cfg
+\family default
+ input file that contains the parameters.
+ This file has a format similar to a Windows INI file.
+ The file is composed of one or more sections which are formatted as follows:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.subcomponent1.subcomponent2]
+\end_layout
+
+\begin_layout LyX-Code
+# this is a comment
+\end_layout
+
+\begin_layout LyX-Code
+property1 = value1
+\end_layout
+
+\begin_layout LyX-Code
+property2 = value2 ; this is another comment
+\end_layout
+
+\begin_layout Standard
+We strongly recommend that you use 
+\family typewriter
+.cfg
+\family default
+ files for your work.
+ The files are syntax-colored in the vim editor.
+\end_layout
+
+\begin_layout Subsubsection
+Using a 
+\family typewriter
+.pml
+\family default
+ File
+\end_layout
+
+\begin_layout Standard
+A 
+\family typewriter
+.pml
+\family default
+ file is an XML file that specifies parameter values in a highly structured
+ format.
+ It is composed of nested sections which are formatted as follows:
+\end_layout
+
+\begin_layout LyX-Code
+<component name='component1'>
+\end_layout
+
+\begin_layout LyX-Code
+    <component name='component2'>
+\end_layout
+
+\begin_layout LyX-Code
+        <property name='property1'>value1</property>
+\end_layout
+
+\begin_layout LyX-Code
+        <property name='property2'>value2</property>
+\end_layout
+
+\begin_layout LyX-Code
+    </component>
+\end_layout
+
+\begin_layout LyX-Code
+</component>
+\end_layout
+
+\begin_layout Standard
+XML files are intended to be read and written by machines, not edited manually
+ by humans.
+ The 
+\family typewriter
+.pml
+\family default
+ file format is intended for applications in which PyLith input files are
+ generated by another program, e.g., a GUI, web application, or a high-level
+ structured editor.
+ This file format will not be discussed further here, but if you are interested
+ in using 
+\family typewriter
+.pml
+\family default
+ files, note that 
+\family typewriter
+.pml
+\family default
+ files and 
+\family typewriter
+.cfg
+\family default
+ files can be used interchangeably; in the following discussion, a file
+ with a 
+\family typewriter
+.pml
+\family default
+ extension can be substituted anywhere a 
+\family typewriter
+.cfg
+\family default
+ file can be used.
+\end_layout
+
+\begin_layout Subsubsection
+Specification and Placement of Configuration Files
+\end_layout
+
+\begin_layout Standard
+Configuration files may be specified on the command line:
+\end_layout
+
+\begin_layout LyX-Code
+$ pylith example.cfg
+\end_layout
+
+\begin_layout Standard
+In addition, the Pyre framework searches for configuration files named 
+\family typewriter
+pylithapp.cfg
+\family default
+ in several predefined locations.
+ You may put settings in any or all of these locations, depending on the
+ scope you want the settings to have:
+\end_layout
+
+\begin_layout Enumerate
+
+\family typewriter
+$PREFIX/etc/pylithapp.cfg
+\family default
+, for system-wide settings;
+\end_layout
+
+\begin_layout Enumerate
+
+\family typewriter
+$HOME/.pyre/pylithapp/pylithapp.cfg
+\family default
+, for user settings and preferences;
+\end_layout
+
+\begin_layout Enumerate
+the current directory (
+\family typewriter
+./pylithapp.cfg
+\family default
+), for local overrides.
+ 
+\end_layout
+
+\begin_layout Standard
+Parameters given directly on the command line will override any input contained
+ in a configuration file.
+ Configuration files given on the command line override all others.
+ The 
+\family typewriter
+pylithapp.cfg
+\family default
+ files placed in (3) will override those in (2), (2) overrides (1), and
+ (1) overrides only the built-in defaults.
+\end_layout
+
+\begin_layout Standard
+All of the example problems are set up using configuration files in the
+ example directory, and specific problems are defined by including the appropria
+te configuration file on the command-line.
+ Referring to the directory 
+\family typewriter
+examples/twocells/twohex8
+\family default
+, the following configuration files are present:
+\end_layout
+
+\begin_layout LyX-Code
+axialdisp.cfg
+\end_layout
+
+\begin_layout LyX-Code
+dislocation.cfg
+\end_layout
+
+\begin_layout LyX-Code
+pylithapp.cfg
+\end_layout
+
+\begin_layout LyX-Code
+sheardisp.cfg
+\end_layout
+
+\begin_layout Standard
+The settings in pylithapp.cfg will be read automatically, and additional
+ settings are included by specifying one of the other files on the command-line:
+\end_layout
+
+\begin_layout LyX-Code
+$ pylith axialdisp.cfg
+\end_layout
+
+\begin_layout Standard
+If you want to see what settings are being used, you can either examine
+ the 
+\family typewriter
+.cfg
+\family default
+ files, or use the help flags as described above:
+\end_layout
+
+\begin_layout LyX-Code
+$ pylith axialdisp.cfg --problem.help-components
+\end_layout
+
+\begin_layout LyX-Code
+$ pylith axialdisp.cfg --problem.help-properties
+\end_layout
+
+\begin_layout LyX-Code
+$ pylith axialdisp.cfg --problem.bc.help-components
+\end_layout
+
+\begin_layout LyX-Code
+$ pylith axialdisp.cfg --problem.bc.help-properties
+\end_layout
+
+\begin_layout Standard
+This is generally a more useful way of determining problem settings, since
+ it includes default values as well as those that have been specified in
+ the 
+\family typewriter
+.cfg
+\family default
+ file.
+\end_layout
+
+\begin_layout Subsubsection
+List of PyLith Parameters (
+\family typewriter
+pylithinfo
+\family default
+)
+\end_layout
+
+\begin_layout Standard
+The Python application 
+\family typewriter
+pylithinfo
+\family default
+ writes all of the current parameters to a text file.
+ The default name of the text file is 
+\family typewriter
+pylith_parameters.txt
+\family default
+.
+ The usage synopsis is
+\end_layout
+
+\begin_layout LyX-Code
+$ pylithinfo [--verbose] [--fileout=pylith_parameters.txt] [PyLith args]
+\end_layout
+
+\begin_layout Standard
+where 
+\family typewriter
+--verbose
+\family default
+ (or 
+\family typewriter
+-v
+\family default
+) turns on printing the descriptions of the properties and components as
+ well as the location where the current value was set, and 
+\family typewriter
+--fileout=pylith_parameters.txt
+\family default
+ (or 
+\family typewriter
+-o pylith_parameters.txt
+\family default
+) sets the name of the output file.
+ The lines in the text file are indented to show the hierarchy of the properties
+ and components.
+ 
+\end_layout
+
+\begin_layout Subsection
+Mesh Information (
+\family typewriter
+mesher
+\family default
+)
+\end_layout
+
+\begin_layout Standard
+Geometrical and topological information for the finite element mesh may
+ be provided by exporting an Exodus II format file from CUBIT, by exporting
+ a GMV file and an accompanying Pset file from LaGriT, or by specifying
+ the information in PyLith mesh ASCII format.
+ See Chapter 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Tutorials"
+
+\end_inset
+
+ for examples.
+\end_layout
+
+\begin_layout Standard
+PyLith supports linear cells in 1D (Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:1D-linear-elements"
+
+\end_inset
+
+), 2D (Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:2D-linear-elements"
+
+\end_inset
+
+), and 3D (Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:3D-linear-elements"
+
+\end_inset
+
+).
+ The vertex ordering must follow the convention shown in Figures 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:1D-linear-elements"
+
+\end_inset
+
+-
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:3D-linear-elements"
+
+\end_inset
+
+.
+ Quadratic cells are also supported, but at present the only method for
+ using these cells in PyLith is using PyLith ASCII format.
+ PyLith does not yet support automatic generation of a quadratic mesh from
+ the linear meshes created by CUBIT or LaGriT.
+\end_layout
+
+\begin_layout Standard
+The mesh information defines the vertex coordinates and specifies the vertices
+ composing each cell in the mesh.
+ The mesh information must also define at least one set of vertices for
+ which displacement (Dirichlet) boundary conditions will be provided.
+ In most realistic problems, there will be several vertex groups, each with
+ a unique identifying label.
+ For example, one group might define a surface of the mesh where displacement
+ (Dirichlet) boundary conditions will be applied, another might define a
+ surface where traction (Neumann) boundary conditions will be applied, while
+ a third might specify a surface that defines a fault.
+ Similarly, the mesh information contains cell labels that define the material
+ type for each cell in the mesh.
+ For a mesh with a single material type, there will only be a single label
+ for every cell in the mesh.
+ See Chapters 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:material:models"
+
+\end_inset
+
+ and 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:boundary:interface:conditions"
+
+\end_inset
+
+ for more detailed discussions of setting the materials and boundary conditions.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Graphics
+	filename figs/bar2.eps
+
+\end_inset
+
+ 
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Linear bar cell available for 1D problems.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:1D-linear-elements"
+
+\end_inset
+
+ 
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Graphics
+	filename figs/tri3.eps
+
+\end_inset
+
+
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+hspace*{0.5in}
+\end_layout
+
+\end_inset
+
+
+\begin_inset Graphics
+	filename figs/quad4.eps
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Linear cells available for 2D problems are the triangle (left) and the quadrilat
+eral (right).
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:2D-linear-elements"
+
+\end_inset
+
+ 
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Graphics
+	filename figs/tet4.eps
+
+\end_inset
+
+
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+hspace*{0.5in}
+\end_layout
+
+\end_inset
+
+
+\begin_inset Graphics
+	filename figs/hex8.eps
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Linear cells available for 3D problems are the tetrahedron (left) and the
+ hexahedron (right).
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:3D-linear-elements"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Mesh Importer
+\end_layout
+
+\begin_layout Standard
+The default mesher component is MeshImporter, which provides the capabilities
+ of reading the mesh from files.
+ The MeshImporter has several properties and facilities:
+\end_layout
+
+\begin_layout Description
+reorder_mesh Reorder the vertices and cells using the reverse Cuthill-McKee
+ algorithm (default is False).
+\end_layout
+
+\begin_layout Description
+reader Reader for a given type of mesh (default is MeshIOAscii).
+\end_layout
+
+\begin_layout Description
+distributor Handles distribution of the mesh among processors.
+\end_layout
+
+\begin_layout Description
+refiner Perform global uniform mesh refinement after distribution among
+ processors (default is False).
+\end_layout
+
+\begin_layout Standard
+Reordering the mesh so that vertices and cells connected topologically also
+ reside close together in memory improves overall performance and can improve
+ solver performance as well.
+\end_layout
+
+\begin_layout Quote
+
+\color red
+Note:
+\color inherit
+ The coordinate system associated with the mesh must be a Cartesian coordinate
+ system.
+ This includes generic Cartesian coordinate systems as well as geographic
+ projections.
+\end_layout
+
+\begin_layout Subsubsection
+MeshIOAscii
+\end_layout
+
+\begin_layout Standard
+The MeshIOAscii object is intended for reading small, simple ASCII files
+ containing a mesh constructed by hand.
+ We use this file format extensively in the examples.
+ Appendix 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:MeshIOAscii"
+
+\end_inset
+
+ describes the format of the files.
+ The properties and facilities of the MeshIOAscii object include:
+\end_layout
+
+\begin_layout Description
+filename Name of the mesh file.
+\end_layout
+
+\begin_layout Description
+coordsys Coordinate system associated with the mesh.
+\end_layout
+
+\begin_layout Subsubsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:MeshIOCubit"
+
+\end_inset
+
+MeshIOCubit
+\end_layout
+
+\begin_layout Standard
+The MeshIOCubit object reads the NetCDF Exodus II files output from CUBIT.
+ Beginning with CUBIT 11.0, the names of the nodesets are included in the
+ Exodus II files and PyLith can use these nodeset names or revert to using
+ the nodeset ids.
+ The properties and facilities associated with the MeshIOCubit object are:
+\end_layout
+
+\begin_layout Description
+filename Name of the Exodus II file.
+\end_layout
+
+\begin_layout Description
+use_nodeset_names Identify nodesets by name rather than id (default is True).
+\end_layout
+
+\begin_layout Description
+coordsys Coordinate system associated with the mesh.
+\end_layout
+
+\begin_layout Subsubsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:MeshIOLagrit"
+
+\end_inset
+
+MeshIOLagrit
+\end_layout
+
+\begin_layout Standard
+The MeshIOLagrit object is used to read ASCII and binary GMV and PSET files
+ output from LaGriT.
+ PyLith will automatically detect whether the files are ASCII or binary.
+ We attempt to provide support for experimental 64-bit versions of LaGriT
+ via flags indicating whether the FORTRAN code is using 32-bit or 64-bit
+ integers.
+ The MeshIOLagrit properties and facilities are:
+\end_layout
+
+\begin_layout Description
+filename_gmv Name of GMV file.
+\end_layout
+
+\begin_layout Description
+filename_pset Name of the PSET file.
+\end_layout
+
+\begin_layout Description
+flip_endian Flip the endian of values when reading binary files (default
+ is False).
+\end_layout
+
+\begin_layout Description
+io_int32 Flag indicating that PSET files use 32-bit integers (default is
+ True).
+\end_layout
+
+\begin_layout Description
+record_header_32bt Flag indicating FORTRAN record header is 32-bit (default
+ is True)
+\end_layout
+
+\begin_layout Description
+coordsys Coordinate system associated with mesh.
+\end_layout
+
+\begin_layout Subsubsection
+Distributor
+\end_layout
+
+\begin_layout Standard
+The distributor users a partitioner to compute which cells should be placed
+ on each processor, computes the overlap among the processors, and then
+ distributes the mesh among the processors.
+ The properties and facilities of the Distributor include:
+\end_layout
+
+\begin_layout Description
+partitioner Choice of partitioner (
+\begin_inset Quotes eld
+\end_inset
+
+parmetis
+\begin_inset Quotes erd
+\end_inset
+
+ or 
+\begin_inset Quotes eld
+\end_inset
+
+chaco
+\begin_inset Quotes erd
+\end_inset
+
+, default is 
+\begin_inset Quotes eld
+\end_inset
+
+chaco
+\begin_inset Quotes erd
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Description
+writer_partition Flag indicating that the partition information should be
+ written to a file (default is False).
+\end_layout
+
+\begin_layout Description
+data_writer Writer for partition information (default is DataWriterVTKMesh
+ for VTK output).
+\end_layout
+
+\begin_layout Standard
+ParMETIS is not included in the PyLith binaries due to licensing issues.
+\end_layout
+
+\begin_layout Subsubsection
+Refiner
+\end_layout
+
+\begin_layout Standard
+The refiner is used to decrease node spacing by a factor of two by subdividing
+ each cell.
+ In a 2D triangular mesh a node is inserted at the midpoint of each edge,
+ splitting each cell into four cells (see Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:uniform:refinement:2x"
+
+\end_inset
+
+).
+ In a 2D quadrilateral mesh a node is inserted at the midpoint of each edge
+ and at the centroid of the cell, splitting each cell into four cells.
+ In a 3D tetrahedral mesh a node is inserted at the midpoint of each edge,
+ splitting each cell into eight cells.
+ In a 3D hexahedral mesh a node is inserted at the midpoint of each edge,
+ the centroid of each face, and at the centroid of the cell, splitting each
+ cell into eight cells.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Graphics
+	filename figs/refinement2x.eps
+	scale 125
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Global uniform mesh refinement of 2D and 3D linear cells.
+ The blue lines and orange circles identify the edges and vertices in the
+ original cells.
+ The purple lines and green circles identify the new edges and vertices
+ added to the original cells to refine the mesh by a factor of two.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:uniform:refinement:2x"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Refinement occurs after distribution of the mesh among processors.
+ This allows one to run much larger simulations by (1) permitting the mesh
+ generator to construct a mesh with a node spacing twice as large as that
+ needed in the simulation and (2) operations performed in serial during
+ the simulation setup phase, such as, adjusting the topology to insert cohesive
+ cells and distribution of the mesh among processors uses this much smaller
+ coarse mesh.
+ For 2D problems the global mesh refinement increases the maximum problem
+ size by a factor of four, and for 3D problems it increases the maximum
+ problem size by a factor of eight.
+\end_layout
+
+\begin_layout Subsection
+Problem Specification (
+\family typewriter
+problem
+\family default
+)
+\end_layout
+
+\begin_layout Standard
+The problem component specifies the basic parameters of the simulation,
+ including the physical properties, the boundary conditions, and interface
+ conditions (faults).
+ The current release of PyLith contains two types of problem, 
+\family typewriter
+TimeDependent
+\family default
+ for use in static, quasi-static, and dynamic simulations and 
+\family typewriter
+GreensFns
+\family default
+ for computing static Green's functions.
+ The general facilities include:
+\end_layout
+
+\begin_layout Description
+normalizer Scales used to nondimensionalize the problem (default is NondimElasti
+cQuasistatic).
+\end_layout
+
+\begin_layout Description
+materials Array of materials comprising the domain (default is 
+\family typewriter
+[material]
+\family default
+).
+\end_layout
+
+\begin_layout Description
+bc Array of boundary conditions (default is none).
+\end_layout
+
+\begin_layout Description
+interfaces Array of interface conditions, i.e., faults (default is none).
+\end_layout
+
+\begin_layout Description
+gravity_field Gravity field used to construct body forces (default is none).
+\end_layout
+
+\begin_layout Standard
+The properties for each material group are:
+\end_layout
+
+\begin_layout Description
+dimension Spatial dimension of the problem (default is 3)
+\end_layout
+
+\begin_layout Standard
+An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file for a problem is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent]
+\end_layout
+
+\begin_layout LyX-Code
+dimension = 3
+\end_layout
+
+\begin_layout LyX-Code
+normalizer = spatialdata.units.NondimElasticQuasistatic
+\end_layout
+
+\begin_layout LyX-Code
+materials = [elastic,viscoelastic]
+\end_layout
+
+\begin_layout LyX-Code
+bc = [boundary_east,boundary_bottom,boundary_west]
+\end_layout
+
+\begin_layout LyX-Code
+interfaces = [SanAndreas,SanJacinto]
+\end_layout
+
+\begin_layout LyX-Code
+gravity_field = spatialdata.spatialdb.GravityField
+\end_layout
+
+\begin_layout Subsubsection
+Nondimensionalization
+\end_layout
+
+\begin_layout Standard
+PyLith nondimensionalizes all parameters provided by the user so that the
+ simulation solves the equations using nondimensional quantities.
+ This permits application of PyLith to problems across a vast range of spatial
+ and temporal scales.
+ The scales used to nondimensionalize the problem are length, pressure,
+ density, and time.
+ PyLith provides two normalizer objects to make it easy to provide reasonable
+ scales for the nondimensionalization.
+ The 
+\family typewriter
+NondimElasticQuasistatic
+\family default
+ normalizer has the following properties:
+\end_layout
+
+\begin_layout Description
+length_scale Length to nondimensionalize length (default is 1.0 km).
+\end_layout
+
+\begin_layout Description
+shear_modulus Shear modulus to nondimensionalize pressure (default is 3.0e+10
+ Pa).
+\end_layout
+
+\begin_layout Description
+relaxation_time Relaxation time to nondimensionalize time (default is 1.0
+ year).
+\end_layout
+
+\begin_layout Standard
+An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file for a problem is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.normalizer]
+\end_layout
+
+\begin_layout LyX-Code
+length_scale = 1.0*km
+\end_layout
+
+\begin_layout LyX-Code
+shear_modules = 3.0e+10*Pa
+\end_layout
+
+\begin_layout LyX-Code
+relaxation_time = 1.0*yr
+\end_layout
+
+\begin_layout Standard
+The 
+\family typewriter
+NondimElasticDynamic
+\family default
+ normalizer has the following properties:
+\end_layout
+
+\begin_layout Description
+shear_wave_speed Shear wave speed used to nondimensionalize length and pressure
+ (default is 3.0 km/s).
+\end_layout
+
+\begin_layout Description
+mass_density Mass density to nondimensionalize density and pressure (default
+ is 3.0e+3 kg/m
+\begin_inset Formula $^{3}$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Description
+wave_period Period of seismic waves used to nondimensionalize time (default
+ is 1.0 s).
+\end_layout
+
+\begin_layout Standard
+An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file for a problem is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.normalizer]
+\end_layout
+
+\begin_layout LyX-Code
+shear_wave_speed = 3.0*km/s
+\end_layout
+
+\begin_layout LyX-Code
+mass_density = 3.0e+3*kg/m**3
+\end_layout
+
+\begin_layout LyX-Code
+wave_period = 1.0*s
+\end_layout
+
+\begin_layout Subsection
+Finite-Element Integration Settings
+\end_layout
+
+\begin_layout Standard
+PyLith uses numerical quadrature to evaluate the finite-element integrals
+ for the residual and system Jacobian (see Chapter 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Governing-Equations"
+
+\end_inset
+
+).
+ PyLith employs FIAT (finite element automatic tabulator) to compute the
+ basis functions and their derivatives at the quadrature points for various
+ quadrature schemes and cell shapes.
+ The parameters for Lagrange cells (lines, quadrilaterals, hexahedra) are
+ specified using the FIATLagrange object, whereas the parameters for Simplex
+ cells (lines, triangles, tetrahedra) are specified using the FIATSimplex
+ object.
+ Both objects use the same set of parameters and PyLith will setup the basis
+ functions and quadrature scheme appropriately for the two families of cells.
+ The quadrature scheme and basis functions must be set for each material
+ and boundary condition involving finite-element integrations (Dirichlet
+ boundary conditions are constraints and do not involve integrations).
+ Furthermore, the integration schemes can be set independently.
+ The current version of PyLith supports basis functions with linear variations
+ in the field (P1); support for higher order cells will be added in the
+ future.
+ The properties for the FIATLagrange and FIATSimplex objects are
+\end_layout
+
+\begin_layout Description
+dimension Dimension of the cell (0,1,2,3; default is 3).
+\end_layout
+
+\begin_layout Description
+degree Degree of the finite-element cell (default is 1).
+\end_layout
+
+\begin_layout Description
+order Order of quadrature rule (default is degree+1); hardwired to be equal
+ to degree for faults.
+\end_layout
+
+\begin_layout Description
+collocate_quad Collocate quadrature points with vertices (default is False);
+ hardwired to True for faults.
+\end_layout
+
+\begin_layout Standard
+See Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:material:parameters"
+
+\end_inset
+
+ for an example of setting these properties for a material.
+\end_layout
+
+\begin_layout Subsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:petsc:options"
+
+\end_inset
+
+PETSc Settings (
+\family typewriter
+petsc
+\family default
+)
+\end_layout
+
+\begin_layout Standard
+In quasti-static problems with implicit time-stepping, PyLith relies on
+ PETSc for the linear algebra computations, including linear Krylov subspace
+ solvers and nonlinear solvers.
+ For dynamic problems, lumping the mass matrix and using explicit time-stepping
+ is much more efficient; this permits solving the linear system with a trivial
+ solver so we do not use a PETSc solver in this case (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:solvers"
+
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Standard
+PETSc options can be set in 
+\family typewriter
+.cfg
+\family default
+ files in sections beginning with 
+\family typewriter
+[pylithapp.petsc]
+\family default
+.
+ The options of primary interest in the case of PyLith are shown in Table
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:petsc:options:defaults"
+
+\end_inset
+
+.
+ PETSc options are used to control the selection and settings for the solvers
+ underlying the SolverLinear and SolverNonlinear objects discussed in Section
+ 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:solvers"
+
+\end_inset
+
+.
+ A very wide range of elasticity problems in quasi-static simulations can
+ be solved with reasonable runtimes by replacing the default Jacobi precondition
+er with the Additive Schwarz Method (ASM) using Incomplete LU (ILU) factorizatio
+n by default (see Table
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:petsc:options:recommended"
+
+\end_inset
+
+).
+ A more advanced set of solver settings that may provide better performance
+ in many elasticity problems are given in Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:petsc:options:advanced"
+
+\end_inset
+
+.
+ These settings are limited to problems where we store the stiffness matrix
+ as a nonsymmetric sparse matrix and require additional settings for the
+ formulation,
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.formulation]
+\end_layout
+
+\begin_layout LyX-Code
+split_fields = True
+\end_layout
+
+\begin_layout LyX-Code
+use_custom_constraint_pc = True ; Use only if problem contains a fault
+\end_layout
+
+\begin_layout LyX-Code
+matrix_type = aij
+\end_layout
+
+\begin_layout Quote
+
+\series bold
+\color red
+Warning:
+\color inherit
+ 
+\series default
+\color none
+These settings are only available if you build PETSc with Fortran enabled
+ and the ML package.
+ These features are included in the PyLith binary packages.
+\end_layout
+
+\begin_layout Quote
+
+\series bold
+\color red
+Warning:
+\color inherit
+ 
+\series default
+\color none
+The split fields and algebraic multigrid preconditioning currently fails
+ in problems with a nonzero null space.
+ This most often occurs when a problem contains multiple faults that extend
+ through the entire domain and create subdomains without any Dirichlet boundary
+ conditions.
+ The current workaround is to use the 
+\color inherit
+Additive Schwarz 
+\color none
+preconditioner without split fields.
+ See Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Troubleshooting"
+
+\end_inset
+
+ for the error message encountered in this situation.
+ 
+\end_layout
+
+\begin_layout Standard
+These more advanced settings allow the displacement fields and Lagrange
+ multipliers for fault tractions to be preconditioned separately.
+ This usually results in a much stronger preconditioner.
+ In simulations with fault slip, the degrees of freedom associated with
+ the Lagrange multipliers should be preconditioned with a custom preconditioner
+ that uses a diagonal approximation of the Schur complement.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:petsc:options:defaults"
+
+\end_inset
+
+Useful command-line arguments for setting PETSc options.
+\end_layout
+
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="10" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="1.2in">
+<column alignment="center" valignment="middle" width="0.6in">
+<column alignment="left" valignment="top" width="3.8in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Property
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Default Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+log_summary
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+false
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Print logging objects and events.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+ksp_monitor
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+false
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Dump preconditioned residual norm to stdout.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+ksp_view
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+false
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Print linear solver parameters.
+ 
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+ksp_rtol
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+1.0e-05
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Convergence tolerance for relative decrease in residual norm.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+snes_monitor
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+false
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Dump residual norm to stdout for each nonlinear solve iteration.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+snes_view
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+false
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Print nonlinear solver parameters.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+snes_rtol
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+1.0e-5
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Convergence tolerance for relative decrease in residual norm.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+pc_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+jacobi
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Set preconditioner type.
+ See 
+\begin_inset CommandInset href
+LatexCommand href
+name "PETSc documentation"
+target "http://www.mcs.anl.gov/petsc/petsc-as/documentation/linearsolvertable.html"
+
+\end_inset
+
+ for a list of all preconditioner types.
+ 
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+ksp_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+gmres
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Set linear solver type.
+ See 
+\begin_inset CommandInset href
+LatexCommand href
+name "PETSc documentation"
+target "http://www.mcs.anl.gov/petsc/petsc-as/documentation/linearsolvertable.html"
+
+\end_inset
+
+ for a list of all solver types.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:petsc:options:recommended"
+
+\end_inset
+
+PETSc options that provide moderate performance in a wide range of quasi-static
+ elasticity problems.
+\end_layout
+
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="13" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="2in">
+<column alignment="center" valignment="middle" width="0.75in">
+<column alignment="left" valignment="top" width="3in">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Property
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+pc_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+asm
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Additive Schwarz method.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+ksp_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+gmres
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+GMRES method from Saad and Schultz.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+sub_pc_factor_shift_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\emph on
+nonzero
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Turn on nonzero shifting for factorization.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+ksp_max_it
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\emph on
+100
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Maximum number of iterations permitted in linear solve.
+ Depends on problem size.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+ksp_gmres_restart
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+50
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Number of iterations after which Gram-Schmidt orthogonalization is restarted.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+ksp_rtol
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+1.0e-08
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Linear solve convergence tolerance for relative decrease in residual norm.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+ksp_atol
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+\emph on
+1.0e-12
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Linear solve convergence tolerance for absolute value of residual norm.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+ksp_converged_reason
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+true
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Indicate why iterating stopped in linear solve.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+snes_max_it
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+100
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Maximum number of iterations permitted in nonlinear solve.
+ Depends on how nonlinear the problem is.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+snes_rtol
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+1.0e-08
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Nonlinear solve convergence tolerance for relative decrease in residual
+ norm.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+snes_atol
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+1.0e-12
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Nonlinear solve convergence tolerance for absolute value of residual norm.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+snes_converged_reason
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+true
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Indicate why iterating stopped in nonlinear solve.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float table
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Caption
+
+\begin_layout Plain Layout
+\begin_inset CommandInset label
+LatexCommand label
+name "tab:petsc:options:advanced"
+
+\end_inset
+
+PETSc options used with split fields algebraic multigrid preconditioning
+ that often provide improved performance in quasi-static elasticity problems.
+\end_layout
+
+\end_inset
+
+
+\begin_inset Tabular
+<lyxtabular version="3" rows="8" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="2.25in">
+<column alignment="center" valignment="middle" width="0.75in">
+<column alignment="left" valignment="top" width="3in">
+<row>
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Property
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+\size footnotesize
+fs_pc_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+field_split
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Precondition fields separately.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+\size footnotesize
+fs_pc_fieldsplit_real_diagonal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+true
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Use diagonal blocks from the true operator, rather than the preconditioner.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+\size footnotesize
+fs_pc_fieldsplit_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+multiplicative
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Apply each field preconditioning in sequence, which is stronger than all-at-once
+ (additive).
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+\size footnotesize
+fs_fieldsplit_0_pc_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+ml
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Multilevel algebraic multigrid preconditioning using Trilinos/ML via PETSc.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+\size footnotesize
+fs_fieldsplit_1_pc_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+jacobi
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Jacobi preconditioning for Lagrange multiplier block (only use if there
+ is at least one fault)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+\size footnotesize
+fs_fieldsplit_0_ksp_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+preonly
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Apply only the preconditioner.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\family typewriter
+\size footnotesize
+fs_fieldsplit_1_ksp_type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\shape italic
+preonly
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Apply only the preconditioner.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Model Verification with PETSc Direct Solvers
+\end_layout
+
+\begin_layout Standard
+It is often useful to apply a direct solver so that solver convergence is
+ decoupled from model verification for the purposes of testing.
+ Unfortunately, the traditional LU factorization solvers cannot be directly
+ applied in PyLith due to the saddle-point formulation used to accomodate
+ the fault slip constraints.
+ However, we can combine an LU factorization of the displacement sub-block
+ with a full Schur complement factorization using the PETSc FieldSplit precondit
+ioner.
+ If the solver for the Schur complement S is given a very low tolerance,
+ this is effectively a direct solver.
+ The options given below will construct this solver in PyLith.
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.formulation]
+\end_layout
+
+\begin_layout LyX-Code
+split_fields = True
+\end_layout
+
+\begin_layout LyX-Code
+matrix_type = aij
+\end_layout
+
+\begin_layout LyX-Code
+use_custom_constraint_pc = True
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.petsc]
+\end_layout
+
+\begin_layout LyX-Code
+fs_pc_type = fieldsplit
+\end_layout
+
+\begin_layout LyX-Code
+fs_pc_fieldsplit_type = schur
+\end_layout
+
+\begin_layout LyX-Code
+fs_pc_fieldsplit_schur_precondition = user
+\end_layout
+
+\begin_layout LyX-Code
+fs_pc_fieldsplit_schur_factorization_type = full
+\end_layout
+
+\begin_layout LyX-Code
+fs_pc_fieldsplit_real_diagonal = true
+\end_layout
+
+\begin_layout LyX-Code
+fs_fieldsplit_0_pc_type = lu
+\end_layout
+
+\begin_layout LyX-Code
+fs_fieldsplit_0_ksp_type = gmres
+\end_layout
+
+\begin_layout LyX-Code
+fs_fieldsplit_0_ksp_rtol = 1.0e-10
+\end_layout
+
+\begin_layout LyX-Code
+fs_fieldsplit_1_pc_type = jacobi
+\end_layout
+
+\begin_layout LyX-Code
+fs_fieldsplit_1_ksp_type = gmres
+\end_layout
+
+\begin_layout LyX-Code
+fs_fieldsplit_1_ksp_rtol = 1.0e-10 
+\end_layout
+
+\begin_layout Subsubsection
+PETSc Solvers and nVidia GPUs
+\end_layout
+
+\begin_layout Standard
+The development version of PETSc contains some support for using PETSc solvers
+ and nVidia GPUs via CUDA.
+ Building PETSc requires some additional dependencies as described in 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+http://www.mcs.anl.gov/petsc/documentation/installation.html#CUDA
+\end_layout
+
+\end_inset
+
+.
+ Additionally, PyLith must be configured with the 
+\family typewriter
+--enable-cuda
+\family default
+ option.
+ See the PyLith Installer documentation for how to enable support for CUDA
+ when building PETSc and PyLith with the installer (the installer does not
+ install CUDA or cusp).
+\end_layout
+
+\begin_layout Quote
+
+\series bold
+\color red
+Warning:
+\color inherit
+ 
+\series default
+\color none
+Development of PETSc solvers leveraging nVidia GPUs to accelerate the computatio
+ns is still a work in progress.
+ This feature requires building PETSc and PyLith from source after installing
+ CUDA and the development version of cusp.
+ If your GPU only supports single-precision floating point operations, then
+ PETSc must be built with single precision and without support for ML and
+ ParMetis/Metis.
+\end_layout
+
+\begin_layout Standard
+Solver and preconditioning options are relatively limited when using CUDA.
+ CUDA works with the Additive Schwarz preconditioner and GMRES linear solver.
+ Enabling use of CUDA with the PETSc solver involves just one setting:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.formulation.solver]
+\begin_inset Newline newline
+\end_inset
+
+use_cuda = True
+\end_layout
+
+\begin_layout Standard
+If the matrix type and vector types have not already been set, this will
+ set matrix type and vector types to 
+\family typewriter
+aijcusp
+\family default
+ and 
+\family typewriter
+cusp
+\family default
+, respectively, to indicate to PETSc that CUDA should be used by the solver.
+ If they have already been set to a value, then the values will not be changed
+ even if they are incompatible with using CUDA.
+\end_layout
+
+\begin_layout Section
+Time-Dependent Problem
+\end_layout
+
+\begin_layout Standard
+This type of problem applies to transient static, quasi-static, and dynamic
+ simulations.
+ The time-dependent problem adds the 
+\family typewriter
+formulation
+\family default
+ facility to the general-problem.
+ The formulation specifies the time-stepping formulation to integrate the
+ elasticity equation.
+ PyLith provides several alternative formulations, each specific to a different
+ type of problem.
+\end_layout
+
+\begin_layout Description
+Implicit Implicit time stepping for static and quasi-static problems with
+ infinitesimal strains.
+ The implicit formulation neglects inertial terms (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:elasticity:integral:quasistatic"
+
+\end_inset
+
+).
+ 
+\end_layout
+
+\begin_layout Description
+ImplicitLgDeform Implicit time stepping for static and quasi-static problems
+ including the effects of rigid body motion and small strains.
+ This formulation requires the use of the nonlinear solver, which is selected
+ automatically.
+\end_layout
+
+\begin_layout Description
+Explicit Explicit time stepping for dynamic problems with infinitesimal
+ strains and lumped system Jacobian.
+ The cell matrices are lumped before assembly, permitting use of a vector
+ for the diagonal system Jacobian matrix.
+ The built-in lumped solver is selected automatically.
+\end_layout
+
+\begin_layout Description
+ExplicitLgDeform Explicit time stepping for dynamic problems including the
+ effects of rigid body motion and small strains.
+ The cell matrices are lumped before assembly, permitting use of a vector
+ for the diagonal system Jacobian matrix.
+ The built-in lumped solver is selected automatically.
+\end_layout
+
+\begin_layout Description
+ExplicitTri3 Optimized elasticity formulation for linear triangular cells
+ with one point quadrature for dynamic problems with infinitesimal strains
+ and lumped system Jacobian.
+ The built-in lumped solver is selected automatically.
+\end_layout
+
+\begin_layout Description
+ExplicitTet4 Optimized elasticity formulation for linear tetrahedral cells
+ with one point quadrature for dynamic problems with infinitesimal strains
+ and lumped system Jacobian.The built-in lumped solver is selected automatically.
+\end_layout
+
+\begin_layout Standard
+In many quasi-static simulations it is convenient to compute a static problem
+ with elastic deformation prior to computing a transient response.
+ Up through PyLith version 1.6 this was hardwired into the Implicit Forumulation
+ as advancing from time step 
+\begin_inset Formula $t=-\Delta t$
+\end_inset
+
+ to 
+\begin_inset Formula $t=0$
+\end_inset
+
+, and it could not be turned off.
+ PyLith now includes a property, 
+\family typewriter
+elastic_prestep
+\family default
+ in the TimeDependent component to turn on/off this behavior (the default
+ is to retain the previous behavior of computing the elastic deformation).
+ 
+\end_layout
+
+\begin_layout Quote
+
+\series bold
+\color red
+Warning:
+\color inherit
+ 
+\series default
+\color none
+Turning off the elastic prestep calculation means the model only deforms
+ when an 
+\family typewriter
+\shape italic
+\color inherit
+increment
+\family default
+\shape default
+\color none
+ in loading or deformation is applied, because the time-stepping formulation
+ is implemented using the increment in displacement.
+\end_layout
+
+\begin_layout Standard
+The TimeDependent properties and facilities include
+\end_layout
+
+\begin_layout Description
+elastic_preset If true, perform a static calculation with elastic behavior
+ before time stepping (default is True).
+\end_layout
+
+\begin_layout Description
+formulation Formulation for solving the partial differential equation.
+\end_layout
+
+\begin_layout Standard
+An example of setting the properties and components in a .cfg file is
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent]
+\end_layout
+
+\begin_layout LyX-Code
+formulation = pylith.problems.Implicit ; default
+\end_layout
+
+\begin_layout LyX-Code
+elastic_preset = True ; default
+\end_layout
+
+\begin_layout Standard
+The formulation value can be set to the other formulations in a similar
+ fashion.
+ 
+\end_layout
+
+\begin_layout Subsection
+Time-Stepping Formulation
+\end_layout
+
+\begin_layout Standard
+The explicit and implicit time stepping formulations use a common set of
+ facilities and properties.
+ The facilities include
+\end_layout
+
+\begin_layout Description
+time_step Time step size specification (default is uniform time step).
+\end_layout
+
+\begin_layout Description
+solver Type of solver to use (default is SolverLinear).
+\end_layout
+
+\begin_layout Description
+output Array of output managers for output of the solution (default is [output]).
+\end_layout
+
+\begin_layout Description
+jacobian_viewer Viewer to dump the system Jacobian (sparse matrix) to a
+ file for analysis (default is PETSc binary).
+\end_layout
+
+\begin_layout Standard
+The formulation properties include
+\end_layout
+
+\begin_layout Description
+matrix_type Type of PETSc matrix for the system Jacobian (sparse matrix,
+ default is symmetric, block matrix with a block size of 1).
+\end_layout
+
+\begin_layout Description
+view_jacobian Flag to indicate if system Jacobian (sparse matrix) should
+ be written to a file (default is false).
+\end_layout
+
+\begin_layout Description
+split_fields Split solution field into a displacement portion (fields 0..ndim-1)
+ and a Lagrange multiplier portion (field ndim) to permit application of
+ sophisticated PETSc preconditioners (default is false).
+\end_layout
+
+\begin_layout Standard
+An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file is
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+[pylithapp.timedependent.formulation]
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+time_step = pylith.problems.TimeStepUniform
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+solver = pylith.problems.SolverLinear ; Nonlinear solver is pylith.problems.SolverNo
+nlinear
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+output = [domain,ground_surface]
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+matrix_type = sbaij ; To use a non-symmetric sparse matrix, set it to aij
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+view_jacobian = false
+\end_layout
+
+\begin_layout Subsection
+Numerical Damping in Explicit Time Stepping
+\end_layout
+
+\begin_layout Standard
+In explicit time-stepping formulations for elasticity, boundary conditions
+ and fault slip can excite short waveform elastic waves that are not accurately
+ resolved by the discretization.
+ We use numerical damping via an artificial viscosity
+\begin_inset CommandInset citation
+LatexCommand cite
+key "Knopoff:Ni:2001,Day:Ely:2002"
+
+\end_inset
+
+ to reduce these high frequency oscillations.
+ In computing the strains for the elasticity term in equation 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "eq:elasticity:integral:dynamic:t"
+
+\end_inset
+
+, we use an adjusted displacement rather than the actual displacement, where
+ 
+\begin_inset Formula 
+\begin{equation}
+\vec{u}^{adj}(t)=\vec{u}(t)+\eta^{*}\Delta t\vec{\dot{u}}(t),
+\end{equation}
+
+\end_inset
+
+
+\begin_inset Formula $\vec{u}^{adj}(t)$
+\end_inset
+
+ is the adjusted displacement at time t, 
+\begin_inset Formula $\vec{u}(t)$
+\end_inset
+
+is the original displacement at time (t), 
+\begin_inset Formula $\eta^{*}$
+\end_inset
+
+is the normalized artificial viscosity, 
+\begin_inset Formula $\Delta t$
+\end_inset
+
+ is the time step, and 
+\begin_inset Formula $\vec{\dot{u}}(t)$
+\end_inset
+
+ is the velocity at time 
+\begin_inset Formula $t$
+\end_inset
+
+.
+ The default value for the normalized artificial viscosity is 0.1.
+ We have found values in the range 0.1-0.4 sufficiently suppress numerical
+ noise while not excessively reducing the peak velocity.
+ An example of setting the normalized artificial viscosity in a 
+\family typewriter
+.cfg
+\family default
+ file is
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.formulation]
+\end_layout
+
+\begin_layout LyX-Code
+norm_viscosity = 0.2
+\end_layout
+
+\begin_layout Subsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:solvers"
+
+\end_inset
+
+Solvers
+\end_layout
+
+\begin_layout Standard
+PyLith supports three types of solvers.
+ The linear solver, SolverLinear, corresponds to the PETSc KSP solver and
+ is used in linear problems with linear elastic and viscoelastic bulk constituti
+ve models and kinematic fault ruptures.
+ The nonlinear solver, SolverNonlinear, corresponds to the PETSc SNES solver
+ and is used in nonlinear problems with nonlinear viscoelastic or elastoplastic
+ bulk constitutive models, dynamic fault ruptures, or problems involving
+ finite strain (small strain formulation).
+ The lumped solver (SolverLumped) is a specialized solver used with the
+ lumped system Jacobian matrix.
+ The options for the PETSc KSP and SNES solvers are set via the top-level
+ PETSc options (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:petsc:options"
+
+\end_inset
+
+ and the PETSc documentation 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+www.mcs.anl.gov/petsc/petsc-as/documentation/index.html
+\end_layout
+
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Subsection
+Time Stepping
+\end_layout
+
+\begin_layout Standard
+PyLith provides three choices for controlling the time step in time-dependent
+ simulations.
+ These include (1) a uniform, user-specified time step (which is the default),
+ (2) nonuniform, user-specified time steps, and (3) nonuniform, automatically
+ calculated time steps.
+ The procedure for automatically selecting time steps requires that the
+ material models provide a reasonable estimate of the time step for stable
+ time integration.
+ In general, quasi-static simulations should use automatically calculated
+ time steps and dynamic simulations should use a uniform, user-specified
+ time step.
+\end_layout
+
+\begin_layout Standard
+
+\series bold
+\color red
+Warning:
+\series default
+\color none
+ 
+\color inherit
+Changing the time step requires recomputing the Jacobian of the system,
+ which can greatly increase the runtime if the time-step size changes frequently.
+\end_layout
+
+\begin_layout Subsubsection
+Uniform, User-Specified Time Step
+\end_layout
+
+\begin_layout Standard
+With a uniform, user-specified time step, the user selects the time step
+ that is used over the entire duration of the simulation.
+ This value is used whether or not it yields a stable solution, so users
+ should be careful when selecting the time-step value.
+ The properties for the uniform, user-specified time step are:
+\end_layout
+
+\begin_layout Description
+total_time Time duration for simulation (default is 0.0 s).
+\end_layout
+
+\begin_layout Description
+start_time Start time for simulation (default is 0.0 s)
+\end_layout
+
+\begin_layout Description
+dt Time step for simulation.
+\end_layout
+
+\begin_layout Standard
+An example of setting a uniform, user-specified time step in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.formulation]
+\end_layout
+
+\begin_layout LyX-Code
+time_step = pylith.problems.TimeStepUniform ; Default value
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.formulation.time_step]
+\end_layout
+
+\begin_layout LyX-Code
+total_time = 1000.0*year
+\end_layout
+
+\begin_layout LyX-Code
+dt = 0.5*year
+\end_layout
+
+\begin_layout Subsubsection
+Nonuniform, User-Specified Time Step
+\end_layout
+
+\begin_layout Standard
+The nonuniform, user-specified, time-step implementation allows the user
+ to specify the time steps in an ASCII file (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:FileFormat:TimeStepUser"
+
+\end_inset
+
+ for the format specification of the time-step file).
+ If the total duration exceeds the time associated with the time steps,
+ then a flag determines whether to cycle through the time steps or to use
+ the last specified time step for the time remaining.
+ The properties for the nonuniform, user-specified time step are:
+\end_layout
+
+\begin_layout Description
+total_time Time duration for simulation.
+\end_layout
+
+\begin_layout Description
+filename Name of file with time-step sizes.
+\end_layout
+
+\begin_layout Description
+loop_steps If true, cycle through time steps, otherwise keep using last
+ time-step size for any time remaining.
+\end_layout
+
+\begin_layout Standard
+An example of setting the properties for nonuniform, user-specified time
+ steps in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.formulation]
+\end_layout
+
+\begin_layout LyX-Code
+time_step = pylith.problems.TimeStepUser ; Change the time step algorithm
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.formulation.time_step]
+\end_layout
+
+\begin_layout LyX-Code
+total_time = 1000.0*year
+\end_layout
+
+\begin_layout LyX-Code
+filename = timesteps.txt
+\end_layout
+
+\begin_layout LyX-Code
+loop_steps = false ; Default value
+\end_layout
+
+\begin_layout Subsubsection
+Nonuniform, Automatic Time Step
+\end_layout
+
+\begin_layout Standard
+This time-step implementation automatically calculates a stable time step
+ based on the constitutive model and rate of deformation.
+ As a result, this choice for choosing the time step relies on accurate
+ calculation of a stable time step within each finite-element cell by the
+ constitutive models.
+ In order to provide some control over the time-step selection, the user
+ can control the frequency that a new time step is calculated, the time
+ step to use relative to the value determined by the constitutive models,
+ and a maximum value for the time step.
+ The properties for controlling the automatic time-step selection are:
+\end_layout
+
+\begin_layout Description
+total_time Time duration for simulation.
+\end_layout
+
+\begin_layout Description
+max_dt Maximum time step permitted.
+\end_layout
+
+\begin_layout Description
+adapt_skip Number of time steps to skip between calculating new stable time
+ step.
+\end_layout
+
+\begin_layout Description
+stability_factor Safety factor for stable time step (default is 2.0).
+\end_layout
+
+\begin_layout Standard
+An example of setting the properties for the automatic time step in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.formulation]
+\end_layout
+
+\begin_layout LyX-Code
+time_step = pylith.problems.TimeStepAdapt ; Change the time step algorithm
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.formulation.time_step]
+\end_layout
+
+\begin_layout LyX-Code
+total_time = 1000.0*year
+\end_layout
+
+\begin_layout LyX-Code
+max_dt = 10.0*year
+\end_layout
+
+\begin_layout LyX-Code
+adapt_skip = 10 ; Default value
+\end_layout
+
+\begin_layout LyX-Code
+stability_factor = 2.0 ; Default value
+\end_layout
+
+\begin_layout Section
+Green's Functions Problem
+\end_layout
+
+\begin_layout Standard
+This type of problem applies to computing static Green's functions for elastic
+ deformation.
+ The 
+\family typewriter
+GreensFns
+\family default
+ problem specializes the time-dependent facility to the case of static simulatio
+ns with slip impulses on a fault.
+ The default formulation is the Implicit formulation and should not be changed
+ as the other formulations are not applicable to static Green's functions.
+ In the output files, the deformation at each 
+\begin_inset Quotes eld
+\end_inset
+
+time step
+\begin_inset Quotes erd
+\end_inset
+
+ is the deformation for a different slip impulse.
+ The properties provide the ability to select which fault to use for slip
+ impulses.
+ The only fault component available for use with the 
+\family typewriter
+GreensFns
+\family default
+ problem is the 
+\family typewriter
+FaultCohesiveImpulses
+\family default
+ component discussed in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:fault:cohesive:impulses"
+
+\end_inset
+
+.
+ The 
+\family typewriter
+GreensFns
+\family default
+ properties include:
+\end_layout
+
+\begin_layout Description
+fault_id Id of fault on which to impose slip impulses.
+\end_layout
+
+\begin_layout Standard
+An example of setting the properties for the GreensFns problem in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp]
+\end_layout
+
+\begin_layout LyX-Code
+problem = pylith.problems.GreensFns ; Change problem type from the default
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.greensfns]
+\end_layout
+
+\begin_layout LyX-Code
+fault_id = 100 ; Default value
+\end_layout
+
+\begin_layout Standard
+
+\series bold
+\color red
+Warning:
+\series default
+\color none
+ 
+\color inherit
+The 
+\family typewriter
+GreensFns
+\family default
+ problem generates slip impulses on a fault.
+ The current version of PyLith requires that impulses can only be applied
+ to a single fault and the fault facility must be set to 
+\family typewriter
+FaultCohesiveImpulses
+\family default
+.
+\end_layout
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:spatial:databases"
+
+\end_inset
+
+Databases for Boundaries, Interfaces, and Material Properties
+\end_layout
+
+\begin_layout Standard
+Once the problem has been defined with PyLith parameters, and the mesh informati
+on has been provided, the final step is to specify the boundary conditions
+ and material properties to be used.
+ The mesh information provides labels defining sets of vertices to which
+ boundary conditions or fault conditions will be applied, as well as cell
+ labels that will be used to define the material type of each cell.
+ For boundary conditions, the 
+\family typewriter
+.cfg
+\family default
+ file is used to associate boundary condition types and spatial databases
+ with each vertex group (see Chapter 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:boundary:interface:conditions"
+
+\end_inset
+
+).
+ For materials, the 
+\family typewriter
+.cfg
+\family default
+ file is used to associate material types and spatial databases with cells
+ identified by the material identifier (see Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:Material-models"
+
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Standard
+The spatial databases define how the boundary conditions or material property
+ values vary spatially, and they can be arbitrarily complex.
+ The simplest example for a material database would be a mesh where all
+ the cells of a given type have uniform properties (
+\begin_inset Quotes eld
+\end_inset
+
+point
+\begin_inset Quotes erd
+\end_inset
+
+ or 0D variation).
+ A slightly more complex case would be a mesh where the cells of a given
+ type have properties that vary linearly along a given direction (
+\begin_inset Quotes eld
+\end_inset
+
+line
+\begin_inset Quotes erd
+\end_inset
+
+ or 1D variation).
+ In more complex models, the material properties might have different values
+ at each point in the mesh (
+\begin_inset Quotes eld
+\end_inset
+
+volume
+\begin_inset Quotes erd
+\end_inset
+
+ or 3D variation).
+ This might be the case, for example, if the material properties are provided
+ by a database of seismic velocities and densities.
+ For boundary conditions the simplest case would be where all vertices in
+ a given group have the same boundary condition parameters (
+\begin_inset Quotes eld
+\end_inset
+
+point
+\begin_inset Quotes erd
+\end_inset
+
+ or 0D variation).
+ A more complex case might specify a variation in the conditions on a given
+ surface (
+\begin_inset Quotes eld
+\end_inset
+
+area
+\begin_inset Quotes erd
+\end_inset
+
+ or 2D variation).
+ This sort of condition might be used, for example, to specify the variation
+ of slip on a fault plane.
+ The examples discussed in Chapter 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Tutorials"
+
+\end_inset
+
+ also contain more information regarding the specification and use of the
+ spatial database files.
+\end_layout
+
+\begin_layout Subsection
+SimpleDB Spatial Database
+\end_layout
+
+\begin_layout Standard
+In most cases the default type of spatial database for faults, boundary
+ conditions, and materials is 
+\family typewriter
+SimpleDB
+\family default
+.
+ Spatial database files provide specification of a field over some set of
+ points.
+ There is no topology associated with the points.
+ Although multiple values can be specified at each point with more than
+ one value included in a search query, the interpolation of each value will
+ be done independently.
+ Time dependent variations of a field are not supported in these files.
+ Spatial database files can specify spatial variations over zero, one, two,
+ and three dimensions.
+ Zero dimensional variations correspond to uniform values.
+ One-dimensional spatial variations correspond to piecewise linear variations,
+ which need not coincide with coordinate axes.
+ Likewise, two-dimensional spatial variations correspond to variations on
+ a planar surface (which need not coincide with the coordinate axes) and
+ three-dimensional spatial variations correspond to variations over a volume.
+ In one, two, or three dimensions, queries can use a 
+\begin_inset Quotes eld
+\end_inset
+
+nearest value
+\begin_inset Quotes erd
+\end_inset
+
+ search or linear interpolation.
+\end_layout
+
+\begin_layout Standard
+The spatial database files need not provide the data using the same coordinate
+ system as the mesh coordinate system, provided the two coordinate systems
+ are compatible.
+ Examples of compatible coordinate systems include geographic coordinates
+ (longitude/latitude/elevation), and projected coordinates (e.g., coordinates
+ in a transverse Mercator projection).
+ Spatial database queries use the Proj.4 Cartographic Projections library
+ 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+proj.maptools.org
+\end_layout
+
+\end_inset
+
+ to convert between coordinate systems, so a large number of geographic
+ projections are available with support for converting between NAD27 and
+ WGS84 horizontal datums as well as several other frequently used datums.
+ Because the interpolation is done in the coordinate system of the spatial
+ database, geographic coordinates should only be used for very simple datasets,
+ or undesirable results will occur.
+ This is especially true when the spatial database coordinate system combines
+ latitude, longitude, and elevation in meters (longitude and latitude in
+ degrees are often much smaller than elevations in meters leading to distorted
+ 
+\begin_inset Quotes eld
+\end_inset
+
+distance
+\begin_inset Quotes erd
+\end_inset
+
+ between locations and interpolation).
+\end_layout
+
+\begin_layout Standard
+SimpleDB uses a simple ASCII file to specify the variation of values (e.g.,
+ displacement field, slip field, physical properties) in space.
+ The file format is described in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Spatialdata:SimpleIOAscii"
+
+\end_inset
+
+.
+ The tutorials in Chapter 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Tutorials"
+
+\end_inset
+
+ use SimpleDB files to specify the values for the boundary conditions, 
+ physical properties, and fault slip.
+\end_layout
+
+\begin_layout Standard
+As in the other Pyre objects, spatial database objects contain parameters
+ that can be set from the command line or using 
+\family typewriter
+.cfg or .pml
+\family default
+ files.
+ The parameters for a spatial database are:
+\end_layout
+
+\begin_layout Description
+label Label for the database, which is used in diagnostic messages.
+\end_layout
+
+\begin_layout Description
+query_type Type of search query to perform.
+ Values for this parameter are ``linear'' and ``nearest'' (default).
+\end_layout
+
+\begin_layout Description
+iohandler Database importer.
+ Only one importer is implemented, so you do not need to change this setting.
+\end_layout
+
+\begin_layout Description
+iohandler.filename Filename for the spatial database.
+\end_layout
+
+\begin_layout Standard
+An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+label = Material properties
+\end_layout
+
+\begin_layout LyX-Code
+query_type = linear
+\end_layout
+
+\begin_layout LyX-Code
+iohandler.filename = mydb.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+
+\end_layout
+
+\begin_layout Subsection
+UniformDB Spatial Database
+\end_layout
+
+\begin_layout Standard
+The SimpleDB spatial database is quite general, but when the values are
+ uniform, it is often easier to use the UniformDB spatial database instead.
+ With the UniformDB, you specify the values directly either on the command
+ line or in a parameter-setting (
+\family typewriter
+.cfg
+\family default
+) file.
+ On the other hand, if the values are used in more than one place, it is
+ easier to place the values in a SimpleDB file, because they can then be
+ referred to using the filename of the spatial database rather than having
+ to repeatedly list all of the values on the command line or in a parameter-sett
+ing (
+\family typewriter
+.cfg
+\family default
+) file.
+ The Pyre properties for a UniformDB are:
+\end_layout
+
+\begin_layout Description
+values Array of names of values in spatial database
+\end_layout
+
+\begin_layout Description
+data Array of values in spatial database
+\end_layout
+
+\begin_layout Subsubsection
+Example
+\end_layout
+
+\begin_layout Standard
+Specify the physical properties of a linearly elastic, isotropic material
+ in a 
+\family typewriter
+pylithapp.cfg
+\family default
+ file.
+ The data values are dimensioned with the appropriate units using Python
+ syntax.
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+[pylithapp.timedependent.materials.material]
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+db_properties = spatialdata.spatialdb.UniformDB ; Set the db to a UniformDB
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+db_properties.values = [vp,vs,density] ; Set the names of the values in the
+ database
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+db_properties.data = [5773.5*m/s, 3333.3*m/s, 2700.0*kg/m**3] ; Set the values
+ in the database
+\end_layout
+
+\begin_layout Subsubsection
+ZeroDispDB
+\end_layout
+
+\begin_layout Standard
+The ZeroDispDB is a a special case of the UniformDB for the Dirichlet boundary
+ conditions.
+ The values in the database are the ones requested by the Dirichlet boundary
+ conditions, 
+\family typewriter
+displacement-x
+\family default
+, 
+\family typewriter
+displacement-y
+\family default
+, and 
+\family typewriter
+displacement-z
+\family default
+, and are all set to zero.
+ This makes it trivial to set displacements to zero on a boundary.
+ The examples discussed in Chapter 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Tutorials"
+
+\end_inset
+
+ use this database.
+\end_layout
+
+\begin_layout Subsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sub:SCECCVMH-Impl"
+
+\end_inset
+
+SCEC CVM-H Spatial Database
+\end_layout
+
+\begin_layout Standard
+Although the SimpleDB implementation is able to specify arbitrarily complex
+ spatial variations, there are existing databases for physical properties,
+ and when they are available, it is desirable to access these directly.
+ One such database is the SCEC CVM-H database, which provides seismic velocities
+ and density information for much of southern California.
+ Spatialdata provides a direct interface to this database.
+ See Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Tutorial-Two-tet4-geoproj"
+
+\end_inset
+
+ for an example of using the SCEC CVM-H database for physical properties
+ of an elastic material.
+ The interface is known to work with versions 5.2 and 5.3 of the SCEC CVM-H.
+ Setting a minimum wave speed can be used to replace water and very soft
+ soils that are incompressible or nearly incompressible with stiffer, compressib
+le materials.
+ The Pyre properties for the SCEC CVM-H are:
+\end_layout
+
+\begin_layout Description
+data_dir Directory containing the SCEC CVM-H data files
+\end_layout
+
+\begin_layout Description
+min_vs Minimum shear wave speed.
+ Corresponding minimum values for the dilatational wave speed (Vp) and density
+ are computed.
+ Default value is 500 m/s.
+\end_layout
+
+\begin_layout Description
+squash Squash topography/bathymetry to sea level (make the earth's surface
+ flat)
+\end_layout
+
+\begin_layout Description
+squash_limit Elevation above which topography is squashed (geometry below
+ this elevation remains undistorted)
+\end_layout
+
+\begin_layout Subsubsection
+Example
+\end_layout
+
+\begin_layout Standard
+Specify the physical properties of a linearly elastic, isotropic material
+ using the SCEC CVM-H in a 
+\family typewriter
+pylithapp.cfg
+\family default
+ file.
+\end_layout
+
+\begin_layout LyX-Code
+
+\size small
+[pylithapp.timedependent.materials.material]
+\end_layout
+
+\begin_layout LyX-Code
+
+\size small
+db_properties = spatialdata.spatialdb.SCECCVMH ; Set the database to the SCEC
+ CVM-H
+\end_layout
+
+\begin_layout LyX-Code
+
+\size small
+db_properties.data_dir = /home/johndoe/data/sceccvm-h/vx53 ; Directory containing
+\begin_inset Newline newline
+\end_inset
+
+the database data files
+\end_layout
+
+\begin_layout LyX-Code
+
+\size small
+db_properties.min_vs = 500*m/s
+\end_layout
+
+\begin_layout LyX-Code
+
+\size small
+db_properties.squash = True ; Turn on squashing
+\end_layout
+
+\begin_layout LyX-Code
+
+\size small
+db_properties.squash_limit = -1000.0 ; Only distort the geometry above z =
+ -1 km in 
+\begin_inset Newline newline
+\end_inset
+
+flattening the earth
+\end_layout
+
+\begin_layout Subsection
+CompositeDB Spatial Database
+\end_layout
+
+\begin_layout Standard
+For some problems, a boundary condition or material property may have subsets
+ with different spatial variations.
+ One example would be when we have separate databases to describe the elastic
+ and inelastic bulk material properties for a region.
+ In this case, it would be useful to have two different spatial databases,
+ e.g., a seismic velocity model with Vp, Vs, and density values, and another
+ database with the inelastic physical properties.
+ We can use the 
+\family typewriter
+CompositeDB
+\family default
+ spatial database for these cases.
+ An example would be:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.materials.maxwell]
+\end_layout
+
+\begin_layout LyX-Code
+label = Maxwell material
+\end_layout
+
+\begin_layout LyX-Code
+id = 1
+\end_layout
+
+\begin_layout LyX-Code
+db_properties = spatialdata.spatialdb.CompositeDB
+\end_layout
+
+\begin_layout LyX-Code
+db_properties.db_A = spatialdata.spatialdb.SCECCVMH
+\end_layout
+
+\begin_layout LyX-Code
+db_properties.db_B = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell = pylith.feassemble.FIATSimplex
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell.dimension = 3
+\end_layout
+
+\begin_layout LyX-Code
+ 
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.materials.maxwell.db_properties]
+\end_layout
+
+\begin_layout LyX-Code
+values_A = [density,vs,vp]
+\end_layout
+
+\begin_layout LyX-Code
+db_A.label = Elastic properties from CVM-H
+\end_layout
+
+\begin_layout LyX-Code
+db_A.data_dir = /Users/willic3/geoframe/tools/vx53/bin
+\end_layout
+
+\begin_layout LyX-Code
+db_A.squash = False
+\end_layout
+
+\begin_layout LyX-Code
+values_B = [viscosity]
+\end_layout
+
+\begin_layout LyX-Code
+db_B.label = Vertically varying Maxwell material
+\end_layout
+
+\begin_layout LyX-Code
+db_B.iohandler.filename = ../spatialdb/mat_vert_var_maxwell.spatialdb
+\end_layout
+
+\begin_layout Standard
+Here we have specified a 
+\family typewriter
+CompositeDB
+\family default
+ where the elastic properties (
+\family typewriter
+density
+\family default
+, 
+\family typewriter
+vs
+\family default
+, 
+\family typewriter
+vp
+\family default
+) are given by the SCEC CVM-H, and 
+\family typewriter
+viscosity
+\family default
+ is described by a 
+\family typewriter
+SimpleDB
+\family default
+ (
+\family typewriter
+mat_vert_var_maxwell.spatialdb
+\family default
+).
+ The user must first specify 
+\family typewriter
+db_properties
+\family default
+ as a 
+\family typewriter
+CompositeDB
+\family default
+, and must then give the two components of this database (
+\family typewriter
+SCECCVMH
+\family default
+ and 
+\family typewriter
+SimpleDB
+\family default
+).
+ The values to query in each of these databases is also required.
+ This is followed by the usual parameters for each of the spatial databases.
+ The 
+\family typewriter
+CompositeDB
+\family default
+ provides a flexible mechanism for specifying material properties or boundary
+ conditions where the variations come from two different sources.
+\end_layout
+
+\begin_layout Subsection
+Time History Database
+\end_layout
+
+\begin_layout Standard
+The time history database specifies the temporal variation in the amplitude
+ of a field associated with a boundary condition.
+ It is used in conjunction with spatial databases to provide spatial and
+ temporal variation of parameters for boundary conditions.
+ The same time history is applied to all of the locations, but the time
+ history may be shifted with a spatial variation in the onset time and scaled
+ with a spatial variation in the amplitude.
+ The time history database uses a simple ASCII file which is simpler than
+ the one used by the SimpleDB spatial database.
+ The file format is described in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Spatialdata:TimeHistoryIO"
+
+\end_inset
+
+.
+ 
+\end_layout
+
+\begin_layout Standard
+As in the other Pyre objects, spatial database objects contain parameters
+ that can be set from the command line or using 
+\family typewriter
+.cfg or .pml
+\family default
+ files.
+ The parameters for a spatial database are:
+\end_layout
+
+\begin_layout Description
+label Label for the time history database, which is used in diagnostic messages.
+\end_layout
+
+\begin_layout Description
+filename Filename for the time history database.
+\end_layout
+
+\begin_layout Standard
+An example of setting these parameters in a 
+\family typewriter
+.cfg
+\family default
+ file is:
+\end_layout
+
+\begin_layout LyX-Code
+label = Displacement time history
+\end_layout
+
+\begin_layout LyX-Code
+filename = mytimehistory.timedb
+\end_layout
+
+\begin_layout Section
+Labels and Identifiers for Materials, Boundary Conditions, and Faults
+\end_layout
+
+\begin_layout Standard
+For materials, the ``label'' is a string used only for error messages.
+ The ``id'' is an integer that corresponds to the material identifier in
+ LaGriT (itetclr) and CUBIT (block id).
+ The id also tags the cells in the mesh for associating cells with a specific
+ material model and quadrature rule.
+ For boundary conditions, the ``label'' is a string used to associate groups
+ of vertices (psets in LaGriT and nodesets in CUBIT) with a boundary condition.
+ Some mesh generators use strings (LaGriT) to identify groups of nodes while
+ others (CUBIT) use strings and integers.
+ The default behavior in PyLith is to use strings to identify groups for
+ both LaGriT and CUBIT meshes, but the behavior for CUBIT meshes can be
+ changed to use the nodeset id (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:MeshIOCubit"
+
+\end_inset
+
+).
+ PyLith 1.0 had an ``id'' for boundary conditions, but we removed it from
+ subsequent releases because it was not used.
+ For faults the ``label'' is used in the same manner as the ``label'' for
+ boundary conditions.
+ That is, it associates a string with a group of vertices (pset in LaGriT
+ and nodeset in CUBIT).
+ The fault ``id'' is a integer used to tag the cohesive cells in the mesh
+ with a specific fault and quadrature rule.
+ Because we use the fault ``id'' to tag cohesive cells in the mesh the same
+ way we tag normal cells to materials, it must be unique among the faults
+ as well as the materials.
+\end_layout
+
+\begin_layout Section
+PyLith Output
+\end_layout
+
+\begin_layout Standard
+PyLith currently supports output to VTK and HDF5/Xdmf files, which can be
+ imported directly into a number of visualization tools, such as ParaView,
+ Visit, and MayaVi.
+ The HDF5 files can also be directly accessed via Matlab and PyTables.
+ PyLith 1.1 significantly expanded the information available for output,
+ including fault information and state variables.
+ Output of solution information for the domain, faults, materials, and boundary
+ conditions is controlled by an output manager for each module.
+ This allows the user to tailor the output to the problem.
+ By default PyLith will write a number of files.
+ Diagnostic information for each fault and material is written into a separate
+ file as are the solution and state variables for the domain, each fault,
+ and each material.
+ For a fault the diagnostic fields include the final slip, the slip initiation
+ time, and the fault normal vector.
+ For a material the diagnostic fields include the density and the elastic
+ constants.
+ Additional diagnostic information can be included by setting the appropriate
+ output parameters.
+ See Chapters 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:material:models"
+
+\end_inset
+
+ and 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:boundary:interface:conditions"
+
+\end_inset
+
+ for more information on the available fields and the next section for output
+ parameters.
+ The other files for each fault and material include solution information
+ at each time step where output was requested (also customizable by the
+ user).
+ For a fault the solution information includes the slip and the change in
+ tractions on the fault surface.
+ For a material the solution information includes the total strain and stress.
+ For some materials fields for additional state variables may be available.
+ For output via VTK files, each time step is written to a separate file,
+ whereas for HDF5 files all of the time steps for a given domain, fault,
+ or material are written into the same file.
+ A single Xdmf metadata file is created for each HDF5 file.
+\end_layout
+
+\begin_layout Subsection
+Output Manager
+\end_layout
+
+\begin_layout Standard
+The OutputManager object controls the type of files written, the fields
+ included in the output, and how often output is written.
+ PyLith includes some specialized OutputManagers that prescribe what fields
+ are output by default.
+ In some cases, additional fields are available but not included by default.
+ For example, in 3D problems, the along-strike and up-dip directions over
+ the fault surface can be included in the diagnostic information.
+ These are not included by default, because 1D problems have neither an
+ along-strike nor up-dip direction and 2D problems do not have an up-dip
+ direction.
+\end_layout
+
+\begin_layout Subsubsection
+Output Manager Parameters
+\end_layout
+
+\begin_layout Standard
+The parameters for the OutputManager are:
+\end_layout
+
+\begin_layout Description
+output_freq Flag indicating whether to write output based on the time or
+ number of time steps since the last output.
+ Permissible values are ``time_step'' and ``skip'' (default).
+\end_layout
+
+\begin_layout Description
+time_step Minimum time between output if 
+\family typewriter
+output_freq
+\family default
+ is set to ``time_step''.
+\end_layout
+
+\begin_layout Description
+skip Number of time steps between output if 
+\family typewriter
+output_freq
+\family default
+ is set to ``skip''.
+ A value of 0 means every time step is written.
+\end_layout
+
+\begin_layout Description
+writer Writer for data (VTK writer or HDF5 writer).
+\end_layout
+
+\begin_layout Description
+coordsys Coordinate system for vertex coordinates (currently ignored).
+\end_layout
+
+\begin_layout Description
+vertex_filter Filter to apply to all vertex fields (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sub:vertex:field:filters"
+
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Description
+cell_filter Filter to apply to all cell fields (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sub:cell:field:filters"
+
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Standard
+An example of setting the output parameters for a material in a 
+\family typewriter
+.cfg
+\family default
+ file is
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.materials.elastic.output]
+\end_layout
+
+\begin_layout LyX-Code
+output_freq = time_step
+\end_layout
+
+\begin_layout LyX-Code
+time_step = 1.0*yr
+\end_layout
+
+\begin_layout LyX-Code
+cell_filter = pylith.meshio.CellFilterAvgMesh
+\end_layout
+
+\begin_layout LyX-Code
+cell_info_fields = [density] ; limit diagnostic data to density
+\end_layout
+
+\begin_layout LyX-Code
+cell_data_fields = [total-strain,stress] ; default
+\end_layout
+
+\begin_layout LyX-Code
+writer.filename = dislocation-elastic.vtk
+\end_layout
+
+\begin_layout Subsubsection
+Output Over Subdomain
+\end_layout
+
+\begin_layout Standard
+Output of the solution over the entire domain for large problems generates
+ very large data files.
+ In some cases one is primarily interested in the solution over the ground
+ surface.
+ PyLith supports output of the solution on any boundary of the domain by
+ associating an output manager with a group of vertices corresponding to
+ the surface of the boundary.
+ As with several of the boundary conditions, the boundary must be a simply-conne
+cted surface.
+ The 
+\family typewriter
+OutputSolnSubset
+\family default
+ is the specialized OutputManager that implements this feature and, by default,
+ includes the displacement field in the output.
+ In addition to the 
+\family typewriter
+OutputManager
+\family default
+ parameters, the 
+\family typewriter
+OutputSolnSubset
+\family default
+ includes:
+\end_layout
+
+\begin_layout Description
+label Label of group of vertices defining boundary surface.
+\end_layout
+
+\begin_layout Description
+vertex_data_fields Names of vertex data fields to output (default is [``displace
+ments'']).
+\end_layout
+
+\begin_layout Subsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:output:points"
+
+\end_inset
+
+Output at Arbitrary Points
+\end_layout
+
+\begin_layout Standard
+In many situations with recorded observations, one would like to extract
+ the solution at the same locations as the recorded observation.
+ Rather than forcing the finite-element discretization to be consistent
+ with the observation points, PyLith includes a specialized output manager,
+ 
+\family typewriter
+OutputSolnPoints
+\family default
+, to interpolate the solution to arbitrary points.
+ By default, the output manager will include the displaceent time histories
+ in the output.
+ The locations are specified in a text file.
+ In addition to the 
+\family typewriter
+OutputManager
+\family default
+ parameters, the 
+\family typewriter
+OutputSolnSubset
+\family default
+ includes:
+\end_layout
+
+\begin_layout Description
+vertex_data_fields Names of vertex data fields to output (default is [``displace
+ments'']).
+\end_layout
+
+\begin_layout Description
+reader Reader for points list (default is 
+\family typewriter
+PointsList
+\family default
+).
+\end_layout
+
+\begin_layout Description
+writer Writer for output (default is 
+\family typewriter
+DataWriterVTKPoints
+\family default
+).
+ In most cases users will want to use the 
+\family typewriter
+
+\begin_inset Newline linebreak
+\end_inset
+
+DataWriterHDF5Mesh
+\family default
+.
+\end_layout
+
+\begin_layout Subsubsection
+PointsList Reader
+\end_layout
+
+\begin_layout Standard
+This object corresponds to a simple text file containing a list of points
+ (one per line) where output is desired.
+ The points are specified in the coordinate system specified by OutputSolnPoints.
+ The coordinates will be transformed into the coordinate system of the mesh
+ prior to interpolation.
+ The properties available to customize the behavior of 
+\family typewriter
+PointsList
+\family default
+ are:
+\end_layout
+
+\begin_layout Description
+filename Names of file containing list of points.
+\end_layout
+
+\begin_layout Description
+comment_delimiter Delimiter at beginning of line to identify comments (default
+ is #).
+\end_layout
+
+\begin_layout Description
+value_delimiter Delimiter used to separate values (default is whitespace).
+\end_layout
+
+\begin_layout Subsection
+Output Field Filters
+\end_layout
+
+\begin_layout Standard
+Output fields may not directly correspond to the information a user desires.
+ For example, the default output for the state variables includes the physical
+ properties at each quadrature point.
+ Most visualization packages cannot handle cell fields with multiple points
+ in a cell (the locations of the points within the cell are not included
+ in the data file).
+ In order to reduce the field to a single point within the cell, we would
+ like to average the values.
+ This is best done within PyLith before output, because it reduces the file
+ size and the quadrature information provides the information necessary
+ (the weights of the quadrature points) to compute the appropriate average
+ over the cell.
+\end_layout
+
+\begin_layout Subsubsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sub:vertex:field:filters"
+
+\end_inset
+
+Vertex Field Filters
+\end_layout
+
+\begin_layout Standard
+Currently the only filter available for vertex fields computes the magnitude
+ of a vector at each location.
+ Most visualization packages support this operation, so this filter is not
+ very useful.
+\end_layout
+
+\begin_layout Description
+VertexFilterVecNorm Computes the magnitude of a vector field at each location.
+\end_layout
+
+\begin_layout Subsubsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sub:cell:field:filters"
+
+\end_inset
+
+Cell Field Filters
+\end_layout
+
+\begin_layout Standard
+Most users will want to apply a filter to cell fields to average the fields
+ over the cell, producing values at one location per cell for visualization.
+\end_layout
+
+\begin_layout Description
+CellFilterAvgMesh Compute the weighted average of the values within a bulk
+ cell.
+ The weights are determined from the quadrature associated with the cells.
+\end_layout
+
+\begin_layout Description
+CellFilterAvgSubMesh Compute the weighted average of the values for a boundary
+ cell.
+ The weights are determined from the quadrature associated with the cells.
+\end_layout
+
+\begin_layout Subsection
+VTK Output
+\end_layout
+
+\begin_layout Standard
+PyLith writes legacy (non-XML) VTK files.
+ These are simple files with vertex coordinates, the mesh topology, and
+ fields over vertices and/or cells.
+ Each time step is written to a different file.
+ The time stamp is included in the filename with the decimal point removed.
+ This allows automatic generation of animations with many visualization
+ packages that use VTK files.
+ The default time stamp is the time in seconds, but this can be changed
+ using the normalization constant to give a time stamp in years, tens of
+ years, or any other value.
+\end_layout
+
+\begin_layout Subsubsection
+DataWriterVTK Parameters
+\end_layout
+
+\begin_layout Standard
+The parameters for the VTK writer are:
+\end_layout
+
+\begin_layout Description
+filename Name of VTK file
+\end_layout
+
+\begin_layout Description
+time_format C-style format string for time stamp in filename.
+ The decimal point in the time stamp will be removed for compatibility with
+ VTK visualization packages that provide seamless animation of data from
+ multiple VTK files.
+\end_layout
+
+\begin_layout Description
+time_constant Value used to normalize time stamp in VTK files (default is
+ 1.0 s).
+\end_layout
+
+\begin_layout Subsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sub:HDF5/Xdmf-Output"
+
+\end_inset
+
+HDF5/Xdmf Output
+\end_layout
+
+\begin_layout Standard
+HDF5 files provide a flexible framework for storing simulation data with
+ datasets in groups logically organized in a tree structure analogous to
+ files in directories.
+ HDF5 output offers parallel, multi-dimensional array output in binary files,
+ so it is much faster and more convenient than the VTK output which uses
+ ASCII files and separate files for each time step.
+ Standards for organizing datasets and groups in HDF5 files do not exist
+ for general finite-element software in geodynamics.
+ Consequently, PyLith uses its own simple layout show in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:hdf5:layout"
+
+\end_inset
+
+.
+ In order for visualization tools, such as ParaView, to determine which
+ datasets to read and where to find them in the hierarchy of groups within
+ the HDF5 file, we create an Xdmf (eXtensible Data Model and Format, 
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+www.xdmf.org
+\end_layout
+
+\end_inset
+
+) metadata file that provides this information.
+ This file is written when PyLith closes the HDF5 file at the end of the
+ simulation.
+ In order to visualize the datasets in an HDF5 file, one simply opens the
+ corresponding Xdmf file (the extension is 
+\family typewriter
+.xmf
+\family default
+) in ParaView or Visit.
+ The Xdmf file contains the relative path to the HDF5 file so the files
+ can be moved but must be located together in the same directory.
+ 
+\end_layout
+
+\begin_layout Quote
+
+\series bold
+\color red
+Note:
+\color inherit
+ 
+\series default
+The Xdmf format supports representation of two- and three-dimensional coordinate
+s of points, scalar vector field types, and three-dimensional vector and
+ tensor vector field types but not two-dimensional vector or tensor vector
+ field types.
+ As a result, we separate the components of two-dimensional vector and tensor
+ vector field objects and add the component as a suffix to the name of the
+ field.
+ The vector can be reconstructed within ParaView using the Calculator (see
+ Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Tutorial-Subduction"
+
+\end_inset
+
+ for an example).
+ Accessing the datasets in the HDF5 files using tools such as h5py (included
+ with the PyLith binary and installed by default with the PyLith Installer)
+ and PyTables with visualization through MayaVi circumvents this problem,
+ but requires writing Python scripts and a deeper knowledge of the visualization
+ interface.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Graphics
+	filename figs/hdf5layout.eps
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Layout of PyLith HDF5 file.
+ The orange rectangles with rounded corners identify the groups and the
+ blue rectangles with sharp corners identify the datasets.
+ The dimensions of the data sets are shown in parentheses.
+ Most HDF5 files will contain either 
+\family typewriter
+vertex_fields
+\family default
+ or 
+\family typewriter
+cell_fields
+\family default
+ but not both.
+ 
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:hdf5:layout"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+See Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:material-model-statevars"
+
+\end_inset
+
+ in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:material:parameters"
+
+\end_inset
+
+ for a table of component values for tensor output in HDF5 files.
+ To avoid confusion about the ordering of components for tensor data, we
+ separate the components in the Xdmf file.
+\end_layout
+
+\begin_layout Standard
+HDF5 files do not contain self-correcting features that allow a file to
+ be read if part of a dataset is corrupted.
+ This type of error can occur if a job terminates abnormally in the middle
+ or at the end of a simulation on a large cluster or other parallel machine.
+ Fortunately, HDF5 also offers the ability to store datasets in external
+ binary files with the locations specified by links in the HDF5 file.
+ Note that the use of external data files results in one data file per dataset
+ in addition to the HDF5 and Xdmf files.
+ The external data files use the name of the HDF5 file with the dataset
+ name added to the prefix and the 
+\family typewriter
+.h5
+\family default
+ suffix replaced by 
+\family typewriter
+.dat
+\family default
+.
+ The HDF5 files include relative paths to the external data files, so these
+ files can also be moved, but they, too, must be kept together in the same
+ directory.
+ This provides a more robust method of output because one can generate an
+ HDF5 file associated with the uncorrupted portions of the external data
+ files should an error occur.
+ Currently, PyLith does not include a utility to do this, but we plan to
+ add one in a future release.
+ Thus, there are two options when writing PyLith output to HDF5 files: (1)
+ including the datasets directly in the HDF5 files themselves or (2) storing
+ the datasets in external binary files with just metadata in the HDF5 files.
+ Both methods provide similar performance because they will use MPI I/O
+ if it is available.
+ 
+\end_layout
+
+\begin_layout Quote
+
+\series bold
+\color red
+Warning:
+\color inherit
+ 
+\series default
+Storing the datasets within the HDF5 file in a parallel simulation requires
+ that the HDF5 library be configured with the 
+\family typewriter
+--enable-parallel
+\family default
+ option.
+ 
+\color none
+The binary PyLith packages include this feature and it is a default setting
+ in building HDF5 via the PyLith Installer.
+\end_layout
+
+\begin_layout Standard
+Accessing the datasets for additional analysis or visualization is nearly
+ identical in the two methods because the use of external data files is
+ completely transparent to the user except for the presence of the additional
+ files.
+ Note that in order for ParaView to find the HDF5 and external data files,
+ it must be run from the same relative location where the simulation was
+ run.
+ For example, if the simulation was run from a directory called 
+\begin_inset Quotes eld
+\end_inset
+
+work
+\begin_inset Quotes erd
+\end_inset
+
+ and the HDF5/Xdmf files were written to 
+\begin_inset Quotes eld
+\end_inset
+
+work/output
+\begin_inset Quotes erd
+\end_inset
+
+, then ParaView should be run from the 
+\begin_inset Quotes eld
+\end_inset
+
+work
+\begin_inset Quotes erd
+\end_inset
+
+ directory.
+ See Table 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "tab:material-model-statevars"
+
+\end_inset
+
+ in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:material:parameters"
+
+\end_inset
+
+ for a table of component values for tensor output.
+\end_layout
+
+\begin_layout Subsubsection
+HDF5 Utilities
+\end_layout
+
+\begin_layout Standard
+HDF5 includes several utilities for examining the contents of HDF5 files.
+ 
+\family typewriter
+h5dump
+\family default
+ is very handy for displaying the hierarchy, dimensions of datasets, attributes,
+ and even the dataset values.
+ 
+\end_layout
+
+\begin_layout Quote
+Dump the entire HDF5 file to stdout (not practical or useful for large files):
+\end_layout
+
+\begin_deeper
+\begin_layout LyX-Code
+h5dump mydata.h5
+\end_layout
+
+\end_deeper
+\begin_layout Quote
+Dump the hierarchy of an HDF5 file to stdout:
+\end_layout
+
+\begin_deeper
+\begin_layout LyX-Code
+h5dump -n mydata.h5
+\end_layout
+
+\end_deeper
+\begin_layout Quote
+Dump the hierarchy with dataset dimensions and attributes to stdout:
+\end_layout
+
+\begin_deeper
+\begin_layout LyX-Code
+h5dump -H mydata.h5
+\end_layout
+
+\end_deeper
+\begin_layout Quote
+Dump dataset 'vertices' in group '/geometry' to stdout:
+\end_layout
+
+\begin_deeper
+\begin_layout LyX-Code
+h5dump -d /geometry/vertices mydata.h5
+\end_layout
+
+\end_deeper
+\begin_layout Subsubsection
+DataWriterHDF5 Parameters
+\end_layout
+
+\begin_layout Standard
+This HDF5 writer stores the datasets inside the HDF5 file and the parameters
+ are:
+\end_layout
+
+\begin_layout Description
+filename Name of HDF5 file (the Xdmf filename is generated from the same
+ prefix).
+\end_layout
+
+\begin_layout Subsubsection
+DataWriterHDF5Ext Parameters
+\end_layout
+
+\begin_layout Standard
+This HDF5 writer stores the datasets using external data files (a more robust
+ method for parallel runs) and the parameters are:
+\end_layout
+
+\begin_layout Description
+filename Name of HDF5 file (the external dataset filenames and the Xdmf
+ filename are generated from the same prefix).
+\end_layout
+
+\begin_layout Standard
+An example of changing the writer from the default VTK writer to the HDF5
+ writer with external datasets for output over the domain in a 
+\family typewriter
+.cfg
+\family default
+ file is
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.domain.output]
+\end_layout
+
+\begin_layout LyX-Code
+output_freq = time_step
+\end_layout
+
+\begin_layout LyX-Code
+time_step = 1.0*yr
+\end_layout
+
+\begin_layout LyX-Code
+cell_data_fields = [displacement,velocity]
+\end_layout
+
+\begin_layout LyX-Code
+writer = pylith.meshio.DataWriterHDF5ExtMesh
+\end_layout
+
+\begin_layout LyX-Code
+writer.filename = dislocation.h5
+\end_layout
+
+\begin_layout Section
+Tips and Hints
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Tips:Hints"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Tips and Hints For Running PyLith
+\end_layout
+
+\begin_layout Itemize
+Examine the examples for a problem similar to the one you want to run and
+ dissect it in detail.
+\end_layout
+
+\begin_layout Itemize
+Start with a uniform-resolution coarse mesh to debug the problem setup.
+ Increase the resolution as necessary to resolve the solution fields of
+ interest (resolving stresses/strains may require a higher resolution than
+ that for resolving displacements).
+\end_layout
+
+\begin_layout Itemize
+Merge materials using the same material model.
+ This will result in only one VTK or HDF5 file for each material model rather
+ than several files.
+\end_layout
+
+\begin_layout Itemize
+The rate of convergence in quasi-static (implicit) problems can sometimes
+ be improved by renumbering the vertices in the finite-element mesh to reduce
+ the bandwidth of the sparse matrix.
+ PyLith can use the reverse Cuthill-McKee algorithm to reorder the vertices
+ and cells.
+\end_layout
+
+\begin_layout Itemize
+If you encounter errors or warnings, run 
+\family typewriter
+pylithinfo
+\family default
+ or use the 
+\family typewriter
+--help
+\family default
+, 
+\family typewriter
+--help-components
+\family default
+, and 
+\family typewriter
+--help-properties
+\family default
+ command-line arguments when running PyLith to check the parameters to make
+ sure PyLith is using the parameters you intended.
+\end_layout
+
+\begin_layout Itemize
+Use the 
+\family typewriter
+--petsc.log_summary
+\family default
+, 
+\family typewriter
+--petsc.ksp_monitor
+\family default
+, 
+\family typewriter
+--petsc.ksp_view
+\family default
+, 
+\family typewriter
+
+\begin_inset Newline newline
+\end_inset
+
+--petsc.ksp_converged_reason
+\family default
+, and 
+\family typewriter
+--petsc.snes_converged_reason
+\family default
+ command-line arguments (or set them in a parameter file) to view PyLith
+ performance and monitor the convergence.
+\end_layout
+
+\begin_layout Itemize
+Turn on the journals (see the examples) to monitor the progress of the code.
+\end_layout
+
+\begin_layout Subsection
+Troubleshooting
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Troubleshooting"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Itemize
+Consult the PyLith FAQ webpage (
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+http://www.geodynamics.org/cig/community/workinggroups/short/workarea/pylith-wiki
+\end_layout
+
+\end_inset
+
+) which contains a growing list of common problems and their corresponding
+ solutions.
+\end_layout
+
+\begin_layout Itemize
+
+\family typewriter
+ImportError: liblapack.so.2: cannot open shared object file: No such file
+ or directory
+\end_layout
+
+\begin_layout Quote
+PyLith cannot find one of the libraries.
+ You need to set up your environment variables (e.g., PATH, PYTHONPATH, and
+ LD_LIBRARY_PATH) to match your installation.
+ If you are using the PyLith binary on Linux or Mac OS X, run the command
+ 
+\family typewriter
+source setup.sh 
+\family default
+in the directory where you unpacked the distribution.
+ This will set up your environment variables for you.
+ If you are building PyLith from source, please consult the instructions
+ for building from source.
+\end_layout
+
+\begin_layout Itemize
+\paragraph_spacing single
+
+\family typewriter
+>> {command line}:: 
+\begin_inset Newline newline
+\end_inset
+
+-- pyre.inventory(error) 
+\begin_inset Newline newline
+\end_inset
+
+-- p4wd <- 'true' 
+\begin_inset Newline newline
+\end_inset
+
+-- unrecognized property 'p4wd' 
+\begin_inset Newline newline
+\end_inset
+
+>> {command line}:: 
+\begin_inset Newline newline
+\end_inset
+
+-- pyre.inventory(error) 
+\begin_inset Newline newline
+\end_inset
+
+-- p4pg <- 'true' 
+\begin_inset Newline newline
+\end_inset
+
+-- unrecognized property ' p4pg'
+\end_layout
+
+\begin_layout Quote
+Verify that the `mpirun' command included in the PyLith package is the first
+ one on your PATH:
+\end_layout
+
+\begin_layout Quote
+
+\family typewriter
+$ which mpirun
+\end_layout
+
+\begin_layout Quote
+If it is not, adjust your PATH environment variable accordingly.
+\end_layout
+
+\begin_layout Itemize
+
+\family typewriter
+"merlin.DistributionNotFound: Cheetah" error
+\end_layout
+
+\begin_layout Quote
+This error occurs when trying to use the 32-bit linux binary on some 64-bit
+ linux systems.
+ One of the Python packages PyLith uses does not know how to determine the
+ system architecture at runtime.
+ The workaround is:
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+Go to the 
+\family typewriter
+lib/python2.6/site-packages
+\family default
+ directory.
+\end_layout
+
+\begin_layout Enumerate
+Unzip 
+\family typewriter
+merlin-1.7-py2.6.egg
+\family default
+ (if it is a file and not a directory).
+\end_layout
+
+\begin_layout Enumerate
+Go to the merlin directory.
+\end_layout
+
+\begin_layout Enumerate
+Edit 
+\family typewriter
+__init__.py
+\family default
+.
+ Replace line 308 plat = get_platform() with plat = "linux-i686"
+\end_layout
+
+\begin_layout Enumerate
+If 
+\family typewriter
+merlin-1.7-py2.6.egg
+\family default
+ is a file, rezip merlin.
+ Go to the site-packages directory and enter "
+\family typewriter
+zip -r merlin-1.7-py2.6.egg merlin
+\family default
+".
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+
+\family typewriter
+-- Solving equations.
+\begin_inset Newline newline
+\end_inset
+
+[0]PETSC ERROR: ---------------- Error Message -------------------------------
+ 
+\begin_inset Newline newline
+\end_inset
+
+[0]PETSC ERROR: Detected zero pivot in LU factorization
+\begin_inset Newline newline
+\end_inset
+
+ see http://www.mcs.anl.gov/petsc/petsc-as/documentation/faq.html#ZeroPivot!
+\end_layout
+
+\begin_layout Quote
+This usually occurs when the null space of the system Jacobian is nonzero,
+ such as the case of a problem without Dirichlet boundary conditions on
+ any boundary.
+ If this arises when using the split fields and algebraic multigrid precondition
+ing, and no additional Dirichlet boundary conditions are desired, then the
+ workaround is to revert to using the Additive Schwarz preconditioning without
+ split fields as discussed in Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:petsc:options"
+
+\end_inset
+
+.
+ 
+\end_layout
+
+\begin_layout Itemize
+PyLith crashes with a bus error.
+\end_layout
+
+\begin_layout Quote
+This often indicates that PyLith is using incompatible versions of libraries.
+ This can result from changing your environment variables after configuring
+ or installing PyLith (when building from source) or from errors in setting
+ the environment variables (PATH, LD_LIBRARY_PATH, and PYTHONPATH).
+ If the former case, simply reconfigure and rebuild PyLith.
+ In the latter case, check your environment variables (order matters!) to
+ make sure PyLith finds the desired directories before system directories.
+ 
+\end_layout
+
+\begin_layout Itemize
+PyLith crashes with a segmentation fault.
+\end_layout
+
+\begin_layout Quote
+A segmentation fault might be caused by an error that wasn't trapped or
+ a bug in the code.
+ Please report these cases so that we can fix these problems (either trap
+ the error and provide the user with an informative error message, or fix
+ the bug).
+ If this occurs with any of the problems distributed with PyLith, simply
+ submit a bug report (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Getting-Help-and"
+
+\end_inset
+
+) indicating which problem you ran and your platform.
+ If the crash occurs for a problem you created, it is a great help if you
+ can try to reproduce the crash with a very simple problem (e.g., adjust the
+ boundary conditions or other parameters of one of the examples to reproduce
+ the segmentation fault).
+ Submit a bug report along with log files showing the backtrace from a debugger
+ (e.g., gdb) and the valgrind log file (only available on Linux platforms).
+ You can generate a backtrace using the debugger by using the 
+\family typewriter
+--petsc.start_in_debugger
+\family default
+ command-line argument:
+\end_layout
+
+\begin_layout LyX-Code
+pylith [..args..] --petsc.start_in_debugger
+\end_layout
+
+\begin_layout LyX-Code
+(gdb) continue
+\end_layout
+
+\begin_layout LyX-Code
+(gdb) backtrace
+\end_layout
+
+\begin_layout Quote
+To use valgrind to detect the memory error, first go to your working directory
+ and run the problem with 
+\family typewriter
+--launcher.dry
+\family default
+:
+\end_layout
+
+\begin_layout LyX-Code
+pylith [..args..] --launcher.dry
+\end_layout
+
+\begin_layout Quote
+Instead of actually running the problem, this causes PyLith to dump the
+ mpirun/mpiexec command it will execute.
+ Copy and paste this command into your shell so you can run it directly.
+ Insert the full path to valgrind before the full path to mpinemesis and
+ tell valgrind to use a log file:
+\end_layout
+
+\begin_layout LyX-Code
+
+\size footnotesize
+mpirun -np 1 /path/to/valgrind --log-file=valgrind-log  /path/to/mpinemesis
+ --pyre-start [..lots of junk..]
+\end_layout
+
+\begin_layout Section
+Post-Processing Utilities
+\end_layout
+
+\begin_layout Standard
+The PyLith distribution includes a few post-processing utilities.
+ These are Python scripts that are installed into the same bin directory
+ as the 
+\family typewriter
+pylith
+\family default
+ executable.
+\end_layout
+
+\begin_layout Subsection
+
+\family typewriter
+pylith_eqinfo
+\end_layout
+
+\begin_layout Standard
+This utility computes the moment magnitude, seismic moment, seismic potency,
+ and average slip at user-specified time snapshots from PyLith fault HDF5
+ output.
+ The utility works with output from simulations with either prescribed slip
+ and/or spontaneous rupture.
+ Currently, we compute the shear modulus from a user-specified spatial database
+ at the centroid of the fault cells.
+ In the future we plan to account for lateral variations in shear modulus
+ across the fault when calculating the seismic moment.
+ The Python script is a Pyre application, so its parameters can be specified
+ using 
+\family typewriter
+.cfg
+\family default
+ and command line arguments just like PyLith.
+ The Pyre properties and facilities include:
+\end_layout
+
+\begin_layout Description
+output_filename Filename for output of slip information.
+\end_layout
+
+\begin_layout Description
+faults Array of fault names.
+\end_layout
+
+\begin_layout Description
+filename_pattern Filename pattern in C/Python format for creating filename
+ for each fault.
+ Default is
+\begin_inset Newline newline
+\end_inset
+
+
+\family typewriter
+output/fault_%s.h5
+\family default
+.
+\end_layout
+
+\begin_layout Description
+snapshots Array of timestamps for slip snapshosts ([-1] means use last time
+ step in file, which is the default).
+\end_layout
+
+\begin_layout Description
+snapshot_units Units for timestamps in array of snapshots.
+\end_layout
+
+\begin_layout Description
+db_properties Spatial database for elastic properties.
+\end_layout
+
+\begin_layout Description
+coordsys Coordinate system associated with mesh in simulation.
+\end_layout
+
+\begin_layout Subsection
+
+\family typewriter
+pylith_genxdmf
+\end_layout
+
+\begin_layout Standard
+This utility generates Xdmf files from HDF5 files that conform to the layout
+ used by PyLith.
+ It is a simple Python script with a single command line argument, the HDF5
+ file for input.
+ Typically, it is sued to regenerate Xdmf files that get corrupted or lost
+ due to renaming and moving.
+ It is also useful in updating Xdmf files when users add fields to HDF5
+ files during post-processing.
+\end_layout
+
+\begin_layout LyX-Code
+pylith_genxdmf --file=
+\shape italic
+PYLITH_HDF5_FILE
+\end_layout
+
+\begin_layout Quote
+
+\series bold
+\color red
+Warning:
+\color inherit
+ 
+\series default
+If the HDF5 files contain external datasets, then this utility should be
+ run from the same relative path to the HDF5 files as when they were created.
+ For example, if a PyLith simulation was run from directory 
+\family typewriter
+work
+\family default
+ and HDF5 files were generated in 
+\family typewriter
+output/work
+\family default
+, then the utility should be run from the directory 
+\family typewriter
+work
+\family default
+.
+ Furthermore, a visualization tool, such as ParaView, should also be started
+ from the working directory 
+\family typewriter
+work
+\family default
+.
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/3dhex8.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/3dhex8.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/3dhex8.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,634 +1,638 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 0
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 2in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:Tutorial-3d-hex8"
-
-\end_inset
-
-Tutorials Using Hexahedral Mesh Created by CUBIT
-\end_layout
-
-\begin_layout Standard
-PyLith features discussed in this set of tutorials:
-\end_layout
-
-\begin_layout Itemize
-Static solution
-\end_layout
-
-\begin_layout Itemize
-Quasi-static solution
-\end_layout
-
-\begin_layout Itemize
-CUBIT mesh format
-\end_layout
-
-\begin_layout Itemize
-Trilinear hexahedral cells
-\end_layout
-
-\begin_layout Itemize
-VTK output
-\end_layout
-
-\begin_layout Itemize
-HDF5 output
-\end_layout
-
-\begin_layout Itemize
-Dirichlet displacement and velocity boundary conditions
-\end_layout
-
-\begin_layout Itemize
-Neumann traction boundary conditions and time-varying tractions
-\end_layout
-
-\begin_layout Itemize
-ZeroDispDB spatial database
-\end_layout
-
-\begin_layout Itemize
-SimpleDB spatial database
-\end_layout
-
-\begin_layout Itemize
-UniformDB spatial database
-\end_layout
-
-\begin_layout Itemize
-Static fault rupture
-\end_layout
-
-\begin_layout Itemize
-Multiple kinematic fault ruptures
-\end_layout
-
-\begin_layout Itemize
-Specifying more than one material
-\end_layout
-
-\begin_layout Itemize
-Nonlinear solver
-\end_layout
-
-\begin_layout Itemize
-Linearly elastic isotropic material
-\end_layout
-
-\begin_layout Itemize
-Maxwell linear viscoelastic material
-\end_layout
-
-\begin_layout Itemize
-Generalized Maxwell linear viscoelastic material
-\end_layout
-
-\begin_layout Itemize
-Power-law viscoelastic material
-\end_layout
-
-\begin_layout Itemize
-Drucker-Prager elastoplastic material
-\end_layout
-
-\begin_layout Itemize
-Adaptive time stepping
-\end_layout
-
-\begin_layout Itemize
-Static fault friction
-\end_layout
-
-\begin_layout Itemize
-Slip-weakening fault friction
-\end_layout
-
-\begin_layout Itemize
-Rate-and-state fault friction
-\end_layout
-
-\begin_layout Itemize
-Gravitational body forces
-\end_layout
-
-\begin_layout Itemize
-Initial stresses
-\end_layout
-
-\begin_layout Itemize
-Finite strain
-\end_layout
-
-\begin_layout Standard
-All of the files necessary to run the examples are contained in the directory
- 
-\family typewriter
-examples/3d/hex8
-\family default
-.
-\end_layout
-
-\begin_layout Subsection
-Overview
-\end_layout
-
-\begin_layout Standard
-This tutorial is meant to demonstrate most of the important features of
- PyLith as a quasi-static finite-element code, using a sequence of example
- problems.
- All problems use the same 3D hexahedral mesh generated using the CUBIT
- 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-cubit.sandia.gov
-\end_layout
-
-\end_inset
-
- mesh generation package.
- Each example builds on the previous examples, as we demonstrate new features.
- As in the other examples, the files include extensive comments.
- We start with the generation of the mesh, which is composed of 144 trilinear
- hexahedra.
- The tutorial demonstrates the usage of the CUBIT mesh generation package
- to create a mesh, as well as describing how to use a CUBIT-generated mesh
- in PyLith.
- Following the discussion of how to generate the mesh, we discuss the 
-\family typewriter
-pylithapp.cfg
-\family default
- file, which contains information common to all the simulations.
- We group the examples into four sections, each pertaining to a particular
- set of PyLith features.
- We suggest users go through each of these sections in order as the complexity
- increases at each step.
- 
-\end_layout
-
-\begin_layout Subsection
-Mesh Generation and Description
-\end_layout
-
-\begin_layout Standard
-The mesh for these examples is a simple rectangular solid (Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:3dhex8-mesh"
-
-\end_inset
-
-).
- Although it would be possible to generate this mesh by hand, it is much
- simpler to use a mesh generation package, and we use CUBIT for this example.
- We provide documented journal files in 
-\family typewriter
-examples/3d/hex8/mesh.
-
-\family default
- Dissection of these journal files should provide some insight into how
- to use CUBIT with PyLith.
- For more detailed information on using CUBIT, refer to the CUBIT documentation
- 
-\begin_inset Flex URL
-status collapsed
-
-\begin_layout Plain Layout
-
-cubit.sandia.gov
-\end_layout
-
-\end_inset
-
-.
- If you have CUBIT installed on your machine, you can use the journal files
- to create your own mesh.
- Otherwise, you can use the mesh that has already been created.
-\end_layout
-
-\begin_layout Standard
-If you are using CUBIT to generate your own mesh, there are two ways to
- use the journal files.
- The simplest method is to go to the
-\family sans
- Tools
-\family default
- menu, select 
-\family sans
-Play Journal File
-\family default
-, and then select the file 
-\family typewriter
-mesh_hex8_1000m.jou
-\family default
-.
- This will run the commands in that file as well as the commands in 
-\family typewriter
-geometry.jou
-\family default
-, which is referenced from 
-\family typewriter
-mesh_hex8_1000m.jou
-\family default
-.
- Prior to doing this, you should set your directory to the one containing
- the journal files.
- This method will create the mesh, but you will gain very little insight
- into what is being done.
- A more informative approach is to input each journal command into the CUBIT
- command window directly.
- That way, you will see what each command does.
- The first command in 
-\family typewriter
-mesh_hex8_1000m.jou
-\family default
- is 
-\family typewriter
-`playback
-\family default
- 
-\family typewriter
-geometry.jou
-\family default
-', so you should start with the commands in 
-\family typewriter
-geometry.jou
-\family default
-.
- The first three commands, which define the block shape, are
-\end_layout
-
-\begin_layout LyX-Code
-reset
-\end_layout
-
-\begin_layout LyX-Code
-brick x 6000 y 6000 z 4000
-\end_layout
-
-\begin_layout LyX-Code
-volume 1 move x 0 y 0 z -2000
-\end_layout
-
-\begin_layout Standard
-Continuing through the remainder of the commands in 
-\family typewriter
-geometry.jou
-\family default
-, and then using the additional commands in 
-\family typewriter
-mesh_hex8_1000m.jou
-\family default
-, you will eventually end up with the file 
-\family typewriter
-box_hex8_1000m.exo
-\family default
-, which contains all of the mesh information.
- This information is similar to that included in PyLith mesh ASCII format,
- but the information is contained in an Exodus file, which is a specialized
- netCDF file.
- If you have the 
-\family typewriter
-ncdump
-\family default
- command available, you can see what is in the file by typing:
-\end_layout
-
-\begin_layout LyX-Code
-ncdump box_hex8_1000m.exo
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/hex8-mesh.jpg
-	lyxscale 50
-	scale 33
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Mesh composed of trilinear hexahedral cells generated by CUBIT used for
- the suite of example problems.
- The different colors represent the two different materials.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:3dhex8-mesh"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Additional Common Information
-\end_layout
-
-\begin_layout Standard
-In addition to the mesh, the example problems share other information.
- As in previous examples, we place this information in 
-\family typewriter
-pylithapp.cfg
-\family default
-.
- Since these examples use a mesh from CUBIT, in this file we set the importer
- to 
-\family typewriter
-MeshIOCubit
-\family default
-:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.mesh_generator]
-\end_layout
-
-\begin_layout LyX-Code
-reader = pylith.meshio.MeshIOCubit
-\begin_inset Newline newline
-\end_inset
-
-
-\begin_inset Newline newline
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.mesh_generator.reader]
-\end_layout
-
-\begin_layout LyX-Code
-filename = mesh/box_hex8_1000m.exo
-\end_layout
-
-\begin_layout Standard
-This example differs from some earlier examples, because we specify two
- material groups:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent]
-\end_layout
-
-\begin_layout LyX-Code
-materials = [upper_crust,lower_crust]
-\begin_inset Newline newline
-\end_inset
-
-
-\begin_inset Newline newline
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.materials.upper_crust]
-\end_layout
-
-\begin_layout LyX-Code
-label = Upper crust material
-\end_layout
-
-\begin_layout LyX-Code
-id = 1
-\end_layout
-
-\begin_layout LyX-Code
-db.iohandler.filename = spatialdb/mat_elastic.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell = pylith.feassemble.FIATLagrange
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell.dimension = 3
-\begin_inset Newline newline
-\end_inset
-
-
-\begin_inset Newline newline
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.materials.lower_crust]
-\end_layout
-
-\begin_layout LyX-Code
-label = Lower crust material
-\end_layout
-
-\begin_layout LyX-Code
-id = 2
-\end_layout
-
-\begin_layout LyX-Code
-db.iohandler.filename = spatialdb/mat_elastic.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell = pylith.feassemble.FIATLagrange
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell.dimension = 3
-\end_layout
-
-\begin_layout Standard
-The two material groups correspond to the two different colored regions
- in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:3dhex8-mesh"
-
-\end_inset
-
-.
- Using two material groups allows us to specify different material types
- or material variations for the upper crust and lower crust, if desired.
- For now, we retain the default 
-\family typewriter
-ElasticIsotropic3D
-\family default
- material type for both materials.
- This behavior will be overridden by example-specific
-\family typewriter
-.cfg
-\family default
- files in some of the examples.
- Although the material groups are specified in 
-\family typewriter
-pylithapp.cfg
-\family default
-, the physical properties for the material models are given in 
-\family typewriter
-spatialdb/mat_elastic.spatialdb
-\family default
-.
- This spatial database provides values at a single point, resulting in uniform
- properties within the material.
-\end_layout
-
-\begin_layout Subsection
-Example Problems
-\end_layout
-
-\begin_layout Standard
-The example problems are divided into categories that roughly correspond
- to simple static problems, quasi-static problems, problems involving fault
- friction, and problems where gravity is used.
- For the most part, each successive example involves just adding or changing
- a few parameters from the previous example.
- For this reason, it is advisable to go through each example in order, starting
- with the simplest (static problems).
-\end_layout
-
-\begin_layout Standard
-\begin_inset CommandInset include
-LatexCommand input
-filename "static/static.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "quasistatic/quasistatic.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "friction/friction.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "gravity/gravity.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "surfload/surfload.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "dike/dike.lyx"
-
-\end_inset
-
-
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 0
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 2in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Tutorial-3d-hex8"
+
+\end_inset
+
+Tutorials Using Hexahedral Mesh Created by CUBIT
+\end_layout
+
+\begin_layout Standard
+PyLith features discussed in this set of tutorials:
+\end_layout
+
+\begin_layout Itemize
+Static solution
+\end_layout
+
+\begin_layout Itemize
+Quasi-static solution
+\end_layout
+
+\begin_layout Itemize
+CUBIT mesh format
+\end_layout
+
+\begin_layout Itemize
+Trilinear hexahedral cells
+\end_layout
+
+\begin_layout Itemize
+VTK output
+\end_layout
+
+\begin_layout Itemize
+HDF5 output
+\end_layout
+
+\begin_layout Itemize
+Dirichlet displacement and velocity boundary conditions
+\end_layout
+
+\begin_layout Itemize
+Neumann traction boundary conditions and time-varying tractions
+\end_layout
+
+\begin_layout Itemize
+ZeroDispDB spatial database
+\end_layout
+
+\begin_layout Itemize
+SimpleDB spatial database
+\end_layout
+
+\begin_layout Itemize
+UniformDB spatial database
+\end_layout
+
+\begin_layout Itemize
+Static fault rupture
+\end_layout
+
+\begin_layout Itemize
+Multiple kinematic fault ruptures
+\end_layout
+
+\begin_layout Itemize
+Specifying more than one material
+\end_layout
+
+\begin_layout Itemize
+Nonlinear solver
+\end_layout
+
+\begin_layout Itemize
+Linearly elastic isotropic material
+\end_layout
+
+\begin_layout Itemize
+Maxwell linear viscoelastic material
+\end_layout
+
+\begin_layout Itemize
+Generalized Maxwell linear viscoelastic material
+\end_layout
+
+\begin_layout Itemize
+Power-law viscoelastic material
+\end_layout
+
+\begin_layout Itemize
+Drucker-Prager elastoplastic material
+\end_layout
+
+\begin_layout Itemize
+Adaptive time stepping
+\end_layout
+
+\begin_layout Itemize
+Static fault friction
+\end_layout
+
+\begin_layout Itemize
+Slip-weakening fault friction
+\end_layout
+
+\begin_layout Itemize
+Rate-and-state fault friction
+\end_layout
+
+\begin_layout Itemize
+Gravitational body forces
+\end_layout
+
+\begin_layout Itemize
+Initial stresses
+\end_layout
+
+\begin_layout Itemize
+Finite strain
+\end_layout
+
+\begin_layout Standard
+All of the files necessary to run the examples are contained in the directory
+ 
+\family typewriter
+examples/3d/hex8
+\family default
+.
+\end_layout
+
+\begin_layout Subsection
+Overview
+\end_layout
+
+\begin_layout Standard
+This tutorial is meant to demonstrate most of the important features of
+ PyLith as a quasi-static finite-element code, using a sequence of example
+ problems.
+ All problems use the same 3D hexahedral mesh generated using the CUBIT
+ 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+cubit.sandia.gov
+\end_layout
+
+\end_inset
+
+ mesh generation package.
+ Each example builds on the previous examples, as we demonstrate new features.
+ As in the other examples, the files include extensive comments.
+ We start with the generation of the mesh, which is composed of 144 trilinear
+ hexahedra.
+ The tutorial demonstrates the usage of the CUBIT mesh generation package
+ to create a mesh, as well as describing how to use a CUBIT-generated mesh
+ in PyLith.
+ Following the discussion of how to generate the mesh, we discuss the 
+\family typewriter
+pylithapp.cfg
+\family default
+ file, which contains information common to all the simulations.
+ We group the examples into four sections, each pertaining to a particular
+ set of PyLith features.
+ We suggest users go through each of these sections in order as the complexity
+ increases at each step.
+ 
+\end_layout
+
+\begin_layout Subsection
+Mesh Generation and Description
+\end_layout
+
+\begin_layout Standard
+The mesh for these examples is a simple rectangular solid (Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:3dhex8-mesh"
+
+\end_inset
+
+).
+ Although it would be possible to generate this mesh by hand, it is much
+ simpler to use a mesh generation package, and we use CUBIT for this example.
+ We provide documented journal files in 
+\family typewriter
+examples/3d/hex8/mesh.
+
+\family default
+ Dissection of these journal files should provide some insight into how
+ to use CUBIT with PyLith.
+ For more detailed information on using CUBIT, refer to the CUBIT documentation
+ 
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+cubit.sandia.gov
+\end_layout
+
+\end_inset
+
+.
+ If you have CUBIT installed on your machine, you can use the journal files
+ to create your own mesh.
+ Otherwise, you can use the mesh that has already been created.
+\end_layout
+
+\begin_layout Standard
+If you are using CUBIT to generate your own mesh, there are two ways to
+ use the journal files.
+ The simplest method is to go to the
+\family sans
+ Tools
+\family default
+ menu, select 
+\family sans
+Play Journal File
+\family default
+, and then select the file 
+\family typewriter
+mesh_hex8_1000m.jou
+\family default
+.
+ This will run the commands in that file as well as the commands in 
+\family typewriter
+geometry.jou
+\family default
+, which is referenced from 
+\family typewriter
+mesh_hex8_1000m.jou
+\family default
+.
+ Prior to doing this, you should set your directory to the one containing
+ the journal files.
+ This method will create the mesh, but you will gain very little insight
+ into what is being done.
+ A more informative approach is to input each journal command into the CUBIT
+ command window directly.
+ That way, you will see what each command does.
+ The first command in 
+\family typewriter
+mesh_hex8_1000m.jou
+\family default
+ is 
+\family typewriter
+`playback
+\family default
+ 
+\family typewriter
+geometry.jou
+\family default
+', so you should start with the commands in 
+\family typewriter
+geometry.jou
+\family default
+.
+ The first three commands, which define the block shape, are
+\end_layout
+
+\begin_layout LyX-Code
+reset
+\end_layout
+
+\begin_layout LyX-Code
+brick x 6000 y 6000 z 4000
+\end_layout
+
+\begin_layout LyX-Code
+volume 1 move x 0 y 0 z -2000
+\end_layout
+
+\begin_layout Standard
+Continuing through the remainder of the commands in 
+\family typewriter
+geometry.jou
+\family default
+, and then using the additional commands in 
+\family typewriter
+mesh_hex8_1000m.jou
+\family default
+, you will eventually end up with the file 
+\family typewriter
+box_hex8_1000m.exo
+\family default
+, which contains all of the mesh information.
+ This information is similar to that included in PyLith mesh ASCII format,
+ but the information is contained in an Exodus file, which is a specialized
+ netCDF file.
+ If you have the 
+\family typewriter
+ncdump
+\family default
+ command available, you can see what is in the file by typing:
+\end_layout
+
+\begin_layout LyX-Code
+ncdump box_hex8_1000m.exo
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/hex8-mesh.jpg
+	lyxscale 50
+	scale 33
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Mesh composed of trilinear hexahedral cells generated by CUBIT used for
+ the suite of example problems.
+ The different colors represent the two different materials.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:3dhex8-mesh"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Additional Common Information
+\end_layout
+
+\begin_layout Standard
+In addition to the mesh, the example problems share other information.
+ As in previous examples, we place this information in 
+\family typewriter
+pylithapp.cfg
+\family default
+.
+ Since these examples use a mesh from CUBIT, in this file we set the importer
+ to 
+\family typewriter
+MeshIOCubit
+\family default
+:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.mesh_generator]
+\end_layout
+
+\begin_layout LyX-Code
+reader = pylith.meshio.MeshIOCubit
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.mesh_generator.reader]
+\end_layout
+
+\begin_layout LyX-Code
+filename = mesh/box_hex8_1000m.exo
+\end_layout
+
+\begin_layout Standard
+This example differs from some earlier examples, because we specify two
+ material groups:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent]
+\end_layout
+
+\begin_layout LyX-Code
+materials = [upper_crust,lower_crust]
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.materials.upper_crust]
+\end_layout
+
+\begin_layout LyX-Code
+label = Upper crust material
+\end_layout
+
+\begin_layout LyX-Code
+id = 1
+\end_layout
+
+\begin_layout LyX-Code
+db.iohandler.filename = spatialdb/mat_elastic.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell = pylith.feassemble.FIATLagrange
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell.dimension = 3
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.materials.lower_crust]
+\end_layout
+
+\begin_layout LyX-Code
+label = Lower crust material
+\end_layout
+
+\begin_layout LyX-Code
+id = 2
+\end_layout
+
+\begin_layout LyX-Code
+db.iohandler.filename = spatialdb/mat_elastic.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell = pylith.feassemble.FIATLagrange
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell.dimension = 3
+\end_layout
+
+\begin_layout Standard
+The two material groups correspond to the two different colored regions
+ in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:3dhex8-mesh"
+
+\end_inset
+
+.
+ Using two material groups allows us to specify different material types
+ or material variations for the upper crust and lower crust, if desired.
+ For now, we retain the default 
+\family typewriter
+ElasticIsotropic3D
+\family default
+ material type for both materials.
+ This behavior will be overridden by example-specific
+\family typewriter
+.cfg
+\family default
+ files in some of the examples.
+ Although the material groups are specified in 
+\family typewriter
+pylithapp.cfg
+\family default
+, the physical properties for the material models are given in 
+\family typewriter
+spatialdb/
+\begin_inset Newline linebreak
+\end_inset
+
+mat_elastic.spatialdb
+\family default
+.
+ This spatial database provides values at a single point, resulting in uniform
+ properties within the material.
+\end_layout
+
+\begin_layout Subsection
+Example Problems
+\end_layout
+
+\begin_layout Standard
+The example problems are divided into categories that roughly correspond
+ to simple static problems, quasi-static problems, problems involving fault
+ friction, and problems where gravity is used.
+ For the most part, each successive example involves just adding or changing
+ a few parameters from the previous example.
+ For this reason, it is advisable to go through each example in order, starting
+ with the simplest (static problems).
+\end_layout
+
+\begin_layout Standard
+\begin_inset CommandInset include
+LatexCommand input
+filename "static/static.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "quasistatic/quasistatic.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "friction/friction.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "gravity/gravity.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "surfload/surfload.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "dike/dike.lyx"
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/dike/dike.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/dike/dike.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/dike/dike.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -261,11 +261,7 @@
 \begin_inset Caption
 
 \begin_layout Plain Layout
-Displacement magnitude for example 
-\family typewriter
-step20
-\family default
- visualized using ParaView.
+Displacement magnitude for example step20 visualized using ParaView.
  
 \begin_inset CommandInset label
 LatexCommand label

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/friction/friction.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/friction/friction.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/friction/friction.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -183,17 +183,10 @@
 \family typewriter
 step10.cfg
 \family default
- file defines a problem that is identical to example 
-\family typewriter
-step01
-\family default
-, except for the presence of a vertical fault with static friction.
+ file defines a problem that is identical to example step01, except for
+ the presence of a vertical fault with static friction.
  In this case, the applied displacements are insufficient to cause the fault
- to slip, so the solution is identical to that in example 
-\family typewriter
-step01
-\family default
-.
+ to slip, so the solution is identical to that in example step01.
  As in previous examples involving faults, we must first provide an array
  defining the fault interfaces:
 \end_layout
@@ -1043,51 +1036,75 @@
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 [pylithapp.timedependent.interfaces.fault]
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 # Set rate-and-state parameters using a UniformDB.
  Set the parameters as
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 # follows:
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 # reference coefficient of friction: 0.6
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 # reference slip rate: 1.0e-06 m/s
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 # slip-weakening parameter: 0.037 m
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 # a: 0.0125
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 # b: 0.0172
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 # cohesion: 0 Pa
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 friction.db_properties = spatialdata.spatialdb.UniformDB
 \end_layout
 
 \begin_layout LyX-Code
-friction.db_properties.label = Rate Stete Ageing
+
+\size small
+friction.db_properties.label = Rate State Ageing
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 friction.db_properties.values = [reference-friction-coefficient,reference-slip-rat
 e,
 \begin_inset Newline newline
@@ -1098,6 +1115,8 @@
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 friction.db_properties.data = [0.6,1.0e-6*m/s,0.0370*m,0.0125,0.0172,0.0*Pa]
 \end_layout
 
@@ -1137,9 +1156,9 @@
 \family default
  (all with a prefix of 
 \family typewriter
-step1
+step14
 \family default
-4).
+).
  Results using ParaView are shown in Figure 
 \begin_inset CommandInset ref
 LatexCommand ref

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/gravity/gravity.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/gravity/gravity.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/gravity/gravity.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,731 +1,731 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 0
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 2in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Subsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:Tutorial-3d-hex8-gravity"
-
-\end_inset
-
-Gravitational Body Force Examples
-\end_layout
-
-\begin_layout Standard
-PyLith features discussed in this tutorial:
-\end_layout
-
-\begin_layout Itemize
-Gravitational body forces
-\end_layout
-
-\begin_layout Itemize
-Initial stresses
-\end_layout
-
-\begin_layout Itemize
-Finite strain
-\end_layout
-
-\begin_layout Itemize
-Generalized Maxwell linear viscoelastic material
-\end_layout
-
-\begin_layout Subsubsection
-Overview
-\end_layout
-
-\begin_layout Standard
-This set of examples describes a set of problems for PyLith involving gravitatio
-nal body forces.
- All of the examples are quasi-static and run for a time period of 200 years.
- These examples also demonstrate the use of a generalized Maxwell viscoelastic
- material, which is used for the lower crust in all examples.
- The final example (step17) demonstrates the usage of a finite strain formulatio
-n, which automatically invokes the nonlinear solver.
- All of the examples are contained in the directory 
-\family typewriter
-examples/3d/hex8
-\family default
-, and the corresponding 
-\family typewriter
-.cfg
-\family default
- files are 
-\family typewriter
-step15.cfg
-\family default
-, 
-\family typewriter
-step16.cfg
-\family default
-, and 
-\family typewriter
-step17.cfg
-\family default
-.
- Each example may be run as follows:
-\end_layout
-
-\begin_layout LyX-Code
-pylith stepXX.cfg
-\end_layout
-
-\begin_layout Standard
-This will cause PyLith to read the default parameters in 
-\family typewriter
-pylithapp.cfg
-\family default
-, and then override or augment them with the additional parameters in the
- 
-\family typewriter
-stepXX.cfg
-\family default
- file.
- Each 
-\family typewriter
-.cfg
-\family default
- file is extensively documented, to provide detailed information on the
- various parameters.
-\end_layout
-
-\begin_layout Subsubsection
-Step15 - Gravitational Body Forces
-\end_layout
-
-\begin_layout Standard
-The 
-\family typewriter
-step15.cfg
-\family default
- file defines a problem with extremely simple Dirichlet boundary conditions.
- On the positive and negative x-faces, the positive and negative y-faces,
- and the negative z-face, the displacements normal to the face are set to
- zero.
- Because all of the materials in the example have the same density, the
- elastic solution for loading via gravitational body forces is
-\begin_inset Formula 
-\begin{equation}
-\sigma_{zz}=\rho gh;\:\sigma_{xx}=\sigma_{yy}=\frac{\nu\rho gh}{1-\nu}\:.\label{eq:1-1}
-\end{equation}
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-We first set the gravity field, which by default has values of 9.80655 
-\begin_inset Formula $\unitfrac{m}{s^{2}}$
-\end_inset
-
- for acceleration and 
-\begin_inset Formula $\left[0,0,-1\right]$
-\end_inset
-
- for direction:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent]
-\end_layout
-
-\begin_layout LyX-Code
-# Set gravity field (default is None)
-\end_layout
-
-\begin_layout LyX-Code
-gravity_field = spatialdata.spatialdb.GravityField
-\end_layout
-
-\begin_layout Standard
-We use adaptive time stepping, set the simulation time to 200 years, and
- specify a maximum time step size of 10 years:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.implicit]
-\end_layout
-
-\begin_layout LyX-Code
-# Change time stepping algorithm from uniform time step, to adaptive
-\end_layout
-
-\begin_layout LyX-Code
-# time stepping.
-\end_layout
-
-\begin_layout LyX-Code
-time_step = pylith.problems.TimeStepAdapt
-\begin_inset Newline newline
-\end_inset
-
-
-\begin_inset Newline newline
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-# Change the total simulation time to 200 years, and set the maximum time
-\end_layout
-
-\begin_layout LyX-Code
-# step size to 10 years.
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.implicit.time_step]
-\end_layout
-
-\begin_layout LyX-Code
-total_time = 200.0*year
-\end_layout
-
-\begin_layout LyX-Code
-max_dt = 10.0*year
-\end_layout
-
-\begin_layout LyX-Code
-stability_factor = 1.0 ; use time step equal to stable value from materials
-\end_layout
-
-\begin_layout Standard
-We use a generalized Maxwell model for the lower crust (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sub:Formulation-for-Gen-Max"
-
-\end_inset
-
-), and use a 
-\family typewriter
-SimpleDB
-\family default
- to provide the properties.
- We also request the relevant properties and state variables for output:
-\end_layout
-
-\begin_layout LyX-Code
-# Change material type of lower crust to generalized Maxwell viscoelastic.
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent]
-\end_layout
-
-\begin_layout LyX-Code
-materials.lower_crust = pylith.materials.GenMaxwellIsotropic3D
-\end_layout
-
-\begin_layout LyX-Code
-# Provide a spatial database from which to obtain property values.
-\end_layout
-
-\begin_layout LyX-Code
-# Since there are additional properties and state variables for the
-\end_layout
-
-\begin_layout LyX-Code
-# generalized Maxwell model, we explicitly request that they be output.
-\end_layout
-
-\begin_layout LyX-Code
-# Properties are named in cell_info_fields and state variables are named
- in
-\end_layout
-
-\begin_layout LyX-Code
-# cell_data_fields.
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.materials.lower_crust]
-\end_layout
-
-\begin_layout LyX-Code
-db_properties.iohandler.filename = spatialdb/mat_genmaxwell.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-output.cell_info_fields = [density,mu,lambda,shear_ratio,maxwell_time]
-\end_layout
-
-\begin_layout LyX-Code
-output.cell_data_fields = [total_strain,stress,viscous_strain_1,viscous_strain_2,
-\begin_inset Newline newline
-\end_inset
-
-viscous_strain_3]
-\end_layout
-
-\begin_layout Standard
-The boundary conditions for this example are trivial, so we are able to
- use the default 
-\family typewriter
-ZeroDispDB
-\family default
- for all faces.
- When we have run the simulation, the output VTK files will be contained
- in 
-\family typewriter
-examples/3d/hex8/output
-\family default
- (all with a prefix of 
-\family typewriter
-step15
-\family default
-).
- Results using ParaView are shown in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:step15-displ-t200"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/step15-displ-t200.jpg
-	lyxscale 50
-	width 10cm
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Displacement field for example step15 at t = 200 years visualized using
- ParaView.
- The z-component of the displacement field is shown with the color contours,
- and the vectors show the computed displacements.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:step15-displ-t200"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Step16 - Gravitational Body Forces with Initial Stresses
-\end_layout
-
-\begin_layout Standard
-The 
-\family typewriter
-step16.cfg
-\family default
- file defines a problem that is identical to example step15, except that
- initial stresses are used to prevent the initial large displacements due
- to 'turning on' gravity.
- Since all normal stress components are given an initial stress of 
-\begin_inset Formula $\rho gh$
-\end_inset
-
-, the initial stress state is lithostatic, which is an appropriate condition
- for many tectonic problems in the absence of tectonic stresses (e.g., McGarr
- 
-\begin_inset CommandInset citation
-LatexCommand cite
-key "McGarr:1988"
-
-\end_inset
-
-).
- When compared to example step15, this example should maintain a lithostatic
- state of stress for the entire simulation, and displacements should remain
- essentially zero.
-\end_layout
-
-\begin_layout Standard
-We set the gravity field, as in example step15, and we again use adaptive
- time stepping with a generalized Maxwell rheology for the lower crust.
- We provide values for the initial stress for both the upper and lower crust.
- Since the materials have the same density, we are able to use the same
- 
-\family typewriter
-SimpleDB
-\family default
- with a linear variation for both (see file 
-\family typewriter
-examples/3d/hex8/spatialdb/initial_stress.spatialdb
-\family default
-):
-\end_layout
-
-\begin_layout LyX-Code
-# We must specify initial stresses for each material.
-\end_layout
-
-\begin_layout LyX-Code
-# We provide a filename for the spatial database that gives the stresses,
-\end_layout
-
-\begin_layout LyX-Code
-# and we change the query_type from the default 'nearest' to 'linear'.
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.materials.upper_crust]
-\end_layout
-
-\begin_layout LyX-Code
-db_initial_stress = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-db_initial_stress.iohandler.filename = spatialdb/initial_stress.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-db_initial_stress.query_type = linear
-\begin_inset Newline newline
-\end_inset
-
-
-\begin_inset Newline newline
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.materials.lower_crust]
-\end_layout
-
-\begin_layout LyX-Code
-db_initial_stress = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-db_initial_stress.iohandler.filename = spatialdb/initial_stress.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-db_initial_stress.query_type = linear
-\end_layout
-
-\begin_layout Standard
-Note that we use a 
-\family typewriter
-linear
-\family default
- 
-\family typewriter
-query_type
-\family default
- rather than the default type of 
-\family typewriter
-nearest
-\family default
-, so that a linear interpolation is performed along the z-direction.
- When we have run the simulation, the output VTK files will be contained
- in 
-\family typewriter
-examples/3d/hex8/output
-\family default
- (all with a prefix of 
-\family typewriter
-step16
-\family default
-).
- Results using ParaView are shown in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:step16-stress_xx-t200"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/step16-stress_xx-t200.jpg
-	lyxscale 50
-	width 10cm
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Stress field (xx-component) for example step16 at t = 200 years visualized
- using ParaView.
- Note that for this example, Stress_xx = Stress_yy = Stress_zz, and there
- is no vertical displacement throughout the simulation.
- Also note that the stresses appear as 4 layers since we have used 
-\family typewriter
-CellFilterAvgMesh
-\family default
- for material output.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:step16-stress_xx-t200"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Step17 - Gravitational Body Forces with Small Strain
-\end_layout
-
-\begin_layout Standard
-The 
-\family typewriter
-step17.cfg
-\family default
- file defines a problem that is identical to example step15, except that
- we now use a small strain formulation (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Small-Strain-Formulation"
-
-\end_inset
-
-).
- All of the problems up to this point have assumed infinitesimal strain,
- meaning that the change in shape of the domain during deformation is not
- taken into account.
- In many problems it is important to consider the change in shape of the
- domain.
- This is particularly important in many problems involving gravitational
- body forces, since a change in shape of the domain results in a different
- stress field.
- By examining the stress and deformation fields for this example in comparison
- with those of example step15, we can see what effect the infinitesimal
- strain approximation has on our solution.
-\end_layout
-
-\begin_layout Standard
-We set the gravity field, as in example step15 and again use adaptive time
- stepping withs a generalized Maxwell rheology for the lower crust.
- The only change is that we change the problem formulation from the default
- 
-\family typewriter
-Implicit
-\family default
- to 
-\family typewriter
-ImplicitLgDeform
-\family default
-.
- Since the large deformation formulation is nonlinear, PyLith automatically
- switches the solver from the default 
-\family typewriter
-SolverLinear
-\family default
- to 
-\family typewriter
-SolverNonlinear
-\family default
-.
- It is thus only necessary to change the formulation:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent]
-\end_layout
-
-\begin_layout LyX-Code
-# Set the formulation for finite strain.
- The default solver will
-\end_layout
-
-\begin_layout LyX-Code
-# automatically be switched to the nonlinear solver.
-\end_layout
-
-\begin_layout LyX-Code
-formulation = pylith.problems.ImplicitLgDeform
-\end_layout
-
-\begin_layout Standard
-When we have run the simulation, the output VTK files will be contained
- in 
-\family typewriter
-examples/3d/hex8/output
-\family default
- (all with a prefix of 
-\family typewriter
-step17
-\family default
-).
- Results using ParaView are shown in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:step17-disp-t200"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/step17-displ-t200.jpg
-	lyxscale 50
-	width 10cm
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Displacement field for example step17 at t = 200 years visualized using
- ParaView.
- The z-component of the displacement field is shown with the color contours,
- and the vectors show the computed displacements.
- Note the larger displacements compared with example step15.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:step17-disp-t200"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 0
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 2in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Subsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Tutorial-3d-hex8-gravity"
+
+\end_inset
+
+Gravitational Body Force Examples
+\end_layout
+
+\begin_layout Standard
+PyLith features discussed in this tutorial:
+\end_layout
+
+\begin_layout Itemize
+Gravitational body forces
+\end_layout
+
+\begin_layout Itemize
+Initial stresses
+\end_layout
+
+\begin_layout Itemize
+Finite strain
+\end_layout
+
+\begin_layout Itemize
+Generalized Maxwell linear viscoelastic material
+\end_layout
+
+\begin_layout Subsubsection
+Overview
+\end_layout
+
+\begin_layout Standard
+This set of examples describes a set of problems for PyLith involving gravitatio
+nal body forces.
+ All of the examples are quasi-static and run for a time period of 200 years.
+ These examples also demonstrate the use of a generalized Maxwell viscoelastic
+ material, which is used for the lower crust in all examples.
+ The final example (step17) demonstrates the usage of a finite strain formulatio
+n, which automatically invokes the nonlinear solver.
+ All of the examples are contained in the directory 
+\family typewriter
+examples/3d/hex8
+\family default
+, and the corresponding 
+\family typewriter
+.cfg
+\family default
+ files are 
+\family typewriter
+step15.cfg
+\family default
+, 
+\family typewriter
+step16.cfg
+\family default
+, and 
+\family typewriter
+step17.cfg
+\family default
+.
+ Each example may be run as follows:
+\end_layout
+
+\begin_layout LyX-Code
+pylith stepXX.cfg
+\end_layout
+
+\begin_layout Standard
+This will cause PyLith to read the default parameters in 
+\family typewriter
+pylithapp.cfg
+\family default
+, and then override or augment them with the additional parameters in the
+ 
+\family typewriter
+stepXX.cfg
+\family default
+ file.
+ Each 
+\family typewriter
+.cfg
+\family default
+ file is extensively documented, to provide detailed information on the
+ various parameters.
+\end_layout
+
+\begin_layout Subsubsection
+Step15 - Gravitational Body Forces
+\end_layout
+
+\begin_layout Standard
+The 
+\family typewriter
+step15.cfg
+\family default
+ file defines a problem with extremely simple Dirichlet boundary conditions.
+ On the positive and negative x-faces, the positive and negative y-faces,
+ and the negative z-face, the displacements normal to the face are set to
+ zero.
+ Because all of the materials in the example have the same density, the
+ elastic solution for loading via gravitational body forces is
+\begin_inset Formula 
+\begin{equation}
+\sigma_{zz}=\rho gh;\:\sigma_{xx}=\sigma_{yy}=\frac{\nu\rho gh}{1-\nu}\:.\label{eq:1-1}
+\end{equation}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+We first set the gravity field, which by default has values of 9.80655 
+\begin_inset Formula $\unitfrac{m}{s^{2}}$
+\end_inset
+
+ for acceleration and 
+\begin_inset Formula $\left[0,0,-1\right]$
+\end_inset
+
+ for direction:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent]
+\end_layout
+
+\begin_layout LyX-Code
+# Set gravity field (default is None)
+\end_layout
+
+\begin_layout LyX-Code
+gravity_field = spatialdata.spatialdb.GravityField
+\end_layout
+
+\begin_layout Standard
+We use adaptive time stepping, set the simulation time to 200 years, and
+ specify a maximum time step size of 10 years:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.implicit]
+\end_layout
+
+\begin_layout LyX-Code
+# Change time stepping algorithm from uniform time step, to adaptive
+\end_layout
+
+\begin_layout LyX-Code
+# time stepping.
+\end_layout
+
+\begin_layout LyX-Code
+time_step = pylith.problems.TimeStepAdapt
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+# Change the total simulation time to 200 years, and set the maximum time
+\end_layout
+
+\begin_layout LyX-Code
+# step size to 10 years.
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.implicit.time_step]
+\end_layout
+
+\begin_layout LyX-Code
+total_time = 200.0*year
+\end_layout
+
+\begin_layout LyX-Code
+max_dt = 10.0*year
+\end_layout
+
+\begin_layout LyX-Code
+stability_factor = 1.0 ; use time step equal to stable value from materials
+\end_layout
+
+\begin_layout Standard
+We use a generalized Maxwell model for the lower crust (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sub:Formulation-for-Gen-Max"
+
+\end_inset
+
+), and use a 
+\family typewriter
+SimpleDB
+\family default
+ to provide the properties.
+ We also request the relevant properties and state variables for output:
+\end_layout
+
+\begin_layout LyX-Code
+# Change material type of lower crust to generalized Maxwell viscoelastic.
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent]
+\end_layout
+
+\begin_layout LyX-Code
+materials.lower_crust = pylith.materials.GenMaxwellIsotropic3D
+\end_layout
+
+\begin_layout LyX-Code
+# Provide a spatial database from which to obtain property values.
+\end_layout
+
+\begin_layout LyX-Code
+# Since there are additional properties and state variables for the
+\end_layout
+
+\begin_layout LyX-Code
+# generalized Maxwell model, we explicitly request that they be output.
+\end_layout
+
+\begin_layout LyX-Code
+# Properties are named in cell_info_fields and state variables are named
+ in
+\end_layout
+
+\begin_layout LyX-Code
+# cell_data_fields.
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.materials.lower_crust]
+\end_layout
+
+\begin_layout LyX-Code
+db_properties.iohandler.filename = spatialdb/mat_genmaxwell.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+output.cell_info_fields = [density,mu,lambda,shear_ratio,maxwell_time]
+\end_layout
+
+\begin_layout LyX-Code
+output.cell_data_fields = [total_strain,stress,viscous_strain_1,viscous_strain_2,
+\begin_inset Newline newline
+\end_inset
+
+viscous_strain_3]
+\end_layout
+
+\begin_layout Standard
+The boundary conditions for this example are trivial, so we are able to
+ use the default 
+\family typewriter
+ZeroDispDB
+\family default
+ for all faces.
+ When we have run the simulation, the output VTK files will be contained
+ in 
+\family typewriter
+examples/3d/hex8/output
+\family default
+ (all with a prefix of 
+\family typewriter
+step15
+\family default
+).
+ Results using ParaView are shown in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:step15-displ-t200"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/step15-displ-t200.jpg
+	lyxscale 50
+	width 10cm
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Displacement field for example step15 at t = 200 years visualized using
+ ParaView.
+ The z-component of the displacement field is shown with the color contours,
+ and the vectors show the computed displacements.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:step15-displ-t200"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Step16 - Gravitational Body Forces with Initial Stresses
+\end_layout
+
+\begin_layout Standard
+The 
+\family typewriter
+step16.cfg
+\family default
+ file defines a problem that is identical to example step15, except that
+ initial stresses are used to prevent the initial large displacements due
+ to 'turning on' gravity.
+ Since all normal stress components are given an initial stress of 
+\begin_inset Formula $\rho gh$
+\end_inset
+
+, the initial stress state is lithostatic, which is an appropriate condition
+ for many tectonic problems in the absence of tectonic stresses (e.g., McGarr
+ 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "McGarr:1988"
+
+\end_inset
+
+).
+ When compared to example step15, this example should maintain a lithostatic
+ state of stress for the entire simulation, and displacements should remain
+ essentially zero.
+\end_layout
+
+\begin_layout Standard
+We set the gravity field, as in example step15, and we again use adaptive
+ time stepping with a generalized Maxwell rheology for the lower crust.
+ We provide values for the initial stress for both the upper and lower crust.
+ Since the materials have the same density, we are able to use the same
+ 
+\family typewriter
+SimpleDB
+\family default
+ with a linear variation for both (see file 
+\family typewriter
+examples/3d/hex8/spatialdb/initial_stress.spatialdb
+\family default
+):
+\end_layout
+
+\begin_layout LyX-Code
+# We must specify initial stresses for each material.
+\end_layout
+
+\begin_layout LyX-Code
+# We provide a filename for the spatial database that gives the stresses,
+\end_layout
+
+\begin_layout LyX-Code
+# and we change the query_type from the default 'nearest' to 'linear'.
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.materials.upper_crust]
+\end_layout
+
+\begin_layout LyX-Code
+db_initial_stress = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+db_initial_stress.iohandler.filename = spatialdb/initial_stress.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+db_initial_stress.query_type = linear
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.materials.lower_crust]
+\end_layout
+
+\begin_layout LyX-Code
+db_initial_stress = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+db_initial_stress.iohandler.filename = spatialdb/initial_stress.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+db_initial_stress.query_type = linear
+\end_layout
+
+\begin_layout Standard
+Note that we use a 
+\family typewriter
+linear
+\family default
+ 
+\family typewriter
+query_type
+\family default
+ rather than the default type of 
+\family typewriter
+nearest
+\family default
+, so that a linear interpolation is performed along the z-direction.
+ When we have run the simulation, the output VTK files will be contained
+ in 
+\family typewriter
+examples/3d/hex8/output
+\family default
+ (all with a prefix of 
+\family typewriter
+step16
+\family default
+).
+ Results using ParaView are shown in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:step16-stress_xx-t200"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/step16-stress_xx-t200.jpg
+	lyxscale 50
+	width 10cm
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Stress field (xx-component) for example step16 at t = 200 years visualized
+ using ParaView.
+ Note that for this example, Stress_xx = Stress_yy = Stress_zz, and there
+ is no vertical displacement throughout the simulation.
+ Also note that the stresses appear as four layers since we have used 
+\family typewriter
+CellFilterAvgMesh
+\family default
+ for material output.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:step16-stress_xx-t200"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Step17 - Gravitational Body Forces with Small Strain
+\end_layout
+
+\begin_layout Standard
+The 
+\family typewriter
+step17.cfg
+\family default
+ file defines a problem that is identical to example step15, except that
+ we now use a small strain formulation (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Small-Strain-Formulation"
+
+\end_inset
+
+).
+ All of the problems up to this point have assumed infinitesimal strain,
+ meaning that the change in shape of the domain during deformation is not
+ taken into account.
+ In many problems it is important to consider the change in shape of the
+ domain.
+ This is particularly important in many problems involving gravitational
+ body forces, since a change in shape of the domain results in a different
+ stress field.
+ By examining the stress and deformation fields for this example in comparison
+ with those of example step15, we can see what effect the infinitesimal
+ strain approximation has on our solution.
+\end_layout
+
+\begin_layout Standard
+We set the gravity field, as in example step15 and again use adaptive time
+ stepping withs a generalized Maxwell rheology for the lower crust.
+ The only change is that we change the problem formulation from the default
+ 
+\family typewriter
+Implicit
+\family default
+ to 
+\family typewriter
+ImplicitLgDeform
+\family default
+.
+ Since the large deformation formulation is nonlinear, PyLith automatically
+ switches the solver from the default 
+\family typewriter
+SolverLinear
+\family default
+ to 
+\family typewriter
+SolverNonlinear
+\family default
+.
+ It is thus only necessary to change the formulation:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent]
+\end_layout
+
+\begin_layout LyX-Code
+# Set the formulation for finite strain.
+ The default solver will
+\end_layout
+
+\begin_layout LyX-Code
+# automatically be switched to the nonlinear solver.
+\end_layout
+
+\begin_layout LyX-Code
+formulation = pylith.problems.ImplicitLgDeform
+\end_layout
+
+\begin_layout Standard
+When we have run the simulation, the output VTK files will be contained
+ in 
+\family typewriter
+examples/3d/hex8/output
+\family default
+ (all with a prefix of 
+\family typewriter
+step17
+\family default
+).
+ Results using ParaView are shown in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:step17-disp-t200"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/step17-displ-t200.jpg
+	lyxscale 50
+	width 10cm
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Displacement field for example step17 at t = 200 years visualized using
+ ParaView.
+ The z-component of the displacement field is shown with the color contours,
+ and the vectors show the computed displacements.
+ Note the larger displacements compared with example step15.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:step17-disp-t200"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/quasistatic/quasistatic.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/quasistatic/quasistatic.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/quasistatic/quasistatic.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -756,12 +756,11 @@
 \end_layout
 
 \begin_layout LyX-Code
-db_rate.values = [traction-rate-shear-horiz,traction-rate-shear-vert,traction-rat
-e-normal,
+db_rate.values = [traction-rate-shear-horiz,traction-rate-shear-vert,
 \begin_inset Newline newline
 \end_inset
 
-rate-start-time]
+traction-rate-normal,rate-start-time]
 \end_layout
 
 \begin_layout LyX-Code
@@ -1483,13 +1482,9 @@
 \end_layout
 
 \begin_layout Standard
-In 
-\family typewriter
-step07
-\family default
- we add velocity boundary conditions in the positive and negative y-directions
- on the positive and negative x-faces, so that the external boundaries keep
- pace with the average fault slip.
+In step07 we add velocity boundary conditions in the positive and negative
+ y-directions on the positive and negative x-faces, so that the external
+ boundaries keep pace with the average fault slip.
  This problem is nearly identical to the strike-slip fault model of Savage
  and Prescott 
 \begin_inset CommandInset citation
@@ -1756,12 +1751,8 @@
 step07
 \family default
 ).
- As for example 
+ As for example step06, make sure to open the 
 \family typewriter
-step06
-\family default
-, make sure to open the 
-\family typewriter
 .xmf
 \family default
  files rather than the 
@@ -1796,11 +1787,7 @@
 
 \begin_layout Plain Layout
 Displacement field (color contours) and velocity field (vectors) for example
- 
-\family typewriter
-step07
-\family default
- at t = 300 years visualized using ParaView.
+ step07 at t = 300 years visualized using ParaView.
  The mesh has been distorted by the computed displacements (magnified by
  500), and the vectors show the computed velocities.
 \begin_inset CommandInset label
@@ -1809,7 +1796,7 @@
 
 \end_inset
 
-.
+
 \end_layout
 
 \end_inset
@@ -1839,11 +1826,8 @@
 \family typewriter
 step08.cfg
 \family default
- file defines a problem that is identical to example 
-\family typewriter
-step07
-\family default
-, except the the lower crust is composed of a power-law viscoelastic material.
+ file defines a problem that is identical to example step07, except the
+ the lower crust is composed of a power-law viscoelastic material.
  Since the material behavior is now nonlinear, we must use the nonlinear
  solver:
 \end_layout
@@ -1931,7 +1915,11 @@
  The user must provide a spatial database defining the spatial distribution
  of laboratory-derived parameters (contained in 
 \family typewriter
-powerlaw_params.spatialdb
+powerlaw_params.
+\begin_inset Newline linebreak
+\end_inset
+
+spatialdb
 \family default
 ), another spatial database defining the temperature field in degrees K
  (contained in 
@@ -1992,8 +1980,11 @@
 \end_layout
 
 \begin_layout Standard
-This code will automatically read the parameters in powerlaw_gendb.cfg in
- creating the file
+This code will automatically read the parameters in 
+\family typewriter
+powerlaw_gendb.cfg
+\family default
+ in creating the file
 \begin_inset Newline newline
 \end_inset
 
@@ -2077,39 +2068,57 @@
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 # Provide the values to be obtained from each database and the database
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 # name.
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 [pylithapp.timedependent.materials.lower_crust.db_properties]
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 values_A = [density,vs,vp]   ; Elastic properties.
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 db_A.label = Elastic properties
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 db_A.iohandler.filename = spatialdb/mat_elastic.spatialdb
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 values_B = [reference-stress,reference-strain-rate,power-law-exponent] 
   ; Power-law properties.
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 db_B.label = Power-law properties
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 db_B.iohandler.filename = spatialdb/mat_powerlaw.spatialdb
 \end_layout
 
@@ -2202,11 +2211,7 @@
 
 \begin_layout Plain Layout
 The XY-component of strain (color contours) and displacement field (vectors)
- for example 
-\family typewriter
-step08
-\family default
- at t = 150 years visualized using ParaView.
+ for example step08 at t = 150 years visualized using ParaView.
  For this visualization, we loaded both the 
 \family typewriter
 step08-lower_crust.xmf
@@ -2227,7 +2232,7 @@
 
 \end_inset
 
-.
+
 \end_layout
 
 \end_inset
@@ -2248,11 +2253,8 @@
 \begin_layout Standard
 In this example we use a Drucker-Prager elastoplastic rheology in the lower
  crust.
- As in example 
-\family typewriter
-step08
-\family default
-, the material behavior is nonlinear so we again use the nonlinear solver.
+ As in example step08, the material behavior is nonlinear so we again use
+ the nonlinear solver.
  The material is elastoplastic, there is no inherent time-dependent response
  and the stable time-step size for the material depends on the loading condition
 s.
@@ -2363,12 +2365,8 @@
 \end_layout
 
 \begin_layout Standard
-As for the 
-\family typewriter
-step08
-\family default
- example, we first define the properties that come from each spatial database
- and then provide the database filename:
+As for the step08 example, we first define the properties that come from
+ each spatial database and then provide the database filename:
 \end_layout
 
 \begin_layout LyX-Code
@@ -2484,11 +2482,7 @@
 
 \begin_layout Plain Layout
 The XY-component of strain (color contours) and displacement field (vectors)
- for example 
-\family typewriter
-step09
-\family default
- at t = 150 years visualized using ParaView.
+ for example step09 at t = 150 years visualized using ParaView.
  For this visualization, we loaded both the 
 \family typewriter
 step09-lower_crust.xmf
@@ -2509,7 +2503,7 @@
 
 \end_inset
 
-.
+
 \end_layout
 
 \end_inset

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/static/static.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/static/static.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/static/static.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,869 +1,872 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 0
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 2in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Subsection
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:Tutorial-3d-hex8-static"
-
-\end_inset
-
-Static Examples
-\end_layout
-
-\begin_layout Standard
-PyLith features discussed in this tutorial:
-\end_layout
-
-\begin_layout Itemize
-Static solution
-\end_layout
-
-\begin_layout Itemize
-VTK output
-\end_layout
-
-\begin_layout Itemize
-Dirichlet displacement boundary conditions
-\end_layout
-
-\begin_layout Itemize
-Neumann traction boundary conditions
-\end_layout
-
-\begin_layout Itemize
-ZeroDispDB spatial database
-\end_layout
-
-\begin_layout Itemize
-SimpleDB spatial database
-\end_layout
-
-\begin_layout Itemize
-UniformDB spatial database
-\end_layout
-
-\begin_layout Itemize
-Static fault rupture
-\end_layout
-
-\begin_layout Itemize
-Specifying more than one material
-\end_layout
-
-\begin_layout Itemize
-Linearly elastic isotropic material
-\end_layout
-
-\begin_layout Subsubsection
-Overview
-\end_layout
-
-\begin_layout Standard
-This set of examples describe the simplest class of problems for PyLith.
- The problems are all purely elastic, and there is no time-dependence.
- This set of elastostatic examples primarily demonstrates the application
- of different types of boundary conditions in PyLith, as well as demonstrating
- the use of a kinematic fault for a static problem.
- All of the examples are contained in the directory 
-\family typewriter
-examples/3d/hex8
-\family default
-, and the corresponding 
-\family typewriter
-.cfg
-\family default
- files are 
-\family typewriter
-step01.cfg
-\family default
-, 
-\family typewriter
-step02.cfg
-\family default
-, and 
-\family typewriter
-step03.cfg
-\family default
-.
- Each example may be run as follows:
-\end_layout
-
-\begin_layout LyX-Code
-pylith stepXX.cfg
-\end_layout
-
-\begin_layout Standard
-This will cause PyLith to read the default parameters in 
-\family typewriter
-pylithapp.cfg
-\family default
-, and then override or augment them with the additional parameters in the
- 
-\family typewriter
-stepXX.cfg
-\family default
- file.
- Each 
-\family typewriter
-.cfg
-\family default
- file is extensively documented to provide detailed information on the various
- parameters.
-\end_layout
-
-\begin_layout Subsubsection
-Step01 - Pure Dirichlet Boundary Conditions
-\end_layout
-
-\begin_layout Standard
-The 
-\family typewriter
-step01.cfg
-\family default
- file defines a problem with pure Dirichlet (displacement) boundary conditions
- corresponding to compression in the x-direction and shear in the y-direction.
- The bottom (minimum z) boundary is held fixed in the z-direction.
- On the positive and negative x-faces, compressional displacements of 1
- m are applied in the x-direction and shear displacements yielding a left-latera
-l sense of shear are applied in the y-direction.
- In this example and in subsequent examples we would like to output the
- displacement solution over a subset of the domain corresponding to the
- ground surface.
- To do this, we first set the output to an array of two output managers
- as follows:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.implicit]
-\end_layout
-
-\begin_layout LyX-Code
-# Set the output to an array of 2 output managers.
-\end_layout
-
-\begin_layout LyX-Code
-# We will output the solution over the domain and the ground surface.
-\end_layout
-
-\begin_layout LyX-Code
-output = [domain,subdomain]
-\end_layout
-
-\begin_layout Standard
-We then define the subdomain output manager to correspond to a subset of
- the domain:
-\end_layout
-
-\begin_layout LyX-Code
-# Set subdomain component to OutputSolnSubset (boundary of the domain).
-\end_layout
-
-\begin_layout LyX-Code
-output.subdomain = pylith.meshio.OutputSolnSubset
-\end_layout
-
-\begin_layout Standard
-Later (in the output section at the end of the file), we specify the nodeset
- that corresponds to the desired output:
-\end_layout
-
-\begin_layout LyX-Code
-# Give basename for VTK domain output of solution over ground surface.
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.formulation.output.subdomain]
-\end_layout
-
-\begin_layout LyX-Code
-# Name of nodeset for ground surface.
-\end_layout
-
-\begin_layout LyX-Code
-label = face_zpos
-\end_layout
-
-\begin_layout LyX-Code
-writer.filename = output/step01-groundsurf.vtk
-\end_layout
-
-\begin_layout Standard
-For the boundary conditions, we must describe which degrees of freedom are
- being constrained (
-\family typewriter
-bc_dof
-\family default
-), we must provide a the label associated with the CUBIT nodeset associated
- with the BC, and we must specify the type of spatial database is being
- used to describe the boundary conditions.
- For the x-faces, we use a 
-\family typewriter
-SimpleDB
-\family default
- to provide the displacements on the x-faces:
-\end_layout
-
-\begin_layout LyX-Code
-# +x face
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.bc.x_pos]
-\end_layout
-
-\begin_layout LyX-Code
-bc_dof = [0, 1]
-\end_layout
-
-\begin_layout LyX-Code
-label = face_xpos
-\end_layout
-
-\begin_layout LyX-Code
-db_initial = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.label = Dirichlet BC on +x
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.iohandler.filename = spatialdb/fixeddisp_axial_shear.spatialdb
-\begin_inset Newline newline
-\end_inset
-
-
-\begin_inset Newline newline
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-# -x face
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.bc.x_neg]
-\end_layout
-
-\begin_layout LyX-Code
-bc_dof = [0, 1]
-\end_layout
-
-\begin_layout LyX-Code
-label = face_xneg
-\end_layout
-
-\begin_layout LyX-Code
-db_initial = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.label = Dirichlet BC on -x
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.iohandler.filename = spatialdb/fixeddisp_axial_shear.spatialdb
-\end_layout
-
-\begin_layout Standard
-For a 
-\family typewriter
-SimpleDB
-\family default
-, we must provide a filename.
- The default spatial database for 
-\family typewriter
-db_initial
-\family default
- is 
-\family typewriter
-ZeroDispBC
-\family default
-, which automatically applies zero displacements to all vertices in the
- nodeset, and no filename is required (or needed).
- This is what we use for the bottom of the mesh:
-\end_layout
-
-\begin_layout LyX-Code
-# -z face
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.bc.z_neg]
-\end_layout
-
-\begin_layout LyX-Code
-bc_dof = [2]
-\end_layout
-
-\begin_layout LyX-Code
-label = face_zneg
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.label = Dirichlet BC on -z
-\end_layout
-
-\begin_layout Standard
-When we have run the simulation, the output VTK files will be contained
- in 
-\family typewriter
-examples/3d/hex8/output
-\family default
- (all with a prefix of 
-\family typewriter
-step01
-\family default
-).
- Results using ParaView are shown in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:step01-displ"
-
-\end_inset
-
-.
-\end_layout
-
-\begin_layout Standard
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/step01-displ.jpg
-	width 10cm
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Displacement field for example step01 visualized using ParaView.
- The mesh has been distorted by the computed displacements (magnified by
- 500), and the vectors show the computed displacements.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:step01-displ"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Step02 - Dirichlet and Neumann Boundary Conditions
-\end_layout
-
-\begin_layout Standard
-The 
-\family typewriter
-step02.cfg
-\family default
- file defines a problem with Dirichlet (displacement) boundary conditions
- corresponding to zero x and y-displacements applied on the negative x-face
- and Neumann (traction) boundary conditions corresponding to normal compression
- and horizontal shear applied on the positive x-face.
- The bottom (negative z) boundary is held fixed in the z-direction.
- The problem is similar to example step01, except that 1 MPa of normal compressi
-on and 1 MPa of shear (in a left-lateral sense) are applied on the positive
- x-face, and the negative x-face is pinned in both the x and y-directions.
-\end_layout
-
-\begin_layout Standard
-For the boundary conditions, we must first change the boundary condition
- type for the positive x-face from the default Dirichlet to Neumann:
-\end_layout
-
-\begin_layout LyX-Code
-# +x face -- first change bc type to Neumann
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.bc]
-\end_layout
-
-\begin_layout LyX-Code
-x_pos = pylith.bc.Neumann 
-\end_layout
-
-\begin_layout Standard
-We use a 
-\family typewriter
-SimpleDB
-\family default
- to describe the traction boundary conditions.
- When applying traction boundary conditions over a surface, it is also necessary
- to specify integration information for the surface.
- Since this is a three-dimensional problem, the dimension of the surface
- is 2.
- Since the cells being used are trilinear hexahedra, the cell type is 
-\family typewriter
-FIATLagrange
-\family default
- and we use an integration order of 2.
- A lower integration order would not provide sufficient accuracy while a
- higher integration order would offer no benefit (while requiring more computati
-on time and storage):
-\end_layout
-
-\begin_layout LyX-Code
-# +x face
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.bc.x_pos]
-\end_layout
-
-\begin_layout LyX-Code
-label = face_xpos
-\end_layout
-
-\begin_layout LyX-Code
-db_initial = spatialdata.spatialdb.SimpleDB
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.label = Neumann BC on +x
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.iohandler.filename = spatialdb/tractions_axial_shear.spatialdb
-\begin_inset Newline newline
-\end_inset
-
-
-\begin_inset Newline newline
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-# We must specify quadrature information for the cell faces.
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell = pylith.feassemble.FIATLagrange
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell.dimension = 2
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell.quad_order = 2 
-\end_layout
-
-\begin_layout Standard
-The boundary conditions on the negative x-face are simpler than they were
- in example step01 (zero displacements in the x and y-directions), so we
- can use the default 
-\family typewriter
-ZeroDispBC
-\family default
-:
-\end_layout
-
-\begin_layout LyX-Code
-# -x face
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.bc.x_neg]
-\end_layout
-
-\begin_layout LyX-Code
-bc_dof = [0, 1] 
-\end_layout
-
-\begin_layout LyX-Code
-label = face_xneg
-\end_layout
-
-\begin_layout LyX-Code
-db_initial.label = Dirichlet BC on -x 
-\end_layout
-
-\begin_layout Standard
-The boundary conditions on the negative z-face are supplied in the same
- manner as for example step01.
- When we have run the simulation, the output VTK files will be contained
- in 
-\family typewriter
-examples/3d/hex8/output
-\family default
- (all with a prefix of 
-\family typewriter
-step02
-\family default
-).
- Results using ParaView are shown in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:step02-displ"
-
-\end_inset
-
-.
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/step02-displ.jpg
-	lyxscale 50
-	width 10cm
-
-\end_inset
-
-
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Displacement field for example step02 visualized using ParaView.
- The mesh has been distorted by the computed displacements (magnified by
- 500), and the vectors show the computed displacements.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:step02-displ"
-
-\end_inset
-
-.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Step03 - Dirichlet Boundary Conditions with Kinematic Fault Slip
-\end_layout
-
-\begin_layout Standard
-The 
-\family typewriter
-step03.cfg
-\family default
- file describes a problem with Dirichlet (displacement) boundary conditions
- corresponding to zero x and y-displacements applied on the negative and
- positive x-faces and a vertical fault with a combination of left-lateral
- and updip motion.
- The left-lateral component of fault slip has a constant value of 2 m in
- the upper crust, and then decreases linearly to zero at the base of the
- model.
- The reverse slip component has a value of 0.25 m at the surface, and then
- decreases linearly to zero at 2 km depth.
-\end_layout
-
-\begin_layout Standard
-Due to the simplicity of the boundary conditions, we are able to use the
- default 
-\family typewriter
-ZeroDispBC
-\family default
- for the positive and negative x-faces, as well as the negative z-face.
- To use a fault, we must first define a fault interface.
- We do this by providing an array containing a single interface:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent]
-\end_layout
-
-\begin_layout LyX-Code
-# Set interfaces to an array of 1 fault: 'fault'.
-\end_layout
-
-\begin_layout LyX-Code
-interfaces = [fault] 
-\end_layout
-
-\begin_layout Standard
-For this example we specify the fault slip, so we set the interface type
- to 
-\family typewriter
-FaultCohesiveKin
-\family default
-:
-\end_layout
-
-\begin_layout LyX-Code
-# Set the type of fault interface condition.
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.interfaces]
-\end_layout
-
-\begin_layout LyX-Code
-fault = pylith.faults.FaultCohesiveKin 
-\end_layout
-
-\begin_layout Standard
-We must then identify the nodeset corresponding to the fault, and provide
- integration information for the fault surface:
-\end_layout
-
-\begin_layout LyX-Code
-# Set the parameters for the fault interface condition.
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.interfaces.fault]
-\end_layout
-
-\begin_layout LyX-Code
-# The label corresponds to the name of the nodeset in CUBIT.
-\end_layout
-
-\begin_layout LyX-Code
-label = fault
-\begin_inset Newline newline
-\end_inset
-
-
-\begin_inset Newline newline
-\end_inset
-
-
-\end_layout
-
-\begin_layout LyX-Code
-# We must define the quadrature information for fault cells.
-\end_layout
-
-\begin_layout LyX-Code
-# The fault cells are 2D (surface).
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell = pylith.feassemble.FIATLagrange
-\end_layout
-
-\begin_layout LyX-Code
-quadrature.cell.dimension = 2 
-\end_layout
-
-\begin_layout Standard
-We retain the default 
-\family typewriter
-StepSlipFn
-\family default
- since we want static fault slip.
- Finally, we use one 
-\family typewriter
-SimpleDB
-\family default
- to define the spatial variation of fault slip, and another 
-\family typewriter
-SimpleDB
-\family default
- to define the spatial variation in slip initiation times (the start time
- is 0.0 everywhere since this is a static problem):
-\end_layout
-
-\begin_layout LyX-Code
-# The slip time and final slip are defined in spatial databases.
- [pylithapp.timedependent.interfaces.fault.eq_srcs.rupture.slip_function]
-\end_layout
-
-\begin_layout LyX-Code
-slip.iohandler.filename = spatialdb/finalslip.spatialdb
-\end_layout
-
-\begin_layout LyX-Code
-slip.query_type = linear
-\end_layout
-
-\begin_layout LyX-Code
-slip_time.iohandler.filename = spatialdb/sliptime.spatialdb 
-\end_layout
-
-\begin_layout Standard
-Since the problem now contains a fault, we can request that fault infomation
- is also output:
-\end_layout
-
-\begin_layout LyX-Code
-# Give basename for VTK fault output.
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.problem.interfaces.fault.output]
-\end_layout
-
-\begin_layout LyX-Code
-writer.filename = output/step03-fault.vtk 
-\end_layout
-
-\begin_layout Standard
-This will result in two extra files being produced.
- The first file (
-\family typewriter
-step03-fault_info.vtk
-\family default
-) contains information such as the normal directions to the fault surface,
- the applied fault slip, and the fault slip times.
- The second file (
-\family typewriter
-step03-fault_t0000000.vtk
-\family default
-) contains the cumulative fault slip for the time step and the change in
- tractions on the fault surface due to the slip.
- When we have run the simulation, the output VTK files will be contained
- in 
-\family typewriter
-examples/3d/hex8/output
-\family default
- (all with a prefix of 
-\family typewriter
-step03
-\family default
-).
- Results using ParaView are shown in Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:step03-displ"
-
-\end_inset
-
-.
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/step03-displ.jpg
-	lyxscale 50
-	width 10cm
-
-\end_inset
-
-
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Displacement field for example step03 visualized using ParaView.
- The mesh has been distorted by the computed displacements (magnified by
- 500), and the vectors show the computed displacements.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:step03-displ"
-
-\end_inset
-
-.
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 0
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 2in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Subsection
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Tutorial-3d-hex8-static"
+
+\end_inset
+
+Static Examples
+\end_layout
+
+\begin_layout Standard
+PyLith features discussed in this tutorial:
+\end_layout
+
+\begin_layout Itemize
+Static solution
+\end_layout
+
+\begin_layout Itemize
+VTK output
+\end_layout
+
+\begin_layout Itemize
+Dirichlet displacement boundary conditions
+\end_layout
+
+\begin_layout Itemize
+Neumann traction boundary conditions
+\end_layout
+
+\begin_layout Itemize
+ZeroDispDB spatial database
+\end_layout
+
+\begin_layout Itemize
+SimpleDB spatial database
+\end_layout
+
+\begin_layout Itemize
+UniformDB spatial database
+\end_layout
+
+\begin_layout Itemize
+Static fault rupture
+\end_layout
+
+\begin_layout Itemize
+Specifying more than one material
+\end_layout
+
+\begin_layout Itemize
+Linearly elastic isotropic material
+\end_layout
+
+\begin_layout Subsubsection
+Overview
+\end_layout
+
+\begin_layout Standard
+This set of examples describe the simplest class of problems for PyLith.
+ The problems are all purely elastic, and there is no time-dependence.
+ This set of elastostatic examples primarily demonstrates the application
+ of different types of boundary conditions in PyLith, as well as demonstrating
+ the use of a kinematic fault for a static problem.
+ All of the examples are contained in the directory 
+\family typewriter
+examples/3d/hex8
+\family default
+, and the corresponding 
+\family typewriter
+.cfg
+\family default
+ files are 
+\family typewriter
+step01.cfg
+\family default
+, 
+\family typewriter
+step02.cfg
+\family default
+, and 
+\family typewriter
+step03.cfg
+\family default
+.
+ Each example may be run as follows:
+\end_layout
+
+\begin_layout LyX-Code
+pylith stepXX.cfg
+\end_layout
+
+\begin_layout Standard
+This will cause PyLith to read the default parameters in 
+\family typewriter
+pylithapp.cfg
+\family default
+, and then override or augment them with the additional parameters in the
+ 
+\family typewriter
+stepXX.cfg
+\family default
+ file.
+ Each 
+\family typewriter
+.cfg
+\family default
+ file is extensively documented to provide detailed information on the various
+ parameters.
+\end_layout
+
+\begin_layout Subsubsection
+Step01 - Pure Dirichlet Boundary Conditions
+\end_layout
+
+\begin_layout Standard
+The 
+\family typewriter
+step01.cfg
+\family default
+ file defines a problem with pure Dirichlet (displacement) boundary conditions
+ corresponding to compression in the x-direction and shear in the y-direction.
+ The bottom (minimum z) boundary is held fixed in the z-direction.
+ On the positive and negative x-faces, compressional displacements of 1
+ m are applied in the x-direction and shear displacements yielding a left-latera
+l sense of shear are applied in the y-direction.
+ In this example and in subsequent examples we would like to output the
+ displacement solution over a subset of the domain corresponding to the
+ ground surface.
+ To do this, we first set the output to an array of two output managers
+ as follows:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.implicit]
+\end_layout
+
+\begin_layout LyX-Code
+# Set the output to an array of 2 output managers.
+\end_layout
+
+\begin_layout LyX-Code
+# We will output the solution over the domain and the ground surface.
+\end_layout
+
+\begin_layout LyX-Code
+output = [domain,subdomain]
+\end_layout
+
+\begin_layout Standard
+We then define the subdomain output manager to correspond to a subset of
+ the domain:
+\end_layout
+
+\begin_layout LyX-Code
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
+\end_layout
+
+\begin_layout LyX-Code
+output.subdomain = pylith.meshio.OutputSolnSubset
+\end_layout
+
+\begin_layout Standard
+Later (in the output section at the end of the file), we specify the nodeset
+ that corresponds to the desired output:
+\end_layout
+
+\begin_layout LyX-Code
+# Give basename for VTK domain output of solution over ground surface.
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.formulation.output.subdomain]
+\end_layout
+
+\begin_layout LyX-Code
+# Name of nodeset for ground surface.
+\end_layout
+
+\begin_layout LyX-Code
+label = face_zpos
+\end_layout
+
+\begin_layout LyX-Code
+writer.filename = output/step01-groundsurf.vtk
+\end_layout
+
+\begin_layout Standard
+For the boundary conditions, we must describe which degrees of freedom are
+ being constrained (
+\family typewriter
+bc_dof
+\family default
+), we must provide a the label associated with the CUBIT nodeset associated
+ with the BC, and we must specify the type of spatial database is being
+ used to describe the boundary conditions.
+ For the x-faces, we use a 
+\family typewriter
+SimpleDB
+\family default
+ to provide the displacements on the x-faces:
+\end_layout
+
+\begin_layout LyX-Code
+# +x face
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.bc.x_pos]
+\end_layout
+
+\begin_layout LyX-Code
+bc_dof = [0, 1]
+\end_layout
+
+\begin_layout LyX-Code
+label = face_xpos
+\end_layout
+
+\begin_layout LyX-Code
+db_initial = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.label = Dirichlet BC on +x
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.iohandler.filename = spatialdb/fixeddisp_axial_shear.spatialdb
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+# -x face
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.bc.x_neg]
+\end_layout
+
+\begin_layout LyX-Code
+bc_dof = [0, 1]
+\end_layout
+
+\begin_layout LyX-Code
+label = face_xneg
+\end_layout
+
+\begin_layout LyX-Code
+db_initial = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.label = Dirichlet BC on -x
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.iohandler.filename = spatialdb/fixeddisp_axial_shear.spatialdb
+\end_layout
+
+\begin_layout Standard
+For a 
+\family typewriter
+SimpleDB
+\family default
+, we must provide a filename.
+ The default spatial database for 
+\family typewriter
+db_initial
+\family default
+ is 
+\family typewriter
+ZeroDispBC
+\family default
+, which automatically applies zero displacements to all vertices in the
+ nodeset, and no filename is required (or needed).
+ This is what we use for the bottom of the mesh:
+\end_layout
+
+\begin_layout LyX-Code
+# -z face
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.bc.z_neg]
+\end_layout
+
+\begin_layout LyX-Code
+bc_dof = [2]
+\end_layout
+
+\begin_layout LyX-Code
+label = face_zneg
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.label = Dirichlet BC on -z
+\end_layout
+
+\begin_layout Standard
+When we have run the simulation, the output VTK files will be contained
+ in 
+\family typewriter
+examples/3d/hex8/output
+\family default
+ (all with a prefix of 
+\family typewriter
+step01
+\family default
+).
+ Results using ParaView are shown in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:step01-displ"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/step01-displ.jpg
+	width 10cm
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Displacement field for example step01 visualized using ParaView.
+ The mesh has been distorted by the computed displacements (magnified by
+ 500), and the vectors show the computed displacements.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:step01-displ"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Step02 - Dirichlet and Neumann Boundary Conditions
+\end_layout
+
+\begin_layout Standard
+The 
+\family typewriter
+step02.cfg
+\family default
+ file defines a problem with Dirichlet (displacement) boundary conditions
+ corresponding to zero x and y-displacements applied on the negative x-face
+ and Neumann (traction) boundary conditions corresponding to normal compression
+ and horizontal shear applied on the positive x-face.
+ The bottom (negative z) boundary is held fixed in the z-direction.
+ The problem is similar to example step01, except that 1 MPa of normal compressi
+on and 1 MPa of shear (in a left-lateral sense) are applied on the positive
+ x-face, and the negative x-face is pinned in both the x and y-directions.
+\end_layout
+
+\begin_layout Standard
+For the boundary conditions, we must first change the boundary condition
+ type for the positive x-face from the default Dirichlet to Neumann:
+\end_layout
+
+\begin_layout LyX-Code
+# +x face -- first change bc type to Neumann
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.bc]
+\end_layout
+
+\begin_layout LyX-Code
+x_pos = pylith.bc.Neumann 
+\end_layout
+
+\begin_layout Standard
+We use a 
+\family typewriter
+SimpleDB
+\family default
+ to describe the traction boundary conditions.
+ When applying traction boundary conditions over a surface, it is also necessary
+ to specify integration information for the surface.
+ Since this is a three-dimensional problem, the dimension of the surface
+ is 2.
+ Since the cells being used are trilinear hexahedra, the cell type is 
+\family typewriter
+FIATLagrange
+\family default
+ and we use an integration order of 2.
+ A lower integration order would not provide sufficient accuracy while a
+ higher integration order would offer no benefit (while requiring more computati
+on time and storage):
+\end_layout
+
+\begin_layout LyX-Code
+# +x face
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.bc.x_pos]
+\end_layout
+
+\begin_layout LyX-Code
+label = face_xpos
+\end_layout
+
+\begin_layout LyX-Code
+db_initial = spatialdata.spatialdb.SimpleDB
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.label = Neumann BC on +x
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.iohandler.filename = spatialdb/tractions_axial_shear.spatialdb
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+# We must specify quadrature information for the cell faces.
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell = pylith.feassemble.FIATLagrange
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell.dimension = 2
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell.quad_order = 2 
+\end_layout
+
+\begin_layout Standard
+The boundary conditions on the negative x-face are simpler than they were
+ in example step01 (zero displacements in the x and y-directions), so we
+ can use the default 
+\family typewriter
+ZeroDispBC
+\family default
+:
+\end_layout
+
+\begin_layout LyX-Code
+# -x face
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.bc.x_neg]
+\end_layout
+
+\begin_layout LyX-Code
+bc_dof = [0, 1] 
+\end_layout
+
+\begin_layout LyX-Code
+label = face_xneg
+\end_layout
+
+\begin_layout LyX-Code
+db_initial.label = Dirichlet BC on -x 
+\end_layout
+
+\begin_layout Standard
+The boundary conditions on the negative z-face are supplied in the same
+ manner as for example step01.
+ When we have run the simulation, the output VTK files will be contained
+ in 
+\family typewriter
+examples/3d/hex8/output
+\family default
+ (all with a prefix of 
+\family typewriter
+step02
+\family default
+).
+ Results using ParaView are shown in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:step02-displ"
+
+\end_inset
+
+.
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/step02-displ.jpg
+	lyxscale 50
+	width 10cm
+
+\end_inset
+
+
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Displacement field for example step02 visualized using ParaView.
+ The mesh has been distorted by the computed displacements (magnified by
+ 500), and the vectors show the computed displacements.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:step02-displ"
+
+\end_inset
+
+.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Step03 - Dirichlet Boundary Conditions with Kinematic Fault Slip
+\end_layout
+
+\begin_layout Standard
+The 
+\family typewriter
+step03.cfg
+\family default
+ file describes a problem with Dirichlet (displacement) boundary conditions
+ corresponding to zero x and y-displacements applied on the negative and
+ positive x-faces and a vertical fault with a combination of left-lateral
+ and updip motion.
+ The left-lateral component of fault slip has a constant value of 2 m in
+ the upper crust, and then decreases linearly to zero at the base of the
+ model.
+ The reverse slip component has a value of 0.25 m at the surface, and then
+ decreases linearly to zero at 2 km depth.
+\end_layout
+
+\begin_layout Standard
+Due to the simplicity of the boundary conditions, we are able to use the
+ default 
+\family typewriter
+ZeroDispBC
+\family default
+ for the positive and negative x-faces, as well as the negative z-face.
+ To use a fault, we must first define a fault interface.
+ We do this by providing an array containing a single interface:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent]
+\end_layout
+
+\begin_layout LyX-Code
+# Set interfaces to an array of 1 fault: 'fault'.
+\end_layout
+
+\begin_layout LyX-Code
+interfaces = [fault] 
+\end_layout
+
+\begin_layout Standard
+For this example we specify the fault slip, so we set the interface type
+ to 
+\family typewriter
+FaultCohesiveKin
+\family default
+:
+\end_layout
+
+\begin_layout LyX-Code
+# Set the type of fault interface condition.
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.interfaces]
+\end_layout
+
+\begin_layout LyX-Code
+fault = pylith.faults.FaultCohesiveKin 
+\end_layout
+
+\begin_layout Standard
+We must then identify the nodeset corresponding to the fault, and provide
+ integration information for the fault surface:
+\end_layout
+
+\begin_layout LyX-Code
+# Set the parameters for the fault interface condition.
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.interfaces.fault]
+\end_layout
+
+\begin_layout LyX-Code
+# The label corresponds to the name of the nodeset in CUBIT.
+\end_layout
+
+\begin_layout LyX-Code
+label = fault
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Newline newline
+\end_inset
+
+
+\end_layout
+
+\begin_layout LyX-Code
+# We must define the quadrature information for fault cells.
+\end_layout
+
+\begin_layout LyX-Code
+# The fault cells are 2D (surface).
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell = pylith.feassemble.FIATLagrange
+\end_layout
+
+\begin_layout LyX-Code
+quadrature.cell.dimension = 2 
+\end_layout
+
+\begin_layout Standard
+We retain the default 
+\family typewriter
+StepSlipFn
+\family default
+ since we want static fault slip.
+ Finally, we use one 
+\family typewriter
+SimpleDB
+\family default
+ to define the spatial variation of fault slip, and another 
+\family typewriter
+SimpleDB
+\family default
+ to define the spatial variation in slip initiation times (the start time
+ is 0.0 everywhere since this is a static problem):
+\end_layout
+
+\begin_layout LyX-Code
+# The slip time and final slip are defined in spatial databases.
+\begin_inset Newline newline
+\end_inset
+
+[pylithapp.timedependent.interfaces.fault.eq_srcs.rupture.slip_function]
+\begin_inset Newline newline
+\end_inset
+
+slip.iohandler.filename = spatialdb/finalslip.spatialdb
+\end_layout
+
+\begin_layout LyX-Code
+slip.query_type = linear
+\end_layout
+
+\begin_layout LyX-Code
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb 
+\end_layout
+
+\begin_layout Standard
+Since the problem now contains a fault, we can request that fault infomation
+ is also output:
+\end_layout
+
+\begin_layout LyX-Code
+# Give basename for VTK fault output.
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.problem.interfaces.fault.output]
+\end_layout
+
+\begin_layout LyX-Code
+writer.filename = output/step03-fault.vtk 
+\end_layout
+
+\begin_layout Standard
+This will result in two extra files being produced.
+ The first file (
+\family typewriter
+step03-fault_info.vtk
+\family default
+) contains information such as the normal directions to the fault surface,
+ the applied fault slip, and the fault slip times.
+ The second file (
+\family typewriter
+step03-fault_t0000000.vtk
+\family default
+) contains the cumulative fault slip for the time step and the change in
+ tractions on the fault surface due to the slip.
+ When we have run the simulation, the output VTK files will be contained
+ in 
+\family typewriter
+examples/3d/hex8/output
+\family default
+ (all with a prefix of 
+\family typewriter
+step03
+\family default
+).
+ Results using ParaView are shown in Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:step03-displ"
+
+\end_inset
+
+.
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/step03-displ.jpg
+	lyxscale 50
+	width 10cm
+
+\end_inset
+
+
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Displacement field for example step03 visualized using ParaView.
+ The mesh has been distorted by the computed displacements (magnified by
+ 500), and the vectors show the computed displacements.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:step03-displ"
+
+\end_inset
+
+.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/surfload/surfload.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/surfload/surfload.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/3dhex8/surfload/surfload.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -331,9 +331,9 @@
 \family default
  (all with a prefix of 
 \family typewriter
-step1
+step18
 \family default
-8).
+).
  Results using ParaView are shown in Figure 
 \begin_inset CommandInset ref
 LatexCommand ref
@@ -471,9 +471,9 @@
 \family default
  (all with a prefix of 
 \family typewriter
-step1
+step19
 \family default
-9).
+).
  Results using ParaView are shown in Figure 
 \begin_inset CommandInset ref
 LatexCommand ref
@@ -529,13 +529,10 @@
 \begin_inset Caption
 
 \begin_layout Plain Layout
-Stress field (zz-component) for example 
+Stress field (zz-component) for example step19 at t = 200 years visualized
+ using ParaView.
+ The stresses appear as four layers since we have used 
 \family typewriter
-step19
-\family default
- at t = 200 years visualized using ParaView.
- The stresses appear as 4 layers since we have used 
-\family typewriter
 CellFilterAvgMesh
 \family default
  for material output.

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/3dtet4/3dtet4.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/3dtet4/3dtet4.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/3dtet4/3dtet4.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -218,6 +218,10 @@
 \family default
 examples directory (
 \family typewriter
+
+\begin_inset Newline linebreak
+\end_inset
+
 examples/3d/tet4
 \family default
 ), start LaGriT, and then type:
@@ -419,9 +423,9 @@
 \begin_layout Standard
 Since these examples use a mesh from LaGriT, we set the importer to 
 \family typewriter
-MeshIO
+MeshIOLagrit
 \family default
-Lagrit:
+:
 \end_layout
 
 \begin_layout LyX-Code
@@ -691,7 +695,11 @@
 \begin_layout Description
 pylithapp.problem.formulation.output.subdomain Gives the label of the nodeset
  defining the subdomain and gives the base filename for VTK output over
- the subdomain corresponding to the ground surface (
+ the subdomain corresponding to the ground surface 
+\begin_inset Newline linebreak
+\end_inset
+
+(
 \family typewriter
 step01-groundsurf.vtk
 \family default
@@ -745,36 +753,20 @@
 \begin_layout Standard
 The files containing common information (
 \family typewriter
-\size small
-tet4_1000m_binary.gmv
+tet4_1000m_binary.gmv, tet4_1000m_binary.pset, 
+\begin_inset Newline linebreak
+\end_inset
+
+pylithapp.cfg, mat_elastic.spatialdb, and mat_viscoelastic.spatialdb
 \family default
-, 
-\family typewriter
-tet4_1000m_binary.pset
-\family default
-, 
-\family typewriter
-pylithapp.cfg
-\family default
-, 
-\family typewriter
-mat_elastic.spatialdb
-\family default
-\size default
-, and 
-\family typewriter
-mat_viscoelastic.spatialdb
-\family default
 ) along with the problem-specific files (
 \family typewriter
-\size small
-step01.cfg
+step01.cfg 
 \family default
- and 
+and
 \family typewriter
-fixeddisp_shear.spatialdb
+ fixeddisp_shear.spatialdb
 \family default
-\size default
 ) provide a complete description of the problem, and we can then run this
  example by typing
 \end_layout
@@ -800,6 +792,10 @@
  mesh vertices.
  The second file is named 
 \family typewriter
+
+\begin_inset Newline linebreak
+\end_inset
+
 step01-statevars-elastic_t0000000.vtk
 \family default
 .
@@ -1576,7 +1572,11 @@
 \begin_layout Description
 pylithapp.problem.formulation.output.subdomain Gives the label of the nodeset
  defining the subdomain and gives the base filename for VTK output over
- the subdomain corresponding to the ground surface (
+ the subdomain corresponding to the ground surface 
+\begin_inset Newline linebreak
+\end_inset
+
+(
 \family typewriter
 step03-groundsurf.vtk
 \family default
@@ -1585,7 +1585,11 @@
 
 \begin_layout Description
 pylithapp.timedependent.interfaces.fault.output.writer Gives the base filename
- for cohesive cell output files (
+ for cohesive cell output files 
+\begin_inset Newline linebreak
+\end_inset
+
+(
 \family typewriter
 step03-fault.vtk
 \family default
@@ -1712,6 +1716,10 @@
  mesh vertices.
  The second file is named 
 \family typewriter
+
+\begin_inset Newline linebreak
+\end_inset
+
 step03-statevars-elastic_t0000000.vtk
 \family default
 .

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/greensfns2d/greensfns2d.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/greensfns2d/greensfns2d.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/greensfns2d/greensfns2d.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -902,9 +902,15 @@
 \end_layout
 
 \begin_layout LyX-Code
-../invert_slip.py --impulses=output/greensfns-fault.h5 --responses=output/greensfns-
-points.h5 --data=output/eqsim-points.h5 --penalty=penalty_params.txt --output=outpu
-t/slip_inverted.txt
+../invert_slip.py --impulses=output/greensfns-fault.h5
+\begin_inset Newline newline
+\end_inset
+
+--responses=output/greensfns-points.h5 --data=output/eqsim-points.h5
+\begin_inset Newline newline
+\end_inset
+
+--penalty=penalty_params.txt --output=output/slip_inverted.txt
 \end_layout
 
 \begin_layout Standard
@@ -935,6 +941,8 @@
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 plot_invresults.py --solution=output/eqsim-fault.h5 --predicted=output/slip_invert
 ed.txt
 \end_layout

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/hex8.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/hex8.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/hex8.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -74,7 +74,7 @@
 
 \end_inset
 
-3-D Bar Discretized with Hexahedra
+3D Bar Discretized with Hexahedra
 \end_layout
 
 \begin_layout Standard

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/quad4.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/quad4.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/quad4.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,704 +1,704 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 0
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 1in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:tutorial:shearwave:quad4"
-
-\end_inset
-
-3D Bar Discretized with Quadrilaterals
-\end_layout
-
-\begin_layout Standard
-PyLith features discussed in this tutorial:
-\end_layout
-
-\begin_layout Itemize
-Dynamic solution
-\end_layout
-
-\begin_layout Itemize
-CUBIT mesh format
-\end_layout
-
-\begin_layout Itemize
-Absorbing dampers boundary conditions
-\end_layout
-
-\begin_layout Itemize
-Kinematic fault interface conditions
-\end_layout
-
-\begin_layout Itemize
-Dynamic fault interface conditions
-\end_layout
-
-\begin_layout Itemize
-Plane strain linearly elastic material
-\end_layout
-
-\begin_layout Itemize
-VTK output
-\end_layout
-
-\begin_layout Itemize
-Linear quadrilateral cells
-\end_layout
-
-\begin_layout Itemize
-SimpleDB spatial database
-\end_layout
-
-\begin_layout Itemize
-ZeroDispDB spatial database
-\end_layout
-
-\begin_layout Itemize
-UniformDB spatial database
-\end_layout
-
-\begin_layout Standard
-All of the files necessary to run the examples are contained in the directory
- 
-\family typewriter
-examples/bar_shearwave/quad4.
-\end_layout
-
-\begin_layout Subsection
-Mesh Generation
-\end_layout
-
-\begin_layout Standard
-The mesh is a simple rectangular prism 8 km by 400 m by 400 m (Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:shearwave:quad4:mesh"
-
-\end_inset
-
-).
- We provide documented CUBIT journal files in 
-\family typewriter
-examples/bar_shearwave/quad4.
-
-\family default
- We first create the geometry, mesh the domain using quadrilateral cells,
- and then create blocks and nodesets associated with the materials and boundary
- conditions.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/quad4mesh.jpg
-	lyxscale 50
-	scale 50
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Mesh composed of hexahedral cells generated by CUBIT used for the example
- problem.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:shearwave:quad4:mesh"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Kinematic Fault
-\end_layout
-
-\begin_layout Standard
-The simulation parameters match those in the tri3, tet4, and hex8 examples.
- Using four-point quadrature permits use of a time step of 1/20 s, which
- is slightly larger than the time step of 1/30 s used in the tri3 and tet4
- simulations.
- In contrast to the tri3, tet4, and hex8 shear wave examples which only
- contained a single simulation in a directory, in this example we consider
- several different simulations.
- Consequently, we separate the parameters into multiple 
-\family typewriter
-.cfg
-\family default
- files.
- The common parameters are placed in 
-\family typewriter
-pylithapp.cfg
-\family default
- with the parameters specific to the kinematic fault example in 
-\family typewriter
-kinematic.cfg
-\family default
-.
- To run the problem, simply run PyLith via:
-\end_layout
-
-\begin_layout LyX-Code
-pylith kinematic.cfg
-\end_layout
-
-\begin_layout Standard
-The VTK files will be written to the 
-\family typewriter
-output
-\family default
- directory with the prefix 
-\family typewriter
-kinematic
-\family default
-.
- The output includes the displacement field over the entire domain at every
- other time step (0.10 s), the slip and traction vectors on the fault surface
- in along-strike and normal directions at every other time step (0.10 s),
- and the strain and stress tensors for each cell at every 20th time step
- (1.0 s).
- If the problem ran correctly, you should be able to generate a figure such
- as Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:shearwave:quad4:kinematic"
-
-\end_inset
-
-, which was generated using ParaView.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/quad4kinematic30.jpg
-	lyxscale 50
-	scale 50
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Displacement field in the bar at 3.0 s.
- Deformation has been exaggerated by a factor of 800.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:shearwave:quad4:kinematic"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Dynamic Fault
-\end_layout
-
-\begin_layout Standard
-In this set of examples we replace the kinematic fault interface with the
- dynamic fault interface, resulting in fault slip controlled by a fault-constitu
-tive model.
- See Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:fault:constitutive:models"
-
-\end_inset
-
- for detailed information about the fault constitutive models available
- in PyLith.
- Because this is a dynamic simulation we want the generated shear wave to
- continue to be absorbed at the ends of the bar, so we drive the fault by
- imposing initial tractions directly on the fault surface rather than through
- deformation within the bar.
- We employ a UniformDB object to specify 6.1 MPa of right-lateral shear and
- 10.0 MPa of normal compression for the initial fault tractions.
- The parameters common to the dynamic fault simulations are in 
-\family typewriter
-dynamic.cfg
-\family default
-.
- We use the explicit time-stepping with a lumped Jacobian matrix.
- We also request that the fault output include slip, slip rate, and traction
- fields:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.interfaces.fault.output]
-\end_layout
-
-\begin_layout LyX-Code
-vertex_data_fields = [slip,slip_rate,traction]
-\end_layout
-
-\begin_layout Subsubsection
-Dynamic Fault with Static Friction
-\end_layout
-
-\begin_layout Standard
-The parameters specific to this example are related to the use of the static
- friction fault constitutive model.
- We set the fault constitutive model via
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.interfaces.fault]
-\end_layout
-
-\begin_layout LyX-Code
-friction = pylith.friction.StaticFriction
-\end_layout
-
-\begin_layout Standard
-and use a UniformDB to set the static friction parameters.
- We use a coefficient of friction of 0.6 and no cohesion (0 MPa).
- The parameters specific to this example are in 
-\family typewriter
-dynamic_staticfriction.cfg
-\family default
-, so we run the problem via:
-\end_layout
-
-\begin_layout LyX-Code
-pylith dynamic.cfg dynamic_staticfriction.cfg
-\end_layout
-
-\begin_layout Standard
-The VTK files will be written to the 
-\family typewriter
-output
-\family default
- directory with the prefix 
-\family typewriter
-staticfriction
-\family default
-.
- The output includes the displacement and velocity fields over the entire
- domain at every other time step (0.10 s), the slip, slip rate, and traction
- vectors on the fault surface in along-strike and normal directions at every
- other time step (0.10 s), and the strain and stress tensors for each cell
- at every 20th time step (1.0 s).
- If the problem ran correctly, you should be able to generate a figure such
- as Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:shearwave:quad4:staticfriction"
-
-\end_inset
-
-, which was generated using ParaView.
- The steady-state solution is a constant slip rate of 0.08 m/s, a shear traction
- of 6.0 MPa on the fault surface, and a uniform shear strain of 2e-5 in the
- bar with uniform, constant velocities in the y-direction of +0.04 m/s and
- -0.04 m/s on the -x and +x sides of the fault, respectively.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/quad4staticfriction30.jpg
-	lyxscale 50
-	scale 50
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Velocity field in the bar at 3.0 s for the static friction fault constitutive
- model.
- Deformation has been exaggerated by a factor of 800.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:shearwave:quad4:staticfriction"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Dynamic Fault with Slip-Weakening Friction
-\end_layout
-
-\begin_layout Standard
-The parameters specific to this example are related to the use of the slip-weake
-ning friction fault constitutive model (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:fault:constitutive:models"
-
-\end_inset
-
-).
- We set the fault constitutive model via
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.interfaces.fault]
-\end_layout
-
-\begin_layout LyX-Code
-friction = pylith.friction.SlipWeakening
-\end_layout
-
-\begin_layout Standard
-and use a UniformDB to set the slip-weakening friction parameters.
- We use a static coefficient of friction of 0.6, a dynamic coefficient of
- friction of 0.5, a slip-weakening parameter of 0.2 m, and no cohesion (0
- MPa).
- The fault constitutive model is associated with the fault, so we can append
- the fault constitutive model parameters to the vertex information fields
- and the fault constitutive model state variables to the vertex data fields:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.interfaces.fault.output]
-\end_layout
-
-\begin_layout LyX-Code
-vertex_info_fields = [strike_dir,normal_dir,initial_traction,static_coefficient,
-\begin_inset Newline newline
-\end_inset
-
-dynamic_coefficient,slip_weakening_parameter,cohesion]
-\end_layout
-
-\begin_layout LyX-Code
-vertex_data_fields = [slip,traction,cumulative_slip,previous_slip]
-\end_layout
-
-\begin_layout Standard
-The parameters specific to this example are in 
-\family typewriter
-dynamic_slipweakening.cfg
-\family default
-, so we run the problem via:
-\end_layout
-
-\begin_layout LyX-Code
-pylith dynamic.cfg dynamic_slipweakening.cfg
-\end_layout
-
-\begin_layout Standard
-The VTK files will be written to the 
-\family typewriter
-output
-\family default
- directory with the prefix 
-\family typewriter
-slipweakening
-\family default
-.
- If the problem ran correctly, you should be able to generate a figure such
- as Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:shearwave:quad4:slipweakening"
-
-\end_inset
-
-, which was generated using ParaView.
- The steady-state solution is a constant slip rate of 0.88 m/s and shear
- traction of 5.0 MPa on the fault surface, a uniform shear strain of 2.2e-4
- in the bar with uniform, constant velocities in the y-direction of +0.44
- m/s and -0.44 m/s on the -x and +x sides of the fault, respectively.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/quad4slipweakening30.jpg
-	lyxscale 50
-	scale 50
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Velocity field in the bar at 3.0 s for the slip-weakening friction fault
- constitutive model.
- Deformation has been exaggerated by a factor of 800.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:shearwave:quad4:slipweakening"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsubsection
-Dynamic Fault with Rate-State Friction
-\end_layout
-
-\begin_layout Standard
-The parameters specific to this example are related to the use of the rate-
- and state-friction fault constitutive model (see Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:fault:constitutive:models"
-
-\end_inset
-
-).
- The evolution of the state variable uses the aging law.
- We set the fault constitutive model via
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.interfaces.fault]
-\end_layout
-
-\begin_layout LyX-Code
-friction = pylith.friction.RateStateAgeing
-\end_layout
-
-\begin_layout Standard
-and use a UniformDB to set the static friction parameters.
- We use a reference coefficient of friction of 0.6, reference slip rate of
- 1.0e-6 m/s, characteristic slip distance of 0.037 m, coefficients a and b
- of 0.0125 and 0.0172, and no cohesion (0 MPa).
- The parameters specific to this example are in 
-\family typewriter
-dynamic_ratestateageing.cfg
-\family default
-, so we run the problem via:
-\end_layout
-
-\begin_layout LyX-Code
-pylith dynamic.cfg dynamic_ratestateageing.cfg
-\end_layout
-
-\begin_layout Standard
-The VTK files will be written to the 
-\family typewriter
-output
-\family default
- directory with the prefix 
-\family typewriter
-ratestateageing
-\family default
-.
- If the problem ran correctly, you should be able to generate a figure such
- as Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:shearwave:quad4:ratestateageing"
-
-\end_inset
-
-, which was generated using ParaView.
- The steady-state solution is a constant slip rate of 0.572 m/s and shear
- traction of 5.385 MPa on the fault surface, a uniform shear strain of 1.43e-4
- in the bar with uniform, constant velocities in the y-direction of +0.286
- m/s and -0.286 m/s on the -x and +x sides of the fault, respectively.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/quad4ratestateageing30.jpg
-	lyxscale 50
-	scale 50
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Velocity field in the bar at 3.0 s for the rate- and state-friction fault
- constitutive model.
- Deformation has been exaggerated by a factor of 800.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:shearwave:quad4:ratestateageing"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 0
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 1in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:tutorial:shearwave:quad4"
+
+\end_inset
+
+3D Bar Discretized with Quadrilaterals
+\end_layout
+
+\begin_layout Standard
+PyLith features discussed in this tutorial:
+\end_layout
+
+\begin_layout Itemize
+Dynamic solution
+\end_layout
+
+\begin_layout Itemize
+CUBIT mesh format
+\end_layout
+
+\begin_layout Itemize
+Absorbing dampers boundary conditions
+\end_layout
+
+\begin_layout Itemize
+Kinematic fault interface conditions
+\end_layout
+
+\begin_layout Itemize
+Dynamic fault interface conditions
+\end_layout
+
+\begin_layout Itemize
+Plane strain linearly elastic material
+\end_layout
+
+\begin_layout Itemize
+VTK output
+\end_layout
+
+\begin_layout Itemize
+Linear quadrilateral cells
+\end_layout
+
+\begin_layout Itemize
+SimpleDB spatial database
+\end_layout
+
+\begin_layout Itemize
+ZeroDispDB spatial database
+\end_layout
+
+\begin_layout Itemize
+UniformDB spatial database
+\end_layout
+
+\begin_layout Standard
+All of the files necessary to run the examples are contained in the directory
+ 
+\family typewriter
+examples/bar_shearwave/quad4.
+\end_layout
+
+\begin_layout Subsection
+Mesh Generation
+\end_layout
+
+\begin_layout Standard
+The mesh is a simple rectangular prism 8 km by 400 m by 400 m (Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:shearwave:quad4:mesh"
+
+\end_inset
+
+).
+ We provide documented CUBIT journal files in 
+\family typewriter
+examples/bar_shearwave/quad4.
+
+\family default
+ We first create the geometry, mesh the domain using quadrilateral cells,
+ and then create blocks and nodesets associated with the materials and boundary
+ conditions.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/quad4mesh.jpg
+	lyxscale 50
+	scale 50
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Mesh composed of hexahedral cells generated by CUBIT used for the example
+ problem.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:shearwave:quad4:mesh"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Kinematic Fault
+\end_layout
+
+\begin_layout Standard
+The simulation parameters match those in the tri3, tet4, and hex8 examples.
+ Using four-point quadrature permits use of a time step of 1/20 s, which
+ is slightly larger than the time step of 1/30 s used in the tri3 and tet4
+ simulations.
+ In contrast to the tri3, tet4, and hex8 shear wave examples which only
+ contained a single simulation in a directory, in this example we consider
+ several different simulations.
+ Consequently, we separate the parameters into multiple 
+\family typewriter
+.cfg
+\family default
+ files.
+ The common parameters are placed in 
+\family typewriter
+pylithapp.cfg
+\family default
+ with the parameters specific to the kinematic fault (prescribed rupture)
+ example in 
+\family typewriter
+prescribedrup.cfg
+\family default
+.
+ To run the problem, simply run PyLith via:
+\end_layout
+
+\begin_layout LyX-Code
+pylith prescribedrup.cfg
+\end_layout
+
+\begin_layout Standard
+The VTK files will be written to the 
+\family typewriter
+output
+\family default
+ directory with the prefix 
+\family typewriter
+prescribedrup
+\family default
+.
+ The output includes the displacement field over the entire domain at every
+ other time step (0.10 s), the slip and traction vectors on the fault surface
+ in along-strike and normal directions at every other time step (0.10 s),
+ and the strain and stress tensors for each cell at every 20th time step
+ (1.0 s).
+ If the problem ran correctly, you should be able to generate a figure such
+ as Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:shearwave:quad4:kinematic"
+
+\end_inset
+
+, which was generated using ParaView.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/quad4kinematic30.jpg
+	lyxscale 50
+	scale 50
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Displacement field in the bar at 3.0 s.
+ Deformation has been exaggerated by a factor of 800.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:shearwave:quad4:kinematic"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Dynamic Fault
+\end_layout
+
+\begin_layout Standard
+In this set of examples we replace the kinematic fault interface with the
+ dynamic fault interface, resulting in fault slip controlled by a fault-constitu
+tive model.
+ See Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:fault:constitutive:models"
+
+\end_inset
+
+ for detailed information about the fault constitutive models available
+ in PyLith.
+ Because this is a dynamic simulation we want the generated shear wave to
+ continue to be absorbed at the ends of the bar, so we drive the fault by
+ imposing initial tractions directly on the fault surface rather than through
+ deformation within the bar.
+ We employ a UniformDB object to specify 6.1 MPa of right-lateral shear and
+ 10.0 MPa of normal compression for the initial fault tractions.
+ The parameters common to the dynamic fault simulations are in 
+\family typewriter
+spontaneousrup.cfg
+\family default
+.
+ We also request that the fault output include slip, slip rate, and traction
+ fields:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.interfaces.fault.output]
+\end_layout
+
+\begin_layout LyX-Code
+vertex_data_fields = [slip,slip_rate,traction]
+\end_layout
+
+\begin_layout Subsubsection
+Dynamic Fault with Static Friction
+\end_layout
+
+\begin_layout Standard
+The parameters specific to this example are related to the use of the static
+ friction fault constitutive model.
+ We set the fault constitutive model via
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.interfaces.fault]
+\end_layout
+
+\begin_layout LyX-Code
+friction = pylith.friction.StaticFriction
+\end_layout
+
+\begin_layout Standard
+and use a UniformDB to set the static friction parameters.
+ We use a coefficient of friction of 0.6 and no cohesion (0 MPa).
+ The parameters specific to this example are in 
+\family typewriter
+spontaneousrup_staticfriction.cfg
+\family default
+, so we run the problem via:
+\end_layout
+
+\begin_layout LyX-Code
+pylith spontaneousrup.cfg spontaneousrup_staticfriction.cfg
+\end_layout
+
+\begin_layout Standard
+The VTK files will be written to the 
+\family typewriter
+output
+\family default
+ directory with the prefix 
+\family typewriter
+staticfriction
+\family default
+.
+ The output includes the displacement and velocity fields over the entire
+ domain at every other time step (0.10 s), the slip, slip rate, and traction
+ vectors on the fault surface in along-strike and normal directions at every
+ other time step (0.10 s), and the strain and stress tensors for each cell
+ at every 20th time step (1.0 s).
+ If the problem ran correctly, you should be able to generate a figure such
+ as Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:shearwave:quad4:staticfriction"
+
+\end_inset
+
+, which was generated using ParaView.
+ The steady-state solution is a constant slip rate of 0.08 m/s, a shear traction
+ of 6.0 MPa on the fault surface, and a uniform shear strain of 2e-5 in the
+ bar with uniform, constant velocities in the y-direction of +0.04 m/s and
+ -0.04 m/s on the -x and +x sides of the fault, respectively.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/quad4staticfriction30.jpg
+	lyxscale 50
+	scale 50
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Velocity field in the bar at 3.0 s for the static friction fault constitutive
+ model.
+ Deformation has been exaggerated by a factor of 800.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:shearwave:quad4:staticfriction"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Dynamic Fault with Slip-Weakening Friction
+\end_layout
+
+\begin_layout Standard
+The parameters specific to this example are related to the use of the slip-weake
+ning friction fault constitutive model (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:fault:constitutive:models"
+
+\end_inset
+
+).
+ We set the fault constitutive model via
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.interfaces.fault]
+\end_layout
+
+\begin_layout LyX-Code
+friction = pylith.friction.SlipWeakening
+\end_layout
+
+\begin_layout Standard
+and use a UniformDB to set the slip-weakening friction parameters.
+ We use a static coefficient of friction of 0.6, a dynamic coefficient of
+ friction of 0.5, a slip-weakening parameter of 0.2 m, and no cohesion (0
+ MPa).
+ The fault constitutive model is associated with the fault, so we can append
+ the fault constitutive model parameters to the vertex information fields
+ and the fault constitutive model state variables to the vertex data fields:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.interfaces.fault.output]
+\end_layout
+
+\begin_layout LyX-Code
+vertex_info_fields = [strike_dir,normal_dir,initial_traction,static_coefficient,
+\begin_inset Newline newline
+\end_inset
+
+dynamic_coefficient,slip_weakening_parameter,cohesion]
+\end_layout
+
+\begin_layout LyX-Code
+vertex_data_fields = [slip,traction,cumulative_slip,previous_slip]
+\end_layout
+
+\begin_layout Standard
+The parameters specific to this example are in 
+\family typewriter
+dynamic_slipweakening.cfg
+\family default
+, so we run the problem via:
+\end_layout
+
+\begin_layout LyX-Code
+pylith spontaneousrup.cfg spontaneousrup_slipweakening.cfg
+\end_layout
+
+\begin_layout Standard
+The VTK files will be written to the 
+\family typewriter
+output
+\family default
+ directory with the prefix 
+\family typewriter
+slipweakening
+\family default
+.
+ If the problem ran correctly, you should be able to generate a figure such
+ as Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:shearwave:quad4:slipweakening"
+
+\end_inset
+
+, which was generated using ParaView.
+ The steady-state solution is a constant slip rate of 0.88 m/s and shear
+ traction of 5.0 MPa on the fault surface, a uniform shear strain of 2.2e-4
+ in the bar with uniform, constant velocities in the y-direction of +0.44
+ m/s and -0.44 m/s on the -x and +x sides of the fault, respectively.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/quad4slipweakening30.jpg
+	lyxscale 50
+	scale 50
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Velocity field in the bar at 3.0 s for the slip-weakening friction fault
+ constitutive model.
+ Deformation has been exaggerated by a factor of 800.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:shearwave:quad4:slipweakening"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Dynamic Fault with Rate-State Friction
+\end_layout
+
+\begin_layout Standard
+The parameters specific to this example are related to the use of the rate-
+ and state-friction fault constitutive model (see Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:fault:constitutive:models"
+
+\end_inset
+
+).
+ The evolution of the state variable uses the ageing law.
+ We set the fault constitutive model via
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.interfaces.fault]
+\end_layout
+
+\begin_layout LyX-Code
+friction = pylith.friction.RateStateAgeing
+\end_layout
+
+\begin_layout Standard
+and use a UniformDB to set the static friction parameters.
+ We use a reference coefficient of friction of 0.6, reference slip rate of
+ 1.0e-6 m/s, characteristic slip distance of 0.037 m, coefficients a and b
+ of 0.0125 and 0.0172, and no cohesion (0 MPa).
+ The parameters specific to this example are in 
+\family typewriter
+dynamic_ratestateageing.cfg
+\family default
+, so we run the problem via:
+\end_layout
+
+\begin_layout LyX-Code
+pylith spontaneousrup.cfg spontaneousrup_ratestateageing.cfg
+\end_layout
+
+\begin_layout Standard
+The VTK files will be written to the 
+\family typewriter
+output
+\family default
+ directory with the prefix 
+\family typewriter
+ratestateageing
+\family default
+.
+ If the problem ran correctly, you should be able to generate a figure such
+ as Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:shearwave:quad4:ratestateageing"
+
+\end_inset
+
+, which was generated using ParaView.
+ The steady-state solution is a constant slip rate of 0.572 m/s and shear
+ traction of 5.385 MPa on the fault surface, a uniform shear strain of 1.43e-4
+ in the bar with uniform, constant velocities in the y-direction of +0.286
+ m/s and -0.286 m/s on the -x and +x sides of the fault, respectively.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/quad4ratestateageing30.jpg
+	lyxscale 50
+	scale 50
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Velocity field in the bar at 3.0 s for the rate- and state-friction fault
+ constitutive model.
+ Deformation has been exaggerated by a factor of 800.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:shearwave:quad4:ratestateageing"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/tri3.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/tri3.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave/tri3.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,352 +1,350 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding global
-\font_roman default
-\font_sans default
-\font_typewriter default
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\paperfontsize default
-\spacing single
-\use_hyperref false
-\papersize default
-\use_geometry true
-\use_amsmath 0
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 1in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Section
-\begin_inset CommandInset label
-LatexCommand label
-name "sec:tutorial:shearwave:tri3"
-
-\end_inset
-
-2D Bar Discretized with Triangles
-\end_layout
-
-\begin_layout Standard
-PyLith features discussed in this tutorial:
-\end_layout
-
-\begin_layout Itemize
-Dynamic solution
-\end_layout
-
-\begin_layout Itemize
-CUBIT format
-\end_layout
-
-\begin_layout Itemize
-Absorbing dampers boundary conditions
-\end_layout
-
-\begin_layout Itemize
-Kinematic fault interface conditions
-\end_layout
-
-\begin_layout Itemize
-Plane strain linearly elastic material
-\end_layout
-
-\begin_layout Itemize
-VTK output
-\end_layout
-
-\begin_layout Itemize
-Linear triangular cells
-\end_layout
-
-\begin_layout Itemize
-SimpleDB spatial database
-\end_layout
-
-\begin_layout Itemize
-ZeroDispDB spatial database
-\end_layout
-
-\begin_layout Standard
-All of the files necessary to run the examples are contained in the directory
- 
-\family typewriter
-examples/bar_shearwave/tri3.
-\end_layout
-
-\begin_layout Subsection
-Mesh Generation
-\end_layout
-
-\begin_layout Standard
-The mesh is a simple rectangle 8 km by 400 m (Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:shearwave:tet4:mesh"
-
-\end_inset
-
-).
- This mesh could be generated via a simple script, but it is even easier
- to generate this mesh using CUBIT.
- We provide documented journal files in 
-\family typewriter
-examples/bar_shearwave/tri3.
-
-\family default
- We first create the geometry, mesh the domain using triangular cells, and
- then create blocks and nodesets to associate the cells and vertices with
- materials and boundary conditions.
- See Section 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "sec:Tutorial-3d-hex8"
-
-\end_inset
-
- for more information on using CUBIT to generate meshes.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/tri3mesh.jpg
-	lyxscale 50
-	scale 50
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Mesh composed of triangular cells generated by CUBIT used for the example
- problem.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:shearwave:tri3:mesh"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
-Simulation Parameters
-\end_layout
-
-\begin_layout Standard
-All of the parameters are set in the 
-\family typewriter
-pylithapp.cfg
-\family default
- file.
- The structure of the file follows the same pattern as in all of the other
- examples.
- We set the parameters for the journal information followed by the mesh
- reader, problem, materials, boundary conditions, fault, and output.
- We change the time-stepping formulation from the default value of implicit
- time stepping to explicit time stepping by setting the formulation object
- via
-\end_layout
-
-\begin_layout LyX-Code
-formulation = pylith.problems.Explicit
-\end_layout
-
-\begin_layout Standard
-We can switch to explicit time stepping with a lumped Jacobian matrix (rather
- than the full Jacobian matrix) by changing Explicit to ExplicitLumped.
- Using the ExplicitLumped object automatically triggers lumping of the Jacobian
- cell matrices and assembly into a vector rather than a sparse matrix.
- Lumping the Jacobian decouples the equations, so we can use a very simple
- direct solver.
- Use of this simple solver is also triggered by the selection of the ExplicitLum
-ped object.
- 
-\end_layout
-
-\begin_layout Standard
-For dynamic problems we use the NondimElasticDynamic object to nondimensionalize
- the equations.
- This object provides scales associated with wave propagation for nondimensional
-ization, including the minimum wave period, the shear wave speed, and mass
- density.
- In this example we use the default values of a minimum wave period of 1.0
- s, a shear wave speed of 3 km/s, and a mass density of 3000 kg/m
-\begin_inset Formula $^{3}$
-\end_inset
-
-.
- We simulate 12.0 s of motion with a time step of 1/30 s.
- This time step must follow the Courant–Friedrichs–Lewy condition; that
- is, the time step must be smaller than the time it takes the P wave to
- propagate across the shortest edge of a cell.
- 
-\end_layout
-
-\begin_layout Standard
-The boundary conditions include the absorbing dampers at the ends of the
- bar and a Dirichlet boundary condition to prevent longitudinal motion.
- Because we cannot overlap the Dirichlet BC with the fault, we use the nodeset
- associated with all vertices except the fault.
- For the output over the entire domain, we request both displacement and
- velocity fields:
-\end_layout
-
-\begin_layout LyX-Code
-[pylithapp.timedependent.output]
-\end_layout
-
-\begin_layout LyX-Code
-vertex_data_fields = [displacement,velocity]
-\end_layout
-
-\begin_layout Standard
-To run the problem, simply run PyLith without any command line arguments:
-\end_layout
-
-\begin_layout LyX-Code
-pylith
-\end_layout
-
-\begin_layout Standard
-The VTK files will be written to the 
-\family typewriter
-output
-\family default
- directory.
- The output includes the displacement and velocity fields over the entire
- domain at every 3rd time step (0.10 s), the slip and change in traction
- vectors on the fault surface in along-strike and normal directions at every
- 3rd time step (0.10 s), and the strain and stress tensors for each cell
- at every 30th time step (1.0 s).
- If the problem ran correctly, you should be able to generate a figure such
- as Figure 
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "fig:shearwave:tri3:deform"
-
-\end_inset
-
-, which was generated using ParaView.
-\end_layout
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\align center
-\begin_inset Graphics
-	filename figs/tri3deform30.jpg
-	lyxscale 50
-	scale 50
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Plain Layout
-\begin_inset Caption
-
-\begin_layout Plain Layout
-Displacement field in the bar at 3.0 s.
- Deformation has been exaggerated by a factor of 800.
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:shearwave:tri3:deform"
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry true
+\use_amsmath 0
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 1in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:tutorial:shearwave:tri3"
+
+\end_inset
+
+2D Bar Discretized with Triangles
+\end_layout
+
+\begin_layout Standard
+PyLith features discussed in this tutorial:
+\end_layout
+
+\begin_layout Itemize
+Dynamic solution
+\end_layout
+
+\begin_layout Itemize
+CUBIT format
+\end_layout
+
+\begin_layout Itemize
+Absorbing dampers boundary conditions
+\end_layout
+
+\begin_layout Itemize
+Kinematic fault interface conditions
+\end_layout
+
+\begin_layout Itemize
+Plane strain linearly elastic material
+\end_layout
+
+\begin_layout Itemize
+VTK output
+\end_layout
+
+\begin_layout Itemize
+Linear triangular cells
+\end_layout
+
+\begin_layout Itemize
+SimpleDB spatial database
+\end_layout
+
+\begin_layout Itemize
+ZeroDispDB spatial database
+\end_layout
+
+\begin_layout Standard
+All of the files necessary to run the examples are contained in the directory
+ 
+\family typewriter
+examples/bar_shearwave/tri3.
+\end_layout
+
+\begin_layout Subsection
+Mesh Generation
+\end_layout
+
+\begin_layout Standard
+The mesh is a simple rectangle 8 km by 400 m (Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:shearwave:tet4:mesh"
+
+\end_inset
+
+).
+ This mesh could be generated via a simple script, but it is even easier
+ to generate this mesh using CUBIT.
+ We provide documented journal files in 
+\family typewriter
+examples/bar_shearwave/tri3.
+
+\family default
+ We first create the geometry, mesh the domain using triangular cells, and
+ then create blocks and nodesets to associate the cells and vertices with
+ materials and boundary conditions.
+ See Section 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Tutorial-3d-hex8"
+
+\end_inset
+
+ for more information on using CUBIT to generate meshes.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/tri3mesh.jpg
+	lyxscale 50
+	scale 50
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Mesh composed of triangular cells generated by CUBIT used for the example
+ problem.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:shearwave:tri3:mesh"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Simulation Parameters
+\end_layout
+
+\begin_layout Standard
+All of the parameters are set in the 
+\family typewriter
+pylithapp.cfg
+\family default
+ file.
+ The structure of the file follows the same pattern as in all of the other
+ examples.
+ We set the parameters for the journal information followed by the mesh
+ reader, problem, materials, boundary conditions, fault, and output.
+ We change the time-stepping formulation from the default value of implicit
+ time stepping to explicit time stepping with a lumped Jacobian matrix by
+ setting the formulation object via
+\end_layout
+
+\begin_layout LyX-Code
+formulation = pylith.problems.Explicit
+\end_layout
+
+\begin_layout Standard
+Using the Explicit object automatically triggers lumping of the Jacobian
+ cell matrices and assembly into a vector rather than a sparse matrix.
+ Lumping the Jacobian decouples the equations, so we can use a very simple
+ direct solver.
+ Use of this simple solver is also triggered by the selection of any of
+ the Explicit formulation objects.
+ 
+\end_layout
+
+\begin_layout Standard
+For dynamic problems we use the NondimElasticDynamic object to nondimensionalize
+ the equations.
+ This object provides scales associated with wave propagation for nondimensional
+ization, including the minimum wave period, the shear wave speed, and mass
+ density.
+ In this example we use the default values of a minimum wave period of 1.0
+ s, a shear wave speed of 3 km/s, and a mass density of 3000 kg/m
+\begin_inset Formula $^{3}$
+\end_inset
+
+.
+ We simulate 12.0 s of motion with a time step of 1/30 s.
+ This time step must follow the Courant–Friedrichs–Lewy condition; that
+ is, the time step must be smaller than the time it takes the P wave to
+ propagate across the shortest edge of a cell.
+ 
+\end_layout
+
+\begin_layout Standard
+The boundary conditions include the absorbing dampers at the ends of the
+ bar and a Dirichlet boundary condition to prevent longitudinal motion.
+ Because we cannot overlap the Dirichlet BC with the fault, we use the nodeset
+ associated with all vertices except the fault.
+ For the output over the entire domain, we request both displacement and
+ velocity fields:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent.output]
+\end_layout
+
+\begin_layout LyX-Code
+vertex_data_fields = [displacement,velocity]
+\end_layout
+
+\begin_layout Standard
+To run the problem, simply run PyLith without any command line arguments:
+\end_layout
+
+\begin_layout LyX-Code
+pylith
+\end_layout
+
+\begin_layout Standard
+The VTK files will be written to the 
+\family typewriter
+output
+\family default
+ directory.
+ The output includes the displacement and velocity fields over the entire
+ domain at every 3rd time step (0.10 s), the slip and change in traction
+ vectors on the fault surface in along-strike and normal directions at every
+ 3rd time step (0.10 s), and the strain and stress tensors for each cell
+ at every 30th time step (1.0 s).
+ If the problem ran correctly, you should be able to generate a figure such
+ as Figure 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "fig:shearwave:tri3:deform"
+
+\end_inset
+
+, which was generated using ParaView.
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\align center
+\begin_inset Graphics
+	filename figs/tri3deform30.jpg
+	lyxscale 50
+	scale 50
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Caption
+
+\begin_layout Plain Layout
+Displacement field in the bar at 3.0 s.
+ Deformation has been exaggerated by a factor of 800.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:shearwave:tri3:deform"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/subduction/subduction.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/subduction/subduction.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/subduction/subduction.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1058,7 +1058,11 @@
  consistent with a coefficient of friction of 0.6.
  The 
 \family typewriter
-afterslip_tractions.spatialdb
+afterslip_tractions.
+\begin_inset Newline linebreak
+\end_inset
+
+spatialdb
 \family default
  file is provided, so you do not need to run the Python script 
 \family typewriter
@@ -1170,8 +1174,8 @@
 
 , which was created using ParaView, displays the magnitude of the displacement
  field with the original configuration.
- Slip occurs down-dip from the coseismic slip as well as three areas with
- sharp gradients in slip, including the trench.
+ Slip occurs down-dip from the coseismic slip as well as in three areas
+ with sharp gradients in slip, including the trench.
  The location of the afterslip can be shifted by changing the spatial variation
  of the coseismic slip and background stress field.
 \end_layout

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/tutorials.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/tutorials.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/tutorials.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -269,7 +269,33 @@
 Additional Examples
 \end_layout
 
+\begin_layout Subsection
+CUBIT Meshing Examples
+\end_layout
+
 \begin_layout Standard
+The directory 
+\family typewriter
+examples/meshing
+\family default
+ contains several examples of using CUBIT to construct finite-element meshes
+ for complex geometry.
+ This includes features such as constructing nonplanar fault geometry from
+ contours, constructing topography from a DEM, and merging sheet bodies
+ (surfaces).
+ A separate examples discusses defining the discretization size using a
+ vertex field in an Exodus-II file.
+ See the 
+\family typewriter
+README files in the subdirectories for more detailed descriptions of these
+ examples.
+\end_layout
+
+\begin_layout Subsection
+Code Verification Benchmarks
+\end_layout
+
+\begin_layout Standard
 The CIG subversion software repository 
 \begin_inset Flex URL
 status collapsed
@@ -282,8 +308,8 @@
 \end_inset
 
  contains input files for a number of community benchmarks.
- Most of the benchmarks include complete sets of PyLith input files.
- Some of the dynamic benchmarks do not include the mesh files because they
+ Some of the benchmarks include complete sets of PyLith input files.
+ However, most of the benchmarks do not include the mesh files because they
  are so large; instead they include the CUBIT journal files that can be
  used to generate the meshes.
 \end_layout

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/twohex8/twohex8.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/twohex8/twohex8.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/twohex8/twohex8.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -237,54 +237,80 @@
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 [pylithapp.timedependent.materials]
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 material = pylith.materials.MaxwellIsotropic3D
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
  
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 [pylithapp.timedependent.materials.material]
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 label = viscoelastic material
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 id = 1
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
  
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 db = spatialdata.spatialdb.UniformDB
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 db.values = [vp,vs,density,viscosity]
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 db.data = [5773.502691896258*m/s, 3333.333333333333*m/s, 2700.0*kg/m**3, 1.0e18*Pa*s]
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
  
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 quadrature.cell = pylith.feassemble.FIATLagrange
 \end_layout
 
 \begin_layout LyX-Code
+
+\size small
 quadrature.cell.dimension = 3
 \end_layout
 
@@ -763,28 +789,23 @@
 .
  The files containing common information (
 \family typewriter
+twohex8.mesh,
+\family default
 \size small
-twohex8.mesh
-\family default
-, 
+ 
 \family typewriter
+
+\begin_inset Newline linebreak
+\end_inset
+
+
+\size default
 pylithapp.cfg
 \family default
-\size default
 ) along with the problem-specific files (
 \family typewriter
-\size small
-dislocation.cfg
+dislocation.cfg, dislocation_slip.spatialdb, dislocation_sliptime.spatialdb
 \family default
-, 
-\family typewriter
-dislocation_slip.spatialdb
-\family default
-, 
-\family typewriter
-dislocation_sliptime.spatialdb
-\family default
-\size default
 ) provide a complete description of the problem, and we can then run this
  example by typing
 \end_layout

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/twoquad4/twoquad4.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/twoquad4/twoquad4.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/twoquad4/twoquad4.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -445,9 +445,9 @@
  left side of the mesh, defining which degrees of freedom are being constrained
  (y only), giving the label (
 \family typewriter
-x_
+x_pos
 \family default
-pos, defined in 
+, defined in 
 \family typewriter
 twoquad4.mesh
 \family default
@@ -680,6 +680,10 @@
 \family default
 , 
 \family typewriter
+
+\begin_inset Newline linebreak
+\end_inset
+
 dislocation_sliptime.spatialdb
 \family default
 \size default
@@ -695,6 +699,10 @@
 The addition of a fault results in two additional output files (as in the
  two triangle fault example), 
 \family typewriter
+
+\begin_inset Newline linebreak
+\end_inset
+
 dislocation-fault_t0000000.vtk
 \family default
  and 

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/twotet4/twotet4.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/twotet4/twotet4.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/twotet4/twotet4.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -470,18 +470,12 @@
 \family default
 ) along with the problem-specific files (
 \family typewriter
-\size small
-dislocation.cfg
-\family default
-, 
-\family typewriter
-dislocation_slip.spatialdb
-\family default
-, 
-\family typewriter
+dislocation.cfg, dislocation_slip.spatialdb, 
+\begin_inset Newline linebreak
+\end_inset
+
 dislocation_sliptime.spatialdb
 \family default
-\size default
 ) provide a complete description of the problem, and we can then run this
  example by typing
 \end_layout

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/twotet4-geoproj/twotet4-geoproj.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/twotet4-geoproj/twotet4-geoproj.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/twotet4-geoproj/twotet4-geoproj.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -463,6 +463,10 @@
  Note that we vary the amount of fault slip for each vertex with this example,
  as described in 
 \family typewriter
+
+\begin_inset Newline linebreak
+\end_inset
+
 dislocation_slip.spatialdb
 \family default
 .
@@ -497,18 +501,8 @@
 \family default
 ) along with the problem-specific files (
 \family typewriter
-\size small
-dislocation.cfg
+dislocation.cfg, dislocation_slip.spatialdb, dislocation_sliptime.spatialdb
 \family default
-, 
-\family typewriter
-dislocation_slip.spatialdb
-\family default
-, 
-\family typewriter
-dislocation_sliptime.spatialdb
-\family default
-\size default
 ) provide a complete description of the problem, and we can then run this
  example by typing
 \end_layout

Modified: short/3D/PyLith/trunk/doc/userguide/tutorials/twotri3/twotri3.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/tutorials/twotri3/twotri3.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/tutorials/twotri3/twotri3.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -360,7 +360,11 @@
 
 \begin_layout Description
 pylithapp.timedependent.materials.material.output Gives the base filename for
- state variable output files (
+ state variable output files 
+\begin_inset Newline linebreak
+\end_inset
+
+(
 \family typewriter
 axialdisp-statevars.vtk
 \family default
@@ -562,9 +566,9 @@
  left side of the mesh, defining which degrees of freedom are being constrained
  (y only), giving the label (
 \family typewriter
-x_
+x_pos
 \family default
-pos, defined in 
+, defined in 
 \family typewriter
 twotri3.mesh
 \family default
@@ -719,7 +723,11 @@
 
 \begin_layout Description
 pylithapp.timedependent.interfaces.fault.output.writer Gives the base filename
- for cohesive cell output files (
+ for cohesive cell output files 
+\begin_inset Newline linebreak
+\end_inset
+
+(
 \family typewriter
 dislocation-fault.vtk
 \family default
@@ -783,6 +791,10 @@
 \family default
 , 
 \family typewriter
+
+\begin_inset Newline linebreak
+\end_inset
+
 dislocation_sliptime.spatialdb
 \family default
 \size default

Modified: short/3D/PyLith/trunk/doc/userguide/userguide.lyx
===================================================================
--- short/3D/PyLith/trunk/doc/userguide/userguide.lyx	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/doc/userguide/userguide.lyx	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,886 +1,918 @@
-#LyX 2.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 413
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-%\usepackage{hyperref}
-
-%\let\myUrl\url
-%\renewcommand{\url}[1]{(\myUrl{#1})}
-%\newcommand\Prefix[3]{\vphantom{#3}#1#2#3}
-\end_preamble
-\use_default_options false
-\maintain_unincluded_children false
-\language english
-\language_package default
-\inputencoding latin1
-\fontencoding T1
-\font_roman times
-\font_sans helvet
-\font_typewriter courier
-\font_default_family default
-\use_non_tex_fonts false
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\default_output_format default
-\output_sync 0
-\bibtex_command default
-\index_command default
-\float_placement tbph
-\paperfontsize default
-\spacing single
-\use_hyperref true
-\pdf_bookmarks true
-\pdf_bookmarksnumbered false
-\pdf_bookmarksopen false
-\pdf_bookmarksopenlevel 1
-\pdf_breaklinks true
-\pdf_pdfborder true
-\pdf_colorlinks true
-\pdf_backref false
-\pdf_pdfusetitle true
-\papersize default
-\use_geometry true
-\use_amsmath 1
-\use_esint 0
-\use_mhchem 1
-\use_mathdots 1
-\cite_engine basic
-\use_bibtopic false
-\use_indices false
-\paperorientation portrait
-\suppress_date false
-\use_refstyle 0
-\index Index
-\shortcut idx
-\color #008000
-\end_index
-\leftmargin 1in
-\topmargin 1in
-\rightmargin 1in
-\bottommargin 1in
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\paragraph_indentation default
-\quotes_language english
-\papercolumns 1
-\papersides 2
-\paperpagestyle plain
-\tracking_changes false
-\output_changes false
-\html_math_output 0
-\html_css_as_file 0
-\html_be_strict false
-\end_header
-
-\begin_body
-
-\begin_layout Standard
-\noindent
-\align center
-\begin_inset Float figure
-placement H
-wide false
-sideways false
-status open
-
-\begin_layout Plain Layout
-\noindent
-\align center
-\begin_inset Graphics
-	filename cover/cover.pdf
-	width 75page%
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset ERT
-status open
-
-\begin_layout Plain Layout
-
-
-\backslash
-thispagestyle{empty}
-\end_layout
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Title
-PyLith User Manual
-\end_layout
-
-\begin_layout Author
-© University of California, Davis
-\begin_inset Newline newline
-\end_inset
-
-Version 1.7.1
-\end_layout
-
-\begin_layout Date
-\noindent
-\begin_inset ERT
-status collapsed
-
-\begin_layout Plain Layout
-
-
-\backslash
-today
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset ERT
-status open
-
-\begin_layout Plain Layout
-
-
-\backslash
-frontmatter
-\end_layout
-
-\end_inset
-
-
-\begin_inset CommandInset toc
-LatexCommand tableofcontents
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset FloatList figure
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset FloatList table
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset CommandInset include
-LatexCommand input
-filename "preface.lyx"
-
-\end_inset
-
-
-\begin_inset ERT
-status collapsed
-
-\begin_layout Plain Layout
-
-
-\backslash
-mainmatter
-\end_layout
-
-\end_inset
-
-
-\begin_inset ERT
-status collapsed
-
-\begin_layout Plain Layout
-
-
-\backslash
-raggedbottom
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset CommandInset include
-LatexCommand input
-filename "intro/intro.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "governingeqns/governingeqns.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "install/install.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "runpylith/runpylith.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "materials/materials.lyx"
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\begin_inset CommandInset include
-LatexCommand input
-filename "boundaryconditions/boundaryconditions.lyx"
-
-\end_inset
-
- 
-\begin_inset CommandInset include
-LatexCommand input
-filename "tutorials/tutorials.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "benchmarks/benchmarks.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "extending/extending.lyx"
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-\start_of_appendix
-\begin_inset ERT
-status collapsed
-
-\begin_layout Plain Layout
-
-%dummy comment inserted by tex2lyx to ensure that this paragraph is not
- empty
-\end_layout
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "glossary.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "components.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "fileformats/fileformats.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand include
-filename "materials/altformulations.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "analyticalsolns/analyticalsolns.lyx"
-
-\end_inset
-
-
-\begin_inset CommandInset include
-LatexCommand input
-filename "license.lyx"
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Aagaard et al., 2001a"
-key "Aagaard:etal:2001a"
-
-\end_inset
-
-Aagaard, B.T., J.F.
- Hall, and T.H.
- Heaton (2001), Characterization of near-source ground motions with earthquake
- simulations, 
-\emph on
-Earthquake Spectra, 17
-\emph default
-(2), 177-207.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Aagaard et al., 2001b"
-key "Aagaard:etal:2001b"
-
-\end_inset
-
-Aagaard, B.T., T.H.
- Heaton, and J.F.
- Hall (2001), Dynamic earthquake ruptures in the presence of lithostatic
- normal stresses: Implications for friction models and heat production,
- 
-\emph on
-Bulletin of the Seismological Society of America, 91
-\emph default
-(6), 1765-1796.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Aagaard et al., 2007"
-key "Aagaard:etal:2007"
-
-\end_inset
-
-Aagaard, B., C.
- Williams, and M.
- Knepley (2007), PyLith: A finite-element code for modeling quasi-static
- and dynamic crustal deformation, 
-\emph on
-Eos Trans.
- AGU, 88
-\emph default
-(52), Fall Meet.
- Suppl., Abstract T21B-0592.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Aagaard et al., 2008"
-key "Aagaard:etal:2008"
-
-\end_inset
-
-Aagaard, B., C.
- Williams, and M.
- Knepley (2008), PyLith: A finite-element code for modeling quasi-static
- and dynamic crustal deformation, 
-\emph on
-Eos Trans.
- AGU
-\emph default
-, 
-\emph on
-89(
-\emph default
-53), Fall Meet.
- Suppl., Abstract T41A-1925.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Bathe, 1995"
-key "Bathe:1995"
-
-\end_inset
-
-Bathe, K.-J.
- (1995), 
-\shape italic
-Finite-Element Procedures
-\shape default
-, Prentice Hall, Upper Saddle River, New Jersey, 1037 pp.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Ben-Zion and Rice, 1997"
-key "BenZion:Rice:1997"
-
-\end_inset
-
-Ben-Zion, Y.
- and J.R.
- Rice (1997), Dynamic simulations of slip on a smooth fault in an elastic
- solid, J.
- Geophys.
- Res., 102, 17,771–17,784.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Brune, 1970"
-key "Brune:1970"
-
-\end_inset
-
-Brune, J.N.
- (1970), Tectonic stress and spectra of seismic shear waves from earthquakes,
- 
-\emph on
-Journal of Geophysical Research, 75
-\emph default
-, 4997-5009.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Day and Ely, 2002"
-key "Day:Ely:2002"
-
-\end_inset
-
-Day, S.M.
- and G.P.
- Ely (2002), Effct of a shallow weak zone on fault rupture: Numerical simulation
- of scale-model experiments, 
-\shape italic
-Bull.
- Seismol.
- Soc.
- Am.
-\shape default
-, 92(8), 3022-3041, doi: 10.1785/0120010273.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Drucker and Prager, 1952"
-key "Drucker:Prager:1952"
-
-\end_inset
-
-Drucker, D.
- C.
- and Prager, W.
- (1952).
- Soil mechanics and plastic analysis for limit design, 
-\shape italic
-Quarterly of Applied Mathematics
-\shape default
-, 
-\shape italic
-10
-\shape default
-, 157–165.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Liu et al., 2006"
-key "Liu:etal:2006"
-
-\end_inset
-
-Liu, P., R.J.
- Archuleta, S.H.
- Hartzell (2006), Prediction of broadband ground-motion time histories:
- Hybrid low/high-frequency method with correlated random source parameters,
- 
-\shape italic
-Bull.
- Seismol.
- Soc.
- Am.
-\shape default
-, 96, 2118-2130.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Kaneko et al., 2008"
-key "Kaneko:etal:2008"
-
-\end_inset
-
-Kaneko, Y., N.
- Lapusta, and J.-P.
- Ampuero (2008), Spectral element modeling of spontaneous earthquake rupture
- on rate and state faults: Effect of velocity-strengthening friction at
- shallow depths, 
-\shape italic
-Journal of Geophysical Research
-\shape default
-, 113, B09317, doi:10.1029/2007JB005553.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Kirby and Kronenberg, 1987"
-key "Kirby:Kronenberg:1987"
-
-\end_inset
-
-Kirby, S.
- H.
- and A.
- K.
- Kronenberg (1987), Rheology of the lithosphere: Selected topics, 
-\shape italic
-Reviews of Geophysics, 25
-\shape default
-, 1219-1244.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Knopoff and Ni, 2001"
-key "Knopoff:Ni:2001"
-
-\end_inset
-
-Knopoff, L.
- and X.X.
- Ni (2001), Numerical instability at the edge of a dynamic fracture, 
-\emph on
-Geophysical Journal International, 
-\emph default
-147(3), 1-6, doi: 10.1046/j.1365-246x.2001.01567.x.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Kojic and Bathe, 1987"
-key "Kojic:Bathe:1987"
-
-\end_inset
-
-Kojic, M.
- and K.-J.
- Bathe (1987), The `Effective Stress-Function' Algorithm for Thermo-Elasto-Plast
-icity and Creep, 
-\emph on
-Int.
- J.
- Num.
- Meth.
- Eng
-\emph default
-.
-\emph on
-, 24
-\emph default
-, 1509-1532.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "McGarr, 1988"
-key "McGarr:1988"
-
-\end_inset
-
-McGarr, A.
- (1988), On the state of lithospheric stress in the absence of applied tectonic
- forces, 
-\shape italic
-Journal of Geophysical Research
-\shape default
-, 
-\shape italic
-93
-\shape default
-, 13,609-13,617.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Menke, 1984"
-key "Menke:1984"
-
-\end_inset
-
-Menke, W.
- (1984), 
-\shape italic
-Geophysical Data Analysis: Discrete Inverse Theory
-\shape default
-, Academic Press, Inc., Orlando, 260 pp.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Okada, 1992"
-key "Okada:1992"
-
-\end_inset
-
-Okada, Y., Internal deformation due to shear and tensile faults in a half-space
- (1992), 
-\shape italic
-Bull.
- Seismol.
- Soc.
- Am.
-\shape default
-, 
-\shape italic
-83
-\shape default
-, 1018-1040.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Paterson, 1994"
-key "Paterson:1994"
-
-\end_inset
-
-Paterson, W.
- S.
- B.
- (1994), 
-\shape italic
-The Physics of Glaciers, Third Edition
-\shape default
-, Elsevier Science Ltd., Oxford, 480 pp.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Prentice, 1968"
-key "Prentice:1968"
-
-\end_inset
-
-Prentice, J.
- H, (1968), Dimensional problem of the power law in rheology, 
-\shape italic
-Nature
-\shape default
-, 
-\shape italic
-217
-\shape default
-, 157.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Savage and Prescott, 1978"
-key "Savage:Prescott:1978"
-
-\end_inset
-
-Savage, J.
- C.
- and W.
- H.
- Prescott (1978), Asthenosphere readjustment and the earthquake cycle, 
-\shape italic
-Journal of Geophysical
-\shape default
- 
-\shape italic
-Research
-\shape default
-\emph on
-, 83
-\emph default
-, 3369-3376.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Taylor, 2003"
-key "Taylor:2003"
-
-\end_inset
-
-Taylor, R.L.
- (2003), `FEAP--A Finite Element Analysis Program', 
-\shape italic
-Version 7.5 Theory Manual
-\shape default
-, 154 pp.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Timoshenko and Goodier, 1987"
-key "Timoshenko:Goodier:1987"
-
-\end_inset
-
-Timoshenko, S.P.
- and J.N.
- Goodier (1987), 
-\shape italic
-Theory of Elasticity, Third Edition
-\shape default
-, McGraw-Hill, New York, 567 pp.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Williams et al., 2005"
-key "Williams:etal:2005"
-
-\end_inset
-
-Williams, C.A., B.
- Aagaard, and M.G.
- Knepley (2005), Development of software for studying earthquakes across
- multiple spatial and temporal scales by coupling quasi-static and dynamic
- simulations, 
-\emph on
-Eos Trans.
- AGU, 86
-\emph default
-(52), Fall Meet.
- Suppl., Abstract S53A-1072.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Williams, 2006"
-key "Williams:2006"
-
-\end_inset
-
-Williams, C.A.
- (2006), Development of a package for modeling stress in the lithosphere,
- 
-\emph on
-Eos Trans.
- AGU,
-\emph default
- 
-\emph on
-87
-\emph default
-(36), Jt.
- Assem.
- Suppl., Abstract T24A-01 Invited.
-\end_layout
-
-\begin_layout Bibliography
-\labelwidthstring Bibliography
-\begin_inset CommandInset bibitem
-LatexCommand bibitem
-label "Zienkiewicz and Taylor, 2000"
-key "Zienkiewicz:Taylor:2000"
-
-\end_inset
-
-Zienkiewicz, O.C.
- and R.L.
- Taylor (2000), 
-\shape italic
-The Finite Element Method, Fifth Edition, Volume 2: Solid Mechanics
-\shape default
-, Butterworth-Heinemann, Oxford, 459 pp.125
-\end_layout
-
-\end_body
-\end_document
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass book
+\begin_preamble
+%\usepackage{hyperref}
+
+%\let\myUrl\url
+%\renewcommand{\url}[1]{(\myUrl{#1})}
+%\newcommand\Prefix[3]{\vphantom{#3}#1#2#3}
+\end_preamble
+\use_default_options false
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding latin1
+\fontencoding T1
+\font_roman times
+\font_sans helvet
+\font_typewriter courier
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\float_placement tbph
+\paperfontsize default
+\spacing single
+\use_hyperref true
+\pdf_bookmarks true
+\pdf_bookmarksnumbered false
+\pdf_bookmarksopen false
+\pdf_bookmarksopenlevel 1
+\pdf_breaklinks true
+\pdf_pdfborder true
+\pdf_colorlinks true
+\pdf_backref false
+\pdf_pdfusetitle true
+\papersize default
+\use_geometry true
+\use_amsmath 1
+\use_esint 0
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 1in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 2
+\paperpagestyle plain
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Float figure
+placement H
+wide false
+sideways false
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+\begin_inset Graphics
+	filename cover/cover.pdf
+	width 75page%
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+thispagestyle{empty}
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Title
+PyLith User Manual
+\end_layout
+
+\begin_layout Author
+© University of California, Davis
+\begin_inset Newline newline
+\end_inset
+
+Version 1.8.0
+\end_layout
+
+\begin_layout Date
+\noindent
+\begin_inset ERT
+status collapsed
+
+\begin_layout Plain Layout
+
+
+\backslash
+today
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+frontmatter
+\end_layout
+
+\end_inset
+
+
+\begin_inset CommandInset toc
+LatexCommand tableofcontents
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset FloatList figure
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset FloatList table
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset CommandInset include
+LatexCommand input
+filename "preface.lyx"
+
+\end_inset
+
+
+\begin_inset ERT
+status collapsed
+
+\begin_layout Plain Layout
+
+
+\backslash
+mainmatter
+\end_layout
+
+\end_inset
+
+
+\begin_inset ERT
+status collapsed
+
+\begin_layout Plain Layout
+
+
+\backslash
+raggedbottom
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset CommandInset include
+LatexCommand input
+filename "intro/intro.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "governingeqns/governingeqns.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "install/install.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "runpylith/runpylith.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "materials/materials.lyx"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset CommandInset include
+LatexCommand include
+filename "boundaryconditions/boundaryconditions.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "tutorials/tutorials.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "benchmarks/benchmarks.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "extending/extending.lyx"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\start_of_appendix
+\begin_inset ERT
+status collapsed
+
+\begin_layout Plain Layout
+
+%dummy comment inserted by tex2lyx to ensure that this paragraph is not
+ empty
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "glossary.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "components.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "fileformats/fileformats.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand include
+filename "materials/altformulations.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "analyticalsolns/analyticalsolns.lyx"
+
+\end_inset
+
+
+\begin_inset CommandInset include
+LatexCommand input
+filename "license.lyx"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Aagaard et al., 2001a"
+key "Aagaard:etal:2001a"
+
+\end_inset
+
+Aagaard, B.T., J.F.
+ Hall, and T.H.
+ Heaton (2001), Characterization of near-source ground motions with earthquake
+ simulations, 
+\emph on
+Earthquake Spectra, 17
+\emph default
+(2), 177-207.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Aagaard et al., 2001b"
+key "Aagaard:etal:2001b"
+
+\end_inset
+
+Aagaard, B.T., T.H.
+ Heaton, and J.F.
+ Hall (2001), Dynamic earthquake ruptures in the presence of lithostatic
+ normal stresses: Implications for friction models and heat production,
+ 
+\emph on
+Bulletin of the Seismological Society of America, 91
+\emph default
+(6), 1765-1796.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Aagaard et al., 2007"
+key "Aagaard:etal:2007"
+
+\end_inset
+
+Aagaard, B., C.
+ Williams, and M.
+ Knepley (2007), PyLith: A finite-element code for modeling quasi-static
+ and dynamic crustal deformation, 
+\emph on
+Eos Trans.
+ AGU, 88
+\emph default
+(52), Fall Meet.
+ Suppl., Abstract T21B-0592.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Aagaard et al., 2008"
+key "Aagaard:etal:2008"
+
+\end_inset
+
+Aagaard, B., C.
+ Williams, and M.
+ Knepley (2008), PyLith: A finite-element code for modeling quasi-static
+ and dynamic crustal deformation, 
+\emph on
+Eos Trans.
+ AGU
+\emph default
+, 
+\emph on
+89(
+\emph default
+53), Fall Meet.
+ Suppl., Abstract T41A-1925.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Bathe, 1995"
+key "Bathe:1995"
+
+\end_inset
+
+Bathe, K.-J.
+ (1995), 
+\shape italic
+Finite-Element Procedures
+\shape default
+, Prentice Hall, Upper Saddle River, New Jersey, 1037 pp.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Ben-Zion and Rice, 1997"
+key "BenZion:Rice:1997"
+
+\end_inset
+
+Ben-Zion, Y.
+ and J.R.
+ Rice (1997), Dynamic simulations of slip on a smooth fault in an elastic
+ solid, 
+\emph on
+Journal of Geophysical Research
+\shape italic
+\emph default
+, 102
+\shape default
+, 17,771–17,784.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Brune, 1970"
+key "Brune:1970"
+
+\end_inset
+
+Brune, J.N.
+ (1970), Tectonic stress and spectra of seismic shear waves from earthquakes,
+ 
+\emph on
+Journal of Geophysical Research, 75
+\emph default
+, 4997-5009.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Courant et al., 1967"
+key "Courant:etal:1967"
+
+\end_inset
+
+Courant, R., K.
+ Friedrichs and H.
+ Lewy (1967), On the Partial Differential Equations of Mathematical Physics,
+ 
+\shape italic
+IBM Jounral of Research and Development
+\shape default
+, 11(2), 215--234.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Day and Ely, 2002"
+key "Day:Ely:2002"
+
+\end_inset
+
+Day, S.M.
+ and G.P.
+ Ely (2002), Effct of a shallow weak zone on fault rupture: Numerical simulation
+ of scale-model experiments, 
+\shape italic
+Bull.
+ Seismol.
+ Soc.
+ Am.
+\shape default
+, 92(8), 3022-3041, doi: 10.1785/0120010273.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Drucker and Prager, 1952"
+key "Drucker:Prager:1952"
+
+\end_inset
+
+Drucker, D.
+ C.
+ and Prager, W.
+ (1952).
+ Soil mechanics and plastic analysis for limit design, 
+\shape italic
+Quarterly of Applied Mathematics
+\shape default
+, 
+\shape italic
+10
+\shape default
+, 157–165.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Liu et al., 2006"
+key "Liu:etal:2006"
+
+\end_inset
+
+Liu, P., R.J.
+ Archuleta, S.H.
+ Hartzell (2006), Prediction of broadband ground-motion time histories:
+ Hybrid low/high-frequency method with correlated random source parameters,
+ 
+\shape italic
+Bull.
+ Seismol.
+ Soc.
+ Am., 96
+\shape default
+, 2118-2130.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Kaneko et al., 2008"
+key "Kaneko:etal:2008"
+
+\end_inset
+
+Kaneko, Y., N.
+ Lapusta, and J.-P.
+ Ampuero (2008), Spectral element modeling of spontaneous earthquake rupture
+ on rate and state faults: Effect of velocity-strengthening friction at
+ shallow depths, 
+\shape italic
+Journal of Geophysical Research
+\shape default
+,
+\shape italic
+ 113
+\shape default
+, B09317, doi:10.1029/2007JB005553.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Kirby and Kronenberg, 1987"
+key "Kirby:Kronenberg:1987"
+
+\end_inset
+
+Kirby, S.
+ H.
+ and A.
+ K.
+ Kronenberg (1987), Rheology of the lithosphere: Selected topics, 
+\shape italic
+Reviews of Geophysics, 25
+\shape default
+, 1219-1244.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Knopoff and Ni, 2001"
+key "Knopoff:Ni:2001"
+
+\end_inset
+
+Knopoff, L.
+ and X.X.
+ Ni (2001), Numerical instability at the edge of a dynamic fracture, 
+\emph on
+Geophysical Journal International,
+\shape italic
+ 
+\emph default
+147
+\shape default
+(3), 1-6, doi: 10.1046/j.1365-246x.2001.01567.x.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Kojic and Bathe, 1987"
+key "Kojic:Bathe:1987"
+
+\end_inset
+
+Kojic, M.
+ and K.-J.
+ Bathe (1987), The `Effective Stress-Function' Algorithm for Thermo-Elasto-Plast
+icity and Creep, 
+\emph on
+Int.
+ J.
+ Num.
+ Meth.
+ Eng
+\emph default
+.
+\emph on
+, 24
+\emph default
+, 1509-1532.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "McGarr, 1988"
+key "McGarr:1988"
+
+\end_inset
+
+McGarr, A.
+ (1988), On the state of lithospheric stress in the absence of applied tectonic
+ forces, 
+\shape italic
+Journal of Geophysical Research
+\shape default
+, 
+\shape italic
+93
+\shape default
+, 13,609-13,617.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Menke, 1984"
+key "Menke:1984"
+
+\end_inset
+
+Menke, W.
+ (1984), 
+\shape italic
+Geophysical Data Analysis: Discrete Inverse Theory
+\shape default
+, Academic Press, Inc., Orlando, 260 pp.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Okada, 1992"
+key "Okada:1992"
+
+\end_inset
+
+Okada, Y., Internal deformation due to shear and tensile faults in a half-space
+ (1992), 
+\shape italic
+Bull.
+ Seismol.
+ Soc.
+ Am.
+\shape default
+, 
+\shape italic
+83
+\shape default
+, 1018-1040.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Paterson, 1994"
+key "Paterson:1994"
+
+\end_inset
+
+Paterson, W.
+ S.
+ B.
+ (1994), 
+\shape italic
+The Physics of Glaciers, Third Edition
+\shape default
+, Elsevier Science Ltd., Oxford, 480 pp.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Prentice, 1968"
+key "Prentice:1968"
+
+\end_inset
+
+Prentice, J.
+ H, (1968), Dimensional problem of the power law in rheology, 
+\shape italic
+Nature
+\shape default
+, 
+\shape italic
+217
+\shape default
+, 157.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Savage and Prescott, 1978"
+key "Savage:Prescott:1978"
+
+\end_inset
+
+Savage, J.
+ C.
+ and W.
+ H.
+ Prescott (1978), Asthenosphere readjustment and the earthquake cycle, 
+\shape italic
+Journal of Geophysical
+\shape default
+ 
+\shape italic
+Research
+\shape default
+\emph on
+, 83
+\emph default
+, 3369-3376.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Taylor, 2003"
+key "Taylor:2003"
+
+\end_inset
+
+Taylor, R.L.
+ (2003), `FEAP--A Finite Element Analysis Program', 
+\shape italic
+Version 7.5 Theory Manual
+\shape default
+, 154 pp.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Timoshenko and Goodier, 1987"
+key "Timoshenko:Goodier:1987"
+
+\end_inset
+
+Timoshenko, S.P.
+ and J.N.
+ Goodier (1987), 
+\shape italic
+Theory of Elasticity, Third Edition
+\shape default
+, McGraw-Hill, New York, 567 pp.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Williams et al., 2005"
+key "Williams:etal:2005"
+
+\end_inset
+
+Williams, C.A., B.
+ Aagaard, and M.G.
+ Knepley (2005), Development of software for studying earthquakes across
+ multiple spatial and temporal scales by coupling quasi-static and dynamic
+ simulations, 
+\emph on
+Eos Trans.
+ AGU, 86
+\emph default
+(52), Fall Meet.
+ Suppl., Abstract S53A-1072.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Williams, 2006"
+key "Williams:2006"
+
+\end_inset
+
+Williams, C.A.
+ (2006), Development of a package for modeling stress in the lithosphere,
+ 
+\emph on
+Eos Trans.
+ AGU,
+\emph default
+ 
+\emph on
+87
+\emph default
+(36), Jt.
+ Assem.
+ Suppl., Abstract T24A-01 Invited.
+\end_layout
+
+\begin_layout Bibliography
+\labelwidthstring Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+label "Zienkiewicz and Taylor, 2000"
+key "Zienkiewicz:Taylor:2000"
+
+\end_inset
+
+Zienkiewicz, O.C.
+ and R.L.
+ Taylor (2000), 
+\shape italic
+The Finite Element Method, Fifth Edition, Volume 2: Solid Mechanics
+\shape default
+, Butterworth-Heinemann, Oxford, 459 pp.125
+\end_layout
+
+\end_body
+\end_document

Modified: short/3D/PyLith/trunk/examples/3d/hex8/step14.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/3d/hex8/step14.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/3d/hex8/step14.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -125,7 +125,7 @@
 # Use the rate-and-state aging friction model.
 friction = pylith.friction.RateStateAgeing
 friction.label = Rate and state
-friction.min_slip_rate = 1.0e-9
+friction.linear_slip_rate = 1.0e-9
 
 # We must define the quadrature information for fault cells.
 # The fault cells are 2D (surface).
@@ -141,7 +141,7 @@
 # b: 0.08
 # cohesion: 0 Pa
 friction.db_properties = spatialdata.spatialdb.UniformDB
-friction.db_properties.label = Rate Stete Ageing
+friction.db_properties.label = Rate State Ageing
 friction.db_properties.values = [reference-friction-coefficient,reference-slip-rate,characteristic-slip-distance,constitutive-parameter-a,constitutive-parameter-b,cohesion]
 friction.db_properties.data = [0.4,2.0e-11*m/s,0.05*m,0.002,0.08,0.0*Pa]
 

Modified: short/3D/PyLith/trunk/examples/bar_shearwave/hex8/pylithapp.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/hex8/pylithapp.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/hex8/pylithapp.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,7 +57,6 @@
 
 # Change to an explicit time stepping formulation
 formulation = pylith.problems.Explicit
-#formulation = pylith.problems.ExplicitLumped
 
 # Nondimensionalize problem using wave propagation parameters.
 normalizer = spatialdata.units.NondimElasticDynamic
@@ -193,19 +192,6 @@
 # PETSc
 # ----------------------------------------------------------------------
 [pylithapp.petsc]
-ksp_type = gmres
-pc_type = asm
-
-# Change the preconditioner settings.
-sub_pc_factor_shift_type = nonzero
-
-ksp_rtol = 1.0e-8
-ksp_atol = 1.0e-10
-ksp_max_it = 50
-ksp_gmres_restart = 75
-
-#ksp_monitor = true
-#ksp_view = true
 log_summary = true
 
 

Modified: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/Makefile.am	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/Makefile.am	2012-10-19 21:28:12 UTC (rev 20857)
@@ -26,13 +26,13 @@
 	matprops.spatialdb \
 	mesh_quad4_200m.jou \
 	pylithapp.cfg \
-	kinematic.cfg \
-	kinematic_slip.spatialdb \
-	kinematic_risetime.spatialdb \
-	kinematic_sliptime.spatialdb \
-	dynamic.cfg \
-	dynamic_staticfriction.cfg \
-	dynamic_slipweakening.cfg \
-	dynamic_ratestateageing.cfg
+	prescribedrup.cfg \
+	prescribedrup_slip.spatialdb \
+	prescribedrup_risetime.spatialdb \
+	prescribedrup_sliptime.spatialdb \
+	spontaneousrup.cfg \
+	spontaneousrup_staticfriction.cfg \
+	spontaneousrup_slipweakening.cfg \
+	spontaneousrup_ratestateageing.cfg
 
 # End of file 

Modified: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/README
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/README	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/README	2012-10-19 21:28:12 UTC (rev 20857)
@@ -5,14 +5,14 @@
 
 Example problems
 
-  * Kinematic fault slip (same as problem in tri3, tet4, and hex8
+  * Prescribed rupture (same as problem in tri3, tet4, and hex8
     subdirectories)
 
-  * Dynamic fault slip with static friction fault constitutive model
+  * Spontaneous rupture with static friction fault constitutive model
 
-  * Dynamic fault slip with linear slip-weakening fault constitutive model
+  * Spontaneous rupture with linear slip-weakening fault constitutive model
 
-  * Dynamic fault slip with rate- and state-friction fault constitutive model
+  * Spontaneous rupture with rate- and state-friction fault constitutive model
 
 
 Files common to all example problems
@@ -25,23 +25,23 @@
 
 Files associated with the example problems:
 
-  + Kinematic fault slip
-    - kinematic.cfg: Parameters for simulation
-    - kinematic_risetime.spatialdb: Spatial database for slip rise time
-    - kinematic_slip.spatialdb: Spatial database for final slip
-    - kinematic_sliptime.spatialdb: Spatial database for slip initiation time 
+  + Prescribed rupture
+    - prescribedrup.cfg: Parameters for simulation
+    - prescribedrup_risetime.spatialdb: Spatial database for slip rise time
+    - prescribedrup_slip.spatialdb: Spatial database for final slip
+    - prescribedrup_sliptime.spatialdb: Spatial database for slip initiation time 
 
-  + Dynamic fault slip with static friction fault constitutive model
+  + Spontaneous rupture with static friction fault constitutive model
 
-    - dynamic.cfg: Parameters common to dynamic friction problems
-    - dynamic_staticfriction.cfg: Parameters for simulation 
+    - spontaneousrup.cfg: Parameters common to dynamic friction problems
+    - spontaneousrup_staticfriction.cfg: Parameters for simulation 
 
-  + Dynamic fault slip with linear slip-weakening fault constitutive model
+  + Spontaneous rupture with linear slip-weakening fault constitutive model
 
-    - dynamic.cfg: Parameters common to dynamic friction problems
-    - dynamic_slipweakening.cfg: Parameters for simulation 
+    - spontaneousrup.cfg: Parameters common to dynamic friction problems
+    - spontaneousrup_slipweakening.cfg: Parameters for simulation 
 
-  + Dynamic fault slip with rate- and state-friction fault constitutive model
+  + Spontaneous rupture with rate- and state-friction fault constitutive model
 
-    - dynamic.cfg: Parameters common to dynamic friction problems
-    - dynamic_ratestateageing.cfg: Parameters for simulation 
+    - spontaneousrup.cfg: Parameters common to dynamic friction problems
+    - spontaneousrup_ratestateageing.cfg: Parameters for simulation 

Deleted: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,51 +0,0 @@
-[pylithapp]
-
-# This is not a self-contained simulation configuration file. This
-# file only specifies the general parameters common to the dynamic
-# fault (friction interface) simulations in this directory.
-
-# ----------------------------------------------------------------------
-# journal
-# ----------------------------------------------------------------------
-# Turn on progress for the dynamic fault.
-[pylithapp.journal.info]
-faultcohesivedyn = 1
-
-# ----------------------------------------------------------------------
-# problem
-# ----------------------------------------------------------------------
-[pylithapp.timedependent]
-
-# Overwrite the use of explicit time stepping with a full Jacobian
-# matrix set in pylithapp.cfg with a lumped Jacobian matrix. The
-# lumped Jacobian reduces memory use and uncouples the degrees of
-# freedom in the solve, permitting use of a very fast, simple solver.
-formulation = pylith.problems.ExplicitLumped
-
-# ----------------------------------------------------------------------
-# faults
-# ----------------------------------------------------------------------
-[pylithapp.timedependent.interfaces]
-# Change fault to dynamic fault interface.
-fault = pylith.faults.FaultCohesiveDyn
-
-[pylithapp.timedependent.interfaces.fault]
-# Specify the initial tractions on the fault using a uniform DB.
-#  shear: 6.1 MPa (right-lateral)
-#  normal 10 MPa (compressive)
-traction_perturbation = pylith.faults.TractPerturbation
-
-[pylithapp.timedependent.interfaces.fault.traction_perturbation]
-db_initial = spatialdata.spatialdb.UniformDB
-db_initial.label = Initial fault tractions
-db_initial.values = [traction-shear,traction-normal]
-db_initial.data = [-6.1*MPa, -10.0*MPa]
-
-# ----------------------------------------------------------------------
-# output
-# ----------------------------------------------------------------------
-[pylithapp.timedependent.interfaces.fault.output]
-vertex_info_fields=[traction_initial_value]
-vertex_data_fields=[slip,slip_rate,traction]
-skip = 1
-writer.time_format = %05.2f

Deleted: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_ratestateageing.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_ratestateageing.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_ratestateageing.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,66 +0,0 @@
-[pylithapp]
-
-# ----------------------------------------------------------------------
-# PROBLEM DESCRIPTION
-# ----------------------------------------------------------------------
-
-# Use constant initial tractions on the fault to drive fault slip
-# subject to rate- and state-friction on the fault. Deformation
-# propagates to the edges of the bar where it is absorbed using
-# absorbing dampers boundary conditions. The steady state solution is
-# a constant slip rate on the fault with uniform strain in the bar.
-
-# ----------------------------------------------------------------------
-# RUNNING THE SIMULATION
-# ----------------------------------------------------------------------
-
-# This is not a self-contained simulation configuration file. This
-# file only specifies the specific parameters for an explicit
-# time-stepping problem using a dynamic fault interface condition with
-# static friction.
-#
-# To run the simulation:
-# pylith dynamicfault.cfg staticfriction.cfg
-#
-# Output will be directed to the directory output.
-
-# ----------------------------------------------------------------------
-# faults
-# ----------------------------------------------------------------------
-[pylithapp.timedependent.interfaces.fault]
-
-# Use rate- and state-friction with the ageing law for evolution of
-# the state variable.
-friction = pylith.friction.RateStateAgeing
-friction.label = Rate and state
-
-# Set the friction model parameters.
-#  reference coefficient of friction: 0.6
-#  reference slip rate: 1.0e-06 m/s
-#  slip weakening parameter: 0.037 m
-#  a: 0.0125
-#  b: 0.0172
-#  cohesion: 0 Pa
-friction.db_properties = spatialdata.spatialdb.UniformDB
-friction.db_properties.label = Rate State Ageing
-friction.db_properties.values = [reference-friction-coefficient,reference-slip-rate,characteristic-slip-distance,constitutive-parameter-a,constitutive-parameter-b,cohesion]
-friction.db_properties.data = [0.6,1.0e-6*m/s,0.0370*m,0.0125,0.0172,0.0*Pa]
-
-# Set spatial database for the initial value of the state variable.
-friction.db_initial_state = spatialdata.spatialdb.UniformDB
-friction.db_initial_state.label = Rate State Ageing State
-friction.db_initial_state.values = [state-variable]
-friction.db_initial_state.data = [92.7*s]
-
-# ----------------------------------------------------------------------
-# output
-# ----------------------------------------------------------------------
-# Set filenames for output.
-[pylithapp.problem.formulation.output.output]
-writer.filename = output/ratestateageing.vtk
-
-[pylithapp.timedependent.interfaces.fault.output]
-writer.filename = output/ratestateageing-fault.vtk
-
-[pylithapp.timedependent.materials.elastic.output]
-writer.filename = output/ratestateageing-statevars.vtk

Deleted: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_slipweakening.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_slipweakening.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_slipweakening.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,65 +0,0 @@
-[pylithapp]
-
-# ----------------------------------------------------------------------
-# PROBLEM DESCRIPTION
-# ----------------------------------------------------------------------
-
-# Use constant initial tractions on the fault to drive fault slip
-# subject to linear slip-weakening friction on the fault. Deformation
-# propagates to the edges of the bar where it is absorbed using
-# absorbing dampers boundary conditions. The steady state solution is
-# a constant slip rate on the fault with uniform strain in the bar.
-
-# ----------------------------------------------------------------------
-# RUNNING THE SIMULATION
-# ----------------------------------------------------------------------
-
-# This is not a self-contained simulation configuration file. This
-# file only specifies the specific parameters for an explicit
-# time-stepping problem using a dynamic fault interface condition with
-# linear slip-weakening friction.
-#
-# To run the simulation:
-# pylith dynamicfault.cfg slipweakening.cfg
-#
-# Output will be directed to the directory output.
-
-# ----------------------------------------------------------------------
-# faults
-# ----------------------------------------------------------------------
-[pylithapp.timedependent.interfaces.fault]
-
-# Use slip-weakening friction
-friction = pylith.friction.SlipWeakening
-friction.label = Slip weakening
-
-# Set the slip-weakening friction model parameters.
-#  static coefficient of friction: 0.6
-#  dynamic coefficient of friction: 0.5
-#  slip-weakening parameter: 0.2 m
-#  cohesion: 0 Pa
-friction.db_properties = spatialdata.spatialdb.UniformDB
-friction.db_properties.label = Slip weakening
-friction.db_properties.values = [static-coefficient,dynamic-coefficient,slip-weakening-parameter,cohesion]
-friction.db_properties.data = [0.6,0.5,0.2*m,0.0*Pa]
-
-# ----------------------------------------------------------------------
-# output
-# ----------------------------------------------------------------------
-[pylithapp.problem.formulation.output.output]
-writer.filename = output/slipweakening.vtk
-
-[pylithapp.timedependent.interfaces.fault.output]
-writer.filename = output/slipweakening-fault.vtk
-
-# Add friction model parameters to fault info file in addition to
-# default values.
-vertex_info_fields = [strike_dir,normal_dir,traction_initial_value,static_coefficient,dynamic_coefficient,slip_weakening_parameter,cohesion]
-
-# Add output of state variables cumulative slip and previous slip to default
-# values.
-vertex_data_fields = [slip,traction,cumulative_slip,previous_slip]
-
-
-[pylithapp.timedependent.materials.elastic.output]
-writer.filename = output/slipweakening-statevars.vtk

Deleted: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_staticfriction.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_staticfriction.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_staticfriction.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,53 +0,0 @@
-[pylithapp]
-
-# ----------------------------------------------------------------------
-# PROBLEM DESCRIPTION
-# ----------------------------------------------------------------------
-
-# Use constant initial tractions on the fault to drive fault slip
-# subject to static friction on the fault. Deformation propagates to
-# the edges of the bar where it is absorbed using absorbing dampers
-# boundary conditions. The steady state solution is a constant slip
-# rate on the fault with uniform strain in the bar.
-
-# ----------------------------------------------------------------------
-# RUNNING THE SIMULATION
-# ----------------------------------------------------------------------
-
-# This is not a self-contained simulation configuration file. This
-# file only specifies the specific parameters for an explicit
-# time-stepping problem using a dynamic fault interface condition with
-# static friction.
-#
-# To run the simulation:
-# pylith dynamicfault.cfg staticfriction.cfg
-
-# ----------------------------------------------------------------------
-# faults
-# ----------------------------------------------------------------------
-[pylithapp.timedependent.interfaces.fault]
-
-# Use static friction
-friction = pylith.friction.StaticFriction
-friction.label = Static friction
-
-# Set the static friction model parameters.
-#  static coefficient of friction: 0.6
-#  cohesion: 0 Pa
-friction.db_properties = spatialdata.spatialdb.UniformDB
-friction.db_properties.label = Static friction
-friction.db_properties.values = [friction-coefficient,cohesion]
-friction.db_properties.data = [0.6,0.0*Pa]
-
-# ----------------------------------------------------------------------
-# output
-# ----------------------------------------------------------------------
-# Set filenames for output.
-[pylithapp.problem.formulation.output.output]
-writer.filename = output/staticfriction.vtk
-
-[pylithapp.timedependent.interfaces.fault.output]
-writer.filename = output/staticfriction-fault.vtk
-
-[pylithapp.timedependent.materials.elastic.output]
-writer.filename = output/staticfriction-statevars.vtk

Deleted: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,85 +0,0 @@
-[pylithapp]
-
-# ----------------------------------------------------------------------
-# PROBLEM DESCRIPTION
-# ----------------------------------------------------------------------
-
-# Impose 1.0 m of left-lateral slip at time 0.1 s with slip rate
-# following Brune's far-field time function. The rise time (95% of the
-# final slip) is 2.0 s.
-#
-# The fault slip causes a shear wave to propagate down the bar. The
-# shear wave is absorbed at the lateral ends of the bar using the
-# absorbing dampers boundary condition.
-
-# ----------------------------------------------------------------------
-# RUNNING THE SIMULATION
-# ----------------------------------------------------------------------
-
-# This is not a self-contained simulation configuration file. This
-# file only specifies the specific parameters for an explicit
-# time-stepping problem using a fault with kinematically-specified
-# slip.
-#
-# To run the simulation:
-# pylith shearwave_kinematicslip.cfg
-
-# ----------------------------------------------------------------------
-# journal
-# ----------------------------------------------------------------------
-# Turn on progress for the kinematic fault.
-[pylithapp.journal.info]
-faultcohesivekin = 1
-
-# ----------------------------------------------------------------------
-# problem
-# ----------------------------------------------------------------------
-[pylithapp.timedependent]
-
-# Uncomment the line below to overwrite the use of explicit time
-# stepping with a full Jacobian matrix set in pylithapp.cfg with a
-# lumped Jacobian matrix. The lumped Jacobian reduces memory use and
-# uncouples the degrees of freedom in the solve, permitting use of a
-# very fast, simple solver.
-#formulation = pylith.problems.ExplicitLumped
-
-# ----------------------------------------------------------------------
-# faults
-# ----------------------------------------------------------------------
-[pylithapp.timedependent.interfaces]
-fault = pylith.faults.FaultCohesiveKin
-
-[pylithapp.timedependent.interfaces.fault]
-# Switch to Brune slip time function
-eq_srcs.rupture.slip_function = pylith.faults.BruneSlipFn
-
-[pylithapp.timedependent.interfaces.fault.eq_srcs.rupture.slip_function]
-
-# Database specifying the final slip.
-slip.label = Final slip
-slip.iohandler.filename = kinematic_slip.spatialdb
-
-# Database specifying rise_time.
-rise_time.label = Rise time
-rise_time.iohandler.filename = kinematic_risetime.spatialdb
-
-# Database specifying time at which slip begins at each point.
-slip_time.label = Slip initiation time
-slip_time.iohandler.filename = kinematic_sliptime.spatialdb
-
-# ----------------------------------------------------------------------
-# output
-# ----------------------------------------------------------------------
-# Set the filename for each type of output.
-
-# Give basename for VTK domain output of solution over domain.
-[pylithapp.problem.formulation.output.output]
-writer.filename = output/kinematic.vtk
-
-# Give basename for VTK fault output.
-[pylithapp.timedependent.interfaces.fault.output]
-writer.filename = output/kinematic-fault.vtk
-
-# Give basename for VTK output of state variables.
-[pylithapp.timedependent.materials.elastic.output]
-writer.filename = output/kinematic-statevars.vtk

Deleted: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_risetime.spatialdb
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_risetime.spatialdb	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_risetime.spatialdb	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,25 +0,0 @@
-#SPATIAL.ascii 1
-SimpleDB {
-  // number of values for rise time
-  num-values = 1
-
-  // Name and units for rise time
-  value-names =  rise-time
-  value-units =  s
-
-  // Number of locations where physical properties are given
-  // 1 location -> data is uniform -> data dimension is 0
-  num-locs = 1
-  data-dim = 0
-
-  // Problem is in 2-D
-  space-dim = 2
-
-  // Coordinate system (2-D with coordinates in meters)
-  cs-data = cartesian {
-    to-meters = 1.0
-    space-dim = 2
-  }
-}
-// Columns are x, y, rise-time
-0.0  0.0    2.0

Deleted: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_slip.spatialdb
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_slip.spatialdb	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_slip.spatialdb	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,25 +0,0 @@
-#SPATIAL.ascii 1
-SimpleDB {
-  // number of values for final slip
-  num-values = 2
-
-  // Names and units of final slip values
-  value-names =  left-lateral-slip  fault-opening
-  value-units =  m  m
-
-  // Number of locations where physical properties are given
-  // 1 location -> data is uniform -> data dimension is 0
-  num-locs = 1
-  data-dim = 0
-
-  // Problem is in 2-D
-  space-dim = 2
-
-  // Coordinate system (2-D with coordinates in meters)
-  cs-data = cartesian {
-    to-meters = 1.0
-    space-dim = 2
-  }
-}
-// Columns are x, y, left-lateral-slip, fault-opening
-0.0  0.0   1.0  0.0

Deleted: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_sliptime.spatialdb
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_sliptime.spatialdb	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_sliptime.spatialdb	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,25 +0,0 @@
-#SPATIAL.ascii 1
-SimpleDB {
-  // number of values for slip initiation time
-  num-values = 1
-
-  // Names and units of slip initiation time
-  value-names =  slip-time
-  value-units =  s
-
-  // Number of locations where physical properties are given
-  // 1 location -> data is uniform -> data dimension is 0
-  num-locs = 1
-  data-dim = 0
-
-  // Problem is in 2-D
-  space-dim = 2
-
-  // Coordinate system (2-D with coordinates in meters)
-  cs-data = cartesian {
-    to-meters = 1.0
-    space-dim = 2
-  }
-}
-// Columns are x, y, slip-time
-0.0 0.0   0.1

Copied: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup.cfg (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/examples/bar_shearwave/quad4/prescribedrup.cfg)
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup.cfg	                        (rev 0)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,72 @@
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+# Impose 1.0 m of left-lateral slip at time 0.1 s with slip rate
+# following Brune's far-field time function. The rise time (95% of the
+# final slip) is 2.0 s.
+#
+# The fault slip causes a shear wave to propagate down the bar. The
+# shear wave is absorbed at the lateral ends of the bar using the
+# absorbing dampers boundary condition.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATION
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies the specific parameters for an explicit
+# time-stepping problem using a fault with prescribed rupture.
+#
+# To run the simulation:
+# pylith prescribedrup.cfg
+
+# ----------------------------------------------------------------------
+# journal
+# ----------------------------------------------------------------------
+# Turn on progress for the prescribed rupture fault.
+[pylithapp.journal.info]
+faultcohesivekin = 1
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces]
+fault = pylith.faults.FaultCohesiveKin
+
+[pylithapp.timedependent.interfaces.fault]
+# Switch to Brune slip time function
+eq_srcs.rupture.slip_function = pylith.faults.BruneSlipFn
+
+[pylithapp.timedependent.interfaces.fault.eq_srcs.rupture.slip_function]
+
+# Database specifying the final slip.
+slip.label = Final slip
+slip.iohandler.filename = prescribedrup_slip.spatialdb
+
+# Database specifying rise_time.
+rise_time.label = Rise time
+rise_time.iohandler.filename = prescribedrup_risetime.spatialdb
+
+# Database specifying time at which slip begins at each point.
+slip_time.label = Slip initiation time
+slip_time.iohandler.filename = prescribedrup_sliptime.spatialdb
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Set the filename for each type of output.
+
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.output]
+writer.filename = output/prescribedrup.vtk
+
+# Give basename for VTK fault output.
+[pylithapp.timedependent.interfaces.fault.output]
+writer.filename = output/prescribedrup-fault.vtk
+
+# Give basename for VTK output of state variables.
+[pylithapp.timedependent.materials.elastic.output]
+writer.filename = output/prescribedrup-statevars.vtk

Copied: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_risetime.spatialdb (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/examples/bar_shearwave/quad4/prescribedrup_risetime.spatialdb)
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_risetime.spatialdb	                        (rev 0)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_risetime.spatialdb	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,25 @@
+#SPATIAL.ascii 1
+SimpleDB {
+  // number of values for rise time
+  num-values = 1
+
+  // Name and units for rise time
+  value-names =  rise-time
+  value-units =  s
+
+  // Number of locations where physical properties are given
+  // 1 location -> data is uniform -> data dimension is 0
+  num-locs = 1
+  data-dim = 0
+
+  // Problem is in 2-D
+  space-dim = 2
+
+  // Coordinate system (2-D with coordinates in meters)
+  cs-data = cartesian {
+    to-meters = 1.0
+    space-dim = 2
+  }
+}
+// Columns are x, y, rise-time
+0.0  0.0    2.0

Copied: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_slip.spatialdb (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/examples/bar_shearwave/quad4/prescribedrup_slip.spatialdb)
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_slip.spatialdb	                        (rev 0)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_slip.spatialdb	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,25 @@
+#SPATIAL.ascii 1
+SimpleDB {
+  // number of values for final slip
+  num-values = 2
+
+  // Names and units of final slip values
+  value-names =  left-lateral-slip  fault-opening
+  value-units =  m  m
+
+  // Number of locations where physical properties are given
+  // 1 location -> data is uniform -> data dimension is 0
+  num-locs = 1
+  data-dim = 0
+
+  // Problem is in 2-D
+  space-dim = 2
+
+  // Coordinate system (2-D with coordinates in meters)
+  cs-data = cartesian {
+    to-meters = 1.0
+    space-dim = 2
+  }
+}
+// Columns are x, y, left-lateral-slip, fault-opening
+0.0  0.0   1.0  0.0

Copied: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_sliptime.spatialdb (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/examples/bar_shearwave/quad4/prescribedrup_sliptime.spatialdb)
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_sliptime.spatialdb	                        (rev 0)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/prescribedrup_sliptime.spatialdb	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,25 @@
+#SPATIAL.ascii 1
+SimpleDB {
+  // number of values for slip initiation time
+  num-values = 1
+
+  // Names and units of slip initiation time
+  value-names =  slip-time
+  value-units =  s
+
+  // Number of locations where physical properties are given
+  // 1 location -> data is uniform -> data dimension is 0
+  num-locs = 1
+  data-dim = 0
+
+  // Problem is in 2-D
+  space-dim = 2
+
+  // Coordinate system (2-D with coordinates in meters)
+  cs-data = cartesian {
+    to-meters = 1.0
+    space-dim = 2
+  }
+}
+// Columns are x, y, slip-time
+0.0 0.0   0.1

Modified: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/pylithapp.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/pylithapp.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/pylithapp.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -172,28 +172,6 @@
 # PETSc
 # ----------------------------------------------------------------------
 [pylithapp.petsc]
-
-# Preconditioner settings.
-pc_type = asm
-sub_pc_factor_shift_type = nonzero
-
-# Convergence parameters.
-ksp_rtol = 1.0e-8
-ksp_atol = 1.0e-12
-ksp_max_it = 500
-ksp_gmres_restart = 100
-snes_max_it = 500
-
-# Linear solver monitoring options.
-ksp_monitor = true
-ksp_view = true
-ksp_converged_reason = true
-
-# Nonlinear solver monitoring options.
-snes_monitor = true
-snes_view = true
-snes_converged_reason = true
-
 # PETSc summary -- useful for performance information.
 log_summary = true
 

Copied: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup.cfg (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/examples/bar_shearwave/quad4/spontaneousrup.cfg)
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup.cfg	                        (rev 0)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,40 @@
+[pylithapp]
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies the general parameters common to the dynamic
+# fault (friction interface) simulations in this directory.
+
+# ----------------------------------------------------------------------
+# journal
+# ----------------------------------------------------------------------
+# Turn on progress for the dynamic fault.
+[pylithapp.journal.info]
+faultcohesivedyn = 1
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces]
+# Change fault to dynamic fault interface.
+fault = pylith.faults.FaultCohesiveDyn
+
+[pylithapp.timedependent.interfaces.fault]
+# Specify the initial tractions on the fault using a uniform DB.
+#  shear: 6.1 MPa (right-lateral)
+#  normal 10 MPa (compressive)
+traction_perturbation = pylith.faults.TractPerturbation
+
+[pylithapp.timedependent.interfaces.fault.traction_perturbation]
+db_initial = spatialdata.spatialdb.UniformDB
+db_initial.label = Initial fault tractions
+db_initial.values = [traction-shear,traction-normal]
+db_initial.data = [-6.1*MPa, -10.0*MPa]
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces.fault.output]
+vertex_info_fields=[traction_initial_value]
+vertex_data_fields=[slip,slip_rate,traction]
+skip = 1
+writer.time_format = %05.2f

Copied: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_ratestateageing.cfg (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/examples/bar_shearwave/quad4/spontaneousrup_ratestateageing.cfg)
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_ratestateageing.cfg	                        (rev 0)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_ratestateageing.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,66 @@
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+# Use constant initial tractions on the fault to drive fault slip
+# subject to rate- and state-friction on the fault. Deformation
+# propagates to the edges of the bar where it is absorbed using
+# absorbing dampers boundary conditions. The steady state solution is
+# a constant slip rate on the fault with uniform strain in the bar.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATION
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies the specific parameters for an explicit
+# time-stepping problem using a dynamic fault interface condition with
+# static friction.
+#
+# To run the simulation:
+# pylith dynamicfault.cfg staticfriction.cfg
+#
+# Output will be directed to the directory output.
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces.fault]
+
+# Use rate- and state-friction with the ageing law for evolution of
+# the state variable.
+friction = pylith.friction.RateStateAgeing
+friction.label = Rate and state
+
+# Set the friction model parameters.
+#  reference coefficient of friction: 0.6
+#  reference slip rate: 1.0e-06 m/s
+#  slip weakening parameter: 0.037 m
+#  a: 0.0125
+#  b: 0.0172
+#  cohesion: 0 Pa
+friction.db_properties = spatialdata.spatialdb.UniformDB
+friction.db_properties.label = Rate State Ageing
+friction.db_properties.values = [reference-friction-coefficient,reference-slip-rate,characteristic-slip-distance,constitutive-parameter-a,constitutive-parameter-b,cohesion]
+friction.db_properties.data = [0.6,1.0e-6*m/s,0.0370*m,0.0125,0.0172,0.0*Pa]
+
+# Set spatial database for the initial value of the state variable.
+friction.db_initial_state = spatialdata.spatialdb.UniformDB
+friction.db_initial_state.label = Rate State Ageing State
+friction.db_initial_state.values = [state-variable]
+friction.db_initial_state.data = [92.7*s]
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Set filenames for output.
+[pylithapp.problem.formulation.output.output]
+writer.filename = output/ratestateageing.vtk
+
+[pylithapp.timedependent.interfaces.fault.output]
+writer.filename = output/ratestateageing-fault.vtk
+
+[pylithapp.timedependent.materials.elastic.output]
+writer.filename = output/ratestateageing-statevars.vtk

Copied: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_slipweakening.cfg (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/examples/bar_shearwave/quad4/spontaneousrup_slipweakening.cfg)
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_slipweakening.cfg	                        (rev 0)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_slipweakening.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,65 @@
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+# Use constant initial tractions on the fault to drive fault slip
+# subject to linear slip-weakening friction on the fault. Deformation
+# propagates to the edges of the bar where it is absorbed using
+# absorbing dampers boundary conditions. The steady state solution is
+# a constant slip rate on the fault with uniform strain in the bar.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATION
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies the specific parameters for an explicit
+# time-stepping problem using a dynamic fault interface condition with
+# linear slip-weakening friction.
+#
+# To run the simulation:
+# pylith dynamicfault.cfg slipweakening.cfg
+#
+# Output will be directed to the directory output.
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces.fault]
+
+# Use slip-weakening friction
+friction = pylith.friction.SlipWeakening
+friction.label = Slip weakening
+
+# Set the slip-weakening friction model parameters.
+#  static coefficient of friction: 0.6
+#  dynamic coefficient of friction: 0.5
+#  slip-weakening parameter: 0.2 m
+#  cohesion: 0 Pa
+friction.db_properties = spatialdata.spatialdb.UniformDB
+friction.db_properties.label = Slip weakening
+friction.db_properties.values = [static-coefficient,dynamic-coefficient,slip-weakening-parameter,cohesion]
+friction.db_properties.data = [0.6,0.5,0.2*m,0.0*Pa]
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+[pylithapp.problem.formulation.output.output]
+writer.filename = output/slipweakening.vtk
+
+[pylithapp.timedependent.interfaces.fault.output]
+writer.filename = output/slipweakening-fault.vtk
+
+# Add friction model parameters to fault info file in addition to
+# default values.
+vertex_info_fields = [strike_dir,normal_dir,traction_initial_value,static_coefficient,dynamic_coefficient,slip_weakening_parameter,cohesion]
+
+# Add output of state variables cumulative slip and previous slip to default
+# values.
+vertex_data_fields = [slip,traction,cumulative_slip,previous_slip]
+
+
+[pylithapp.timedependent.materials.elastic.output]
+writer.filename = output/slipweakening-statevars.vtk

Copied: short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_staticfriction.cfg (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/examples/bar_shearwave/quad4/spontaneousrup_staticfriction.cfg)
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_staticfriction.cfg	                        (rev 0)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/quad4/spontaneousrup_staticfriction.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,53 @@
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+# Use constant initial tractions on the fault to drive fault slip
+# subject to static friction on the fault. Deformation propagates to
+# the edges of the bar where it is absorbed using absorbing dampers
+# boundary conditions. The steady state solution is a constant slip
+# rate on the fault with uniform strain in the bar.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATION
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies the specific parameters for an explicit
+# time-stepping problem using a dynamic fault interface condition with
+# static friction.
+#
+# To run the simulation:
+# pylith dynamicfault.cfg staticfriction.cfg
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces.fault]
+
+# Use static friction
+friction = pylith.friction.StaticFriction
+friction.label = Static friction
+
+# Set the static friction model parameters.
+#  static coefficient of friction: 0.6
+#  cohesion: 0 Pa
+friction.db_properties = spatialdata.spatialdb.UniformDB
+friction.db_properties.label = Static friction
+friction.db_properties.values = [friction-coefficient,cohesion]
+friction.db_properties.data = [0.6,0.0*Pa]
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Set filenames for output.
+[pylithapp.problem.formulation.output.output]
+writer.filename = output/staticfriction.vtk
+
+[pylithapp.timedependent.interfaces.fault.output]
+writer.filename = output/staticfriction-fault.vtk
+
+[pylithapp.timedependent.materials.elastic.output]
+writer.filename = output/staticfriction-statevars.vtk

Modified: short/3D/PyLith/trunk/examples/bar_shearwave/tet4/pylithapp.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/tet4/pylithapp.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/tet4/pylithapp.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,12 +59,9 @@
 # Change to an explicit time stepping formulation
 formulation = pylith.problems.Explicit
 
-# Uncomment next line to use lumped formulation.
-#formulation = pylith.problems.ExplicitLumped
-
 # Uncomment next line to use optimized lumped formulation and change
 # the quadrature order of the bulk material to 1.
-#formulation = pylith.problems.ExplicitLumpedTet4
+#formulation = pylith.problems.ExplicitTet4
 
 # Nondimensionalize problem using wave propagation parameters.
 normalizer = spatialdata.units.NondimElasticDynamic
@@ -216,19 +213,6 @@
 # PETSc
 # ----------------------------------------------------------------------
 [pylithapp.petsc]
-ksp_type = gmres
-pc_type = asm
-
-# Change the preconditioner settings.
-sub_pc_factor_shift_type = nonzero
-
-ksp_rtol = 1.0e-8
-ksp_atol = 1.0e-10
-ksp_max_it = 50
-ksp_gmres_restart = 75
-
-ksp_monitor = true
-#ksp_view = true
 #log_summary = true
 
 

Modified: short/3D/PyLith/trunk/examples/bar_shearwave/tri3/pylithapp.cfg
===================================================================
--- short/3D/PyLith/trunk/examples/bar_shearwave/tri3/pylithapp.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/bar_shearwave/tri3/pylithapp.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,7 +58,7 @@
 
 # Change to an explicit time stepping formulation
 formulation = pylith.problems.Explicit
-#formulation = pylith.problems.ExplicitLumpedTri3
+#formulation = pylith.problems.ExplicitTri3
 
 # Nondimensionalize problem using wave propagation parameters.
 normalizer = spatialdata.units.NondimElasticDynamic
@@ -197,19 +197,6 @@
 # PETSc
 # ----------------------------------------------------------------------
 [pylithapp.petsc]
-ksp_type = gmres
-pc_type = asm
-
-# Change the preconditioner settings.
-sub_pc_factor_shift_type = nonzero
-
-ksp_rtol = 1.0e-8
-ksp_atol = 1.0e-10
-ksp_max_it = 50
-ksp_gmres_restart = 25
-
-#ksp_monitor = true
-#ksp_view = true
 log_summary = true
 
 
@@ -236,6 +223,7 @@
 
 # Give basename for VTK output of state variables.
 [pylithapp.timedependent.materials.elastic.output]
+cell_info_fields = [mu,lambda,density,stable_dt_explicit]
 skip = 29
 writer.filename = output/shearwave-statevars.vtk
 writer.time_format = %05.2f

Modified: short/3D/PyLith/trunk/examples/meshing/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/examples/meshing/Makefile.am	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/meshing/Makefile.am	2012-10-19 21:28:12 UTC (rev 20857)
@@ -17,7 +17,8 @@
 #
 
 SUBDIRS = \
-	surface_nurbs
+	surface_nurbs \
+	cubit_cellsize
 
 
 # End of file 

Copied: short/3D/PyLith/trunk/examples/meshing/cubit_cellsize (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/examples/meshing/cubit_cellsize)

Modified: short/3D/PyLith/trunk/examples/meshing/surface_nurbs/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/examples/meshing/surface_nurbs/Makefile.am	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/meshing/surface_nurbs/Makefile.am	2012-10-19 21:28:12 UTC (rev 20857)
@@ -19,7 +19,8 @@
 SUBDIRS = \
 	contours \
 	dem \
-	triangles
+	triangles \
+	merge_surfs
 
 
 dist_noinst_DATA = \

Copied: short/3D/PyLith/trunk/examples/meshing/surface_nurbs/merge_surfs (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/examples/meshing/surface_nurbs/merge_surfs)

Deleted: short/3D/PyLith/trunk/examples/meshing/surface_nurbs/shiftrot.py
===================================================================
--- short/3D/PyLith/trunk/examples/meshing/surface_nurbs/shiftrot.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/meshing/surface_nurbs/shiftrot.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,137 +0,0 @@
-#!/usr/bin/env python
-
-## @file shiftrot.py
-
-## @brief Python application to take a set of (x,y,z) points from an ASCII file,
-## shift them in the (x,y) plane by a given amount, and then rotate them about
-## the origin by a given amount in the (x,y) plane (shifting occurs in the old
-## coordinate system).
-## It is assumed that the input coordinates and the shift values have the same
-## units.
-
-import math
-import pdb
-
-from pyre.applications.Script import Script as Application
-
-class ShiftRot(Application):
-  """
-  Python application to take a set of (x,y,z) points from an ASCII file,
-  shift them in the (x,y) plane by a given amount, and then rotate them about
-  the origin by a given amount in the (x,y) plane (shifting occurs in the old
-  coordinate system).
-  It is assumed that the input coordinates and the shift values have the same
-  units.
-  """
-
-  class Inventory(Application.Inventory):
-    """
-    Python object for managing ShiftRot facilities and properties.
-    """
-    
-    ## @class Inventory
-    ## Python object for managing ShiftRot facilities and properties.
-    ##
-    ## \b Properties
-    ## @li \b in_file Input file containing original coordinates.
-    ## @li \b out_file Output file containing shifted and rotated coordinates.
-    ## @li \b x_shift Amount by which to shift coordinates in the x-direction.
-    ## @li \b y_shift Amount by which to shift coordinates in the y-direction.
-    ## @li \b rot_angle Amount by which to rotate coordinates.
-    ## @li \b scale_factor Amount by which to scale coordinates.
-
-    import pyre.inventory
-    from pyre.units.angle import degree
-    
-    inFile = pyre.inventory.str("in_file", default="in_file.txt")
-    inFile.meta['tip'] = "Input file containing original coordinates."
-    
-    outFile = pyre.inventory.str("out_file", default="out_file.txt")
-    outFile.meta['tip'] = "Output file with shifted and rotated coordoutates."
-    
-    xShift = pyre.inventory.float("x_shift", default=0.0)
-    xShift.meta['tip'] = "X-shift to apply to coordinates."
-    
-    yShift = pyre.inventory.float("y_shift", default=0.0)
-    yShift.meta['tip'] = "Y-shift to apply to coordinates."
-    
-    rotAngle = pyre.inventory.dimensional("rot_angle", default=0.0*degree)
-    rotAngle.meta['tip'] = "Amount by which to rotate coordinates."
-    
-    scaleFactor = pyre.inventory.float("scale_factor", default=1.0)
-    scaleFactor.meta['tip'] = "Scaling factor to apply to results."
-
-
-  # PUBLIC METHODS /////////////////////////////////////////////////////
-
-  def __init__(self, name="shiftrot"):
-    Application.__init__(self, name)
-
-    return
-
-
-  def main(self):
-    # pdb.set_trace()
-    self._transformCoords()
-
-    return
-  
-
-  # PRIVATE METHODS /////////////////////////////////////////////////////
-
-  def _configure(self):
-    """
-    Setup members using inventory.
-    """
-    Application._configure(self)
-
-    # Filenames
-    self.inFile = self.inventory.inFile
-    self.outFile = self.inventory.outFile
-
-    # Parameters
-    self.xShift = self.inventory.xShift
-    self.yShift = self.inventory.yShift
-    self.rotAngle = self.inventory.rotAngle.value
-    self.scaleFactor = self.inventory.scaleFactor
-
-    return
-
-
-  def _transformCoords(self):
-    """
-    Rotate, shift, and scale coordinates.
-    """
-    # pdb.set_trace()
-    cosRot = math.cos(self.rotAngle)
-    sinRot = math.sin(self.rotAngle)
-
-    f = open(self.inFile, 'r')
-    g = open(self.outFile, 'w')
-
-    for line in f:
-      data = line.split()
-      x = float(data[0])
-      y = float(data[1])
-      z = float(data[2])
-      xTrans = self.scaleFactor * ( (x + self.xShift) * cosRot + \
-                                    (y + self.yShift) * sinRot)
-      yTrans = self.scaleFactor * (-(x + self.xShift) * sinRot + \
-                                   (y + self.yShift) * cosRot)
-      g.write('%.12f' % xTrans)
-      g.write('  %.12f' % yTrans)
-      g.write('  %.12f' % z)
-      g.write( '\n')
-
-    f.close()
-    g.close()
-
-    return
-
-# ----------------------------------------------------------------------
-if __name__ == '__main__':
-  app = ShiftRot()
-  app.run()
-
-# End of file
-

Modified: short/3D/PyLith/trunk/examples/run_examples.sh
===================================================================
--- short/3D/PyLith/trunk/examples/run_examples.sh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/examples/run_examples.sh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -91,10 +91,10 @@
 
 # bar_shearwave/quad4
 dir="bar_shearwave/quad4"
-examples="kinematic.cfg"
+examples="prescribedrup.cfg"
 run_examples
-examples="dynamic_staticfriction.cfg dynamic_slipweakening.cfg dynamic_ratestateageing.cfg"
-run_examples2 "dynamic.cfg"
+examples="spontaneousrup_staticfriction.cfg spontaneousrup_slipweakening.cfg spontaneousrup_ratestateageing.cfg"
+run_examples2 "spontaneousrup.cfg"
 
 # bar_shearwave/tet4
 dir="bar_shearwave/tet4"

Modified: short/3D/PyLith/trunk/libsrc/pylith/bc/AbsorbingDampers.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/bc/AbsorbingDampers.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/bc/AbsorbingDampers.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -67,6 +67,7 @@
 void 
 pylith::bc::AbsorbingDampers::deallocate(void)
 { // deallocate
+  BCIntegratorSubMesh::deallocate();
   _db = 0; // :TODO: Use shared pointer
 } // deallocate
   

Modified: short/3D/PyLith/trunk/libsrc/pylith/bc/DirichletBC.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/bc/DirichletBC.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/bc/DirichletBC.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -231,8 +231,6 @@
 				      const PylithScalar t1,
 				      const topology::Field<topology::Mesh>& field)
 { // setFieldIncr
-  assert(_useSolnIncr);
-
   const int numFixedDOF = _bcDOF.size();
   if (0 == numFixedDOF)
     return;

Modified: short/3D/PyLith/trunk/libsrc/pylith/bc/Neumann.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/bc/Neumann.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/bc/Neumann.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -62,6 +62,7 @@
 void
 pylith::bc::Neumann::deallocate(void)
 { // deallocate
+  BCIntegratorSubMesh::deallocate();
   TimeDependent::deallocate();
 } // deallocate
   

Modified: short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesive.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesive.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesive.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,6 +56,7 @@
 pylith::faults::FaultCohesive::deallocate(void)
 { // deallocate
   Fault::deallocate();
+  feassemble::Integrator<feassemble::Quadrature<topology::SubMesh> >::deallocate();
 
   delete _fields; _fields = 0;
 } // deallocate
@@ -120,53 +121,62 @@
   assert(0 != mesh);
   assert(std::string("") != label());
   
-  topology::SubMesh faultMesh;
-  ALE::Obj<SieveFlexMesh> faultBoundary;
+  try {
+    topology::SubMesh faultMesh;
+    ALE::Obj<SieveFlexMesh> faultBoundary;
   
-  // Get group of vertices associated with fault
-  const ALE::Obj<topology::Mesh::SieveMesh>& sieveMesh = mesh->sieveMesh();
-  assert(!sieveMesh.isNull());
-
-  if (!_useFaultMesh) {
-    if (!sieveMesh->hasIntSection(label())) {
-      std::ostringstream msg;
-      msg << "Mesh missing group of vertices '" << label()
-          << "' for fault interface condition.";
-      throw std::runtime_error(msg.str());
-    } // if  
-    const ALE::Obj<topology::Mesh::IntSection>& groupField = 
-      sieveMesh->getIntSection(label());
-    assert(!groupField.isNull());
-    CohesiveTopology::createFault(&faultMesh, faultBoundary, *mesh, groupField, 
-				  flipFault);
-
-    CohesiveTopology::create(mesh, faultMesh, faultBoundary, groupField, id(), 
-                             *firstFaultVertex, *firstLagrangeVertex, *firstFaultCell, useLagrangeConstraints());
-
-  } else {
-    //std::cout << "BEFORE ADJUSTING TOPOLOGY FOR FAULT '" << label() << "' firstFaultVertex: " << *firstFaultVertex << ", firstFaultCell: " << *firstFaultCell << std::endl;
-
-    const int faultDim = 2;
-    assert(3 == mesh->dimension());
-
-    meshio::UCDFaultFile::read(_faultMeshFilename.c_str(),
-			       &faultMesh, faultBoundary, *mesh);
-
-    // Set coordinates in fault mesh
-    const ALE::Obj<topology::SubMesh::SieveMesh>& faultSieveMesh = 
-      faultMesh.sieveMesh();
-    assert(!faultSieveMesh.isNull());
-    faultSieveMesh->setRealSection("coordinates", 
-				   sieveMesh->getRealSection("coordinates"));
-
-    const ALE::Obj<topology::Mesh::IntSection>& groupField = 
-      sieveMesh->getIntSection(label());
-    assert(!groupField.isNull());
-    CohesiveTopology::create(mesh, faultMesh, faultBoundary, groupField, id(),
-                             *firstFaultVertex, *firstLagrangeVertex, *firstFaultCell, useLagrangeConstraints());
-
-    //std::cout << "AFTER ADJUSTING TOPOLOGY FOR FAULT '" << label() << "' firstFaultVertex: " << *firstFaultVertex << ", firstFaultCell: " << *firstFaultCell << std::endl;
-  } // if/else
+    // Get group of vertices associated with fault
+    const ALE::Obj<topology::Mesh::SieveMesh>& sieveMesh = mesh->sieveMesh();
+    assert(!sieveMesh.isNull());
+    
+    if (!_useFaultMesh) {
+      if (!sieveMesh->hasIntSection(label())) {
+	std::ostringstream msg;
+	msg << "Mesh missing group of vertices '" << label()
+	    << "' for fault interface condition.";
+	throw std::runtime_error(msg.str());
+      } // if  
+      const ALE::Obj<topology::Mesh::IntSection>& groupField = 
+	sieveMesh->getIntSection(label());
+      assert(!groupField.isNull());
+      CohesiveTopology::createFault(&faultMesh, faultBoundary, *mesh, groupField, 
+				    flipFault);
+      
+      CohesiveTopology::create(mesh, faultMesh, faultBoundary, groupField, id(), 
+			       *firstFaultVertex, *firstLagrangeVertex, *firstFaultCell, useLagrangeConstraints());
+      
+    } else {
+      const int faultDim = 2;
+      assert(3 == mesh->dimension());
+      
+      meshio::UCDFaultFile::read(_faultMeshFilename.c_str(),
+				 &faultMesh, faultBoundary, *mesh);
+      
+      // Set coordinates in fault mesh
+      const ALE::Obj<topology::SubMesh::SieveMesh>& faultSieveMesh = 
+	faultMesh.sieveMesh();
+      assert(!faultSieveMesh.isNull());
+      faultSieveMesh->setRealSection("coordinates", 
+				     sieveMesh->getRealSection("coordinates"));
+      
+      const ALE::Obj<topology::Mesh::IntSection>& groupField = 
+	sieveMesh->getIntSection(label());
+      assert(!groupField.isNull());
+      CohesiveTopology::create(mesh, faultMesh, faultBoundary, groupField, id(),
+			       *firstFaultVertex, *firstLagrangeVertex, *firstFaultCell, useLagrangeConstraints());
+      
+    } // if/else
+  } catch (const ALE::Exception& err) {
+    std::ostringstream msg;
+    msg << "Error occurred while adjusting topology to create cohesive cells for fault '" << label() << "'.\n"
+	<< err.message();
+    throw std::runtime_error(msg.str());
+  } catch (const std::exception& err) {
+    std::ostringstream msg;
+    msg << "Error occurred while adjusting topology to create cohesive cells for fault '" << label() << "'.\n"
+	<< err.what();
+    throw std::runtime_error(msg.str());
+  }
 } // adjustTopology
 
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveDyn.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveDyn.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveDyn.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -91,10 +91,7 @@
   _friction = 0; // :TODO: Use shared pointer
 
   delete _jacobian; _jacobian = 0;
-  if (_ksp) {
-    PetscErrorCode err = KSPDestroy(&_ksp); _ksp = 0;
-    CHECK_PETSC_ERROR(err);
-  } // if
+  PetscErrorCode err = KSPDestroy(&_ksp);CHECK_PETSC_ERROR(err);
 } // deallocate
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveLagrange.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveLagrange.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveLagrange.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1422,7 +1422,7 @@
   PetscLogFlops(count * orientationSize * 4);
 
   err = VecGetArray(orientationVec, &orientationArray);CHECK_PETSC_ERROR(err);
-  if (1 == cohesiveDim && vEnd > vStart) {
+  if (1 == cohesiveDim) {
     // Default sense of positive slip is left-lateral and
     // fault-opening.
     // 
@@ -1442,25 +1442,32 @@
     // 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(vEnd > vStart);
     PetscInt off;
-
+    int flipLocal = 0;
+    if (vEnd > vStart) {
     err = PetscSectionGetOffset(orientationSection, vStart, &off);CHECK_PETSC_ERROR(err);
-    for(PetscInt d = 0; d < orientationSize; ++d) {
+    for (PetscInt d = 0; d < orientationSize; ++d) {
       orientationVertex[d] = orientationArray[off+d];
-    }
+    } // for
 
-    assert(2 == spaceDim);
-    const PylithScalar* shearDirVertex = &orientationVertex[0];
-    const PylithScalar* normalDirVertex = &orientationVertex[2];
-    const PylithScalar shearDirDot = 
-      upDir[0] * shearDirVertex[0] + upDir[1] * shearDirVertex[1];
-    const PylithScalar normalDirDot = 
-      upDir[0] * normalDirVertex[0] + upDir[1] * normalDirVertex[1];
+      assert(2 == spaceDim);
+      const PylithScalar* shearDirVertex = &orientationVertex[0];
+      const PylithScalar* normalDirVertex = &orientationVertex[2];
+      const PylithScalar shearDirDot = 
+	upDir[0] * shearDirVertex[0] + upDir[1] * shearDirVertex[1];
+      const PylithScalar normalDirDot = 
+	upDir[0] * normalDirVertex[0] + upDir[1] * normalDirVertex[1];
+      if (normalDirDot * shearDirDot < 0.0) {
+	flipLocal = 1;
+      } // if
+    } // if
+    // Collect flip decisions across all processors
+    int flipGlobal = 0;
+   MPI_Allreduce(&flipLocal, &flipGlobal, 1, MPI_INT, MPI_SUM, ((PetscObject) faultDMMesh)->comm);
 
     const int ishear = 0;
     const int inormal = 2;
-    if (normalDirDot * shearDirDot < 0.0) {
+    if (flipGlobal > 0) { // flip in any processor wants to flip
       // Flip shear direction
       for(PetscInt v = vStart; v < vEnd; ++v) {
         PetscInt dof;
@@ -1482,11 +1489,7 @@
       PetscLogFlops(3 + count * 2);
     } // if
 
-  } else if (2 == cohesiveDim && vEnd > vStart) {
-    // Check orientation of first vertex, if dot product of fault
-    // normal with preferred normal is negative, flip up/down dip
-    // direction.
-    //
+  } else if (2 == cohesiveDim) {
     // Check orientation of first vertex, (1) if dot product of the
     // normal-dir with preferred up-dir is positive, then we want dot
     // product of shear-dir and preferred up-dir to be positive and
@@ -1500,35 +1503,43 @@
     // 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(vEnd > vStart);
     PetscInt off;
 
-    err = PetscSectionGetOffset(orientationSection, vStart, &off);CHECK_PETSC_ERROR(err);
-    for(PetscInt d = 0; d < orientationSize; ++d) {
-      orientationVertex[d] = orientationArray[off+d];
-    }
+    int flipLocal = 0;
+    if (vEnd > vStart) {
+      err = PetscSectionGetOffset(orientationSection, vStart, &off);CHECK_PETSC_ERROR(err);
+      for (PetscInt d = 0; d < orientationSize; ++d) {
+	orientationVertex[d] = orientationArray[off+d];
+      } // for
+      
+      assert(3 == spaceDim);
+      const PylithScalar* dipDirVertex = &orientationVertex[3];
+      const PylithScalar* normalDirVertex = &orientationVertex[6];
+      const PylithScalar dipDirDot = 
+	upDir[0]*dipDirVertex[0] + 
+	upDir[1]*dipDirVertex[1] + 
+	upDir[2]*dipDirVertex[2];
+      const PylithScalar normalDirDot = 
+	upDir[0]*normalDirVertex[0] +
+	upDir[1]*normalDirVertex[1] +
+	upDir[2]*normalDirVertex[2];
 
-    assert(3 == spaceDim);
-    const PylithScalar* dipDirVertex = &orientationVertex[3];
-    const PylithScalar* normalDirVertex = &orientationVertex[6];
-    const PylithScalar dipDirDot = 
-      upDir[0]*dipDirVertex[0] + 
-      upDir[1]*dipDirVertex[1] + 
-      upDir[2]*dipDirVertex[2];
-    const PylithScalar normalDirDot = 
-      upDir[0]*normalDirVertex[0] +
-      upDir[1]*normalDirVertex[1] +
-      upDir[2]*normalDirVertex[2];
+      if (dipDirDot * normalDirDot < 0.0 || fabs(normalDirVertex[2] + 1.0) < 0.001) {
+	// if fault normal is (0,0,+-1) then up-dir dictates reverse
+	// motion for case with normal (0,0,1), so we reverse the dip-dir
+	// if we have (0,0,-1).
+	flipLocal = 1;
+      } // if
+    } // if
 
+    // Collect flip decisions across all processors
+    int flipGlobal = 0;
+    MPI_Allreduce(&flipLocal, &flipGlobal, 1, MPI_INT, MPI_SUM, ((PetscObject) faultDMMesh)->comm);
+
     const int istrike = 0;
     const int idip = 3;
     const int inormal = 6;
-    if (dipDirDot * normalDirDot < 0.0 ||
-	fabs(normalDirVertex[2] + 1.0) < 0.001) {
-      // if fault normal is (0,0,+-1) then up-dir dictates reverse
-      // motion for case with normal (0,0,1), so we reverse the dip-dir
-      // if we have (0,0,-1).
-
+    if (flipGlobal > 0) { // flip in any processor wants to flip
       // Flip dip direction
       for(PetscInt v = vStart; v < vEnd; ++v) {
         PetscInt dof;

Modified: short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveLagrange.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveLagrange.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/faults/FaultCohesiveLagrange.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -278,16 +278,6 @@
 			       const topology::Jacobian& jacobian,
 			       const topology::SolutionFields& fields);
 
-  // PROTECTED MEMBERS //////////////////////////////////////////////////
-protected :
-
-  /// Array of cohesive vertex information.
-  std::vector<CohesiveInfo> _cohesiveVertices;
-
-  /// 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;
-
   // PRIVATE METHODS ////////////////////////////////////////////////////
 private :
 
@@ -305,6 +295,16 @@
   /// Calculate fault area field.
   void _calcArea(void);
 
+  // PROTECTED MEMBERS //////////////////////////////////////////////////
+protected :
+
+  /// Array of cohesive vertex information.
+  std::vector<CohesiveInfo> _cohesiveVertices;
+
+  /// 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;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/faults/TopologyOps.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/faults/TopologyOps.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/faults/TopologyOps.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -116,7 +116,12 @@
     }
     assert(classifySize < vReplaceCells.size() + vNoReplaceCells.size());
     classifySize = vReplaceCells.size() + vNoReplaceCells.size();
-    assert(classifySize <= classifyTotal);
+    if (classifySize > classifyTotal) {
+      std::ostringstream msg;
+      msg << "Error classifying cells during creation of cohesive cells.\n"
+	  << "  classifySize: " << classifySize << ", classifyTotal: " << classifyTotal;
+      throw std::logic_error(msg.str());
+    } // if
   }
   replaceCells.insert(vReplaceCells.begin(), vReplaceCells.end());
   // More checking

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/CellGeometry.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/CellGeometry.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/CellGeometry.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -151,6 +151,14 @@
 		const int dim,
 		const int npts) const = 0;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  virtual
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const = 0;
+
   /** Compute orientation of cell at location.
    *
    * The orientation is returned as an array of direction cosines

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -25,8 +25,7 @@
 // ----------------------------------------------------------------------
 // Default constructor.
 pylith::feassemble::Constraint::Constraint(void) :
-  _normalizer(new spatialdata::units::Nondimensional),
-  _useSolnIncr(false)
+  _normalizer(new spatialdata::units::Nondimensional)
 { // constructor
 } // constructor
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,14 +59,6 @@
    */
   void normalizer(const spatialdata::units::Nondimensional& dim);
 
-  /** Set flag for setting constraints for total field solution or
-   *  incremental field solution.
-   *
-   * @param flag True if using incremental solution, false otherwise.
-   */
-  virtual
-  void useSolnIncr(const bool flag);
-
   /** Get number of constraints per location.
    *
    * @returns Number of constraints per location.
@@ -113,10 +105,6 @@
 
   spatialdata::units::Nondimensional* _normalizer; ///< Nondimensionalizer.
 
-  /// Flag indicating whether to set constraints for a total field
-  /// solution or an incremental field solution
-  bool _useSolnIncr;
-
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.icc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/Constraint.icc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -20,14 +20,6 @@
 #error "Constraint.icc must be included only from Constraint.hh"
 #else
 
-// Set flag for setting constraints for total field solution or
-inline
-void
-pylith::feassemble::Constraint::useSolnIncr(const bool flag) {
-  _useSolnIncr = flag;
-} // useSolnIncr
-
-
 #endif
 
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicit.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicit.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicit.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -83,6 +83,15 @@
 } // timeStep
 
 // ----------------------------------------------------------------------
+// Get stable time step for advancing from time t to time t+dt.
+PylithScalar
+pylith::feassemble::ElasticityExplicit::stableTimeStep(const topology::Mesh& mesh) const
+{ // stableTimeStep
+  assert(_material);
+  return _material->stableTimeStepExplicit(mesh, _quadrature);
+} // stableTimeStep
+
+// ----------------------------------------------------------------------
 // Set normalized viscosity for numerical damping.
 void
 pylith::feassemble::ElasticityExplicit::normViscosity(const PylithScalar viscosity)
@@ -97,25 +106,11 @@
 } // normViscosity
 
 // ----------------------------------------------------------------------
-// Set flag for setting constraints for total field solution or
-// incremental field solution.
-void
-pylith::feassemble::ElasticityExplicit::useSolnIncr(const bool flag)
-{ // useSolnIncr
-  _material->useElasticBehavior(false);
-  if (!flag)
-    throw std::logic_error("Non-incremental solution not supported for "
-			   "explicit time integration of elasticity "
-			   "equation.");
-} // useSolnIncr
-
-// ----------------------------------------------------------------------
 // Integrate constributions to residual term (r) for operator.
 void
-pylith::feassemble::ElasticityExplicit::integrateResidual(
-			  const topology::Field<topology::Mesh>& residual,
-			  const PylithScalar t,
-			  topology::SolutionFields* const fields)
+pylith::feassemble::ElasticityExplicit::integrateResidual(const topology::Field<topology::Mesh>& residual,
+							  const PylithScalar t,
+							  topology::SolutionFields* const fields)
 { // integrateResidual
   /// Member prototype for _elasticityResidualXD()
   typedef void (pylith::feassemble::ElasticityExplicit::*elasticityResidual_fn_type)
@@ -153,284 +148,6 @@
    */
   if (cellDim != spaceDim)
     throw std::logic_error("Integration for cells with spatial dimensions "
-			   "different than the spatial dimension of the "
-			   "domain not implemented yet.");
-
-  // Set variables dependent on dimension of cell
-  totalStrain_fn_type calcTotalStrainFn;
-  elasticityResidual_fn_type elasticityResidualFn;
-  switch (cellDim) {
-  case 1 :
-    elasticityResidualFn = 
-      &pylith::feassemble::ElasticityExplicit::_elasticityResidual1D;
-    calcTotalStrainFn = 
-      &pylith::feassemble::IntegratorElasticity::_calcTotalStrain1D;
-    break;
-  case 2 :
-    elasticityResidualFn = 
-      &pylith::feassemble::ElasticityExplicit::_elasticityResidual2D;
-    calcTotalStrainFn = 
-      &pylith::feassemble::IntegratorElasticity::_calcTotalStrain2D;
-    break;
-  case 3 :
-    elasticityResidualFn = 
-      &pylith::feassemble::ElasticityExplicit::_elasticityResidual3D;
-    calcTotalStrainFn = 
-      &pylith::feassemble::IntegratorElasticity::_calcTotalStrain3D;
-    break;
-  default :
-    assert(0);
-    throw std::logic_error("Unknown cellDim in "
-			   "ElasticityExplicit::integrateResidual.");
-  } // switch
-
-  // Allocate vectors for cell values.
-  scalar_array strainCell(numQuadPts*tensorSize);
-  strainCell = 0.0;
-  scalar_array gravVec(spaceDim);
-  scalar_array quadPtsGlobal(numQuadPts*spaceDim);
-
-  // Get cell information
-  DM              dmMesh = fields->mesh().dmMesh();
-  IS              cellIS;
-  const PetscInt *cells;
-  PetscInt        numCells;
-  PetscErrorCode  err;
-
-  assert(dmMesh);
-  err = DMComplexGetStratumIS(dmMesh, "material-id", _material->id(), &cellIS);CHECK_PETSC_ERROR(err);
-  err = ISGetSize(cellIS, &numCells);CHECK_PETSC_ERROR(err);
-  err = ISGetIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-
-  // Get sections
-  topology::Field<topology::Mesh>& acc = fields->get("acceleration(t)");
-  PetscSection accSection = acc.petscSection();
-  Vec          accVec     = acc.localVector();
-  assert(accSection);assert(accVec);
-
-  topology::Field<topology::Mesh>& vel = fields->get("velocity(t)");
-  PetscSection velSection = vel.petscSection();
-  Vec          velVec     = vel.localVector();
-  assert(velSection);assert(velVec);
-  
-  scalar_array dispAdjCell(numBasis*spaceDim);
-  topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
-  PetscSection dispTSection = dispT.petscSection();
-  Vec          dispTVec     = dispT.localVector();
-  assert(dispTSection);assert(dispTVec);
-
-  PetscSection residualSection = residual.petscSection();
-  Vec          residualVec     = residual.localVector();
-
-  scalar_array coordinatesCell(numBasis*spaceDim);
-  PetscSection coordSection;
-  Vec          coordVec;
-  err = DMComplexGetCoordinateSection(dmMesh, &coordSection);CHECK_PETSC_ERROR(err);
-  err = DMGetCoordinatesLocal(dmMesh, &coordVec);CHECK_PETSC_ERROR(err);
-  assert(coordSection);assert(coordVec);
-
-  assert(0 != _normalizer);
-  const PylithScalar lengthScale = _normalizer->lengthScale();
-  const PylithScalar gravityScale = 
-    _normalizer->pressureScale() / (_normalizer->lengthScale() *
-				    _normalizer->densityScale());
-
-  const PylithScalar dt = _dt;
-  assert(_normViscosity > 0.0);
-  assert(dt > 0);
-  const PylithScalar viscosity = dt*_normViscosity;
-
-  _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventBegin(computeEvent);
-#endif
-
-  // Loop over cells
-  for(PetscInt c = 0; c < numCells; ++c) {
-    const PetscInt cell = cells[c];
-    // Compute geometry information for current cell
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(geometryEvent);
-#endif
-#if defined(PRECOMPUTE_GEOMETRY)
-    _quadrature->retrieveGeometry(cell);
-#else
-    const PetscScalar *coords;
-    PetscInt           coordsSize;
-    err = DMComplexVecGetClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-    for(PetscInt i = 0; i < coordsSize; ++i) {coordinatesCell[i] = coords[i];}
-    _quadrature->computeGeometry(coordinatesCell, cell);
-    err = DMComplexVecRestoreClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-#endif
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(geometryEvent);
-    _logger->eventBegin(stateVarsEvent);
-#endif
-
-    // Get state variables for cell.
-    _material->retrievePropsAndVars(cell);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(stateVarsEvent);
-    _logger->eventBegin(restrictEvent);
-#endif
-
-    // Reset element vector to zero
-    _resetCellVector();
-
-    // Restrict input fields to cell
-    const PetscScalar *accArray, *velArray, *dispTArray;
-    PetscInt           accSize,   velSize,   dispTSize;
-    err = DMComplexVecGetClosure(dmMesh, accSection,   accVec,   cell, &accSize,   &accArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecGetClosure(dmMesh, velSection,   velVec,   cell, &velSize,   &velArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecGetClosure(dmMesh, dispTSection, dispTVec, cell, &dispTSize, &dispTArray);CHECK_PETSC_ERROR(err);
-    assert(velSize   == accSize);
-    assert(dispTSize == accSize);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(restrictEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    // Get cell geometry information that depends on cell
-    const scalar_array& basis = _quadrature->basis();
-    const scalar_array& basisDeriv = _quadrature->basisDeriv();
-    const scalar_array& jacobianDet = _quadrature->jacobianDet();
-    const scalar_array& quadPtsNondim = _quadrature->quadPts();
-
-    // Compute body force vector if gravity is being used.
-    if (0 != _gravityField) {
-      const spatialdata::geocoords::CoordSys* cs = fields->mesh().coordsys();
-      assert(0 != cs);
-
-      // Get density at quadrature points for this cell
-      const scalar_array& density = _material->calcDensity();
-
-      quadPtsGlobal = quadPtsNondim;
-      _normalizer->dimensionalize(&quadPtsGlobal[0], quadPtsGlobal.size(), lengthScale);
-
-      // Compute action for element body forces
-      spatialdata::spatialdb::SpatialDB* db = _gravityField;
-      for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
-        const int err = db->query(&gravVec[0], gravVec.size(),
-            &quadPtsGlobal[0], spaceDim, cs);
-        if (err)
-          throw std::runtime_error("Unable to get gravity vector for point.");
-        _normalizer->nondimensionalize(&gravVec[0], gravVec.size(), gravityScale);
-        const PylithScalar wt = quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad];
-        for (int iBasis = 0, iQ = iQuad * numBasis; iBasis < numBasis; ++iBasis) {
-          const PylithScalar valI = wt * basis[iQ + iBasis];
-          for (int iDim = 0; iDim < spaceDim; ++iDim) {
-            _cellVector[iBasis * spaceDim + iDim] += valI * gravVec[iDim];
-          } // for
-        } // for
-      } // for
-      PetscLogFlops(numQuadPts * (2 + numBasis * (1 + 2 * spaceDim)));
-    } // if
-
-    // Compute action for inertial terms
-    const scalar_array& density = _material->calcDensity();
-    for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
-      const PylithScalar wt = quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad];
-      for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
-        const PylithScalar valI = wt * basis[iQuad*numBasis+iBasis];
-        for (int jBasis = 0; jBasis < numBasis; ++jBasis) {
-          const PylithScalar valIJ = valI * basis[iQuad*numBasis+jBasis];
-          for (int iDim = 0; iDim < spaceDim; ++iDim)
-            _cellVector[iBasis*spaceDim+iDim] -= valIJ * 
-              accArray[jBasis*spaceDim+iDim];
-        } // for
-      } // for
-    } // for
-#if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(numQuadPts*(2+numBasis*(1+numBasis*(2*spaceDim))));
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(stressEvent);
-#endif
-
-    // Numerical damping. Compute displacements adjusted by velocity
-    // times normalized viscosity.
-    for(PetscInt i = 0; i < dispTSize; ++i) {dispAdjCell[i] = dispTArray[i] + viscosity * velArray[i];}
-    err = DMComplexVecRestoreClosure(dmMesh, accSection,   accVec,   cell, &accSize,   &accArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecRestoreClosure(dmMesh, velSection,   velVec,   cell, &velSize,   &velArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecRestoreClosure(dmMesh, dispTSection, dispTVec, cell, &dispTSize, &dispTArray);CHECK_PETSC_ERROR(err);
-
-    // Compute B(transpose) * sigma, first computing strains
-    calcTotalStrainFn(&strainCell, basisDeriv, dispAdjCell, numBasis, numQuadPts);
-
-    const scalar_array& stressCell = _material->calcStress(strainCell, false);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(stressEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    CALL_MEMBER_FN(*this, elasticityResidualFn)(stressCell);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(updateEvent);
-#endif
-
-    // Assemble cell contribution into field
-    err = DMComplexVecSetClosure(dmMesh, residualSection, residualVec, cell, &_cellVector[0], ADD_VALUES);CHECK_PETSC_ERROR(err);
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(updateEvent);
-#endif
-  } // for
-  err = ISRestoreIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-  err = ISDestroy(&cellIS);CHECK_PETSC_ERROR(err);
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  PetscLogFlops(numCells*numQuadPts*(3+numBasis*(1+numBasis*(2*spaceDim))));
-  _logger->eventEnd(computeEvent);
-#endif
-} // integrateResidual
-
-// ----------------------------------------------------------------------
-// Integrate constributions to residual term (r) for operator.
-void
-pylith::feassemble::ElasticityExplicit::integrateResidualLumped(
-        const topology::Field<topology::Mesh>& residual,
-        const PylithScalar t,
-        topology::SolutionFields* const fields)
-{ // integrateResidualLumped
-  /// Member prototype for _elasticityResidualXD()
-  typedef void (pylith::feassemble::ElasticityExplicit::*elasticityResidual_fn_type)
-    (const scalar_array&);
-
-  assert(0 != _quadrature);
-  assert(0 != _material);
-  assert(0 != _logger);
-  assert(0 != fields);
-
-  const int setupEvent = _logger->eventId("ElIR setup");
-  const int geometryEvent = _logger->eventId("ElIR geometry");
-  const int computeEvent = _logger->eventId("ElIR compute");
-  const int restrictEvent = _logger->eventId("ElIR restrict");
-  const int stateVarsEvent = _logger->eventId("ElIR stateVars");
-  const int stressEvent = _logger->eventId("ElIR stress");
-  const int updateEvent = _logger->eventId("ElIR update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Get cell geometry information that doesn't depend on cell
-  const int numQuadPts = _quadrature->numQuadPts();
-  const scalar_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
-  const int numBasis = _quadrature->numBasis();
-  const int spaceDim = _quadrature->spaceDim();
-  const int cellDim = _quadrature->cellDim();
-  const int tensorSize = _material->tensorSize();
-  /** :TODO:
-   *
-   * If cellDim and spaceDim are different, we need to transform
-   * displacements into cellDim, compute action, and transform result
-   * back into spaceDim. We get this information from the Jacobian and
-   * inverse of the Jacobian.
-   */
-  if (cellDim != spaceDim)
-    throw std::logic_error("Integration for cells with spatial dimensions "
          "different than the spatial dimension of the "
          "domain not implemented yet.");
 
@@ -509,7 +226,7 @@
             _normalizer->densityScale());
 
   const PylithScalar dt = _dt;
-  assert(_normViscosity > 0.0);
+  assert(_normViscosity >= 0.0);
   assert(dt > 0);
   const PylithScalar viscosity = dt*_normViscosity;
 
@@ -678,150 +395,7 @@
 					const PylithScalar t,
 					topology::SolutionFields* fields)
 { // integrateJacobian
-  assert(0 != _quadrature);
-  assert(0 != _material);
-  assert(0 != jacobian);
-  assert(0 != fields);
-
-  const int setupEvent = _logger->eventId("ElIJ setup");
-  const int geometryEvent = _logger->eventId("ElIJ geometry");
-  const int computeEvent = _logger->eventId("ElIJ compute");
-  const int restrictEvent = _logger->eventId("ElIJ restrict");
-  const int stateVarsEvent = _logger->eventId("ElIJ stateVars");
-  const int updateEvent = _logger->eventId("ElIJ update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Get cell geometry information that doesn't depend on cell
-  const int numQuadPts = _quadrature->numQuadPts();
-  const scalar_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
-  const int numBasis = _quadrature->numBasis();
-  const int spaceDim = _quadrature->spaceDim();
-  const int cellDim = _quadrature->cellDim();
-  if (cellDim != spaceDim)
-    throw std::logic_error("Don't know how to integrate elasticity " \
-			   "contribution to Jacobian matrix for cells with " \
-			   "different dimensions than the spatial dimension.");
-
-  // Get cell information
-  DM              dmMesh = fields->mesh().dmMesh();
-  IS              cellIS;
-  const PetscInt *cells;
-  PetscInt        numCells;
-  PetscErrorCode  err;
-
-  assert(dmMesh);
-  err = DMComplexGetStratumIS(dmMesh, "material-id", _material->id(), &cellIS);CHECK_PETSC_ERROR(err);
-  err = ISGetSize(cellIS, &numCells);CHECK_PETSC_ERROR(err);
-  err = ISGetIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-
-  // Get sections
-  PetscSection solnSection = fields->solution().petscSection();
-  Vec          solnVec     = fields->solution().localVector();
-
-  scalar_array coordinatesCell(numBasis*spaceDim);
-  PetscSection coordSection;
-  Vec          coordVec;
-  err = DMComplexGetCoordinateSection(dmMesh, &coordSection);CHECK_PETSC_ERROR(err);
-  err = DMGetCoordinatesLocal(dmMesh, &coordVec);CHECK_PETSC_ERROR(err);
-  assert(coordSection);assert(coordVec);
-
-  // Get sparse matrix
-  const PetscMat jacobianMat = jacobian->matrix();
-  assert(0 != jacobianMat);
-
-  // Get parameters used in integration.
-  const PylithScalar dt = _dt;
-  const PylithScalar dt2 = dt*dt;
-  assert(dt > 0);
-
-  _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventBegin(computeEvent);
-#endif
-
-  // Loop over cells
-  for(PetscInt c = 0; c < numCells; ++c) {
-    const PetscInt cell = cells[c];
-    // Compute geometry information for current cell
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(geometryEvent);
-#endif
-#if defined(PRECOMPUTE_GEOMETRY)
-    _quadrature->retrieveGeometry(cell);
-#else
-    const PetscScalar *coords;
-    PetscInt           coordsSize;
-    err = DMComplexVecGetClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-    for(PetscInt i = 0; i < coordsSize; ++i) {coordinatesCell[i] = coords[i];}
-    _quadrature->computeGeometry(coordinatesCell, cell);
-    err = DMComplexVecRestoreClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-#endif
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(geometryEvent);
-    _logger->eventBegin(stateVarsEvent);
-#endif
-
-    // Get state variables for cell.
-    _material->retrievePropsAndVars(cell);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(stateVarsEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    // Reset element matrix to zero
-    _resetCellMatrix();
-
-    // Get cell geometry information that depends on cell
-    const scalar_array& basis = _quadrature->basis();
-    const scalar_array& jacobianDet = _quadrature->jacobianDet();
-
-    // Get material physical properties at quadrature points for this cell
-    const scalar_array& density = _material->calcDensity();
-
-    // Compute Jacobian for inertial terms
-    for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
-      const PylithScalar wt = 
-          quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad] / dt2;
-      for (int iBasis=0, iQ=iQuad*numBasis; iBasis < numBasis; ++iBasis) {
-        const PylithScalar valI = wt*basis[iQ+iBasis];
-        for (int jBasis=0; jBasis < numBasis; ++jBasis) {
-          const PylithScalar valIJ = valI * basis[iQ+jBasis];
-          for (int iDim=0; iDim < spaceDim; ++iDim) {
-            const int iBlock = (iBasis*spaceDim + iDim) * (numBasis*spaceDim);
-            const int jBlock = (jBasis*spaceDim + iDim);
-            _cellMatrix[iBlock+jBlock] += valIJ;
-          } // for
-        } // for
-      } // for
-    } // for
-#if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(numQuadPts*(3+numBasis*(1+numBasis*(1+spaceDim))));
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(updateEvent);
-#endif
-    
-    // Assemble cell contribution into PETSc matrix.
-    err = DMComplexMatSetClosure(dmMesh, solnSection, PETSC_NULL, jacobianMat, cell, &_cellMatrix[0], ADD_VALUES);
-    CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(updateEvent);
-#endif
-  } // for
-  err = ISRestoreIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-  err = ISDestroy(&cellIS);CHECK_PETSC_ERROR(err);
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  PetscLogFlops(numCells*numQuadPts*(3+numBasis*(1+numBasis*(1+spaceDim))));
-  _logger->eventEnd(computeEvent);
-#endif
-
-  _needNewJacobian = false;
-  _material->resetNeedNewJacobian();
+  throw std::logic_error("ElasticityExplicit::integrateJacobian() not implemented. Use integrateJacobian(lumped) instead.");
 } // integrateJacobian
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicit.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicit.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicit.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -90,19 +90,21 @@
    */
   void timeStep(const PylithScalar dt);
 
+  /** Get stable time step for advancing from time t to time t+dt.
+   *
+   * Default is current time step.
+   *
+   * @param mesh Finite-element mesh.
+   * @returns Time step
+   */
+  PylithScalar stableTimeStep(const topology::Mesh& mesh) const;
+
   /** Set normalized viscosity for numerical damping.
    *
    * @param viscosity Normalized viscosity (viscosity / elastic modulus).
    */
   void normViscosity(const PylithScalar viscosity);
 
-  /** Set flag for setting constraints for total field solution or
-   *  incremental field solution.
-   *
-   * @param flag True if using incremental solution, false otherwise.
-   */
-  void useSolnIncr(const bool flag);
-
   /** Integrate contributions to residual term (r) for operator.
    *
    * @param residual Field containing values for residual
@@ -113,30 +115,9 @@
 			 const PylithScalar t,
 			 topology::SolutionFields* const fields);
 
-  /** Integrate contributions to residual term (r) for operator.
-   *
-   * @param residual Field containing values for residual
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  void integrateResidualLumped(const topology::Field<topology::Mesh>& residual,
-       const PylithScalar t,
-       topology::SolutionFields* const fields);
-
   /** Integrate contributions to Jacobian matrix (A) associated with
    * operator.
    *
-   * @param jacobian Sparse matrix for Jacobian of system.
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  void integrateJacobian(topology::Jacobian* jacobian,
-			 const PylithScalar t,
-			 topology::SolutionFields* const fields);
-
-  /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator.
-   *
    * @param jacobian Diagonal matrix (as field) for Jacobian of system.
    * @param t Current time
    * @param fields Solution fields
@@ -151,9 +132,15 @@
   /// Not implemented.
   ElasticityExplicit(const ElasticityExplicit&);
 
-  /// Not implemented
+  /// Not implemented.
   const ElasticityExplicit& operator=(const ElasticityExplicit&);
 
+  /// Not implemented.
+  void integrateJacobian(topology::Jacobian*,
+			 const PylithScalar,
+			 topology::SolutionFields* const);
+
+
 // PRIVATE MEMBERS //////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitLgDeform.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitLgDeform.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitLgDeform.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -81,6 +81,15 @@
 } // timeStep
 
 // ----------------------------------------------------------------------
+// Get stable time step for advancing from time t to time t+dt.
+PylithScalar
+pylith::feassemble::ElasticityExplicitLgDeform::stableTimeStep(const topology::Mesh& mesh) const
+{ // stableTimeStep
+  assert(_material);
+  return _material->stableTimeStepExplicit(mesh, _quadrature);
+} // stableTimeStep
+
+// ----------------------------------------------------------------------
 // Set normalized viscosity for numerical damping.
 void
 pylith::feassemble::ElasticityExplicitLgDeform::normViscosity(const PylithScalar viscosity)
@@ -95,273 +104,12 @@
 } // normViscosity
 
 // ----------------------------------------------------------------------
-// Set flag for setting constraints for total field solution or
-// incremental field solution.
-void
-pylith::feassemble::ElasticityExplicitLgDeform::useSolnIncr(const bool flag)
-{ // useSolnIncr
-  if (!flag)
-    throw std::logic_error("Non-incremental solution not supported for "
-			   "explicit time integration of elasticity "
-			   "equation.");
-} // useSolnIncr
-
-// ----------------------------------------------------------------------
 // Integrate constributions to residual term (r) for operator.
 void
 pylith::feassemble::ElasticityExplicitLgDeform::integrateResidual(
 			  const topology::Field<topology::Mesh>& residual,
 			  const PylithScalar t,
 			  topology::SolutionFields* const fields)
-{ // integrateResidual
-  /// Member prototype for _elasticityResidualXD()
-  typedef void (pylith::feassemble::ElasticityExplicitLgDeform::*elasticityResidual_fn_type)
-    (const scalar_array&, const scalar_array&);
-
-  assert(0 != _quadrature);
-  assert(0 != _material);
-  assert(0 != _logger);
-  assert(0 != fields);
-
-  const int setupEvent = _logger->eventId("ElIR setup");
-  const int geometryEvent = _logger->eventId("ElIR geometry");
-  const int computeEvent = _logger->eventId("ElIR compute");
-  const int restrictEvent = _logger->eventId("ElIR restrict");
-  const int stateVarsEvent = _logger->eventId("ElIR stateVars");
-  const int stressEvent = _logger->eventId("ElIR stress");
-  const int updateEvent = _logger->eventId("ElIR update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Get cell geometry information that doesn't depend on cell
-  const int numQuadPts = _quadrature->numQuadPts();
-  const scalar_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
-  const int numBasis = _quadrature->numBasis();
-  const int spaceDim = _quadrature->spaceDim();
-  const int cellDim = _quadrature->cellDim();
-  const int tensorSize = _material->tensorSize();
-  /** :TODO:
-   *
-   * If cellDim and spaceDim are different, we need to transform
-   * displacements into cellDim, compute action, and transform result
-   * back into spaceDim. We get this information from the Jacobian and
-   * inverse of the Jacobian.
-   */
-  if (cellDim != spaceDim)
-    throw std::logic_error("Integration for cells with spatial dimensions "
-			   "different than the spatial dimension of the "
-			   "domain not implemented yet.");
-
-  // Set variables dependent on dimension of cell
-  totalStrain_fn_type calcTotalStrainFn;
-  elasticityResidual_fn_type elasticityResidualFn;
-  if (1 == cellDim) {
-    elasticityResidualFn = 
-      &pylith::feassemble::ElasticityExplicitLgDeform::_elasticityResidual1D;
-    calcTotalStrainFn = 
-      &pylith::feassemble::IntegratorElasticityLgDeform::_calcTotalStrain1D;
-  } else if (2 == cellDim) {
-    elasticityResidualFn = 
-      &pylith::feassemble::ElasticityExplicitLgDeform::_elasticityResidual2D;
-    calcTotalStrainFn = 
-      &pylith::feassemble::IntegratorElasticityLgDeform::_calcTotalStrain2D;
-  } else if (3 == cellDim) {
-    elasticityResidualFn = 
-      &pylith::feassemble::ElasticityExplicitLgDeform::_elasticityResidual3D;
-    calcTotalStrainFn = 
-      &pylith::feassemble::IntegratorElasticityLgDeform::_calcTotalStrain3D;
-  } else
-    assert(0);
-
-  // Allocate vectors for cell values.
-  scalar_array deformCell(numQuadPts*spaceDim*spaceDim);
-  scalar_array strainCell(numQuadPts*tensorSize);
-  scalar_array gravVec(spaceDim);
-  scalar_array quadPtsGlobal(numQuadPts*spaceDim);
-
-  // Get cell information
-  DM              dmMesh = fields->mesh().dmMesh();
-  IS              cellIS;
-  const PetscInt *cells;
-  PetscInt        numCells;
-  PetscErrorCode  err;
-
-  assert(dmMesh);
-  err = DMComplexGetStratumIS(dmMesh, "material-id", _material->id(), &cellIS);CHECK_PETSC_ERROR(err);
-  err = ISGetSize(cellIS, &numCells);CHECK_PETSC_ERROR(err);
-  err = ISGetIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-
-  // Get sections
-  topology::Field<topology::Mesh>& acc = fields->get("acceleration(t)");
-  PetscSection accSection = acc.petscSection();
-  Vec          accVec     = acc.localVector();
-  assert(accSection);assert(accVec);
-
-#if 0 // Numerical damping not yet implemented
-  scalar_array velCell(numBasis*spaceDim);
-  const ALE::Obj<RealSection>& velSection = 
-    fields->get("velocity(t)").section();
-  assert(!velSection.isNull());
-  RestrictVisitor velVisitor(*velSection, velCell.size(), &velCell[0]);
-  scalar_array dispAdjCell(numBasis*spaceDim);
-#else
-  scalar_array dispTCell(numBasis*spaceDim);
-#endif
-
-  topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
-  PetscSection dispTSection = dispT.petscSection();
-  Vec          dispTVec     = dispT.localVector();
-  assert(dispTSection);assert(dispTVec);
-
-  PetscSection residualSection = residual.petscSection();
-  Vec          residualVec     = residual.localVector();
-
-  scalar_array coordinatesCell(numBasis*spaceDim);
-  PetscSection coordSection;
-  Vec          coordVec;
-  err = DMComplexGetCoordinateSection(dmMesh, &coordSection);CHECK_PETSC_ERROR(err);
-  err = DMGetCoordinatesLocal(dmMesh, &coordVec);CHECK_PETSC_ERROR(err);
-  assert(coordSection);assert(coordVec);
-
-  assert(0 != _normalizer);
-  const PylithScalar lengthScale = _normalizer->lengthScale();
-  const PylithScalar gravityScale = 
-    _normalizer->pressureScale() / (_normalizer->lengthScale() *
-				    _normalizer->densityScale());
-
-  const PylithScalar dt = _dt;
-  assert(_normViscosity > 0.0);
-  assert(dt > 0);
-  const PylithScalar viscosity = dt*_normViscosity;
-
-  _logger->eventEnd(setupEvent);
-  _logger->eventBegin(computeEvent);
-
-  // Loop over cells
-  for(PetscInt c = 0; c < numCells; ++c) {
-    const PetscInt cell = cells[c];
-    // Compute geometry information for current cell
-#if defined(PRECOMPUTE_GEOMETRY)
-    _quadrature->retrieveGeometry(cell);
-#else
-    const PetscScalar *coords;
-    PetscInt           coordsSize;
-    err = DMComplexVecGetClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-    for(PetscInt i = 0; i < coordsSize; ++i) {coordinatesCell[i] = coords[i];}
-    _quadrature->computeGeometry(coordinatesCell, cell);
-    err = DMComplexVecRestoreClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-#endif
-
-    // Get state variables for cell.
-    _material->retrievePropsAndVars(cell);
-
-    // Reset element vector to zero
-    _resetCellVector();
-
-    // Restrict input fields to cell
-    const PetscScalar *accArray, *velArray, *dispTArray;
-    PetscInt           accSize,   velSize,   dispTSize;
-    err = DMComplexVecGetClosure(dmMesh, accSection,   accVec,   cell, &accSize,   &accArray);CHECK_PETSC_ERROR(err);
-#if 0 // Numerical damping not yet implemented.
-    err = DMComplexVecGetClosure(dmMesh, velSection,   velVec,   cell, &velSize,   &velArray);CHECK_PETSC_ERROR(err);
-    assert(velSize   == accSize);
-#endif
-    err = DMComplexVecGetClosure(dmMesh, dispTSection, dispTVec, cell, &dispTSize, &dispTArray);CHECK_PETSC_ERROR(err);
-    assert(dispTSize == accSize);
-
-    // Get cell geometry information that depends on cell
-    const scalar_array& basis = _quadrature->basis();
-    const scalar_array& basisDeriv = _quadrature->basisDeriv();
-    const scalar_array& jacobianDet = _quadrature->jacobianDet();
-    const scalar_array& quadPtsNondim = _quadrature->quadPts();
-
-    // Compute body force vector if gravity is being used.
-    if (0 != _gravityField) {
-      const spatialdata::geocoords::CoordSys* cs = fields->mesh().coordsys();
-      assert(0 != cs);
-      
-      // Get density at quadrature points for this cell
-      const scalar_array& density = _material->calcDensity();
-
-      quadPtsGlobal = quadPtsNondim;
-      _normalizer->dimensionalize(&quadPtsGlobal[0], quadPtsGlobal.size(),
-				  lengthScale);
-
-      // Compute action for element body forces
-      spatialdata::spatialdb::SpatialDB* db = _gravityField;
-      for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
-	const int err = db->query(&gravVec[0], gravVec.size(),
-					     &quadPtsGlobal[0], spaceDim, cs);
-	if (err)
-	  throw std::runtime_error("Unable to get gravity vector for point.");
-	_normalizer->nondimensionalize(&gravVec[0], gravVec.size(), 
-				       gravityScale);
-	const PylithScalar wt = quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad];
-	for (int iBasis=0, iQ=iQuad*numBasis;
-	     iBasis < numBasis; ++iBasis) {
-	  const PylithScalar valI = wt*basis[iQ+iBasis];
-	  for (int iDim=0; iDim < spaceDim; ++iDim) {
-	    _cellVector[iBasis*spaceDim+iDim] += valI*gravVec[iDim];
-	  } // for
-	} // for
-      } // for
-      PetscLogFlops(numQuadPts*(2+numBasis*(1+2*spaceDim)));
-    } // if
-
-    // Compute action for inertial terms
-    const scalar_array& density = _material->calcDensity();
-    for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
-      const PylithScalar wt = 
-	quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad];
-      for (int iBasis=0; iBasis < numBasis; ++iBasis) {
-        const PylithScalar valI = wt*basis[iQuad*numBasis+iBasis];
-        for (int jBasis=0; jBasis < numBasis; ++jBasis) {
-          const PylithScalar valIJ = valI * basis[iQuad*numBasis+jBasis];
-          for (int iDim=0; iDim < spaceDim; ++iDim)
-            _cellVector[iBasis*spaceDim+iDim] -= 
-	      valIJ * accArray[jBasis*spaceDim+iDim];
-        } // for
-      } // for
-    } // for
-    PetscLogFlops(numQuadPts*(2+numBasis*(1+numBasis*(2*spaceDim))));
-
-#if 0 // Numerical damping not yet implemented. Is small strain
-      // formulation compatible with numerical damping?
-
-    // Numerical damping. Compute displacements adjusted by velocity
-    // times normalized viscosity.
-    for(PetscInt i = 0; i < dispTSize; ++i) {dispAdjCell[i] = dispTArray[i] + viscosity * velArray[i];}
-    err = DMComplexVecRestoreClosure(dmMesh, velSection,   velVec,   cell, &velSize,   &velArray);CHECK_PETSC_ERROR(err);
-#else
-    for(PetscInt i = 0; i < dispTSize; ++i) {dispTCell[i] = dispTArray[i];}
-#endif
-    err = DMComplexVecRestoreClosure(dmMesh, accSection,   accVec,   cell, &accSize,   &accArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecRestoreClosure(dmMesh, dispTSection, dispTVec, cell, &dispTSize, &dispTArray);CHECK_PETSC_ERROR(err);
-
-    // Compute B(transpose) * sigma, first computing strains
-    _calcDeformation(&deformCell, basisDeriv, coordinatesCell, dispTCell, numBasis, numQuadPts, spaceDim);
-    calcTotalStrainFn(&strainCell, deformCell, numQuadPts);
-    const scalar_array& stressCell = _material->calcStress(strainCell, true);
-
-    CALL_MEMBER_FN(*this, elasticityResidualFn)(stressCell, dispTCell);
-
-    // Assemble cell contribution into field
-    err = DMComplexVecSetClosure(dmMesh, residualSection, residualVec, cell, &_cellVector[0], ADD_VALUES);CHECK_PETSC_ERROR(err);
-  } // for
-  err = ISRestoreIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-  err = ISDestroy(&cellIS);CHECK_PETSC_ERROR(err);
-
-  _logger->eventEnd(computeEvent);
-} // integrateResidual
-
-// ----------------------------------------------------------------------
-// Integrate constributions to residual term (r) for operator.
-void
-pylith::feassemble::ElasticityExplicitLgDeform::integrateResidualLumped(
-			  const topology::Field<topology::Mesh>& residual,
-			  const PylithScalar t,
-			  topology::SolutionFields* const fields)
 { // integrateResidualLumped
   /// Member prototype for _elasticityResidualXD()
   typedef void (pylith::feassemble::ElasticityExplicitLgDeform::*elasticityResidual_fn_type)
@@ -447,15 +195,11 @@
   Vec          accVec     = acc.localVector();
   assert(accSection);assert(accVec);
 
-#if 0 // Numerical damping not yet implemented
   scalar_array dispAdjCell(numBasis*spaceDim);
   topology::Field<topology::Mesh>& vel = fields->get("velocity(t)");
   PetscSection velSection = vel.petscSection();
   Vec          velVec     = vel.localVector();
   assert(velSection);assert(velVec);
-#else
-  scalar_array dispTCell(numBasis*spaceDim);
-#endif
   
   topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
   PetscSection dispTSection = dispT.petscSection();
@@ -478,6 +222,11 @@
     _normalizer->pressureScale() / (_normalizer->lengthScale() *
 				    _normalizer->densityScale());
 
+  const PylithScalar dt = _dt;
+  assert(_normViscosity >= 0.0);
+  assert(dt > 0);
+  const PylithScalar viscosity = dt*_normViscosity;
+
   // Get parameters used in integration.
   scalar_array valuesIJ(numBasis);
 
@@ -509,10 +258,8 @@
     const PetscScalar *accArray, *velArray, *dispTArray;
     PetscInt           accSize,   velSize,   dispTSize;
     err = DMComplexVecGetClosure(dmMesh, accSection,   accVec,   cell, &accSize,   &accArray);CHECK_PETSC_ERROR(err);
-#if 0 // Numerical damping not yet implemented.
     err = DMComplexVecGetClosure(dmMesh, velSection,   velVec,   cell, &velSize,   &velArray);CHECK_PETSC_ERROR(err);
     assert(velSize   == accSize);
-#endif
     err = DMComplexVecGetClosure(dmMesh, dispTSection, dispTVec, cell, &dispTSize, &dispTArray);CHECK_PETSC_ERROR(err);
     assert(dispTSize == accSize);
 
@@ -574,25 +321,22 @@
 	  accArray[iBasis*spaceDim+iDim];
     PetscLogFlops(numQuadPts*(4+numBasis*3));
 
-#if 0 // Numerical damping not yet implemented. Is small strain
-      // formulation compatible with numerical damping?
-
     // Numerical damping. Compute displacements adjusted by velocity
     // times normalized viscosity.
-    for(PetscInt i = 0; i < dispTSize; ++i) {dispAdjCell[i] = dispTArray[i] + viscosity * velArray[i];}
+    for (PetscInt i = 0; i < dispTSize; ++i) {
+      dispAdjCell[i] = dispTArray[i] + viscosity * velArray[i];
+    } // for
     err = DMComplexVecRestoreClosure(dmMesh, velSection,   velVec,   cell, &velSize,   &velArray);CHECK_PETSC_ERROR(err);
-#else
-    for(PetscInt i = 0; i < dispTSize; ++i) {dispTCell[i] = dispTArray[i];}
-#endif
+
     err = DMComplexVecRestoreClosure(dmMesh, accSection,   accVec,   cell, &accSize,   &accArray);CHECK_PETSC_ERROR(err);
     err = DMComplexVecRestoreClosure(dmMesh, dispTSection, dispTVec, cell, &dispTSize, &dispTArray);CHECK_PETSC_ERROR(err);
 
     // Compute B(transpose) * sigma, first computing strains
-    _calcDeformation(&deformCell, basisDeriv, coordinatesCell, dispTCell, numBasis, numQuadPts, spaceDim);
+    _calcDeformation(&deformCell, basisDeriv, coordinatesCell, dispAdjCell, numBasis, numQuadPts, spaceDim);
     calcTotalStrainFn(&strainCell, deformCell, numQuadPts);
     const scalar_array& stressCell = _material->calcStress(strainCell, true);
 
-    CALL_MEMBER_FN(*this, elasticityResidualFn)(stressCell, dispTCell);
+    CALL_MEMBER_FN(*this, elasticityResidualFn)(stressCell, dispAdjCell);
     
     // Assemble cell contribution into field
     err = DMComplexVecSetClosure(dmMesh, residualSection, residualVec, cell, &_cellVector[0], ADD_VALUES);CHECK_PETSC_ERROR(err);
@@ -601,7 +345,7 @@
   err = ISDestroy(&cellIS);CHECK_PETSC_ERROR(err);
 
   _logger->eventEnd(computeEvent);
-} // integrateResidualLumped
+} // integrateResidual
 
 // ----------------------------------------------------------------------
 // Compute matrix associated with operator.
@@ -611,125 +355,7 @@
 					const PylithScalar t,
 					topology::SolutionFields* fields)
 { // integrateJacobian
-  assert(0 != _quadrature);
-  assert(0 != _material);
-  assert(0 != jacobian);
-  assert(0 != fields);
-
-  const int setupEvent = _logger->eventId("ElIJ setup");
-  const int geometryEvent = _logger->eventId("ElIJ geometry");
-  const int computeEvent = _logger->eventId("ElIJ compute");
-  const int restrictEvent = _logger->eventId("ElIJ restrict");
-  const int stateVarsEvent = _logger->eventId("ElIJ stateVars");
-  const int updateEvent = _logger->eventId("ElIJ update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Get cell geometry information that doesn't depend on cell
-  const int numQuadPts = _quadrature->numQuadPts();
-  const scalar_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
-  const int numBasis = _quadrature->numBasis();
-  const int spaceDim = _quadrature->spaceDim();
-  const int cellDim = _quadrature->cellDim();
-  const int tensorSize = _material->tensorSize();
-  if (cellDim != spaceDim)
-    throw std::logic_error("Don't know how to integrate elasticity " \
-			   "contribution to Jacobian matrix for cells with " \
-			   "different dimensions than the spatial dimension.");
-
-  // Get cell information
-  DM              dmMesh = fields->mesh().dmMesh();
-  IS              cellIS;
-  const PetscInt *cells;
-  PetscInt        numCells;
-  PetscErrorCode  err;
-
-  assert(dmMesh);
-  err = DMComplexGetStratumIS(dmMesh, "material-id", _material->id(), &cellIS);CHECK_PETSC_ERROR(err);
-  err = ISGetSize(cellIS, &numCells);CHECK_PETSC_ERROR(err);
-  err = ISGetIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-
-  // Get sections
-  PetscSection solnSection = fields->solution().petscSection();
-  Vec          solnVec     = fields->solution().localVector();
-
-  scalar_array coordinatesCell(numBasis*spaceDim);
-  PetscSection coordSection;
-  Vec          coordVec;
-  err = DMComplexGetCoordinateSection(dmMesh, &coordSection);CHECK_PETSC_ERROR(err);
-  err = DMGetCoordinatesLocal(dmMesh, &coordVec);CHECK_PETSC_ERROR(err);
-  assert(coordSection);assert(coordVec);
-
-  // Get sparse matrix
-  const PetscMat jacobianMat = jacobian->matrix();
-  assert(0 != jacobianMat);
-
-  // Get parameters used in integration.
-  const PylithScalar dt = _dt;
-  const PylithScalar dt2 = dt*dt;
-  assert(dt > 0);
-
-  _logger->eventEnd(setupEvent);
-  _logger->eventBegin(computeEvent);
-
-  // Loop over cells
-  for(PetscInt c = 0; c < numCells; ++c) {
-    const PetscInt cell = cells[c];
-    // Compute geometry information for current cell
-#if defined(PRECOMPUTE_GEOMETRY)
-    _quadrature->retrieveGeometry(cell);
-#else
-    const PetscScalar *coords;
-    PetscInt           coordsSize;
-    err = DMComplexVecGetClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-    for(PetscInt i = 0; i < coordsSize; ++i) {coordinatesCell[i] = coords[i];}
-    _quadrature->computeGeometry(coordinatesCell, cell);
-    err = DMComplexVecRestoreClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-#endif
-
-    // Get state variables for cell.
-    _material->retrievePropsAndVars(cell);
-
-    // Reset element matrix to zero
-    _resetCellMatrix();
-
-    // Get cell geometry information that depends on cell
-    const scalar_array& basis = _quadrature->basis();
-    const scalar_array& jacobianDet = _quadrature->jacobianDet();
-
-    // Get material physical properties at quadrature points for this cell
-    const scalar_array& density = _material->calcDensity();
-
-    // Compute Jacobian for inertial terms
-    for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
-      const PylithScalar wt = 
-	quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad] / dt2;
-      for (int iBasis=0, iQ=iQuad*numBasis; iBasis < numBasis; ++iBasis) {
-        const PylithScalar valI = wt*basis[iQ+iBasis];
-        for (int jBasis=0; jBasis < numBasis; ++jBasis) {
-          const PylithScalar valIJ = valI * basis[iQ+jBasis];
-          for (int iDim=0; iDim < spaceDim; ++iDim) {
-            const int iBlock = (iBasis*spaceDim + iDim) * (numBasis*spaceDim);
-            const int jBlock = (jBasis*spaceDim + iDim);
-            _cellMatrix[iBlock+jBlock] += valIJ;
-          } // for
-        } // for
-      } // for
-    } // for
-    PetscLogFlops(numQuadPts*(3+numBasis*(1+numBasis*(1+spaceDim))));
-    
-    // Assemble cell contribution into PETSc matrix.
-    err = DMComplexMatSetClosure(dmMesh, solnSection, PETSC_NULL, jacobianMat, cell, &_cellMatrix[0], ADD_VALUES);
-    CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
-  } // for
-  err = ISRestoreIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-  err = ISDestroy(&cellIS);CHECK_PETSC_ERROR(err);
-
-  _needNewJacobian = false;
-  _material->resetNeedNewJacobian();
-
-  _logger->eventEnd(computeEvent);
+  throw std::logic_error("ElasticityExplicit::integrateJacobian() not implemented. Use integrateJacobian(lumped) instead.");
 } // integrateJacobian
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitLgDeform.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitLgDeform.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitLgDeform.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,8 +69,7 @@
  * See governing equations section of user manual for more
  * information.
 */
-class pylith::feassemble::ElasticityExplicitLgDeform :
-  public IntegratorElasticityLgDeform
+class pylith::feassemble::ElasticityExplicitLgDeform : public IntegratorElasticityLgDeform
 { // ElasticityExplicitLgDeform
   friend class TestElasticityExplicitLgDeform; // unit testing
 
@@ -92,19 +91,21 @@
    */
   void timeStep(const PylithScalar dt);
 
+  /** Get stable time step for advancing from time t to time t+dt.
+   *
+   * Default is current time step.
+   *
+   * @param mesh Finite-element mesh.
+   * @returns Time step
+   */
+  PylithScalar stableTimeStep(const topology::Mesh& mesh) const;
+
   /** Set normalized viscosity for numerical damping.
    *
    * @param viscosity Normalized viscosity (viscosity / elastic modulus).
    */
   void normViscosity(const PylithScalar viscosity);
 
-  /** Set flag for setting constraints for total field solution or
-   *  incremental field solution.
-   *
-   * @param flag True if using incremental solution, false otherwise.
-   */
-  void useSolnIncr(const bool flag);
-
   /** Integrate contributions to residual term (r) for operator.
    *
    * @param residual Field containing values for residual
@@ -115,30 +116,9 @@
 			 const PylithScalar t,
 			 topology::SolutionFields* const fields);
 
-  /** Integrate contributions to residual term (r) for operator.
-   *
-   * @param residual Field containing values for residual
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  void integrateResidualLumped(const topology::Field<topology::Mesh>& residual,
-       const PylithScalar t,
-       topology::SolutionFields* const fields);
-
   /** Integrate contributions to Jacobian matrix (A) associated with
    * operator.
    *
-   * @param jacobian Sparse matrix for Jacobian of system.
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  void integrateJacobian(topology::Jacobian* jacobian,
-			 const PylithScalar t,
-			 topology::SolutionFields* const fields);
-
-  /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator.
-   *
    * @param jacobian Diagonal matrix (as field) for Jacobian of system.
    * @param t Current time
    * @param fields Solution fields
@@ -156,6 +136,12 @@
   /// Not implemented
   const ElasticityExplicitLgDeform& operator=(const ElasticityExplicitLgDeform&);
 
+  /// Not implemented.
+  void integrateJacobian(topology::Jacobian*,
+			 const PylithScalar,
+			 topology::SolutionFields* const);
+
+
 // PRIVATE MEMBERS //////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTet4.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -88,6 +88,15 @@
 } // timeStep
 
 // ----------------------------------------------------------------------
+// Get stable time step for advancing from time t to time t+dt.
+PylithScalar
+pylith::feassemble::ElasticityExplicitTet4::stableTimeStep(const topology::Mesh& mesh) const
+{ // stableTimeStep
+  assert(_material);
+  return _material->stableTimeStepExplicit(mesh, _quadrature);
+} // stableTimeStep
+
+// ----------------------------------------------------------------------
 // Set normalized viscosity for numerical damping.
 void
 pylith::feassemble::ElasticityExplicitTet4::normViscosity(const PylithScalar viscosity)
@@ -102,335 +111,13 @@
 } // normViscosity
 
 // ----------------------------------------------------------------------
-// Set flag for setting constraints for total field solution or
-// incremental field solution.
-void
-pylith::feassemble::ElasticityExplicitTet4::useSolnIncr(const bool flag)
-{ // useSolnIncr
-  _material->useElasticBehavior(false);
-  if (!flag)
-    throw std::logic_error("Non-incremental solution not supported for "
-			   "explicit time integration of elasticity "
-			   "equation.");
-} // useSolnIncr
-
-// ----------------------------------------------------------------------
 // Integrate constributions to residual term (r) for operator.
 void
 pylith::feassemble::ElasticityExplicitTet4::integrateResidual(
-			  const topology::Field<topology::Mesh>& residual,
-			  const PylithScalar t,
-			  topology::SolutionFields* const fields)
-{ // integrateResidual
-  assert(0 != _quadrature);
-  assert(0 != _material);
-  assert(0 != _logger);
-  assert(0 != fields);
-
-  const int setupEvent = _logger->eventId("ElIR setup");
-  const int geometryEvent = _logger->eventId("ElIR geometry");
-  const int computeEvent = _logger->eventId("ElIR compute");
-  const int restrictEvent = _logger->eventId("ElIR restrict");
-  const int stateVarsEvent = _logger->eventId("ElIR stateVars");
-  const int stressEvent = _logger->eventId("ElIR stress");
-  const int updateEvent = _logger->eventId("ElIR update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Get cell geometry information that doesn't depend on cell
-  assert(_quadrature->numQuadPts() == _numQuadPts);
-  const scalar_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == _numQuadPts);
-  assert(_quadrature->numBasis() == _numBasis);
-  assert(_quadrature->spaceDim() == _spaceDim);
-  assert(_quadrature->cellDim() == _cellDim);
-  assert(_material->tensorSize() == _tensorSize);
-  const int spaceDim = _spaceDim;
-  const int cellDim = _cellDim;
-  const int tensorSize = _tensorSize;
-  const int numBasis = _numBasis;
-  const int numQuadPts = _numQuadPts;
-  /** :TODO:
-   *
-   * If cellDim and spaceDim are different, we need to transform
-   * displacements into cellDim, compute action, and transform result
-   * back into spaceDim. We get this information from the Jacobian and
-   * inverse of the Jacobian.
-   */
-  if (cellDim != spaceDim)
-    throw std::logic_error("Integration for cells with spatial dimensions "
-			   "different than the spatial dimension of the "
-			   "domain not implemented yet.");
-
-  // Allocate vectors for cell values.
-  scalar_array strainCell(numQuadPts*tensorSize);
-  strainCell = 0.0;
-  scalar_array gravVec(spaceDim);
-  scalar_array quadPtsGlobal(numQuadPts*spaceDim);
-
-  // Get cell information
-  DM              dmMesh = fields->mesh().dmMesh();
-  IS              cellIS;
-  const PetscInt *cells;
-  PetscInt        numCells;
-  PetscErrorCode  err;
-
-  assert(dmMesh);
-  err = DMComplexGetStratumIS(dmMesh, "material-id", _material->id(), &cellIS);CHECK_PETSC_ERROR(err);
-  err = ISGetSize(cellIS, &numCells);CHECK_PETSC_ERROR(err);
-  err = ISGetIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-
-  // Get sections
-  topology::Field<topology::Mesh>& acc = fields->get("acceleration(t)");
-  PetscSection accSection = acc.petscSection();
-  Vec          accVec     = acc.localVector();
-  assert(accSection);assert(accVec);
-
-  topology::Field<topology::Mesh>& vel = fields->get("velocity(t)");
-  PetscSection velSection = vel.petscSection();
-  Vec          velVec     = vel.localVector();
-  assert(velSection);assert(velVec);
-
-  scalar_array dispAdjCell(numBasis*spaceDim);
-  topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
-  PetscSection dispTSection = dispT.petscSection();
-  Vec          dispTVec     = dispT.localVector();
-  assert(dispTSection);assert(dispTVec);
-
-  PetscSection residualSection = residual.petscSection();
-  Vec          residualVec     = residual.localVector();
-  
-  scalar_array coordinatesCell(numBasis*spaceDim);
-  PetscSection coordSection;
-  Vec          coordVec;
-  err = DMComplexGetCoordinateSection(dmMesh, &coordSection);CHECK_PETSC_ERROR(err);
-  err = DMGetCoordinatesLocal(dmMesh, &coordVec);CHECK_PETSC_ERROR(err);
-  assert(coordSection);assert(coordVec);
-
-  assert(0 != _normalizer);
-  const PylithScalar lengthScale = _normalizer->lengthScale();
-  const PylithScalar gravityScale = 
-    _normalizer->pressureScale() / (_normalizer->lengthScale() *
-				    _normalizer->densityScale());
-
-  const PylithScalar dt = _dt;
-  assert(_normViscosity > 0.0);
-  assert(dt > 0);
-  const PylithScalar viscosity = dt*_normViscosity;
-
-  _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventBegin(computeEvent);
-#endif
-
-  // Loop over cells
-  for(PetscInt c = 0; c < numCells; ++c) {
-    const PetscInt cell = cells[c];
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(geometryEvent);
-#endif
-
-    // Compute geometry information for current cell
-    const PetscScalar *coords;
-    PetscInt           coordsSize;
-    err = DMComplexVecGetClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-    for(PetscInt i = 0; i < coordsSize; ++i) {coordinatesCell[i] = coords[i];}
-    const PylithScalar volume = _volume(coordinatesCell);
-    assert(volume > 0.0);
-    err = DMComplexVecRestoreClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(geometryEvent);
-    _logger->eventBegin(stateVarsEvent);
-#endif
-
-    // Get state variables for cell.
-    _material->retrievePropsAndVars(cell);
-
-    #if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(stateVarsEvent);
-    _logger->eventBegin(restrictEvent);
-#endif
-
-    // Reset element vector to zero
-    _resetCellVector();
-
-    // Restrict input fields to cell
-    const PetscScalar *accArray, *velArray, *dispTArray;
-    PetscInt           accSize,   velSize,   dispTSize;
-    err = DMComplexVecGetClosure(dmMesh, accSection,   accVec,   cell, &accSize,   &accArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecGetClosure(dmMesh, velSection,   velVec,   cell, &velSize,   &velArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecGetClosure(dmMesh, dispTSection, dispTVec, cell, &dispTSize, &dispTArray);CHECK_PETSC_ERROR(err);
-    assert(velSize   == accSize);
-    assert(dispTSize == accSize);
-    
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(restrictEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    const scalar_array& density = _material->calcDensity();
-    assert(density.size() == 1);
-
-    // Compute body force vector if gravity is being used.
-    if (0 != _gravityField) {
-      const spatialdata::geocoords::CoordSys* cs = fields->mesh().coordsys();
-      assert(0 != cs);
-
-      quadPtsGlobal = 0.0;
-      for (int iBasis=0; iBasis < numBasis; ++iBasis)
-        for (int iDim=0; iDim < spaceDim; ++iDim)
-          quadPtsGlobal[iDim] += 
-	    coordinatesCell[iBasis*spaceDim+iDim] / numBasis;
-      _normalizer->dimensionalize(&quadPtsGlobal[0], quadPtsGlobal.size(),
-          lengthScale);
-
-      // Compute action for element body forces
-      spatialdata::spatialdb::SpatialDB* db = _gravityField;
-      const int err = db->query(&gravVec[0], gravVec.size(),
-        &quadPtsGlobal[0], spaceDim, cs);
-      if (err)
-        throw std::runtime_error("Unable to get gravity vector for point.");
-      _normalizer->nondimensionalize(&gravVec[0], gravVec.size(),
-          gravityScale);
-      const PylithScalar wtVertex = density[0] * volume / 4.0;
-      for (int iBasis=0; iBasis < numBasis; ++iBasis)
-        for (int iDim=0; iDim < spaceDim; ++iDim)
-            _cellVector[iBasis * spaceDim + iDim] += wtVertex * gravVec[iDim];
-      PetscLogFlops(numBasis*spaceDim*2 + numBasis*spaceDim*2);
-    } // if
-
-    // Compute action for inertial terms
-    const PylithScalar wtVertex = density[0] * volume / 16.0;
-    for (int iBasis = 0; iBasis < numBasis; ++iBasis)
-      for (int jBasis = 0; jBasis < numBasis; ++jBasis)
-        for (int iDim = 0; iDim < spaceDim; ++iDim)
-            _cellVector[iBasis*spaceDim+iDim] -= 
-	      wtVertex * accArray[jBasis*spaceDim+iDim];
-
-#if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(3 + numBasis*numBasis*spaceDim*2);
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(stressEvent);
-#endif
-
-    // Numerical damping. Compute displacements adjusted by velocity
-    // times normalized viscosity.
-    for(PetscInt i = 0; i < dispTSize; ++i) {dispAdjCell[i] = dispTArray[i] + viscosity * velArray[i];}
-    err = DMComplexVecRestoreClosure(dmMesh, accSection,   accVec,   cell, &accSize,   &accArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecRestoreClosure(dmMesh, velSection,   velVec,   cell, &velSize,   &velArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecRestoreClosure(dmMesh, dispTSection, dispTVec, cell, &dispTSize, &dispTArray);CHECK_PETSC_ERROR(err);
-
-    // Compute B(transpose) * sigma, first computing strains
-    const PylithScalar x0 = coordinatesCell[0];
-    const PylithScalar y0 = coordinatesCell[1];
-    const PylithScalar z0 = coordinatesCell[2];
-
-    const PylithScalar x1 = coordinatesCell[3];
-    const PylithScalar y1 = coordinatesCell[4];
-    const PylithScalar z1 = coordinatesCell[5];
-
-    const PylithScalar x2 = coordinatesCell[6];
-    const PylithScalar y2 = coordinatesCell[7];
-    const PylithScalar z2 = coordinatesCell[8];
-
-    const PylithScalar x3 = coordinatesCell[9];
-    const PylithScalar y3 = coordinatesCell[10];
-    const PylithScalar z3 = coordinatesCell[11];
-
-    const PylithScalar scaleB = 6.0 * volume;
-    const PylithScalar b1 = (y1*(z3-z2)-y2*z3+y3*z2-(y3-y2)*z1) / scaleB;
-    const PylithScalar c1 = (-x1*(z3-z2)+x2*z3-x3*z2-(x2-x3)*z1) / scaleB;
-    const PylithScalar d1 = (-x2*y3-x1*(y2-y3)+x3*y2+(x2-x3)*y1) / scaleB;
-
-    const PylithScalar b2 = (-y0*z3-y2*(z0-z3)+(y0-y3)*z2+y3*z0) / scaleB;
-    const PylithScalar c2 = (x0*z3+x2*(z0-z3)+(x3-x0)*z2-x3*z0) / scaleB;
-    const PylithScalar d2 = (x2*(y3-y0)-x0*y3-(x3-x0)*y2+x3*y0) / scaleB;
-
-    const PylithScalar b3 = (-(y1-y0)*z3+y3*(z1-z0)-y0*z1+y1*z0) / scaleB;
-    const PylithScalar c3 = (-(x0-x1)*z3-x3*(z1-z0)+x0*z1-x1*z0) / scaleB;
-    const PylithScalar d3 = ((x0-x1)*y3-x0*y1-x3*(y0-y1)+x1*y0) / scaleB;
-
-    const PylithScalar b4 = (-y0*(z2-z1)+y1*z2-y2*z1+(y2-y1)*z0) / scaleB;
-    const PylithScalar c4 = (x0*(z2-z1)-x1*z2+x2*z1+(x1-x2)*z0) / scaleB;
-    const PylithScalar d4 = (x1*y2+x0*(y1-y2)-x2*y1-(x1-x2)*y0) / scaleB;
-
-    assert(strainCell.size() == 6);
-    strainCell[0] = 
-      b1 * dispAdjCell[0] + b2 * dispAdjCell[3] + 
-      b3 * dispAdjCell[6] + b4 * dispAdjCell[9];
-    strainCell[1] = 
-      c3 * dispAdjCell[7] + c2 * dispAdjCell[4] + 
-      c4 * dispAdjCell[10] + c1 * dispAdjCell[1];
-    strainCell[2] = 
-      d3 * dispAdjCell[8] + d2 * dispAdjCell[5] + 
-      d1 * dispAdjCell[2] + d4 * dispAdjCell[11];
-    strainCell[3] = 
-      (c4 * dispAdjCell[9] + b3 * dispAdjCell[7] + 
-       c3 * dispAdjCell[6] + b2 * dispAdjCell[4] + 
-       c2 * dispAdjCell[3] + b4 * dispAdjCell[10] + 
-       b1 * dispAdjCell[1] + c1 * dispAdjCell[0]) / 2.0;
-    strainCell[4] = 
-      (c3 * dispAdjCell[8] + d3 * dispAdjCell[7] + 
-       c2 * dispAdjCell[5] + d2 * dispAdjCell[4] +
-       c1 * dispAdjCell[2] + c4 * dispAdjCell[11] + 
-       d4 * dispAdjCell[10] + d1 * dispAdjCell[1]) / 2.0;
-    strainCell[5] = 
-      (d4 * dispAdjCell[9] + b3 * dispAdjCell[8] + 
-       d3 * dispAdjCell[6] + b2 * dispAdjCell[5] + 
-       d2 * dispAdjCell[3] + b1 * dispAdjCell[2] + 
-       b4 * dispAdjCell[11] + d1 * dispAdjCell[0]) / 2.0;
-
-    const scalar_array& stressCell = _material->calcStress(strainCell, false);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(196);
-    _logger->eventEnd(stressEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    assert(_cellVector.size() == 12);
-    assert(stressCell.size() == 6);
-    _cellVector[0] -= (d1*stressCell[5]+c1*stressCell[3]+b1*stressCell[0]) * volume;
-    _cellVector[1] -= (d1*stressCell[4]+b1*stressCell[3]+c1*stressCell[1]) * volume;
-    _cellVector[2] -= (b1*stressCell[5]+c1*stressCell[4]+d1*stressCell[2]) * volume;
-    _cellVector[3] -= (d2*stressCell[5]+c2*stressCell[3]+b2*stressCell[0]) * volume;
-    _cellVector[4] -= (d2*stressCell[4]+b2*stressCell[3]+c2*stressCell[1]) * volume;
-    _cellVector[5] -= (b2*stressCell[5]+c2*stressCell[4]+d2*stressCell[2]) * volume;
-    _cellVector[6] -= (d3*stressCell[5]+c3*stressCell[3]+b3*stressCell[0]) * volume;
-    _cellVector[7] -= (d3*stressCell[4]+b3*stressCell[3]+c3*stressCell[1]) * volume;
-    _cellVector[8] -= (b3*stressCell[5]+c3*stressCell[4]+d3*stressCell[2]) * volume;
-    _cellVector[9] -= (d4*stressCell[5]+c4*stressCell[3]+b4*stressCell[0]) * volume;
-    _cellVector[10] -= (d4*stressCell[4]+b4*stressCell[3]+c4*stressCell[1]) * volume;
-    _cellVector[11] -= (b4*stressCell[5]+c4*stressCell[4]+d4*stressCell[2]) * volume;
-
-#if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(84);
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(updateEvent);
-#endif
-
-    // Assemble cell contribution into field
-    err = DMComplexVecSetClosure(dmMesh, residualSection, residualVec, cell, &_cellVector[0], ADD_VALUES);CHECK_PETSC_ERROR(err);
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(updateEvent);
-#endif
-  } // for
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  PetscLogFlops(numCells*(3 + numBasis*numBasis*spaceDim*2 + 196+84));
-  _logger->eventEnd(computeEvent);
-#endif
-} // integrateResidual
-
-// ----------------------------------------------------------------------
-// Integrate constributions to residual term (r) for operator.
-void
-pylith::feassemble::ElasticityExplicitTet4::integrateResidualLumped(
         const topology::Field<topology::Mesh>& residual,
         const PylithScalar t,
         topology::SolutionFields* const fields)
-{ // integrateResidualLumped
+{ // integrateResidual
   /// Member prototype for _elasticityResidualXD()
   typedef void (pylith::feassemble::ElasticityExplicitTet4::*elasticityResidual_fn_type)
     (const scalar_array&);
@@ -746,7 +433,7 @@
   PetscLogFlops(numCells*(2 + numBasis*spaceDim*2 + 196+84));
   _logger->eventEnd(computeEvent);
 #endif
-} // integrateResidualLumped
+} // integrateResidual
 
 // ----------------------------------------------------------------------
 // Compute matrix associated with operator.
@@ -756,151 +443,15 @@
 					const PylithScalar t,
 					topology::SolutionFields* fields)
 { // integrateJacobian
-  assert(0 != _quadrature);
-  assert(0 != _material);
-  assert(0 != jacobian);
-  assert(0 != fields);
-
-  const int setupEvent = _logger->eventId("ElIJ setup");
-  const int geometryEvent = _logger->eventId("ElIJ geometry");
-  const int computeEvent = _logger->eventId("ElIJ compute");
-  const int restrictEvent = _logger->eventId("ElIJ restrict");
-  const int stateVarsEvent = _logger->eventId("ElIJ stateVars");
-  const int updateEvent = _logger->eventId("ElIJ update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Get cell geometry information that doesn't depend on cell
-  const int numQuadPts = _quadrature->numQuadPts();
-  const scalar_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
-  const int numBasis = _quadrature->numBasis();
-  const int spaceDim = _quadrature->spaceDim();
-  const int cellDim = _quadrature->cellDim();
-  const int tensorSize = _material->tensorSize();
-  if (cellDim != spaceDim)
-    throw std::logic_error("Don't know how to integrate elasticity " \
-			   "contribution to Jacobian matrix for cells with " \
-			   "different dimensions than the spatial dimension.");
-
-  // Get cell information
-  DM              dmMesh = fields->mesh().dmMesh();
-  IS              cellIS;
-  const PetscInt *cells;
-  PetscInt        numCells;
-  PetscErrorCode  err;
-
-  assert(dmMesh);
-  err = DMComplexGetStratumIS(dmMesh, "material-id", _material->id(), &cellIS);CHECK_PETSC_ERROR(err);
-  err = ISGetSize(cellIS, &numCells);CHECK_PETSC_ERROR(err);
-  err = ISGetIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-
-  // Get sections
-  topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
-  PetscSection dispTSection = dispT.petscSection();
-  Vec          dispTVec     = dispT.localVector();
-  assert(dispTSection);assert(dispTVec);
-
-  // Get sparse matrix
-  const PetscMat jacobianMat = jacobian->matrix();
-  assert(0 != jacobianMat);
-
-  // Get parameters used in integration.
-  const PylithScalar dt = _dt;
-  const PylithScalar dt2 = dt*dt;
-  assert(dt > 0);
-
-  scalar_array coordinatesCell(numBasis*spaceDim);
-  PetscSection coordSection;
-  Vec          coordVec;
-  err = DMComplexGetCoordinateSection(dmMesh, &coordSection);CHECK_PETSC_ERROR(err);
-  err = DMGetCoordinatesLocal(dmMesh, &coordVec);CHECK_PETSC_ERROR(err);
-  assert(coordSection);assert(coordVec);
-
-  _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventBegin(computeEvent);
-#endif
-
-  // Loop over cells
-  for(PetscInt c = 0; c < numCells; ++c) {
-    const PetscInt cell = cells[c];
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(geometryEvent);
-#endif
-
-    // Compute geometry information for current cell
-    const PetscScalar *coords;
-    PetscInt           coordsSize;
-    err = DMComplexVecGetClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-    for(PetscInt i = 0; i < coordsSize; ++i) {coordinatesCell[i] = coords[i];}
-    const PylithScalar volume = _volume(coordinatesCell);
-    assert(volume > 0.0);
-    err = DMComplexVecRestoreClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(geometryEvent);
-    _logger->eventBegin(stateVarsEvent);
-#endif
-
-    // Get state variables for cell.
-    _material->retrievePropsAndVars(cell);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(stateVarsEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    // Reset element matrix to zero
-    _resetCellMatrix();
-
-    // Get material physical properties at quadrature points for this cell
-    const scalar_array& density = _material->calcDensity();
-    assert(density.size() == 1);
-
-    // Compute Jacobian for inertial terms
-    const PylithScalar wtVertex = density[0] * volume / (16.0 * dt2);
-    for (int iBasis = 0; iBasis < numBasis; ++iBasis)
-      for (int jBasis = 0; jBasis < numBasis; ++jBasis)
-	for (int iDim=0; iDim < spaceDim; ++iDim) {
-	  const int iBlock = (iBasis*spaceDim + iDim) * (numBasis*spaceDim);
-	  const int jBlock = (jBasis*spaceDim + iDim);
-	  _cellMatrix[iBlock+jBlock] += wtVertex;
-	} // for
-    
-#if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(numQuadPts*(3+numBasis*numBasis*spaceDim*1));
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(updateEvent);
-#endif
-    
-    // Assemble cell contribution into PETSc matrix.
-    err = DMComplexMatSetClosure(dmMesh, dispTSection, PETSC_NULL, jacobianMat, cell, &_cellMatrix[0], ADD_VALUES);
-    CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(updateEvent);
-#endif
-  } // for
-  err = ISRestoreIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-  err = ISDestroy(&cellIS);CHECK_PETSC_ERROR(err);
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  PetscLogFlops(numCells*(3+numBasis*numBasis*spaceDim*1));
-  _logger->eventEnd(computeEvent);
-#endif
-
-  _needNewJacobian = false;
-  _material->resetNeedNewJacobian();
+  throw std::logic_error("ElasticityExplicit::integrateJacobian() not implemented. Use integrateJacobian(lumped) instead.");
 } // integrateJacobian
 
 // ----------------------------------------------------------------------
 // Compute matrix associated with operator.
 void
-pylith::feassemble::ElasticityExplicitTet4::integrateJacobian(
-			    topology::Field<topology::Mesh>* jacobian,
-			    const PylithScalar t,
-			    topology::SolutionFields* fields)
+pylith::feassemble::ElasticityExplicitTet4::integrateJacobian(topology::Field<topology::Mesh>* jacobian,
+							      const PylithScalar t,
+							      topology::SolutionFields* fields)
 { // integrateJacobian
   assert(0 != _quadrature);
   assert(0 != _material);
@@ -1020,10 +571,29 @@
 } // integrateJacobian
 
 // ----------------------------------------------------------------------
+// Verify configuration is acceptable.
+void
+pylith::feassemble::ElasticityExplicitTet4::verifyConfiguration(const topology::Mesh& mesh) const
+{ // verifyConfiguration
+  IntegratorElasticity::verifyConfiguration(mesh);
+
+  assert(_quadrature);
+  assert(_material);
+  if (_spaceDim != _quadrature->spaceDim() || _cellDim != _quadrature->cellDim() || _numBasis != _quadrature->numBasis() ||  _numQuadPts != _quadrature->numQuadPts()) {
+    std::ostringstream msg;
+    msg << "User specified quadrature settings material '" << _material->label() << "' do not match ElasticityExplicitTet4 hardwired quadrature settings.\n"
+	<< "  Space dim: " << _spaceDim << " (code), " << _quadrature->spaceDim() << " (user)\n"
+	<< "  Cell dim: " << _cellDim << " (code), " << _quadrature->cellDim() << " (user)\n"
+	<< "  # basis fns: " << _numBasis << " (code), " << _quadrature->numBasis() << " (user)\n"
+	<< "  # quad points: " << _numQuadPts << " (code), " << _quadrature->numQuadPts() << " (user)";
+    throw std::runtime_error(msg.str());
+  } // if
+} // verifyConfiguration
+
+// ----------------------------------------------------------------------
 // Compute volume of tetrahedral cell.
 PylithScalar
-pylith::feassemble::ElasticityExplicitTet4::_volume(
-			     const scalar_array& coordinatesCell) const
+pylith::feassemble::ElasticityExplicitTet4::_volume(const scalar_array& coordinatesCell) const
 { // __volume
   assert(12 == coordinatesCell.size());
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTet4.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -90,19 +90,21 @@
    */
   void timeStep(const PylithScalar dt);
 
+  /** Get stable time step for advancing from time t to time t+dt.
+   *
+   * Default is current time step.
+   *
+   * @param mesh Finite-element mesh.
+   * @returns Time step
+   */
+  PylithScalar stableTimeStep(const topology::Mesh& mesh) const;
+
   /** Set normalized viscosity for numerical damping.
    *
    * @param viscosity Normalized viscosity (viscosity / elastic modulus).
    */
   void normViscosity(const PylithScalar viscosity);
 
-  /** Set flag for setting constraints for total field solution or
-   *  incremental field solution.
-   *
-   * @param flag True if using incremental solution, false otherwise.
-   */
-  void useSolnIncr(const bool flag);
-
   /** Integrate contributions to residual term (r) for operator.
    *
    * @param residual Field containing values for residual
@@ -113,37 +115,22 @@
 			 const PylithScalar t,
 			 topology::SolutionFields* const fields);
 
-  /** Integrate contributions to residual term (r) for operator.
-   *
-   * @param residual Field containing values for residual
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  void integrateResidualLumped(const topology::Field<topology::Mesh>& residual,
-       const PylithScalar t,
-       topology::SolutionFields* const fields);
-
   /** Integrate contributions to Jacobian matrix (A) associated with
    * operator.
    *
-   * @param jacobian Sparse matrix for Jacobian of system.
+   * @param jacobian Diagonal matrix (as field) for Jacobian of system.
    * @param t Current time
    * @param fields Solution fields
    */
-  void integrateJacobian(topology::Jacobian* jacobian,
+  void integrateJacobian(topology::Field<topology::Mesh>* jacobian,
 			 const PylithScalar t,
 			 topology::SolutionFields* const fields);
 
-  /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator.
+  /** Verify configuration is acceptable.
    *
-   * @param jacobian Diagonal matrix (as field) for Jacobian of system.
-   * @param t Current time
-   * @param fields Solution fields
+   * @param mesh Finite-element mesh
    */
-  void integrateJacobian(topology::Field<topology::Mesh>* jacobian,
-			 const PylithScalar t,
-			 topology::SolutionFields* const fields);
+  void verifyConfiguration(const topology::Mesh& mesh) const;
 
 // PRIVATE METHODS //////////////////////////////////////////////////////
 private :
@@ -185,6 +172,11 @@
   /// Not implemented
   const ElasticityExplicitTet4& operator=(const ElasticityExplicitTet4&);
 
+  /// Not implemented.
+  void integrateJacobian(topology::Jacobian*,
+			 const PylithScalar,
+			 topology::SolutionFields* const);
+
 }; // ElasticityExplicitTet4
 
 #endif // pylith_feassemble_elasticityexplicittet4_hh

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTri3.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -88,6 +88,15 @@
 } // timeStep
 
 // ----------------------------------------------------------------------
+// Get stable time step for advancing from time t to time t+dt.
+PylithScalar
+pylith::feassemble::ElasticityExplicitTri3::stableTimeStep(const topology::Mesh& mesh) const
+{ // stableTimeStep
+  assert(_material);
+  return _material->stableTimeStepExplicit(mesh, _quadrature);
+} // stableTimeStep
+
+// ----------------------------------------------------------------------
 // Set normalized viscosity for numerical damping.
 void
 pylith::feassemble::ElasticityExplicitTri3::normViscosity(const PylithScalar viscosity)
@@ -102,300 +111,12 @@
 } // normViscosity
 
 // ----------------------------------------------------------------------
-// Set flag for setting constraints for total field solution or
-// incremental field solution.
-void
-pylith::feassemble::ElasticityExplicitTri3::useSolnIncr(const bool flag)
-{ // useSolnIncr
-  _material->useElasticBehavior(false);
-  if (!flag)
-    throw std::logic_error("Non-incremental solution not supported for "
-			   "explicit time integration of elasticity "
-			   "equation.");
-} // useSolnIncr
-
-// ----------------------------------------------------------------------
 // Integrate constributions to residual term (r) for operator.
 void
-pylith::feassemble::ElasticityExplicitTri3::integrateResidual(
-			  const topology::Field<topology::Mesh>& residual,
-			  const PylithScalar t,
-			  topology::SolutionFields* const fields)
+pylith::feassemble::ElasticityExplicitTri3::integrateResidual(const topology::Field<topology::Mesh>& residual,
+							      const PylithScalar t,
+							      topology::SolutionFields* const fields)
 { // integrateResidual
-  assert(0 != _quadrature);
-  assert(0 != _material);
-  assert(0 != _logger);
-  assert(0 != fields);
-
-  const int setupEvent = _logger->eventId("ElIR setup");
-  const int geometryEvent = _logger->eventId("ElIR geometry");
-  const int computeEvent = _logger->eventId("ElIR compute");
-  const int restrictEvent = _logger->eventId("ElIR restrict");
-  const int stateVarsEvent = _logger->eventId("ElIR stateVars");
-  const int stressEvent = _logger->eventId("ElIR stress");
-  const int updateEvent = _logger->eventId("ElIR update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Get cell geometry information that doesn't depend on cell
-  assert(_quadrature->numQuadPts() == _numQuadPts);
-  const scalar_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == _numQuadPts);
-  assert(_quadrature->numBasis() == _numBasis);
-  assert(_quadrature->spaceDim() == _spaceDim);
-  assert(_quadrature->cellDim() == _cellDim);
-  assert(_material->tensorSize() == _tensorSize);
-  const int spaceDim = _spaceDim;
-  const int cellDim = _cellDim;
-  const int tensorSize = _tensorSize;
-  const int numBasis = _numBasis;
-  const int numQuadPts = _numQuadPts;
-  /** :TODO:
-   *
-   * If cellDim and spaceDim are different, we need to transform
-   * displacements into cellDim, compute action, and transform result
-   * back into spaceDim. We get this information from the Jacobian and
-   * inverse of the Jacobian.
-   */
-  if (cellDim != spaceDim)
-    throw std::logic_error("Integration for cells with spatial dimensions "
-			   "different than the spatial dimension of the "
-			   "domain not implemented yet.");
-
-  // Allocate vectors for cell values.
-  scalar_array strainCell(numQuadPts*tensorSize);
-  strainCell = 0.0;
-  scalar_array gravVec(spaceDim);
-  scalar_array quadPtsGlobal(numQuadPts*spaceDim);
-
-  // Get cell information
-  DM              dmMesh = fields->mesh().dmMesh();
-  IS              cellIS;
-  const PetscInt *cells;
-  PetscInt        numCells;
-  PetscErrorCode  err;
-
-  assert(dmMesh);
-  err = DMComplexGetStratumIS(dmMesh, "material-id", _material->id(), &cellIS);CHECK_PETSC_ERROR(err);
-  err = ISGetSize(cellIS, &numCells);CHECK_PETSC_ERROR(err);
-  err = ISGetIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-
-  // Get sections
-  topology::Field<topology::Mesh>& acc = fields->get("acceleration(t)");
-  PetscSection accSection = acc.petscSection();
-  Vec          accVec     = acc.localVector();
-  assert(accSection);assert(accVec);
-
-  topology::Field<topology::Mesh>& vel = fields->get("velocity(t)");
-  PetscSection velSection = vel.petscSection();
-  Vec          velVec     = vel.localVector();
-  assert(velSection);assert(velVec);
-
-  scalar_array dispAdjCell(numBasis*spaceDim);
-  topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
-  PetscSection dispTSection = dispT.petscSection();
-  Vec          dispTVec     = dispT.localVector();
-  assert(dispTSection);assert(dispTVec);
-
-  PetscSection residualSection = residual.petscSection();
-  Vec          residualVec     = residual.localVector();
-  
-  scalar_array coordinatesCell(numBasis*spaceDim);
-  PetscSection coordSection;
-  Vec          coordVec;
-  err = DMComplexGetCoordinateSection(dmMesh, &coordSection);CHECK_PETSC_ERROR(err);
-  err = DMGetCoordinatesLocal(dmMesh, &coordVec);CHECK_PETSC_ERROR(err);
-  assert(coordSection);assert(coordVec);
-
-  assert(0 != _normalizer);
-  const PylithScalar lengthScale = _normalizer->lengthScale();
-  const PylithScalar gravityScale = 
-    _normalizer->pressureScale() / (_normalizer->lengthScale() *
-				    _normalizer->densityScale());
-
-  const PylithScalar dt = _dt;
-  assert(_normViscosity > 0.0);
-  assert(dt > 0);
-  const PylithScalar viscosity = dt*_normViscosity;
-
-  _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventBegin(computeEvent);
-#endif
-
-  // Loop over cells
-  for(PetscInt c = 0; c < numCells; ++c) {
-    const PetscInt cell = cells[c];
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(geometryEvent);
-#endif
-
-    // Compute geometry information for current cell
-    const PetscScalar *coords;
-    PetscInt           coordsSize;
-    err = DMComplexVecGetClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-    for(PetscInt i = 0; i < coordsSize; ++i) {coordinatesCell[i] = coords[i];}
-    const PylithScalar area = _area(coordinatesCell);
-    assert(area > 0.0);
-    err = DMComplexVecRestoreClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(geometryEvent);
-    _logger->eventBegin(stateVarsEvent);
-#endif
-
-    // Get state variables for cell.
-    _material->retrievePropsAndVars(cell);
-
-    #if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(stateVarsEvent);
-    _logger->eventBegin(restrictEvent);
-#endif
-
-    // Reset element vector to zero
-    _resetCellVector();
-
-    // Restrict input fields to cell
-    const PetscScalar *accArray, *velArray, *dispTArray;
-    PetscInt           accSize,   velSize,   dispTSize;
-    err = DMComplexVecGetClosure(dmMesh, accSection,   accVec,   cell, &accSize,   &accArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecGetClosure(dmMesh, velSection,   velVec,   cell, &velSize,   &velArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecGetClosure(dmMesh, dispTSection, dispTVec, cell, &dispTSize, &dispTArray);CHECK_PETSC_ERROR(err);
-    assert(velSize   == accSize);
-    assert(dispTSize == accSize);
-    
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(restrictEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    const scalar_array& density = _material->calcDensity();
-    assert(density.size() == 1);
-
-    // Compute body force vector if gravity is being used.
-    if (0 != _gravityField) {
-      const spatialdata::geocoords::CoordSys* cs = fields->mesh().coordsys();
-      assert(0 != cs);
-
-      quadPtsGlobal = 0.0;
-      for (int iBasis=0; iBasis < numBasis; ++iBasis)
-        for (int iDim=0; iDim < spaceDim; ++iDim)
-          quadPtsGlobal[iDim] += 
-	    coordinatesCell[iBasis*spaceDim+iDim] / numBasis;
-      _normalizer->dimensionalize(&quadPtsGlobal[0], quadPtsGlobal.size(),
-          lengthScale);
-
-      // Compute action for element body forces
-      spatialdata::spatialdb::SpatialDB* db = _gravityField;
-      const int err = db->query(&gravVec[0], gravVec.size(),
-        &quadPtsGlobal[0], spaceDim, cs);
-      if (err)
-        throw std::runtime_error("Unable to get gravity vector for point.");
-      _normalizer->nondimensionalize(&gravVec[0], gravVec.size(),
-          gravityScale);
-      const PylithScalar wtVertex = density[0] * area / 3.0;
-      for (int iBasis=0; iBasis < numBasis; ++iBasis)
-        for (int iDim=0; iDim < spaceDim; ++iDim)
-            _cellVector[iBasis * spaceDim + iDim] += wtVertex * gravVec[iDim];
-      PetscLogFlops(numBasis*spaceDim*2 + numBasis*spaceDim*2);
-    } // if
-
-    // Compute action for inertial terms
-    const PylithScalar wtVertex = density[0] * area / 9.0;
-    for (int iBasis = 0; iBasis < numBasis; ++iBasis)
-      for (int jBasis = 0; jBasis < numBasis; ++jBasis)
-        for (int iDim = 0; iDim < spaceDim; ++iDim)
-            _cellVector[iBasis*spaceDim+iDim] -= 
-	      wtVertex * accArray[jBasis*spaceDim+iDim];
-
-#if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(3 + numBasis*numBasis*spaceDim*2);
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(stressEvent);
-#endif
-
-    // Numerical damping. Compute displacements adjusted by velocity
-    // times normalized viscosity.
-    for(PetscInt i = 0; i < dispTSize; ++i) {dispAdjCell[i] = dispTArray[i] + viscosity * velArray[i];}
-    err = DMComplexVecRestoreClosure(dmMesh, accSection,   accVec,   cell, &accSize,   &accArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecRestoreClosure(dmMesh, velSection,   velVec,   cell, &velSize,   &velArray);CHECK_PETSC_ERROR(err);
-    err = DMComplexVecRestoreClosure(dmMesh, dispTSection, dispTVec, cell, &dispTSize, &dispTArray);CHECK_PETSC_ERROR(err);
-
-    // Compute B(transpose) * sigma, first computing strains
-    const PylithScalar x0 = coordinatesCell[0];
-    const PylithScalar y0 = coordinatesCell[1];
-
-    const PylithScalar x1 = coordinatesCell[2];
-    const PylithScalar y1 = coordinatesCell[3];
-
-    const PylithScalar x2 = coordinatesCell[4];
-    const PylithScalar y2 = coordinatesCell[5];
-
-    const PylithScalar scaleB = 2.0 * area;
-    const PylithScalar b0 = (y1 - y2) / scaleB;
-    const PylithScalar c0 = (x2 - x1) / scaleB;
-
-    const PylithScalar b1 = (y2 - y0) / scaleB;
-    const PylithScalar c1 = (x0 - x2) / scaleB;
-
-    const PylithScalar b2 = (y0 - y1) / scaleB;
-    const PylithScalar c2 = (x1 - x0) / scaleB;
-
-    assert(strainCell.size() == 3);
-    strainCell[0] = b2*dispAdjCell[4] + b1*dispAdjCell[2] + b0*dispAdjCell[0];
-    
-    strainCell[1] = c2*dispAdjCell[5] + c1*dispAdjCell[3] + c0*dispAdjCell[1];
-
-    strainCell[2] = (b2*dispAdjCell[5] + c2*dispAdjCell[4] + b1*dispAdjCell[3] + 
-		     c1*dispAdjCell[2] + b0*dispAdjCell[1] + c0*dispAdjCell[0]) / 2.0;
-
-
-    const scalar_array& stressCell = _material->calcStress(strainCell, false);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(34);
-    _logger->eventEnd(stressEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    assert(_cellVector.size() == 6);
-    assert(stressCell.size() == 3);
-    _cellVector[0] -= (c0*stressCell[2] + b0*stressCell[0]) * area;
-    _cellVector[1] -= (b0*stressCell[2] + c0*stressCell[1]) * area;
-    _cellVector[2] -= (c1*stressCell[2] + b1*stressCell[0]) * area;
-    _cellVector[3] -= (b1*stressCell[2] + c1*stressCell[1]) * area;
-    _cellVector[4] -= (c2*stressCell[2] + b2*stressCell[0]) * area;
-    _cellVector[5] -= (b2*stressCell[2] + c2*stressCell[1]) * area;
-
-#if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(30);
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(updateEvent);
-#endif
-
-    // Assemble cell contribution into field
-    err = DMComplexVecSetClosure(dmMesh, residualSection, residualVec, cell, &_cellVector[0], ADD_VALUES);CHECK_PETSC_ERROR(err);
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(updateEvent);
-#endif
-  } // for
-  err = ISRestoreIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-  err = ISDestroy(&cellIS);CHECK_PETSC_ERROR(err);
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  PetscLogFlops(numCells*(3 + numBasis*numBasis*spaceDim*2 + 34+30));
-  _logger->eventEnd(computeEvent);
-#endif
-} // integrateResidual
-
-// ----------------------------------------------------------------------
-// Integrate constributions to residual term (r) for operator.
-void
-pylith::feassemble::ElasticityExplicitTri3::integrateResidualLumped(
-        const topology::Field<topology::Mesh>& residual,
-        const PylithScalar t,
-        topology::SolutionFields* const fields)
-{ // integrateResidualLumped
   /// Member prototype for _elasticityResidualXD()
   typedef void (pylith::feassemble::ElasticityExplicitTri3::*elasticityResidual_fn_type)
     (const scalar_array&);
@@ -661,152 +382,16 @@
   PetscLogFlops(numCells*(2 + numBasis*spaceDim*2 + 34+30));
   _logger->eventEnd(computeEvent);
 #endif
-} // integrateResidualLumped
+} // integrateResidual
 
 // ----------------------------------------------------------------------
 // Compute matrix associated with operator.
 void
-pylith::feassemble::ElasticityExplicitTri3::integrateJacobian(
-					topology::Jacobian* jacobian,
-					const PylithScalar t,
-					topology::SolutionFields* fields)
+pylith::feassemble::ElasticityExplicitTri3::integrateJacobian(topology::Jacobian* jacobian,
+							      const PylithScalar t,
+							      topology::SolutionFields* fields)
 { // integrateJacobian
-  assert(0 != _quadrature);
-  assert(0 != _material);
-  assert(0 != jacobian);
-  assert(0 != fields);
-
-  const int setupEvent = _logger->eventId("ElIJ setup");
-  const int geometryEvent = _logger->eventId("ElIJ geometry");
-  const int computeEvent = _logger->eventId("ElIJ compute");
-  const int restrictEvent = _logger->eventId("ElIJ restrict");
-  const int stateVarsEvent = _logger->eventId("ElIJ stateVars");
-  const int updateEvent = _logger->eventId("ElIJ update");
-
-  _logger->eventBegin(setupEvent);
-
-  // Get cell geometry information that doesn't depend on cell
-  const int numQuadPts = _quadrature->numQuadPts();
-  const scalar_array& quadWts = _quadrature->quadWts();
-  assert(quadWts.size() == numQuadPts);
-  const int numBasis = _quadrature->numBasis();
-  const int spaceDim = _quadrature->spaceDim();
-  const int cellDim = _quadrature->cellDim();
-  const int tensorSize = _material->tensorSize();
-  if (cellDim != spaceDim)
-    throw std::logic_error("Don't know how to integrate elasticity " \
-			   "contribution to Jacobian matrix for cells with " \
-			   "different dimensions than the spatial dimension.");
-
-  // Get cell information
-  DM              dmMesh = fields->mesh().dmMesh();
-  IS              cellIS;
-  const PetscInt *cells;
-  PetscInt        numCells;
-  PetscErrorCode  err;
-
-  assert(dmMesh);
-  err = DMComplexGetStratumIS(dmMesh, "material-id", _material->id(), &cellIS);CHECK_PETSC_ERROR(err);
-  err = ISGetSize(cellIS, &numCells);CHECK_PETSC_ERROR(err);
-  err = ISGetIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-
-  // Get sections
-  topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
-  PetscSection dispTSection = dispT.petscSection();
-  Vec          dispTVec     = dispT.localVector();
-  assert(dispTSection);assert(dispTVec);
-
-  // Get sparse matrix
-  const PetscMat jacobianMat = jacobian->matrix();
-  assert(0 != jacobianMat);
-
-  // Get parameters used in integration.
-  const PylithScalar dt = _dt;
-  const PylithScalar dt2 = dt*dt;
-  assert(dt > 0);
-
-  scalar_array coordinatesCell(numBasis*spaceDim);
-  PetscSection coordSection;
-  Vec          coordVec;
-  err = DMComplexGetCoordinateSection(dmMesh, &coordSection);CHECK_PETSC_ERROR(err);
-  err = DMGetCoordinatesLocal(dmMesh, &coordVec);CHECK_PETSC_ERROR(err);
-  assert(coordSection);assert(coordVec);
-
-  _logger->eventEnd(setupEvent);
-#if !defined(DETAILED_EVENT_LOGGING)
-  _logger->eventBegin(computeEvent);
-#endif
-
-  // Loop over cells
-  for(PetscInt c = 0; c < numCells; ++c) {
-    const PetscInt cell = cells[c];
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventBegin(geometryEvent);
-#endif
-
-    // Compute geometry information for current cell
-    const PetscScalar *coords;
-    PetscInt           coordsSize;
-    err = DMComplexVecGetClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-    for(PetscInt i = 0; i < coordsSize; ++i) {coordinatesCell[i] = coords[i];}
-    const PylithScalar area = _area(coordinatesCell);
-    assert(area > 0.0);
-    err = DMComplexVecRestoreClosure(dmMesh, coordSection, coordVec, cell, &coordsSize, &coords);CHECK_PETSC_ERROR(err);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(geometryEvent);
-    _logger->eventBegin(stateVarsEvent);
-#endif
-
-    // Get state variables for cell.
-    _material->retrievePropsAndVars(cell);
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(stateVarsEvent);
-    _logger->eventBegin(computeEvent);
-#endif
-
-    // Reset element matrix to zero
-    _resetCellMatrix();
-
-    // Get material physical properties at quadrature points for this cell
-    const scalar_array& density = _material->calcDensity();
-    assert(density.size() == 1);
-
-    // Compute Jacobian for inertial terms
-    const PylithScalar wtVertex = density[0] * area / (9.0 * dt2);
-    for (int iBasis = 0; iBasis < numBasis; ++iBasis)
-      for (int jBasis = 0; jBasis < numBasis; ++jBasis)
-	for (int iDim=0; iDim < spaceDim; ++iDim) {
-	  const int iBlock = (iBasis*spaceDim + iDim) * (numBasis*spaceDim);
-	  const int jBlock = (jBasis*spaceDim + iDim);
-	  _cellMatrix[iBlock+jBlock] += wtVertex;
-	} // for
-    
-#if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(numQuadPts*(3+numBasis*numBasis*spaceDim*1));
-    _logger->eventEnd(computeEvent);
-    _logger->eventBegin(updateEvent);
-#endif
-    
-    // Assemble cell contribution into PETSc matrix.
-    err = DMComplexMatSetClosure(dmMesh, dispTSection, PETSC_NULL, jacobianMat, cell, &_cellMatrix[0], ADD_VALUES);
-    CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
-
-#if defined(DETAILED_EVENT_LOGGING)
-    _logger->eventEnd(updateEvent);
-#endif
-  } // for
-  err = ISRestoreIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
-  err = ISDestroy(&cellIS);CHECK_PETSC_ERROR(err);
-
-#if !defined(DETAILED_EVENT_LOGGING)
-  PetscLogFlops(numCells*(3+numBasis*numBasis*spaceDim*1));
-  _logger->eventEnd(computeEvent);
-#endif
-
-  _needNewJacobian = false;
-  _material->resetNeedNewJacobian();
+  throw std::logic_error("ElasticityExplicit::integrateJacobian() not implemented. Use integrateJacobian(lumped) instead.");
 } // integrateJacobian
 
 // ----------------------------------------------------------------------
@@ -934,6 +519,26 @@
 } // integrateJacobian
 
 // ----------------------------------------------------------------------
+// Verify configuration is acceptable.
+void
+pylith::feassemble::ElasticityExplicitTri3::verifyConfiguration(const topology::Mesh& mesh) const
+{ // verifyConfiguration
+  IntegratorElasticity::verifyConfiguration(mesh);
+
+  assert(_quadrature);
+  assert(_material);
+  if (_spaceDim != _quadrature->spaceDim() || _cellDim != _quadrature->cellDim() || _numBasis != _quadrature->numBasis() ||  _numQuadPts != _quadrature->numQuadPts()) {
+    std::ostringstream msg;
+    msg << "User specified quadrature settings material '" << _material->label() << "' do not match ElasticityExplicitTri3 hardwired quadrature settings.\n"
+	<< "  Space dim: " << _spaceDim << " (code), " << _quadrature->spaceDim() << " (user)\n"
+	<< "  Cell dim: " << _cellDim << " (code), " << _quadrature->cellDim() << " (user)\n"
+	<< "  # basis fns: " << _numBasis << " (code), " << _quadrature->numBasis() << " (user)\n"
+	<< "  # quad points: " << _numQuadPts << " (code), " << _quadrature->numQuadPts() << " (user)";
+    throw std::runtime_error(msg.str());
+  } // if
+} // verifyConfiguration
+
+// ----------------------------------------------------------------------
 // Compute area of triangular cell.
 PylithScalar
 pylith::feassemble::ElasticityExplicitTri3::_area(

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTri3.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityExplicitTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -90,19 +90,21 @@
    */
   void timeStep(const PylithScalar dt);
 
+  /** Get stable time step for advancing from time t to time t+dt.
+   *
+   * Default is current time step.
+   *
+   * @param mesh Finite-element mesh.
+   * @returns Time step
+   */
+  PylithScalar stableTimeStep(const topology::Mesh& mesh) const;
+
   /** Set normalized viscosity for numerical damping.
    *
    * @param viscosity Normalized viscosity (viscosity / elastic modulus).
    */
   void normViscosity(const PylithScalar viscosity);
 
-  /** Set flag for setting constraints for total field solution or
-   *  incremental field solution.
-   *
-   * @param flag True if using incremental solution, false otherwise.
-   */
-  void useSolnIncr(const bool flag);
-
   /** Integrate contributions to residual term (r) for operator.
    *
    * @param residual Field containing values for residual
@@ -113,37 +115,22 @@
 			 const PylithScalar t,
 			 topology::SolutionFields* const fields);
 
-  /** Integrate contributions to residual term (r) for operator.
-   *
-   * @param residual Field containing values for residual
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  void integrateResidualLumped(const topology::Field<topology::Mesh>& residual,
-       const PylithScalar t,
-       topology::SolutionFields* const fields);
-
   /** Integrate contributions to Jacobian matrix (A) associated with
    * operator.
    *
-   * @param jacobian Sparse matrix for Jacobian of system.
+   * @param jacobian Diagonal matrix (as field) for Jacobian of system.
    * @param t Current time
    * @param fields Solution fields
    */
-  void integrateJacobian(topology::Jacobian* jacobian,
+  void integrateJacobian(topology::Field<topology::Mesh>* jacobian,
 			 const PylithScalar t,
 			 topology::SolutionFields* const fields);
 
-  /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator.
+  /** Verify configuration is acceptable.
    *
-   * @param jacobian Diagonal matrix (as field) for Jacobian of system.
-   * @param t Current time
-   * @param fields Solution fields
+   * @param mesh Finite-element mesh
    */
-  void integrateJacobian(topology::Field<topology::Mesh>* jacobian,
-			 const PylithScalar t,
-			 topology::SolutionFields* const fields);
+  void verifyConfiguration(const topology::Mesh& mesh) const;
 
 // PRIVATE METHODS //////////////////////////////////////////////////////
 private :
@@ -185,6 +172,11 @@
   /// Not implemented
   const ElasticityExplicitTri3& operator=(const ElasticityExplicitTri3&);
 
+  /// Not implemented.
+  void integrateJacobian(topology::Jacobian*,
+			 const PylithScalar,
+			 topology::SolutionFields* const);
+
 }; // ElasticityExplicitTri3
 
 #endif // pylith_feassemble_elasticityexplicittri3_hh

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicit.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicit.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicit.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -98,17 +98,7 @@
 } // stableTimeStep
 
 // ----------------------------------------------------------------------
-// Set flag for setting constraints for total field solution or
-// incremental field solution.
 void
-pylith::feassemble::ElasticityImplicit::useSolnIncr(const bool flag)
-{ // useSolnIncr
-  assert(0 != _material);
-  _useSolnIncr = flag;
-  _material->useElasticBehavior(!_useSolnIncr);
-} // useSolnIncr
-
-void
 pylith::feassemble::ElasticityImplicit::integrateResidual(
 			  const topology::Field<topology::Mesh>& residual,
 			  const PylithScalar t,

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicit.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicit.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicit.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -88,13 +88,6 @@
    */
   PylithScalar stableTimeStep(const topology::Mesh& mesh) const;
 
-  /** Set flag for setting constraints for total field solution or
-   *  incremental field solution.
-   *
-   * @param flag True if using incremental solution, false otherwise.
-   */
-  void useSolnIncr(const bool flag);
-
   /** Integrate residual part of RHS for 3-D finite elements.
    * Includes gravity and element internal force contribution.
    *

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitCUDA.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitCUDA.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitCUDA.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -104,17 +104,6 @@
 } // stableTimeStep
 
 // ----------------------------------------------------------------------
-// Set flag for setting constraints for total field solution or
-// incremental field solution.
-void
-pylith::feassemble::ElasticityImplicitCUDA::useSolnIncr(const bool flag)
-{ // useSolnIncr
-  assert(0 != _material);
-  _useSolnIncr = flag;
-  _material->useElasticBehavior(!_useSolnIncr);
-} // useSolnIncr
-
-// ----------------------------------------------------------------------
 // Integrate constributions to residual term (r) for operator.
 void
 pylith::feassemble::ElasticityImplicitCUDA::integrateResidual(

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitLgDeform.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitLgDeform.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitLgDeform.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -90,17 +90,6 @@
 } // stableTimeStep
 
 // ----------------------------------------------------------------------
-// Set flag for setting constraints for total field solution or
-// incremental field solution.
-void
-pylith::feassemble::ElasticityImplicitLgDeform::useSolnIncr(const bool flag)
-{ // useSolnIncr
-  assert(0 != _material);
-  _useSolnIncr = flag;
-  _material->useElasticBehavior(!_useSolnIncr);
-} // useSolnIncr
-
-// ----------------------------------------------------------------------
 // Integrate constributions to residual term (r) for operator.
 void
 pylith::feassemble::ElasticityImplicitLgDeform::integrateResidual(

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitLgDeform.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitLgDeform.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/ElasticityImplicitLgDeform.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -89,13 +89,6 @@
    */
   PylithScalar stableTimeStep(const topology::Mesh& mesh) const;
 
-  /** Set flag for setting constraints for total field solution or
-   *  incremental field solution.
-   *
-   * @param flag True if using incremental solution, false otherwise.
-   */
-  void useSolnIncr(const bool flag);
-
   /** Integrate residual part of RHS for 3-D finite elements.
    * Includes gravity and element internal force contribution.
    *

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryHex3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryHex3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryHex3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -25,6 +25,7 @@
 #include "petsc.h" // USES PetscLogFlops
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES PYLITH_MAXSCALAR
 
 #include <cassert> // USES assert()
 
@@ -366,5 +367,43 @@
   PetscLogFlops(78 + npts*69);
 } // jacobian
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryHex3D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  const int numCorners = 8;
+  const int spaceDim = 3;
+  assert(numCorners*spaceDim == coordinatesCell.size());
 
+  const int numEdges = 12;
+  const int edges[numEdges][2] = {
+    {0, 1}, {1, 2}, {2, 3}, {3, 0},
+    {4, 5}, {5, 6}, {6, 7}, {7, 0},
+    {0, 4}, {1, 5}, {2, 6}, {3, 7},
+  };
+
+  PylithScalar minWidth = PYLITH_MAXSCALAR;
+  for (int iedge=0; iedge < numEdges; ++iedge) {
+    const int iA = edges[iedge][0];
+    const int iB = edges[iedge][1];
+    const PylithScalar xA = coordinatesCell[spaceDim*iA  ];
+    const PylithScalar yA = coordinatesCell[spaceDim*iA+1];
+    const PylithScalar zA = coordinatesCell[spaceDim*iA+2];
+    const PylithScalar xB = coordinatesCell[spaceDim*iB  ];
+    const PylithScalar yB = coordinatesCell[spaceDim*iB+1];
+    const PylithScalar zB = coordinatesCell[spaceDim*iB+2];
+    
+    const PylithScalar edgeLen = sqrt(pow(xB-xA,2) + pow(yB-yA,2) + pow(zB-zA,2));
+    if (edgeLen < minWidth) {
+      minWidth = edgeLen;
+    } // if
+  } // for
+
+  PetscLogFlops(numEdges*9);
+
+  return minWidth;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryHex3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryHex3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryHex3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -114,6 +114,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine1D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine1D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine1D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -23,6 +23,7 @@
 #include "GeometryPoint1D.hh" // USES GeometryPoint
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include "petsc.h" // USES PetscLogFlops
 
@@ -140,4 +141,25 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryLine1D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  const int numCorners = 2;
+  const int spaceDim = 1;
+  assert(2*spaceDim == coordinatesCell.size() ||
+	 3*spaceDim == coordinatesCell.size()); // :KLUDGE: allow quadratic
+
+  const PylithScalar xA = coordinatesCell[0];
+  const PylithScalar xB = coordinatesCell[1];
+    
+  const PylithScalar minWidth = fabs(xB-xA);
+
+  PetscLogFlops(2);
+
+  return minWidth;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine1D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine1D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine1D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -98,6 +98,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine2D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine2D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine2D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -23,6 +23,7 @@
 #include "GeometryPoint2D.hh" // USES GeometryPoint
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include "petsc.h" // USES PetscLogFlops
 
@@ -161,4 +162,26 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryLine2D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  const int numCorners = 2;
+  const int spaceDim = 2;
+  assert(numCorners*spaceDim == coordinatesCell.size());
+
+  const PylithScalar xA = coordinatesCell[0];
+  const PylithScalar yA = coordinatesCell[1];
+  const PylithScalar xB = coordinatesCell[2];
+  const PylithScalar yB = coordinatesCell[3];
+    
+  const PylithScalar minWidth = sqrt(pow(xB-xA,2) + pow(yB-yA,2));
+
+  PetscLogFlops(6);
+
+  return minWidth;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine2D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine2D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine2D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -98,6 +98,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -25,6 +25,7 @@
 #include "petsc.h" // USES PetscLogFlops
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include <cassert> // USES assert()
 
@@ -172,4 +173,28 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryLine3D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  const int numCorners = 2;
+  const int spaceDim = 3;
+  assert(numCorners*spaceDim == coordinatesCell.size());
+
+  const PylithScalar xA = coordinatesCell[0];
+  const PylithScalar yA = coordinatesCell[1];
+  const PylithScalar zA = coordinatesCell[2];
+  const PylithScalar xB = coordinatesCell[3];
+  const PylithScalar yB = coordinatesCell[4];
+  const PylithScalar zB = coordinatesCell[5];
+    
+  const PylithScalar minWidth = sqrt(pow(xB-xA,2) + pow(yB-yA,2) + pow(zB-zA,2));
+
+  PetscLogFlops(9);
+
+  return minWidth;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryLine3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -98,6 +98,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint1D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint1D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint1D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -21,6 +21,7 @@
 #include "GeometryPoint1D.hh" // implementation of class methods
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include <cassert> // USES assert()
 
@@ -115,4 +116,13 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryPoint1D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  return PYLITH_MAXSCALAR;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint1D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint1D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint1D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -98,6 +98,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint2D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint2D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint2D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -21,6 +21,7 @@
 #include "GeometryPoint2D.hh" // implementation of class methods
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include <cassert> // USES assert()
 
@@ -116,4 +117,13 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryPoint2D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  return PYLITH_MAXSCALAR;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint2D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint2D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint2D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -98,6 +98,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -21,6 +21,7 @@
 #include "GeometryPoint3D.hh" // implementation of class methods
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include <cassert> // USES assert()
 
@@ -116,4 +117,13 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryPoint3D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  return PYLITH_MAXSCALAR;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryPoint3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -98,6 +98,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad2D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad2D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad2D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -25,6 +25,7 @@
 #include "petsc.h" // USES PetscLogFlops
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include <cassert> // USES assert()
 
@@ -217,4 +218,39 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryQuad2D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  const int numCorners = 4;
+  const int spaceDim = 2;
+  assert(numCorners*spaceDim == coordinatesCell.size());
+
+  const int numEdges = 4;
+  const int edges[numEdges][2] = {
+    {0, 1}, {1, 2}, {2, 3}, {3, 0},
+  };
+
+  PylithScalar minWidth = PYLITH_MAXSCALAR;
+  for (int iedge=0; iedge < numEdges; ++iedge) {
+    const int iA = edges[iedge][0];
+    const int iB = edges[iedge][1];
+    const PylithScalar xA = coordinatesCell[spaceDim*iA  ];
+    const PylithScalar yA = coordinatesCell[spaceDim*iA+1];
+    const PylithScalar xB = coordinatesCell[spaceDim*iB  ];
+    const PylithScalar yB = coordinatesCell[spaceDim*iB+1];
+    
+    const PylithScalar edgeLen = sqrt(pow(xB-xA,2) + pow(yB-yA,2));
+    if (edgeLen < minWidth) {
+      minWidth = edgeLen;
+    } // if
+  } // for
+
+  PetscLogFlops(numEdges*6);
+
+  return minWidth;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad2D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad2D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad2D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -116,6 +116,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -25,6 +25,7 @@
 #include "petsc.h" // USES PetscLogFlops
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include <cassert> // USES assert()
 
@@ -262,4 +263,41 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryQuad3D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  const int numCorners = 4;
+  const int spaceDim = 3;
+  assert(numCorners*spaceDim == coordinatesCell.size());
+
+  const int numEdges = 4;
+  const int edges[numEdges][2] = {
+    {0, 1}, {1, 2}, {2, 3}, {3, 0},
+  };
+
+  PylithScalar minWidth = PYLITH_MAXSCALAR;
+  for (int iedge=0; iedge < numEdges; ++iedge) {
+    const int iA = edges[iedge][0];
+    const int iB = edges[iedge][1];
+    const PylithScalar xA = coordinatesCell[spaceDim*iA  ];
+    const PylithScalar yA = coordinatesCell[spaceDim*iA+1];
+    const PylithScalar zA = coordinatesCell[spaceDim*iA+2];
+    const PylithScalar xB = coordinatesCell[spaceDim*iB  ];
+    const PylithScalar yB = coordinatesCell[spaceDim*iB+1];
+    const PylithScalar zB = coordinatesCell[spaceDim*iB+2];
+    
+    const PylithScalar edgeLen = sqrt(pow(xB-xA,2) + pow(yB-yA,2) + pow(zB-zA,2));
+    if (edgeLen < minWidth) {
+      minWidth = edgeLen;
+    } // if
+  } // for
+
+  PetscLogFlops(numEdges*9);
+
+  return minWidth;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryQuad3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -114,6 +114,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTet3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTet3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTet3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -25,6 +25,7 @@
 #include "petsc.h" // USES PetscLogFlops
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include <cassert> // USES assert()
 
@@ -241,4 +242,169 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryTet3D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  const int numCorners = 4;
+  const int spaceDim = 3;
+  assert(4*spaceDim == coordinatesCell.size() ||
+	 10*spaceDim == coordinatesCell.size()); // :KLUDGE: allow quadratic
+
+  const int numEdges = 6;
+  const int edges[numEdges][2] = {
+    {0, 1}, {1, 2}, {2, 0},
+    {0, 3}, {1, 3}, {2, 3},
+  };
+
+  PylithScalar minWidth = PYLITH_MAXSCALAR;
+  for (int iedge=0; iedge < numEdges; ++iedge) {
+    const int iA = edges[iedge][0];
+    const int iB = edges[iedge][1];
+    const PylithScalar xA = coordinatesCell[spaceDim*iA  ];
+    const PylithScalar yA = coordinatesCell[spaceDim*iA+1];
+    const PylithScalar zA = coordinatesCell[spaceDim*iA+2];
+    const PylithScalar xB = coordinatesCell[spaceDim*iB  ];
+    const PylithScalar yB = coordinatesCell[spaceDim*iB+1];
+    const PylithScalar zB = coordinatesCell[spaceDim*iB+2];
+    
+    const PylithScalar edgeLen = sqrt(pow(xB-xA,2) + pow(yB-yA,2) + pow(zB-zA,2));
+    if (edgeLen < minWidth) {
+      minWidth = edgeLen;
+    } // if
+  } // for
+
+  PetscLogFlops(numEdges*9);
+
+  // Radius of inscribed sphere
+  const PylithScalar v = volume(coordinatesCell);
+  const PylithScalar a = faceArea(coordinatesCell, 0) +
+    faceArea(coordinatesCell, 1) +
+    faceArea(coordinatesCell, 2) +
+    faceArea(coordinatesCell, 3);
+    
+  const PylithScalar r = 3.0 * v / a;
+  const PylithScalar rwidth = 6.38*r; // based on empirical tests
+  if (rwidth < minWidth) {
+    minWidth = rwidth;
+  } // if
+
+  PetscLogFlops(3);
+
+  return minWidth;
+} // minCellWidth
+
+// ----------------------------------------------------------------------
+// Compute cell volume.
+PylithScalar
+pylith::feassemble::GeometryTet3D::volume(const scalar_array& coordinatesCell) const
+{ // volume
+  assert(12 == coordinatesCell.size() ||
+	 30 == coordinatesCell.size()); // :KLUDGE: allow quadratic
+  
+  const PylithScalar x0 = coordinatesCell[0];
+  const PylithScalar y0 = coordinatesCell[1];
+  const PylithScalar z0 = coordinatesCell[2];
+  
+  const PylithScalar x1 = coordinatesCell[3];
+  const PylithScalar y1 = coordinatesCell[4];
+  const PylithScalar z1 = coordinatesCell[5];
+  
+  const PylithScalar x2 = coordinatesCell[6];
+  const PylithScalar y2 = coordinatesCell[7];
+  const PylithScalar z2 = coordinatesCell[8];
+  
+  const PylithScalar x3 = coordinatesCell[9];
+  const PylithScalar y3 = coordinatesCell[10];
+  const PylithScalar z3 = coordinatesCell[11];
+
+  const PylithScalar det = 
+    x1*(y2*z3-y3*z2)-y1*(x2*z3-x3*z2)+(x2*y3-x3*y2)*z1 - 
+    x0*((y2*z3-y3*z2)-y1*(z3-z2)+(y3-y2)*z1) +
+    y0*((x2*z3-x3*z2)-x1*(z3-z2)+(x3-x2)*z1) -
+    z0*((x2*y3-x3*y2)-x1*(y3-y2)+(x3-x2)*y1);
+  
+  const PylithScalar v = det / 6.0;
+  PetscLogFlops(48);
+  
+  return v;  
+} // volume
+
+// ----------------------------------------------------------------------
+// Compute area of face.
+PylithScalar
+pylith::feassemble::GeometryTet3D::faceArea(const scalar_array& coordinatesCell,
+	 const int face) const
+{ // faceArea
+  assert(12 == coordinatesCell.size() ||
+	 30 == coordinatesCell.size()); // :KLUDGE: allow quadratic
+
+  const PylithScalar x0 = coordinatesCell[0];
+  const PylithScalar y0 = coordinatesCell[1];
+  const PylithScalar z0 = coordinatesCell[2];
+  
+  const PylithScalar x1 = coordinatesCell[3];
+  const PylithScalar y1 = coordinatesCell[4];
+  const PylithScalar z1 = coordinatesCell[5];
+  
+  const PylithScalar x2 = coordinatesCell[6];
+  const PylithScalar y2 = coordinatesCell[7];
+  const PylithScalar z2 = coordinatesCell[8];
+  
+  const PylithScalar x3 = coordinatesCell[9];
+  const PylithScalar y3 = coordinatesCell[10];
+  const PylithScalar z3 = coordinatesCell[11];
+
+  PylithScalar a[3];
+  PylithScalar b[3];
+  switch (face) {
+  case 0:
+    a[0] = x3-x1;
+    a[1] = y3-y1;
+    a[2] = z3-z1;
+    b[0] = x2-x1;
+    b[1] = y2-y1;
+    b[2] = z2-z1;
+    break;
+  case 1:
+    a[0] = x3-x2;
+    a[1] = y3-y2;
+    a[2] = z3-z2;
+    b[0] = x0-x2;
+    b[1] = y0-y2;
+    b[2] = z0-z2;
+    break;
+  case 2:
+    a[0] = x3-x0;
+    a[1] = y3-y0;
+    a[2] = z3-z0;
+    b[0] = x1-x0;
+    b[1] = y1-y0;
+    b[2] = z1-z0;
+    break;
+  case 3:
+    a[0] = x1-x0;
+    a[1] = y1-y0;
+    a[2] = z1-z0;
+    b[0] = x2-x0;
+    b[1] = y2-y0;
+    b[2] = z2-z0;
+    break;
+  default:
+    assert(0);
+    throw std::logic_error("Unknown face.");
+  } // switch
+
+  const PylithScalar areaX = a[1]*b[2] - a[2]*b[1];
+  const PylithScalar areaY = a[2]*b[0] - a[0]*b[2];
+  const PylithScalar areaZ = a[0]*b[1] - a[1]*b[0];
+
+  const PylithScalar area = 0.5*sqrt(areaX*areaX + areaY*areaY + areaZ*areaZ);
+  PetscLogFlops(22);
+  
+  return area;
+} // faceArea
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTet3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTet3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTet3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -109,6 +109,29 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
+  /** Compute cell volume.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Volume of cell.
+   */
+  PylithScalar volume(const scalar_array& coordinatesCell) const;
+
+  /** Compute area of face.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @param face Index of vertex across from face.
+   * @returns Area of cell face.
+   */
+  PylithScalar faceArea(const scalar_array& coordinatesCell,
+			const int face) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri2D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri2D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri2D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -25,6 +25,7 @@
 #include "petsc.h" // USES PetscLogFlops
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include <cassert> // USES assert()
 
@@ -107,9 +108,9 @@
 // Compute Jacobian at location in cell.
 void
 pylith::feassemble::GeometryTri2D::jacobian(scalar_array* jacobian,
-					  PylithScalar* det,
-					  const scalar_array& vertices,
-					  const scalar_array& location) const
+					    PylithScalar* det,
+					    const scalar_array& vertices,
+					    const scalar_array& location) const
 { // jacobian
   assert(0 != jacobian);
 
@@ -182,4 +183,62 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryTri2D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  const int numCorners = 3;
+  const int spaceDim = 2;
+  assert(3*spaceDim == coordinatesCell.size() ||
+	 6*spaceDim == coordinatesCell.size()); // :KLUDGE: allow quadratic
+
+  const int numEdges = 3;
+  const int edges[numEdges][2] = {
+    {0, 1}, {1, 2}, {2, 0},
+  };
+
+  PylithScalar minWidth = PYLITH_MAXSCALAR;
+  for (int iedge=0; iedge < numEdges; ++iedge) {
+    const int iA = edges[iedge][0];
+    const int iB = edges[iedge][1];
+    const PylithScalar xA = coordinatesCell[spaceDim*iA  ];
+    const PylithScalar yA = coordinatesCell[spaceDim*iA+1];
+    const PylithScalar xB = coordinatesCell[spaceDim*iB  ];
+    const PylithScalar yB = coordinatesCell[spaceDim*iB+1];
+    
+    const PylithScalar edgeLen = sqrt(pow(xB-xA,2) + pow(yB-yA,2));
+    if (edgeLen < minWidth) {
+      minWidth = edgeLen;
+    } // if
+  } // for
+
+  PetscLogFlops(numEdges*6);
+
+  // Ad-hoc to account for distorted cells.
+  // Radius of inscribed circle.
+  const PylithScalar xA = coordinatesCell[0];
+  const PylithScalar yA = coordinatesCell[1];
+  const PylithScalar xB = coordinatesCell[2];
+  const PylithScalar yB = coordinatesCell[3];
+  const PylithScalar xC = coordinatesCell[4];
+  const PylithScalar yC = coordinatesCell[5];
+
+  const PylithScalar c  = sqrt(pow(xB-xA,2) + pow(yB-yA, 2));
+  const PylithScalar a  = sqrt(pow(xC-xB,2) + pow(yC-yB, 2));
+  const PylithScalar b  = sqrt(pow(xA-xC,2) + pow(yA-yC, 2));
+  
+  const PylithScalar k = 0.5 * (a + b + c);
+  const PylithScalar r = sqrt(k*(k-a)*(k-b)*(k-c)) / k;
+  const PylithScalar rwidth = 3.0*r; // based on empirical tests
+  if (rwidth < minWidth) {
+    minWidth = rwidth;
+  } // if
+
+  PetscLogFlops(3*6 + 3 + 8);
+
+  return minWidth;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri2D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri2D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri2D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -115,6 +115,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -25,6 +25,7 @@
 #include "petsc.h" // USES PetscLogFlops
 
 #include "pylith/utils/array.hh" // USES scalar_array
+#include "pylith/utils/constdefs.h" // USES scalar_array
 
 #include <cassert> // USES assert()
 
@@ -218,4 +219,64 @@
 } // jacobian
 
 
+// ----------------------------------------------------------------------
+// Compute minimum width across cell.
+PylithScalar
+pylith::feassemble::GeometryTri3D::minCellWidth(const scalar_array& coordinatesCell) const
+{ // minCellWidth
+  const int numCorners = 2;
+  const int spaceDim = 3;
+  assert(numCorners*spaceDim == coordinatesCell.size());
+
+  const int numEdges = 3;
+  const int edges[numEdges][2] = {
+    {0, 1}, {1, 2}, {2, 0},
+  };
+
+  PylithScalar minWidth = PYLITH_MAXSCALAR;
+  for (int iedge=0; iedge < numEdges; ++iedge) {
+    const int iA = edges[iedge][0];
+    const int iB = edges[iedge][1];
+    const PylithScalar xA = coordinatesCell[spaceDim*iA  ];
+    const PylithScalar yA = coordinatesCell[spaceDim*iA+1];
+    const PylithScalar zA = coordinatesCell[spaceDim*iA+2];
+    const PylithScalar xB = coordinatesCell[spaceDim*iB  ];
+    const PylithScalar yB = coordinatesCell[spaceDim*iB+1];
+    const PylithScalar zB = coordinatesCell[spaceDim*iB+2];
+    
+    const PylithScalar edgeLen = sqrt(pow(xB-xA,2) + pow(yB-yA,2) + pow(zB-zA,2));
+    if (edgeLen < minWidth) {
+      minWidth = edgeLen;
+    } // if
+  } // for
+
+  PetscLogFlops(numEdges*9);
+
+#if 1
+  // Ad-hoc to account for distorted cells.
+  // Radius of inscribed circle.
+  const PylithScalar xA = coordinatesCell[0];
+  const PylithScalar yA = coordinatesCell[1];
+  const PylithScalar zA = coordinatesCell[2];
+  const PylithScalar xB = coordinatesCell[3];
+  const PylithScalar yB = coordinatesCell[4];
+  const PylithScalar zB = coordinatesCell[5];
+  const PylithScalar xC = coordinatesCell[6];
+  const PylithScalar yC = coordinatesCell[7];
+  const PylithScalar zC = coordinatesCell[8];
+
+  const PylithScalar c  = sqrt(pow(xB-xA,2) + pow(yB-yA, 2) + pow(zB-zA, 2));
+  const PylithScalar a  = sqrt(pow(xC-xB,2) + pow(yC-yB, 2) + pow(zC-zB, 2));
+  const PylithScalar b  = sqrt(pow(xA-xC,2) + pow(yA-yC, 2) + pow(zA-zC, 2));
+  
+  const PylithScalar k = (a + b + c) / 3.0;
+  const PylithScalar r = sqrt(k*(k-a)*(k-b)*(k-c)) / k;
+  minWidth = r;
+
+#endif
+
+  return minWidth;
+} // minCellWidth
+
+
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/GeometryTri3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -115,6 +115,13 @@
 		const int dim,
 		const int npts =1) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
   // NOT IMPLEMENTED ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -37,8 +37,7 @@
   _gravityField(0),
   _logger(0),
   _needNewJacobian(true),
-  _isJacobianSymmetric(true),
-  _useSolnIncr(false)
+  _isJacobianSymmetric(true)
 { // constructor
 } // constructor
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -122,14 +122,6 @@
   virtual
   bool isJacobianSymmetric(void) const;
 
-  /** Set flag for setting constraints for total field solution or
-   *  incremental field solution.
-   *
-   * @param flag True if using incremental solution, false otherwise.
-   */
-  virtual
-  void useSolnIncr(const bool flag);
-
   /** Initialize integrator.
    *
    * @param mesh Finite-element mesh.
@@ -294,10 +286,6 @@
   /// Default is false;
   bool _isJacobianSymmetric;
 
-  /// Flag indicating whether to set constraints for a total field
-  /// solution or an incremental field solution
-  bool _useSolnIncr;
-
 // NOT IMPLEMENTED //////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.icc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/Integrator.icc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,14 +44,6 @@
   return _isJacobianSymmetric;
 } // needsVelocity
 
-// Set flag for setting constraints for total field solution or
-template<typename quadrature_type>
-inline
-void
-pylith::feassemble::Integrator<quadrature_type>::useSolnIncr(const bool flag) {
-  _useSolnIncr = flag;
-} // useSolnIncr
-
 // Initialize integrator.
 template<typename quadrature_type>
 inline

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticity.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticity.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticity.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -88,17 +88,6 @@
 } // needNewJacobian
 
 // ----------------------------------------------------------------------
-// Set flag for setting constraints for total field solution or
-void
-pylith::feassemble::IntegratorElasticity::useSolnIncr(const bool flag)
-{ // useSolnIncr
-  Integrator<Quadrature<topology::Mesh> >::useSolnIncr(flag);
-  
-  assert(0 != _material);
-  _material->useElasticBehavior(!flag);
-} // useSolnIncr
-
-// ----------------------------------------------------------------------
 // Initialize integrator.
 void
 pylith::feassemble::IntegratorElasticity::initialize(const topology::Mesh& mesh)
@@ -263,8 +252,8 @@
 pylith::feassemble::IntegratorElasticity::verifyConfiguration(
 					   const topology::Mesh& mesh) const
 { // verifyConfiguration
-  assert(0 != _quadrature);
-  assert(0 != _material);
+  assert(_quadrature);
+  assert(_material);
 
   const int dimension = mesh.dimension();
 
@@ -289,8 +278,8 @@
 	<< ".";
     throw std::runtime_error(msg.str());
   } // if
+
   const int numCorners = _quadrature->refGeometry().numCorners();
-
   DM dmMesh = mesh.dmMesh();
   IS              cellIS;
   const PetscInt *cells;
@@ -400,6 +389,23 @@
       } // else
 
     } // else
+
+  } else if (0 == strcasecmp(name, "stable_dt_implicit")) {
+    if (!_outputFields->hasField("buffer (other)"))
+      _outputFields->add("buffer (other)", "buffer");
+    topology::Field<topology::Mesh>& buffer = _outputFields->get("buffer (other)");
+    _material->stableTimeStepImplicit(mesh, &buffer);
+    buffer.addDimensionOkay(true);
+    return buffer;
+    
+  } else if (0 == strcasecmp(name, "stable_dt_explicit")) {
+    if (!_outputFields->hasField("buffer (other)"))
+      _outputFields->add("buffer (other)", "buffer");
+    topology::Field<topology::Mesh>& buffer = _outputFields->get("buffer (other)");
+    _material->stableTimeStepExplicit(mesh, _quadrature, &buffer);
+    buffer.addDimensionOkay(true);
+    return buffer;
+    
   } else {
     if (!_outputFields->hasField("buffer (other)"))
       _outputFields->add("buffer (other)", "buffer");

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticity.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticity.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticity.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -82,13 +82,6 @@
    */
   bool needNewJacobian(void);
 
-  /** Set flag for setting constraints for total field solution or
-   *  incremental field solution.
-   *
-   * @param flag True if using incremental solution, false otherwise.
-   */
-  void useSolnIncr(const bool flag);
-
   /** Initialize integrator.
    *
    * @param mesh Finite-element mesh.
@@ -108,6 +101,7 @@
    *
    * @param mesh Finite-element mesh
    */
+  virtual
   void verifyConfiguration(const topology::Mesh& mesh) const;
 
   /** Get output fields.
@@ -243,15 +237,6 @@
 			  const int numBasis,
 			  const int numQuadPts);
 
-// PROTECTED MEMBERS ////////////////////////////////////////////////////
-protected :
-
-  /// Elastic material associated with integrator
-  materials::ElasticMaterial* _material;
-
-  /// Buffers for output.
-  topology::Fields<topology::Field<topology::Mesh> >* _outputFields;
-
 // PROTECTED TYPEDEFS ///////////////////////////////////////////////////
 protected :
 
@@ -262,6 +247,15 @@
   typedef pylith::topology::Field<pylith::topology::Mesh>::UpdateAddVisitor UpdateAddVisitor;
   typedef ALE::ISieveVisitor::IndicesVisitor<RealSection,SieveMesh::order_type,PylithInt> IndicesVisitor;
 
+// PROTECTED MEMBERS ////////////////////////////////////////////////////
+protected :
+
+  /// Elastic material associated with integrator
+  materials::ElasticMaterial* _material;
+
+  /// Buffers for output.
+  topology::Fields<topology::Field<topology::Mesh> >* _outputFields;
+
 // NOT IMPLEMENTED //////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticityLgDeform.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticityLgDeform.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/IntegratorElasticityLgDeform.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -35,8 +35,7 @@
  * time integration of the elasticity equation for large rigid body
  * rotations and small strains.
  */
-class pylith::feassemble::IntegratorElasticityLgDeform : 
-  public IntegratorElasticity
+class pylith::feassemble::IntegratorElasticityLgDeform : public IntegratorElasticity
 { // IntegratorElasticityLgDeform
   friend class TestIntegratorElasticityLgDeform; // unit testing
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/Quadrature.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/Quadrature.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/Quadrature.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -135,7 +135,7 @@
   /// Deallocate temporary storage.
   void clear(void);
 
-  /** Precompute geometric quantities for each cell.
+  /** Compute geometric quantities for cell.
    *
    * @param coordinatesCell Coordinates of vertices in cell.
    * @param cell Finite-element cell

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/QuadratureRefCell.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/QuadratureRefCell.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/QuadratureRefCell.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -29,6 +29,7 @@
 // Include directives ---------------------------------------------------
 #include "feassemblefwd.hh" // forward declarations
 
+#include "CellGeometry.hh" // USES CellGeometry
 #include "pylith/utils/array.hh" // HASA scalar_array
 
 // Quadrature -----------------------------------------------------------
@@ -186,6 +187,13 @@
    */
   int spaceDim(void) const;
 
+  /** Compute minimum width across cell.
+   *
+   * @param coordinatesCell Coordinates of vertices in cell.
+   * @returns Minimum width across cell.
+   */
+  PylithScalar minCellWidth(const scalar_array& coordinatesCell) const;
+
 // PROTECTED METHODS ////////////////////////////////////////////////////
 protected :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/feassemble/QuadratureRefCell.icc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/feassemble/QuadratureRefCell.icc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/feassemble/QuadratureRefCell.icc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -90,6 +90,14 @@
   return _spaceDim;
 }
 
+// Compute minimum width across cell.
+inline
+PylithScalar
+pylith::feassemble::QuadratureRefCell::minCellWidth(const scalar_array& coordinatesCell) const {
+  assert(_geometry);
+  return _geometry->minCellWidth(coordinatesCell);
+}
+
 #endif
 
 // End of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/friction/FrictionModel.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/friction/FrictionModel.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/friction/FrictionModel.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -234,7 +234,9 @@
     } // for
     // Close database
     _dbInitialState->close();
-  } // if
+  } else if (_metadata.numDBStateVars()) {
+    std::cerr << "WARNING: No initial state given for friction model '" << label() << "'. Using default value of zero." << std::endl;
+  } // if/else
 
   // Setup buffers for restrict/update of properties and state variables.
   _propsStateVarsVertex.resize(fieldsFiberDim);

Modified: short/3D/PyLith/trunk/libsrc/pylith/friction/RateStateAgeing.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/friction/RateStateAgeing.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/friction/RateStateAgeing.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -122,7 +122,7 @@
 				    _RateStateAgeing::numStateVars,
 				    _RateStateAgeing::dbStateVars,
 				    _RateStateAgeing::numDBStateVars)),
-  _minSlipRate(1.0e-12)
+  _linearSlipRate(1.0e-12)
 { // constructor
 } // constructor
 
@@ -133,20 +133,21 @@
 } // destructor
 
 // ----------------------------------------------------------------------
-// Set floor for slip rate used in computing friction. Used to
+// Set nondimensional slip rate below which friction varies
+//  linearly with slip rate.
 void
-pylith::friction::RateStateAgeing::minSlipRate(const PylithScalar value)
-{ // minSlipRate
+pylith::friction::RateStateAgeing::linearSlipRate(const PylithScalar value)
+{ // linearSlipRate
   if (value < 0.0) {
     std::ostringstream msg;
-    msg << "Minimum slip rate (" << value << ") for rate state friction model "
+    msg << "Nondimensional linear slip rate threshold (" << value << ") for rate state friction model "
 	<< label() << " must be nonnegative.";
     throw std::runtime_error(msg.str());
   } // if
+  
+  _linearSlipRate = value;
+} // linearSlipRate
 
-  _minSlipRate = value;
-} // minSlipRate
-
 // ----------------------------------------------------------------------
 // Compute properties from values in spatial database.
 void
@@ -310,15 +311,17 @@
   if (normalTraction <= 0.0) {
     // if fault is in compression
 
-    const PylithScalar slipRateLinear = _minSlipRate;
+    const PylithScalar slipRateLinear = _linearSlipRate;
 
     const PylithScalar f0 = properties[p_coef];
     const PylithScalar a = properties[p_a];
     const PylithScalar b = properties[p_b];
     const PylithScalar L = properties[p_L];
     const PylithScalar slipRate0 = properties[p_slipRate0];
-    const PylithScalar theta = stateVars[s_state];
 
+    // Prevent zero value for theta, reasonable value is L / slipRate0
+    const PylithScalar theta = (stateVars[s_state] > 0.0) ? stateVars[s_state] : L / slipRate0;
+
     if (slipRate >= slipRateLinear) {
       mu_f = f0 + a*log(slipRate / slipRate0) + b*log(slipRate0*theta/L);
     } else {
@@ -375,7 +378,7 @@
 
   // Since regulatized friction -> 0 as slipRate -> 0, limit slip
   // rate to some minimum value
-  const PylithScalar slipRateEff = std::max(_minSlipRate, slipRate);
+  const PylithScalar slipRateEff = std::max(1.0e-2*_linearSlipRate, slipRate);
 
   const PylithScalar dt = _dt;
   const PylithScalar thetaTVertex = stateVars[s_state];

Modified: short/3D/PyLith/trunk/libsrc/pylith/friction/RateStateAgeing.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/friction/RateStateAgeing.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/friction/RateStateAgeing.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -20,10 +20,11 @@
  *
  * @brief C++ Rate and State fault constitutive model with ageing law.
  *
- * Implementation comes from "Kaneko, Y., N. Lapusta, and J.-P. Ampuero 
- * (2008), Spectral element modeling of spontaneous earthquake rupture on
- * rate and state faults: Effect of velocity-strengthening friction at 
- * shallow depths, J. Geophys. Res., 113, B09317" 
+ * Implementation of evolving state variable comes from "Kaneko, Y.,
+ * N. Lapusta, and J.-P. Ampuero (2008), Spectral element modeling of
+ * spontaneous earthquake rupture on rate and state faults: Effect of
+ * velocity-strengthening friction at shallow depths,
+ * J. Geophys. Res., 113, B09317"
  *
  * Regularized Rate & State equation : Eqn(15) of Kaneko et. al. (2008)
  *
@@ -58,12 +59,12 @@
   /// Destructor.
   ~RateStateAgeing(void);
 
-  /** Set floor for slip rate used in computing friction. Used to
-   *  avoid zero friction at zero slip rate.
+  /** Set nondimensional slip rate below which friction varies
+   *  linearly with slip rate.
    *
-   * @param value Floor for slip rate.
+   * @param value Nondimensional slip rate.
    */
-  void minSlipRate(const PylithScalar value);
+  void linearSlipRate(const PylithScalar value);
 
   // PROTECTED METHODS //////////////////////////////////////////////////
 protected :
@@ -167,7 +168,7 @@
 private :
 
   /// Floor for slip rate used in friction calculation.
-  PylithScalar _minSlipRate;
+  PylithScalar _linearSlipRate;
 
   /// Indices for properties in section and spatial database.
   static const int p_coef;

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPrager3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPrager3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPrager3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -432,6 +432,30 @@
 } // _stableTimeStepImplicit
 
 // ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::DruckerPrager3D::_stableTimeStepExplicit(const PylithScalar* properties,
+							    const int numProperties,
+							    const PylithScalar* stateVars,
+							    const int numStateVars,
+							    const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
+// ----------------------------------------------------------------------
 // Compute stress tensor at location from properties as an elastic
 // material.
 void

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPrager3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPrager3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPrager3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -229,6 +229,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   /** Update state variables (for next time step).
    *
    * @param stateVars State variables at location.

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPragerPlaneStrain.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPragerPlaneStrain.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPragerPlaneStrain.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -452,6 +452,30 @@
 } // _stableTimeStepImplicit
 
 // ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::DruckerPragerPlaneStrain::_stableTimeStepExplicit(const PylithScalar* properties,
+								     const int numProperties,
+								     const PylithScalar* stateVars,
+								     const int numStateVars,
+								     const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
+// ----------------------------------------------------------------------
 // Compute stress tensor at location from properties as an elastic
 // material.
 void

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPragerPlaneStrain.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPragerPlaneStrain.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/DruckerPragerPlaneStrain.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -225,10 +225,26 @@
    * @returns Time step
    */
   PylithScalar _stableTimeStepImplicit(const PylithScalar* properties,
-				 const int numProperties,
-				 const PylithScalar* stateVars,
-				 const int numStateVars) const;
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   /** Update state variables (for next time step).
    *
    * @param stateVars State variables at location.

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticIsotropic3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticIsotropic3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticIsotropic3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -325,10 +325,10 @@
 // ----------------------------------------------------------------------
 // Get stable time step for implicit time integration.
 PylithScalar
-pylith::materials::ElasticIsotropic3D::stableTimeStepImplicit(
-					const topology::Mesh& mesh) {
-  return pylith::PYLITH_MAXSCALAR;
-}
+pylith::materials::ElasticIsotropic3D::stableTimeStepImplicit(const topology::Mesh& mesh,
+							      topology::Field<topology::Mesh>* field) {
+  return ElasticMaterial::_stableTimeStepImplicitMax(mesh, field);
+} // stableTimeStepImplicitMax
 
 // ----------------------------------------------------------------------
 // Get stable time step for implicit time integration.
@@ -343,4 +343,28 @@
 } // _stableTimeStepImplicit
 
 
+// ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::ElasticIsotropic3D::_stableTimeStepExplicit(const PylithScalar* properties,
+							       const int numProperties,
+							       const PylithScalar* stateVars,
+							       const int numStateVars,
+							       const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
 // End of file 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticIsotropic3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticIsotropic3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticIsotropic3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,9 +59,12 @@
    * Default is MAXDOUBLE (or 1.0e+30 if MAXFLOAT is not defined in math.h).
    *
    * @param mesh Finite-element mesh.
+   * @param field Field for storing min stable time step for each cell.
+   *
    * @returns Time step
    */
-  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh);
+  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh,
+				      topology::Field<topology::Mesh>* field =0);
 
   // PROTECTED METHODS //////////////////////////////////////////////////
 protected :
@@ -181,6 +184,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   // PRIVATE MEMBERS ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticMaterial.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticMaterial.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticMaterial.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -70,6 +70,7 @@
 void
 pylith::materials::ElasticMaterial::deallocate(void)
 { // deallocate
+  Material::deallocate();
   delete _initialFields; _initialFields = 0;
 
   _dbInitialStress = 0; // :TODO: Use shared pointer.
@@ -265,7 +266,8 @@
 // ----------------------------------------------------------------------
 // Get stable time step for implicit time integration.
 PylithScalar
-pylith::materials::ElasticMaterial::stableTimeStepImplicit(const topology::Mesh& mesh)
+pylith::materials::ElasticMaterial::stableTimeStepImplicit(const topology::Mesh& mesh,
+							   topology::Field<topology::Mesh>* field)
 { // stableTimeStepImplicit
   const int numQuadPts = _numQuadPts;
   const int numPropsQuadPt = _numPropsQuadPt;
@@ -277,8 +279,6 @@
   assert(_initialStressCell.size() == numQuadPts*_tensorSize);
   assert(_initialStrainCell.size() == numQuadPts*_tensorSize);
 
-  PylithScalar dtStable = pylith::PYLITH_MAXSCALAR;
-
   // Get cells associated with material
   DM              dmMesh = mesh.dmMesh();
   IS              cellIS;
@@ -291,7 +291,48 @@
   err = ISGetSize(cellIS, &numCells);CHECK_PETSC_ERROR(err);
   err = ISGetIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
 
-  for(PetscInt c = 0; c < numCells; ++c) {
+  // Setup field if necessary.
+  PetscSection fieldSection = PETSC_NULL;
+  PetscVec fieldVec = PETSC_NULL;
+  PetscScalar* fieldArray = PETSC_NULL;
+  PetscInt dof, off;
+  if (field) {
+    const int fiberDim = 1*numQuadPts;
+    fieldSection = field->petscSection();
+    bool useCurrentField = false;
+    if (fieldSection) {
+      // check fiber dimension
+      int fiberDimCurrentLocal = 0;
+      int fiberDimCurrent = 0;
+      if (numCells > 0) {
+	err = PetscSectionGetDof(fieldSection, cells[0], &fiberDimCurrentLocal);CHECK_PETSC_ERROR(err);
+      } // if
+      MPI_Allreduce((void *) &fiberDimCurrentLocal, 
+		    (void *) &fiberDimCurrent, 1, 
+		    MPI_INT, MPI_MAX, field->mesh().comm());
+      assert(fiberDimCurrent > 0);
+      useCurrentField = fiberDim == fiberDimCurrent;
+    } // if
+    if (!useCurrentField) {
+      ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+      logger.stagePush("OutputFields");
+      int_array cellsTmp(cells, numCells);
+      field->newSection(cellsTmp, fiberDim);
+      field->allocate();
+      fieldSection = field->petscSection();
+      logger.stagePop();
+    } // if
+    assert(fieldSection);
+    field->label("stable_dt_implicit");
+    assert(_normalizer);
+    field->scale(_normalizer->timeScale());
+    field->vectorFieldType(topology::FieldBase::MULTI_SCALAR);
+    err = VecGetArray(fieldVec, &fieldArray);CHECK_PETSC_ERROR(err);
+  } // if
+
+  PylithScalar dtStable = pylith::PYLITH_MAXSCALAR;
+  scalar_array dtStableCell(numQuadPts);
+  for (PetscInt c = 0; c < numCells; ++c) {
     const PetscInt cell = cells[c];
 
     retrievePropsAndVars(cell);
@@ -301,10 +342,23 @@
                                 numPropsQuadPt,
                                 &_stateVarsCell[iQuad*numVarsQuadPt],
                                 numVarsQuadPt);
-      if (dt < dtStable)
+      dtStableCell[iQuad] = dt;
+      if (dt < dtStable) {
         dtStable = dt;
+      } // if
     } // for
+    if (field) {
+      err = PetscSectionGetDof(fieldSection, cell, &dof);CHECK_PETSC_ERROR(err);
+      err = PetscSectionGetOffset(fieldSection, cell, &off);CHECK_PETSC_ERROR(err);
+      for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
+	fieldArray[off+iQuad] = dtStableCell[iQuad];
+      } // for
+    } // if
   } // for
+  if (field) {
+    err = VecRestoreArray(fieldVec, &fieldArray);CHECK_PETSC_ERROR(err);
+  } // if
+
   err = ISRestoreIndices(cellIS, &cells);CHECK_PETSC_ERROR(err);
   err = ISDestroy(&cellIS);CHECK_PETSC_ERROR(err);
   
@@ -312,6 +366,164 @@
 } // stableTimeStepImplicit
 
 // ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::ElasticMaterial::stableTimeStepExplicit(const topology::Mesh& mesh,
+							   feassemble::Quadrature<topology::Mesh>* quadrature,
+							   topology::Field<topology::Mesh>* field)
+{ // stableTimeStepImplicit
+  assert(quadrature);
+
+  const int numQuadPts = _numQuadPts;
+  const int numPropsQuadPt = _numPropsQuadPt;
+  const int tensorSize = _tensorSize;
+  const int numVarsQuadPt = _numVarsQuadPt;
+  assert(_propertiesCell.size() == numQuadPts*numPropsQuadPt);
+  assert(_stateVarsCell.size() == numQuadPts*numVarsQuadPt);
+  assert(_elasticConstsCell.size() == numQuadPts*_numElasticConsts);
+  assert(_initialStressCell.size() == numQuadPts*_tensorSize);
+  assert(_initialStrainCell.size() == numQuadPts*_tensorSize);
+
+  // Get cells associated with material
+  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();
+
+  // Setup field if necessary.
+  ALE::Obj<RealSection> fieldSection;
+  if (field) {
+    const int fiberDim = 1*numQuadPts;
+    fieldSection = field->section();
+    bool useCurrentField = false;
+    if (!fieldSection.isNull()) {
+      // check fiber dimension
+      const int fiberDimCurrentLocal = (cells->size() > 0) ? fieldSection->getFiberDimension(*cells->begin()) : 0;
+      int fiberDimCurrent = 0;
+      MPI_Allreduce((void *) &fiberDimCurrentLocal, 
+		    (void *) &fiberDimCurrent, 1, 
+		    MPI_INT, MPI_MAX, field->mesh().comm());
+      assert(fiberDimCurrent > 0);
+      useCurrentField = fiberDim == fiberDimCurrent;
+    } // if
+    if (!useCurrentField) {
+      ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+      logger.stagePush("OutputFields");
+      field->newSection(cells, fiberDim);
+      field->allocate();
+      fieldSection = field->section();
+      logger.stagePop();
+    } // if
+    assert(!fieldSection.isNull());
+    field->label("stable_dt_explicit");
+    assert(_normalizer);
+    field->scale(_normalizer->timeScale());
+    field->vectorFieldType(topology::FieldBase::MULTI_SCALAR);
+  } // if
+
+  const int spaceDim = quadrature->spaceDim();
+  const int numBasis = quadrature->numBasis();
+  scalar_array coordinatesCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& coordinates = 
+    sieveMesh->getRealSection("coordinates");
+  RestrictVisitor coordsVisitor(*coordinates, 
+				coordinatesCell.size(), &coordinatesCell[0]);
+
+  PylithScalar dtStable = pylith::PYLITH_MAXSCALAR;
+  scalar_array dtStableCell(numQuadPts);
+  for (SieveMesh::label_sequence::iterator c_iter=cellsBegin;
+       c_iter != cellsEnd;
+       ++c_iter) {
+    retrievePropsAndVars(*c_iter);
+
+    coordsVisitor.clear();
+    sieveMesh->restrictClosure(*c_iter, coordsVisitor);
+    const double minCellWidth = quadrature->minCellWidth(coordinatesCell);
+
+    for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
+      const PylithScalar dt = 
+	_stableTimeStepExplicit(&_propertiesCell[iQuad*numPropsQuadPt],
+				numPropsQuadPt,
+				&_stateVarsCell[iQuad*numVarsQuadPt],
+				numVarsQuadPt,
+				minCellWidth);
+      dtStableCell[iQuad] = dt;
+      if (dt < dtStable) {
+	dtStable = dt;
+      } // if
+    } // for
+    if (field) {
+      assert(!fieldSection.isNull());
+      assert(numQuadPts == fieldSection->getFiberDimension(*c_iter));
+      fieldSection->updatePoint(*c_iter, &dtStableCell[0]);
+    } // if
+  } // for
+  
+  return dtStable;
+} // stableTimeStepExplicit
+
+// ----------------------------------------------------------------------
+// Get stable time step for implicit time integration (return large value).
+PylithScalar
+pylith::materials::ElasticMaterial::_stableTimeStepImplicitMax(const topology::Mesh& mesh,
+							       topology::Field<topology::Mesh>* field)
+{ // _stableTimeStepImplicitMax
+  const PylithScalar dtStable = pylith::PYLITH_MAXSCALAR;
+  
+  if (field) {
+    const int numQuadPts = _numQuadPts;
+
+    const ALE::Obj<RealSection>& fieldSection = field->section();
+    // Get cells associated with material
+    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 fiberDim = 1*numQuadPts;
+    bool useCurrentField = false;
+    if (!fieldSection.isNull()) {
+      // check fiber dimension
+      const int fiberDimCurrentLocal = (cells->size() > 0) ? fieldSection->getFiberDimension(*cells->begin()) : 0;
+      int fiberDimCurrent = 0;
+      MPI_Allreduce((void *) &fiberDimCurrentLocal, 
+		    (void *) &fiberDimCurrent, 1, 
+		    MPI_INT, MPI_MAX, field->mesh().comm());
+      assert(fiberDimCurrent > 0);
+      useCurrentField = fiberDim == fiberDimCurrent;
+    } // if
+    if (!useCurrentField) {
+      ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
+      logger.stagePush("OutputFields");
+      field->newSection(cells, fiberDim);
+      field->allocate();
+      logger.stagePop();
+    } // if
+    assert(!fieldSection.isNull());
+    field->label("stable_dt_implicit");
+    assert(_normalizer);
+    field->scale(_normalizer->timeScale());
+    field->vectorFieldType(topology::FieldBase::MULTI_SCALAR);
+
+    scalar_array dtStableCell(numQuadPts);
+    dtStableCell = PYLITH_MAXSCALAR;
+    for (SieveMesh::label_sequence::iterator c_iter=cellsBegin;
+	 c_iter != cellsEnd;
+	 ++c_iter) {
+      assert(numQuadPts == fieldSection->getFiberDimension(*c_iter));
+      fieldSection->updatePoint(*c_iter, &dtStableCell[0]);
+    } // for
+  } // if
+  
+  return dtStable;
+} // _stableTimeStepImplicitMax
+
+// ----------------------------------------------------------------------
 // Allocate cell arrays.
 void
 pylith::materials::ElasticMaterial::_allocateCellArrays(void)

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticMaterial.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticMaterial.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticMaterial.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -172,16 +172,31 @@
 
   /** Get stable time step for implicit time integration.
    *
-   * @pre Must call retrievePropsAndVars for cell before calling
-   * stableTimeStep().
+   * Default is MAXFLOAT (or 1.0e+30 if MAXFLOAT is not defined in math.h).
    *
+   * @param mesh Finite-element mesh.
+   * @param field Field for storing min stable time step for each cell.
+   *
+   * @returns Time step
+   */
+  virtual
+  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh,
+				      topology::Field<topology::Mesh>* field =0);
+
+  /** Get stable time step for explicit time integration.
+   *
    * Default is MAXFLOAT (or 1.0e+30 if MAXFLOAT is not defined in math.h).
    *
    * @param mesh Finite-element mesh.
+   * @param quadrature Quadrature for finite-element integration
+   * @param field Field for storing min stable time step for each cell.
+   *
    * @returns Time step
    */
   virtual
-  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh);
+  PylithScalar stableTimeStepExplicit(const topology::Mesh& mesh,
+				      feassemble::Quadrature<topology::Mesh>* quadrature,
+				      topology::Field<topology::Mesh>* field =0);
 
   /** Set whether elastic or inelastic constitutive relations are used.
    *
@@ -315,10 +330,41 @@
    */
   virtual
   PylithScalar _stableTimeStepImplicit(const PylithScalar* properties,
-				 const int numProperties,
-				 const PylithScalar* stateVars,
-				 const int numStateVars) const = 0;
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars) const = 0;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  virtual
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const = 0;
+  
+  // PROTECTED METHODS //////////////////////////////////////////////////
+protected :
+
+  /** Get stable time step for implicit time integration for a
+   * material where the stable time step is infinite.
+   *
+   * @param mesh Finite-element mesh.
+   * @param field Field for storing min stable time step for each cell.
+   *
+   * @returns PYLITH::MAX_SCALAR;
+   */
+  PylithScalar _stableTimeStepImplicitMax(const topology::Mesh& mesh,
+					  topology::Field<topology::Mesh>* field =0);
+
   /** Compute 2D deviatoric stress/strain from vector and mean value.
    *
    * @param deviatoric Array for deviatoric tensor.

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStrain.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStrain.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStrain.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -311,9 +311,9 @@
 // ----------------------------------------------------------------------
 // Get stable time step for implicit time integration.
 PylithScalar
-pylith::materials::ElasticPlaneStrain::stableTimeStepImplicit(
-					const topology::Mesh& mesh) {
-  return pylith::PYLITH_MAXSCALAR;
+pylith::materials::ElasticPlaneStrain::stableTimeStepImplicit(const topology::Mesh& mesh,
+							      topology::Field<topology::Mesh>* field) {
+  return ElasticMaterial::_stableTimeStepImplicitMax(mesh, field);
 }
 
 // ----------------------------------------------------------------------
@@ -329,4 +329,28 @@
 } // _stableTimeStepImplicit
 
 
+// ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::ElasticPlaneStrain::_stableTimeStepExplicit(const PylithScalar* properties,
+							       const int numProperties,
+							       const PylithScalar* stateVars,
+							       const int numStateVars,
+							       const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
 // End of file 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStrain.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStrain.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStrain.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,9 +59,12 @@
    * Default is MAXDOUBLE (or 1.0e+30 if MAXFLOAT is not defined in math.h).
    *
    * @param mesh Finite-element mesh.
+   * @param field Field for storing min stable time step for each cell.
+   *
    * @returns Time step
    */
-  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh);
+  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh,
+				      topology::Field<topology::Mesh>* field =0);
 
   // PROTECTED METHODS //////////////////////////////////////////////////
 protected :
@@ -181,6 +184,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   // PRIVATE MEMBERS ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStress.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStress.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStress.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -314,9 +314,9 @@
 // ----------------------------------------------------------------------
 // Get stable time step for implicit time integration.
 PylithScalar
-pylith::materials::ElasticPlaneStress::stableTimeStepImplicit(
-					const topology::Mesh& mesh) {
-  return pylith::PYLITH_MAXSCALAR;
+pylith::materials::ElasticPlaneStress::stableTimeStepImplicit(const topology::Mesh& mesh,
+							      topology::Field<topology::Mesh>* field) {
+  return ElasticMaterial::_stableTimeStepImplicitMax(mesh, field);
 }
 
 // ----------------------------------------------------------------------
@@ -332,4 +332,28 @@
 } // _stableTimeStepImplicit
 
 
+// ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::ElasticPlaneStress::_stableTimeStepExplicit(const PylithScalar* properties,
+							       const int numProperties,
+							       const PylithScalar* stateVars,
+							       const int numStateVars,
+							       const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
 // End of file 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStress.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStress.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticPlaneStress.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -61,9 +61,12 @@
    * Default is MAXDOUBLE (or 1.0e+30 if MAXFLOAT is not defined in math.h).
    *
    * @param mesh Finite-element mesh.
+   * @param field Field for storing min stable time step for each cell.
+   *
    * @returns Time step
    */
-  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh);
+  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh,
+				      topology::Field<topology::Mesh>* field =0);
 
   // PROTECTED METHODS //////////////////////////////////////////////////
 protected :
@@ -183,6 +186,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   // PRIVATE MEMBERS ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStrain1D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStrain1D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStrain1D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -291,9 +291,9 @@
 // ----------------------------------------------------------------------
 // Get stable time step for implicit time integration.
 PylithScalar
-pylith::materials::ElasticStrain1D::stableTimeStepImplicit(
-					const topology::Mesh& mesh) {
-  return pylith::PYLITH_MAXSCALAR;
+pylith::materials::ElasticStrain1D::stableTimeStepImplicit(const topology::Mesh& mesh,
+							   topology::Field<topology::Mesh>* field) {
+  return ElasticMaterial::_stableTimeStepImplicitMax(mesh, field);
 }
 
 // ----------------------------------------------------------------------
@@ -309,4 +309,28 @@
 } // _stableTimeStepImplicit
 
 
+// ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::ElasticStrain1D::_stableTimeStepExplicit(const PylithScalar* properties,
+							    const int numProperties,
+							    const PylithScalar* stateVars,
+							    const int numStateVars,
+							    const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
 // End of file 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStrain1D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStrain1D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStrain1D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -60,9 +60,12 @@
    * Default is MAXDOUBLE (or 1.0e+30 if MAXFLOAT is not defined in math.h).
    *
    * @param mesh Finite-element mesh.
+   * @param field Field for storing min stable time step for each cell.
+   *
    * @returns Time step
    */
-  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh);
+  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh,
+				      topology::Field<topology::Mesh>* field =0);
 
   // PROTECTED METHODS //////////////////////////////////////////////////
 protected :
@@ -182,6 +185,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   // PRIVATE MEMBERS ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStress1D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStress1D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStress1D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -291,9 +291,9 @@
 // ----------------------------------------------------------------------
 // Get stable time step for implicit time integration.
 PylithScalar
-pylith::materials::ElasticStress1D::stableTimeStepImplicit(
-					const topology::Mesh& mesh) {
-  return pylith::PYLITH_MAXSCALAR;
+pylith::materials::ElasticStress1D::stableTimeStepImplicit(const topology::Mesh& mesh,
+							   topology::Field<topology::Mesh>* field) {
+  return ElasticMaterial::_stableTimeStepImplicitMax(mesh, field);
 }
 
 // ----------------------------------------------------------------------
@@ -309,4 +309,28 @@
 } // _stableTimeStepImplicit
 
 
+// ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::ElasticStress1D::_stableTimeStepExplicit(const PylithScalar* properties,
+							    const int numProperties,
+							    const PylithScalar* stateVars,
+							    const int numStateVars,
+							    const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
 // End of file 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStress1D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStress1D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/ElasticStress1D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -61,9 +61,12 @@
    * Default is MAXDOUBLE (or 1.0e+30 if MAXFLOAT is not defined in math.h).
    *
    * @param mesh Finite-element mesh.
+   * @param field Field for storing min stable time step for each cell.
+   *
    * @returns Time step
    */
-  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh);
+  PylithScalar stableTimeStepImplicit(const topology::Mesh& mesh,
+				      topology::Field<topology::Mesh>* field =0);
 
   // PROTECTED METHODS //////////////////////////////////////////////////
 protected :
@@ -183,6 +186,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   // PRIVATE MEMBERS ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellIsotropic3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellIsotropic3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellIsotropic3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -895,8 +895,31 @@
   return dtStable;
 } // _stableTimeStepImplicit
 
-#include <iostream>
 // ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::GenMaxwellIsotropic3D::_stableTimeStepExplicit(const PylithScalar* properties,
+								  const int numProperties,
+								  const PylithScalar* stateVars,
+								  const int numStateVars,
+								  const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_muEff];
+  const PylithScalar lambda = properties[p_lambdaEff];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
+// ----------------------------------------------------------------------
 // Compute viscous strain for current time step.
 void
 pylith::materials::GenMaxwellIsotropic3D::_computeStateVars(

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellIsotropic3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellIsotropic3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellIsotropic3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -230,6 +230,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   // PRIVATE TYPEDEFS ///////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellPlaneStrain.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellPlaneStrain.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellPlaneStrain.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -843,8 +843,32 @@
   return dtStable;
 } // _stableTimeStepImplicit
 
-#include <iostream>
+
 // ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::GenMaxwellPlaneStrain::_stableTimeStepExplicit(const PylithScalar* properties,
+								  const int numProperties,
+								  const PylithScalar* stateVars,
+								  const int numStateVars,
+								  const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_muEff];
+  const PylithScalar lambda = properties[p_lambdaEff];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
+// ----------------------------------------------------------------------
 // Compute viscous strain for current time step.
 void
 pylith::materials::GenMaxwellPlaneStrain::_computeStateVars(

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellPlaneStrain.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellPlaneStrain.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellPlaneStrain.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -240,6 +240,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   // PRIVATE TYPEDEFS ///////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellQpQsIsotropic3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellQpQsIsotropic3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellQpQsIsotropic3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -974,6 +974,30 @@
 } // _stableTimeStepImplicit
 
 // ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::GenMaxwellQpQsIsotropic3D::_stableTimeStepExplicit(const PylithScalar* properties,
+								      const int numProperties,
+								      const PylithScalar* stateVars,
+								      const int numStateVars,
+								      const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_muEff];
+  const PylithScalar kappa = properties[p_kEff];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((kappa + 4.0/3.0*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
+// ----------------------------------------------------------------------
 // Compute viscous strain for current time step.
 void
 pylith::materials::GenMaxwellQpQsIsotropic3D::_computeStateVars(

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellQpQsIsotropic3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellQpQsIsotropic3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/GenMaxwellQpQsIsotropic3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -230,6 +230,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   // PRIVATE TYPEDEFS ///////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/Material.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/Material.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/Material.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -109,9 +109,8 @@
 // ----------------------------------------------------------------------
 // Get physical property parameters and initial state (if used) from database.
 void
-pylith::materials::Material::initialize(
-		     const topology::Mesh& mesh,
-		     feassemble::Quadrature<topology::Mesh>* quadrature)
+pylith::materials::Material::initialize(const topology::Mesh& mesh,
+					feassemble::Quadrature<topology::Mesh>* quadrature)
 { // initialize
   assert(0 != _dbProperties);
   assert(0 != quadrature);
@@ -149,12 +148,12 @@
   _properties->allocate();
   _properties->zero();
   PetscSection propertiesSection = _properties->petscSection();
-  Vec          propertiesVec     = _properties->localVector();
+  PetscVec propertiesVec = _properties->localVector();
 
 #if !defined(PRECOMPUTE_GEOMETRY)
   scalar_array coordinatesCell(numBasis*spaceDim);
   PetscSection coordSection;
-  Vec          coordVec;
+  PetscVec coordVec;
   err = DMComplexGetCoordinateSection(dmMesh, &coordSection);CHECK_PETSC_ERROR(err);
   err = DMGetCoordinatesLocal(dmMesh, &coordVec);CHECK_PETSC_ERROR(err);
   assert(coordSection);assert(coordVec);
@@ -176,7 +175,7 @@
   // if there is no initial state, because this we will use this field
   // to hold the state variables.
   PetscSection stateVarsSection = PETSC_NULL;
-  Vec          stateVarsVec     = PETSC_NULL;
+  PetscVec stateVarsVec = PETSC_NULL;
   delete _stateVars; _stateVars = new topology::Field<topology::Mesh>(mesh);
   _stateVars->label("state variables");
   fiberDim = numQuadPts * _numVarsQuadPt;
@@ -489,7 +488,7 @@
 
     // Allocate buffer for state variable field if necessary.
     PetscSection fieldSection    = field->petscSection();
-    Vec          fieldVec        = field->localVector();
+    PetscVec          fieldVec        = field->localVector();
     bool useCurrentField = fieldSection != PETSC_NULL;
     if (fieldSection) {
       // check fiber dimension

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/Material.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/Material.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/Material.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -195,7 +195,8 @@
    * @param field Field over material cells.
    * @param name Name of field to retrieve.
    */
-  void getField(topology::Field<topology::Mesh> *field, const char* name) const;
+  void getField(topology::Field<topology::Mesh> *field,
+		const char* name) const;
 
   /** Get the field with all properties.
    *

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellIsotropic3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellIsotropic3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellIsotropic3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -739,6 +739,30 @@
 } // _stableTimeStepImplicit
 
 // ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::MaxwellIsotropic3D::_stableTimeStepExplicit(const PylithScalar* properties,
+							       const int numProperties,
+							       const PylithScalar* stateVars,
+							       const int numStateVars,
+							       const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
+// ----------------------------------------------------------------------
 // Compute viscous strain for current time step.
 void
 pylith::materials::MaxwellIsotropic3D::_computeStateVars(

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellIsotropic3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellIsotropic3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellIsotropic3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -218,6 +218,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   // PRIVATE TYPEDEFS ///////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellPlaneStrain.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellPlaneStrain.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellPlaneStrain.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -697,6 +697,30 @@
 } // _stableTimeStepImplicit
 
 // ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::MaxwellPlaneStrain::_stableTimeStepExplicit(const PylithScalar* properties,
+							       const int numProperties,
+							       const PylithScalar* stateVars,
+							       const int numStateVars,
+							       const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
+// ----------------------------------------------------------------------
 // Compute viscous strain for current time step.
 void
 pylith::materials::MaxwellPlaneStrain::_computeStateVars(

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellPlaneStrain.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellPlaneStrain.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/MaxwellPlaneStrain.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -232,6 +232,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   // PRIVATE TYPEDEFS ///////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLaw3D.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLaw3D.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLaw3D.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -436,6 +436,30 @@
 } // _stableTimeStepImplicit
 
 // ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::PowerLaw3D::_stableTimeStepExplicit(const PylithScalar* properties,
+						       const int numProperties,
+						       const PylithScalar* stateVars,
+						       const int numStateVars,
+						       const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
+// ----------------------------------------------------------------------
 // Compute stress tensor at location from properties as an elastic
 // material.
 void

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLaw3D.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLaw3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLaw3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -233,6 +233,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   /** Update state variables (for next time step).
    *
    * @param stateVars State variables at location.

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLawPlaneStrain.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLawPlaneStrain.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLawPlaneStrain.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -436,6 +436,30 @@
 } // _stableTimeStepImplicit
 
 // ----------------------------------------------------------------------
+// Get stable time step for explicit time integration.
+PylithScalar
+pylith::materials::PowerLawPlaneStrain::_stableTimeStepExplicit(const PylithScalar* properties,
+								const int numProperties,
+								const PylithScalar* stateVars,
+								const int numStateVars,
+								const double minCellWidth) const
+{ // _stableTimeStepExplicit
+  assert(properties);
+  assert(_numPropsQuadPt == numProperties);
+ 
+  const PylithScalar mu = properties[p_mu];
+  const PylithScalar lambda = properties[p_lambda];
+  const PylithScalar density = properties[p_density];
+
+  assert(density > 0.0);
+  const PylithScalar vp = sqrt((lambda + 2*mu) / density);
+
+  const PylithScalar dtStable = minCellWidth / vp;
+  return dtStable;
+} // _stableTimeStepExplicit
+
+
+// ----------------------------------------------------------------------
 // Compute stress tensor at location from properties as an elastic
 // material.
 void

Modified: short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLawPlaneStrain.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLawPlaneStrain.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/materials/PowerLawPlaneStrain.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -233,6 +233,22 @@
 				 const PylithScalar* stateVars,
 				 const int numStateVars) const;
 
+  /** Get stable time step for explicit time integration.
+   *
+   * @param properties Properties at location.
+   * @param numProperties Number of properties.
+   * @param stateVars State variables at location.
+   * @param numStateVars Number of state variables.
+   * @param minCellWidth Minimum width across cell.
+   *
+   * @returns Time step
+   */
+  PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+				       const int numProperties,
+				       const PylithScalar* stateVars,
+				       const int numStateVars,
+				       const double minCellWidth) const;
+  
   /** Update state variables (for next time step).
    *
    * @param stateVars State variables at location.

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -50,8 +50,9 @@
 void
 pylith::meshio::DataWriterHDF5<mesh_type, field_type>::deallocate(void)
 { // deallocate
+  DataWriter<mesh_type, field_type>::deallocate();
+
   PetscErrorCode err = 0;
-
   err = PetscViewerDestroy(&_viewer); CHECK_PETSC_ERROR(err);
   err = VecDestroy(&_tstamp); CHECK_PETSC_ERROR(err);
 } // deallocate

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterHDF5Ext.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -50,12 +50,14 @@
 void
 pylith::meshio::DataWriterHDF5Ext<mesh_type,field_type>::deallocate(void)
 { // deallocate
+  DataWriter<mesh_type, field_type>::deallocate();
+
+  PetscErrorCode err = 0;
   const typename dataset_type::const_iterator& dEnd = _datasets.end();
   for (typename dataset_type::iterator d_iter=_datasets.begin();
        d_iter != dEnd;
        ++d_iter) {
-    PetscErrorCode err = PetscViewerDestroy(&d_iter->second.viewer);
-    CHECK_PETSC_ERROR(err);
+    err = PetscViewerDestroy(&d_iter->second.viewer);CHECK_PETSC_ERROR(err);
   } // for
 } // deallocate
   

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterVTK.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterVTK.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/DataWriterVTK.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -70,9 +70,10 @@
 void
 pylith::meshio::DataWriterVTK<mesh_type, field_type>::deallocate(void)
 { // deallocate
-  if (0 != _viewer)
-    PetscViewerDestroy(&_viewer);
-  _viewer = 0;
+  DataWriter<mesh_type, field_type>::deallocate();
+
+  PetscErrorCode err = 0;
+  err = PetscViewerDestroy(&_viewer);CHECK_PETSC_ERROR(err);
 } // deallocate
   
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/ExodusII.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/ExodusII.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/ExodusII.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -51,10 +51,18 @@
 // Destructor
 pylith::meshio::ExodusII::~ExodusII(void)
 { // destructor
-  close();
+  deallocate();
 } // destructor
 
 // ----------------------------------------------------------------------
+// Deallocate data structures.
+void
+pylith::meshio::ExodusII::deallocate(void)
+{ // deallocate
+  close();
+} // deallocate
+
+// ----------------------------------------------------------------------
 // Set filename.
 void
 pylith::meshio::ExodusII::filename(const char* name)

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/ExodusII.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/ExodusII.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/ExodusII.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,6 +56,9 @@
   /// Destructor
   ~ExodusII(void);
 
+  /// Deallocate data structures.
+  void deallocate(void);
+
   /** Set filename.
    *
    * @param filename Name of file

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/OutputSolnPoints.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/OutputSolnPoints.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/OutputSolnPoints.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -257,12 +257,12 @@
     _fields->get("buffer (interpolated)");
   if (fieldInterp.section().isNull() || vertices->size()*fiberDim != fieldInterp.sectionSize()) {
     fieldInterp.newSection(vertices, fiberDim);
-    fieldInterp.label(field.label());
     fieldInterp.allocate();
   } // if
   logger.stagePop();
 
   fieldInterp.zero();
+  fieldInterp.label(field.label());
   fieldInterp.vectorFieldType(field.vectorFieldType());
   fieldInterp.scale(field.scale());
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/OutputSolnPoints.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/OutputSolnPoints.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/OutputSolnPoints.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -38,8 +38,7 @@
 /** @brief C++ object for managing output of finite-element data over
  * a subdomain.
  */
-class pylith::meshio::OutputSolnPoints : 
-  public OutputManager<topology::Mesh, topology::Field<topology::Mesh> >
+class pylith::meshio::OutputSolnPoints : public OutputManager<topology::Mesh, topology::Field<topology::Mesh> >
 { // OutputSolnPoints
   friend class TestOutputSolnPoints; // unit testing
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -165,8 +165,13 @@
 	     std::string("Matrix") == fieldsMetadata[iField].vectorFieldType) ) {
 	  const int fiberDim = fieldsMetadata[iField].fiberDim;
 	  for (int component=0; component < fiberDim; ++component)
-	    _writeGridAttributeComponent(fieldsMetadata[iField],
-					 iTimeStep, component);
+	    _writeGridAttributeComponent(fieldsMetadata[iField], iTimeStep, component, spaceDim);
+	} else if (3 == spaceDim && 
+		   (std::string("Tensor6") == fieldsMetadata[iField].vectorFieldType  ||
+		    std::string("Matrix") == fieldsMetadata[iField].vectorFieldType) ) {
+	  const int fiberDim = fieldsMetadata[iField].fiberDim;
+	  for (int component=0; component < fiberDim; ++component)
+	    _writeGridAttributeComponent(fieldsMetadata[iField], iTimeStep, component, spaceDim);
 	} else {
 	  _writeGridAttribute(fieldsMetadata[iField],
 			      iTimeStep);
@@ -183,13 +188,18 @@
     const int iTimeStep = 0;
     for (int iField=0; iField < numFields; ++iField) {
       if (2 == spaceDim && 
-	    (std::string("Vector") == fieldsMetadata[iField].vectorFieldType ||
-	     std::string("Tensor6") == fieldsMetadata[iField].vectorFieldType  ||
-	     std::string("Matrix") == fieldsMetadata[iField].vectorFieldType) ) {
+	  (std::string("Vector") == fieldsMetadata[iField].vectorFieldType ||
+	   std::string("Tensor6") == fieldsMetadata[iField].vectorFieldType  ||
+	   std::string("Matrix") == fieldsMetadata[iField].vectorFieldType) ) {
 	const int fiberDim = fieldsMetadata[iField].fiberDim;
 	for (int component=0; component < fiberDim; ++component)
-	  _writeGridAttributeComponent(fieldsMetadata[iField],
-				       iTimeStep, component);
+	  _writeGridAttributeComponent(fieldsMetadata[iField], iTimeStep, component, spaceDim);
+      } else if (3 == spaceDim && 
+		 (std::string("Tensor6") == fieldsMetadata[iField].vectorFieldType  ||
+		  std::string("Matrix") == fieldsMetadata[iField].vectorFieldType) ) {
+	const int fiberDim = fieldsMetadata[iField].fiberDim;
+	for (int component=0; component < fiberDim; ++component)
+	  _writeGridAttributeComponent(fieldsMetadata[iField], iTimeStep, component, spaceDim);
       } else {
 	_writeGridAttribute(fieldsMetadata[iField],
 			    iTimeStep);
@@ -504,7 +514,8 @@
 void
 pylith::meshio::Xdmf::_writeGridAttributeComponent(const FieldMetadata& metadata,
 						   const int iTime,
-						   const int component)
+						   const int component,
+						   const int spaceDim)
 { // _writeGridAttribute
   assert(_file.is_open() && _file.good());
 
@@ -529,6 +540,9 @@
     case 1:
       componentName = std::string(metadata.name) + std::string("_y");
       break;
+    case 2:
+      componentName = std::string(metadata.name) + std::string("_z");
+      break;
     default:
       { // default
 	std::ostringstream msg;
@@ -539,24 +553,65 @@
       } // default
     } // switch
   } else if (std::string("Tensor6") == metadata.vectorFieldType) {
-    switch (component) {
-    case 0:
-      componentName = std::string(metadata.name) + std::string("_xx");
+    switch (spaceDim) {
+    case 2 :
+      switch (component) {
+      case 0:
+	componentName = std::string(metadata.name) + std::string("_xx");
+	break;
+      case 1:
+	componentName = std::string(metadata.name) + std::string("_yy");
+	break;
+      case 2:
+	componentName = std::string(metadata.name) + std::string("_xy");
+	break;
+      default:
+	{ // default
+	  std::ostringstream msg;
+	  msg << "Unknown component " << component << " while writing Xdmf file.";
+	  std::cerr << msg.str() << std::endl;
+	  assert(0);
+	  throw std::logic_error(msg.str());
+	} // default
+      } // switch
       break;
-    case 1:
-      componentName = std::string(metadata.name) + std::string("_yy");
-      break;
-    case 2:
-      componentName = std::string(metadata.name) + std::string("_xy");
-      break;
-    default:
-      { // default
+    case 3 :
+      switch (component) {
+      case 0:
+	componentName = std::string(metadata.name) + std::string("_xx");
+	break;
+      case 1:
+	componentName = std::string(metadata.name) + std::string("_yy");
+	break;
+      case 2:
+	componentName = std::string(metadata.name) + std::string("_zz");
+	break;
+      case 3:
+	componentName = std::string(metadata.name) + std::string("_xy");
+	break;
+      case 4:
+	componentName = std::string(metadata.name) + std::string("_yz");
+	break;
+      case 5:
+	componentName = std::string(metadata.name) + std::string("_xz");
+	break;
+      default: {
 	std::ostringstream msg;
 	msg << "Unknown component " << component << " while writing Xdmf file.";
 	std::cerr << msg.str() << std::endl;
 	assert(0);
 	throw std::logic_error(msg.str());
       } // default
+      } // switch
+      break;
+      
+    default: {
+	std::ostringstream msg;
+	msg << "Unknown spatial dimension " << spaceDim << " while writing Xdmf file.";
+	std::cerr << msg.str() << std::endl;
+	assert(0);
+	throw std::logic_error(msg.str());
+    } // default
     } // switch
   } else if (std::string("Matrix") == metadata.vectorFieldType) {
     std::ostringstream sname;

Modified: short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/meshio/Xdmf.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -148,10 +148,12 @@
    * @param metadata Metadata for field.
    * @param iTime Index of time step.
    * @param component Index of component.
+   * @param spaceDim Spatial dimension.
    */
   void _writeGridAttributeComponent(const FieldMetadata& metadata,
 				    const int iTime,
-				    const int component);
+				    const int component,
+				    const int spaceDim);
 
 // PRIVATE MEMBERS ------------------------------------------------------
 private :

Modified: short/3D/PyLith/trunk/libsrc/pylith/problems/Explicit.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/problems/Explicit.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/problems/Explicit.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -36,7 +36,6 @@
 // Destructor
 pylith::problems::Explicit::~Explicit(void)
 { // destructor
-  deallocate();
 } // destructor
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/libsrc/pylith/problems/Formulation.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/problems/Formulation.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/problems/Formulation.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -262,54 +262,6 @@
 } // reformResidual
 
 // ----------------------------------------------------------------------
-// Reform system residual.
-void
-pylith::problems::Formulation::reformResidualLumped(const PetscVec* tmpResidualVec,
-                const PetscVec* tmpSolutionVec)
-{ // reformResidualLumped
-  assert(0 != _fields);
-
-  // Update section view of field.
-  if (0 != tmpSolutionVec) {
-    topology::Field<topology::Mesh>& solution = _fields->solution();
-    solution.scatterVectorToSection(*tmpSolutionVec);
-  } // if
-
-  // Update rate fields (must be consistent with current solution).
-  calcRateFields();  
-
-  // Set residual to zero.
-  topology::Field<topology::Mesh>& residual = _fields->get("residual");
-  residual.zero();
-
-  // Add in contributions that require assembly.
-  int numIntegrators = _meshIntegrators.size();
-  assert(numIntegrators > 0); // must have at least 1 bulk integrator
-  for (int i=0; i < numIntegrators; ++i) {
-    _meshIntegrators[i]->timeStep(_dt);
-    _meshIntegrators[i]->integrateResidualLumped(residual, _t, _fields);
-  } // for
-  numIntegrators = _submeshIntegrators.size();
-  for (int i=0; i < numIntegrators; ++i) {
-    _submeshIntegrators[i]->timeStep(_dt);
-    _submeshIntegrators[i]->integrateResidualLumped(residual, _t, _fields);
-  } // for
-
-  // Assemble residual.
-  residual.complete();
-
-  // Update PETSc view of residual
-  if (0 != tmpResidualVec)
-    residual.scatterSectionToVector(*tmpResidualVec);
-  else
-    residual.scatterSectionToVector();
-
-  // TODO: Move this to SolverLinear
-  if (0 != tmpResidualVec)
-    VecScale(*tmpResidualVec, -1.0);
-} // reformResidualLumped
-
-// ----------------------------------------------------------------------
 // Reform system Jacobian.
 void
 pylith::problems::Formulation::reformJacobian(const PetscVec* tmpSolutionVec)
@@ -362,7 +314,7 @@
 // Reform system Jacobian.
 void
 pylith::problems::Formulation::reformJacobianLumped(void)
-{ // reformJacobian
+{ // reformJacobianLumped
   assert(0 != _jacobianLumped);
   assert(0 != _fields);
 
@@ -380,7 +332,7 @@
   // Assemble jacbian.
   _jacobianLumped->complete();
 
-} // reformJacobian
+} // reformJacobianLumped
 
 // ----------------------------------------------------------------------
 // Constrain solution space.

Modified: short/3D/PyLith/trunk/libsrc/pylith/problems/Formulation.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/problems/Formulation.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/problems/Formulation.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -165,14 +165,6 @@
   void reformResidual(const PetscVec* tmpResidualVec =0,
 		      const PetscVec* tmpSolutionVec =0);
   
-  /** Reform system residual.
-   *
-   * @param tmpResidualVec Temporary PETSc vector for residual.
-   * @param tmpSolutionVec Temporary PETSc vector for solution.
-   */
-  void reformResidualLumped(const PetscVec* tmpResidualVec =0,
-          const PetscVec* tmpSolutionVec =0);
-
   /* Reform system Jacobian.
    *
    * @param tmpSolveSolnVec Temporary PETSc vector for solution.

Modified: short/3D/PyLith/trunk/libsrc/pylith/problems/Implicit.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/problems/Implicit.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/problems/Implicit.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -36,7 +36,6 @@
 // Destructor
 pylith::problems::Implicit::~Implicit(void)
 { // destructor
-  deallocate();
 } // destructor
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/libsrc/pylith/problems/SolverLinear.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/problems/SolverLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/problems/SolverLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -108,6 +108,7 @@
   _logger->eventEnd(scatterEvent);
   _logger->eventBegin(setupEvent);
 
+
   PetscErrorCode err = 0;
   const PetscMat jacobianMat = jacobian->matrix();
   if (!jacobian->valuesChanged()) {
@@ -119,37 +120,6 @@
   } // else
   jacobian->resetValuesChanged();
 
-#if 0 // OBSOLETE? Replaced by stuff in Solver?
-  // Update KSP operators with custom preconditioner if necessary.
-  const ALE::Obj<RealSection>& solutionSection = solution->section();
-  assert(!solutionSection.isNull());
-  const ALE::Obj<SieveMesh>& sieveMesh = solution->mesh().sieveMesh();
-  assert(!sieveMesh.isNull());
-
-  if (solutionSection->getNumSpaces() > sieveMesh->getDimension() &&
-      _jacobianPCFault) {
-    
-    PetscPC pc = 0;
-    PCCompositeType ctype;
-    
-    err = KSPSetUp(_ksp); CHECK_PETSC_ERROR(err);
-    err = KSPGetPC(_ksp, &pc); CHECK_PETSC_ERROR(err);
-    err = PCFieldSplitGetType(pc, &ctype); CHECK_PETSC_ERROR(err);
-    if (ctype != PC_COMPOSITE_SCHUR) {
-      PetscKSP    *ksps = 0;
-      PylithInt    num  = 0;
-      PetscMat     A    = 0;
-      MatStructure flag;
-
-      err = PCFieldSplitGetSubKSP(pc, &num, &ksps); CHECK_PETSC_ERROR(err);
-      err = KSPGetOperators(ksps[num-1], &A, PETSC_NULL, &flag);CHECK_PETSC_ERROR(err);
-      err = PetscObjectReference((PetscObject) A);CHECK_PETSC_ERROR(err);
-      err = KSPSetOperators(ksps[num-1], A, _jacobianPCFault, flag);CHECK_PETSC_ERROR(err);
-      err = PetscFree(ksps);CHECK_PETSC_ERROR(err);
-    }
-  } // if
-#endif
-
   const PetscVec residualVec = residual.globalVector();
   const PetscVec solutionVec = solution->globalVector();
 

Modified: short/3D/PyLith/trunk/libsrc/pylith/problems/SolverNonlinear.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/problems/SolverNonlinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/problems/SolverNonlinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -36,18 +36,12 @@
 #define isinf std::isinf // TEMPORARY
 
 // Customized line search based on PETSc code in
-// src/snes/linesearch/bt/linesearchbt.c.
+// src/snes/linesearch/impls/bt/linesearchbt.c.
 #include <petsc-private/snesimpl.h>
 #include <petsc-private/linesearchimpl.h>
 
-typedef enum {
-  SNES_LINESEARCH_BT_QUADRATIC, 
-  SNES_LINESEARCH_BT_CUBIC,
-} PetscSNESLineSearchBTOrder;
-
 struct PetscSNESLineSearch_BT {
   PetscReal        alpha; /* sufficient decrease parameter */
-  PetscSNESLineSearchBTOrder order;
 };
 
 #define PYLITH_CUSTOM_LINESEARCH 1
@@ -109,13 +103,15 @@
   err = SNESSetJacobian(_snes, jacobian.matrix(), _jacobianPC, reformJacobian, (void*) formulation);
   CHECK_PETSC_ERROR(err);
 
-  err = SNESSetFromOptions(_snes); CHECK_PETSC_ERROR(err);
-  err = SNESSetComputeInitialGuess(_snes, initialGuess, (void*) formulation); CHECK_PETSC_ERROR(err);
+  // Set default line search type to SNESSHELL and use our custom line search
   PetscSNESLineSearch ls;
+  err = SNESGetSNESLineSearch(_snes, &ls);CHECK_PETSC_ERROR(err);
+  err = SNESLineSearchSetType(ls, SNESSHELL);CHECK_PETSC_ERROR(err);
+  err = SNESLineSearchShellSetUserFunc(ls, lineSearch, (void*) formulation);CHECK_PETSC_ERROR(err);
 
-  err = SNESGetSNESLineSearch(_snes, &ls); CHECK_PETSC_ERROR(err);
-  err = SNESLineSearchSetType(ls, SNESLINESEARCHSHELL); CHECK_PETSC_ERROR(err);
-  err = SNESLineSearchShellSetUserFunc(ls, lineSearch, (void*) formulation); CHECK_PETSC_ERROR(err);
+  // Get SNES options and allow the user to override the line search type
+  err = SNESSetFromOptions(_snes);CHECK_PETSC_ERROR(err);
+  err = SNESSetComputeInitialGuess(_snes, initialGuess, (void*) formulation);CHECK_PETSC_ERROR(err);
 
   if (formulation->splitFields()) {
     PetscKSP ksp = 0;
@@ -170,7 +166,7 @@
   Formulation* formulation = (Formulation*) context;
   assert(0 != formulation);
 
-  // Make sure we have an admissible Lagrange force (\lambda)
+  // Make sure we have an admissible Lagrange multiplier (\lambda)
   formulation->constrainSolnSpace(&tmpSolutionVec);
 
   // Reform residual
@@ -219,8 +215,8 @@
   Vec            X, F, Y, W, G;
   SNES           snes;
   PetscReal      fnorm, xnorm, ynorm, gnorm, gnormprev;
-  PetscReal      lambda, lambdatemp, lambdaprev, minlambda, maxstep, rellength, initslope, alpha;
-  PetscReal      t1, t2, a, b, d, steptol;
+  PetscReal      lambda, lambdatemp, lambdaprev, minlambda, maxstep, initslope, alpha, stol;
+  PetscReal      t1, t2, a, b, d;
 #if defined(PETSC_USE_COMPLEX)
   PetscScalar    cinitslope;
 #endif
@@ -238,7 +234,8 @@
   ierr = SNESLineSearchGetLambda(linesearch, &lambda);CHKERRQ(ierr);
   ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
   ierr = SNESLineSearchGetMonitor(linesearch, &monitor);CHKERRQ(ierr);
-  ierr = SNESLineSearchGetTolerances(linesearch, &steptol, &maxstep, PETSC_NULL, PETSC_NULL, PETSC_NULL, &max_its);
+  ierr = SNESLineSearchGetTolerances(linesearch, &minlambda, &maxstep, PETSC_NULL, PETSC_NULL, PETSC_NULL, &max_its);CHKERRQ(ierr);
+  ierr = SNESGetTolerances(snes, PETSC_NULL, PETSC_NULL, &stol, PETSC_NULL, PETSC_NULL);CHKERRQ(ierr);
   bt = (PetscSNESLineSearch_BT *)linesearch->data;
 
   alpha = bt->alpha;
@@ -251,7 +248,11 @@
   ierr = SNESLineSearchPreCheck(linesearch, X, Y, &changed_y);CHKERRQ(ierr);
   ierr = SNESLineSearchSetSuccess(linesearch, PETSC_TRUE);CHKERRQ(ierr);
 
-  ierr = VecNorm(Y, NORM_2, &ynorm);CHKERRQ(ierr);
+  ierr = VecNormBegin(Y, NORM_2, &ynorm);CHKERRQ(ierr);
+  ierr = VecNormBegin(X, NORM_2, &xnorm);CHKERRQ(ierr);
+  ierr = VecNormEnd(Y, NORM_2, &ynorm);CHKERRQ(ierr);
+  ierr = VecNormEnd(X, NORM_2, &xnorm);CHKERRQ(ierr);
+
   if (ynorm == 0.0) {
     if (monitor) {
       ierr = PetscViewerASCIIAddTab(monitor,((PetscObject)linesearch)->tablevel);CHKERRQ(ierr);
@@ -272,15 +273,7 @@
     ierr = VecScale(Y,maxstep/(ynorm));CHKERRQ(ierr);
     ynorm = maxstep;
   }
-  ierr      = VecMaxPointwiseDivide(Y,X,&rellength);CHKERRQ(ierr);
 
-#if defined(PYLITH_CUSTOM_LINESEARCH)
-  // Place reasonable absolute limit on minimum lambda
-  minlambda = std::max(steptol/rellength, PylithScalar(1.0)/PYLITH_MAXSCALAR);
-#else // ORIGINAL
-  minlambda = steptol/rellength;
-#endif
-
   ierr      = MatMult(jac,Y,W);CHKERRQ(ierr);
 #if defined(PETSC_USE_COMPLEX)
   ierr      = VecDot(F,W,&cinitslope);CHKERRQ(ierr);
@@ -316,13 +309,19 @@
 
   if (PetscIsInfOrNanReal(gnorm)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FP,"User provided compute function generated a Not-a-Number");
   ierr = PetscInfo2(snes,"Initial fnorm %14.12e gnorm %14.12e\n", fnorm, gnorm);CHKERRQ(ierr);
-  if (.5*gnorm*gnorm <= .5*fnorm*fnorm + lambda*alpha*initslope) { /* Sufficient reduction */
+  if (.5*gnorm*gnorm <= .5*fnorm*fnorm + lambda*alpha*initslope) { /* Sufficient reduction or step tolerance convergence */
     if (monitor) {
       ierr = PetscViewerASCIIAddTab(monitor,((PetscObject)linesearch)->tablevel);CHKERRQ(ierr);
       ierr = PetscViewerASCIIPrintf(monitor,"    Line search: Using full step: fnorm %14.12e gnorm %14.12e\n", fnorm, gnorm);CHKERRQ(ierr);
       ierr = PetscViewerASCIISubtractTab(monitor,((PetscObject)linesearch)->tablevel);CHKERRQ(ierr);
     }
   } else {
+    /* Since the full step didn't work and the step is tiny, quit */
+    if (stol*xnorm > ynorm) {
+      ierr = SNESLineSearchSetSuccess(linesearch, PETSC_FALSE);CHKERRQ(ierr);
+      ierr = PetscInfo2(monitor, "Aborted due to ynorm < stol*xnorm (%14.12e < %14.12e) and inadequate full step.\n",ynorm,stol*xnorm);CHKERRQ(ierr);
+      PetscFunctionReturn(0);
+    }
     /* Fit points with quadratic */
     lambdatemp = -initslope/(gnorm*gnorm - fnorm*fnorm - 2.0*lambda*initslope);
     lambdaprev = lambda;
@@ -391,7 +390,7 @@
           PetscFunctionReturn(0);
 #endif
         }
-        if (bt->order == SNES_LINESEARCH_BT_CUBIC) {
+        if (linesearch->order == SNES_LINESEARCH_ORDER_CUBIC) {
           t1 = .5*(gnorm*gnorm - fnorm*fnorm) - lambda*initslope;
           t2 = .5*(gnormprev*gnormprev  - fnorm*fnorm) - lambdaprev*initslope;
           a  = (t1/(lambda*lambda) - t2/(lambdaprev*lambdaprev))/(lambda-lambdaprev);
@@ -403,8 +402,10 @@
           } else {
             lambdatemp = (-b + PetscSqrtReal(d))/(3.0*a);
           }
-        } else if (bt->order == SNES_LINESEARCH_BT_QUADRATIC) {
+        } else if (linesearch->order == SNES_LINESEARCH_ORDER_QUADRATIC) {
           lambdatemp = -initslope/(gnorm*gnorm - fnorm*fnorm - 2.0*initslope);
+	} else {
+	  SETERRQ(((PetscObject) linesearch)->comm, PETSC_ERR_SUP, "unsupported line search order for type bt");
         }
           lambdaprev = lambda;
           gnormprev  = gnorm;
@@ -412,6 +413,9 @@
         if (lambdatemp <= .1*lambda) lambda     = .1*lambda;
         else                         lambda     = lambdatemp;
         ierr  = VecWAXPY(W,-lambda,Y,X);CHKERRQ(ierr);
+        if (linesearch->ops->viproject) {
+          ierr = (*linesearch->ops->viproject)(snes,W);CHKERRQ(ierr);
+        }
         if (snes->nfuncs >= snes->max_funcs) {
           ierr = PetscInfo1(snes,"Exceeded maximum function evaluations, while looking for good step length! %D \n",count);CHKERRQ(ierr);
           ierr = PetscInfo5(snes,"fnorm=%18.16e, gnorm=%18.16e, ynorm=%18.16e, lambda=%18.16e, initial slope=%18.16e\n",
@@ -436,10 +440,10 @@
         if (.5*gnorm*gnorm < .5*fnorm*fnorm + lambda*alpha*initslope) { /* is reduction enough? */
           if (monitor) {
             ierr = PetscViewerASCIIAddTab(monitor,((PetscObject)linesearch)->tablevel);CHKERRQ(ierr);
-            if (bt->order == SNES_LINESEARCH_BT_CUBIC) {
-              ierr = PetscViewerASCIIPrintf(monitor,"    Line search: Cubically determined step, current gnorm %14.12e lambda=%18.16e\n",gnorm,lambda);CHKERRQ(ierr);
+            if (linesearch->order == SNES_LINESEARCH_ORDER_CUBIC) {
+              ierr = PetscViewerASCIIPrintf(monitor,"    Line search: Cubically determined step, current gnorm %14.12e lambda=%18.16e\n",(double)gnorm,(double)lambda);CHKERRQ(ierr);
             } else {
-              ierr = PetscViewerASCIIPrintf(monitor,"    Line search: Quadratically determined step, current gnorm %14.12e lambda=%18.16e\n",gnorm,lambda);CHKERRQ(ierr);
+              ierr = PetscViewerASCIIPrintf(monitor,"    Line search: Quadratically determined step, current gnorm %14.12e lambda=%18.16e\n",(double)gnorm,(double)lambda);CHKERRQ(ierr);
             }
             ierr = PetscViewerASCIISubtractTab(monitor,((PetscObject)linesearch)->tablevel);CHKERRQ(ierr);
           }
@@ -447,10 +451,10 @@
         } else {
           if (monitor) {
             ierr = PetscViewerASCIIAddTab(monitor,((PetscObject)linesearch)->tablevel);CHKERRQ(ierr);
-            if (bt->order == SNES_LINESEARCH_BT_CUBIC) {
-              ierr = PetscViewerASCIIPrintf(monitor,"    Line search: Cubic step no good, shrinking lambda, current gnorm %12.12e lambda=%18.16e\n",gnorm,lambda);CHKERRQ(ierr);
+            if (linesearch->order == SNES_LINESEARCH_ORDER_CUBIC) {
+              ierr = PetscViewerASCIIPrintf(monitor,"    Line search: Cubic step no good, shrinking lambda, current gnorm %12.12e lambda=%18.16e\n",(double)gnorm,(double)lambda);CHKERRQ(ierr);
             } else {
-              ierr = PetscViewerASCIIPrintf(monitor,"    Line search: Quadratic step no good, shrinking lambda, current gnorm %12.12e lambda=%18.16e\n",gnorm,lambda);CHKERRQ(ierr);
+              ierr = PetscViewerASCIIPrintf(monitor,"    Line search: Quadratic step no good, shrinking lambda, current gnorm %12.12e lambda=%18.16e\n",(double)gnorm,(double)lambda);CHKERRQ(ierr);
             }
             ierr = PetscViewerASCIISubtractTab(monitor,((PetscObject)linesearch)->tablevel);CHKERRQ(ierr);
           }

Modified: short/3D/PyLith/trunk/libsrc/pylith/topology/RefineUniform.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/topology/RefineUniform.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/topology/RefineUniform.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,9 +45,17 @@
 // Destructor
 pylith::topology::RefineUniform::~RefineUniform(void)
 { // destructor
+  deallocate();
 } // destructor
 
 // ----------------------------------------------------------------------
+// Deallocate data structures.
+void
+pylith::topology::RefineUniform::deallocate(void)
+{ // deallocate
+} // deallocate
+
+// ----------------------------------------------------------------------
 // Refine mesh.
 void
 pylith::topology::RefineUniform::refine(Mesh* const newMesh,

Modified: short/3D/PyLith/trunk/libsrc/pylith/topology/RefineUniform.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/pylith/topology/RefineUniform.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/libsrc/pylith/topology/RefineUniform.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,9 @@
   /// Destructor
   ~RefineUniform(void);
 
+  /// Deallocate data structures.
+  void deallocate(void);
+
   /** Refine mesh.
    *
    * @param newMesh Refined mesh (result).

Modified: short/3D/PyLith/trunk/modulesrc/feassemble/Constraint.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/feassemble/Constraint.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/feassemble/Constraint.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,14 +41,6 @@
       virtual
       void deallocate(void);
   
-      /** Set flag for setting constraints for total field solution or
-       *  incremental field solution.
-       *
-       * @param flag True if using incremental solution, false otherwise.
-       */
-      virtual
-      void useSolnIncr(const bool flag);
-      
       /** Get number of constraints per location.
        *
        * @returns Number of constraints per location.

Modified: short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicit.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicit.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicit.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,19 +45,21 @@
        */
       void timeStep(const PylithScalar dt);
       
+      /** Get stable time step for advancing from time t to time t+dt.
+       *
+       * Default is current time step.
+       *
+       * @param mesh Finite-element mesh.
+       * @returns Time step
+       */
+      PylithScalar stableTimeStep(const pylith::topology::Mesh& mesh) const;
+
       /** Set normalized viscosity for numerical damping.
        *
        * @param viscosity Nondimensional viscosity.
        */
       void normViscosity(const PylithScalar viscosity);
 
-      /** Set flag for setting constraints for total field solution or
-       *  incremental field solution.
-       *
-       * @param flag True if using incremental solution, false otherwise.
-       */
-      void useSolnIncr(const bool flag);
-      
       /** Integrate contributions to residual term (r) for operator.
        *
        * @param residual Field containing values for residual
@@ -68,27 +70,6 @@
 			     const PylithScalar t,
 			     pylith::topology::SolutionFields* const fields);
       
-      /** Integrate contributions to residual term (r) for operator.
-       *
-       * @param residual Field containing values for residual
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateResidualLumped(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-				   const PylithScalar t,
-				   pylith::topology::SolutionFields* const fields);
-
-      /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator.
-       *
-       * @param jacobian Sparse matrix for Jacobian of system.
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateJacobian(pylith::topology::Jacobian* jacobian,
-			     const PylithScalar t,
-			     pylith::topology::SolutionFields* const fields);
-
       /** Integrate contributions to Jacobian matrix (A) associated
        * with operator that require assembly across cells, vertices,
        * or processors.
@@ -101,6 +82,15 @@
 			     const PylithScalar t,
 			     pylith::topology::SolutionFields* const fields);
 
+      // NOT IMPLEMENTED //////////////////////////////////////////////////
+    private :
+
+      /// Not implemented.
+      void integrateJacobian(topology::Jacobian*,
+			     const PylithScalar,
+			     topology::SolutionFields* const);
+
+
     }; // ElasticityExplicit
 
   } // feassemble

Modified: short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitLgDeform.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitLgDeform.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitLgDeform.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -51,13 +51,6 @@
        */
       void normViscosity(const PylithScalar viscosity);
 
-      /** Set flag for setting constraints for total field solution or
-       *  incremental field solution.
-       *
-       * @param flag True if using incremental solution, false otherwise.
-       */
-      void useSolnIncr(const bool flag);
-
       /** Integrate contributions to residual term (r) for operator.
        *
        * @param residual Field containing values for residual
@@ -68,27 +61,6 @@
 			     const PylithScalar t,
 			     pylith::topology::SolutionFields* const fields);
 
-      /** Integrate contributions to residual term (r) for operator.
-       *
-       * @param residual Field containing values for residual
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateResidualLumped(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-				   const PylithScalar t,
-				   pylith::topology::SolutionFields* const fields);
-
-      /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator.
-       *
-       * @param jacobian Sparse matrix for Jacobian of system.
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateJacobian(pylith::topology::Jacobian* jacobian,
-			     const PylithScalar t,
-			     pylith::topology::SolutionFields* const fields);
-
       /** Integrate contributions to Jacobian matrix (A) associated
        * with operator that require assembly across cells, vertices,
        * or processors.
@@ -101,6 +73,15 @@
 			     const PylithScalar t,
 			     pylith::topology::SolutionFields* const fields);
 
+      // NOT IMPLEMENTED //////////////////////////////////////////////////
+    private :
+
+      /// Not implemented.
+      void integrateJacobian(topology::Jacobian*,
+			     const PylithScalar,
+			     topology::SolutionFields* const);
+
+
     }; // ElasticityExplicitLgDeform
 
   } // feassemble

Modified: short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitTet4.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitTet4.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitTet4.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,19 +45,21 @@
        */
       void timeStep(const PylithScalar dt);
       
+      /** Get stable time step for advancing from time t to time t+dt.
+       *
+       * Default is current time step.
+       *
+       * @param mesh Finite-element mesh.
+       * @returns Time step
+       */
+      PylithScalar stableTimeStep(const pylith::topology::Mesh& mesh) const;
+
       /** Set normalized viscosity for numerical damping.
        *
        * @param viscosity Nondimensional viscosity.
        */
       void normViscosity(const PylithScalar viscosity);
 
-      /** Set flag for setting constraints for total field solution or
-       *  incremental field solution.
-       *
-       * @param flag True if using incremental solution, false otherwise.
-       */
-      void useSolnIncr(const bool flag);
-      
       /** Integrate contributions to residual term (r) for operator.
        *
        * @param residual Field containing values for residual
@@ -68,27 +70,6 @@
 			     const PylithScalar t,
 			     pylith::topology::SolutionFields* const fields);
       
-      /** Integrate contributions to residual term (r) for operator.
-       *
-       * @param residual Field containing values for residual
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateResidualLumped(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-				   const PylithScalar t,
-				   pylith::topology::SolutionFields* const fields);
-
-      /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator.
-       *
-       * @param jacobian Sparse matrix for Jacobian of system.
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateJacobian(pylith::topology::Jacobian* jacobian,
-			     const PylithScalar t,
-			     pylith::topology::SolutionFields* const fields);
-
       /** Integrate contributions to Jacobian matrix (A) associated
        * with operator that require assembly across cells, vertices,
        * or processors.
@@ -101,6 +82,21 @@
 			     const PylithScalar t,
 			     pylith::topology::SolutionFields* const fields);
 
+      /** Verify configuration is acceptable.
+       *
+       * @param mesh Finite-element mesh
+       */
+      void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
+      
+      // NOT IMPLEMENTED //////////////////////////////////////////////////
+    private :
+
+      /// Not implemented.
+      void integrateJacobian(topology::Jacobian*,
+			     const PylithScalar,
+			     topology::SolutionFields* const);
+
+
     }; // ElasticityExplicitTet4
 
   } // feassemble

Modified: short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitTri3.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitTri3.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitTri3.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,19 +45,21 @@
        */
       void timeStep(const PylithScalar dt);
       
+      /** Get stable time step for advancing from time t to time t+dt.
+       *
+       * Default is current time step.
+       *
+       * @param mesh Finite-element mesh.
+       * @returns Time step
+       */
+      PylithScalar stableTimeStep(const pylith::topology::Mesh& mesh) const;
+
       /** Set normalized viscosity for numerical damping.
        *
        * @param viscosity Nondimensional viscosity.
        */
       void normViscosity(const PylithScalar viscosity);
 
-      /** Set flag for setting constraints for total field solution or
-       *  incremental field solution.
-       *
-       * @param flag True if using incremental solution, false otherwise.
-       */
-      void useSolnIncr(const bool flag);
-      
       /** Integrate contributions to residual term (r) for operator.
        *
        * @param residual Field containing values for residual
@@ -68,27 +70,6 @@
 			     const PylithScalar t,
 			     pylith::topology::SolutionFields* const fields);
       
-      /** Integrate contributions to residual term (r) for operator.
-       *
-       * @param residual Field containing values for residual
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateResidualLumped(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-				   const PylithScalar t,
-				   pylith::topology::SolutionFields* const fields);
-
-      /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator.
-       *
-       * @param jacobian Sparse matrix for Jacobian of system.
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      void integrateJacobian(pylith::topology::Jacobian* jacobian,
-			     const PylithScalar t,
-			     pylith::topology::SolutionFields* const fields);
-
       /** Integrate contributions to Jacobian matrix (A) associated
        * with operator that require assembly across cells, vertices,
        * or processors.
@@ -101,6 +82,21 @@
 			     const PylithScalar t,
 			     pylith::topology::SolutionFields* const fields);
 
+      /** Verify configuration is acceptable.
+       *
+       * @param mesh Finite-element mesh
+       */
+      void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
+      
+      // NOT IMPLEMENTED //////////////////////////////////////////////////
+    private :
+
+      /// Not implemented.
+      void integrateJacobian(topology::Jacobian*,
+			     const PylithScalar,
+			     topology::SolutionFields* const);
+
+
     }; // ElasticityExplicitTri3
 
   } // feassemble

Modified: short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicit.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicit.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicit.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -54,13 +54,6 @@
        */
       PylithScalar stableTimeStep(const pylith::topology::Mesh& mesh);
       
-      /** Set flag for setting constraints for total field solution or
-       *  incremental field solution.
-       *
-       * @param flag True if using incremental solution, false otherwise.
-       */
-      void useSolnIncr(const bool flag);
-      
       /** Integrate residual part of RHS for 3-D finite elements.
        * Includes gravity and element internal force contribution.
        *

Modified: short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicitCUDA.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicitCUDA.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicitCUDA.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -54,13 +54,6 @@
        */
       PylithScalar stableTimeStep(const pylith::topology::Mesh& mesh);
       
-      /** Set flag for setting constraints for total field solution or
-       *  incremental field solution.
-       *
-       * @param flag True if using incremental solution, false otherwise.
-       */
-      void useSolnIncr(const bool flag);
-      
       /** Integrate residual part of RHS for 3-D finite elements.
        * Includes gravity and element internal force contribution.
        *

Modified: short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicitLgDeform.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicitLgDeform.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityImplicitLgDeform.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -54,13 +54,6 @@
        */
       PylithScalar stableTimeStep(const pylith::topology::Mesh& mesh) const;
 
-      /** Set flag for setting constraints for total field solution or
-       *  incremental field solution.
-       *
-       * @param flag True if using incremental solution, false otherwise.
-       */
-      void useSolnIncr(const bool flag);
-
       /** Integrate residual part of RHS for 3-D finite elements.
        * Includes gravity and element internal force contribution.
        *

Modified: short/3D/PyLith/trunk/modulesrc/feassemble/Integrator.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/feassemble/Integrator.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/feassemble/Integrator.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -99,14 +99,6 @@
       virtual
       bool isJacobianSymmetric(void) const;
 
-      /** Set flag for setting constraints for total field solution or
-       *  incremental field solution.
-       *
-       * @param flag True if using incremental solution, false otherwise.
-       */
-      virtual
-      void useSolnIncr(const bool flag);
-      
       /** Initialize integrator.
        *
        * @param mesh Finite-element mesh.

Modified: short/3D/PyLith/trunk/modulesrc/feassemble/IntegratorElasticity.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/feassemble/IntegratorElasticity.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/feassemble/IntegratorElasticity.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,13 +56,6 @@
        */
       bool needNewJacobian(void);
       
-      /** Set flag for setting constraints for total field solution or
-       *  incremental field solution.
-       *
-       * @param flag True if using incremental solution, false otherwise.
-       */
-      void useSolnIncr(const bool flag);
-      
       /** Initialize integrator.
        *
        * @param mesh Finite-element mesh.
@@ -82,6 +75,7 @@
        *
        * @param mesh Finite-element mesh
        */
+      virtual
       void verifyConfiguration(const pylith::topology::Mesh& mesh) const;
       
       /** Get cell field associated with integrator.

Modified: short/3D/PyLith/trunk/modulesrc/friction/RateStateAgeing.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/friction/RateStateAgeing.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/friction/RateStateAgeing.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -36,12 +36,12 @@
       /// Destructor.
       ~RateStateAgeing(void);
 
-      /** Set floor for slip rate used in computing friction. Used to
-       *  avoid zero friction at zero slip rate.
+      /** Set nondimensional slip rate below which friction varies
+       *  linearly with slip rate.
        *
-       * @param value Floor for slip rate.
+       * @param value Nondimensional slip rate.
        */
-      void minSlipRate(const PylithScalar value);
+      void linearSlipRate(const PylithScalar value);
 
       // PROTECTED METHODS //////////////////////////////////////////////
     protected :

Modified: short/3D/PyLith/trunk/modulesrc/materials/DruckerPrager3D.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/DruckerPrager3D.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/DruckerPrager3D.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -213,6 +213,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
       
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
       /** Update state variables (for next time step).
        *
        * @param stateVars State variables at location.

Modified: short/3D/PyLith/trunk/modulesrc/materials/DruckerPragerPlaneStrain.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/DruckerPragerPlaneStrain.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/DruckerPragerPlaneStrain.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -213,6 +213,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
       
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
       /** Update state variables (for next time step).
        *
        * @param stateVars State variables at location.

Modified: short/3D/PyLith/trunk/modulesrc/materials/ElasticIsotropic3D.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/ElasticIsotropic3D.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/ElasticIsotropic3D.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -165,6 +165,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
 
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
     }; // class ElasticIsotropic3D
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/ElasticMaterial.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/ElasticMaterial.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/ElasticMaterial.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -71,9 +71,6 @@
 
       /** Get stable time step for implicit time integration.
        *
-       * @pre Must call retrievePropsAndVars for cell before calling
-       * stableTimeStep().
-       *
        * Default is MAXFLOAT (or 1.0e+30 if MAXFLOAT is not defined in math.h).
        *
        * @returns Time step
@@ -81,6 +78,18 @@
       virtual
       PylithScalar stableTimeStepImplicit(const pylith::topology::Mesh& mesh);
 
+      /** Get stable time step for explicit time integration.
+       *
+       * Default is MAXFLOAT (or 1.0e+30 if MAXFLOAT is not defined in math.h).
+       *
+       * @param mesh Finite-element mesh.
+       * @param quadrature Quadrature for finite-element integration
+       * @returns Time step
+       */
+      virtual
+      PylithScalar stableTimeStepExplicit(const pylith::topology::Mesh& mesh,
+					  pylith::feassemble::Quadrature<pylith::topology::Mesh>* quadrature);
+      
       /** Set whether elastic or inelastic constitutive relations are used.
        *
        * @param flag True to use elastic, false to use inelastic.
@@ -190,6 +199,23 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const = 0;
       
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      virtual
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const = 0;
+  
     }; // class ElasticMaterial
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/ElasticPlaneStrain.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/ElasticPlaneStrain.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/ElasticPlaneStrain.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -165,6 +165,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
 
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
     }; // class ElasticPlaneStrain
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/ElasticPlaneStress.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/ElasticPlaneStress.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/ElasticPlaneStress.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -165,6 +165,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
 
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
     }; // class ElasticPlaneStress
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/ElasticStrain1D.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/ElasticStrain1D.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/ElasticStrain1D.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -165,6 +165,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
 
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
     }; // class ElasticStrain1D
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/ElasticStress1D.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/ElasticStress1D.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/ElasticStress1D.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -165,6 +165,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
 
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
     }; // class ElasticStress1D
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellIsotropic3D.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellIsotropic3D.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellIsotropic3D.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -200,6 +200,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
 
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
     }; // class GenMaxwellIsotropic3D
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellPlaneStrain.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellPlaneStrain.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellPlaneStrain.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -200,6 +200,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
 
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
     }; // class GenMaxwellPlaneStrain
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellQpQsIsotropic3D.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellQpQsIsotropic3D.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/GenMaxwellQpQsIsotropic3D.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -200,6 +200,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
 
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
     }; // class GenMaxwellQpQsIsotropic3D
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/MaxwellIsotropic3D.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/MaxwellIsotropic3D.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/MaxwellIsotropic3D.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -202,6 +202,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
 
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
     }; // class MaxwellIsotropic3D
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/MaxwellPlaneStrain.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/MaxwellPlaneStrain.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/MaxwellPlaneStrain.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -202,6 +202,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
 
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
     }; // class MaxwellPlaneStrain
 
   } // materials

Modified: short/3D/PyLith/trunk/modulesrc/materials/PowerLaw3D.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/PowerLaw3D.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/PowerLaw3D.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -192,6 +192,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
       
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
       /** Update state variables (for next time step).
        *
        * @param stateVars State variables at location.

Modified: short/3D/PyLith/trunk/modulesrc/materials/PowerLawPlaneStrain.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/materials/PowerLawPlaneStrain.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/materials/PowerLawPlaneStrain.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -192,6 +192,22 @@
 				     const PylithScalar* stateVars,
 				     const int numStateVars) const;
       
+      /** Get stable time step for explicit time integration.
+       *
+       * @param properties Properties at location.
+       * @param numProperties Number of properties.
+       * @param stateVars State variables at location.
+       * @param numStateVars Number of state variables.
+       * @param minCellWidth Minimum width across cell.
+       *
+       * @returns Time step
+       */
+      PylithScalar _stableTimeStepExplicit(const PylithScalar* properties,
+					   const int numProperties,
+					   const PylithScalar* stateVars,
+					   const int numStateVars,
+					   const double minCellWidth) const;
+  
       /** Update state variables (for next time step).
        *
        * @param stateVars State variables at location.

Modified: short/3D/PyLith/trunk/modulesrc/mpi/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/modulesrc/mpi/Makefile.am	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/mpi/Makefile.am	2012-10-19 21:28:12 UTC (rev 20857)
@@ -26,6 +26,7 @@
 swig_sources = \
 	mpi.i \
 	mpi_comm.i \
+	mpi_reduce.i \
 	mpi_error.i
 
 swig_generated = \

Modified: short/3D/PyLith/trunk/modulesrc/mpi/mpi.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/mpi/mpi.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/mpi/mpi.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -29,6 +29,7 @@
 // Interfaces
 %include "mpi_comm.i"
 %include "mpi_error.i"
+%include "mpi_reduce.i"
 
 
 // End of file

Copied: short/3D/PyLith/trunk/modulesrc/mpi/mpi_reduce.i (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/modulesrc/mpi/mpi_reduce.i)
===================================================================
--- short/3D/PyLith/trunk/modulesrc/mpi/mpi_reduce.i	                        (rev 0)
+++ short/3D/PyLith/trunk/modulesrc/mpi/mpi_reduce.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,78 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard, U.S. Geological Survey
+// Charles A. Williams, GNS Science
+// Matthew G. Knepley, University of Chicago
+//
+// This code was developed as part of the Computational Infrastructure
+// for Geodynamics (http://geodynamics.org).
+//
+// Copyright (c) 2010-2012 University of California, Davis
+//
+// See COPYING for license information.
+//
+// ======================================================================
+//
+
+// ----------------------------------------------------------------------
+// MPI_SUM
+%inline %{
+  MPI_Op*
+  mpi_sum(void) {
+    return new MPI_Op(MPI_SUM);
+  } // mpi_sum
+%}
+
+
+// ----------------------------------------------------------------------
+// MPI_MIN
+%inline %{
+  MPI_Op*
+  mpi_min(void) {
+    return new MPI_Op(MPI_MIN);
+  } // mpi_min
+%}
+
+
+// ----------------------------------------------------------------------
+// MPI_AX
+%inline %{
+  MPI_Op*
+  mpi_max(void) {
+    return new MPI_Op(MPI_MAX);
+  } // mpi_max
+%}
+
+
+// ----------------------------------------------------------------------
+// allreduce_scalar_double
+%inline %{
+  double
+    allreduce_scalar_double(double value,
+			    MPI_Op* op,
+			    MPI_Comm* comm) {
+    double result = 0.0;
+    MPI_Allreduce(&value, &result, 1, MPI_DOUBLE, *op, *comm);
+    return result;
+  } // allreduce_scalar_double
+%}
+
+
+// ----------------------------------------------------------------------
+// allreduce_scalar_int
+%inline %{
+  int
+    allreduce_scalar_int(int value,
+			 MPI_Op* op,
+			 MPI_Comm* comm) {
+    int result = 0;
+    MPI_Allreduce(&value, &result, 1, MPI_INT, *op, *comm);
+    return result;
+  } // allreduce_int
+%}
+
+
+// End of file
+

Modified: short/3D/PyLith/trunk/modulesrc/problems/Formulation.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/problems/Formulation.i	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/modulesrc/problems/Formulation.i	2012-10-19 21:28:12 UTC (rev 20857)
@@ -141,14 +141,6 @@
       void reformResidual(const PetscVec* tmpResidualVec =0,
 			  const PetscVec* tmpSolveSolnVec =0);
       
-      /** Reform system residual for case with lumped Jacobian.
-       *
-       * @param tmpResidualVec Temporary PETSc vector for residual.
-       * @param tmpSolveSolnVec Temporary PETSc vector for solution.
-       */
-      void reformResidualLumped(const PetscVec* tmpResidualVec =0,
-			  const PetscVec* tmpSolveSolnVec =0);
-      
       /* Reform system Jacobian.
        *
        * @param tmpSolveSolnVec Temporary PETSc vector for solution.
@@ -159,6 +151,12 @@
        */
       void reformJacobianLumped(void);
 
+      /** Constrain solution space.
+       *
+       * @param tmpSolutionVec Temporary PETSc vector for solution.
+       */
+      void constrainSolnSpace(const PetscVec* tmpSolutionVec);
+
       /// Compute rate fields (velocity and/or acceleration) at time t.
       virtual
       void calcRateFields(void) = 0;

Modified: short/3D/PyLith/trunk/pylith/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/pylith/Makefile.am	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/Makefile.am	2012-10-19 21:28:12 UTC (rev 20857)
@@ -21,6 +21,7 @@
 	apps/__init__.py \
 	apps/PyLithApp.py \
 	apps/PetscApplication.py \
+	apps/EqInfoApp.py \
 	apps/PrepMeshApp.py \
 	bc/__init__.py \
 	bc/AbsorbingDampers.py \
@@ -136,9 +137,8 @@
 	perf/Jacobian.py \
 	problems/__init__.py \
 	problems/Explicit.py \
-	problems/ExplicitLumped.py \
-	problems/ExplicitLumpedTri3.py \
-	problems/ExplicitLumpedTet4.py \
+	problems/ExplicitTri3.py \
+	problems/ExplicitTet4.py \
 	problems/ExplicitLgDeform.py \
 	problems/Formulation.py \
 	problems/Implicit.py \

Copied: short/3D/PyLith/trunk/pylith/apps/EqInfoApp.py (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/pylith/apps/EqInfoApp.py)
===================================================================
--- short/3D/PyLith/trunk/pylith/apps/EqInfoApp.py	                        (rev 0)
+++ short/3D/PyLith/trunk/pylith/apps/EqInfoApp.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,330 @@
+#!/usr/bin/env python
+#
+# ----------------------------------------------------------------------
+#
+# Brad T. Aagaard, U.S. Geological Survey
+# Charles A. Williams, GNS Science
+# Matthew G. Knepley, University of Chicago
+#
+# This code was developed as part of the Computational Infrastructure
+# for Geodynamics (http://geodynamics.org).
+#
+# Copyright (c) 2010-2012 University of California, Davis
+#
+# See COPYING for license information.
+#
+# ----------------------------------------------------------------------
+#
+
+## @file pylith/apps/PyLithApp.py
+##
+## @brief Python PyLith application
+
+from pyre.applications.Script import Script as Application
+
+import h5py
+import numpy
+import math
+import os
+
+# ======================================================================
+class RuptureStats(object):
+  """
+  Python object to hold rupture stats.
+  """
+
+  def __init__(self, nsnapshots):
+    self.fault = None
+    self.timestamp = numpy.zeros( (nsnapshots,), dtype=numpy.float64)
+    self.ruparea = numpy.zeros( (nsnapshots,), dtype=numpy.float64)
+    self.potency = numpy.zeros( (nsnapshots,), dtype=numpy.float64)
+    self.moment = numpy.zeros( (nsnapshots,), dtype=numpy.float64)
+    return
+
+  def update(self, isnapshot, timestamp, ruparea, potency, moment):
+    self.timestamp[isnapshot] = timestamp
+    self.ruparea[isnapshot] = ruparea
+    self.potency[isnapshot] = potency
+    self.moment[isnapshot] = moment
+    self.recalculate()
+    return
+
+
+  def recalculate(self):
+    self.avgslip = self.potency / (self.ruparea + 1.0e-30)
+    self.mommag = 2.0/3.0*numpy.log10(self.moment) - 10.7
+    return
+
+
+  def writeObj(self, fout):
+    fout.write("class RuptureStats(object):\n"
+               "    pass\n")
+    return
+
+
+  def write(self, fout):
+    fout.write("%s = RuptureStats()\n" % self.fault)
+
+    self._writeArray("timestamp", fout)
+    self._writeArray("ruparea", fout)
+    self._writeArray("potency", fout)
+    self._writeArray("moment", fout)
+    self._writeArray("avgslip", fout)
+    self._writeArray("mommag", fout)
+
+    return
+
+
+  def _writeArray(self, name, fout):
+    vals = self.__getattribute__(name)
+    for i in xrange(len(vals)):
+      if math.isnan(vals[i]) or math.isinf(vals[i]):
+        if vals[i] > 0:
+          vals[i] = 1.0e+30
+        else:
+          vals[i] = -1.0e+30
+    g = ("%14.6e" % v for v in vals)
+    astr = ", ".join(g)
+    fout.write("%s.%s = [%s]\n" % (self.fault, name, astr))
+    return
+
+
+# ======================================================================
+# EqInfoApp class
+class EqInfoApp(Application):
+  """
+  Python EqInfoApp application.
+  """
+  
+  # INVENTORY //////////////////////////////////////////////////////////
+
+  class Inventory(Application.Inventory):
+    """
+    Python object for managing EqInfoApp facilities and properties.
+    """
+
+    ## @class Inventory
+    ## Python object for managing EqInfoApp facilities and properties.
+    ##
+    ## \b Properties
+    ## @li \b faults Array of fault names.
+    ## @li \b filename_pattern Pattern for fault files.
+    ## @li \b snapshots Array of timestamps for slip snapshots.
+    ## @li \b snapshotUnits Units for timestamps in array of snapshots.
+    ## @li \b output_filename Filename for output.
+    ##
+    ## \b Facilities
+    ## @li \b db_properties Spatial database for elastic properties.
+    ## @li \b coordsys Coordinate system associated with mesh.
+
+    import pyre.inventory
+
+    faults = pyre.inventory.list("faults", default=[])
+    faults.meta['tip'] = "Array of fault names."
+
+    filenamePattern = pyre.inventory.str("filename_pattern", default="output/fault_%s.h5")
+    filenamePattern.meta['tip'] = "Pattern for fault files."
+
+    snapshots = pyre.inventory.list("snapshots", default=[-1])
+    snapshots.meta['tip'] = "Array of timestamps for slip snapshots (-1 == last time step)."
+
+    from pyre.units.time import second
+    snapshotUnits = pyre.inventory.dimensional("snapshot_units", default=1*second)
+    snapshotUnits.meta['tip'] = "Units for timestamps in array of snapshots."
+    
+    filenameOut = pyre.inventory.str("output_filename", default="eqstats.py")
+    filenameOut.meta['tip'] = "Filename for output."
+
+    from spatialdata.spatialdb.SimpleDB import SimpleDB
+    dbProps = pyre.inventory.facility("db_properties", family="spatial_database", factory=SimpleDB)
+    dbProps.meta['tip'] = "Spatial database for elastic properties."
+    
+    from spatialdata.geocoords.CSCart import CSCart
+    cs = pyre.inventory.facility("coordsys", family="coordsys", factory=CSCart)
+    cs.meta['tip'] = "Coordinate system associated with mesh."
+    
+    typos = pyre.inventory.str("typos", default="pedantic",
+                               validator=pyre.inventory.choice(['relaxed', 'strict', 'pedantic']))
+    typos.meta['tip'] = "Specifies the handling of unknown properties and " \
+        "facilities"
+    
+
+  # PUBLIC METHODS /////////////////////////////////////////////////////
+
+  def __init__(self, name="eqinfoapp"):
+    """
+    Constructor.
+    """
+    Application.__init__(self, name)
+    return
+
+
+  def main(self, *args, **kwds):
+    """
+    Run the application.
+    """
+    nfaults = len(self.faults)
+    
+    if nfaults == 0:
+      raise ValueError("No faults specified")
+
+    nsnapshots = len(self.snapshots)
+    statsFaults = [None]*nfaults
+    
+    ifault = 0
+    for fault in self.faults:
+      filenameIn = self.filenamePattern % fault
+      if not os.path.isfile(filenameIn):
+        raise IOError("Could not open PyLith fault output file '%s'." % filenameIn)
+
+      h5 = h5py.File(filenameIn, "r", driver='sec2')
+      vertices = h5['geometry/vertices'][:]
+      cells = h5['topology/cells'][:]
+      timestamps = h5['time'][:]
+      cellsArea = self._calcCellArea(cells, vertices)
+      cellsShearMod = self._getShearModulus(cells, vertices)
+
+
+      stats = RuptureStats(nsnapshots)
+      statsFaults[ifault] = stats
+      stats.fault = fault
+      
+      isnapshot = 0
+      for snapshot in self.snapshots:
+        # Get slip at snapshot
+        istep = self._findTimeStep(snapshot, timestamps)
+        slip = h5['vertex_fields/slip'][istep,:,:]
+        
+        cellsSlip = self._ptsToCells(slip, cells)
+        cellsSlipMag = self._vectorMag(cellsSlip)
+        mask = cellsSlipMag > 0.0
+
+        ruparea = numpy.sum(cellsArea[mask])
+        potency = numpy.sum(cellsSlipMag*cellsArea)
+        moment = numpy.sum(cellsSlipMag*cellsArea*cellsShearMod)
+
+        stats.update(isnapshot, timestamp=timestamps[istep], ruparea=ruparea, potency=potency, moment=moment)
+        
+        isnapshot += 1
+      h5.close()
+      ifault += 1
+      
+    statsTotal = RuptureStats(nsnapshots)
+    statsTotal.fault = "all"
+    isnapshot = 0
+    for snapshot in self.snapshots:
+      istep = self._findTimeStep(snapshot, timestamps)
+      statsTotal.timestamp[isnapshot] = timestamps[istep]
+      isnapshot += 1
+
+    ruparea = statsTotal.ruparea
+    potency = statsTotal.potency
+    moment = statsTotal.moment
+    for s in statsFaults:
+      ruparea += s.ruparea
+      potency += s.potency
+      moment += s.moment
+
+    statsTotal.recalculate()
+
+    fout = open(self.filenameOut, "w")
+    statsTotal.writeObj(fout)
+    statsTotal.write(fout)
+    for s in statsFaults:
+      s.write(fout)
+    fout.close()
+    return
+  
+
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _configure(self):
+    """
+    Setup members using inventory.
+    """
+    Application._configure(self)
+    self.faults = self.inventory.faults
+    self.filenamePattern = self.inventory.filenamePattern
+    self.snapshots = map(float, self.inventory.snapshots)
+    self.snapshotUnits = self.inventory.snapshotUnits
+    self.dbProps = self.inventory.dbProps
+    self.cs = self.inventory.cs
+    self.filenameOut = self.inventory.filenameOut
+    self.typos = self.inventory.typos
+
+    return
+
+
+  def _calcCellArea(self, cells, vertices):
+    (ncells, ncorners) = cells.shape
+    if ncorners == 1:
+      area = numpy.ones( (ncells,), dtype=numpy.float64)
+    elif ncorners == 2:
+      area = self._vectorMag(vertices[cells[:,1]] - vertices[cells[:,0]])
+    elif ncorners == 3:
+      v01 = vertices[cells[:,1]] - vertices[cells[:,0]]
+      v02 = vertices[cells[:,2]] - vertices[cells[:,0]]
+      area = 0.5*self._vectorMag(numpy.cross(v01, v02))
+    elif ncorners == 4:
+      v01 = vertices[cells[:,1]] - vertices[cells[:,0]]
+      v02 = vertices[cells[:,2]] - vertices[cells[:,0]]
+      v03 = vertices[cells[:,3]] - vertices[cells[:,0]]
+      area = 0.5*self._vectorMag(numpy.cross(v01, v02)) + \
+          0.5*self._vectorMag(numpy.cross(v02, v03))
+    else:
+      raise ValueError("Unknown case for number of cell corners (%d)." % ncorners)
+    return area
+
+
+  def _getShearModulus(self, cells, vertices):
+    coords = self._ptsToCells(vertices, cells)
+    db = self.dbProps
+    db.open()
+    db.queryVals(["density","vs"])
+    (ncells, ndims) = coords.shape
+    data = numpy.zeros( (ncells, 2), dtype=numpy.float64)
+    err = numpy.zeros( (ncells,), dtype=numpy.int32)
+    db.multiquery(data, err, coords, self.cs)
+    db.close()
+    shearMod = data[:,0]*data[:,1]**2
+    return shearMod
+
+
+  def _findTimeStep(self, value, timestamps):
+    if value == -1:
+      i = len(timestamps)-1
+    else:
+      tdiff = numpy.abs(timestamps-value*self.snapshotUnits.value)
+      mindiff = numpy.min(tdiff)
+      i = numpy.where(tdiff < mindiff+1.0e-10)[0]
+      if len(i) > 1:
+        raise ValueError("Could not find snapshot %12.4e s in time stamps." % value)
+    return i
+
+
+  def _vectorMag(self, v):
+    (npts, ndims) = v.shape
+    mag = numpy.zeros( (npts,), dtype=numpy.float64)
+    for i in xrange(ndims):
+      mag += v[:,i]**2
+    mag = mag**0.5
+    return mag
+
+
+  def _ptsToCells(self, valueP, cells):
+    (ncells, ncorners) = cells.shape
+    if len(valueP.shape) > 1:
+      (nvertices, nvals) = valueP.shape
+      valueC = numpy.zeros( (ncells,nvals), dtype=numpy.float64)
+      for i in xrange(ncorners):
+        valueC[:,:] += valueP[cells[:,i],:]
+    else:
+      nvertices = valueP.shape
+      valueC = numpy.zeros( (ncells,), dtype=numpy.float64)
+      for i in xrange(ncorners):
+        valueC[:] += valueP[cells[:,i]]
+    valueC /= ncorners
+    return valueC
+
+
+# End of file 

Modified: short/3D/PyLith/trunk/pylith/apps/PyLithApp.py
===================================================================
--- short/3D/PyLith/trunk/pylith/apps/PyLithApp.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/apps/PyLithApp.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -39,7 +39,7 @@
     ## Python object for managing PyLithApp facilities and properties.
     ##
     ## \b Properties
-    ## @li None
+    ## @li \b initialize_only Stop simulation after initializing problem.
     ##
     ## \b Facilities
     ## @li \b mesher Generates or imports the computational mesh.
@@ -48,6 +48,9 @@
 
     import pyre.inventory
 
+    initializeOnly = pyre.inventory.bool("initialize_only", default=False)
+    initializeOnly.meta['tip'] = "Stop simulation after initializing problem."
+
     from pylith.topology.MeshImporter import MeshImporter
     mesher = pyre.inventory.facility("mesh_generator", family="mesh_generator",
                                      factory=MeshImporter)
@@ -115,6 +118,10 @@
 
     self._eventLogger.stagePop()
 
+    # If initializing only, stop before running problem
+    if self.initializeOnly:
+      return
+
     # Run problem
     self.problem.run(self)
     self._debug.log(resourceUsageString())
@@ -141,6 +148,7 @@
     Setup members using inventory.
     """
     PetscApplication._configure(self)
+    self.initializeOnly = self.inventory.initializeOnly
     self.mesher = self.inventory.mesher
     self.problem = self.inventory.problem
     self.perfLogger = self.inventory.perfLogger

Modified: short/3D/PyLith/trunk/pylith/feassemble/Constraint.py
===================================================================
--- short/3D/PyLith/trunk/pylith/feassemble/Constraint.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/feassemble/Constraint.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -32,7 +32,6 @@
               "initialize",
               "setConstraintSizes",
               "setConstraints",
-              "useSolnIncr",
               "setField",
               "poststep",
               "writeData",
@@ -105,7 +104,6 @@
 
     events = ["verify",
               "init",
-              "solnIncr",
               "setSizes",
               "constraints",
               "setField",

Modified: short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicit.py
===================================================================
--- short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicit.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicit.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -60,6 +60,13 @@
     return
 
 
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _verifyConfiguration(self):
+    ModuleElasticityExplicit.verifyConfiguration(self, self.mesh)
+    return
+
+
 # FACTORIES ////////////////////////////////////////////////////////////
 
 def integrator():

Modified: short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitLgDeform.py
===================================================================
--- short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitLgDeform.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitLgDeform.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -63,6 +63,13 @@
     return
 
 
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _verifyConfiguration(self):
+    ModuleElasticityExplicitLgDeform.verifyConfiguration(self, self.mesh)
+    return
+
+
 # FACTORIES ////////////////////////////////////////////////////////////
 
 def integrator():

Modified: short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitTet4.py
===================================================================
--- short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitTet4.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitTet4.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -60,6 +60,13 @@
     return
 
 
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _verifyConfiguration(self):
+    ModuleElasticityExplicitTet4.verifyConfiguration(self, self.mesh)
+    return
+
+
 # FACTORIES ////////////////////////////////////////////////////////////
 
 def integrator():

Modified: short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitTri3.py
===================================================================
--- short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitTri3.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitTri3.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -60,6 +60,13 @@
     return
 
 
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _verifyConfiguration(self):
+    ModuleElasticityExplicitTri3.verifyConfiguration(self, self.mesh)
+    return
+
+
 # FACTORIES ////////////////////////////////////////////////////////////
 
 def integrator():

Modified: short/3D/PyLith/trunk/pylith/feassemble/ElasticityImplicit.py
===================================================================
--- short/3D/PyLith/trunk/pylith/feassemble/ElasticityImplicit.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/feassemble/ElasticityImplicit.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -60,6 +60,13 @@
     return
 
 
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _verifyConfiguration(self):
+    ModuleElasticityImplicit.verifyConfiguration(self, self.mesh)
+    return
+
+
 # FACTORIES ////////////////////////////////////////////////////////////
 
 def integrator():

Modified: short/3D/PyLith/trunk/pylith/feassemble/ElasticityImplicitLgDeform.py
===================================================================
--- short/3D/PyLith/trunk/pylith/feassemble/ElasticityImplicitLgDeform.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/feassemble/ElasticityImplicitLgDeform.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -62,6 +62,13 @@
     return
 
 
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _verifyConfiguration(self):
+    ModuleElasticityImplicitLgDeform.verifyConfiguration(self, self.mesh)
+    return
+
+
 # FACTORIES ////////////////////////////////////////////////////////////
 
 def integrator():

Modified: short/3D/PyLith/trunk/pylith/feassemble/Integrator.py
===================================================================
--- short/3D/PyLith/trunk/pylith/feassemble/Integrator.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/feassemble/Integrator.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -31,7 +31,6 @@
   available = dir(obj)
   required = ["timeStep",
               "stableTimeStep",
-              "useSolnIncr",
               "integrateResidual",
               "integrateJacobian",
               "preinitialize",

Modified: short/3D/PyLith/trunk/pylith/feassemble/IntegratorElasticity.py
===================================================================
--- short/3D/PyLith/trunk/pylith/feassemble/IntegratorElasticity.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/feassemble/IntegratorElasticity.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -85,7 +85,7 @@
                         self.materialObj.label(),
                         self.materialObj,
                         self.materialObj.dimension()))
-    
+    self._verifyConfiguration()
     self.output.verifyConfiguration(self.mesh)
 
     self._eventLogger.eventEnd(logEvent)    
@@ -170,6 +170,10 @@
     return
 
 
+  def _verifyConfiguration(self):
+    raise NotImplementedError("Implement _verifyConfiguration() in child class.")
+
+
   def _modelMemoryUse(self):
     """
     Model memory allocation.

Modified: short/3D/PyLith/trunk/pylith/friction/RateStateAgeing.py
===================================================================
--- short/3D/PyLith/trunk/pylith/friction/RateStateAgeing.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/friction/RateStateAgeing.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,18 +44,18 @@
     ## Python object for managing RateStateAgeing facilities and properties.
     ##
     ## \b Properties
-    ## @li \b min_slip_rate Floor for nondimensional slip rate used in 
-    ##   friction calculation.
+    ## @li \b linear_slip_rate Nondimensional slip rate below which friction 
+    ## varies linearly with slip rate.
     ##
     ## \b Facilities
     ## @li None
 
     import pyre.inventory
 
-    minSlipRate = pyre.inventory.float("min_slip_rate", default=1.0e-12,
-                                       validator=pyre.inventory.greaterEqual(0.0))
-    minSlipRate.meta['tip'] = "Floor for nondimensional slip rate used in "\
-        "friction calculation."
+    linearSlipRate = pyre.inventory.float("linear_slip_rate", default=1.0e-12,
+                                          validator=pyre.inventory.greaterEqual(0.0))
+    linearSlipRate.meta['tip'] = "Nondimensional slip rate below which friction " \
+        "varies linearly with slip rate."
 
   # PUBLIC METHODS /////////////////////////////////////////////////////
 
@@ -88,7 +88,7 @@
     """
     try:
       FrictionModel._configure(self)
-      ModuleRateStateAgeing.minSlipRate(self, self.inventory.minSlipRate)
+      ModuleRateStateAgeing.linearSlipRate(self, self.inventory.linearSlipRate)
     except ValueError, err:
       aliases = ", ".join(self.aliases)
       raise ValueError("Error while configuring friction model "

Modified: short/3D/PyLith/trunk/pylith/materials/DruckerPrager3D.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/DruckerPrager3D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/DruckerPrager3D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -86,7 +86,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density", 
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",
                      "alpha_yield", "beta", "alpha_flow"],
             'data': ["total_strain", "stress", "plastic_strain"]}}
     self._loggingPrefix = "MaDP3D "

Modified: short/3D/PyLith/trunk/pylith/materials/DruckerPragerPlaneStrain.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/DruckerPragerPlaneStrain.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/DruckerPragerPlaneStrain.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -86,7 +86,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density", 
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",
                      "alpha_yield", "beta", "alpha_flow"],
             'data': ["total_strain", "stress", "stress_zz_initial",
                      "plastic_strain"]}}

Modified: short/3D/PyLith/trunk/pylith/materials/ElasticIsotropic3D.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/ElasticIsotropic3D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/ElasticIsotropic3D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,7 +45,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density"],
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",],
             'data': ["total_strain", "stress"]}}
     self._loggingPrefix = "MaEl3D "
     return

Modified: short/3D/PyLith/trunk/pylith/materials/ElasticPlaneStrain.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/ElasticPlaneStrain.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/ElasticPlaneStrain.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,7 +47,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density"],
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",],
             'data': ["total_strain", "stress"]}}
     self._loggingPrefix = "MaPlSn "
     return

Modified: short/3D/PyLith/trunk/pylith/materials/ElasticPlaneStress.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/ElasticPlaneStress.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/ElasticPlaneStress.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,7 +47,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density"],
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",],
             'data': ["total_strain", "stress"]}}
     self._loggingPrefix = "MaPlSt "
     return

Modified: short/3D/PyLith/trunk/pylith/materials/ElasticStrain1D.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/ElasticStrain1D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/ElasticStrain1D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,7 +46,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density"],
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",],
             'data': ["total_strain", "stress"]}}
     self._loggingPrefix = "MaSt1D "
     return

Modified: short/3D/PyLith/trunk/pylith/materials/ElasticStress1D.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/ElasticStress1D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/ElasticStress1D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,7 +46,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density"],
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",],
             'data': ["total_strain", "stress"]}}
     self._loggingPrefix = "MaSn1D "
     return

Modified: short/3D/PyLith/trunk/pylith/materials/GenMaxwellIsotropic3D.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/GenMaxwellIsotropic3D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/GenMaxwellIsotropic3D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,7 +47,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density",
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",
                      "shear_ratio", "maxwell_time"],
             'data': ["total_strain", "stress",
                      "viscous_strain_1", 

Modified: short/3D/PyLith/trunk/pylith/materials/GenMaxwellPlaneStrain.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/GenMaxwellPlaneStrain.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/GenMaxwellPlaneStrain.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,7 +47,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density",
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",
                      "shear_ratio", "maxwell_time"],
             'data': ["stress_zz_initial",
                      "total_strain", "stress",

Modified: short/3D/PyLith/trunk/pylith/materials/GenMaxwellQpQsIsotropic3D.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/GenMaxwellQpQsIsotropic3D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/GenMaxwellQpQsIsotropic3D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,7 +47,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "k", "density",
+           {'info': ["mu", "k", "density", "stable_dt_implicit", "stable_dt_explicit",
                      "shear_ratio", 
                      "bulk_ratio",
                      "maxwell_time_shear",

Modified: short/3D/PyLith/trunk/pylith/materials/MaxwellIsotropic3D.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/MaxwellIsotropic3D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/MaxwellIsotropic3D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,7 +47,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density", "maxwell_time"],
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit", "maxwell_time"],
             'data': ["total_strain", "viscous_strain", "stress"]}}
     self._loggingPrefix = "MaMx3D "
     return

Modified: short/3D/PyLith/trunk/pylith/materials/MaxwellPlaneStrain.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/MaxwellPlaneStrain.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/MaxwellPlaneStrain.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,7 +47,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density", "maxwell_time"],
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit", "maxwell_time"],
             'data': ["total_strain", "stress",
                      "stress_zz_initial", "viscous_strain"]}}
     self._loggingPrefix = "MaMx2D "

Modified: short/3D/PyLith/trunk/pylith/materials/PowerLaw3D.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/PowerLaw3D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/PowerLaw3D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,7 +46,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density", 
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",
                      "reference_strain_rate", "reference_stress",
                      "power_law_exponent"],
             'data': ["total_strain", "stress", "viscous_strain"]}}

Modified: short/3D/PyLith/trunk/pylith/materials/PowerLawPlaneStrain.py
===================================================================
--- short/3D/PyLith/trunk/pylith/materials/PowerLawPlaneStrain.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/materials/PowerLawPlaneStrain.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,7 +46,7 @@
            {'info': [],
             'data': []},
          'cell': \
-           {'info': ["mu", "lambda", "density", 
+           {'info': ["mu", "lambda", "density", "stable_dt_implicit", "stable_dt_explicit",
                      "reference_strain_rate", "reference_stress",
                      "power_law_exponent"],
             'data': ["total_strain", "stress",

Modified: short/3D/PyLith/trunk/pylith/problems/Explicit.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/Explicit.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/problems/Explicit.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -19,7 +19,8 @@
 ## @file pylith/problems/Explicit.py
 ##
 ## @brief Python Explicit object for solving equations using an
-## explicit formulation.
+## explicit formulation with a lumped Jacobian that is stored as a
+## Field.
 ##
 ## Factory: pde_formulation
 
@@ -50,7 +51,7 @@
 
   class Inventory(Formulation.Inventory):
     """
-    Python object for managing Formulation facilities and properties.
+    Python object for managing Explicit facilities and properties.
     """
 
     ## @class Inventory
@@ -60,14 +61,19 @@
     ## @li \b norm_viscosity Normalized viscosity for numerical damping.
     ##
     ## \b Facilities
-    ## @li None
+    ## @li \b solver Algebraic solver.
 
     import pyre.inventory
 
     normViscosity = pyre.inventory.float("norm_viscosity", default=0.1)
     normViscosity.meta['tip'] = "Normalized viscosity for numerical damping."
 
+    from SolverLumped import SolverLumped
+    solver = pyre.inventory.facility("solver", family="solver",
+                                     factory=SolverLumped)
+    solver.meta['tip'] = "Algebraic solver."
 
+
   # PUBLIC METHODS /////////////////////////////////////////////////////
 
   def __init__(self, name="explicit"):
@@ -77,6 +83,7 @@
     Formulation.__init__(self, name)
     ModuleExplicit.__init__(self)
     self._loggingPrefix = "TSEx "
+    self.dtStable = None
     return
 
 
@@ -141,12 +148,14 @@
     logger.stagePop()
 
     if 0 == comm.rank:
-      self._info.log("Creating Jacobian matrix.")
-    self._setJacobianMatrixType()
-    from pylith.topology.Jacobian import Jacobian
-    self.jacobian = Jacobian(self.fields.solution(),
-                             self.matrixType, self.blockMatrixOkay)
-    self.jacobian.zero() # TEMPORARY, to get correct memory usage
+      self._info.log("Creating lumped Jacobian matrix.")
+    from pylith.topology.topology import MeshField
+    jacobian = MeshField(self.mesh)
+    jacobian.newSection(jacobian.VERTICES_FIELD, dimension)
+    jacobian.allocate()
+    jacobian.label("jacobian")
+    jacobian.vectorFieldType(jacobian.VECTOR)
+    self.jacobian = jacobian
     self._debug.log(resourceUsageString())
 
     logger.stagePush("Problem")
@@ -155,12 +164,6 @@
     self.solver.initialize(self.fields, self.jacobian, self)
     self._debug.log(resourceUsageString())
 
-    # Solve for increment in displacement field.
-    for constraint in self.constraints:
-      constraint.useSolnIncr(True)
-    for integrator in self.integratorsMesh + self.integratorsSubMesh:
-      integrator.useSolnIncr(True)
-
     logger.stagePop()
     logger.setDebug(0)
     self._eventLogger.eventEnd(logEvent)
@@ -273,6 +276,23 @@
     return
 
 
+  def getTimeStep(self):
+    """
+    Get stable time step for advancing forward in time. Use cached
+    value if available.
+
+    Assume stable time step depends only on initial elastic properties
+    and original mesh geometry.
+    """
+    logEvent = "%stimestep" % self._loggingPrefix
+    self._eventLogger.eventBegin(logEvent)
+
+    if self.dtStable is None:
+      self.dtStable = self.timeStep.timeStep(self.mesh, self.integratorsMesh + self.integratorsSubMesh)
+    self._eventLogger.eventEnd(logEvent)
+    return self.dtStable
+  
+
   # PRIVATE METHODS ////////////////////////////////////////////////////
 
   def _configure(self):
@@ -282,9 +302,43 @@
     Formulation._configure(self)
 
     self.normViscosity = self.inventory.normViscosity
+    self.solver = self.inventory.solver
     return
 
 
+  def _reformJacobian(self, t, dt):
+    """
+    Reform Jacobian matrix for operator.
+    """
+    from pylith.mpi.Communicator import mpi_comm_world
+    comm = mpi_comm_world()
+
+    self._debug.log(resourceUsageString())
+    if 0 == comm.rank:
+      self._info.log("Integrating Jacobian operator.")
+    self._eventLogger.stagePush("Reform Jacobian")
+
+    self.updateSettings(self.jacobian, self.fields, t, dt)
+    ModuleExplicit.reformJacobianLumped(self)
+
+    self._eventLogger.stagePop()
+
+    if self.viewJacobian:
+      self.jacobian.view("Jacobian")
+
+    self._debug.log(resourceUsageString())
+    return
+
+
+  def _cleanup(self):
+    """
+    Deallocate PETSc and local data structures.
+    """
+    if not self.fields is None:
+      self.fields.cleanup()
+    return
+
+
 # FACTORIES ////////////////////////////////////////////////////////////
 
 def pde_formulation():

Modified: short/3D/PyLith/trunk/pylith/problems/ExplicitLgDeform.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/ExplicitLgDeform.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/problems/ExplicitLgDeform.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -42,22 +42,16 @@
     """
 
     ## @class Inventory
-    ## Python object for managing ExplicitLumped facilities and properties.
+    ## Python object for managing Explicit facilities and properties.
     ##
     ## \b Properties
     ## @li None
     ##
     ## \b Facilities
-    ## @li \b solver Algebraic solver.
+    ## @li None
 
     import pyre.inventory
 
-    from SolverNonlinear import SolverNonlinear
-    solver = pyre.inventory.facility("solver", family="solver",
-                                     factory=SolverNonlinear)
-    solver.meta['tip'] = "Algebraic solver."
-
-
   # PUBLIC METHODS /////////////////////////////////////////////////////
 
   def __init__(self, name="explicitlgdeform"):
@@ -83,7 +77,6 @@
     Set members based using inventory.
     """
     Explicit._configure(self)
-    self.solver = self.inventory.solver
     return
 
 

Deleted: short/3D/PyLith/trunk/pylith/problems/ExplicitLumped.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/ExplicitLumped.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/problems/ExplicitLumped.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,237 +0,0 @@
-#!/usr/bin/env python
-#
-# ----------------------------------------------------------------------
-#
-# Brad T. Aagaard, U.S. Geological Survey
-# Charles A. Williams, GNS Science
-# Matthew G. Knepley, University of Chicago
-#
-# This code was developed as part of the Computational Infrastructure
-# for Geodynamics (http://geodynamics.org).
-#
-# Copyright (c) 2010-2012 University of California, Davis
-#
-# See COPYING for license information.
-#
-# ----------------------------------------------------------------------
-#
-
-## @file pylith/problems/ExplicitLumped.py
-##
-## @brief Python ExplicitLumped object for solving equations using an
-## explicit formulation with a lumped Jacobian matrix that is stored
-## as a Field.
-##
-## Factory: pde_formulation
-
-from Explicit import Explicit
-from problems import Explicit as ModuleExplicit
-from pylith.utils.profiling import resourceUsageString
-
-# ExplicitLumped class
-class ExplicitLumped(Explicit, ModuleExplicit):
-  """
-  Python ExplicitLumped object for solving equations using an explicit
-  formulation.
-
-  The formulation has the general form, [A(t)] {u(t+dt)} = {b(t)},
-  where we want to solve for {u(t+dt)}, A(t) is usually constant
-  (i.e., independent of time), and {b(t)} usually depends on {u(t)}
-  and {u(t-dt)}.
-
-  Jacobian: A(t)
-  solution: u(t+dt)
-  residual: b(t) - A(t) \hat u(t+dt)
-  constant: b(t)
-
-  Factory: pde_formulation.
-  """
-
-  # INVENTORY //////////////////////////////////////////////////////////
-
-  class Inventory(Explicit.Inventory):
-    """
-    Python object for managing ExplicitLumped facilities and properties.
-
-    Provide appropriate solver for lumped Jacobian as the default.
-    """
-
-    ## @class Inventory
-    ## Python object for managing ExplicitLumped facilities and properties.
-    ##
-    ## \b Properties
-    ## @li None
-    ##
-    ## \b Facilities
-    ## @li \b solver Algebraic solver.
-
-    import pyre.inventory
-
-    from SolverLumped import SolverLumped
-    solver = pyre.inventory.facility("solver", family="solver",
-                                     factory=SolverLumped)
-    solver.meta['tip'] = "Algebraic solver."
-
-
-  # PUBLIC METHODS /////////////////////////////////////////////////////
-
-  def __init__(self, name="explicitlumped"):
-    """
-    Constructor.
-    """
-    Explicit.__init__(self, name)
-    return
-
-
-  def initialize(self, dimension, normalizer):
-    """
-    Initialize problem for explicit time integration.
-    """
-    logEvent = "%sinit" % self._loggingPrefix
-    self._eventLogger.eventBegin(logEvent)
-    
-    from pylith.mpi.Communicator import mpi_comm_world
-    comm = mpi_comm_world()
-
-    self._initialize(dimension, normalizer)
-
-    from pylith.utils.petsc import MemoryLogger
-    logger = MemoryLogger.singleton()
-    logger.setDebug(0)
-    logger.stagePush("Problem")
-
-    # Allocate other fields, reusing layout from dispIncr
-    if 0 == comm.rank:
-      self._info.log("Creating other fields.")
-    self.fields.add("disp(t-dt)", "displacement")
-    self.fields.add("velocity(t)", "velocity")
-    self.fields.add("acceleration(t)", "acceleration")
-    self.fields.copyLayout("dispIncr(t->t+dt)")
-    self._debug.log(resourceUsageString())
-
-    # Setup fields and set to zero
-    dispTmdt = self.fields.get("disp(t-dt)")
-    dispTmdt.zero()
-    dispT = self.fields.get("disp(t)")
-    dispT.zero()
-    residual = self.fields.get("residual")
-    residual.zero()
-    residual.createScatterMesh(residual.mesh())
-
-    lengthScale = normalizer.lengthScale()
-    timeScale = normalizer.timeScale()
-    velocityScale = lengthScale / timeScale
-    velocityT = self.fields.get("velocity(t)")
-    velocityT.scale(velocityScale.value)
-    velocityT.zero()
-
-    accelerationScale = velocityScale / timeScale
-    accelerationT = self.fields.get("acceleration(t)")
-    accelerationT.scale(accelerationScale.value)
-    accelerationT.zero()
-
-    self._debug.log(resourceUsageString())
-    logger.stagePop()
-
-    if 0 == comm.rank:
-      self._info.log("Creating lumped Jacobian matrix.")
-    from pylith.topology.topology import MeshField
-    jacobian = MeshField(self.mesh)
-    jacobian.newSection(jacobian.VERTICES_FIELD, dimension)
-    jacobian.allocate()
-    jacobian.label("jacobian")
-    jacobian.vectorFieldType(jacobian.VECTOR)
-    self.jacobian = jacobian
-    self._debug.log(resourceUsageString())
-
-    logger.stagePush("Problem")
-    if 0 == comm.rank:
-      self._info.log("Initializing solver.")
-    self.solver.initialize(self.fields, self.jacobian, self)
-    self._debug.log(resourceUsageString())
-
-    # Solve for increment in displacement field.
-    for constraint in self.constraints:
-      constraint.useSolnIncr(True)
-    for integrator in self.integratorsMesh + self.integratorsSubMesh:
-      integrator.useSolnIncr(True)
-
-    logger.stagePop()
-    logger.setDebug(0)
-    self._eventLogger.eventEnd(logEvent)
-    return
-
-
-  # PRIVATE METHODS ////////////////////////////////////////////////////
-
-  def _configure(self):
-    """
-    Set members based using inventory.
-    """
-    Explicit._configure(self)
-    self.solver = self.inventory.solver
-    return
-
-
-  def _reformResidual(self, t, dt):
-    """
-    Reform residual vector for operator.
-    """
-    from pylith.mpi.Communicator import mpi_comm_world
-    comm = mpi_comm_world()
-
-    if 0 == comm.rank:
-      self._info.log("Integrating residual term in operator.")
-    self._eventLogger.stagePush("Reform Residual")
-
-    self.updateSettings(self.jacobian, self.fields, t, dt)
-    self.reformResidualLumped()
-
-    self._eventLogger.stagePop()
-    self._debug.log(resourceUsageString())
-    return
-
-
-  def _reformJacobian(self, t, dt):
-    """
-    Reform Jacobian matrix for operator.
-    """
-    from pylith.mpi.Communicator import mpi_comm_world
-    comm = mpi_comm_world()
-
-    self._debug.log(resourceUsageString())
-    if 0 == comm.rank:
-      self._info.log("Integrating Jacobian operator.")
-    self._eventLogger.stagePush("Reform Jacobian")
-
-    self.updateSettings(self.jacobian, self.fields, t, dt)
-    self.reformJacobianLumped()
-
-    self._eventLogger.stagePop()
-
-    if self.viewJacobian:
-      self.jacobian.view("Lumped Jacobian")
-
-    self._debug.log(resourceUsageString())
-    return
-
-
-  def _cleanup(self):
-    """
-    Deallocate PETSc and local data structures.
-    """
-    if not self.fields is None:
-      self.fields.cleanup()
-    return
-
-
-# FACTORIES ////////////////////////////////////////////////////////////
-
-def pde_formulation():
-  """
-  Factory associated with ExplicitLumped.
-  """
-  return ExplicitLumped()
-
-
-# End of file 

Deleted: short/3D/PyLith/trunk/pylith/problems/ExplicitLumpedTet4.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/ExplicitLumpedTet4.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/problems/ExplicitLumpedTet4.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,88 +0,0 @@
-#!/usr/bin/env python
-#
-# ----------------------------------------------------------------------
-#
-# Brad T. Aagaard, U.S. Geological Survey
-# Charles A. Williams, GNS Science
-# Matthew G. Knepley, University of Chicago
-#
-# This code was developed as part of the Computational Infrastructure
-# for Geodynamics (http://geodynamics.org).
-#
-# Copyright (c) 2010-2012 University of California, Davis
-#
-# See COPYING for license information.
-#
-# ----------------------------------------------------------------------
-#
-
-## @file pylith/problems/ExplicitLumpedTet4.py
-##
-## @brief Python ExplicitLumpedTet4 object for solving equations using an
-## explicit formulation with a lumped Jacobian matrix that is stored
-## as a Field.
-##
-## Factory: pde_formulation
-
-from ExplicitLumped import ExplicitLumped
-from pylith.utils.profiling import resourceUsageString
-
-# ExplicitLumpedTet4 class
-class ExplicitLumpedTet4(ExplicitLumped):
-  """
-  Python ExplicitLumpedTet4 object for solving equations using an explicit
-  formulation.
-
-  The formulation has the general form, [A(t)] {u(t+dt)} = {b(t)},
-  where we want to solve for {u(t+dt)}, A(t) is usually constant
-  (i.e., independent of time), and {b(t)} usually depends on {u(t)}
-  and {u(t-dt)}.
-
-  Jacobian: A(t)
-  solution: u(t+dt)
-  residual: b(t) - A(t) \hat u(t+dt)
-  constant: b(t)
-
-  Factory: pde_formulation.
-  """
-
-  # PUBLIC METHODS /////////////////////////////////////////////////////
-
-  def __init__(self, name="explicitlumpedtet4"):
-    """
-    Constructor.
-    """
-    ExplicitLumped.__init__(self, name)
-    return
-
-
-  def elasticityIntegrator(self):
-    """
-    Get integrator for elastic material.
-    """
-    from pylith.feassemble.ElasticityExplicitTet4 import ElasticityExplicitTet4
-    integrator = ElasticityExplicitTet4()
-    integrator.normViscosity(self.normViscosity)
-    return integrator
-
-
-  # PRIVATE METHODS ////////////////////////////////////////////////////
-
-  def _configure(self):
-    """
-    Set members based using inventory.
-    """
-    ExplicitLumped._configure(self)
-    return
-
-
-# FACTORIES ////////////////////////////////////////////////////////////
-
-def pde_formulation():
-  """
-  Factory associated with ExplicitLumped.
-  """
-  return ExplicitLumpedTet4()
-
-
-# End of file 

Deleted: short/3D/PyLith/trunk/pylith/problems/ExplicitLumpedTri3.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/ExplicitLumpedTri3.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/problems/ExplicitLumpedTri3.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -1,88 +0,0 @@
-#!/usr/bin/env python
-#
-# ----------------------------------------------------------------------
-#
-# Brad T. Aagaard, U.S. Geological Survey
-# Charles A. Williams, GNS Science
-# Matthew G. Knepley, University of Chicago
-#
-# This code was developed as part of the Computational Infrastructure
-# for Geodynamics (http://geodynamics.org).
-#
-# Copyright (c) 2010-2012 University of California, Davis
-#
-# See COPYING for license information.
-#
-# ----------------------------------------------------------------------
-#
-
-## @file pylith/problems/ExplicitLumpedTri3.py
-##
-## @brief Python ExplicitLumpedTri3 object for solving equations using an
-## explicit formulation with a lumped Jacobian matrix that is stored
-## as a Field.
-##
-## Factory: pde_formulation
-
-from ExplicitLumped import ExplicitLumped
-from pylith.utils.profiling import resourceUsageString
-
-# ExplicitLumpedTri3 class
-class ExplicitLumpedTri3(ExplicitLumped):
-  """
-  Python ExplicitLumpedTri3 object for solving equations using an explicit
-  formulation.
-
-  The formulation has the general form, [A(t)] {u(t+dt)} = {b(t)},
-  where we want to solve for {u(t+dt)}, A(t) is usually constant
-  (i.e., independent of time), and {b(t)} usually depends on {u(t)}
-  and {u(t-dt)}.
-
-  Jacobian: A(t)
-  solution: u(t+dt)
-  residual: b(t) - A(t) \hat u(t+dt)
-  constant: b(t)
-
-  Factory: pde_formulation.
-  """
-
-  # PUBLIC METHODS /////////////////////////////////////////////////////
-
-  def __init__(self, name="explicitlumpedtri3"):
-    """
-    Constructor.
-    """
-    ExplicitLumped.__init__(self, name)
-    return
-
-
-  def elasticityIntegrator(self):
-    """
-    Get integrator for elastic material.
-    """
-    from pylith.feassemble.ElasticityExplicitTri3 import ElasticityExplicitTri3
-    integrator = ElasticityExplicitTri3()
-    integrator.normViscosity(self.normViscosity)
-    return integrator
-
-
-  # PRIVATE METHODS ////////////////////////////////////////////////////
-
-  def _configure(self):
-    """
-    Set members based using inventory.
-    """
-    ExplicitLumped._configure(self)
-    return
-
-
-# FACTORIES ////////////////////////////////////////////////////////////
-
-def pde_formulation():
-  """
-  Factory associated with ExplicitLumped.
-  """
-  return ExplicitLumpedTri3()
-
-
-# End of file 

Copied: short/3D/PyLith/trunk/pylith/problems/ExplicitTet4.py (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/pylith/problems/ExplicitTet4.py)
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/ExplicitTet4.py	                        (rev 0)
+++ short/3D/PyLith/trunk/pylith/problems/ExplicitTet4.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+#
+# ----------------------------------------------------------------------
+#
+# Brad T. Aagaard, U.S. Geological Survey
+# Charles A. Williams, GNS Science
+# Matthew G. Knepley, University of Chicago
+#
+# This code was developed as part of the Computational Infrastructure
+# for Geodynamics (http://geodynamics.org).
+#
+# Copyright (c) 2010-2012 University of California, Davis
+#
+# See COPYING for license information.
+#
+# ----------------------------------------------------------------------
+#
+
+## @file pylith/problems/ExplicitTet4.py
+##
+## @brief Python ExplicitTet4 object for solving equations using an
+## explicit formulation with a lumped Jacobian matrix that is stored
+## as a Field.
+##
+## Factory: pde_formulation
+
+from Explicit import Explicit
+from pylith.utils.profiling import resourceUsageString
+
+# ExplicitTet4 class
+class ExplicitTet4(Explicit):
+  """
+  Python ExplicitTet4 object for solving equations using an explicit
+  formulation.
+
+  The formulation has the general form, [A(t)] {u(t+dt)} = {b(t)},
+  where we want to solve for {u(t+dt)}, A(t) is usually constant
+  (i.e., independent of time), and {b(t)} usually depends on {u(t)}
+  and {u(t-dt)}.
+
+  Jacobian: A(t)
+  solution: u(t+dt)
+  residual: b(t) - A(t) \hat u(t+dt)
+  constant: b(t)
+
+  Factory: pde_formulation.
+  """
+
+  # PUBLIC METHODS /////////////////////////////////////////////////////
+
+  def __init__(self, name="explicittet4"):
+    """
+    Constructor.
+    """
+    Explicit.__init__(self, name)
+    return
+
+
+  def elasticityIntegrator(self):
+    """
+    Get integrator for elastic material.
+    """
+    from pylith.feassemble.ElasticityExplicitTet4 import ElasticityExplicitTet4
+    integrator = ElasticityExplicitTet4()
+    integrator.normViscosity(self.normViscosity)
+    return integrator
+
+
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _configure(self):
+    """
+    Set members based using inventory.
+    """
+    Explicit._configure(self)
+    return
+
+
+# FACTORIES ////////////////////////////////////////////////////////////
+
+def pde_formulation():
+  """
+  Factory associated with Explicit.
+  """
+  return ExplicitTet4()
+
+
+# End of file 

Copied: short/3D/PyLith/trunk/pylith/problems/ExplicitTri3.py (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/pylith/problems/ExplicitTri3.py)
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/ExplicitTri3.py	                        (rev 0)
+++ short/3D/PyLith/trunk/pylith/problems/ExplicitTri3.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+#
+# ----------------------------------------------------------------------
+#
+# Brad T. Aagaard, U.S. Geological Survey
+# Charles A. Williams, GNS Science
+# Matthew G. Knepley, University of Chicago
+#
+# This code was developed as part of the Computational Infrastructure
+# for Geodynamics (http://geodynamics.org).
+#
+# Copyright (c) 2010-2012 University of California, Davis
+#
+# See COPYING for license information.
+#
+# ----------------------------------------------------------------------
+#
+
+## @file pylith/problems/ExplicitTri3.py
+##
+## @brief Python ExplicitTri3 object for solving equations using an
+## explicit formulation with a lumped Jacobian matrix that is stored
+## as a Field.
+##
+## Factory: pde_formulation
+
+from Explicit import Explicit
+from pylith.utils.profiling import resourceUsageString
+
+# ExplicitTri3 class
+class ExplicitTri3(Explicit):
+  """
+  Python ExplicitTri3 object for solving equations using an explicit
+  formulation.
+
+  The formulation has the general form, [A(t)] {u(t+dt)} = {b(t)},
+  where we want to solve for {u(t+dt)}, A(t) is usually constant
+  (i.e., independent of time), and {b(t)} usually depends on {u(t)}
+  and {u(t-dt)}.
+
+  Jacobian: A(t)
+  solution: u(t+dt)
+  residual: b(t) - A(t) \hat u(t+dt)
+  constant: b(t)
+
+  Factory: pde_formulation.
+  """
+
+  # PUBLIC METHODS /////////////////////////////////////////////////////
+
+  def __init__(self, name="explicittri3"):
+    """
+    Constructor.
+    """
+    Explicit.__init__(self, name)
+    return
+
+
+  def elasticityIntegrator(self):
+    """
+    Get integrator for elastic material.
+    """
+    from pylith.feassemble.ElasticityExplicitTri3 import ElasticityExplicitTri3
+    integrator = ElasticityExplicitTri3()
+    integrator.normViscosity(self.normViscosity)
+    return integrator
+
+
+  # PRIVATE METHODS ////////////////////////////////////////////////////
+
+  def _configure(self):
+    """
+    Set members based using inventory.
+    """
+    Explicit._configure(self)
+    return
+
+
+# FACTORIES ////////////////////////////////////////////////////////////
+
+def pde_formulation():
+  """
+  Factory associated with Explicit.
+  """
+  return ExplicitTri3()
+
+
+# End of file 

Modified: short/3D/PyLith/trunk/pylith/problems/TimeStep.py
===================================================================
--- short/3D/PyLith/trunk/pylith/problems/TimeStep.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/pylith/problems/TimeStep.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -186,11 +186,13 @@
       dt = integrator.stableTimeStep(mesh)
       if dt < dtStable:
         dtStable = dt
+    import pylith.mpi.mpi as mpi
+    comm = mesh.getComm()
+    dtStableAll = mpi.allreduce_scalar_double(dtStable, mpi.mpi_min(), comm.handle)
+    return dtStableAll
 
-    return dtStable
 
 
-
 # FACTORIES ////////////////////////////////////////////////////////////
 
 def time_step():

Modified: short/3D/PyLith/trunk/tests/2d/faultstrip/pylithapp.cfg
===================================================================
--- short/3D/PyLith/trunk/tests/2d/faultstrip/pylithapp.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/tests/2d/faultstrip/pylithapp.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -40,7 +40,7 @@
 [pylithapp.timedependent]
 dimension = 2
 
-formulation = pylith.problems.ExplicitLumped
+formulation = pylith.problems.Explicit
 
 normalizer = spatialdata.units.NondimElasticDynamic
 normalizer.shear_wave_speed = 1.0*km/s

Modified: short/3D/PyLith/trunk/tests/2d/frictionslide/pylithapp.cfg
===================================================================
--- short/3D/PyLith/trunk/tests/2d/frictionslide/pylithapp.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/tests/2d/frictionslide/pylithapp.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -111,12 +111,11 @@
 snes_max_it = 100
 
 snes_monitor = true
-snes_ls_monitor = true
+snes_linesearch_monitor = true
 #snes_view = true
 snes_converged_reason = true
 
-#log_summary = true
-#info =
+log_summary = true
 
 # ----------------------------------------------------------------------
 # output

Modified: short/3D/PyLith/trunk/tests/2d/frictionslide/ratestate_stable.cfg
===================================================================
--- short/3D/PyLith/trunk/tests/2d/frictionslide/ratestate_stable.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/tests/2d/frictionslide/ratestate_stable.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -12,7 +12,7 @@
 [pylithapp.timedependent.interfaces.fault]
 friction = pylith.friction.RateStateAgeing
 friction.label = Rate state ageing
-friction.min_slip_rate = 1.0e-8
+friction.linear_slip_rate = 1.0e-8
 
 # Set the friction model parameters.
 #  reference coefficient of friction: 0.6

Modified: short/3D/PyLith/trunk/tests/2d/frictionslide/ratestate_weak.cfg
===================================================================
--- short/3D/PyLith/trunk/tests/2d/frictionslide/ratestate_weak.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/tests/2d/frictionslide/ratestate_weak.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -12,7 +12,7 @@
 [pylithapp.timedependent.interfaces.fault]
 friction = pylith.friction.RateStateAgeing
 friction.label = Rate state ageing
-friction.min_slip_rate = 1.0e-9
+friction.linear_slip_rate = 1.0e-9
 
 # Set the friction model parameters.
 #  reference coefficient of friction: 0.6

Modified: short/3D/PyLith/trunk/tests/2d/plasticity/cyclic/dynamic.cfg
===================================================================
--- short/3D/PyLith/trunk/tests/2d/plasticity/cyclic/dynamic.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/tests/2d/plasticity/cyclic/dynamic.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -4,4 +4,4 @@
 # problem
 # ----------------------------------------------------------------------
 [pylithapp.timedependent]
-formulation = pylith.problems.ExplicitLumped
+formulation = pylith.problems.Explicit

Copied: short/3D/PyLith/trunk/tests/2d/stressoutput (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/tests/2d/stressoutput)

Modified: short/3D/PyLith/trunk/tests/3d/cyclicfriction/pylithapp.cfg
===================================================================
--- short/3D/PyLith/trunk/tests/3d/cyclicfriction/pylithapp.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/tests/3d/cyclicfriction/pylithapp.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -188,7 +188,7 @@
 snes_atol = 1.0e-10
 snes_max_it = 100
 snes_monitor = true
-snes_ls_monitor = true
+#snes_linesearch_monitor = true
 #snes_steptol = 1.0e-20
 #snes_view = true
 snes_converged_reason = true

Modified: short/3D/PyLith/trunk/tests/3d/plasticity/dynamic/pylithapp.cfg
===================================================================
--- short/3D/PyLith/trunk/tests/3d/plasticity/dynamic/pylithapp.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/tests/3d/plasticity/dynamic/pylithapp.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -20,7 +20,7 @@
 [pylithapp.timedependent]
 dimension = 3
 
-formulation = pylith.problems.ExplicitLumped
+formulation = pylith.problems.Explicit
 formulation.norm_viscosity = 1.0e-30
 normalizer = spatialdata.units.NondimElasticDynamic
 normalizer.shear_wave_speed = 3300*m/s

Modified: short/3D/PyLith/trunk/tests/3d/plasticity/dynamic/tet4.cfg
===================================================================
--- short/3D/PyLith/trunk/tests/3d/plasticity/dynamic/tet4.cfg	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/tests/3d/plasticity/dynamic/tet4.cfg	2012-10-19 21:28:12 UTC (rev 20857)
@@ -4,7 +4,7 @@
 # problem
 # ----------------------------------------------------------------------
 [pylithapp.timedependent]
-formulation = pylith.problems.ExplicitLumpedTet4
+formulation = pylith.problems.ExplicitTet4
 
 # ----------------------------------------------------------------------
 # mesh_generator

Modified: short/3D/PyLith/trunk/tests_auto/1d/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/tests_auto/1d/Makefile.am	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/tests_auto/1d/Makefile.am	2012-10-19 21:28:12 UTC (rev 20857)
@@ -17,8 +17,10 @@
 #
 
 SUBDIRS = \
-	line2 \
-	line3
+	line2
 
 
+#	line3 (disable until higher order with 2 vertices works)
+
+
 # End of file 

Copied: short/3D/PyLith/trunk/tests_auto/eqinfo (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/tests_auto/eqinfo)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -142,28 +142,6 @@
 } // testNeedNewJacobian
 
 // ----------------------------------------------------------------------
-// Test useSolnIncr().
-void
-pylith::feassemble::TestElasticityExplicit::testUseSolnIncr(void)
-{ // testUseSolnIncr
-  ElasticityExplicit integrator;
-
-  materials::ElasticIsotropic3D material;
-  integrator.material(&material);
-  CPPUNIT_ASSERT_EQUAL(false, integrator._useSolnIncr);
-  try {
-    integrator.useSolnIncr(false);
-
-    // Should have thrown exception, so don't make it here.
-    CPPUNIT_ASSERT(false);
-  } catch (const std::logic_error& err) {
-    // Expect logic error so don't do anything.
-  } catch (...) {
-    CPPUNIT_ASSERT(false);
-  } // try/catch
-} // testUseSolnIncr
-
-// ----------------------------------------------------------------------
 // Test initialize().
 void 
 pylith::feassemble::TestElasticityExplicit::testInitialize(void)
@@ -207,7 +185,7 @@
   err = VecGetArray(residualVec, &vals);CHECK_PETSC_ERROR(err);
   CPPUNIT_ASSERT_EQUAL(sizeE, size);
 
-#if 0
+#if 0 // DEBUGGING
   residual.view("RESIDUAL");
   std::cout << "EXPECTED RESIDUAL" << std::endl;
   for (int i=0; i < size; ++i)
@@ -224,52 +202,6 @@
 } // testIntegrateResidual
 
 // ----------------------------------------------------------------------
-// Test integrateResidual().
-void
-pylith::feassemble::TestElasticityExplicit::testIntegrateResidualLumped(void)
-{ // testIntegrateResidualLumped
-  CPPUNIT_ASSERT(0 != _data);
-
-  topology::Mesh mesh;
-  ElasticityExplicit integrator;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &integrator, &fields);
-
-  topology::Field<topology::Mesh>& residual = fields.get("residual");
-  const PylithScalar t = 1.0;
-  integrator.integrateResidualLumped(residual, t, &fields);
-
-  const PylithScalar* valsE = _data->valsResidualLumped;
-  const int sizeE = _data->spaceDim * _data->numVertices;
-
-  PetscSection   residualSection = residual.petscSection();
-  Vec            residualVec     = residual.localVector();
-  PetscScalar   *vals;
-  PetscInt       size;
-  PetscErrorCode err;
-
-  CPPUNIT_ASSERT(residualSection);
-  err = PetscSectionGetStorageSize(residualSection, &size);CHECK_PETSC_ERROR(err);
-  err = VecGetArray(residualVec, &vals);CHECK_PETSC_ERROR(err);
-  CPPUNIT_ASSERT_EQUAL(sizeE, size);
-
-#if 0
-  residual.view("RESIDUAL");
-  std::cout << "EXPECTED RESIDUAL" << std::endl;
-  for (int i=0; i < size; ++i)
-    std::cout << "  " << valsE[i] << std::endl;
-#endif
-
-  const PylithScalar tolerance = (sizeof(double) == sizeof(PylithScalar)) ? 1.0e-06 : 1.0e-05;
-  for (int i=0; i < size; ++i)
-    if (fabs(valsE[i]) > 1.0)
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valsE[i], tolerance);
-    else
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[i], vals[i], tolerance);
-  err = VecRestoreArray(residualVec, &vals);CHECK_PETSC_ERROR(err);
-} // testIntegrateResidualLumped
-
-// ----------------------------------------------------------------------
 // Test integrateJacobian().
 void
 pylith::feassemble::TestElasticityExplicit::testIntegrateJacobian(void)
@@ -282,61 +214,6 @@
   _initialize(&mesh, &integrator, &fields);
   integrator._needNewJacobian = true;
 
-  topology::Jacobian jacobian(fields.solution());
-
-  const PylithScalar t = 1.0;
-  integrator.integrateJacobian(&jacobian, t, &fields);
-  CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());
-  jacobian.assemble("final_assembly");
-
-  const PylithScalar* valsE = _data->valsJacobian;
-  const int nrowsE = _data->numVertices * _data->spaceDim;
-  const int ncolsE = _data->numVertices * _data->spaceDim;
-
-  const PetscMat jacobianMat = jacobian.matrix();
-
-  int nrows = 0;
-  int ncols = 0;
-  MatGetSize(jacobianMat, &nrows, &ncols);
-  CPPUNIT_ASSERT_EQUAL(nrowsE, nrows);
-  CPPUNIT_ASSERT_EQUAL(ncolsE, ncols);
-
-  PetscMat jDense;
-  MatConvert(jacobianMat, MATSEQDENSE, MAT_INITIAL_MATRIX, &jDense);
-
-  scalar_array vals(nrows*ncols);
-  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;
-  MatGetValues(jDense, nrows, &rows[0], ncols, &cols[0], &vals[0]);
-  const PylithScalar tolerance = 1.0e-06;
-  for (int iRow=0; iRow < nrows; ++iRow)
-    for (int iCol=0; iCol < ncols; ++iCol) {
-      const int index = ncols*iRow+iCol;
-      if (fabs(valsE[index]) > 1.0)
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[index]/valsE[index], tolerance);
-      else
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[index], vals[index], tolerance);
-    } // for
-  MatDestroy(&jDense);
-} // testIntegrateJacobian
-
-// ----------------------------------------------------------------------
-// Test integrateJacobian().
-void
-pylith::feassemble::TestElasticityExplicit::testIntegrateJacobianLumped(void)
-{ // testIntegrateJacobianLumped
-  CPPUNIT_ASSERT(0 != _data);
-
-  topology::Mesh mesh;
-  ElasticityExplicit integrator;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &integrator, &fields);
-  integrator._needNewJacobian = true;
-
   topology::Field<topology::Mesh> jacobian(mesh);
   jacobian.label("Jacobian");
   jacobian.vectorFieldType(topology::FieldBase::VECTOR);
@@ -348,7 +225,7 @@
   CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());
   jacobian.complete();
 
-  const PylithScalar* valsE = _data->valsJacobianLumped;
+  const PylithScalar* valsE = _data->valsJacobian;
   const int sizeE = _data->numVertices * _data->spaceDim;
 
 #if 0 // DEBUGGING
@@ -381,14 +258,14 @@
     else
       CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[i], vals[i], tolerance);
   err = VecRestoreArray(jacobianVec, &vals);CHECK_PETSC_ERROR(err);
-} // testIntegrateJacobianLumped
+} // testIntegrateJacobian
 
 // ----------------------------------------------------------------------
 // Test updateStateVars().
 void 
 pylith::feassemble::TestElasticityExplicit::testUpdateStateVars(void)
 { // testUpdateStateVars
-  CPPUNIT_ASSERT(0 != _data);
+  CPPUNIT_ASSERT(_data);
 
   topology::Mesh mesh;
   ElasticityExplicit integrator;
@@ -404,13 +281,16 @@
 void
 pylith::feassemble::TestElasticityExplicit::testStableTimeStep(void)
 { // testStableTimeStep
+  CPPUNIT_ASSERT(_data);
+
   topology::Mesh mesh;
   ElasticityExplicit integrator;
   topology::SolutionFields fields(mesh);
   _initialize(&mesh, &integrator, &fields);
 
-  const PylithScalar stableTimeStep = integrator.stableTimeStep(mesh);
-  CPPUNIT_ASSERT_EQUAL(pylith::PYLITH_MAXSCALAR, stableTimeStep);
+  const PylithScalar dtStable = integrator.stableTimeStep(mesh);
+  const PylithScalar tolerance = 1.0e-6;
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, dtStable/_data->dtStableExplicit, tolerance);
 } // testStableTimeStep
 
 extern PetscErrorCode DMComplexBuildFromCellList_Private(DM dm, PetscInt numCells, PetscInt numVertices, PetscInt numCorners, const int cells[]);

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,7 +56,6 @@
   CPPUNIT_TEST( testNormViscosity );
   CPPUNIT_TEST( testMaterial );
   CPPUNIT_TEST( testNeedNewJacobian );
-  CPPUNIT_TEST( testUseSolnIncr );
 
   // Testing of initialize(), integrateResidual(),
   // integrateJacobian(), and updateStateVars() handled by derived
@@ -88,24 +87,15 @@
   /// Test needNewJacobian().
   void testNeedNewJacobian(void);
 
-  /// Test useSolnIncr().
-  void testUseSolnIncr(void);
-
   /// Test initialize().
   void testInitialize(void);
 
   /// Test integrateResidual().
   void testIntegrateResidual(void);
 
-  /// Test integrateResidualLumped().
-  void testIntegrateResidualLumped(void);
-
   /// Test integrateJacobian().
   void testIntegrateJacobian(void);
 
-  /// Test integrateJacobianLumped().
-  void testIntegrateJacobianLumped(void);
-
   /// Test updateStateVars().
   void testUpdateStateVars(void);
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit1DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit1DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit1DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testStableTimeStep );
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit1DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit1DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit1DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testStableTimeStep );
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit2DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit2DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit2DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testStableTimeStep );
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit2DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit2DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit2DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testStableTimeStep );
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit3DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit3DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit3DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testStableTimeStep );
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit3DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit3DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicit3DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testStableTimeStep );
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav1DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav1DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav1DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav1DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav1DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav1DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav2DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav2DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav2DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav2DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav2DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav2DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav3DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav3DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav3DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav3DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav3DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitGrav3DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -108,13 +108,6 @@
   const PylithScalar* valsE = _data->valsResidual;
   const int sizeE = _data->spaceDim * _data->numVertices;
 
-#if 0 // DEBUGGING
-  residual.view("RESIDUAL");
-  std::cout << "RESIDUAL EXPECTED\n";
-  for (int i=0; i < sizeE; ++i)
-    std::cout << "  " << valsE[i] << "\n";
-#endif
-
   PetscSection residualSection = residual.petscSection();
   Vec          residualVec     = residual.localVector();
   PetscScalar   *vals;
@@ -126,50 +119,11 @@
   err = PetscSectionGetStorageSize(residualSection, &size);CHECK_PETSC_ERROR(err);
   CPPUNIT_ASSERT_EQUAL(sizeE, size);
 
-  const PylithScalar tolerance = (sizeof(double) == sizeof(PylithScalar)) ? 1.0e-06 : 1.0e-04;
-  for (int i=0; i < size; ++i)
-    if (fabs(valsE[i]) > 1.0)
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valsE[i], tolerance);
-    else
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[i], vals[i], tolerance);
-  err = VecRestoreArray(residualVec, &vals);CHECK_PETSC_ERROR(err);
-} // testIntegrateResidual
-
-// ----------------------------------------------------------------------
-// Test integrateResidual().
-void
-pylith::feassemble::TestElasticityExplicitLgDeform::testIntegrateResidualLumped(void)
-{ // testIntegrateResidualLumped
-  CPPUNIT_ASSERT(0 != _data);
-
-  topology::Mesh mesh;
-  ElasticityExplicitLgDeform integrator;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &integrator, &fields);
-
-  topology::Field<topology::Mesh>& residual = fields.get("residual");
-  const PylithScalar t = 1.0;
-  integrator.integrateResidualLumped(residual, t, &fields);
-
-  const PylithScalar* valsE = _data->valsResidualLumped;
-  const int sizeE = _data->spaceDim * _data->numVertices;
-
-  PetscSection residualSection = residual.petscSection();
-  Vec          residualVec     = residual.localVector();
-  PetscScalar   *vals;
-  PetscInt       size;
-  PetscErrorCode err;
-
-  CPPUNIT_ASSERT(residualSection);CPPUNIT_ASSERT(residualVec);
-  err = VecGetArray(residualVec, &vals);CHECK_PETSC_ERROR(err);
-  err = PetscSectionGetStorageSize(residualSection, &size);CHECK_PETSC_ERROR(err);
-  CPPUNIT_ASSERT_EQUAL(sizeE, size);
-
 #if 0
   residual.view("RESIDUAL");
   std::cout << "EXPECTED RESIDUAL" << std::endl;
   for (int i=0; i < size; ++i)
-    std::cout << "  " << valsE[i] << std::endl;
+    std::cout << "valE: " << valsE[i] << ", val: " << vals[i] << ", val/valE: " << vals[i]/valsE[i] << std::endl;
 #endif
 
   const PylithScalar tolerance = (sizeof(double) == sizeof(PylithScalar)) ? 1.0e-06 : 1.0e-04;
@@ -179,7 +133,7 @@
     else
       CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[i], vals[i], tolerance);
   err = VecRestoreArray(residualVec, &vals);CHECK_PETSC_ERROR(err);
-} // testIntegrateResidualLumped
+} // testIntegrateResidual
 
 // ----------------------------------------------------------------------
 // Test integrateJacobian().
@@ -194,61 +148,6 @@
   _initialize(&mesh, &integrator, &fields);
   integrator._needNewJacobian = true;
 
-  topology::Jacobian jacobian(fields.solution());
-
-  const PylithScalar t = 1.0;
-  integrator.integrateJacobian(&jacobian, t, &fields);
-  CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());
-  jacobian.assemble("final_assembly");
-
-  const PylithScalar* valsE = _data->valsJacobian;
-  const int nrowsE = _data->numVertices * _data->spaceDim;
-  const int ncolsE = _data->numVertices * _data->spaceDim;
-
-  const PetscMat jacobianMat = jacobian.matrix();
-
-  int nrows = 0;
-  int ncols = 0;
-  MatGetSize(jacobianMat, &nrows, &ncols);
-  CPPUNIT_ASSERT_EQUAL(nrowsE, nrows);
-  CPPUNIT_ASSERT_EQUAL(ncolsE, ncols);
-
-  PetscMat jDense;
-  MatConvert(jacobianMat, MATSEQDENSE, MAT_INITIAL_MATRIX, &jDense);
-
-  scalar_array vals(nrows*ncols);
-  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;
-  MatGetValues(jDense, nrows, &rows[0], ncols, &cols[0], &vals[0]);
-  const PylithScalar tolerance = 1.0e-06;
-  for (int iRow=0; iRow < nrows; ++iRow)
-    for (int iCol=0; iCol < ncols; ++iCol) {
-      const int index = ncols*iRow+iCol;
-      if (fabs(valsE[index]) > 1.0)
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[index]/valsE[index], tolerance);
-      else
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[index], vals[index], tolerance);
-    } // for
-  MatDestroy(&jDense);
-} // testIntegrateJacobian
-
-// ----------------------------------------------------------------------
-// Test integrateJacobian().
-void
-pylith::feassemble::TestElasticityExplicitLgDeform::testIntegrateJacobianLumped(void)
-{ // testIntegrateJacobianLumped
-  CPPUNIT_ASSERT(0 != _data);
-
-  topology::Mesh mesh;
-  ElasticityExplicitLgDeform integrator;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &integrator, &fields);
-  integrator._needNewJacobian = true;
-
   topology::Field<topology::Mesh> jacobian(mesh);
   jacobian.label("Jacobian");
   jacobian.vectorFieldType(topology::FieldBase::VECTOR);
@@ -260,7 +159,7 @@
   CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());
   jacobian.complete();
 
-  const PylithScalar* valsE = _data->valsJacobianLumped;
+  const PylithScalar* valsE = _data->valsJacobian;
   const int sizeE = _data->numVertices * _data->spaceDim;
 
 #if 0 // DEBUGGING
@@ -292,8 +191,9 @@
       CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valsE[i], tolerance);
     else
       CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[i], vals[i], tolerance);
+
   err = VecRestoreArray(jacobianVec, &vals);CHECK_PETSC_ERROR(err);
-} // testIntegrateJacobianLumped
+} // testIntegrateJacobian
 
 // ----------------------------------------------------------------------
 // Test updateStateVars().

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -76,15 +76,9 @@
   /// Test integrateResidual().
   void testIntegrateResidual(void);
 
-  /// Test integrateResidual().
-  void testIntegrateResidualLumped(void);
-
   /// Test integrateJacobian().
   void testIntegrateJacobian(void);
 
-  /// Test integrateJacobian().
-  void testIntegrateJacobianLumped(void);
-
   /// Test updateStateVars().
   void testUpdateStateVars(void);
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform1DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform1DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform1DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform1DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform1DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform1DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform2DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform2DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform2DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform2DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform2DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform2DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform3DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform3DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform3DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform3DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform3DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeform3DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav1DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav1DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav1DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav1DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav1DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav1DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav2DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav2DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav2DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav2DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav2DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav2DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav3DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav3DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav3DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav3DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav3DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitLgDeformGrav3DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,9 +46,7 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,7 +58,7 @@
   GeometryTet3D geometry;
   _quadrature->refGeometry(&geometry);
 
-  _data = new ElasticityExplicitData3DLinear();
+  _data = new ElasticityExplicitData3DLinear;
   CPPUNIT_ASSERT(0 != _data);
   _material = new materials::ElasticIsotropic3D;
   CPPUNIT_ASSERT(0 != _material);
@@ -137,28 +137,6 @@
 } // testNeedNewJacobian
 
 // ----------------------------------------------------------------------
-// Test useSolnIncr().
-void
-pylith::feassemble::TestElasticityExplicitTet4::testUseSolnIncr(void)
-{ // testUseSolnIncr
-  ElasticityExplicitTet4 integrator;
-
-  materials::ElasticIsotropic3D material;
-  integrator.material(&material);
-  CPPUNIT_ASSERT_EQUAL(false, integrator._useSolnIncr);
-  try {
-    integrator.useSolnIncr(false);
-
-    // Should have thrown exception, so don't make it here.
-    CPPUNIT_ASSERT(false);
-  } catch (const std::logic_error& err) {
-    // Expect logic error so don't do anything.
-  } catch (...) {
-    CPPUNIT_ASSERT(false);
-  } // try/catch
-} // testUseSolnIncr
-
-// ----------------------------------------------------------------------
 // Test initialize().
 void 
 pylith::feassemble::TestElasticityExplicitTet4::testInitialize(void)
@@ -219,52 +197,6 @@
 } // testIntegrateResidual
 
 // ----------------------------------------------------------------------
-// Test integrateResidual().
-void
-pylith::feassemble::TestElasticityExplicitTet4::testIntegrateResidualLumped(void)
-{ // testIntegrateResidualLumped
-  CPPUNIT_ASSERT(0 != _data);
-
-  topology::Mesh mesh;
-  ElasticityExplicitTet4 integrator;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &integrator, &fields);
-
-  topology::Field<topology::Mesh>& residual = fields.get("residual");
-  const PylithScalar t = 1.0;
-  integrator.integrateResidualLumped(residual, t, &fields);
-
-  const PylithScalar* valsE = _data->valsResidualLumped;
-  const int sizeE = _data->spaceDim * _data->numVertices;
-
-  PetscSection residualSection = residual.petscSection();
-  Vec          residualVec     = residual.localVector();
-  PetscScalar   *vals;
-  PetscInt       size;
-  PetscErrorCode err;
-
-  CPPUNIT_ASSERT(residualSection);CPPUNIT_ASSERT(residualVec);
-  err = VecGetArray(residualVec, &vals);CHECK_PETSC_ERROR(err);
-  err = PetscSectionGetStorageSize(residualSection, &size);CHECK_PETSC_ERROR(err);
-  CPPUNIT_ASSERT_EQUAL(sizeE, size);
-
-#if 0 // DEBUGGING
-  residual.view("RESIDUAL");
-  std::cout << "EXPECTED RESIDUAL" << std::endl;
-  for (int i=0; i < size; ++i)
-    std::cout << "  " << valsE[i] << std::endl;
-#endif // DEBUGGING
-
-  const PylithScalar tolerance = 1.0e-06;
-  for (int i=0; i < size; ++i)
-    if (fabs(valsE[i]) > 1.0)
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valsE[i], tolerance);
-    else
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[i], vals[i], tolerance);
-  err = VecRestoreArray(residualVec, &vals);CHECK_PETSC_ERROR(err);
-} // testIntegrateResidualLumped
-
-// ----------------------------------------------------------------------
 // Test integrateJacobian().
 void
 pylith::feassemble::TestElasticityExplicitTet4::testIntegrateJacobian(void)
@@ -277,61 +209,6 @@
   _initialize(&mesh, &integrator, &fields);
   integrator._needNewJacobian = true;
 
-  topology::Jacobian jacobian(fields.solution());
-
-  const PylithScalar t = 1.0;
-  integrator.integrateJacobian(&jacobian, t, &fields);
-  CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());
-  jacobian.assemble("final_assembly");
-
-  const PylithScalar* valsE = _data->valsJacobian;
-  const int nrowsE = _data->numVertices * _data->spaceDim;
-  const int ncolsE = _data->numVertices * _data->spaceDim;
-
-  const PetscMat jacobianMat = jacobian.matrix();
-
-  int nrows = 0;
-  int ncols = 0;
-  MatGetSize(jacobianMat, &nrows, &ncols);
-  CPPUNIT_ASSERT_EQUAL(nrowsE, nrows);
-  CPPUNIT_ASSERT_EQUAL(ncolsE, ncols);
-
-  PetscMat jDense;
-  MatConvert(jacobianMat, MATSEQDENSE, MAT_INITIAL_MATRIX, &jDense);
-
-  scalar_array vals(nrows*ncols);
-  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;
-  MatGetValues(jDense, nrows, &rows[0], ncols, &cols[0], &vals[0]);
-  const PylithScalar tolerance = 1.0e-06;
-  for (int iRow=0; iRow < nrows; ++iRow)
-    for (int iCol=0; iCol < ncols; ++iCol) {
-      const int index = ncols*iRow+iCol;
-      if (fabs(valsE[index]) > 1.0)
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[index]/valsE[index], tolerance);
-      else
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[index], vals[index], tolerance);
-    } // for
-  MatDestroy(&jDense);
-} // testIntegrateJacobian
-
-// ----------------------------------------------------------------------
-// Test integrateJacobian().
-void
-pylith::feassemble::TestElasticityExplicitTet4::testIntegrateJacobianLumped(void)
-{ // testIntegrateJacobian
-  CPPUNIT_ASSERT(0 != _data);
-
-  topology::Mesh mesh;
-  ElasticityExplicitTet4 integrator;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &integrator, &fields);
-  integrator._needNewJacobian = true;
-
   topology::Field<topology::Mesh> jacobian(mesh);
   jacobian.label("Jacobian");
   jacobian.vectorFieldType(topology::FieldBase::VECTOR);
@@ -343,19 +220,10 @@
   CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());
   jacobian.complete();
 
-  const PylithScalar* valsMatrixE = _data->valsJacobian;
+  const PylithScalar* valsE = _data->valsJacobian;
   const int sizeE = _data->numVertices * _data->spaceDim;
-  scalar_array valsE(sizeE);
   const int spaceDim = _data->spaceDim;
   const int numBasis = _data->numVertices;
-  for (int iBasis=0; iBasis < numBasis; ++iBasis)
-    for (int iDim=0; iDim < spaceDim; ++iDim) {
-      const int indexRow = (iBasis*spaceDim+iDim)*numBasis*spaceDim;
-      PylithScalar value = 0.0;
-      for (int jBasis=0; jBasis < numBasis; ++jBasis)
-	value += valsMatrixE[indexRow + jBasis*spaceDim+iDim];
-      valsE[iBasis*spaceDim+iDim] = value;
-    } // for
 
 #if 0 // DEBUGGING
   jacobian.view("JACOBIAN");
@@ -382,8 +250,9 @@
       CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valsE[i], tolerance);
     else
       CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[i], vals[i], tolerance);
+
   err = VecRestoreArray(jacobianVec, &vals);CHECK_PETSC_ERROR(err);
-} // testIntegrateJacobianLumped
+} // testIntegrateJacobian
 
 // ----------------------------------------------------------------------
 // Test updateStateVars().
@@ -406,13 +275,16 @@
 void
 pylith::feassemble::TestElasticityExplicitTet4::testStableTimeStep(void)
 { // testStableTimeStep
+  CPPUNIT_ASSERT(_data);
+
   topology::Mesh mesh;
   ElasticityExplicitTet4 integrator;
   topology::SolutionFields fields(mesh);
   _initialize(&mesh, &integrator, &fields);
 
-  const PylithScalar stableTimeStep = integrator.stableTimeStep(mesh);
-  CPPUNIT_ASSERT_EQUAL(pylith::PYLITH_MAXSCALAR, stableTimeStep);
+  const PylithScalar dtStable = integrator.stableTimeStep(mesh);
+  const PylithScalar tolerance = 1.0e-6;
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, dtStable/_data->dtStableExplicit, tolerance);
 } // testStableTimeStep
 
 extern PetscErrorCode DMComplexBuildFromCellList_Private(DM dm, PetscInt numCells, PetscInt numVertices, PetscInt numCorners, const int cells[]);

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -54,12 +54,9 @@
   CPPUNIT_TEST( testTimeStep );
   CPPUNIT_TEST( testMaterial );
   CPPUNIT_TEST( testNeedNewJacobian );
-  CPPUNIT_TEST( testUseSolnIncr );
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testStableTimeStep );
 
@@ -86,24 +83,15 @@
   /// Test needNewJacobian().
   void testNeedNewJacobian(void);
 
-  /// Test useSolnIncr().
-  void testUseSolnIncr(void);
-
   /// Test initialize().
   void testInitialize(void);
 
   /// Test integrateResidual().
   void testIntegrateResidual(void);
 
-  /// Test integrateResidualLumped().
-  void testIntegrateResidualLumped(void);
-
   /// Test integrateJacobian().
   void testIntegrateJacobian(void);
 
-  /// Test integrateJacobianLumped().
-  void testIntegrateJacobianLumped(void);
-
   /// Test updateStateVars().
   void testUpdateStateVars(void);
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -137,28 +137,6 @@
 } // testNeedNewJacobian
 
 // ----------------------------------------------------------------------
-// Test useSolnIncr().
-void
-pylith::feassemble::TestElasticityExplicitTri3::testUseSolnIncr(void)
-{ // testUseSolnIncr
-  ElasticityExplicitTri3 integrator;
-
-  materials::ElasticPlaneStrain material;
-  integrator.material(&material);
-  CPPUNIT_ASSERT_EQUAL(false, integrator._useSolnIncr);
-  try {
-    integrator.useSolnIncr(false);
-
-    // Should have thrown exception, so don't make it here.
-    CPPUNIT_ASSERT(false);
-  } catch (const std::logic_error& err) {
-    // Expect logic error so don't do anything.
-  } catch (...) {
-    CPPUNIT_ASSERT(false);
-  } // try/catch
-} // testUseSolnIncr
-
-// ----------------------------------------------------------------------
 // Test initialize().
 void 
 pylith::feassemble::TestElasticityExplicitTri3::testInitialize(void)
@@ -219,52 +197,6 @@
 } // testIntegrateResidual
 
 // ----------------------------------------------------------------------
-// Test integrateResidual().
-void
-pylith::feassemble::TestElasticityExplicitTri3::testIntegrateResidualLumped(void)
-{ // testIntegrateResidualLumped
-  CPPUNIT_ASSERT(0 != _data);
-
-  topology::Mesh mesh;
-  ElasticityExplicitTri3 integrator;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &integrator, &fields);
-
-  topology::Field<topology::Mesh>& residual = fields.get("residual");
-  const PylithScalar t = 1.0;
-  integrator.integrateResidualLumped(residual, t, &fields);
-
-  const PylithScalar* valsE = _data->valsResidualLumped;
-  const int sizeE = _data->spaceDim * _data->numVertices;
-
-  PetscSection residualSection = residual.petscSection();
-  Vec          residualVec     = residual.localVector();
-  PetscScalar   *vals;
-  PetscInt       size;
-  PetscErrorCode err;
-
-  CPPUNIT_ASSERT(residualSection);CPPUNIT_ASSERT(residualVec);
-  err = VecGetArray(residualVec, &vals);CHECK_PETSC_ERROR(err);
-  err = PetscSectionGetStorageSize(residualSection, &size);CHECK_PETSC_ERROR(err);
-  CPPUNIT_ASSERT_EQUAL(sizeE, size);
-
-#if 0 // DEBUGGING
-  residual.view("RESIDUAL");
-  std::cout << "EXPECTED RESIDUAL" << std::endl;
-  for (int i=0; i < size; ++i)
-    std::cout << "  " << valsE[i] << std::endl;
-#endif // DEBUGGING
-
-  const PylithScalar tolerance = 1.0e-06;
-  for (int i=0; i < size; ++i)
-    if (fabs(valsE[i]) > 1.0)
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valsE[i], tolerance);
-    else
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[i], vals[i], tolerance);
-  err = VecRestoreArray(residualVec, &vals);CHECK_PETSC_ERROR(err);
-} // testIntegrateResidualLumped
-
-// ----------------------------------------------------------------------
 // Test integrateJacobian().
 void
 pylith::feassemble::TestElasticityExplicitTri3::testIntegrateJacobian(void)
@@ -277,61 +209,6 @@
   _initialize(&mesh, &integrator, &fields);
   integrator._needNewJacobian = true;
 
-  topology::Jacobian jacobian(fields.solution());
-
-  const PylithScalar t = 1.0;
-  integrator.integrateJacobian(&jacobian, t, &fields);
-  CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());
-  jacobian.assemble("final_assembly");
-
-  const PylithScalar* valsE = _data->valsJacobian;
-  const int nrowsE = _data->numVertices * _data->spaceDim;
-  const int ncolsE = _data->numVertices * _data->spaceDim;
-
-  const PetscMat jacobianMat = jacobian.matrix();
-
-  int nrows = 0;
-  int ncols = 0;
-  MatGetSize(jacobianMat, &nrows, &ncols);
-  CPPUNIT_ASSERT_EQUAL(nrowsE, nrows);
-  CPPUNIT_ASSERT_EQUAL(ncolsE, ncols);
-
-  PetscMat jDense;
-  MatConvert(jacobianMat, MATSEQDENSE, MAT_INITIAL_MATRIX, &jDense);
-
-  scalar_array vals(nrows*ncols);
-  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;
-  MatGetValues(jDense, nrows, &rows[0], ncols, &cols[0], &vals[0]);
-  const PylithScalar tolerance = 1.0e-06;
-  for (int iRow=0; iRow < nrows; ++iRow)
-    for (int iCol=0; iCol < ncols; ++iCol) {
-      const int index = ncols*iRow+iCol;
-      if (fabs(valsE[index]) > 1.0)
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[index]/valsE[index], tolerance);
-      else
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[index], vals[index], tolerance);
-    } // for
-  MatDestroy(&jDense);
-} // testIntegrateJacobian
-
-// ----------------------------------------------------------------------
-// Test integrateJacobian().
-void
-pylith::feassemble::TestElasticityExplicitTri3::testIntegrateJacobianLumped(void)
-{ // testIntegrateJacobian
-  CPPUNIT_ASSERT(0 != _data);
-
-  topology::Mesh mesh;
-  ElasticityExplicitTri3 integrator;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &integrator, &fields);
-  integrator._needNewJacobian = true;
-
   topology::Field<topology::Mesh> jacobian(mesh);
   jacobian.label("Jacobian");
   jacobian.vectorFieldType(topology::FieldBase::VECTOR);
@@ -343,19 +220,10 @@
   CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());
   jacobian.complete();
 
-  const PylithScalar* valsMatrixE = _data->valsJacobian;
+  const PylithScalar* valsE = _data->valsJacobian;
   const int sizeE = _data->numVertices * _data->spaceDim;
-  scalar_array valsE(sizeE);
   const int spaceDim = _data->spaceDim;
   const int numBasis = _data->numVertices;
-  for (int iBasis=0; iBasis < numBasis; ++iBasis)
-    for (int iDim=0; iDim < spaceDim; ++iDim) {
-      const int indexRow = (iBasis*spaceDim+iDim)*numBasis*spaceDim;
-      PylithScalar value = 0.0;
-      for (int jBasis=0; jBasis < numBasis; ++jBasis)
-	value += valsMatrixE[indexRow + jBasis*spaceDim+iDim];
-      valsE[iBasis*spaceDim+iDim] = value;
-    } // for
 
 #if 0 // DEBUGGING
   jacobian.view("JACOBIAN");
@@ -382,8 +250,9 @@
       CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valsE[i], tolerance);
     else
       CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[i], vals[i], tolerance);
+
   err = VecRestoreArray(jacobianVec, &vals);CHECK_PETSC_ERROR(err);
-} // testIntegrateJacobianLumped
+} // testIntegrateJacobian
 
 // ----------------------------------------------------------------------
 // Test updateStateVars().
@@ -406,13 +275,16 @@
 void
 pylith::feassemble::TestElasticityExplicitTri3::testStableTimeStep(void)
 { // testStableTimeStep
+  CPPUNIT_ASSERT(_data);
+
   topology::Mesh mesh;
   ElasticityExplicitTri3 integrator;
   topology::SolutionFields fields(mesh);
   _initialize(&mesh, &integrator, &fields);
 
-  const PylithScalar stableTimeStep = integrator.stableTimeStep(mesh);
-  CPPUNIT_ASSERT_EQUAL(pylith::PYLITH_MAXSCALAR, stableTimeStep);
+  const PylithScalar dtStable = integrator.stableTimeStep(mesh);
+  const PylithScalar tolerance = 1.0e-6;
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, dtStable/_data->dtStableExplicit, tolerance);
 } // testStableTimeStep
 
 extern PetscErrorCode DMComplexBuildFromCellList_Private(DM dm, PetscInt numCells, PetscInt numVertices, PetscInt numCorners, const int cells[]);

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -54,12 +54,9 @@
   CPPUNIT_TEST( testTimeStep );
   CPPUNIT_TEST( testMaterial );
   CPPUNIT_TEST( testNeedNewJacobian );
-  CPPUNIT_TEST( testUseSolnIncr );
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualLumped );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testStableTimeStep );
 
@@ -86,24 +83,15 @@
   /// Test needNewJacobian().
   void testNeedNewJacobian(void);
 
-  /// Test useSolnIncr().
-  void testUseSolnIncr(void);
-
   /// Test initialize().
   void testInitialize(void);
 
   /// Test integrateResidual().
   void testIntegrateResidual(void);
 
-  /// Test integrateResidualLumped().
-  void testIntegrateResidualLumped(void);
-
   /// Test integrateJacobian().
   void testIntegrateJacobian(void);
 
-  /// Test integrateJacobianLumped().
-  void testIntegrateJacobianLumped(void);
-
   /// Test updateStateVars().
   void testUpdateStateVars(void);
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityImplicit.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityImplicit.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityImplicit.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -127,20 +127,6 @@
 } // testNeedNewJacobian
 
 // ----------------------------------------------------------------------
-// Test useSolnIncr().
-void
-pylith::feassemble::TestElasticityImplicit::testUseSolnIncr(void)
-{ // testUseSolnIncr
-  ElasticityImplicit integrator;
-
-  materials::ElasticIsotropic3D material;
-  integrator.material(&material);
-  CPPUNIT_ASSERT_EQUAL(false, integrator._useSolnIncr);
-  integrator.useSolnIncr(true);
-  CPPUNIT_ASSERT_EQUAL(true, integrator._useSolnIncr);  
-} // testUseSolnIncr
-
-// ----------------------------------------------------------------------
 // Test initialize().
 void 
 pylith::feassemble::TestElasticityImplicit::testInitialize(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityImplicit.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityImplicit.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityImplicit.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -54,7 +54,6 @@
   CPPUNIT_TEST( testTimeStep );
   CPPUNIT_TEST( testMaterial );
   CPPUNIT_TEST( testNeedNewJacobian );
-  CPPUNIT_TEST( testUseSolnIncr );
 
   // Testing of initialize(), integrateResidual(),
   // integrateJacobian(), and updateStateVars() handled by derived
@@ -86,9 +85,6 @@
   /// Test needNewJacobian().
   void testNeedNewJacobian(void);
 
-  /// Test useSolnIncr().
-  void testUseSolnIncr(void);
-
   /// Test initialize().
   void testInitialize(void);
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/TestIntegrator.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/TestIntegrator.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/TestIntegrator.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -22,6 +22,7 @@
 
 #include "pylith/feassemble/ElasticityExplicit.hh" // USES ElasticityExplicit
 #include "pylith/feassemble/ElasticityImplicit.hh" // USES ElasticityImplicit
+#include "pylith/bc/Neumann.hh" // USES Neumann
 #include "pylith/topology/Mesh.hh" // USES Mesh
 #include "pylith/feassemble/Quadrature.hh" // USES Quadrature
 #include "pylith/utils/constdefs.h" // USES MAXSCALAR
@@ -48,7 +49,7 @@
 void
 pylith::feassemble::TestIntegrator::testStableTimeStep(void)
 { // testStableTimeStep
-  ElasticityExplicit integrator;
+  bc::Neumann integrator;
   topology::Mesh mesh;
 
   CPPUNIT_ASSERT_EQUAL(pylith::PYLITH_MAXSCALAR,

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicit.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicit.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicit.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -63,20 +63,8 @@
     return residual.flatten()
 
 
-  def calculateJacobian(self, integrator):
+  def calculateResidual(self, integrator):
     """
-    Calculate contribution to Jacobian matrix of operator for integrator.
-
-    [A] = (1/dt**2)[M]
-    """
-    M = integrator._calculateMassMat()
-
-    jacobian = 1.0/integrator.dt**2 * M
-    return jacobian
-
-
-  def calculateResidualLumped(self, integrator):
-    """
     Calculate contribution to residual of operator for integrator.
 
     {r} = (1/dt**2)[M](-{u(t+dt)} + 2 {u(t)} - {u(t-dt)}) -
@@ -94,7 +82,7 @@
     return residual.flatten()
 
 
-  def calculateJacobianLumped(self, integrator):
+  def calculateJacobian(self, integrator):
     """
     Calculate contribution to Jacobian matrix of operator for integrator.
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitApp.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitApp.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitApp.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -54,8 +54,7 @@
     self._collectData()
     self._calculateResidual()
     self._calculateJacobian()
-    self._calculateResidualLumped()
-    self._calculateJacobianLumped()
+    self._calcDtStable()
     self._initData()
     self.data.write(self.name)
     return
@@ -63,34 +62,42 @@
 
   # PRIVATE METHODS ////////////////////////////////////////////////////
 
-  def _calculateResidualLumped(self):
+  def _calcDtStable(self):
     """
+    Calculate stable time step for explicit time stepping.
+    """
+    vp = ((self.lameLambda + 2.0*self.lameMu) / self.density)**0.5
+    minCellWidth = self.mesh.minCellWidth
+    self.dtStableExplicit = minCellWidth / vp
+    return
+
+
+  def _calculateResidual(self):
+    """
     Calculate contribution to residual of operator for integrator.
     """
-    self.valsResidualLumped = self.formulation.calculateResidualLumped(self)
+    self.valsResidual = self.formulation.calculateResidual(self)
     if self.useGravity:
-      self.valsResidualLumped += self._calculateGravityVec()
+      self.valsResidual += self._calculateGravityVec()
     return
 
 
-  def _calculateJacobianLumped(self):
+  def _calculateJacobian(self):
     """
     Calculate contribution to Jacobian matrix of operator for integrator.
     """
-    self.valsJacobianLumped = self.formulation.calculateJacobianLumped(self)
+    self.valsJacobian = self.formulation.calculateJacobian(self)
     return
 
 
   def _initData(self):
 
     ElasticityApp._initData(self)
+    
     # Calculated values
-    self.data.addArray(vtype="PylithScalar", name="_valsResidualLumped",
-                       values=self.valsResidualLumped,
-                       format="%16.8e", ncols=self.spaceDim)
-    self.data.addArray(vtype="PylithScalar", name="_valsJacobianLumped",
-                       values=self.valsJacobianLumped,
-                       format="%16.8e", ncols=self.spaceDim)
+    self.data.addScalar(vtype="PylithScalar", name="_dtStableExplicit",
+                       value=self.dtStableExplicit,
+                       format="%16.8e");
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -21,8 +21,7 @@
 // ----------------------------------------------------------------------
 // Constructor
 pylith::feassemble::ElasticityExplicitData::ElasticityExplicitData(void) :
-  valsResidualLumped(0),
-  valsJacobianLumped(0)
+  dtStableExplicit(1.0e+99)
 { // constructor
 } // constructor
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,8 +44,7 @@
 
   /// @name Calculated values.
   //@{
-  PylithScalar* valsResidualLumped; ///< Expected values from residual calculation (lumped Jacobian).
-  PylithScalar* valsJacobianLumped; ///< Expected values from lumped Jacobian calculation.
+  PylithScalar dtStableExplicit; ///< Stable time step for explicit time integration.
   //@}
 };
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData1DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitData1DLinear::_dtStableExplicit =   3.75000000e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitData1DLinear::_gravityVec[] = {
  -1.00000000e+08,
 };
@@ -95,23 +97,11 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData1DLinear::_valsResidual[] = {
-  1.71634375e+10,
- -1.72365625e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData1DLinear::_valsJacobian[] = {
-  1.40625000e+07,
-  1.40625000e+07,
-  1.40625000e+07,
-  1.40625000e+07,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData1DLinear::_valsResidualLumped[] = {
   1.71690625e+10,
  -1.72421875e+10,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitData1DLinear::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitData1DLinear::_valsJacobian[] = {
   2.81250000e+07,
   2.81250000e+07,
 };
@@ -129,6 +119,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -142,8 +133,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitData1DLinear::~ElasticityExplicitData1DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitdata1dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData1DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitData1DQuadratic::_dtStableExplicit =   3.75000000e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitData1DQuadratic::_gravityVec[] = {
  -1.00000000e+08,
 };
@@ -109,30 +111,12 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData1DQuadratic::_valsResidual[] = {
-  6.00504167e+10,
-  1.45260729e+11,
- -2.05377708e+11,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData1DQuadratic::_valsJacobian[] = {
-  6.25000000e+06,
- -3.12500000e+06,
-  6.25000000e+06,
- -3.12500000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  2.50000000e+07,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData1DQuadratic::_valsResidualLumped[] = {
   6.00563542e+10,
   1.45266667e+11,
  -2.05389583e+11,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitData1DQuadratic::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitData1DQuadratic::_valsJacobian[] = {
   9.37500000e+06,
   9.37500000e+06,
   3.75000000e+07,
@@ -151,6 +135,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -164,8 +149,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitData1DQuadratic::~ElasticityExplicitData1DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData1DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitdata1dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData2DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitData2DLinear::_dtStableExplicit =   1.50923086e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitData2DLinear::_gravityVec[] = {
   0.00000000e+00, -1.00000000e+08,
 };
@@ -100,39 +102,12 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData2DLinear::_valsResidual[] = {
- -7.10095578e+10,  1.36893348e+11,
- -1.02829242e+10, -1.20976325e+11,
-  8.12828570e+10, -1.59202314e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData2DLinear::_valsJacobian[] = {
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData2DLinear::_valsResidualLumped[] = {
  -7.10086411e+10,  1.36894418e+11,
  -1.02842992e+10, -1.20980297e+11,
   8.12833153e+10, -1.59173286e+10,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitData2DLinear::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitData2DLinear::_valsJacobian[] = {
   4.58333333e+06,  4.58333333e+06,
   4.58333333e+06,  4.58333333e+06,
   4.58333333e+06,  4.58333333e+06,
@@ -151,6 +126,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -164,8 +140,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitData2DLinear::~ElasticityExplicitData2DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitdata2dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData2DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitData2DQuadratic::_dtStableExplicit =   2.63523138e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitData2DQuadratic::_gravityVec[] = {
   0.00000000e+00, -1.00000000e+08,
 };
@@ -170,90 +172,6 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData2DQuadratic::_valsResidual[] = {
-  1.14469580e+10,  9.89206525e+10,
- -3.22261697e+10, -5.24164966e+09,
-  5.33382294e+09,  6.79748894e+10,
-  6.97040375e+10,  1.10679118e+11,
- -7.00903642e+10, -2.03315152e+11,
-  1.58455201e+10, -6.90098433e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData2DQuadratic::_valsJacobian[] = {
-  2.24121094e+06,  0.00000000e+00,
-  2.41699219e+05,  0.00000000e+00,
-  2.41699219e+05,  0.00000000e+00,
-  4.21875000e+06,  0.00000000e+00,
- -1.36230469e+06,  0.00000000e+00,
- -1.36230469e+06,  0.00000000e+00,
-  0.00000000e+00,  2.24121094e+06,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  4.21875000e+06,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.36230469e+06,
-  2.41699219e+05,  0.00000000e+00,
-  3.61083984e+06,  0.00000000e+00,
- -6.73828125e+05,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  3.61083984e+06,
-  0.00000000e+00, -6.73828125e+05,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -1.12792969e+06,
-  2.41699219e+05,  0.00000000e+00,
- -6.73828125e+05,  0.00000000e+00,
-  3.61083984e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00, -6.73828125e+05,
-  0.00000000e+00,  3.61083984e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -1.52343750e+06,
-  4.21875000e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
-  2.21484375e+07,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  0.00000000e+00,  4.21875000e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00,  2.21484375e+07,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00, -5.39062500e+06,
- -1.36230469e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  8.46679688e+06,  0.00000000e+00,
-  6.09375000e+06,  0.00000000e+00,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00,  8.46679688e+06,
-  0.00000000e+00,  6.09375000e+06,
- -1.36230469e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  6.09375000e+06,  0.00000000e+00,
-  8.46679688e+06,  0.00000000e+00,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00,  6.09375000e+06,
-  0.00000000e+00,  8.46679688e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData2DQuadratic::_valsResidualLumped[] = {
   1.14454133e+10,  9.89209294e+10,
  -3.22283567e+10, -5.24308887e+09,
   5.33172309e+09,  6.79741797e+10,
@@ -262,7 +180,7 @@
   1.58484937e+10, -6.90064316e+10,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitData2DQuadratic::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitData2DQuadratic::_valsJacobian[] = {
   4.21875000e+06,  4.21875000e+06,
   3.98437500e+06,  3.98437500e+06,
   3.98437500e+06,  3.98437500e+06,
@@ -284,6 +202,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -297,8 +216,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitData2DQuadratic::~ElasticityExplicitData2DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData2DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitdata2dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData3DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitData3DLinear::_dtStableExplicit =   1.80277564e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitData3DLinear::_gravityVec[] = {
   0.00000000e+00,  0.00000000e+00, -1.00000000e+08,
 };
@@ -106,71 +108,13 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData3DLinear::_valsResidual[] = {
- -6.53693819e+09,  3.88079833e+10,  3.46544326e+09,
- -4.32000975e+09,  7.13967240e+10,  2.36593900e+10,
-  7.21670494e+09, -1.13026998e+11, -3.40757835e+10,
-  3.64360549e+09,  2.82229089e+09,  6.95364028e+09,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData3DLinear::_valsJacobian[] = {
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData3DLinear::_valsResidualLumped[] = {
  -6.53643381e+09,  3.88073108e+10,  3.46544326e+09,
  -4.31950537e+09,  7.13977327e+10,  2.36607350e+10,
   7.21485556e+09, -1.13028007e+11, -3.40771285e+10,
   3.64444612e+09,  2.82296339e+09,  6.95364028e+09,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitData3DLinear::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitData3DLinear::_valsJacobian[] = {
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
@@ -190,6 +134,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -203,8 +148,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitData3DLinear::~ElasticityExplicitData3DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitdata3dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData3DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitData3DQuadratic::_dtStableExplicit =   3.68555740e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitData3DQuadratic::_gravityVec[] = {
   0.00000000e+00,  0.00000000e+00, -1.00000000e+08,
 };
@@ -187,322 +189,6 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitData3DQuadratic::_valsResidual[] = {
-  2.17054586e+10, -1.01739898e+10,  2.19940105e+10,
-  6.44485026e+10, -2.49355435e+10,  6.57568524e+09,
- -4.99706922e+10, -5.58679967e+10, -3.45875247e+10,
- -9.94786340e+09,  4.42029024e+10, -4.09053678e+10,
- -7.06409419e+09,  6.20990315e+10, -1.70066323e+09,
-  7.08323019e+10,  1.17494841e+11, -3.98014534e+10,
- -9.85096504e+10, -5.58231405e+10, -2.54484051e+10,
- -1.35961925e+10, -6.36499481e+10,  1.11445117e+10,
- -3.55911964e+10,  5.53493739e+10,  5.68991582e+09,
-  5.77073439e+10, -6.86734841e+10,  9.70537069e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData3DQuadratic::_valsJacobian[] = {
-  1.50251107e+06,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.50251107e+06,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.50251107e+06,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitData3DQuadratic::_valsResidualLumped[] = {
   2.17058857e+10, -1.01733961e+10,  2.19900081e+10,
   6.44476753e+10, -2.49368998e+10,  6.57917072e+09,
  -4.99716018e+10, -5.58679351e+10, -3.45875383e+10,
@@ -515,11 +201,11 @@
   5.76997342e+10, -6.86862545e+10,  9.70617888e+10,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitData3DQuadratic::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitData3DQuadratic::_valsJacobian[] = {
   2.57903646e+06,  2.57903646e+06,  2.57903646e+06,
   2.40117187e+06,  2.40117187e+06,  2.40117187e+06,
+  2.40117187e+06,  2.40117187e+06,  2.40117187e+06,
   2.40117188e+06,  2.40117188e+06,  2.40117188e+06,
-  2.40117188e+06,  2.40117188e+06,  2.40117188e+06,
   1.20947917e+07,  1.20947917e+07,  1.20947917e+07,
   8.35963542e+06,  8.35963542e+06,  8.35963542e+06,
   8.35963542e+06,  8.35963542e+06,  8.35963542e+06,
@@ -541,6 +227,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -554,8 +241,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitData3DQuadratic::~ElasticityExplicitData3DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitdata3dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DLinear::_dtStableExplicit =   3.75000000e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DLinear::_gravityVec[] = {
  -1.00000000e+08,
 };
@@ -95,23 +97,11 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DLinear::_valsResidual[] = {
- -2.64086562e+11,
- -2.98486562e+11,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DLinear::_valsJacobian[] = {
-  1.40625000e+07,
-  1.40625000e+07,
-  1.40625000e+07,
-  1.40625000e+07,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DLinear::_valsResidualLumped[] = {
  -2.64080938e+11,
  -2.98492188e+11,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DLinear::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DLinear::_valsJacobian[] = {
   2.81250000e+07,
   2.81250000e+07,
 };
@@ -129,6 +119,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -142,8 +133,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitGravData1DLinear::~ElasticityExplicitGravData1DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitgravdata1dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DQuadratic::_dtStableExplicit =   3.75000000e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DQuadratic::_gravityVec[] = {
  -1.00000000e+08,
 };
@@ -109,30 +111,12 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DQuadratic::_valsResidual[] = {
- -3.36995833e+10,
-  5.15107292e+10,
- -5.80377708e+11,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DQuadratic::_valsJacobian[] = {
-  6.25000000e+06,
- -3.12500000e+06,
-  6.25000000e+06,
- -3.12500000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  2.50000000e+07,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DQuadratic::_valsResidualLumped[] = {
  -3.36936458e+10,
   5.15166667e+10,
  -5.80389583e+11,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DQuadratic::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData1DQuadratic::_valsJacobian[] = {
   9.37500000e+06,
   9.37500000e+06,
   3.75000000e+07,
@@ -151,6 +135,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -164,8 +149,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitGravData1DQuadratic::~ElasticityExplicitGravData1DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData1DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitgravdata1dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DLinear::_dtStableExplicit =   1.50923086e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DLinear::_gravityVec[] = {
   0.00000000e+00, -1.00000000e+08,
 };
@@ -100,39 +102,12 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DLinear::_valsResidual[] = {
- -7.10095578e+10,  9.10600148e+10,
- -1.02829242e+10, -1.66809658e+11,
-  8.12828570e+10, -6.17535647e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DLinear::_valsJacobian[] = {
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DLinear::_valsResidualLumped[] = {
  -7.10086411e+10,  9.10610843e+10,
  -1.02842992e+10, -1.66813631e+11,
   8.12833153e+10, -6.17506619e+10,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DLinear::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DLinear::_valsJacobian[] = {
   4.58333333e+06,  4.58333333e+06,
   4.58333333e+06,  4.58333333e+06,
   4.58333333e+06,  4.58333333e+06,
@@ -151,6 +126,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -164,8 +140,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitGravData2DLinear::~ElasticityExplicitGravData2DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitgravdata2dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DQuadratic::_dtStableExplicit =   2.63523138e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DQuadratic::_gravityVec[] = {
   0.00000000e+00, -1.00000000e+08,
 };
@@ -170,90 +172,6 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DQuadratic::_valsResidual[] = {
-  1.14469580e+10,  5.67331525e+10,
- -3.22261697e+10, -4.50853997e+10,
-  5.33382294e+09,  2.81311394e+10,
-  6.97040375e+10, -1.14320882e+11,
- -7.00903642e+10, -2.54877652e+11,
-  1.58455201e+10, -1.20572343e+11,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DQuadratic::_valsJacobian[] = {
-  2.24121094e+06,  0.00000000e+00,
-  2.41699219e+05,  0.00000000e+00,
-  2.41699219e+05,  0.00000000e+00,
-  4.21875000e+06,  0.00000000e+00,
- -1.36230469e+06,  0.00000000e+00,
- -1.36230469e+06,  0.00000000e+00,
-  0.00000000e+00,  2.24121094e+06,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  4.21875000e+06,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.36230469e+06,
-  2.41699219e+05,  0.00000000e+00,
-  3.61083984e+06,  0.00000000e+00,
- -6.73828125e+05,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  3.61083984e+06,
-  0.00000000e+00, -6.73828125e+05,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -1.12792969e+06,
-  2.41699219e+05,  0.00000000e+00,
- -6.73828125e+05,  0.00000000e+00,
-  3.61083984e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00, -6.73828125e+05,
-  0.00000000e+00,  3.61083984e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -1.52343750e+06,
-  4.21875000e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
-  2.21484375e+07,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  0.00000000e+00,  4.21875000e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00,  2.21484375e+07,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00, -5.39062500e+06,
- -1.36230469e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  8.46679688e+06,  0.00000000e+00,
-  6.09375000e+06,  0.00000000e+00,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00,  8.46679688e+06,
-  0.00000000e+00,  6.09375000e+06,
- -1.36230469e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  6.09375000e+06,  0.00000000e+00,
-  8.46679688e+06,  0.00000000e+00,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00,  6.09375000e+06,
-  0.00000000e+00,  8.46679688e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DQuadratic::_valsResidualLumped[] = {
   1.14454133e+10,  5.67334294e+10,
  -3.22283567e+10, -4.50868389e+10,
   5.33172309e+09,  2.81304297e+10,
@@ -262,7 +180,7 @@
   1.58484937e+10, -1.20568932e+11,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DQuadratic::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData2DQuadratic::_valsJacobian[] = {
   4.21875000e+06,  4.21875000e+06,
   3.98437500e+06,  3.98437500e+06,
   3.98437500e+06,  3.98437500e+06,
@@ -284,6 +202,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -297,8 +216,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitGravData2DQuadratic::~ElasticityExplicitGravData2DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitgravdata2dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DLinear::_dtStableExplicit =   1.80277564e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DLinear::_gravityVec[] = {
   0.00000000e+00,  0.00000000e+00, -1.00000000e+08,
 };
@@ -106,71 +108,13 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DLinear::_valsResidual[] = {
- -6.53693819e+09,  3.88079833e+10, -3.01595567e+10,
- -4.32000975e+09,  7.13967240e+10, -9.96561003e+09,
-  7.21670494e+09, -1.13026998e+11, -6.77007835e+10,
-  3.64360549e+09,  2.82229089e+09, -2.66713597e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DLinear::_valsJacobian[] = {
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DLinear::_valsResidualLumped[] = {
  -6.53643381e+09,  3.88073108e+10, -3.01595567e+10,
  -4.31950537e+09,  7.13977327e+10, -9.96426503e+09,
   7.21485556e+09, -1.13028007e+11, -6.77021285e+10,
   3.64444612e+09,  2.82296339e+09, -2.66713597e+10,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DLinear::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DLinear::_valsJacobian[] = {
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
@@ -190,6 +134,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -203,8 +148,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitGravData3DLinear::~ElasticityExplicitGravData3DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitgravdata3dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DQuadratic::_dtStableExplicit =   3.68555740e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DQuadratic::_gravityVec[] = {
   0.00000000e+00,  0.00000000e+00, -1.00000000e+08,
 };
@@ -187,322 +189,6 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DQuadratic::_valsResidual[] = {
-  2.17054586e+10, -1.01739898e+10, -3.79635409e+09,
-  6.44485026e+10, -2.49355435e+10, -1.74360335e+10,
- -4.99706922e+10, -5.58679967e+10, -5.85992435e+10,
- -9.94786340e+09,  4.42029024e+10, -6.49170866e+10,
- -7.06409419e+09,  6.20990315e+10, -1.22648580e+11,
-  7.08323019e+10,  1.17494841e+11, -1.23397808e+11,
- -9.85096504e+10, -5.58231405e+10, -1.09044759e+11,
- -1.35961925e+10, -6.36499481e+10, -7.24518425e+10,
- -3.55911964e+10,  5.53493739e+10, -1.15258001e+11,
-  5.77073439e+10, -6.86734841e+10, -2.38942097e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DQuadratic::_valsJacobian[] = {
-  1.50251107e+06,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.50251107e+06,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.50251107e+06,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DQuadratic::_valsResidualLumped[] = {
   2.17058857e+10, -1.01733961e+10, -3.80035653e+09,
   6.44476753e+10, -2.49368998e+10, -1.74325480e+10,
  -4.99716018e+10, -5.58679351e+10, -5.85992570e+10,
@@ -515,11 +201,11 @@
   5.76997342e+10, -6.86862545e+10, -2.38861279e+10,
 };
 
-const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DQuadratic::_valsJacobianLumped[] = {
+const PylithScalar pylith::feassemble::ElasticityExplicitGravData3DQuadratic::_valsJacobian[] = {
   2.57903646e+06,  2.57903646e+06,  2.57903646e+06,
   2.40117187e+06,  2.40117187e+06,  2.40117187e+06,
+  2.40117187e+06,  2.40117187e+06,  2.40117187e+06,
   2.40117188e+06,  2.40117188e+06,  2.40117188e+06,
-  2.40117188e+06,  2.40117188e+06,  2.40117188e+06,
   1.20947917e+07,  1.20947917e+07,  1.20947917e+07,
   8.35963542e+06,  8.35963542e+06,  8.35963542e+06,
   8.35963542e+06,  8.35963542e+06,  8.35963542e+06,
@@ -541,6 +227,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -554,8 +241,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitGravData3DQuadratic::~ElasticityExplicitGravData3DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitgravdata3dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeform.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeform.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeform.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -52,55 +52,23 @@
     Calculate contribution to residual of operator for integrator.
 
     {r} = (1/dt**2)[M](-{u(t+dt)} + 2 {u(t)} - {u(t-dt)}) -
-          Sum(wt * [BL]^T [S])
-    """
-    import feutils
-
-    # Calculate action for inertia
-    M = integrator._calculateMassMat()
-    acc = (integrator.fieldTIncr - 
-           integrator.fieldT + 
-           integrator.fieldTmdt) / (integrator.dt**2) 
-    residual = -numpy.dot(M, acc)
-    residual = residual.flatten()
-    residual += self._elasticityResidual(integrator)
-    return residual
-
-
-  def calculateJacobian(self, integrator):
-    """
-    Calculate contribution to Jacobian matrix of operator for integrator.
-
-    [A] = (1/dt**2)[M]
-    """
-    M = integrator._calculateMassMat()
-
-    jacobian = 1.0/integrator.dt**2 * M
-    return jacobian
-
-
-  def calculateResidualLumped(self, integrator):
-    """
-    Calculate contribution to residual of operator for integrator.
-
-    {r} = (1/dt**2)[M](-{u(t+dt)} + 2 {u(t)} - {u(t-dt)}) -
           [K]{u(t)}
     """
     M = integrator._calculateMassMat()
     Ml = self._lumpMatrix(M, integrator.numBasis, integrator.spaceDim)
     
-    acc = (integrator.fieldTIncr - 
-           integrator.fieldT + 
-           integrator.fieldTmdt) / (integrator.dt**2)
-    acc = acc.flatten()
+    vel = (integrator.fieldT + integrator.fieldTIncr - integrator.fieldTmdt) / (2.0*integrator.dt)
+    acc = (integrator.fieldTIncr - integrator.fieldT + integrator.fieldTmdt) / (integrator.dt**2) 
+    dispAdj = integrator.fieldT + integrator.dt*integrator.normViscosity*vel
+    
     residual = -Ml*acc
     residual.flatten()
 
-    residual += self._elasticityResidual(integrator)
+    residual += self._elasticityResidual(integrator, dispAdj)
     return residual
 
 
-  def calculateJacobianLumped(self, integrator):
+  def calculateJacobian(self, integrator):
     """
     Calculate contribution to Jacobian matrix of operator for integrator.
 
@@ -131,7 +99,7 @@
     return vector
 
 
-  def _elasticityResidual(self, integrator):
+  def _elasticityResidual(self, integrator, dispAdj):
     """
     Calculate action for elasticity.
     """
@@ -147,13 +115,13 @@
       vertices = integrator.vertices[cell, :]
       (jacobian, jacobianInv, jacobianDet, basisDeriv) = \
           feutils.calculateJacobian(integrator.quadrature, vertices)
-      fieldT = integrator.fieldT
+
       for iQuad in xrange(integrator.numQuadPts):
         wt = integrator.quadWts[iQuad] * jacobianDet[iQuad]
         BL0 = integrator._calculateBasisDerivMatLinear0(basisDeriv, iQuad)
-        BL1 = integrator._calculateBasisDerivMatLinear1(basisDeriv, iQuad, fieldT)
+        BL1 = integrator._calculateBasisDerivMatLinear1(basisDeriv, iQuad, dispAdj)
         BL = BL0 + BL1
-        strain = integrator._calculateStrain(basisDeriv, iQuad, fieldT)
+        strain = integrator._calculateStrain(basisDeriv, iQuad, dispAdj)
         S = numpy.dot(D, strain.transpose())
         cellR -= wt * numpy.dot(BL.transpose(), S)
       

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DLinear::_dtStableExplicit =   3.75000000e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DLinear::_gravityVec[] = {
  -1.00000000e+08,
 };
@@ -80,8 +82,8 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DLinear::_fieldTIncr[] = {
-  1.20000000e+00,
-  1.70000000e+00,
+  1.00000000e-01,
+  2.00000000e-01,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DLinear::_fieldT[] = {
@@ -95,23 +97,11 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DLinear::_valsResidual[] = {
-  2.04829437e+10,
- -2.05560687e+10,
+  2.11549472e+10,
+ -2.11549472e+10,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DLinear::_valsJacobian[] = {
-  1.40625000e+07,
-  1.40625000e+07,
-  1.40625000e+07,
-  1.40625000e+07,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DLinear::_valsResidualLumped[] = {
-  2.04885687e+10,
- -2.05616937e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DLinear::_valsJacobianLumped[] = {
   2.81250000e+07,
   2.81250000e+07,
 };
@@ -129,6 +119,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -142,8 +133,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformData1DLinear::~ElasticityExplicitLgDeformData1DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformdata1dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DQuadratic::_dtStableExplicit =   3.75000000e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DQuadratic::_gravityVec[] = {
  -1.00000000e+08,
 };
@@ -109,30 +111,12 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DQuadratic::_valsResidual[] = {
-  8.41042438e+10,
- -9.31754244e+09,
- -7.48532639e+10,
+  9.37372879e+10,
+ -1.07826248e+10,
+ -8.30212256e+10,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DQuadratic::_valsJacobian[] = {
-  6.25000000e+06,
- -3.12500000e+06,
-  6.25000000e+06,
- -3.12500000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  2.50000000e+07,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DQuadratic::_valsResidualLumped[] = {
-  8.41101813e+10,
- -9.31160494e+09,
- -7.48651389e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData1DQuadratic::_valsJacobianLumped[] = {
   9.37500000e+06,
   9.37500000e+06,
   3.75000000e+07,
@@ -151,6 +135,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -164,8 +149,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformData1DQuadratic::~ElasticityExplicitLgDeformData1DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData1DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformdata1dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_dtStableExplicit =   1.50923086e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_gravityVec[] = {
   0.00000000e+00, -1.00000000e+08,
 };
@@ -100,39 +102,12 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_valsResidual[] = {
- -5.23632630e+11,  5.83305846e+11,
-  1.65372743e+11, -5.78685990e+11,
-  3.58250262e+11, -4.62306437e+09,
+ -5.97679777e+11,  7.28528497e+11,
+  1.92811652e+11, -7.21247691e+11,
+  4.04858499e+11, -7.28401430e+09,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_valsJacobian[] = {
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_valsResidualLumped[] = {
- -5.23631714e+11,  5.83306915e+11,
-  1.65371368e+11, -5.78689962e+11,
-  3.58250720e+11, -4.62016160e+09,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_valsJacobianLumped[] = {
   4.58333333e+06,  4.58333333e+06,
   4.58333333e+06,  4.58333333e+06,
   4.58333333e+06,  4.58333333e+06,
@@ -151,6 +126,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -164,8 +140,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::~ElasticityExplicitLgDeformData2DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformdata2dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DQuadratic::_dtStableExplicit =   2.63523138e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DQuadratic::_gravityVec[] = {
   0.00000000e+00, -1.00000000e+08,
 };
@@ -170,99 +172,15 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DQuadratic::_valsResidual[] = {
-  3.35186619e+10,  8.10189832e+10,
- -7.94930135e+10, -4.37826989e+10,
-  2.10035850e+10,  2.15156871e+10,
-  7.31131484e+10, -6.34970387e+09,
- -5.42588065e+10, -9.94923096e+10,
-  6.13022939e+09,  4.70980577e+10,
+  4.77322946e+10,  1.01422866e+11,
+ -9.41248506e+10, -5.49836535e+10,
+  3.11044500e+10,  2.81134599e+10,
+  9.39829742e+10, -2.53121260e+09,
+ -7.76902992e+10, -1.29514150e+11,
+ -9.90764312e+08,  5.75007062e+10,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DQuadratic::_valsJacobian[] = {
-  2.24121094e+06,  0.00000000e+00,
-  2.41699219e+05,  0.00000000e+00,
-  2.41699219e+05,  0.00000000e+00,
-  4.21875000e+06,  0.00000000e+00,
- -1.36230469e+06,  0.00000000e+00,
- -1.36230469e+06,  0.00000000e+00,
-  0.00000000e+00,  2.24121094e+06,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  4.21875000e+06,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.36230469e+06,
-  2.41699219e+05,  0.00000000e+00,
-  3.61083984e+06,  0.00000000e+00,
- -6.73828125e+05,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  3.61083984e+06,
-  0.00000000e+00, -6.73828125e+05,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -1.12792969e+06,
-  2.41699219e+05,  0.00000000e+00,
- -6.73828125e+05,  0.00000000e+00,
-  3.61083984e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00, -6.73828125e+05,
-  0.00000000e+00,  3.61083984e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -1.52343750e+06,
-  4.21875000e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
-  2.21484375e+07,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  0.00000000e+00,  4.21875000e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00,  2.21484375e+07,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00, -5.39062500e+06,
- -1.36230469e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  8.46679688e+06,  0.00000000e+00,
-  6.09375000e+06,  0.00000000e+00,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00,  8.46679688e+06,
-  0.00000000e+00,  6.09375000e+06,
- -1.36230469e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  6.09375000e+06,  0.00000000e+00,
-  8.46679688e+06,  0.00000000e+00,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00,  6.09375000e+06,
-  0.00000000e+00,  8.46679688e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DQuadratic::_valsResidualLumped[] = {
-  3.35171172e+10,  8.10192601e+10,
- -7.94952005e+10, -4.37841381e+10,
-  2.10014852e+10,  2.15149774e+10,
-  7.31149003e+10, -6.34801637e+09,
- -5.42577005e+10, -9.94955366e+10,
-  6.13320302e+09,  4.71014693e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData2DQuadratic::_valsJacobianLumped[] = {
   4.21875000e+06,  4.21875000e+06,
   3.98437500e+06,  3.98437500e+06,
   3.98437500e+06,  3.98437500e+06,
@@ -284,6 +202,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -297,8 +216,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformData2DQuadratic::~ElasticityExplicitLgDeformData2DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformdata2dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DLinear::_dtStableExplicit =   1.80277564e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DLinear::_gravityVec[] = {
   0.00000000e+00,  0.00000000e+00, -1.00000000e+08,
 };
@@ -106,71 +108,13 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DLinear::_valsResidual[] = {
- -1.33659352e+10,  3.00655421e+11,  1.48221233e+11,
- -5.48900483e+10,  6.55599721e+11,  3.04460965e+11,
-  6.45910023e+10, -1.06342951e+12, -4.86426871e+11,
-  3.66834369e+09,  1.07174373e+11,  3.37473630e+10,
+ -1.49483992e+10,  3.54043006e+11,  1.80457161e+11,
+ -6.03838259e+10,  7.78381411e+11,  3.73852176e+11,
+  7.04794221e+10, -1.26218270e+12, -5.98342244e+11,
+  4.85616550e+09,  1.29758280e+11,  4.40355970e+10,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DLinear::_valsJacobian[] = {
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DLinear::_valsResidualLumped[] = {
- -1.33654308e+10,  3.00654749e+11,  1.48221233e+11,
- -5.48895440e+10,  6.55600730e+11,  3.04462310e+11,
-  6.45891529e+10, -1.06343052e+12, -4.86428216e+11,
-  3.66918432e+09,  1.07175045e+11,  3.37473630e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DLinear::_valsJacobianLumped[] = {
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
@@ -190,6 +134,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -203,8 +148,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformData3DLinear::~ElasticityExplicitLgDeformData3DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformdata3dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DQuadratic::_dtStableExplicit =   3.68555740e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DQuadratic::_gravityVec[] = {
   0.00000000e+00,  0.00000000e+00, -1.00000000e+08,
 };
@@ -187,339 +189,23 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DQuadratic::_valsResidual[] = {
-  3.68904302e+10,  2.89154635e+10, -8.34303196e+08,
-  1.31658958e+11, -3.38188176e+10,  5.13285187e+10,
- -3.92909711e+11, -2.10630391e+11, -2.01774869e+11,
- -1.14269176e+11,  1.30717232e+11, -1.07973309e+11,
- -2.64258575e+11, -2.85535726e+10, -4.02072308e+10,
-  4.59398355e+11,  2.32376498e+11,  2.74963691e+11,
- -2.46994434e+11, -7.38524287e+10, -4.79760043e+10,
-  5.25219225e+10, -8.35281650e+10, -1.48179494e+10,
- -1.20392699e+11,  3.07708241e+11, -2.63722439e+11,
-  4.58368848e+11, -2.69312012e+11,  3.51028310e+11,
+  3.95805265e+10,  3.34218104e+10, -4.40632064e+09,
+  1.48404052e+11, -3.08342040e+10,  5.65005179e+10,
+ -4.69922140e+11, -2.52353689e+11, -2.43654236e+11,
+ -1.30435923e+11,  1.41675098e+11, -1.23744406e+11,
+ -2.99116147e+11, -4.58381676e+10, -5.20465691e+10,
+  5.37847554e+11,  2.84306681e+11,  3.20840077e+11,
+ -2.82088385e+11, -9.51260482e+10, -4.96412470e+10,
+  5.12934480e+10, -9.37893057e+10, -1.60049879e+10,
+ -1.29827755e+11,  3.44097403e+11, -3.00635452e+11,
+  5.34278688e+11, -2.85537532e+11,  4.12807039e+11,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DQuadratic::_valsJacobian[] = {
-  1.50251107e+06,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.50251107e+06,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.50251107e+06,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DQuadratic::_valsResidualLumped[] = {
-  3.68908573e+10,  2.89160572e+10, -8.38305638e+08,
-  1.31658131e+11, -3.38201739e+10,  5.13320041e+10,
- -3.92910621e+11, -2.10630330e+11, -2.01774882e+11,
- -1.14267995e+11,  1.30716630e+11, -1.07973250e+11,
- -2.64249877e+11, -2.85444292e+10, -4.02143984e+10,
-  4.59400261e+11,  2.32380003e+11,  2.74969025e+11,
- -2.47002605e+11, -7.38605515e+10, -4.79743995e+10,
-  5.25288799e+10, -8.35277685e+10, -1.48113346e+10,
- -1.20394352e+11,  3.07717391e+11, -2.63736436e+11,
-  4.58361238e+11, -2.69324783e+11,  3.51036392e+11,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformData3DQuadratic::_valsJacobianLumped[] = {
   2.57903646e+06,  2.57903646e+06,  2.57903646e+06,
-  2.40117188e+06,  2.40117188e+06,  2.40117188e+06,
-  2.40117188e+06,  2.40117188e+06,  2.40117188e+06,
-  2.40117188e+06,  2.40117188e+06,  2.40117188e+06,
+  2.40117187e+06,  2.40117187e+06,  2.40117187e+06,
+  2.40117187e+06,  2.40117187e+06,  2.40117187e+06,
+  2.40117187e+06,  2.40117187e+06,  2.40117187e+06,
   1.20947917e+07,  1.20947917e+07,  1.20947917e+07,
   8.35963542e+06,  8.35963542e+06,  8.35963542e+06,
   8.35963542e+06,  8.35963542e+06,  8.35963542e+06,
@@ -541,6 +227,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -554,8 +241,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformData3DQuadratic::~ElasticityExplicitLgDeformData3DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformdata3dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DLinear::_dtStableExplicit =   3.75000000e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DLinear::_gravityVec[] = {
  -1.00000000e+08,
 };
@@ -80,8 +82,8 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DLinear::_fieldTIncr[] = {
-  1.20000000e+00,
-  1.70000000e+00,
+  1.00000000e-01,
+  2.00000000e-01,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DLinear::_fieldT[] = {
@@ -95,23 +97,11 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DLinear::_valsResidual[] = {
- -2.60767056e+11,
- -3.01806069e+11,
+ -2.60095053e+11,
+ -3.02404947e+11,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DLinear::_valsJacobian[] = {
-  1.40625000e+07,
-  1.40625000e+07,
-  1.40625000e+07,
-  1.40625000e+07,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DLinear::_valsResidualLumped[] = {
- -2.60761431e+11,
- -3.01811694e+11,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DLinear::_valsJacobianLumped[] = {
   2.81250000e+07,
   2.81250000e+07,
 };
@@ -129,6 +119,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -142,8 +133,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformGravData1DLinear::~ElasticityExplicitLgDeformGravData1DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformgravdata1dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DQuadratic::_dtStableExplicit =   3.75000000e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DQuadratic::_gravityVec[] = {
  -1.00000000e+08,
 };
@@ -91,9 +93,9 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DQuadratic::_fieldTIncr[] = {
-  1.20000000e+00,
-  0.00000000e+00,
-  1.70000000e+00,
+  2.00000000e-01,
+  1.00000000e-01,
+  7.00000000e-01,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DQuadratic::_fieldT[] = {
@@ -109,30 +111,12 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DQuadratic::_valsResidual[] = {
- -9.64575617e+09,
- -1.03067542e+11,
- -4.49853264e+11,
+ -9.99349242e+08,
+ -1.03507975e+11,
+ -4.58013300e+11,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DQuadratic::_valsJacobian[] = {
-  6.25000000e+06,
- -3.12500000e+06,
-  6.25000000e+06,
- -3.12500000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  6.25000000e+06,
-  2.50000000e+07,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DQuadratic::_valsResidualLumped[] = {
- -9.63981867e+09,
- -1.03061605e+11,
- -4.49865139e+11,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData1DQuadratic::_valsJacobianLumped[] = {
   9.37500000e+06,
   9.37500000e+06,
   3.75000000e+07,
@@ -151,6 +135,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -164,8 +149,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformGravData1DQuadratic::~ElasticityExplicitLgDeformGravData1DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData1DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformgravdata1dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_dtStableExplicit =   1.50923086e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_gravityVec[] = {
   0.00000000e+00, -1.00000000e+08,
 };
@@ -100,39 +102,12 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_valsResidual[] = {
- -5.23632630e+11,  5.37472513e+11,
-  1.65372743e+11, -6.24519323e+11,
-  3.58250262e+11, -5.04563977e+10,
+ -5.97679777e+11,  6.82695164e+11,
+  1.92811652e+11, -7.67081025e+11,
+  4.04858499e+11, -5.31173476e+10,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_valsJacobian[] = {
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  1.52777778e+06,  0.00000000e+00,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-  0.00000000e+00,  1.52777778e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_valsResidualLumped[] = {
- -5.23631714e+11,  5.37473582e+11,
-  1.65371368e+11, -6.24523296e+11,
-  3.58250720e+11, -5.04534949e+10,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_valsJacobianLumped[] = {
   4.58333333e+06,  4.58333333e+06,
   4.58333333e+06,  4.58333333e+06,
   4.58333333e+06,  4.58333333e+06,
@@ -151,6 +126,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -164,8 +140,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::~ElasticityExplicitLgDeformGravData2DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformgravdata2dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DQuadratic::_dtStableExplicit =   2.63523138e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DQuadratic::_gravityVec[] = {
   0.00000000e+00, -1.00000000e+08,
 };
@@ -170,99 +172,15 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DQuadratic::_valsResidual[] = {
-  3.35186619e+10,  3.88314832e+10,
- -7.94930135e+10, -8.36264489e+10,
-  2.10035850e+10, -1.83280629e+10,
-  7.31131484e+10, -2.31349704e+11,
- -5.42588065e+10, -1.51054810e+11,
-  6.13022939e+09, -4.46444228e+09,
+  4.77322946e+10,  5.92353661e+10,
+ -9.41248506e+10, -9.48274035e+10,
+  3.11044500e+10, -1.17302901e+10,
+  9.39829742e+10, -2.27531213e+11,
+ -7.76902992e+10, -1.81076650e+11,
+ -9.90764312e+08,  5.93820621e+09,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DQuadratic::_valsJacobian[] = {
-  2.24121094e+06,  0.00000000e+00,
-  2.41699219e+05,  0.00000000e+00,
-  2.41699219e+05,  0.00000000e+00,
-  4.21875000e+06,  0.00000000e+00,
- -1.36230469e+06,  0.00000000e+00,
- -1.36230469e+06,  0.00000000e+00,
-  0.00000000e+00,  2.24121094e+06,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  4.21875000e+06,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.36230469e+06,
-  2.41699219e+05,  0.00000000e+00,
-  3.61083984e+06,  0.00000000e+00,
- -6.73828125e+05,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00,  3.61083984e+06,
-  0.00000000e+00, -6.73828125e+05,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -1.12792969e+06,
-  2.41699219e+05,  0.00000000e+00,
- -6.73828125e+05,  0.00000000e+00,
-  3.61083984e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
-  0.00000000e+00,  2.41699219e+05,
-  0.00000000e+00, -6.73828125e+05,
-  0.00000000e+00,  3.61083984e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -1.52343750e+06,
-  4.21875000e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
-  3.45703125e+06,  0.00000000e+00,
-  2.21484375e+07,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  0.00000000e+00,  4.21875000e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00,  3.45703125e+06,
-  0.00000000e+00,  2.21484375e+07,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00, -5.39062500e+06,
- -1.36230469e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  8.46679688e+06,  0.00000000e+00,
-  6.09375000e+06,  0.00000000e+00,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00,  8.46679688e+06,
-  0.00000000e+00,  6.09375000e+06,
- -1.36230469e+06,  0.00000000e+00,
- -1.12792969e+06,  0.00000000e+00,
- -1.52343750e+06,  0.00000000e+00,
- -5.39062500e+06,  0.00000000e+00,
-  6.09375000e+06,  0.00000000e+00,
-  8.46679688e+06,  0.00000000e+00,
-  0.00000000e+00, -1.36230469e+06,
-  0.00000000e+00, -1.12792969e+06,
-  0.00000000e+00, -1.52343750e+06,
-  0.00000000e+00, -5.39062500e+06,
-  0.00000000e+00,  6.09375000e+06,
-  0.00000000e+00,  8.46679688e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DQuadratic::_valsResidualLumped[] = {
-  3.35171172e+10,  3.88317601e+10,
- -7.94952005e+10, -8.36278881e+10,
-  2.10014852e+10, -1.83287726e+10,
-  7.31149003e+10, -2.31348016e+11,
- -5.42577005e+10, -1.51058037e+11,
-  6.13320302e+09, -4.46103066e+09,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData2DQuadratic::_valsJacobianLumped[] = {
   4.21875000e+06,  4.21875000e+06,
   3.98437500e+06,  3.98437500e+06,
   3.98437500e+06,  3.98437500e+06,
@@ -284,6 +202,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -297,8 +216,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformGravData2DQuadratic::~ElasticityExplicitLgDeformGravData2DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformgravdata2dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DLinear.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DLinear.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DLinear.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DLinear::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DLinear::_dtStableExplicit =   1.80277564e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DLinear::_gravityVec[] = {
   0.00000000e+00,  0.00000000e+00, -1.00000000e+08,
 };
@@ -106,71 +108,13 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DLinear::_valsResidual[] = {
- -1.33659352e+10,  3.00655421e+11,  1.14596233e+11,
- -5.48900483e+10,  6.55599721e+11,  2.70835965e+11,
-  6.45910023e+10, -1.06342951e+12, -5.20051871e+11,
-  3.66834369e+09,  1.07174373e+11,  1.22363040e+08,
+ -1.49483992e+10,  3.54043006e+11,  1.46832161e+11,
+ -6.03838259e+10,  7.78381411e+11,  3.40227176e+11,
+  7.04794221e+10, -1.26218270e+12, -6.31967244e+11,
+  4.85616550e+09,  1.29758280e+11,  1.04105970e+10,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DLinear::_valsJacobian[] = {
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  8.40625000e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  8.40625000e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-  0.00000000e+00,  0.00000000e+00,  8.40625000e+05,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DLinear::_valsResidualLumped[] = {
- -1.33654308e+10,  3.00654749e+11,  1.14596233e+11,
- -5.48895440e+10,  6.55600730e+11,  2.70837310e+11,
-  6.45891529e+10, -1.06343052e+12, -5.20053216e+11,
-  3.66918432e+09,  1.07175045e+11,  1.22363040e+08,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DLinear::_valsJacobianLumped[] = {
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
   3.36250000e+06,  3.36250000e+06,  3.36250000e+06,
@@ -190,6 +134,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -203,8 +148,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformGravData3DLinear::~ElasticityExplicitLgDeformGravData3DLinear(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DLinear.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DLinear.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DLinear.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformgravdata3dlinear_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,8 @@
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DQuadratic::_dt =   1.00000000e-02;
 
+const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DQuadratic::_dtStableExplicit =   3.68555740e-04;
+
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DQuadratic::_gravityVec[] = {
   0.00000000e+00,  0.00000000e+00, -1.00000000e+08,
 };
@@ -187,339 +189,23 @@
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DQuadratic::_valsResidual[] = {
-  3.68904302e+10,  2.89154635e+10, -2.66246678e+10,
-  1.31658958e+11, -3.38188176e+10,  2.73167999e+10,
- -3.92909711e+11, -2.10630391e+11, -2.25786587e+11,
- -1.14269176e+11,  1.30717232e+11, -1.31985028e+11,
- -2.64258575e+11, -2.85535726e+10, -1.61155147e+11,
-  4.59398355e+11,  2.32376498e+11,  1.91367337e+11,
- -2.46994434e+11, -7.38524287e+10, -1.31572358e+11,
-  5.25219225e+10, -8.35281650e+10, -9.84143036e+10,
- -1.20392699e+11,  3.07708241e+11, -3.84670356e+11,
-  4.58368848e+11, -2.69312012e+11,  2.30080394e+11,
+  3.95805265e+10,  3.34218104e+10, -3.01966852e+10,
+  1.48404052e+11, -3.08342040e+10,  3.24887992e+10,
+ -4.69922140e+11, -2.52353689e+11, -2.67665955e+11,
+ -1.30435923e+11,  1.41675098e+11, -1.47756125e+11,
+ -2.99116147e+11, -4.58381676e+10, -1.72994486e+11,
+  5.37847554e+11,  2.84306681e+11,  2.37243723e+11,
+ -2.82088385e+11, -9.51260482e+10, -1.33237601e+11,
+  5.12934480e+10, -9.37893057e+10, -9.96013421e+10,
+ -1.29827755e+11,  3.44097403e+11, -4.21583368e+11,
+  5.34278688e+11, -2.85537532e+11,  2.91859123e+11,
 };
 
 const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DQuadratic::_valsJacobian[] = {
-  1.50251107e+06,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.50251107e+06,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.50251107e+06,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
- -5.70500651e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
- -8.39520833e+05,  0.00000000e+00,  0.00000000e+00,
-  2.84272070e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -5.70500651e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00, -8.39520833e+05,  0.00000000e+00,
-  0.00000000e+00,  2.84272070e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -5.70500651e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00, -8.39520833e+05,
-  0.00000000e+00,  0.00000000e+00,  2.84272070e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  1.24238411e+06,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
- -5.06914062e+05,  0.00000000e+00,  0.00000000e+00,
-  5.45154948e+05,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.50829167e+06,  0.00000000e+00,  0.00000000e+00,
-  1.80888281e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00,  1.24238411e+06,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00, -5.06914062e+05,  0.00000000e+00,
-  0.00000000e+00,  5.45154948e+05,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.50829167e+06,  0.00000000e+00,
-  0.00000000e+00,  1.80888281e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00,  1.24238411e+06,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00, -5.06914062e+05,
-  0.00000000e+00,  0.00000000e+00,  5.45154948e+05,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.50829167e+06,
-  0.00000000e+00,  0.00000000e+00,  1.80888281e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
- -3.13041667e+05,  0.00000000e+00,  0.00000000e+00,
- -6.43869792e+05,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  1.46026823e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  5.19364583e+05,  0.00000000e+00,  0.00000000e+00,
-  1.12054688e+06,  0.00000000e+00,  0.00000000e+00,
-  2.05611458e+06,  0.00000000e+00,  0.00000000e+00,
-  3.25847917e+06,  0.00000000e+00,  0.00000000e+00,
-  0.00000000e+00, -3.13041667e+05,  0.00000000e+00,
-  0.00000000e+00, -6.43869792e+05,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  1.46026823e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  5.19364583e+05,  0.00000000e+00,
-  0.00000000e+00,  1.12054688e+06,  0.00000000e+00,
-  0.00000000e+00,  2.05611458e+06,  0.00000000e+00,
-  0.00000000e+00,  3.25847917e+06,  0.00000000e+00,
-  0.00000000e+00,  0.00000000e+00, -3.13041667e+05,
-  0.00000000e+00,  0.00000000e+00, -6.43869792e+05,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  1.46026823e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  5.19364583e+05,
-  0.00000000e+00,  0.00000000e+00,  1.12054688e+06,
-  0.00000000e+00,  0.00000000e+00,  2.05611458e+06,
-  0.00000000e+00,  0.00000000e+00,  3.25847917e+06,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DQuadratic::_valsResidualLumped[] = {
-  3.68908573e+10,  2.89160572e+10, -2.66286702e+10,
-  1.31658131e+11, -3.38201739e+10,  2.73202854e+10,
- -3.92910621e+11, -2.10630330e+11, -2.25786601e+11,
- -1.14267995e+11,  1.30716630e+11, -1.31984968e+11,
- -2.64249877e+11, -2.85444292e+10, -1.61162315e+11,
-  4.59400261e+11,  2.32380003e+11,  1.91372671e+11,
- -2.47002605e+11, -7.38605515e+10, -1.31570754e+11,
-  5.25288799e+10, -8.35277685e+10, -9.84076887e+10,
- -1.20394352e+11,  3.07717391e+11, -3.84684352e+11,
-  4.58361238e+11, -2.69324783e+11,  2.30088475e+11,
-};
-
-const PylithScalar pylith::feassemble::ElasticityExplicitLgDeformGravData3DQuadratic::_valsJacobianLumped[] = {
   2.57903646e+06,  2.57903646e+06,  2.57903646e+06,
-  2.40117188e+06,  2.40117188e+06,  2.40117188e+06,
-  2.40117188e+06,  2.40117188e+06,  2.40117188e+06,
-  2.40117188e+06,  2.40117188e+06,  2.40117188e+06,
+  2.40117187e+06,  2.40117187e+06,  2.40117187e+06,
+  2.40117187e+06,  2.40117187e+06,  2.40117187e+06,
+  2.40117187e+06,  2.40117187e+06,  2.40117187e+06,
   1.20947917e+07,  1.20947917e+07,  1.20947917e+07,
   8.35963542e+06,  8.35963542e+06,  8.35963542e+06,
   8.35963542e+06,  8.35963542e+06,  8.35963542e+06,
@@ -541,6 +227,7 @@
   matId = _matId;
   matLabel = const_cast<char*>(_matLabel);
   dt = _dt;
+  dtStableExplicit = _dtStableExplicit;
   gravityVec = const_cast<PylithScalar*>(_gravityVec);
   vertices = const_cast<PylithScalar*>(_vertices);
   cells = const_cast<int*>(_cells);
@@ -554,8 +241,6 @@
   fieldTmdt = const_cast<PylithScalar*>(_fieldTmdt);
   valsResidual = const_cast<PylithScalar*>(_valsResidual);
   valsJacobian = const_cast<PylithScalar*>(_valsJacobian);
-  valsResidualLumped = const_cast<PylithScalar*>(_valsResidualLumped);
-  valsJacobianLumped = const_cast<PylithScalar*>(_valsJacobianLumped);
 } // constructor
 
 pylith::feassemble::ElasticityExplicitLgDeformGravData3DQuadratic::~ElasticityExplicitLgDeformGravData3DQuadratic(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,8 @@
 
   static const PylithScalar _dt;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const PylithScalar _gravityVec[];
 
   static const PylithScalar _vertices[];
@@ -91,10 +93,6 @@
 
   static const PylithScalar _valsJacobian[];
 
-  static const PylithScalar _valsResidualLumped[];
-
-  static const PylithScalar _valsJacobianLumped[];
-
 };
 
 #endif // pylith_feassemble_elasticityexplicitlgdeformgravdata3dquadratic_hh

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityLgDeformExplicitApp.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityLgDeformExplicitApp.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/ElasticityLgDeformExplicitApp.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -54,8 +54,7 @@
     self._collectData()
     self._calculateResidual()
     self._calculateJacobian()
-    self._calculateResidualLumped()
-    self._calculateJacobianLumped()
+    self._calcDtStable()
     self._initData()
     self.data.write(self.name)
     return

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1DLinear.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1DLinear.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1DLinear.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,10 +47,12 @@
     self.cellDim = 1
     self.numVertices = 2
     self.numCells = 1    
-    self.gravityVec = numpy.array( [-1.0e8], dtype=numpy.float64)
+    self.gravityVec = numpy.array( [-1.0e+8], dtype=numpy.float64)
     self.vertices = numpy.array( [[-0.25], [2.0]], dtype=numpy.float64)
     self.cells = numpy.array( [[0, 1]], dtype=numpy.int32)
     self.verticesRef = numpy.array( [[-1.0], [+1.0]], dtype=numpy.float64)
+
+    self.minCellWidth = 2.25
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1DQuadratic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1DQuadratic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1DQuadratic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -53,6 +53,8 @@
     self.cells = numpy.array( [[0, 1, 2]], dtype=numpy.int32)
     self.verticesRef = numpy.array([[-1.0], [1.0], [0.0]],
                                    dtype=numpy.float64)
+
+    self.minCellWidth = 2.25
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din2DLinear.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din2DLinear.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din2DLinear.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -52,6 +52,9 @@
                                  dtype=numpy.float64)
     self.cells = numpy.array( [[0, 1]], dtype=numpy.int32)
     self.verticesRef = numpy.array([ [-1.0], [1.0] ], dtype=numpy.float64)
+
+    self.minCellWidth = ((self.vertices[1][0]-self.vertices[0][0])**2 + \
+                          (self.vertices[1][1]-self.vertices[0][1])**2)**0.5
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din2DQuadratic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din2DQuadratic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din2DQuadratic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -52,6 +52,9 @@
                                  dtype=numpy.float64)
     self.cells = numpy.array( [[0, 1, 2]], dtype=numpy.int32)
     self.verticesRef = numpy.array([[-1.0], [1.0], [0.0]], dtype=numpy.float64)
+
+    self.minCellWidth = ((self.vertices[1][0]-self.vertices[0][0])**2 + \
+                          (self.vertices[1][1]-self.vertices[0][1])**2)**0.5
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din3DLinear.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din3DLinear.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din3DLinear.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -54,6 +54,9 @@
                                  dtype=numpy.float64)
     self.cells = numpy.array( [[0, 1]], dtype=numpy.int32)
     self.verticesRef = numpy.array( [[-1.0], [1.0]], dtype=numpy.float64)
+
+    self.minCellWidth = ((self.vertices[1][0]-self.vertices[0][0])**2 + \
+                          (self.vertices[1][1]-self.vertices[0][1])**2)**0.5
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din3DQuadratic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din3DQuadratic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh1Din3DQuadratic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,6 +55,9 @@
                                  dtype=numpy.float64)
     self.cells = numpy.array( [[0, 1, 2]], dtype=numpy.int32)
     self.verticesRef = numpy.array([[-1.0], [1.0], [0.0]], dtype=numpy.float64)
+
+    self.minCellWidth = ((self.vertices[1][0]-self.vertices[0][0])**2 + \
+                          (self.vertices[1][1]-self.vertices[0][1])**2)**0.5
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2DLinear.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2DLinear.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2DLinear.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,6 +57,13 @@
                                      [+1.0, -1.0],
                                      [-1.0, +1.0]],
                                     dtype=numpy.float64)
+
+    a = (0.1**2 + 0.9**2)**0.5
+    b = (1.3**2 + 0.7**2)**0.5
+    c = (1.2**2 + 0.2**2)**0.5
+    k = 0.5 * (a + b + c)
+    r = (k*(k-a)*(k-b)*(k-c))**0.5 / k
+    self.minCellWidth = min(a, b, c, 3.0*r)
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2DQuadratic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2DQuadratic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2DQuadratic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -64,6 +64,13 @@
                                      [-1.0,  0.0],
                                      [ 0.0, -1.0]],
                                     dtype=numpy.float64)
+
+    a = (2.0**2 + 1.2**2)**0.5
+    b = (2.5**2 + 0.3**2)**0.5
+    c = (0.5**2 + 1.5**2)**0.5
+    k = 0.5 * (a + b + c)
+    r = (k*(k-a)*(k-b)*(k-c))**0.5 / k
+    self.minCellWidth = min(a, b, c, 3.0*r)
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearXY.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearXY.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearXY.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -51,13 +51,20 @@
                                    dtype=numpy.float64)
     self.vertices = numpy.array( [[ 0.0,  0.0,  0.0],
                                   [-1.0,  0.0,  0.0],
-                                  [ 0.0,  0.0,  1.0]],
+                                  [ 0.0,  1.0,  0.0]],
                                  dtype=numpy.float64)
     self.cells = numpy.array( [[0, 1, 2]], dtype=numpy.int32)
     self.verticesRef = numpy.array( [[-1.0, -1.0],
                                      [+1.0, -1.0],
                                      [-1.0, +1.0]],
                                     dtype=numpy.float64)
+
+    a = (1.0**2 + 0.0**2 + 0.0**2)**0.5
+    b = (1.0**2 + 0.0**2 + 1.0**2)**0.5
+    c = (0.0**2 + 0.0**2 + 1.0**2)**0.5
+    k = 0.5 * (a + b + c)
+    r = (k*(k-a)*(k-b)*(k-c))**0.5 / k
+    self.minCellWidth = r
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearXYZ.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearXYZ.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearXYZ.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,6 +58,13 @@
                                      [+1.0, -1.0],
                                      [-1.0, +1.0]],
                                     dtype=numpy.float64)
+
+    a = (1.0**2 + 0.0**2 + 0.0**2)**0.5
+    b = (1.0**2 + 0.0**2 + 1.0**2)**0.5
+    c = (0.0**2 + 0.0**2 + 1.0**2)**0.5
+    k = 0.5 * (a + b + c)
+    r = (k*(k-a)*(k-b)*(k-c))**0.5 / k
+    self.minCellWidth = r
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearYZ.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearYZ.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh2Din3DLinearYZ.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,6 +58,13 @@
                                      [+1.0, -1.0],
                                      [-1.0, +1.0]],
                                     dtype=numpy.float64)
+
+    a = (0.0**2 + 1.0**2 + 0.0**2)**0.5
+    b = (0.0**2 + 1.0**2 + 0.0**2)**0.5
+    c = (0.0**2 + 0.0**2 + 1.0**2)**0.5
+    k = 0.5 * (a + b + c)
+    r = (k*(k-a)*(k-b)*(k-c))**0.5 / k
+    self.minCellWidth = r
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh3DLinear.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh3DLinear.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh3DLinear.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,6 +59,39 @@
                                      [-1.0, +1.0, -1.0],
                                      [-1.0, -1.0, +1.0]],
                                     dtype=numpy.float64)
+
+    v0 = self.vertices[0,:]
+    v1 = self.vertices[1,:]
+    v2 = self.vertices[2,:]
+    v3 = self.vertices[3,:]
+
+    e01 = ((v0[0]-v1[0])**2 + (v0[1]-v1[1])**2 + (v0[2]-v1[2])**2)**0.5
+    e12 = ((v1[0]-v2[0])**2 + (v1[1]-v2[1])**2 + (v1[2]-v2[2])**2)**0.5
+    e20 = ((v2[0]-v0[0])**2 + (v2[1]-v0[1])**2 + (v2[2]-v0[2])**2)**0.5
+    e03 = ((v0[0]-v3[0])**2 + (v0[1]-v3[1])**2 + (v0[2]-v3[2])**2)**0.5
+    e13 = ((v1[0]-v3[0])**2 + (v1[1]-v3[1])**2 + (v1[2]-v3[2])**2)**0.5
+    e23 = ((v2[0]-v3[0])**2 + (v2[1]-v3[1])**2 + (v2[2]-v3[2])**2)**0.5
+
+    vol = 1.0/6.0*numpy.linalg.det(numpy.array([[1.0, v0[0], v0[1], v0[2]],
+                                                [1.0, v1[0], v1[1], v1[2]],
+                                                [1.0, v2[0], v2[1], v2[2]],
+                                                [1.0, v3[0], v3[1], v3[2]]],
+                                               dtype=numpy.float64))
+    cross012 = numpy.cross(v1-v0, v2-v0)
+    area012 = 0.5*(numpy.dot(cross012, cross012))**0.5
+
+    cross013 = numpy.cross(v1-v0, v3-v0)
+    area013 = 0.5*(numpy.dot(cross013, cross013))**0.5
+
+    cross123 = numpy.cross(v2-v1, v3-v1)
+    area123 = 0.5*(numpy.dot(cross123, cross123))**0.5
+
+    cross203 = numpy.cross(v0-v2, v3-v2)
+    area203 = 0.5*(numpy.dot(cross203, cross203))**0.5
+
+    area = area012 + area013 + area123 + area203;
+    r = 3.0 * vol / area
+    self.minCellWidth = min(e01, e12, e20, e03, e13, e23, 6.38*r)
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh3DQuadratic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh3DQuadratic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Mesh3DQuadratic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -73,6 +73,39 @@
                                      [ 0.0, -1.0,  0.0],
                                      [-1.0,  0.0,  0.0]],
                                     dtype=numpy.float64)
+
+    v0 = self.vertices[0,:]
+    v1 = self.vertices[1,:]
+    v2 = self.vertices[2,:]
+    v3 = self.vertices[3,:]
+
+    e01 = ((v0[0]-v1[0])**2 + (v0[1]-v1[1])**2 + (v0[2]-v1[2])**2)**0.5
+    e12 = ((v1[0]-v2[0])**2 + (v1[1]-v2[1])**2 + (v1[2]-v2[2])**2)**0.5
+    e20 = ((v2[0]-v0[0])**2 + (v2[1]-v0[1])**2 + (v2[2]-v0[2])**2)**0.5
+    e03 = ((v0[0]-v3[0])**2 + (v0[1]-v3[1])**2 + (v0[2]-v3[2])**2)**0.5
+    e13 = ((v1[0]-v3[0])**2 + (v1[1]-v3[1])**2 + (v1[2]-v3[2])**2)**0.5
+    e23 = ((v2[0]-v3[0])**2 + (v2[1]-v3[1])**2 + (v2[2]-v3[2])**2)**0.5
+
+    vol = 1.0/6.0*numpy.linalg.det(numpy.array([[1.0, v0[0], v0[1], v0[2]],
+                                                [1.0, v1[0], v1[1], v1[2]],
+                                                [1.0, v2[0], v2[1], v2[2]],
+                                                [1.0, v3[0], v3[1], v3[2]]],
+                                               dtype=numpy.float64))
+    cross012 = numpy.cross(v1-v0, v2-v0)
+    area012 = 0.5*(numpy.dot(cross012, cross012))**0.5
+
+    cross013 = numpy.cross(v1-v0, v3-v0)
+    area013 = 0.5*(numpy.dot(cross013, cross013))**0.5
+
+    cross123 = numpy.cross(v2-v1, v3-v1)
+    area123 = 0.5*(numpy.dot(cross123, cross123))**0.5
+
+    cross203 = numpy.cross(v0-v2, v3-v2)
+    area203 = 0.5*(numpy.dot(cross203, cross203))**0.5
+
+    area = area012 + area013 + area123 + area203;
+    r = 3.0 * vol / area
+    self.minCellWidth = min(e01, e12, e20, e03, e13, e23, 6.38*r)
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Quadrature2DLinear.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Quadrature2DLinear.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Quadrature2DLinear.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -72,7 +72,6 @@
     Component.__init__(self, name, facility="quadrature")
     
     self.quadPtsRef = numpy.array( [[-1.0/3.0, -1.0/3.0]], dtype=numpy.float64)
-    #self.quadPtsRef = numpy.array( [[1.0/3.0, 1.0/3.0]], dtype=numpy.float64)
     self.quadWts = numpy.array([2.0], dtype=numpy.float64)
     self.numBasis = 3
     self.numQuadPts = 1

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Solution1DLinear.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Solution1DLinear.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Solution1DLinear.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,9 +44,9 @@
     
     # Input fields
     self.dt = 0.01
-    self.fieldTIncr = numpy.array( [[1.2], [1.7]], dtype=numpy.float64)
-    self.fieldT = numpy.array( [[1.1], [1.5]], dtype=numpy.float64)
-    self.fieldTmdt = numpy.array( [[1.0], [1.3]], dtype=numpy.float64)
+    self.fieldTIncr = numpy.array( [0.1, 0.2], dtype=numpy.float64)
+    self.fieldT = numpy.array( [1.1, 1.5], dtype=numpy.float64)
+    self.fieldTmdt = numpy.array( [1.0, 1.3], dtype=numpy.float64)
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Solution1DQuadratic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Solution1DQuadratic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/feassemble/data/Solution1DQuadratic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,9 +44,9 @@
     
     # Input fields
     self.dt = 0.01
-    self.fieldTIncr = numpy.array([ [1.2], [0.0], [1.7] ], dtype=numpy.float64)
-    self.fieldT = numpy.array([ [1.1], [0.1], [1.5] ], dtype=numpy.float64)
-    self.fieldTmdt = numpy.array([ [1.0], [0.1], [1.3] ], dtype=numpy.float64)
+    self.fieldTIncr = numpy.array([ 0.2, 0.1, 0.7 ], dtype=numpy.float64)
+    self.fieldT = numpy.array([ 1.1, 0.1, 1.5 ], dtype=numpy.float64)
+    self.fieldTmdt = numpy.array([ 1.0, 0.1, 1.3 ], dtype=numpy.float64)
     return
   
 

Modified: short/3D/PyLith/trunk/unittests/libtests/friction/TestRateStateAgeing.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestRateStateAgeing.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestRateStateAgeing.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -38,18 +38,18 @@
 } // setUp
 
 // ----------------------------------------------------------------------
-// Test floor for minimum slip rate.
+// Test cutoff for linear slip rate.
 void
-pylith::friction::TestRateStateAgeing::testMinSlipRate(void)
-{ // testMinSlipRate
+pylith::friction::TestRateStateAgeing::testLinearSlipRate(void)
+{ // testLinearSlipRate
   RateStateAgeing model;
 
-  CPPUNIT_ASSERT_EQUAL(PylithScalar(1.0e-12), model._minSlipRate); // default
+  CPPUNIT_ASSERT_EQUAL(PylithScalar(1.0e-12), model._linearSlipRate); // default
 
   const PylithScalar value = 1.0e-20;
-  model.minSlipRate(value);
-  CPPUNIT_ASSERT_EQUAL(value, model._minSlipRate);
-} // testMinSlipRate
+  model.linearSlipRate(value);
+  CPPUNIT_ASSERT_EQUAL(value, model._linearSlipRate);
+} // testLinearSlipRate
   
 // ----------------------------------------------------------------------
 // Test properties metadata.

Modified: short/3D/PyLith/trunk/unittests/libtests/friction/TestRateStateAgeing.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/friction/TestRateStateAgeing.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/friction/TestRateStateAgeing.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,7 +43,7 @@
   // CPPUNIT TEST SUITE /////////////////////////////////////////////////
   CPPUNIT_TEST_SUITE( TestRateStateAgeing );
 
-  CPPUNIT_TEST( testMinSlipRate );
+  CPPUNIT_TEST( testLinearSlipRate );
   CPPUNIT_TEST( testPropertiesMetadata );
   CPPUNIT_TEST( testStateVarsMetadata );
   CPPUNIT_TEST( testDBToProperties );
@@ -64,8 +64,8 @@
   /// Setup testing data.
   void setUp(void);
 
-  /// Test floor for minimum slip rate.
-  void testMinSlipRate(void);
+  /// Test cutoff for linear slip rate.
+  void testLinearSlipRate(void);
   
   /// Test properties metadata.
   void testPropertiesMetadata(void);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestDruckerPrager3D.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestDruckerPrager3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestDruckerPrager3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,6 +55,7 @@
   CPPUNIT_TEST( testDimStateVars );
   CPPUNIT_TEST( test_calcDensity );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   // Need to test Drucker-Prager elastoplastic specific behavior.
   CPPUNIT_TEST( testTimeStep );

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestDruckerPragerPlaneStrain.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestDruckerPragerPlaneStrain.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestDruckerPragerPlaneStrain.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,6 +55,7 @@
   CPPUNIT_TEST( testDimStateVars );
   CPPUNIT_TEST( test_calcDensity );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   // Need to test Drucker-Prager elastoplastic specific behavior.
   CPPUNIT_TEST( testTimeStep );

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticIsotropic3D.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticIsotropic3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticIsotropic3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,6 +57,7 @@
   CPPUNIT_TEST( test_calcElasticConsts );
   CPPUNIT_TEST( test_updateStateVars );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   CPPUNIT_TEST( testHasProperty );
   CPPUNIT_TEST( testHasStateVar );

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticMaterial.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticMaterial.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticMaterial.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -446,6 +446,57 @@
 } // testStableTimeStepImplicit
 
 // ----------------------------------------------------------------------
+// Test calcStableTimeStepExplicit()
+void
+pylith::materials::TestElasticMaterial::testStableTimeStepExplicit(void)
+{ // testStableTimeStepExplicit
+  topology::Mesh mesh;
+  ElasticStrain1D material;
+  ElasticStrain1DData data;
+  _initialize(&mesh, &material, &data);
+
+  // Get cells associated with material
+  const int materialId = 24;
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+  SieveMesh::point_type cell = *cells->begin();
+
+  // Setup quadrature
+  feassemble::Quadrature<topology::Mesh> quadrature;
+  feassemble::GeometryLine1D geometry;
+  quadrature.refGeometry(&geometry);
+  const int cellDim = 1;
+  const int numCorners = 3;
+  const int numQuadPts = 2;
+  const int spaceDim = 1;
+  const PylithScalar basis[] = { 0.455, -0.122, 0.667, -0.122, 0.455, 0.667 };
+  const PylithScalar basisDeriv[] = { 
+    -1.07735027e+00,
+    -7.73502692e-02,
+    1.15470054e+00,
+    7.73502692e-02,
+    1.07735027e+00,
+    -1.15470054e+00,
+  };
+  const PylithScalar quadPtsRef[] = { -0.577350269, 0.577350269 };
+  const PylithScalar quadWts[] = { 1.0, 1.0  };
+  quadrature.initialize(basis, numQuadPts, numCorners,
+			basisDeriv, numQuadPts, numCorners, cellDim,
+			quadPtsRef, numQuadPts, cellDim,
+			quadWts, numQuadPts,
+			spaceDim);
+
+  material.retrievePropsAndVars(cell);
+  const PylithScalar dt = material.stableTimeStepExplicit(mesh, &quadrature);
+
+  const PylithScalar tolerance = 1.0e-06;
+  const PylithScalar dtE = data.dtStableExplicit / 1000.0 * 2.0;
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, dt/dtE, tolerance);
+} // testStableTimeStepExplicit
+
+// ----------------------------------------------------------------------
 // Setup testing data.
 void
 pylith::materials::TestElasticMaterial::setUp(void)
@@ -688,7 +739,7 @@
 // Test _stableTimeStepImplicit()
 void
 pylith::materials::TestElasticMaterial::test_stableTimeStepImplicit(void)
-{ // _testCalcDensity
+{ // test_stableTimeStepImplicit
   CPPUNIT_ASSERT(0 != _matElastic);
   CPPUNIT_ASSERT(0 != _dataElastic);
   const ElasticMaterialData* data = _dataElastic;
@@ -701,9 +752,32 @@
 
   const PylithScalar tolerance = 1.0e-06;
   CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, dt/dtE, tolerance);
-} // _testStableTimeStepImplicit
+} // test_stableTimeStepImplicit
 
 // ----------------------------------------------------------------------
+// Test _stableTimeStepExplicit()
+void
+pylith::materials::TestElasticMaterial::test_stableTimeStepExplicit(void)
+{ // test_stableTimeStepExplicit
+  CPPUNIT_ASSERT(0 != _matElastic);
+  CPPUNIT_ASSERT(0 != _dataElastic);
+  const ElasticMaterialData* data = _dataElastic;
+
+  const PylithScalar minCellWidth = 1000.0;
+
+  const PylithScalar dt =
+    _matElastic->_stableTimeStepExplicit(data->properties, data->numPropsQuadPt,
+					 data->stateVars, data->numVarsQuadPt,
+					 minCellWidth);
+
+  const PylithScalar dtE = data->dtStableExplicit;
+
+  const PylithScalar tolerance = 1.0e-06;
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(dtE, dt, tolerance); // TEMPORARY
+  CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, dt/dtE, tolerance);
+} // test_stableTimeStepExplicit
+
+// ----------------------------------------------------------------------
 // Setup nondimensionalization.
 void
 pylith::materials::TestElasticMaterial::setupNormalizer(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticMaterial.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticMaterial.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticMaterial.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,6 +56,7 @@
   CPPUNIT_TEST( testCalcDerivElastic );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testStableTimeStepImplicit );
+  CPPUNIT_TEST( testStableTimeStepExplicit );
 
   CPPUNIT_TEST_SUITE_END();
 
@@ -89,6 +90,9 @@
   /// Test stableTimeStepImplicit().
   void testStableTimeStepImplicit(void);
 
+  /// Test stableTimeStepExplicit().
+  void testStableTimeStepExplicit(void);
+
   // PUBLIC METHODS /////////////////////////////////////////////////////
 public :
 
@@ -117,6 +121,9 @@
   /// Test _stableTimeStepImplicit().
   void test_stableTimeStepImplicit(void);
 
+  /// Test _stableTimeStepExplicit().
+  void test_stableTimeStepExplicit(void);
+
   // PROTECTED METHODS //////////////////////////////////////////////////
 protected :
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticPlaneStrain.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticPlaneStrain.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticPlaneStrain.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,6 +57,7 @@
   CPPUNIT_TEST( test_calcElasticConsts );
   CPPUNIT_TEST( test_updateStateVars );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   CPPUNIT_TEST_SUITE_END();
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticPlaneStress.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticPlaneStress.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticPlaneStress.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,6 +57,7 @@
   CPPUNIT_TEST( test_calcElasticConsts );
   CPPUNIT_TEST( test_updateStateVars );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   CPPUNIT_TEST_SUITE_END();
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticStrain1D.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticStrain1D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticStrain1D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,6 +57,7 @@
   CPPUNIT_TEST( test_calcElasticConsts );
   CPPUNIT_TEST( test_updateStateVars );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   CPPUNIT_TEST_SUITE_END();
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticStress1D.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticStress1D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestElasticStress1D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,6 +57,7 @@
   CPPUNIT_TEST( test_calcElasticConsts );
   CPPUNIT_TEST( test_updateStateVars );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   CPPUNIT_TEST_SUITE_END();
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellIsotropic3D.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellIsotropic3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellIsotropic3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,6 +55,7 @@
   CPPUNIT_TEST( testDimStateVars );
   CPPUNIT_TEST( test_calcDensity );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   // Need to test Maxwell viscoelastic specific behavior.
   CPPUNIT_TEST( testTimeStep );

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellPlaneStrain.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellPlaneStrain.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellPlaneStrain.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,6 +55,7 @@
   CPPUNIT_TEST( testDimStateVars );
   CPPUNIT_TEST( test_calcDensity );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   // Need to test Maxwell viscoelastic specific behavior.
   CPPUNIT_TEST( testTimeStep );

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellQpQsIsotropic3D.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellQpQsIsotropic3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestGenMaxwellQpQsIsotropic3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,6 +55,7 @@
   CPPUNIT_TEST( testDimStateVars );
   CPPUNIT_TEST( test_calcDensity );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   // Need to test Maxwell viscoelastic specific behavior.
   CPPUNIT_TEST( testTimeStep );

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestMaxwellIsotropic3D.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestMaxwellIsotropic3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestMaxwellIsotropic3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,6 +55,7 @@
   CPPUNIT_TEST( testDimStateVars );
   CPPUNIT_TEST( test_calcDensity );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   // Need to test Maxwell viscoelastic specific behavior.
   CPPUNIT_TEST( testTimeStep );

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestMaxwellPlaneStrain.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestMaxwellPlaneStrain.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestMaxwellPlaneStrain.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,6 +55,7 @@
   CPPUNIT_TEST( testDimStateVars );
   CPPUNIT_TEST( test_calcDensity );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   // Need to test Maxwell viscoelastic specific behavior.
   CPPUNIT_TEST( testTimeStep );

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestPowerLaw3D.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestPowerLaw3D.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestPowerLaw3D.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,6 +55,7 @@
   CPPUNIT_TEST( testDimStateVars );
   CPPUNIT_TEST( test_calcDensity );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   // Need to test Power Law viscoelastic specific behavior.
   CPPUNIT_TEST( testTimeStep );

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/TestPowerLawPlaneStrain.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/TestPowerLawPlaneStrain.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/TestPowerLawPlaneStrain.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,6 +55,7 @@
   CPPUNIT_TEST( testDimStateVars );
   CPPUNIT_TEST( test_calcDensity );
   CPPUNIT_TEST( test_stableTimeStepImplicit );
+  CPPUNIT_TEST( test_stableTimeStepExplicit );
 
   // Need to test Power Law viscoelastic specific behavior.
   CPPUNIT_TEST( testTimeStep );

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElastic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElastic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElastic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -167,7 +167,8 @@
         self._calcStress(strainB, muB, lambdaB, \
                            initialStressB, initialStrainB)
 
-    self.dtStableImplicit = 1.0e10
+    self.dtStableImplicit = 1.0e+10
+    self.dtStableExplicit = 1000.0 / vpA
 
     plasticStrainUpdated = numpy.zeros((numLocs, tensorSize),
                                        dtype=numpy.float64)

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElasticData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElasticData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElasticData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::DruckerPrager3DElasticData::_dtStableImplicit =   1.00000000e+10;
 
+const PylithScalar pylith::materials::DruckerPrager3DElasticData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::DruckerPrager3DElasticData::_numPropertyValues[] = {
 1,
 1,
@@ -338,6 +340,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElasticData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElasticData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DElasticData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDep.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDep.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDep.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -46,8 +46,6 @@
     """
     ElasticMaterialApp.__init__(self, name)
 
-    # import pdb
-    # pdb.set_trace()
     numLocs = 2
 
     self.dimension = dimension
@@ -190,6 +188,7 @@
                                                initialStressB, initialStrainB)
 
     self.dtStableImplicit = 1.0e+99
+    self.dtStableExplicit = 1000.0 / vpA
 
     return
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDepData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDepData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDepData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::DruckerPrager3DTimeDepData::_dtStableImplicit =   1.00000000e+99;
 
+const PylithScalar pylith::materials::DruckerPrager3DTimeDepData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::DruckerPrager3DTimeDepData::_numPropertyValues[] = {
 1,
 1,
@@ -338,6 +340,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDepData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDepData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPrager3DTimeDepData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElastic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElastic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElastic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -78,7 +78,7 @@
     initialStrainA = [3.1e-4, 3.2e-4, 3.4e-4]
     muA = vsA*vsA*densityA
     lambdaA = vpA*vpA*densityA - 2.0*muA
-    stressZZInitialA = numpy.array([1.075e4], dtype=numpy.float64)
+    stressZZInitialA = 1.075e+4
 
     denomFrictionA = math.sqrt(3.0) * (3.0 - math.sin(frictionAngleA))
     denomDilatationA = math.sqrt(3.0) * (3.0 - math.sin(dilatationAngleA))
@@ -103,7 +103,7 @@
     alphaYieldB = 2.0 * math.sin(frictionAngleB)/denomFrictionB
     betaB = 6.0 * cohesionB * math.cos(frictionAngleB)/denomFrictionB
     alphaFlowB = 2.0 * math.sin(dilatationAngleB)/denomDilatationB
-    stressZZInitialB = numpy.array([2.575e4], dtype=numpy.float64)
+    stressZZInitialB = 2.575e+4
 
     self.lengthScale = 1.0e+3
     self.pressureScale = muA
@@ -179,6 +179,7 @@
                            initialStressB, initialStrainB)
 
     self.dtStableImplicit = 1.0e10
+    self.dtStableExplicit = 1000.0 / vpA
 
     stateVarsUpdatedA = numpy.array([stressZZInitialA, 0.0, 0.0, 0.0, 0.0],
                                     dtype=numpy.float64)

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElasticData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElasticData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElasticData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::DruckerPragerPlaneStrainElasticData::_dtStableImplicit =   1.00000000e+10;
 
+const PylithScalar pylith::materials::DruckerPragerPlaneStrainElasticData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::DruckerPragerPlaneStrainElasticData::_numPropertyValues[] = {
 1,
 1,
@@ -252,6 +254,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElasticData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElasticData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainElasticData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDep.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDep.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDep.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -195,6 +195,7 @@
                                                stateVarsB)
 
     self.dtStableImplicit = 1.0e+99
+    self.dtStableExplicit = 1000.0 / vpA
 
     return
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDepData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDepData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDepData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::DruckerPragerPlaneStrainTimeDepData::_dtStableImplicit =   1.00000000e+99;
 
+const PylithScalar pylith::materials::DruckerPragerPlaneStrainTimeDepData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::DruckerPragerPlaneStrainTimeDepData::_numPropertyValues[] = {
 1,
 1,
@@ -252,6 +254,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDepData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDepData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/DruckerPragerPlaneStrainTimeDepData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3D.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -119,6 +119,9 @@
 
     self.stress = stress
     self.elasticConsts = elasticConsts
+
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3DData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3DData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3DData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::ElasticIsotropic3DData::_dtStableImplicit =   1.00000000e+99;
 
+const PylithScalar pylith::materials::ElasticIsotropic3DData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::ElasticIsotropic3DData::_numPropertyValues[] = {
 1,
 1,
@@ -253,6 +255,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3DData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3DData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticIsotropic3DData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int* _numStateVarValues;

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialApp.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialApp.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialApp.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -89,6 +89,7 @@
 
     # Elastic material information
     self.dtStableImplicit = 1.0e+99
+    self.dtStableExplicit = 1.0e+99
     self.density = None
     self.strain = None
     self.stress = None
@@ -200,6 +201,9 @@
     self.data.addScalar(vtype="PylithScalar", name="_dtStableImplicit",
                         value=self.dtStableImplicit,
                         format="%16.8e")
+    self.data.addScalar(vtype="PylithScalar", name="_dtStableExplicit",
+                        value=self.dtStableExplicit,
+                        format="%16.8e")
     self.data.addArray(vtype="PylithScalar", name="_density",
                        values=self.density,
                        format="%16.8e", ncols=1)

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -20,6 +20,7 @@
 
 pylith::materials::ElasticMaterialData::ElasticMaterialData(void) :
   dtStableImplicit(0.0),
+  dtStableExplicit(0.0),
   density(0),
   strain(0),
   stress(0),

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticMaterialData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,6 +43,7 @@
 public:
 
   PylithScalar dtStableImplicit; ///< Stable time step for implicit time stepping.
+  PylithScalar dtStableExplicit; ///< Stable time step for explicit time stepping.
   PylithScalar* density; ///< Density at location.
   PylithScalar* strain; ///< Strain at location.
   PylithScalar* stress; ///< Stress at location.

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrain.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrain.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrain.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -118,6 +118,9 @@
 
     self.stress = stress
     self.elasticConsts = elasticConsts
+
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrainData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrainData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrainData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::ElasticPlaneStrainData::_dtStableImplicit =   1.00000000e+99;
 
+const PylithScalar pylith::materials::ElasticPlaneStrainData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::ElasticPlaneStrainData::_numPropertyValues[] = {
 1,
 1,
@@ -175,6 +177,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrainData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrainData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStrainData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int* _numStateVarValues;

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStress.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStress.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStress.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -118,6 +118,9 @@
 
     self.stress = stress
     self.elasticConsts = elasticConsts
+
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStressData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStressData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStressData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::ElasticPlaneStressData::_dtStableImplicit =   1.00000000e+99;
 
+const PylithScalar pylith::materials::ElasticPlaneStressData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::ElasticPlaneStressData::_numPropertyValues[] = {
 1,
 1,
@@ -175,6 +177,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStressData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStressData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticPlaneStressData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int* _numStateVarValues;

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1D.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -118,6 +118,9 @@
 
     self.stress = stress
     self.elasticConsts = elasticConsts
+
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1DData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1DData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1DData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::ElasticStrain1DData::_dtStableImplicit =   1.00000000e+99;
 
+const PylithScalar pylith::materials::ElasticStrain1DData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::ElasticStrain1DData::_numPropertyValues[] = {
 1,
 1,
@@ -143,6 +145,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1DData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1DData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStrain1DData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int* _numStateVarValues;

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1D.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1D.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1D.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -118,6 +118,9 @@
 
     self.stress = stress
     self.elasticConsts = elasticConsts
+
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1DData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1DData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1DData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::ElasticStress1DData::_dtStableImplicit =   1.00000000e+99;
 
+const PylithScalar pylith::materials::ElasticStress1DData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::ElasticStress1DData::_numPropertyValues[] = {
 1,
 1,
@@ -143,6 +145,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1DData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1DData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/ElasticStress1DData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int* _numStateVarValues;

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElastic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElastic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElastic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -186,6 +186,7 @@
                                                initialStressB, initialStrainB,
                                                self.stateVars[1,:])
     self.dtStableImplicit = 0.2*min(min(maxwellTimeA), min(maxwellTimeB))
+    self.dtStableExplicit = 1000.0 / vpA
 
     return
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElasticData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElasticData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElasticData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::GenMaxwellIsotropic3DElasticData::_dtStableImplicit =   8.88888889e+06;
 
+const PylithScalar pylith::materials::GenMaxwellIsotropic3DElasticData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::GenMaxwellIsotropic3DElasticData::_numPropertyValues[] = {
 1,
 1,
@@ -527,6 +529,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElasticData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElasticData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DElasticData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDep.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDep.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDep.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -213,6 +213,7 @@
                                                initialStressB, initialStrainB,
                                                stateVarsB)
     self.dtStableImplicit = 0.2*min(min(maxwellTimeA), min(maxwellTimeB))
+    self.dtStableExplicit = 1000.0 / vpA
 
     return
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDepData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDepData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDepData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::GenMaxwellIsotropic3DTimeDepData::_dtStableImplicit =   8.88888889e+06;
 
+const PylithScalar pylith::materials::GenMaxwellIsotropic3DTimeDepData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::GenMaxwellIsotropic3DTimeDepData::_numPropertyValues[] = {
 1,
 1,
@@ -527,6 +529,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDepData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDepData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellIsotropic3DTimeDepData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElastic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElastic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElastic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -194,6 +194,7 @@
                                                initialStressB, initialStrainB,
                                                self.stateVars[1,:])
     self.dtStableImplicit = 0.2*min(min(maxwellTimeA), min(maxwellTimeB))
+    self.dtStableExplicit = 1000.0 / vpA
 
     return
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElasticData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElasticData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElasticData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::GenMaxwellPlaneStrainElasticData::_dtStableImplicit =   8.88888889e+06;
 
+const PylithScalar pylith::materials::GenMaxwellPlaneStrainElasticData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::GenMaxwellPlaneStrainElasticData::_numPropertyValues[] = {
 1,
 1,
@@ -378,6 +380,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElasticData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElasticData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainElasticData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDep.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDep.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDep.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -229,6 +229,7 @@
                                                initialStressB, initialStrainB,
                                                stateVarsB)
     self.dtStableImplicit = 0.2*min(min(maxwellTimeA), min(maxwellTimeB))
+    self.dtStableExplicit = 1000.0 / vpA
 
     return
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDepData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDepData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDepData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::GenMaxwellPlaneStrainTimeDepData::_dtStableImplicit =   8.88888889e+06;
 
+const PylithScalar pylith::materials::GenMaxwellPlaneStrainTimeDepData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::GenMaxwellPlaneStrainTimeDepData::_numPropertyValues[] = {
 1,
 1,
@@ -378,6 +380,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDepData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDepData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellPlaneStrainTimeDepData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElastic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElastic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElastic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -212,6 +212,7 @@
         self._calcStress(strainB, muB, lambdaB, \
                            initialStressB, initialStrainB)
     self.dtStableImplicit = 0.2*min(min(maxwellTimeA), min(maxwellTimeB))
+    self.dtStableExplicit = 1000.0 / vpA
 
     return
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElasticData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElasticData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElasticData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::GenMaxwellQpQsIsotropic3DElasticData::_dtStableImplicit =   8.88888889e+05;
 
+const PylithScalar pylith::materials::GenMaxwellQpQsIsotropic3DElasticData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::GenMaxwellQpQsIsotropic3DElasticData::_numPropertyValues[] = {
 1,
 1,
@@ -570,6 +572,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElasticData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElasticData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DElasticData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDep.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDep.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDep.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -247,6 +247,7 @@
                          strainTB, visStrainB, visStrainBulkB,
                          initialStressB, initialStrainB)
     self.dtStableImplicit = 0.2*min(min(maxwellTimeA), min(maxwellTimeB),min(maxwellTimeBulkA), min(maxwellTimeBulkB))
+    self.dtStableExplicit = 1000.0 / vpA
 
     return
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDepData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDepData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDepData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::GenMaxwellQpQsIsotropic3DTimeDepData::_dtStableImplicit =   8.88888889e+05;
 
+const PylithScalar pylith::materials::GenMaxwellQpQsIsotropic3DTimeDepData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::GenMaxwellQpQsIsotropic3DTimeDepData::_numPropertyValues[] = {
 1,
 1,
@@ -570,6 +572,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDepData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDepData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/GenMaxwellQpQsIsotropic3DTimeDepData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElastic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElastic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElastic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -146,6 +146,8 @@
         self._calcStress(strainB, muB, lambdaB, \
                            initialStressB, initialStrainB)
     self.dtStableImplicit = 0.2*min(maxwellTimeA, maxwellTimeB)
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElasticData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElasticData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElasticData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::MaxwellIsotropic3DElasticData::_dtStableImplicit =   8.88888889e+06;
 
+const PylithScalar pylith::materials::MaxwellIsotropic3DElasticData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::MaxwellIsotropic3DElasticData::_numPropertyValues[] = {
 1,
 1,
@@ -377,6 +379,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElasticData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElasticData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DElasticData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDep.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDep.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDep.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -185,6 +185,8 @@
                                                initialStressB, initialStrainB)
 
     self.dtStableImplicit = 0.2*min(maxwellTimeA, maxwellTimeB)
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDepData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDepData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDepData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::MaxwellIsotropic3DTimeDepData::_dtStableImplicit =   8.88888889e+06;
 
+const PylithScalar pylith::materials::MaxwellIsotropic3DTimeDepData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::MaxwellIsotropic3DTimeDepData::_numPropertyValues[] = {
 1,
 1,
@@ -365,6 +367,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDepData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDepData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellIsotropic3DTimeDepData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElastic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElastic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElastic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -164,6 +164,8 @@
                                                initialStressB, initialStrainB,
                                                self.stateVars[1,:])
     self.dtStableImplicit = 0.2*min(maxwellTimeA, maxwellTimeB)
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElasticData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElasticData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElasticData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::MaxwellPlaneStrainElasticData::_dtStableImplicit =   8.88888889e+06;
 
+const PylithScalar pylith::materials::MaxwellPlaneStrainElasticData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::MaxwellPlaneStrainElasticData::_numPropertyValues[] = {
 1,
 1,
@@ -264,6 +266,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElasticData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElasticData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainElasticData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDep.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDep.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDep.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -199,6 +199,8 @@
                                                stateVarsB)
 
     self.dtStableImplicit = 0.2*min(maxwellTimeA, maxwellTimeB)
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDepData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDepData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDepData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::MaxwellPlaneStrainTimeDepData::_dtStableImplicit =   8.88888889e+06;
 
+const PylithScalar pylith::materials::MaxwellPlaneStrainTimeDepData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::MaxwellPlaneStrainTimeDepData::_numPropertyValues[] = {
 1,
 1,
@@ -264,6 +266,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDepData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDepData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/MaxwellPlaneStrainTimeDepData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElastic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElastic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElastic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -193,6 +193,8 @@
                                          dtype=numpy.float64)
 
     self.dtStableImplicit = 0.1*min(maxwellTimeA, maxwellTimeB)
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElasticData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElasticData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElasticData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::PowerLaw3DElasticData::_dtStableImplicit =   4.44444444e+06;
 
+const PylithScalar pylith::materials::PowerLaw3DElasticData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::PowerLaw3DElasticData::_numPropertyValues[] = {
 1,
 1,
@@ -393,6 +395,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElasticData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElasticData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DElasticData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDep.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDep.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDep.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -211,6 +211,8 @@
                                         powerLawExponentB, stressB)
 
     self.dtStableImplicit = 0.1*min(maxwellTimeA, maxwellTimeB)
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDepData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDepData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDepData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::PowerLaw3DTimeDepData::_dtStableImplicit =   4.44444444e+06;
 
+const PylithScalar pylith::materials::PowerLaw3DTimeDepData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::PowerLaw3DTimeDepData::_numPropertyValues[] = {
 1,
 1,
@@ -381,6 +383,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDepData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDepData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLaw3DTimeDepData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElastic.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElastic.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElastic.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -214,6 +214,8 @@
 
 
     self.dtStableImplicit = 0.1*min(maxwellTimeA, maxwellTimeB)
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElasticData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElasticData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElasticData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::PowerLawPlaneStrainElasticData::_dtStableImplicit =   4.09893495e+06;
 
+const PylithScalar pylith::materials::PowerLawPlaneStrainElasticData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::PowerLawPlaneStrainElasticData::_numPropertyValues[] = {
 1,
 1,
@@ -289,6 +291,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElasticData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElasticData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainElasticData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDep.py
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDep.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDep.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -223,6 +223,8 @@
                                         self.stateVarsUpdated[1,5:])
 
     self.dtStableImplicit = 0.1*min(maxwellTimeA, maxwellTimeB)
+    self.dtStableExplicit = 1000.0 / vpA
+
     return
 
 

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDepData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDepData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDepData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -47,6 +47,8 @@
 
 const PylithScalar pylith::materials::PowerLawPlaneStrainTimeDepData::_dtStableImplicit =   4.44444444e+06;
 
+const PylithScalar pylith::materials::PowerLawPlaneStrainTimeDepData::_dtStableExplicit =   1.92450090e-01;
+
 const int pylith::materials::PowerLawPlaneStrainTimeDepData::_numPropertyValues[] = {
 1,
 1,
@@ -277,6 +279,7 @@
   pressureScale = _pressureScale;
   densityScale = _densityScale;
   dtStableImplicit = _dtStableImplicit;
+  dtStableExplicit = _dtStableExplicit;
   numPropertyValues = const_cast<int*>(_numPropertyValues);
   numStateVarValues = const_cast<int*>(_numStateVarValues);
   dbPropertyValues = const_cast<char**>(_dbPropertyValues);

Modified: short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDepData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDepData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/materials/data/PowerLawPlaneStrainTimeDepData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,6 +69,8 @@
 
   static const PylithScalar _dtStableImplicit;
 
+  static const PylithScalar _dtStableExplicit;
+
   static const int _numPropertyValues[];
 
   static const int _numStateVarValues[];

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/TestXdmf.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/TestXdmf.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/TestXdmf.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -36,10 +36,10 @@
 } // testConstructor
 
 // ----------------------------------------------------------------------
-// Test write() with 2D mesh and vertex data.
+// Test write() with tri3 mesh and vertex data.
 void
-pylith::meshio::TestXdmf::testWrite2DVertex(void)
-{ // testWrite2DVertex
+pylith::meshio::TestXdmf::testWriteTri3Vertex(void)
+{ // testWriteTri3Vertex
 
   const char* filenameHDF5 = "data/tri3_vertex.h5";
   const char* filenameXdmf = "tri3_vertex.xmf";
@@ -48,13 +48,13 @@
   metafile.write(filenameXdmf, filenameHDF5);
 
   _checkFile(filenameXdmf);
-} // testWrite2DVertex
+} // testWriteTri3Vertex
 
 // ----------------------------------------------------------------------
-// Test write() with 2D mesh and cell data.
+// Test write() with Tri3 mesh and cell data.
 void
-pylith::meshio::TestXdmf::testWrite2DCell(void)
-{ // testWrite2DCell
+pylith::meshio::TestXdmf::testWriteTri3Cell(void)
+{ // testWriteTri3Cell
   const char* filenameHDF5 = "data/tri3_cell.h5";
   const char* filenameXdmf = "tri3_cell.xmf";
 
@@ -62,13 +62,42 @@
   metafile.write(filenameXdmf, filenameHDF5);
 
   _checkFile(filenameXdmf);
-} // testWrite2DCell
+} // testWriteTri3Cell
 
 // ----------------------------------------------------------------------
-// Test write() with 3D mesh and vertex data.
+// Test write() with quad4 mesh and vertex data.
 void
-pylith::meshio::TestXdmf::testWrite3DVertex(void)
-{ // testWrite3DVertex
+pylith::meshio::TestXdmf::testWriteQuad4Vertex(void)
+{ // testWriteQuad4Vertex
+
+  const char* filenameHDF5 = "data/quad4_vertex.h5";
+  const char* filenameXdmf = "quad4_vertex.xmf";
+
+  Xdmf metafile;
+  metafile.write(filenameXdmf, filenameHDF5);
+
+  _checkFile(filenameXdmf);
+} // testWriteQuad4Vertex
+
+// ----------------------------------------------------------------------
+// Test write() with Quad4 mesh and cell data.
+void
+pylith::meshio::TestXdmf::testWriteQuad4Cell(void)
+{ // testWriteQuad4Cell
+  const char* filenameHDF5 = "data/quad4_cell.h5";
+  const char* filenameXdmf = "quad4_cell.xmf";
+
+  Xdmf metafile;
+  metafile.write(filenameXdmf, filenameHDF5);
+
+  _checkFile(filenameXdmf);
+} // testWriteQuad4Cell
+
+// ----------------------------------------------------------------------
+// Test write() with tet4 mesh and vertex data.
+void
+pylith::meshio::TestXdmf::testWriteTet4Vertex(void)
+{ // testWriteTet4Vertex
   const char* filenameHDF5 = "data/tet4_vertex.h5";
   const char* filenameXdmf = "tet4_vertex.xmf";
 
@@ -76,13 +105,13 @@
   metafile.write(filenameXdmf, filenameHDF5);
 
   _checkFile(filenameXdmf);
-} // testWrite3DVertex
+} // testWriteTet4Vertex
 
 // ----------------------------------------------------------------------
-// Test write() with 3D mesh and cell data.
+// Test write() with tet4 mesh and cell data.
 void
-pylith::meshio::TestXdmf::testWrite3DCell(void)
-{ // testWrite3DCell
+pylith::meshio::TestXdmf::testWriteTet4Cell(void)
+{ // testWriteTet4Cell
   const char* filenameHDF5 = "data/tet4_cell.h5";
   const char* filenameXdmf = "tet4_cell.xmf";
 
@@ -90,11 +119,39 @@
   metafile.write(filenameXdmf, filenameHDF5);
 
   _checkFile(filenameXdmf);
-} // testWrite3DCell
+} // testWriteTet4Cell
 
 // ----------------------------------------------------------------------
-// Check VTK file against archived file.
+// Test write() with hex8 mesh and vertex data.
 void
+pylith::meshio::TestXdmf::testWriteHex8Vertex(void)
+{ // testWriteHex8Vertex
+  const char* filenameHDF5 = "data/hex8_vertex.h5";
+  const char* filenameXdmf = "hex8_vertex.xmf";
+
+  Xdmf metafile;
+  metafile.write(filenameXdmf, filenameHDF5);
+
+  _checkFile(filenameXdmf);
+} // testWriteHex8Vertex
+
+// ----------------------------------------------------------------------
+// Test write() with hex8 mesh and cell data.
+void
+pylith::meshio::TestXdmf::testWriteHex8Cell(void)
+{ // testWriteHex8Cell
+  const char* filenameHDF5 = "data/hex8_cell.h5";
+  const char* filenameXdmf = "hex8_cell.xmf";
+
+  Xdmf metafile;
+  metafile.write(filenameXdmf, filenameHDF5);
+
+  _checkFile(filenameXdmf);
+} // testWriteHex8Cell
+
+// ----------------------------------------------------------------------
+// Check Xdmf file against archived file.
+void
 pylith::meshio::TestXdmf::_checkFile(const char* filename)
 { // _checkFile
   const std::string filenameE = std::string("data/") + std::string(filename);

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/TestXdmf.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/TestXdmf.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/TestXdmf.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,10 +44,14 @@
   CPPUNIT_TEST_SUITE( TestXdmf );
 
   CPPUNIT_TEST( testConstructor );
-  CPPUNIT_TEST( testWrite2DVertex );
-  CPPUNIT_TEST( testWrite2DCell );
-  CPPUNIT_TEST( testWrite3DVertex );
-  CPPUNIT_TEST( testWrite3DCell );
+  CPPUNIT_TEST( testWriteTri3Vertex );
+  CPPUNIT_TEST( testWriteTri3Cell );
+  CPPUNIT_TEST( testWriteQuad4Vertex );
+  CPPUNIT_TEST( testWriteQuad4Cell );
+  CPPUNIT_TEST( testWriteTet4Vertex );
+  CPPUNIT_TEST( testWriteTet4Cell );
+  CPPUNIT_TEST( testWriteHex8Vertex );
+  CPPUNIT_TEST( testWriteHex8Cell );
 
   CPPUNIT_TEST_SUITE_END();
 
@@ -57,18 +61,30 @@
   /// Test constructor.
   void testConstructor(void);
 
-  /// Test write() with 2D mesh and vertex data.
-  void testWrite2DVertex(void);
+  /// Test write() with tri3 mesh and vertex data.
+  void testWriteTri3Vertex(void);
 
-  /// Test write() with 2D mesh and cell data.
-  void testWrite2DCell(void);
+  /// Test write() with tri3 mesh and cell data.
+  void testWriteTri3Cell(void);
 
-  /// Test write() with 3D mesh and vertex data.
-  void testWrite3DVertex(void);
+  /// Test write() with quad4 mesh and vertex data.
+  void testWriteQuad4Vertex(void);
 
-  /// Test write() with 3D mesh and cell data.
-  void testWrite3DCell(void);
+  /// Test write() with quad4 mesh and cell data.
+  void testWriteQuad4Cell(void);
 
+  /// Test write() with tet4 mesh and vertex data.
+  void testWriteTet4Vertex(void);
+
+  /// Test write() with tet4 mesh and cell data.
+  void testWriteTet4Cell(void);
+
+  /// Test write() with hex8 mesh and vertex data.
+  void testWriteHex8Vertex(void);
+
+  /// Test write() with hex8 mesh and cell data.
+  void testWriteHex8Cell(void);
+
   // PRIVATE METHODS ////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterData.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterData.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterData.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -18,6 +18,9 @@
 
 #include "DataWriterData.hh"
 
+const int pylith::meshio::DataWriterData::DataWriterData::numVertexFields = 4;
+const int pylith::meshio::DataWriterData::DataWriterData::numCellFields = 4;
+
 // ----------------------------------------------------------------------
 // Constructor
 pylith::meshio::DataWriterData::DataWriterData(void) :
@@ -32,13 +35,18 @@
   timeFormat(0),
   cellsLabel(0),
   labelId(0),
-  numVertexFields(0),
   numVertices(0),
   vertexFieldsInfo(0),
-  numCellFields(0),
   numCells(0),
   cellFieldsInfo(0)
 { // constructor
+  for (int i=0; i < numVertexFields; ++i) {
+    vertexFields[i] = 0;
+  } // for
+
+  for (int i=0; i < numCellFields; ++i) {
+    cellFields[i] = 0;
+  } // for
 } // constructor
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterData.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterData.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterData.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -69,18 +69,18 @@
 
   /// @name Vertex field information.
   //@{
-  int numVertexFields; ///< Number of vertex fields.
+  static const int numVertexFields; ///< Number of vertex fields.
   int numVertices; ///< Number of vertices.
   FieldStruct* vertexFieldsInfo; ///< Array of vertex field information.
-  PylithScalar* vertexFields[3]; ///< Array of vertex field values.
+  PylithScalar* vertexFields[4]; ///< Array of vertex field values.
   //@}
 
   /// @name Cell field information.
   //@{
-  int numCellFields; ///< Number of cell fields.
+  static const int numCellFields; ///< Number of cell fields.
   int numCells; ///< Number of vertices.
   FieldStruct* cellFieldsInfo; ///< Array of cell fields information.
-  PylithScalar* cellFields[3]; /// Array of cell field values.
+  PylithScalar* cellFields[4]; /// Array of cell field values.
   //@}
 
 }; // DataWriterData

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,16 +44,19 @@
 const char* pylith::meshio::DataWriterHDF5DataBCMeshHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataBCMeshHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataBCMeshHex8::_numVertices = 8;
 
 const pylith::meshio::DataWriterData::FieldStruct
 pylith::meshio::DataWriterHDF5DataBCMeshHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_vertexFieldScalar[8*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_vertexFieldVector[8*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -63,10 +66,17 @@
   7.8, 8.9, 9.0,
   10.2, 11.3, 12.4,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_vertexFieldTensor[8*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_vertexFieldOther[8*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -77,26 +87,30 @@
   7.9, 8.0,
 };
 
-const int pylith::meshio::DataWriterHDF5DataBCMeshHex8::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataBCMeshHex8::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataBCMeshHex8::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataBCMeshHex8::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_cellFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_cellFieldVector[2*3] = {
   1.1, 2.2, 3.3,
-  4.4, 5.5, 6.6
+  4.4, 5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_cellField1[] = {
-  2.1, 3.2,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_cellFieldTensor[2*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
-  7.8, 8.9, 9.0, 10.1, 11.2, 12.3
+  7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshHex8::_cellFieldOther[2*2] = {
+  1.1, 2.2,
+  5.5, 6.6,
+};
 
 pylith::meshio::DataWriterHDF5DataBCMeshHex8::DataWriterHDF5DataBCMeshHex8(void)
 { // constructor
@@ -112,21 +126,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataBCMeshHex8::~DataWriterHDF5DataBCMeshHex8(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataBCMeshHex8

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -40,46 +40,55 @@
 const char* pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_numVertices = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_vertexFieldScalar[3*1] = {
+  2.1, 3.2, 4.3,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_vertexFieldVector[3*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_vertexField1[] = {
-  2.1, 3.2, 4.3,
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_vertexFieldTensor[3*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_vertexFieldOther[3*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
 };
 
-const int pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 3 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_cellFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_cellFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_cellField1[] = {
-  2.1, 3.2,
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_cellFieldTensor[2*3] = {
+  1.2, 1.3, 1.4,
+  2.2, 2.3, 2.4,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshQuad4::_cellFieldOther[2*3] = {
   1.2, 2.3, 3.4,
   4.5, 5.6, 6.7,
 };
@@ -96,21 +105,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataBCMeshQuad4::~DataWriterHDF5DataBCMeshQuad4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,9 +56,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -67,9 +68,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataBCMeshQuad4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,16 +44,19 @@
 const char* pylith::meshio::DataWriterHDF5DataBCMeshTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataBCMeshTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataBCMeshTet4::_numVertices = 6;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataBCMeshTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterHDF5DataBCMeshTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_vertexFieldScalar[6*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_vertexFieldVector[6*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -61,10 +64,15 @@
   13.3, 14.4, 15.5,
   16.6, 17.7, 18.8,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6,
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_vertexFieldTensor[6*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_vertexFieldOther[6*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -73,26 +81,30 @@
   11.2, 12.3,
 };
 
-const int pylith::meshio::DataWriterHDF5DataBCMeshTet4::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataBCMeshTet4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataBCMeshTet4::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataBCMeshTet4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 4 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_cellFieldScalar[2*1] = {
+  2.1, 3.2
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_cellFieldVector[2*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_cellField1[] = {
-  2.1, 3.2
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_cellFieldTensor[2*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
   7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTet4::_cellFieldOther[2*4] = {
+  1.2, 2.3, 3.4, 4.5,
+  7.8, 8.9, 9.0, 10.1,
+};
 
 pylith::meshio::DataWriterHDF5DataBCMeshTet4::DataWriterHDF5DataBCMeshTet4(void)
 { // constructor
@@ -108,21 +120,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataBCMeshTet4::~DataWriterHDF5DataBCMeshTet4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataBCMeshTet4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,45 +44,52 @@
 const char* pylith::meshio::DataWriterHDF5DataBCMeshTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataBCMeshTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataBCMeshTri3::_numVertices = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataBCMeshTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataBCMeshTri3::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_vertexFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_vertexFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_vertexField1[] = {
-  2.1, 3.2,
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_vertexFieldTensor[2*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_vertexFieldOther[2*2] = {
   1.2, 2.3,
   3.4, 4.5,
 };
 
-const int pylith::meshio::DataWriterHDF5DataBCMeshTri3::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataBCMeshTri3::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataBCMeshTri3::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataBCMeshTri3::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataBCMeshTri3::_cellFieldOther[1*2] = {
+  2.1, 2.2,
+};
 
 pylith::meshio::DataWriterHDF5DataBCMeshTri3::DataWriterHDF5DataBCMeshTri3(void)
 { // constructor
@@ -98,21 +105,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataBCMeshTri3::~DataWriterHDF5DataBCMeshTri3(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataBCMeshTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataBCMeshTri3

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,49 +41,58 @@
 const char* pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_numVertices = 4;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_vertexFieldScalar[4*1] = {
+  2.1, 3.2, 4.3, 5.4,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_vertexFieldVector[4*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
   10.1, 11.2, 12.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4,
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_vertexFieldTensor[4*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_vertexFieldOther[4*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
   7.8, 8.9,
 };
 
-const int pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
 pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_cellFields[] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 3 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_cellFieldVector[1*3] = {
   1.1, 2.2, 3.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_cellFieldTensor[1*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshHex8::_cellFieldOther[1*3] = {
+  1.2, 2.3, 3.4,
+};
 
 pylith::meshio::DataWriterHDF5DataFaultMeshHex8::DataWriterHDF5DataFaultMeshHex8(void)
 { // constructor
@@ -98,21 +107,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataFaultMeshHex8::~DataWriterHDF5DataFaultMeshHex8(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataFaultMeshHex8

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,45 +41,52 @@
 const char* pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_numVertices = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_vertexFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_vertexFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_vertexField1[] = {
-  2.1, 3.2,
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_vertexFieldTensor[2*3] = {
+  1.2, 1.3, 1.4,
+  2.2, 2.3, 2.4,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_vertexFieldOther[2*2] = {
   1.2, 2.3,
   3.4, 4.5,
 };
 
-const int pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::_cellFieldOther[1*2] = {
+  1.2, 3.2,
+};
 
 pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::DataWriterHDF5DataFaultMeshQuad4(void)
 { // constructor
@@ -94,21 +101,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataFaultMeshQuad4::~DataWriterHDF5DataFaultMeshQuad4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataFaultMeshQuad4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,47 +41,55 @@
 const char* pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_numVertices = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_vertexFieldScalar[3*1] = {
+  2.1, 3.2, 4.3,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_vertexFieldVector[3*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_vertexField1[] = {
-  2.1, 3.2, 4.3,
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_vertexFieldTensor[3*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_vertexFieldOther[3*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
 };
 
-const int pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 3 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_cellFieldVector[1*3] = {
   1.1, 2.2, 3.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_cellFieldTensor[1*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTet4::_cellFieldOther[1*3] = {
+  1.2, 2.3, 3.4,
+};
 
 pylith::meshio::DataWriterHDF5DataFaultMeshTet4::DataWriterHDF5DataFaultMeshTet4(void)
 { // constructor
@@ -96,21 +104,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataFaultMeshTet4::~DataWriterHDF5DataFaultMeshTet4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataFaultMeshTet4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,45 +41,52 @@
 const char* pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_numVertices = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_vertexFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_vertexFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_vertexField1[] = {
-  2.1, 3.2,
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_vertexFieldTensor[2*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_vertexFieldOther[2*2] = {
   1.2, 2.3,
   3.4, 4.5,
 };
 
-const int pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 4 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataFaultMeshTri3::_cellFieldOther[1*4] = {
+  1.2, 2.3, 3.4, 4.5,
+};
 
 pylith::meshio::DataWriterHDF5DataFaultMeshTri3::DataWriterHDF5DataFaultMeshTri3(void)
 { // constructor
@@ -94,21 +101,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataFaultMeshTri3::~DataWriterHDF5DataFaultMeshTri3(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataFaultMeshTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataFaultMeshTri3

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,16 +45,21 @@
 const char* pylith::meshio::DataWriterHDF5DataMatMeshHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataMatMeshHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMatMeshHex8::_numVertices = 20;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMatMeshHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterHDF5DataMatMeshHex8::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_vertexFieldScalar[20*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+  10.0, 12.1, 11.1, 13.1, 14.1, 15.1, 16.1, 17.1,
+  18.1, 19.1, 20.1, 21.1
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_vertexFieldVector[20*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -76,12 +81,29 @@
   31.1, 32.2, 33.3,
   34.4, 35.5, 36.6
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
-  10.0, 12.1, 11.1, 13.1, 14.1, 15.1, 16.1, 17.1,
-  18.1, 19.1, 20.1, 21.1
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_vertexFieldTensor[20*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6,
+  13.1, 13.2, 13.3, 13.4, 13.5, 13.6,
+  14.1, 14.2, 14.3, 14.4, 14.5, 14.6,
+  15.1, 15.2, 15.3, 15.4, 15.5, 15.6,
+  16.1, 16.2, 16.3, 16.4, 16.5, 16.6,
+  17.1, 17.2, 17.3, 17.4, 17.5, 17.6,
+  18.1, 18.2, 18.3, 18.4, 18.5, 18.6,
+  19.1, 19.2, 19.3, 19.4, 19.5, 19.6,
+  20.1, 20.2, 20.3, 20.4, 20.5, 20.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_vertexFieldOther[20*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -104,24 +126,27 @@
   4.1, 4.2,
 };
 
-const int pylith::meshio::DataWriterHDF5DataMatMeshHex8::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMatMeshHex8::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMatMeshHex8::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataMatMeshHex8::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_cellFieldVector[1*3] = {
   1.1, 2.2, 3.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_cellFieldTensor[1*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshHex8::_cellFieldOther[1*2] = {
+  1.2, 2.3,
+};
 
 pylith::meshio::DataWriterHDF5DataMatMeshHex8::DataWriterHDF5DataMatMeshHex8(void)
 { // constructor
@@ -138,21 +163,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataMatMeshHex8::~DataWriterHDF5DataMatMeshHex8(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,9 +59,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -70,9 +71,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataMatMeshHex8

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshLine2.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshLine2.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshLine2.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,22 +45,25 @@
 const char* pylith::meshio::DataWriterHDF5DataMatMeshLine2::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataMatMeshLine2::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMatMeshLine2::_numVertices = 5;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMatMeshLine2::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 1 },
+pylith::meshio::DataWriterHDF5DataMatMeshLine2::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_vertexFieldScalar[5*1] = {
   1.1, 2.2, 3.3, 4.4, 5.5
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_vertexField1[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_vertexFieldVector[5*1] = {
   2.1, 3.2, 4.3, 5.4, 6.5
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_vertexFieldTensor[5*1] = {
+  3.1, 4.2, 5.3, 6.4, 7.5
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_vertexFieldOther[5*2] = {
   1.2, 2.3, 
   3.4, 4.5,
   5.6, 6.7,
@@ -68,24 +71,27 @@
   9.1, 10.2
 };
 
-const int pylith::meshio::DataWriterHDF5DataMatMeshLine2::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMatMeshLine2::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMatMeshLine2::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataMatMeshLine2::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 1 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_cellFieldScalar[1*1] = {
   1.1,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_cellField1[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_cellFieldVector[1*1] = {
   2.1,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_cellFieldTensor[1*1] = {
   1.2,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshLine2::_cellFieldOther[1*2] = {
+  1.2, 2.3,
+};
 
 pylith::meshio::DataWriterHDF5DataMatMeshLine2::DataWriterHDF5DataMatMeshLine2(void)
 { // constructor
@@ -102,21 +108,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataMatMeshLine2::~DataWriterHDF5DataMatMeshLine2(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshLine2.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshLine2.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshLine2.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,9 +59,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -70,9 +71,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataMatMeshLine2

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,16 +41,19 @@
 const char* pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_numVertices = 6;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_vertexFieldScalar[6*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_vertexFieldVector[6*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
@@ -58,10 +61,15 @@
   9.9, 10.1,
   11.2, 12.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_vertexFieldTensor[6*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
+  4.1, 4.2, 4.3,
+  5.1, 5.2, 5.3,
+  6.1, 6.2, 6.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_vertexFieldOther[6*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -70,24 +78,27 @@
   6.5, 5.4
 };
 
-const int pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshQuad4::_cellFieldOther[1*2] = {
+  1.2, 2.3,
+};
 
 pylith::meshio::DataWriterHDF5DataMatMeshQuad4::DataWriterHDF5DataMatMeshQuad4(void)
 { // constructor
@@ -102,21 +113,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataMatMeshQuad4::~DataWriterHDF5DataMatMeshQuad4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataMatMeshQuad4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,16 +45,19 @@
 const char* pylith::meshio::DataWriterHDF5DataMatMeshTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataMatMeshTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMatMeshTet4::_numVertices = 11;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMatMeshTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterHDF5DataMatMeshTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_vertexFieldScalar[11*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.0, 12.1
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_vertexFieldVector[11*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -67,10 +70,20 @@
   28.8, 29.9, 30.0,
   31.1, 32.2, 33.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.0, 12.1
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_vertexFieldTensor[11*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_vertexFieldOther[11*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -84,26 +97,30 @@
   21.2, 22.3
 };
 
-const int pylith::meshio::DataWriterHDF5DataMatMeshTet4::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMatMeshTet4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMatMeshTet4::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataMatMeshTet4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_cellFieldScalar[2*1] = {
+  2.1, 3.2
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_cellFieldVector[2*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_cellField1[] = {
-  2.1, 3.2
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_cellFieldTensor[2*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
   7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTet4::_cellFieldOther[2*2] = {
+  1.2, 2.3,
+  7.8, 8.9,
+};
 
 pylith::meshio::DataWriterHDF5DataMatMeshTet4::DataWriterHDF5DataMatMeshTet4(void)
 { // constructor
@@ -120,21 +137,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataMatMeshTet4::~DataWriterHDF5DataMatMeshTet4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,9 +59,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -70,9 +71,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataMatMeshTet4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,16 +45,16 @@
 const char* pylith::meshio::DataWriterHDF5DataMatMeshTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataMatMeshTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMatMeshTri3::_numVertices = 8;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMatMeshTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataMatMeshTri3::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_vertexFieldVector[8*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
@@ -64,10 +64,20 @@
   13.3, 14.4,
   15.5, 16.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_vertexField1[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_vertexFieldScalar[8*1] = {
   2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_vertexFieldTensor[8*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 3.3,
+  3.1, 3.2, 4.3,
+  4.1, 4.2, 5.3,
+  5.1, 5.2, 6.3,
+  6.1, 6.2, 7.3,
+  7.1, 7.2, 8.3,
+  8.1, 8.2, 9.3,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_vertexFieldOther[8*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -78,24 +88,27 @@
   15.6, 16.7
 };
 
-const int pylith::meshio::DataWriterHDF5DataMatMeshTri3::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMatMeshTri3::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMatMeshTri3::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataMatMeshTri3::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataMatMeshTri3::_cellFieldOther[1*2] = {
+  1.2, 2.3,
+};
 
 pylith::meshio::DataWriterHDF5DataMatMeshTri3::DataWriterHDF5DataMatMeshTri3(void)
 { // constructor
@@ -112,21 +125,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataMatMeshTri3::~DataWriterHDF5DataMatMeshTri3(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMatMeshTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,9 +59,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -70,9 +71,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataMatMeshTri3

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,16 +41,21 @@
 const char* pylith::meshio::DataWriterHDF5DataMeshHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataMeshHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMeshHex8::_numVertices = 20;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMeshHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterHDF5DataMeshHex8::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_vertexFieldScalar[20*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+  10.0, 12.1, 11.1, 13.1, 14.1, 15.1, 16.1, 17.1,
+  18.1, 19.1, 20.1, 21.2
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_vertexFieldVector[20*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -72,12 +77,29 @@
   31.8, 32.9, 33.1,
   34.8, 35.9, 36.1,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
-  10.0, 12.1, 11.1, 13.1, 14.1, 15.1, 16.1, 17.1,
-  18.1, 19.1, 20.1, 21.2
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_vertexFieldTensor[20*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6,
+  13.1, 13.2, 13.3, 13.4, 13.5, 13.6,
+  14.1, 14.2, 14.3, 14.4, 14.5, 14.6,
+  15.1, 15.2, 15.3, 15.4, 15.5, 15.6,
+  16.1, 16.2, 16.3, 16.4, 16.5, 16.6,
+  17.1, 17.2, 17.3, 17.4, 17.5, 17.6,
+  18.1, 18.2, 18.3, 18.4, 18.5, 18.6,
+  19.1, 19.2, 19.3, 19.4, 19.5, 19.6,
+  20.1, 20.2, 20.3, 20.4, 20.5, 20.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_vertexFieldOther[20*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -100,28 +122,33 @@
   9.1, 10.1
 };
 
-const int pylith::meshio::DataWriterHDF5DataMeshHex8::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMeshHex8::_numCells = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMeshHex8::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataMeshHex8::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_cellFieldScalar[3*1] = {
+  2.1, 3.2, 4.3
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_cellFieldVector[3*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_cellField1[] = {
-  2.1, 3.2, 4.3
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_cellFieldTensor[3*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
   1.1, 2.2, 3.3, 4.4, 5.5, 6.6,
   1.3, 2.4, 3.5, 4.6, 5.7, 6.8
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshHex8::_cellFieldOther[3*2] = {
+  1.2, 2.3,
+  1.1, 2.2,
+  1.3, 2.4,
+};
 
 pylith::meshio::DataWriterHDF5DataMeshHex8::DataWriterHDF5DataMeshHex8(void)
 { // constructor
@@ -136,21 +163,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataMeshHex8::~DataWriterHDF5DataMeshHex8(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataMeshHex8

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshLine2.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshLine2.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshLine2.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,22 +41,25 @@
 const char* pylith::meshio::DataWriterHDF5DataMeshLine2::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataMeshLine2::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMeshLine2::_numVertices = 5;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMeshLine2::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 1 },
+pylith::meshio::DataWriterHDF5DataMeshLine2::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_vertexField0[5] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_vertexFieldScalar[5*1] = {
   1.1, 2.2, 3.3, 4.4, 5.5,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_vertexField1[5] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_vertexFieldVector[5*1] = {
   2.1, 3.2, 4.3, 5.4, 6.5,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_vertexField2[10] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_vertexFieldTensor[5*1] = {
+  1.2, 1.3, 1.4, 1.5, 1.6,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_vertexFieldOther[5*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -64,24 +67,29 @@
   9.0, 10.1,
 };
 
-const int pylith::meshio::DataWriterHDF5DataMeshLine2::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMeshLine2::_numCells = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMeshLine2::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataMeshLine2::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 1 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_cellField0[3] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_cellFieldScalar[3*1] = {
   1.1, 2.2, 3.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_cellField1[3] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_cellFieldVector[3*1] = {
   2.1, 2.2, 2.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_cellField2[3] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_cellFieldTensor[3*1] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshLine2::_cellFieldOther[3*2] = {
+  1.2, 2.3,
+  3.4, 2.2,
+  3.3, 4.4,
+};
 
 pylith::meshio::DataWriterHDF5DataMeshLine2::DataWriterHDF5DataMeshLine2(void)
 { // constructor
@@ -96,21 +104,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataMeshLine2::~DataWriterHDF5DataMeshLine2(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshLine2.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshLine2.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshLine2.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataMeshLine2

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -37,16 +37,19 @@
 const char* pylith::meshio::DataWriterHDF5DataMeshQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataMeshQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMeshQuad4::_numVertices = 6;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMeshQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataMeshQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_vertexFieldScalar[6*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_vertexFieldVector[6*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
@@ -54,10 +57,15 @@
   9.9, 10.1,
   11.2, 12.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_vertexFieldTensor[6*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 3.3,
+  3.1, 3.2, 4.3,
+  4.1, 4.2, 5.3,
+  5.1, 5.2, 6.3,
+  6.1, 6.2, 7.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_vertexFieldOther[6*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -66,26 +74,30 @@
   6.5, 5.4
 };
 
-const int pylith::meshio::DataWriterHDF5DataMeshQuad4::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMeshQuad4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMeshQuad4::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataMeshQuad4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_cellFieldScalar[2*1] = {
+  2.1, 2.2,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_cellFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_cellField1[] = {
-  2.1, 2.2,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_cellFieldTensor[2*3] = {
   1.2, 2.3, 3.4,
   4.5, 5.6, 6.7,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshQuad4::_cellFieldOther[2*2] = {
+  1.2, 2.3,
+  4.5, 5.6,
+};
 
 pylith::meshio::DataWriterHDF5DataMeshQuad4::DataWriterHDF5DataMeshQuad4(void)
 { // constructor
@@ -98,21 +110,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataMeshQuad4::~DataWriterHDF5DataMeshQuad4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,9 +55,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -66,9 +67,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataMeshQuad4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,16 +41,19 @@
 const char* pylith::meshio::DataWriterHDF5DataMeshTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataMeshTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMeshTet4::_numVertices = 11;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMeshTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterHDF5DataMeshTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_vertexFieldScalar[11*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.0, 12.1,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_vertexFieldVector[11*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -63,10 +66,20 @@
   28.8, 29.9, 30.0,
   31.1, 32.2, 33.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.0, 12.1,
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_vertexFieldTensor[11*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_vertexFieldOther[11*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -80,28 +93,33 @@
   21.2, 22.3,
 };
 
-const int pylith::meshio::DataWriterHDF5DataMeshTet4::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMeshTet4::_numCells = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMeshTet4::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataMeshTet4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 4 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_cellFieldScalar[3*1] = {
+  2.1, 3.2, 4.3
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_cellFieldVector[3*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_cellField1[] = {
-  2.1, 3.2, 4.3
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_cellFieldTensor[3*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
   7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
   13.4, 14.5, 15.6, 16.7, 17.8, 18.9
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTet4::_cellFieldOther[3*4] = {
+  1.2, 2.3, 3.4, 4.5,
+  7.8, 8.9, 9.0, 10.1,
+  13.4, 14.5, 15.6, 16.7,
+};
 
 pylith::meshio::DataWriterHDF5DataMeshTet4::DataWriterHDF5DataMeshTet4(void)
 { // constructor
@@ -116,21 +134,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataMeshTet4::~DataWriterHDF5DataMeshTet4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataMeshTet4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,59 +41,76 @@
 const char* pylith::meshio::DataWriterHDF5DataMeshTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataMeshTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMeshTri3::_numVertices = 8;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMeshTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataMeshTri3::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_vertexFieldScalar[8*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_vertexFieldVector[8*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
   7.7, 8.8,
   9.9, 10.0,
   11.1, 12.2,
-  13.3, 14.4
+  13.3, 14.4,
+  23.3, 24.4,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_vertexFieldTensor[8*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
+  4.1, 4.2, 4.3,
+  5.1, 5.2, 5.3,
+  6.1, 6.2, 6.3,
+  7.1, 7.2, 7.3,
+  8.1, 8.2, 8.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_vertexFieldOther[8*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
   7.8, 8.9,
   9.0, 10.1,
   11.2, 12.3,
-  13.4, 14.5
+  13.4, 14.5,
+  15.4, 16.5,
 };
 
-const int pylith::meshio::DataWriterHDF5DataMeshTri3::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataMeshTri3::_numCells = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataMeshTri3::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataMeshTri3::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_cellFieldScalar[3*1] = {
+  2.1, 2.2, 2.3
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_cellFieldVector[3*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_cellField1[] = {
-  2.1, 2.2, 2.3
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_cellFieldTensor[3*3] = {
   1.2, 2.3, 3.4,
   4.5, 5.6, 6.7,
   7.8, 8.9, 9.0
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataMeshTri3::_cellFieldOther[3*2] = {
+  1.2, 2.3,
+  4.5, 5.6,
+  7.8, 8.9,
+};
 
 pylith::meshio::DataWriterHDF5DataMeshTri3::DataWriterHDF5DataMeshTri3(void)
 { // constructor
@@ -108,21 +125,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataMeshTri3::~DataWriterHDF5DataMeshTri3(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataMeshTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataMeshTri3

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,16 +43,19 @@
 const char* pylith::meshio::DataWriterHDF5DataSubMeshHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataSubMeshHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataSubMeshHex8::_numVertices = 12;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataSubMeshHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterHDF5DataSubMeshHex8::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_vertexFieldScalar[12*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.8, 12.7, 13.6
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_vertexFieldVector[12*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -66,10 +69,21 @@
   7.9, 8.1, 9.2,
   10.3, 11.4, 12.5,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.8, 12.7, 13.6
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_vertexFieldTensor[12*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_vertexFieldOther[12*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -84,26 +98,30 @@
   11.5, 11.6,
 };
 
-const int pylith::meshio::DataWriterHDF5DataSubMeshHex8::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataSubMeshHex8::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataSubMeshHex8::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataSubMeshHex8::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 3 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_cellFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_cellFieldVector[2*3] = {
   1.1, 2.2, 3.3,
-  4.4, 5.5, 6.6
+  4.4, 5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_cellField1[] = {
-  2.1, 3.2,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_cellFieldTensor[2*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
-  7.8, 8.9, 9.0, 10.1, 11.2, 12.3
+  7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshHex8::_cellFieldOther[2*3] = {
+  1.2, 2.3, 3.4,
+  7.8, 8.9, 9.0,
+};
 
 pylith::meshio::DataWriterHDF5DataSubMeshHex8::DataWriterHDF5DataSubMeshHex8(void)
 { // constructor
@@ -119,21 +137,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataSubMeshHex8::~DataWriterHDF5DataSubMeshHex8(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataSubMeshHex8

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshLine2.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshLine2.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshLine2.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,26 +44,25 @@
 const char* pylith::meshio::DataWriterHDF5DataSubMeshLine2::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataSubMeshLine2::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataSubMeshLine2::_numVertices = 5;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataSubMeshLine2::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataSubMeshLine2::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_vertexField0[] = {
-  1.1, 2.2,
-  3.3, 4.4,
-  5.5, 6.6,
-  7.7, 8.8,
-  9.9, 10.0,
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_vertexFieldScalar[5*1] = {
+  1.1,  3.3,  5.5,  7.7,  9.9,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_vertexField1[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_vertexFieldVector[5*1] = {
   2.1, 3.2, 4.3, 5.4, 6.5,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_vertexFieldTensor[5*1] = {
+  3.1, 4.2, 5.3, 6.4, 7.5,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_vertexFieldOther[5*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -71,22 +70,25 @@
   9.0, 10.1,
 };
 
-const int pylith::meshio::DataWriterHDF5DataSubMeshLine2::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataSubMeshLine2::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataSubMeshLine2::_cellFields[] = {
-  { "traction", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataSubMeshLine2::_cellFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "traction", topology::FieldBase::VECTOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
+  { "other", topology::FieldBase::OTHER, 3 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_cellField0[] = {
-  1.1, 2.2,
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_cellFieldScalar[1*1] = {
+  1.1,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_cellField1[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_cellFieldVector[1*1] = {
   2.1,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_cellFieldTensor[1*1] = {
+  3.1,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshLine2::_cellFieldOther[1*3] = {
   1.2, 2.3, 3.4,
 };
 
@@ -104,21 +106,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataSubMeshLine2::~DataWriterHDF5DataSubMeshLine2(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshLine2.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshLine2.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshLine2.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataSubMeshLine2

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -40,16 +40,19 @@
 const char* pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_numVertices = 6;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_vertexFieldScalar[6*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_vertexFieldVector[6*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
@@ -57,10 +60,15 @@
   9.9, 10.0,
   11.1, 12.2,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6,
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_vertexFieldTensor[6*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
+  4.1, 4.2, 4.3,
+  5.1, 5.2, 5.3,
+  6.1, 6.2, 6.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_vertexFieldOther[6*3] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -69,26 +77,30 @@
   11.3, 12.4,
 };
 
-const int pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_cellFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_cellFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_cellField1[] = {
-  2.1, 3.2,
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_cellFieldTensor[2*3] = {
   1.2, 2.3, 3.4,
   4.5, 5.6, 6.7,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshQuad4::_cellFieldOther[2*2] = {
+  1.2, 2.3,
+  4.5, 5.6,
+};
 
 pylith::meshio::DataWriterHDF5DataSubMeshQuad4::DataWriterHDF5DataSubMeshQuad4(void)
 { // constructor
@@ -102,21 +114,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataSubMeshQuad4::~DataWriterHDF5DataSubMeshQuad4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,9 +56,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -67,9 +68,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataSubMeshQuad4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,26 +43,33 @@
 const char* pylith::meshio::DataWriterHDF5DataSubMeshTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataSubMeshTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataSubMeshTet4::_numVertices = 5;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataSubMeshTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterHDF5DataSubMeshTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_vertexFieldScalar[5*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_vertexFieldVector[5*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
   10.0, 11.1, 12.2,
   13.3, 14.4, 15.5,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5,
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_vertexFieldTensor[5*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_vertexFieldOther[5*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -70,26 +77,30 @@
   9.0, 10.1,
 };
 
-const int pylith::meshio::DataWriterHDF5DataSubMeshTet4::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataSubMeshTet4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataSubMeshTet4::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataSubMeshTet4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 4 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_cellFieldScalar[2*1] = {
+  2.1, 3.2
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_cellFieldVector[2*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_cellField1[] = {
-  2.1, 3.2
-};
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_cellFieldTensor[2*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
   7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTet4::_cellFieldOther[2*4] = {
+  1.2, 2.3, 3.4, 4.5,
+  7.8, 8.9, 9.0, 10.1,
+};
 
 pylith::meshio::DataWriterHDF5DataSubMeshTet4::DataWriterHDF5DataSubMeshTet4(void)
 { // constructor
@@ -105,21 +116,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataSubMeshTet4::~DataWriterHDF5DataSubMeshTet4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataSubMeshTet4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,16 +44,19 @@
 const char* pylith::meshio::DataWriterHDF5DataSubMeshTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterHDF5DataSubMeshTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterHDF5DataSubMeshTri3::_numVertices = 8;
 
 const pylith::meshio::DataWriterData::FieldStruct
 pylith::meshio::DataWriterHDF5DataSubMeshTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_vertexFieldScalar[8*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+};
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_vertexFieldVector[8*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
@@ -63,10 +66,17 @@
   13.3, 14.4,
   15.5, 16.6,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_vertexFieldTensor[8*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
+  4.1, 4.2, 4.3,
+  5.1, 5.2, 5.3,
+  6.1, 6.2, 6.3,
+  7.1, 7.2, 7.3,
+  8.1, 8.2, 8.3,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_vertexFieldOther[8*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -77,24 +87,27 @@
   15.6, 16.7,
 };
 
-const int pylith::meshio::DataWriterHDF5DataSubMeshTri3::_numCellFields = 3;
 const int pylith::meshio::DataWriterHDF5DataSubMeshTri3::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterHDF5DataSubMeshTri3::_cellFields[] = {
+pylith::meshio::DataWriterHDF5DataSubMeshTri3::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_cellField1[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_cellFieldScalar[1*1] = {
   2.1,
 };
-const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterHDF5DataSubMeshTri3::_cellFieldOther[1*2] = {
+  1.2, 2.3,
+};
 
 pylith::meshio::DataWriterHDF5DataSubMeshTri3::DataWriterHDF5DataSubMeshTri3(void)
 { // constructor
@@ -110,21 +123,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterHDF5DataSubMeshTri3::~DataWriterHDF5DataSubMeshTri3(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterHDF5DataSubMeshTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterHDF5DataSubMeshTri3

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,16 +44,19 @@
 const char* pylith::meshio::DataWriterVTKDataBCMeshHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataBCMeshHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataBCMeshHex8::_numVertices = 8;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataBCMeshHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataBCMeshHex8::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_vertexFieldScalar[8*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_vertexFieldVector[8*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -63,10 +66,17 @@
   7.8, 8.9, 9.0,
   10.2, 11.3, 12.4,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_vertexFieldTensor[8*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_vertexFieldOther[8*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -77,26 +87,30 @@
   7.9, 8.0,
 };
 
-const int pylith::meshio::DataWriterVTKDataBCMeshHex8::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataBCMeshHex8::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataBCMeshHex8::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataBCMeshHex8::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_cellFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_cellFieldVector[2*3] = {
   1.1, 2.2, 3.3,
-  4.4, 5.5, 6.6
+  4.4, 5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_cellField1[] = {
-  2.1, 3.2,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_cellFieldTensor[2*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
-  7.8, 8.9, 9.0, 10.1, 11.2, 12.3
+  7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshHex8::_cellFieldOther[2*2] = {
+  1.1, 2.2,
+  5.5, 6.6,
+};
 
 pylith::meshio::DataWriterVTKDataBCMeshHex8::DataWriterVTKDataBCMeshHex8(void)
 { // constructor
@@ -112,21 +126,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataBCMeshHex8::~DataWriterVTKDataBCMeshHex8(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataBCMeshHex8

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -40,46 +40,55 @@
 const char* pylith::meshio::DataWriterVTKDataBCMeshQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataBCMeshQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataBCMeshQuad4::_numVertices = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataBCMeshQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataBCMeshQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_vertexFieldScalar[3*1] = {
+  2.1, 3.2, 4.3,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_vertexFieldVector[3*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_vertexField1[] = {
-  2.1, 3.2, 4.3,
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_vertexFieldTensor[3*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_vertexFieldOther[3*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
 };
 
-const int pylith::meshio::DataWriterVTKDataBCMeshQuad4::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataBCMeshQuad4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataBCMeshQuad4::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataBCMeshQuad4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 3 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_cellFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_cellFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_cellField1[] = {
-  2.1, 3.2,
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_cellFieldTensor[2*3] = {
+  1.2, 1.3, 1.4,
+  2.2, 2.3, 2.4,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshQuad4::_cellFieldOther[2*3] = {
   1.2, 2.3, 3.4,
   4.5, 5.6, 6.7,
 };
@@ -96,21 +105,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataBCMeshQuad4::~DataWriterVTKDataBCMeshQuad4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,9 +56,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -67,9 +68,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataBCMeshQuad4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,16 +44,19 @@
 const char* pylith::meshio::DataWriterVTKDataBCMeshTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataBCMeshTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataBCMeshTet4::_numVertices = 6;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataBCMeshTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataBCMeshTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_vertexFieldScalar[6*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_vertexFieldVector[6*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -61,10 +64,15 @@
   13.3, 14.4, 15.5,
   16.6, 17.7, 18.8,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6,
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_vertexFieldTensor[6*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_vertexFieldOther[6*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -73,26 +81,30 @@
   11.2, 12.3,
 };
 
-const int pylith::meshio::DataWriterVTKDataBCMeshTet4::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataBCMeshTet4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataBCMeshTet4::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataBCMeshTet4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 4 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_cellFieldScalar[2*1] = {
+  2.1, 3.2
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_cellFieldVector[2*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_cellField1[] = {
-  2.1, 3.2
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_cellFieldTensor[2*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
   7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTet4::_cellFieldOther[2*4] = {
+  1.2, 2.3, 3.4, 4.5,
+  7.8, 8.9, 9.0, 10.1,
+};
 
 pylith::meshio::DataWriterVTKDataBCMeshTet4::DataWriterVTKDataBCMeshTet4(void)
 { // constructor
@@ -108,21 +120,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataBCMeshTet4::~DataWriterVTKDataBCMeshTet4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataBCMeshTet4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,45 +44,51 @@
 const char* pylith::meshio::DataWriterVTKDataBCMeshTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataBCMeshTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataBCMeshTri3::_numVertices = 2;
-
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataBCMeshTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataBCMeshTri3::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_vertexFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_vertexFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_vertexField1[] = {
-  2.1, 3.2,
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_vertexFieldTensor[2*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_vertexFieldOther[2*2] = {
   1.2, 2.3,
   3.4, 4.5,
 };
 
-const int pylith::meshio::DataWriterVTKDataBCMeshTri3::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataBCMeshTri3::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataBCMeshTri3::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataBCMeshTri3::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataBCMeshTri3::_cellFieldOther[1*2] = {
+  2.1, 2.2,
+};
 
 pylith::meshio::DataWriterVTKDataBCMeshTri3::DataWriterVTKDataBCMeshTri3(void)
 { // constructor
@@ -98,21 +104,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataBCMeshTri3::~DataWriterVTKDataBCMeshTri3(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataBCMeshTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataBCMeshTri3

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,49 +41,58 @@
 const char* pylith::meshio::DataWriterVTKDataFaultMeshHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataFaultMeshHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataFaultMeshHex8::_numVertices = 4;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataFaultMeshHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataFaultMeshHex8::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_vertexFieldScalar[4*1] = {
+  2.1, 3.2, 4.3, 5.4,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_vertexFieldVector[4*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
   10.1, 11.2, 12.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4,
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_vertexFieldTensor[4*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_vertexFieldOther[4*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
   7.8, 8.9,
 };
 
-const int pylith::meshio::DataWriterVTKDataFaultMeshHex8::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataFaultMeshHex8::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
 pylith::meshio::DataWriterVTKDataFaultMeshHex8::_cellFields[] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 3 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_cellFieldVector[1*3] = {
   1.1, 2.2, 3.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_cellFieldTensor[1*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshHex8::_cellFieldOther[1*3] = {
+  1.2, 2.3, 3.4,
+};
 
 pylith::meshio::DataWriterVTKDataFaultMeshHex8::DataWriterVTKDataFaultMeshHex8(void)
 { // constructor
@@ -98,21 +107,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataFaultMeshHex8::~DataWriterVTKDataFaultMeshHex8(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataFaultMeshHex8

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,45 +41,52 @@
 const char* pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_numVertices = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_vertexFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_vertexFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_vertexField1[] = {
-  2.1, 3.2,
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_vertexFieldTensor[2*3] = {
+  1.2, 1.3, 1.4,
+  2.2, 2.3, 2.4,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_vertexFieldOther[2*2] = {
   1.2, 2.3,
   3.4, 4.5,
 };
 
-const int pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshQuad4::_cellFieldOther[1*2] = {
+  1.2, 3.2,
+};
 
 pylith::meshio::DataWriterVTKDataFaultMeshQuad4::DataWriterVTKDataFaultMeshQuad4(void)
 { // constructor
@@ -94,21 +101,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataFaultMeshQuad4::~DataWriterVTKDataFaultMeshQuad4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataFaultMeshQuad4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,47 +41,55 @@
 const char* pylith::meshio::DataWriterVTKDataFaultMeshTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataFaultMeshTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataFaultMeshTet4::_numVertices = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataFaultMeshTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataFaultMeshTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_vertexFieldScalar[3*1] = {
+  2.1, 3.2, 4.3,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_vertexFieldVector[3*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_vertexField1[] = {
-  2.1, 3.2, 4.3,
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_vertexFieldTensor[3*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_vertexFieldOther[3*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
 };
 
-const int pylith::meshio::DataWriterVTKDataFaultMeshTet4::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataFaultMeshTet4::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataFaultMeshTet4::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataFaultMeshTet4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 3 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_cellFieldVector[1*3] = {
   1.1, 2.2, 3.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_cellFieldTensor[1*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTet4::_cellFieldOther[1*3] = {
+  1.2, 2.3, 3.4,
+};
 
 pylith::meshio::DataWriterVTKDataFaultMeshTet4::DataWriterVTKDataFaultMeshTet4(void)
 { // constructor
@@ -96,21 +104,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataFaultMeshTet4::~DataWriterVTKDataFaultMeshTet4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataFaultMeshTet4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,45 +41,52 @@
 const char* pylith::meshio::DataWriterVTKDataFaultMeshTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataFaultMeshTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataFaultMeshTri3::_numVertices = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataFaultMeshTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataFaultMeshTri3::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_vertexFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_vertexFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_vertexField1[] = {
-  2.1, 3.2,
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_vertexFieldTensor[2*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_vertexFieldOther[2*2] = {
   1.2, 2.3,
   3.4, 4.5,
 };
 
-const int pylith::meshio::DataWriterVTKDataFaultMeshTri3::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataFaultMeshTri3::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataFaultMeshTri3::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataFaultMeshTri3::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 4 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataFaultMeshTri3::_cellFieldOther[1*4] = {
+  1.2, 2.3, 3.4, 4.5,
+};
 
 pylith::meshio::DataWriterVTKDataFaultMeshTri3::DataWriterVTKDataFaultMeshTri3(void)
 { // constructor
@@ -94,21 +101,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataFaultMeshTri3::~DataWriterVTKDataFaultMeshTri3(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataFaultMeshTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataFaultMeshTri3

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,16 +45,21 @@
 const char* pylith::meshio::DataWriterVTKDataMatMeshHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataMatMeshHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataMatMeshHex8::_numVertices = 20;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMatMeshHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataMatMeshHex8::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_vertexFieldScalar[20*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+  10.0, 12.1, 11.1, 13.1, 14.1, 15.1, 16.1, 17.1,
+  18.1, 19.1, 20.1, 21.1
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_vertexFieldVector[20*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -76,12 +81,29 @@
   31.1, 32.2, 33.3,
   34.4, 35.5, 36.6
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
-  10.0, 12.1, 11.1, 13.1, 14.1, 15.1, 16.1, 17.1,
-  18.1, 19.1, 20.1, 21.1
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_vertexFieldTensor[20*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6,
+  13.1, 13.2, 13.3, 13.4, 13.5, 13.6,
+  14.1, 14.2, 14.3, 14.4, 14.5, 14.6,
+  15.1, 15.2, 15.3, 15.4, 15.5, 15.6,
+  16.1, 16.2, 16.3, 16.4, 16.5, 16.6,
+  17.1, 17.2, 17.3, 17.4, 17.5, 17.6,
+  18.1, 18.2, 18.3, 18.4, 18.5, 18.6,
+  19.1, 19.2, 19.3, 19.4, 19.5, 19.6,
+  20.1, 20.2, 20.3, 20.4, 20.5, 20.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_vertexFieldOther[20*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -104,24 +126,27 @@
   4.1, 4.2,
 };
 
-const int pylith::meshio::DataWriterVTKDataMatMeshHex8::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataMatMeshHex8::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMatMeshHex8::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataMatMeshHex8::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_cellFieldVector[1*3] = {
   1.1, 2.2, 3.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_cellFieldTensor[1*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshHex8::_cellFieldOther[1*2] = {
+  1.2, 2.3,
+};
 
 pylith::meshio::DataWriterVTKDataMatMeshHex8::DataWriterVTKDataMatMeshHex8(void)
 { // constructor
@@ -138,21 +163,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataMatMeshHex8::~DataWriterVTKDataMatMeshHex8(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,9 +59,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -70,9 +71,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataMatMeshHex8

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshLine2.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshLine2.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshLine2.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,22 +45,25 @@
 const char* pylith::meshio::DataWriterVTKDataMatMeshLine2::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataMatMeshLine2::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataMatMeshLine2::_numVertices = 5;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMatMeshLine2::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 1 },
+pylith::meshio::DataWriterVTKDataMatMeshLine2::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_vertexFieldScalar[5*1] = {
   1.1, 2.2, 3.3, 4.4, 5.5
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_vertexField1[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_vertexFieldVector[5*1] = {
   2.1, 3.2, 4.3, 5.4, 6.5
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_vertexFieldTensor[5*1] = {
+  3.1, 4.2, 5.3, 6.4, 7.5
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_vertexFieldOther[5*2] = {
   1.2, 2.3, 
   3.4, 4.5,
   5.6, 6.7,
@@ -68,24 +71,27 @@
   9.1, 10.2
 };
 
-const int pylith::meshio::DataWriterVTKDataMatMeshLine2::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataMatMeshLine2::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMatMeshLine2::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataMatMeshLine2::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 1 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_cellFieldScalar[1*1] = {
   1.1,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_cellField1[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_cellFieldVector[1*1] = {
   2.1,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_cellFieldTensor[1*1] = {
   1.2,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshLine2::_cellFieldOther[1*2] = {
+  1.2, 2.3,
+};
 
 pylith::meshio::DataWriterVTKDataMatMeshLine2::DataWriterVTKDataMatMeshLine2(void)
 { // constructor
@@ -102,21 +108,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataMatMeshLine2::~DataWriterVTKDataMatMeshLine2(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshLine2.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshLine2.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshLine2.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,9 +59,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -70,9 +71,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataMatMeshLine2

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,16 +41,19 @@
 const char* pylith::meshio::DataWriterVTKDataMatMeshQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataMatMeshQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataMatMeshQuad4::_numVertices = 6;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMatMeshQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataMatMeshQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_vertexFieldScalar[6*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_vertexFieldVector[6*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
@@ -58,10 +61,15 @@
   9.9, 10.1,
   11.2, 12.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_vertexFieldTensor[6*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
+  4.1, 4.2, 4.3,
+  5.1, 5.2, 5.3,
+  6.1, 6.2, 6.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_vertexFieldOther[6*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -70,24 +78,27 @@
   6.5, 5.4
 };
 
-const int pylith::meshio::DataWriterVTKDataMatMeshQuad4::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataMatMeshQuad4::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMatMeshQuad4::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataMatMeshQuad4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshQuad4::_cellFieldOther[1*2] = {
+  1.2, 2.3,
+};
 
 pylith::meshio::DataWriterVTKDataMatMeshQuad4::DataWriterVTKDataMatMeshQuad4(void)
 { // constructor
@@ -102,21 +113,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataMatMeshQuad4::~DataWriterVTKDataMatMeshQuad4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataMatMeshQuad4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,16 +45,19 @@
 const char* pylith::meshio::DataWriterVTKDataMatMeshTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataMatMeshTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataMatMeshTet4::_numVertices = 11;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMatMeshTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataMatMeshTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_vertexFieldScalar[11*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.0, 12.1
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_vertexFieldVector[11*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -67,10 +70,20 @@
   28.8, 29.9, 30.0,
   31.1, 32.2, 33.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.0, 12.1
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_vertexFieldTensor[11*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_vertexFieldOther[11*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -84,26 +97,30 @@
   21.2, 22.3
 };
 
-const int pylith::meshio::DataWriterVTKDataMatMeshTet4::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataMatMeshTet4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMatMeshTet4::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataMatMeshTet4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_cellFieldScalar[2*1] = {
+  2.1, 3.2
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_cellFieldVector[2*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_cellField1[] = {
-  2.1, 3.2
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_cellFieldTensor[2*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
   7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTet4::_cellFieldOther[2*2] = {
+  1.2, 2.3,
+  7.8, 8.9,
+};
 
 pylith::meshio::DataWriterVTKDataMatMeshTet4::DataWriterVTKDataMatMeshTet4(void)
 { // constructor
@@ -120,21 +137,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataMatMeshTet4::~DataWriterVTKDataMatMeshTet4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,9 +59,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -70,9 +71,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataMatMeshTet4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -45,16 +45,19 @@
 const char* pylith::meshio::DataWriterVTKDataMatMeshTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataMatMeshTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataMatMeshTri3::_numVertices = 8;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMatMeshTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataMatMeshTri3::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_vertexFieldScalar[8*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_vertexFieldVector[8*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
@@ -64,10 +67,17 @@
   13.3, 14.4,
   15.5, 16.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_vertexFieldTensor[8*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 3.3,
+  3.1, 3.2, 4.3,
+  4.1, 4.2, 5.3,
+  5.1, 5.2, 6.3,
+  6.1, 6.2, 7.3,
+  7.1, 7.2, 8.3,
+  8.1, 8.2, 9.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_vertexFieldOther[8*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -78,24 +88,27 @@
   15.6, 16.7
 };
 
-const int pylith::meshio::DataWriterVTKDataMatMeshTri3::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataMatMeshTri3::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMatMeshTri3::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataMatMeshTri3::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataMatMeshTri3::_cellFieldOther[1*2] = {
+  1.2, 2.3,
+};
 
 pylith::meshio::DataWriterVTKDataMatMeshTri3::DataWriterVTKDataMatMeshTri3(void)
 { // constructor
@@ -112,21 +125,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataMatMeshTri3::~DataWriterVTKDataMatMeshTri3(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMatMeshTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -59,9 +59,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -70,9 +71,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataMatMeshTri3

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,16 +41,21 @@
 const char* pylith::meshio::DataWriterVTKDataMeshHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataMeshHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataMeshHex8::_numVertices = 20;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMeshHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataMeshHex8::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_vertexFieldScalar[20*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+  10.0, 12.1, 11.1, 13.1, 14.1, 15.1, 16.1, 17.1,
+  18.1, 19.1, 20.1, 21.2
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_vertexFieldVector[20*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -72,12 +77,29 @@
   31.8, 32.9, 33.1,
   34.8, 35.9, 36.1,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
-  10.0, 12.1, 11.1, 13.1, 14.1, 15.1, 16.1, 17.1,
-  18.1, 19.1, 20.1, 21.2
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_vertexFieldTensor[20*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6,
+  13.1, 13.2, 13.3, 13.4, 13.5, 13.6,
+  14.1, 14.2, 14.3, 14.4, 14.5, 14.6,
+  15.1, 15.2, 15.3, 15.4, 15.5, 15.6,
+  16.1, 16.2, 16.3, 16.4, 16.5, 16.6,
+  17.1, 17.2, 17.3, 17.4, 17.5, 17.6,
+  18.1, 18.2, 18.3, 18.4, 18.5, 18.6,
+  19.1, 19.2, 19.3, 19.4, 19.5, 19.6,
+  20.1, 20.2, 20.3, 20.4, 20.5, 20.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_vertexFieldOther[20*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -100,28 +122,33 @@
   9.1, 10.1
 };
 
-const int pylith::meshio::DataWriterVTKDataMeshHex8::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataMeshHex8::_numCells = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMeshHex8::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataMeshHex8::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_cellFieldScalar[3*1] = {
+  2.1, 3.2, 4.3
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_cellFieldVector[3*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_cellField1[] = {
-  2.1, 3.2, 4.3
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_cellFieldTensor[3*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
   1.1, 2.2, 3.3, 4.4, 5.5, 6.6,
   1.3, 2.4, 3.5, 4.6, 5.7, 6.8
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshHex8::_cellFieldOther[3*2] = {
+  1.2, 2.3,
+  1.1, 2.2,
+  1.3, 2.4,
+};
 
 pylith::meshio::DataWriterVTKDataMeshHex8::DataWriterVTKDataMeshHex8(void)
 { // constructor
@@ -136,21 +163,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataMeshHex8::~DataWriterVTKDataMeshHex8(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataMeshHex8

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshLine2.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshLine2.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshLine2.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,47 +41,55 @@
 const char* pylith::meshio::DataWriterVTKDataMeshLine2::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataMeshLine2::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataMeshLine2::_numVertices = 5;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMeshLine2::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 1 },
+pylith::meshio::DataWriterVTKDataMeshLine2::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_vertexField0[] = {
-  1.1, 2.2, 3.3, 4.4, 5.5
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_vertexFieldScalar[5*1] = {
+  1.1, 2.2, 3.3, 4.4, 5.5,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_vertexFieldVector[5*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_vertexFieldTensor[5*1] = {
+  1.2, 1.3, 1.4, 1.5, 1.6,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_vertexFieldOther[5*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
   7.8, 8.9,
-  9.0, 10.1
+  9.0, 10.1,
 };
 
-const int pylith::meshio::DataWriterVTKDataMeshLine2::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataMeshLine2::_numCells = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMeshLine2::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataMeshLine2::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 1 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_cellField0[] = {
-  1.1, 2.2, 3.3
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_cellFieldScalar[3*1] = {
+  1.1, 2.2, 3.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_cellField1[] = {
-  2.1, 2.2, 2.3
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_cellFieldVector[3*1] = {
+  2.1, 2.2, 2.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_cellField2[] = {
-  1.2, 2.3, 3.4
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_cellFieldTensor[3*1] = {
+  1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshLine2::_cellFieldOther[3*2] = {
+  1.2, 2.3,
+  3.4, 2.2,
+  3.3, 4.4,
+};
 
 pylith::meshio::DataWriterVTKDataMeshLine2::DataWriterVTKDataMeshLine2(void)
 { // constructor
@@ -96,21 +104,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataMeshLine2::~DataWriterVTKDataMeshLine2(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshLine2.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshLine2.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshLine2.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataMeshLine2

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -37,16 +37,19 @@
 const char* pylith::meshio::DataWriterVTKDataMeshQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataMeshQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataMeshQuad4::_numVertices = 6;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMeshQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataMeshQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_vertexFieldScalar[6*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_vertexFieldVector[6*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
@@ -54,10 +57,15 @@
   9.9, 10.1,
   11.2, 12.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_vertexFieldTensor[6*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 3.3,
+  3.1, 3.2, 4.3,
+  4.1, 4.2, 5.3,
+  5.1, 5.2, 6.3,
+  6.1, 6.2, 7.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_vertexFieldOther[6*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -66,26 +74,30 @@
   6.5, 5.4
 };
 
-const int pylith::meshio::DataWriterVTKDataMeshQuad4::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataMeshQuad4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMeshQuad4::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataMeshQuad4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_cellFieldScalar[2*1] = {
+  2.1, 2.2,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_cellFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_cellField1[] = {
-  2.1, 2.2,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_cellFieldTensor[2*3] = {
   1.2, 2.3, 3.4,
   4.5, 5.6, 6.7,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshQuad4::_cellFieldOther[2*2] = {
+  1.2, 2.3,
+  4.5, 5.6,
+};
 
 pylith::meshio::DataWriterVTKDataMeshQuad4::DataWriterVTKDataMeshQuad4(void)
 { // constructor
@@ -98,21 +110,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataMeshQuad4::~DataWriterVTKDataMeshQuad4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -55,9 +55,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -66,9 +67,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataMeshQuad4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,16 +41,19 @@
 const char* pylith::meshio::DataWriterVTKDataMeshTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataMeshTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataMeshTet4::_numVertices = 11;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMeshTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataMeshTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_vertexFieldScalar[11*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.0, 12.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_vertexFieldVector[11*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9,
@@ -63,10 +66,20 @@
   28.8, 29.9, 30.0,
   31.1, 32.2, 33.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.0, 12.1,
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_vertexFieldTensor[11*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_vertexFieldOther[11*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
@@ -80,28 +93,33 @@
   21.2, 22.3,
 };
 
-const int pylith::meshio::DataWriterVTKDataMeshTet4::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataMeshTet4::_numCells = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMeshTet4::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataMeshTet4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 4 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_cellFieldScalar[3*1] = {
+  2.1, 3.2, 4.3
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_cellFieldVector[3*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   7.7, 8.8, 9.9
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_cellField1[] = {
-  2.1, 3.2, 4.3
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_cellFieldTensor[3*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
   7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
   13.4, 14.5, 15.6, 16.7, 17.8, 18.9
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTet4::_cellFieldOther[3*4] = {
+  1.2, 2.3, 3.4, 4.5,
+  7.8, 8.9, 9.0, 10.1,
+  13.4, 14.5, 15.6, 16.7,
+};
 
 pylith::meshio::DataWriterVTKDataMeshTet4::DataWriterVTKDataMeshTet4(void)
 { // constructor
@@ -116,21 +134,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataMeshTet4::~DataWriterVTKDataMeshTet4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataMeshTet4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -41,61 +41,74 @@
 const char* pylith::meshio::DataWriterVTKDataMeshTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataMeshTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataMeshTri3::_numVertices = 8;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMeshTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataMeshTri3::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_vertexFieldScalar[8*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_vertexFieldVector[8*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
   7.7, 8.8,
   9.9, 10.0,
   11.1, 12.2,
-  13.3, 14.4,
-  15.5, 16.6,
+  13.3, 14.4
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_vertexField1[] = {
-  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_vertexFieldTensor[8*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
+  4.1, 4.2, 4.3,
+  5.1, 5.2, 5.3,
+  6.1, 6.2, 6.3,
+  7.1, 7.2, 7.3,
+  8.1, 8.2, 8.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_vertexFieldOther[8*2] = {
   1.2, 2.3,
   3.4, 4.5,
   5.6, 6.7,
   7.8, 8.9,
   9.0, 10.1,
   11.2, 12.3,
-  13.4, 14.5,
-  15.6, 16.7,
+  13.4, 14.5
 };
 
-const int pylith::meshio::DataWriterVTKDataMeshTri3::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataMeshTri3::_numCells = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataMeshTri3::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataMeshTri3::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_cellFieldScalar[3*1] = {
+  2.1, 2.2, 2.3
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_cellFieldVector[3*2] = {
   1.1, 2.2,
   3.3, 4.4,
   5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_cellField1[] = {
-  2.1, 2.2, 2.3
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_cellFieldTensor[3*3] = {
   1.2, 2.3, 3.4,
   4.5, 5.6, 6.7,
   7.8, 8.9, 9.0
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataMeshTri3::_cellFieldOther[3*2] = {
+  1.2, 2.3,
+  4.5, 5.6,
+  7.8, 8.9,
+};
 
 pylith::meshio::DataWriterVTKDataMeshTri3::DataWriterVTKDataMeshTri3(void)
 { // constructor
@@ -110,21 +123,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataMeshTri3::~DataWriterVTKDataMeshTri3(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataMeshTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -57,9 +57,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -68,9 +69,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataMeshTri3

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -38,16 +38,38 @@
 const char* pylith::meshio::DataWriterVTKDataPointsHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataPointsHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataPointsHex8::_numVertices = 20;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataPointsHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataPointsHex8::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsHex8::_vertexFieldScalar[20*1] = {
+  2.1, // 0
+  3.2, // 1
+  4.3, // 2 
+  5.4, // 3
+  6.5, // 4
+  7.6, // 5
+  8.7, // 6
+  9.8, // 7
+  10.0, // 8
+  12.1, // 9
+  11.1, // 10
+  13.1, // 11
+  14.1, // 12
+  15.1, // 13
+  16.1, // 14
+  17.1, // 15
+  18.1, // 16
+  19.1, // 17
+  20.1, // 18
+  21.2, // 19
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsHex8::_vertexFieldVector[20*3] = {
   1.1, 2.2, 3.3, // 0
   4.4, 5.5, 6.6, // 1
   7.7, 8.8, 9.9, // 2
@@ -69,29 +91,29 @@
   31.8, 32.9, 33.1, // 18
   34.8, 35.9, 36.1, // 19
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsHex8::_vertexField1[] = {
-  2.1, // 0
-  3.2, // 1
-  4.3, // 2 
-  5.4, // 3
-  6.5, // 4
-  7.6, // 5
-  8.7, // 6
-  9.8, // 7
-  10.0, // 8
-  12.1, // 9
-  11.1, // 10
-  13.1, // 11
-  14.1, // 12
-  15.1, // 13
-  16.1, // 14
-  17.1, // 15
-  18.1, // 16
-  19.1, // 17
-  20.1, // 18
-  21.2, // 19
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsHex8::_vertexFieldTensor[20*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6,
+  13.1, 13.2, 13.3, 13.4, 13.5, 13.6,
+  14.1, 14.2, 14.3, 14.4, 14.5, 14.6,
+  15.1, 15.2, 15.3, 15.4, 15.5, 15.6,
+  16.1, 16.2, 16.3, 16.4, 16.5, 16.6,
+  17.1, 17.2, 17.3, 17.4, 17.5, 17.6,
+  18.1, 18.2, 18.3, 18.4, 18.5, 18.6,
+  19.1, 19.2, 19.3, 19.4, 19.5, 19.6,
+  20.1, 20.2, 20.3, 20.4, 20.5, 20.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsHex8::_vertexFieldOther[20*2] = {
   1.2, 2.3, // 0
   3.4, 4.5, // 1
   5.6, 6.7, // 2
@@ -116,7 +138,7 @@
 
 const int pylith::meshio::DataWriterVTKDataPointsHex8::_numPoints = 4;
 const int pylith::meshio::DataWriterVTKDataPointsHex8::_spaceDim = 3;
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsHex8::_points[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsHex8::_points[4*3] = {
   -0.5, 0.0, 0.5,
   -0.00000001, 0.0, 0.0,
   -0.00000001, 0.0, 0.99999999,
@@ -136,13 +158,13 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
   numPoints = _numPoints;
   spaceDim = _spaceDim;

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,9 +56,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Point information.
@@ -66,7 +67,7 @@
   static const int _numPoints; ///< Number of points.
   static const int _spaceDim; ///< Spatial dimension.
   static const PylithScalar _points[]; ///< Coordinates of points.
-  //@}  
+  //@}
 
 }; // DataWriterVTKDataPointsHex8
 

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -34,16 +34,24 @@
 const char* pylith::meshio::DataWriterVTKDataPointsQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataPointsQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataPointsQuad4::_numVertices = 6;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataPointsQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataPointsQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsQuad4::_vertexFieldScalar[6*1] = {
+  2.1, // 0
+  3.2, // 1
+  4.3, // 2
+  5.4, // 3
+  6.5, // 4
+  7.6, // 5
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsQuad4::_vertexFieldVector[6*2] = {
   1.1, 2.2, // 0
   3.3, 4.4, // 1
   5.5, 6.6, // 2
@@ -51,15 +59,15 @@
   9.9, 10.1, // 4
   11.2, 12.3, // 5
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsQuad4::_vertexField1[] = {
-  2.1, // 0
-  3.2, // 1
-  4.3, // 2
-  5.4, // 3
-  6.5, // 4
-  7.6, // 5
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsQuad4::_vertexFieldTensor[6*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
+  4.1, 4.2, 4.3,
+  5.1, 5.2, 5.3,
+  6.1, 6.2, 6.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsQuad4::_vertexFieldOther[6*2] = {
   1.2, 2.3, // 0
   3.4, 4.5, // 1
   5.6, 6.7, // 2
@@ -70,7 +78,7 @@
 
 const int pylith::meshio::DataWriterVTKDataPointsQuad4::_numPoints = 3;
 const int pylith::meshio::DataWriterVTKDataPointsQuad4::_spaceDim = 2;
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsQuad4::_points[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsQuad4::_points[3*2] = {
  -0.5, 0.0,
   0.00000001, 0.0,
   0.99999999, -0.99999999,
@@ -87,13 +95,13 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
   numPoints = _numPoints;
   spaceDim = _spaceDim;

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -54,9 +54,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Point information.
@@ -64,7 +65,7 @@
   static const int _numPoints; ///< Number of points.
   static const int _spaceDim; ///< Spatial dimension.
   static const PylithScalar _points[]; ///< Coordinates of points.
-  //@}  
+  //@}
 
 }; // DataWriterVTKDataPointsQuad4
 

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -38,16 +38,29 @@
 const char* pylith::meshio::DataWriterVTKDataPointsTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataPointsTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataPointsTet4::_numVertices = 11;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataPointsTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataPointsTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsTet4::_vertexFieldScalar[11*1] = {
+  2.1, // 0
+  3.2, // 1
+  4.3, // 2
+  5.4, // 3
+  6.5, // 4
+  7.6, // 5
+  8.7, // 6
+  9.8,  // 7
+  10.9, // 8
+  11.0, // 9
+  12.1, // 10
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsTet4::_vertexFieldVector[11*3] = {
   1.1, 2.2, 3.3, // 0
   4.4, 5.5, 6.6, // 1
   7.7, 8.8, 9.9, // 2
@@ -60,20 +73,20 @@
   28.8, 29.9, 30.0, // 9
   31.1, 32.2, 33.3, // 10
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsTet4::_vertexField1[] = {
-  2.1, // 0
-  3.2, // 1
-  4.3, // 2
-  5.4, // 3
-  6.5, // 4
-  7.6, // 5
-  8.7, // 6
-  9.8,  // 7
-  10.9, // 8
-  11.0, // 9
-  12.1, // 10
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsTet4::_vertexFieldTensor[11*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsTet4::_vertexFieldOther[11*2] = {
   1.2, 2.3, // 0
   3.4, 4.5, // 1
   5.6, 6.7, // 2
@@ -89,7 +102,7 @@
 
 const int pylith::meshio::DataWriterVTKDataPointsTet4::_numPoints = 4;
 const int pylith::meshio::DataWriterVTKDataPointsTet4::_spaceDim = 3;
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsTet4::_points[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsTet4::_points[4*3] = {
   -0.33333333, 0.0, 0.33333333,
   +0.00000001, 0.0, 0.33333333,
   +0.00000001, 0.0, 0.00000001,
@@ -109,13 +122,13 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
   numPoints = _numPoints;
   spaceDim = _spaceDim;

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,9 +56,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Point information.
@@ -66,7 +67,7 @@
   static const int _numPoints; ///< Number of points.
   static const int _spaceDim; ///< Spatial dimension.
   static const PylithScalar _points[]; ///< Coordinates of points.
-  //@}  
+  //@}
 
 }; // DataWriterVTKDataPointsTet4
 

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -38,16 +38,26 @@
 const char* pylith::meshio::DataWriterVTKDataPointsTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataPointsTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataPointsTri3::_numVertices = 8;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataPointsTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataPointsTri3::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsTri3::_vertexFieldScalar[8*1] = {
+  2.1, // 0
+  3.2, // 1
+  4.3, // 2
+  5.4, // 3
+  6.5, // 4
+  7.6, // 5
+  8.7,
+  9.8
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsTri3::_vertexFieldVector[8*2] = {
   1.1, 2.2, // 0
   3.3, 4.4, // 1
   5.5, 6.6, // 2
@@ -57,17 +67,17 @@
   13.3, 14.4,
   15.5, 16.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsTri3::_vertexField1[] = {
-  2.1, // 0
-  3.2, // 1
-  4.3, // 2
-  5.4, // 3
-  6.5, // 4
-  7.6, // 5
-  8.7,
-  9.8
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsTri3::_vertexFieldTensor[8*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
+  4.1, 4.2, 4.3,
+  5.1, 5.2, 5.3,
+  6.1, 6.2, 6.3,
+  7.1, 7.2, 7.3,
+  8.1, 8.2, 8.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsTri3::_vertexFieldOther[8*2] = {
   1.2, 2.3, // 0
   3.4, 4.5, // 1
   5.6, 6.7, // 2
@@ -80,7 +90,7 @@
 
 const int pylith::meshio::DataWriterVTKDataPointsTri3::_numPoints = 3;
 const int pylith::meshio::DataWriterVTKDataPointsTri3::_spaceDim = 2;
-const PylithScalar pylith::meshio::DataWriterVTKDataPointsTri3::_points[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataPointsTri3::_points[3*2] = {
  -0.3333333, 0.0,
   0.0000001, 0.0,
   0.9999999, 0.0,
@@ -99,13 +109,13 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
   numPoints = _numPoints;
   spaceDim = _spaceDim;

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataPointsTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,9 +56,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Point information.
@@ -66,7 +67,7 @@
   static const int _numPoints; ///< Number of points.
   static const int _spaceDim; ///< Spatial dimension.
   static const PylithScalar _points[]; ///< Coordinates of points.
-  //@}  
+  //@}
 
 }; // DataWriterVTKDataPointsTri3
 

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshHex8.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshHex8.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshHex8.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,16 +43,19 @@
 const char* pylith::meshio::DataWriterVTKDataSubMeshHex8::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataSubMeshHex8::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataSubMeshHex8::_numVertices = 6;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataSubMeshHex8::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataSubMeshHex8::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_vertexFieldScalar[12*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.8, 12.7, 13.6
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_vertexFieldVector[12*3] = {
   7.8, 8.9, 9.0,
   10.2, 11.3, 12.4,
   1.3, 2.4, 3.5,
@@ -60,10 +63,21 @@
   7.9, 8.1, 9.2,
   10.3, 11.4, 12.5,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_vertexField1[] = {
-  8.7, 9.8, 10.9, 11.8, 12.7, 13.6
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_vertexFieldTensor[12*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6,
+  7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_vertexFieldOther[12*2] = {
   5.7, 6.8,
   7.9, 8.0,
   8.1, 8.2,
@@ -72,26 +86,30 @@
   11.5, 11.6,
 };
 
-const int pylith::meshio::DataWriterVTKDataSubMeshHex8::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataSubMeshHex8::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataSubMeshHex8::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataSubMeshHex8::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::TENSOR, 3 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_cellFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_cellFieldVector[2*3] = {
   1.1, 2.2, 3.3,
-  4.4, 5.5, 6.6
+  4.4, 5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_cellField1[] = {
-  2.1, 3.2,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_cellFieldTensor[2*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
-  7.8, 8.9, 9.0, 10.1, 11.2, 12.3
+  7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshHex8::_cellFieldOther[2*3] = {
+  1.2, 2.3, 3.4,
+  7.8, 8.9, 9.0,
+};
 
 pylith::meshio::DataWriterVTKDataSubMeshHex8::DataWriterVTKDataSubMeshHex8(void)
 { // constructor
@@ -107,21 +125,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataSubMeshHex8::~DataWriterVTKDataSubMeshHex8(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshHex8.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshHex8.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshHex8.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataSubMeshHex8

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshLine2.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshLine2.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshLine2.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,41 +44,47 @@
 const char* pylith::meshio::DataWriterVTKDataSubMeshLine2::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataSubMeshLine2::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataSubMeshLine2::_numVertices = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataSubMeshLine2::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataSubMeshLine2::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_vertexField0[] = {
-  1.1, 2.2,
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_vertexFieldScalar[5*1] = {
+  1.1,  3.3,  5.5,  7.7,  9.9,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_vertexField1[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_vertexFieldVector[5*1] = {
   2.1
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_vertexFieldTensor[5*1] = {
+  3.1, 4.2, 5.3, 6.4, 7.5,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_vertexFieldOther[5*2] = {
   1.2, 2.3,
 };
 
-const int pylith::meshio::DataWriterVTKDataSubMeshLine2::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataSubMeshLine2::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataSubMeshLine2::_cellFields[] = {
-  { "traction", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataSubMeshLine2::_cellFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "traction", topology::FieldBase::VECTOR, 1 },
+  { "stress", topology::FieldBase::TENSOR, 1 },
+  { "other", topology::FieldBase::OTHER, 3 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_cellField0[] = {
-  1.1, 2.2,
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_cellFieldScalar[1*1] = {
+  1.1,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_cellField1[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_cellFieldVector[1*1] = {
   2.1,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_cellFieldTensor[1*1] = {
+  3.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshLine2::_cellFieldOther[1*3] = {
   1.2, 2.3, 3.4,
 };
 
@@ -96,21 +102,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataSubMeshLine2::~DataWriterVTKDataSubMeshLine2(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshLine2.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshLine2.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshLine2.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataSubMeshLine2

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshQuad4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshQuad4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshQuad4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -40,49 +40,61 @@
 const char* pylith::meshio::DataWriterVTKDataSubMeshQuad4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataSubMeshQuad4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataSubMeshQuad4::_numVertices = 3;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataSubMeshQuad4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
+pylith::meshio::DataWriterVTKDataSubMeshQuad4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_vertexFieldScalar[6*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_vertexFieldVector[6*2] = {
   1.1, 2.2,
   5.5, 6.6,
   9.9, 10.0,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_vertexField1[] = {
-  2.1, 4.3, 6.5,
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_vertexFieldTensor[6*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
+  4.1, 4.2, 4.3,
+  5.1, 5.2, 5.3,
+  6.1, 6.2, 6.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_vertexFieldOther[6*3] = {
   1.2, 2.3,
   5.6, 6.7,
   9.1, 10.2,
 };
 
-const int pylith::meshio::DataWriterVTKDataSubMeshQuad4::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataSubMeshQuad4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataSubMeshQuad4::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataSubMeshQuad4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_cellFieldScalar[2*1] = {
+  2.1, 3.2,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_cellFieldVector[2*2] = {
   1.1, 2.2,
   3.3, 4.4,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_cellField1[] = {
-  2.1, 3.2,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_cellFieldTensor[2*3] = {
   1.2, 2.3, 3.4,
   4.5, 5.6, 6.7,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshQuad4::_cellFieldOther[2*2] = {
+  1.2, 2.3,
+  4.5, 5.6,
+};
 
 pylith::meshio::DataWriterVTKDataSubMeshQuad4::DataWriterVTKDataSubMeshQuad4(void)
 { // constructor
@@ -96,21 +108,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataSubMeshQuad4::~DataWriterVTKDataSubMeshQuad4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshQuad4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshQuad4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshQuad4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -56,9 +56,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -67,9 +68,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataSubMeshQuad4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTet4.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTet4.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTet4.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -43,51 +43,62 @@
 const char* pylith::meshio::DataWriterVTKDataSubMeshTet4::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataSubMeshTet4::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataSubMeshTet4::_numVertices = 4;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataSubMeshTet4::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 3 },
+pylith::meshio::DataWriterVTKDataSubMeshTet4::_vertexFields[4] = {
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_vertexFieldScalar[5*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_vertexFieldVector[5*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
   10.0, 11.1, 12.2,
   13.3, 14.4, 15.5,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_vertexField1[] = {
-  2.1, 3.2, 5.4, 6.5,
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_vertexFieldTensor[5*6] = {
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6,
+  3.1, 3.2, 3.3, 3.4, 3.5, 3.6,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_vertexFieldOther[5*2] = {
   1.2, 2.3,
   3.4, 4.5,
   7.8, 8.9,
   9.0, 10.1,
 };
 
-const int pylith::meshio::DataWriterVTKDataSubMeshTet4::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataSubMeshTet4::_numCells = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataSubMeshTet4::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataSubMeshTet4::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 3 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 6 },
+  { "stress", topology::FieldBase::TENSOR, 6 },
+  { "other", topology::FieldBase::OTHER, 4 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_cellFieldScalar[2*1] = {
+  2.1, 3.2
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_cellFieldVector[2*3] = {
   1.1, 2.2, 3.3,
   4.4, 5.5, 6.6,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_cellField1[] = {
-  2.1, 3.2
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_cellFieldTensor[2*6] = {
   1.2, 2.3, 3.4, 4.5, 5.6, 6.7,
   7.8, 8.9, 9.0, 10.1, 11.2, 12.3,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTet4::_cellFieldOther[2*4] = {
+  1.2, 2.3, 3.4, 4.5,
+  7.8, 8.9, 9.0, 10.1,
+};
 
 pylith::meshio::DataWriterVTKDataSubMeshTet4::DataWriterVTKDataSubMeshTet4(void)
 { // constructor
@@ -103,21 +114,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
-  assert(3 == numVertexFields);
   numVertices = _numVertices;
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
-  assert(3 == numCellFields);
   numCells = _numCells;
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataSubMeshTet4::~DataWriterVTKDataSubMeshTet4(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTet4.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTet4.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTet4.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataSubMeshTet4

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTri3.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTri3.cc	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTri3.cc	2012-10-19 21:28:12 UTC (rev 20857)
@@ -44,45 +44,58 @@
 const char* pylith::meshio::DataWriterVTKDataSubMeshTri3::_timeFormat = 
   "%3.1f";
 
-const int pylith::meshio::DataWriterVTKDataSubMeshTri3::_numVertexFields = 3;
 const int pylith::meshio::DataWriterVTKDataSubMeshTri3::_numVertices = 2;
 
 const pylith::meshio::DataWriterData::FieldStruct
 pylith::meshio::DataWriterVTKDataSubMeshTri3::_vertexFields[] = {
-  { "displacements", topology::FieldBase::VECTOR, 2 },
   { "pressure", topology::FieldBase::SCALAR, 1 },
+  { "displacement", topology::FieldBase::VECTOR, 2 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
   { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_vertexField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_vertexFieldScalar[8*1] = {
+  2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_vertexFieldVector[8*2] = {
   3.3, 4.4,
   7.7, 8.8,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_vertexField1[] = {
-  3.2, 5.4,
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_vertexFieldTensor[8*3] = {
+  1.1, 1.2, 1.3,
+  2.1, 2.2, 2.3,
+  3.1, 3.2, 3.3,
+  4.1, 4.2, 4.3,
+  5.1, 5.2, 5.3,
+  6.1, 6.2, 6.3,
+  7.1, 7.2, 7.3,
+  8.1, 8.2, 8.3,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_vertexField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_vertexFieldOther[8*2] = {
   3.4, 4.5,
   7.8, 8.9,
 };
 
-const int pylith::meshio::DataWriterVTKDataSubMeshTri3::_numCellFields = 3;
 const int pylith::meshio::DataWriterVTKDataSubMeshTri3::_numCells = 1;
 
 const pylith::meshio::DataWriterData::FieldStruct
-pylith::meshio::DataWriterVTKDataSubMeshTri3::_cellFields[] = {
+pylith::meshio::DataWriterVTKDataSubMeshTri3::_cellFields[4] = {
+  { "pressure", topology::FieldBase::SCALAR, 1 },
   { "traction", topology::FieldBase::VECTOR, 2 },
-  { "pressure", topology::FieldBase::SCALAR, 1 },
-  { "other", topology::FieldBase::TENSOR, 3 },
+  { "stress", topology::FieldBase::TENSOR, 3 },
+  { "other", topology::FieldBase::OTHER, 2 },
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_cellField0[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_cellFieldScalar[1*1] = {
+  2.1,
+};
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_cellFieldVector[1*2] = {
   1.1, 2.2,
 };
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_cellField1[] = {
-  2.1,
-};
-const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_cellField2[] = {
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_cellFieldTensor[1*3] = {
   1.2, 2.3, 3.4,
 };
+const PylithScalar pylith::meshio::DataWriterVTKDataSubMeshTri3::_cellFieldOther[1*2] = {
+  1.2, 2.3,
+};
 
 pylith::meshio::DataWriterVTKDataSubMeshTri3::DataWriterVTKDataSubMeshTri3(void)
 { // constructor
@@ -98,21 +111,21 @@
   time = _time;
   timeFormat = const_cast<char*>(_timeFormat);
   
-  numVertexFields = _numVertexFields;
   numVertices = _numVertices;
-  assert(3 == numVertexFields);
+  assert(DataWriterData::numVertexFields == numVertexFields);
   vertexFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_vertexFields);
-  vertexFields[0] = const_cast<PylithScalar*>(_vertexField0);
-  vertexFields[1] = const_cast<PylithScalar*>(_vertexField1);
-  vertexFields[2] = const_cast<PylithScalar*>(_vertexField2);
+  vertexFields[0] = const_cast<PylithScalar*>(_vertexFieldScalar);
+  vertexFields[1] = const_cast<PylithScalar*>(_vertexFieldVector);
+  vertexFields[2] = const_cast<PylithScalar*>(_vertexFieldTensor);
+  vertexFields[3] = const_cast<PylithScalar*>(_vertexFieldOther);
 
-  numCellFields = _numCellFields;
   numCells = _numCells;
-  assert(3 == numCellFields);
+  assert(DataWriterData::numCellFields == numCellFields);
   cellFieldsInfo = const_cast<DataWriterData::FieldStruct*>(_cellFields);
-  cellFields[0] = const_cast<PylithScalar*>(_cellField0);
-  cellFields[1] = const_cast<PylithScalar*>(_cellField1);
-  cellFields[2] = const_cast<PylithScalar*>(_cellField2);
+  cellFields[0] = const_cast<PylithScalar*>(_cellFieldScalar);
+  cellFields[1] = const_cast<PylithScalar*>(_cellFieldVector);
+  cellFields[2] = const_cast<PylithScalar*>(_cellFieldTensor);
+  cellFields[3] = const_cast<PylithScalar*>(_cellFieldOther);
 } // constructor
 
 pylith::meshio::DataWriterVTKDataSubMeshTri3::~DataWriterVTKDataSubMeshTri3(void)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTri3.hh
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTri3.hh	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/DataWriterVTKDataSubMeshTri3.hh	2012-10-19 21:28:12 UTC (rev 20857)
@@ -58,9 +58,10 @@
   static const int _numVertices; ///< Number of vertices.
   static const FieldStruct _vertexFields[]; ///< Array of vertex fields.
 
-  static const PylithScalar _vertexField0[]; ///< Values for vertex field 0.
-  static const PylithScalar _vertexField1[]; ///< Values for vertex field 1.
-  static const PylithScalar _vertexField2[]; ///< Values for vertex field 2.
+  static const PylithScalar _vertexFieldScalar[]; ///< Values for scalar vertex field.
+  static const PylithScalar _vertexFieldVector[]; ///< Values for vector vertex field .
+  static const PylithScalar _vertexFieldTensor[]; ///< Values for tensor vertex field.
+  static const PylithScalar _vertexFieldOther[]; ///< Values for other vertex field.
   //@}
 
   /// @name Cell field information.
@@ -69,9 +70,10 @@
   static const int _numCells; ///< Number of cells.
   static const FieldStruct _cellFields[]; ///< Array of cell fields.
 
-  static const PylithScalar _cellField0[]; ///< Values for cell field 0.
-  static const PylithScalar _cellField1[]; ///< Values for cell field 1.
-  static const PylithScalar _cellField2[]; ///< Values for cell field 2.
+  static const PylithScalar _cellFieldScalar[]; ///< Values for scalar cell field.
+  static const PylithScalar _cellFieldVector[]; ///< Values for vector cell field.
+  static const PylithScalar _cellFieldTensor[]; ///< Values for tensor cell field.
+  static const PylithScalar _cellFieldOther[]; ///< Values for other cell field.
   //@}
 
 }; // DataWriterVTKDataSubMeshTri3

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/Makefile.am	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/Makefile.am	2012-10-19 21:28:12 UTC (rev 20857)
@@ -124,7 +124,9 @@
 	tri3_vertex.xmf \
 	quad4.h5 \
 	quad4_cell.h5 \
+	quad4_cell.xmf \
 	quad4_vertex.h5 \
+	quad4_vertex.xmf \
 	tet4.h5 \
 	tet4_cell.h5 \
 	tet4_cell.xmf \
@@ -132,7 +134,9 @@
 	tet4_vertex.xmf \
 	hex8.h5 \
 	hex8_cell.h5 \
+	hex8_cell.xmf \
 	hex8_vertex.h5 \
+	hex8_vertex.xmf \
 	line2_mat.h5 \
 	line2_mat_vertex.h5 \
 	line2_mat_cell.h5 \

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -18,14 +18,18 @@
 9
 9
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
-SCALARS other double 6
+VECTORS traction double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+SCALARS stress double 6
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00 5.600000e+00 6.700000e+00
 7.800000e+00 8.900000e+00 9.000000e+00 1.010000e+01 1.120000e+01 1.230000e+01
+SCALARS other double 2
+LOOKUP_TABLE default
+1.100000e+00 2.200000e+00
+5.500000e+00 6.600000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_bc_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -18,15 +18,6 @@
 9
 9
 POINT_DATA 8
-VECTORS displacements double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
-7.700000e+00 8.800000e+00 9.900000e+00
-1.010000e+01 1.120000e+01 1.230000e+01
-1.200000e+00 2.300000e+00 3.400000e+00
-4.500000e+00 5.600000e+00 6.700000e+00
-7.800000e+00 8.900000e+00 9.000000e+00
-1.020000e+01 1.130000e+01 1.240000e+01
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
@@ -37,6 +28,25 @@
 7.600000e+00
 8.700000e+00
 9.800000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+7.700000e+00 8.800000e+00 9.900000e+00
+1.010000e+01 1.120000e+01 1.230000e+01
+1.200000e+00 2.300000e+00 3.400000e+00
+4.500000e+00 5.600000e+00 6.700000e+00
+7.800000e+00 8.900000e+00 9.000000e+00
+1.020000e+01 1.130000e+01 1.240000e+01
+SCALARS stress double 6
+LOOKUP_TABLE default
+1.100000e+00 1.200000e+00 1.300000e+00 1.400000e+00 1.500000e+00 1.600000e+00
+2.100000e+00 2.200000e+00 2.300000e+00 2.400000e+00 2.500000e+00 2.600000e+00
+3.100000e+00 3.200000e+00 3.300000e+00 3.400000e+00 3.500000e+00 3.600000e+00
+4.100000e+00 4.200000e+00 4.300000e+00 4.400000e+00 4.500000e+00 4.600000e+00
+5.100000e+00 5.200000e+00 5.300000e+00 5.400000e+00 5.500000e+00 5.600000e+00
+6.100000e+00 6.200000e+00 6.300000e+00 6.400000e+00 6.500000e+00 6.600000e+00
+7.100000e+00 7.200000e+00 7.300000e+00 7.400000e+00 7.500000e+00 7.600000e+00
+8.100000e+00 8.200000e+00 8.300000e+00 8.400000e+00 8.500000e+00 8.600000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell.h5
===================================================================
(Binary files differ)

Copied: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell.xmf (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/unittests/libtests/meshio/data/hex8_cell.xmf)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell.xmf	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell.xmf	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,256 @@
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" [
+<!ENTITY HeavyData "hex8_cell.h5">
+]>
+
+<Xdmf>
+  <Domain Name="domain">
+    <DataItem Name="cells"
+	      ItemType="Uniform"
+	      Format="HDF"
+	      NumberType="Float" Precision="8"
+	      Dimensions="2 8">
+      &HeavyData;:/topology/cells
+    </DataItem>
+    <DataItem Name="vertices"
+	      Format="HDF"
+	      Dimensions="16 3">
+      &HeavyData;:/geometry/vertices
+    </DataItem>
+    <!-- ============================================================ -->
+    <Grid Name="domain" GridType="Uniform">
+	<Topology
+	   TopologyType="Hexahedron"
+	   NumberOfElements="2">
+	  <DataItem Reference="XML">
+	    /Xdmf/Domain/DataItem[@Name="cells"]
+	  </DataItem>
+	</Topology>
+	<Geometry GeometryType="XYZ">
+	  <DataItem Reference="XML">
+	    /Xdmf/Domain/DataItem[@Name="vertices"]
+	  </DataItem>
+	</Geometry>
+	<Attribute
+	   Name="other_0"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 2"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="other_1"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 2"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="pressure"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 1"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/pressure
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xx"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yy"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_zz"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 2
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xy"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 3
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yz"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 4
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xz"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 5
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="traction"
+	   Type="Vector"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 3"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 2 3
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 3"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/traction
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+    </Grid>
+  </Domain>
+</Xdmf>

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -26,14 +26,18 @@
 12
 12
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
-SCALARS other double 6
+VECTORS traction double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+SCALARS stress double 6
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00 5.600000e+00 6.700000e+00
 1.100000e+00 2.200000e+00 3.300000e+00 4.400000e+00 5.500000e+00 6.600000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00
+1.100000e+00 2.200000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -12,11 +12,13 @@
 CELL_TYPES 1
 9
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 2.200000e+00 3.300000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
-SCALARS other double 6
+VECTORS traction double
+1.100000e+00 2.200000e+00 3.300000e+00
+SCALARS stress double 6
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00 5.600000e+00 6.700000e+00
+VECTORS other double
+1.200000e+00 2.300000e+00 3.400000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_fault_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -12,17 +12,23 @@
 CELL_TYPES 1
 9
 POINT_DATA 4
-VECTORS displacements double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
-7.700000e+00 8.800000e+00 9.900000e+00
-1.010000e+01 1.120000e+01 1.230000e+01
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
 4.300000e+00
 5.400000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+7.700000e+00 8.800000e+00 9.900000e+00
+1.010000e+01 1.120000e+01 1.230000e+01
+SCALARS stress double 6
+LOOKUP_TABLE default
+1.100000e+00 1.200000e+00 1.300000e+00 1.400000e+00 1.500000e+00 1.600000e+00
+2.100000e+00 2.200000e+00 2.300000e+00 2.400000e+00 2.500000e+00 2.600000e+00
+3.100000e+00 3.200000e+00 3.300000e+00 3.400000e+00 3.500000e+00 3.600000e+00
+4.100000e+00 4.200000e+00 4.300000e+00 4.400000e+00 4.500000e+00 4.600000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -24,11 +24,14 @@
 CELL_TYPES 1
 12
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 2.200000e+00 3.300000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
-SCALARS other double 6
+VECTORS traction double
+1.100000e+00 2.200000e+00 3.300000e+00
+SCALARS stress double 6
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00 5.600000e+00 6.700000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_mat_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -24,23 +24,6 @@
 CELL_TYPES 1
 12
 POINT_DATA 16
-VECTORS displacements double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
-7.700000e+00 8.800000e+00 9.900000e+00
-1.010000e+01 1.120000e+01 1.230000e+01
-1.200000e+00 2.300000e+00 3.400000e+00
-4.500000e+00 5.600000e+00 6.700000e+00
-7.800000e+00 8.900000e+00 9.000000e+00
-1.020000e+01 1.130000e+01 1.240000e+01
-1.300000e+00 2.400000e+00 3.500000e+00
-4.600000e+00 5.700000e+00 6.800000e+00
-7.900000e+00 8.000000e+00 9.100000e+00
-1.020000e+01 1.130000e+01 1.240000e+01
-1.350000e+01 1.460000e+01 1.570000e+01
-1.680000e+01 1.790000e+01 1.810000e+01
-1.920000e+01 2.030000e+01 2.140000e+01
-2.250000e+01 2.360000e+01 2.470000e+01
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
@@ -59,6 +42,41 @@
 1.510000e+01
 1.610000e+01
 1.710000e+01
+VECTORS displacement double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+7.700000e+00 8.800000e+00 9.900000e+00
+1.010000e+01 1.120000e+01 1.230000e+01
+1.200000e+00 2.300000e+00 3.400000e+00
+4.500000e+00 5.600000e+00 6.700000e+00
+7.800000e+00 8.900000e+00 9.000000e+00
+1.020000e+01 1.130000e+01 1.240000e+01
+1.300000e+00 2.400000e+00 3.500000e+00
+4.600000e+00 5.700000e+00 6.800000e+00
+7.900000e+00 8.000000e+00 9.100000e+00
+1.020000e+01 1.130000e+01 1.240000e+01
+1.350000e+01 1.460000e+01 1.570000e+01
+1.680000e+01 1.790000e+01 1.810000e+01
+1.920000e+01 2.030000e+01 2.140000e+01
+2.250000e+01 2.360000e+01 2.470000e+01
+SCALARS stress double 6
+LOOKUP_TABLE default
+1.100000e+00 1.200000e+00 1.300000e+00 1.400000e+00 1.500000e+00 1.600000e+00
+2.100000e+00 2.200000e+00 2.300000e+00 2.400000e+00 2.500000e+00 2.600000e+00
+3.100000e+00 3.200000e+00 3.300000e+00 3.400000e+00 3.500000e+00 3.600000e+00
+4.100000e+00 4.200000e+00 4.300000e+00 4.400000e+00 4.500000e+00 4.600000e+00
+5.100000e+00 5.200000e+00 5.300000e+00 5.400000e+00 5.500000e+00 5.600000e+00
+6.100000e+00 6.200000e+00 6.300000e+00 6.400000e+00 6.500000e+00 6.600000e+00
+7.100000e+00 7.200000e+00 7.300000e+00 7.400000e+00 7.500000e+00 7.600000e+00
+8.100000e+00 8.200000e+00 8.300000e+00 8.400000e+00 8.500000e+00 8.600000e+00
+9.100000e+00 9.200000e+00 9.300000e+00 9.400000e+00 9.500000e+00 9.600000e+00
+1.010000e+01 1.020000e+01 1.030000e+01 1.040000e+01 1.050000e+01 1.060000e+01
+1.110000e+01 1.120000e+01 1.130000e+01 1.140000e+01 1.150000e+01 1.160000e+01
+1.210000e+01 1.220000e+01 1.230000e+01 1.240000e+01 1.250000e+01 1.260000e+01
+1.310000e+01 1.320000e+01 1.330000e+01 1.340000e+01 1.350000e+01 1.360000e+01
+1.410000e+01 1.420000e+01 1.430000e+01 1.440000e+01 1.450000e+01 1.460000e+01
+1.510000e+01 1.520000e+01 1.530000e+01 1.540000e+01 1.550000e+01 1.560000e+01
+1.610000e+01 1.620000e+01 1.630000e+01 1.640000e+01 1.650000e+01 1.660000e+01
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_points_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_points_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_points_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -18,17 +18,23 @@
 1
 1
 POINT_DATA 4
-VECTORS displacements double
-5.937500e+00 7.037500e+00 7.950000e+00
-5.925000e+00 7.025000e+00 8.125000e+00
-2.950000e+00 4.050000e+00 5.150000e+00
-4.500000e+00 5.600000e+00 6.700000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 8.550000e+00
 7.950000e+00
 1.105000e+01
 7.600000e+00
+VECTORS displacement double
+5.937500e+00 7.037500e+00 7.950000e+00
+5.925000e+00 7.025000e+00 8.125000e+00
+2.950000e+00 4.050000e+00 5.150000e+00
+4.500000e+00 5.600000e+00 6.700000e+00
+SCALARS stress double 6
+LOOKUP_TABLE default
+7.100000e+00 7.200000e+00 7.300000e+00 7.400000e+00 7.500000e+00 7.600000e+00
+6.600000e+00 6.700000e+00 6.800000e+00 6.900000e+00 7.000000e+00 7.100000e+00
+9.600000e+00 9.700000e+00 9.800000e+00 9.900000e+00 1.000000e+01 1.010000e+01
+6.100000e+00 6.200000e+00 6.300000e+00 6.400000e+00 6.500000e+00 6.600000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 4.575000e+00 5.487500e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -16,14 +16,17 @@
 9
 9
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
-SCALARS other double 6
+VECTORS traction double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+SCALARS stress double 6
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00 5.600000e+00 6.700000e+00
 7.800000e+00 8.900000e+00 9.000000e+00 1.010000e+01 1.120000e+01 1.230000e+01
+VECTORS other double
+1.200000e+00 2.300000e+00 3.400000e+00
+7.800000e+00 8.900000e+00 9.000000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_surf_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -16,13 +16,6 @@
 9
 9
 POINT_DATA 6
-VECTORS displacements double
-7.800000e+00 8.900000e+00 9.000000e+00
-1.020000e+01 1.130000e+01 1.240000e+01
-1.300000e+00 2.400000e+00 3.500000e+00
-4.600000e+00 5.700000e+00 6.800000e+00
-7.900000e+00 8.100000e+00 9.200000e+00
-1.030000e+01 1.140000e+01 1.250000e+01
 SCALARS pressure double 1
 LOOKUP_TABLE default
 8.700000e+00
@@ -31,6 +24,21 @@
 1.180000e+01
 1.270000e+01
 1.360000e+01
+VECTORS displacement double
+7.800000e+00 8.900000e+00 9.000000e+00
+1.020000e+01 1.130000e+01 1.240000e+01
+1.300000e+00 2.400000e+00 3.500000e+00
+4.600000e+00 5.700000e+00 6.800000e+00
+7.900000e+00 8.100000e+00 9.200000e+00
+1.030000e+01 1.140000e+01 1.250000e+01
+SCALARS stress double 6
+LOOKUP_TABLE default
+7.100000e+00 7.200000e+00 7.300000e+00 7.400000e+00 7.500000e+00 7.600000e+00
+8.100000e+00 8.200000e+00 8.300000e+00 8.400000e+00 8.500000e+00 8.600000e+00
+9.100000e+00 9.200000e+00 9.300000e+00 9.400000e+00 9.500000e+00 9.600000e+00
+1.010000e+01 1.020000e+01 1.030000e+01 1.040000e+01 1.050000e+01 1.060000e+01
+1.110000e+01 1.120000e+01 1.130000e+01 1.140000e+01 1.150000e+01 1.160000e+01
+1.210000e+01 1.220000e+01 1.230000e+01 1.240000e+01 1.250000e+01 1.260000e+01
 SCALARS other double 2
 LOOKUP_TABLE default
 5.700000e+00 6.800000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex.h5
===================================================================
(Binary files differ)

Copied: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex.xmf (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/unittests/libtests/meshio/data/hex8_vertex.xmf)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex.xmf	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex.xmf	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,256 @@
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" [
+<!ENTITY HeavyData "hex8_vertex.h5">
+]>
+
+<Xdmf>
+  <Domain Name="domain">
+    <DataItem Name="cells"
+	      ItemType="Uniform"
+	      Format="HDF"
+	      NumberType="Float" Precision="8"
+	      Dimensions="2 8">
+      &HeavyData;:/topology/cells
+    </DataItem>
+    <DataItem Name="vertices"
+	      Format="HDF"
+	      Dimensions="16 3">
+      &HeavyData;:/geometry/vertices
+    </DataItem>
+    <!-- ============================================================ -->
+    <Grid Name="domain" GridType="Uniform">
+	<Topology
+	   TopologyType="Hexahedron"
+	   NumberOfElements="2">
+	  <DataItem Reference="XML">
+	    /Xdmf/Domain/DataItem[@Name="cells"]
+	  </DataItem>
+	</Topology>
+	<Geometry GeometryType="XYZ">
+	  <DataItem Reference="XML">
+	    /Xdmf/Domain/DataItem[@Name="vertices"]
+	  </DataItem>
+	</Geometry>
+	<Attribute
+	   Name="displacement"
+	   Type="Vector"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 16 3"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 16 3
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 16 3"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/displacement
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="other_0"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 16 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 16 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 16 2"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="other_1"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 16 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 16 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 16 2"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="pressure"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 16 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 16 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 16 1"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/pressure
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xx"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 16 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 16 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 16 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yy"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 16 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 16 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 16 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_zz"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 16 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 2
+              1 1 1
+              1 16 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 16 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xy"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 16 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 3
+              1 1 1
+              1 16 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 16 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yz"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 16 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 4
+              1 1 1
+              1 16 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 16 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xz"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 16 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 5
+              1 1 1
+              1 16 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 16 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+    </Grid>
+  </Domain>
+</Xdmf>

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/hex8_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -26,23 +26,6 @@
 12
 12
 POINT_DATA 16
-VECTORS displacements double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
-7.700000e+00 8.800000e+00 9.900000e+00
-1.010000e+01 1.120000e+01 1.230000e+01
-1.200000e+00 2.300000e+00 3.400000e+00
-4.500000e+00 5.600000e+00 6.700000e+00
-7.800000e+00 8.900000e+00 9.000000e+00
-1.020000e+01 1.130000e+01 1.240000e+01
-1.300000e+00 2.400000e+00 3.500000e+00
-4.600000e+00 5.700000e+00 6.800000e+00
-7.900000e+00 8.000000e+00 9.100000e+00
-1.020000e+01 1.130000e+01 1.240000e+01
-1.350000e+01 1.460000e+01 1.570000e+01
-1.680000e+01 1.790000e+01 1.810000e+01
-1.920000e+01 2.030000e+01 2.140000e+01
-2.250000e+01 2.360000e+01 2.470000e+01
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
@@ -61,6 +44,41 @@
 1.510000e+01
 1.610000e+01
 1.710000e+01
+VECTORS displacement double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+7.700000e+00 8.800000e+00 9.900000e+00
+1.010000e+01 1.120000e+01 1.230000e+01
+1.200000e+00 2.300000e+00 3.400000e+00
+4.500000e+00 5.600000e+00 6.700000e+00
+7.800000e+00 8.900000e+00 9.000000e+00
+1.020000e+01 1.130000e+01 1.240000e+01
+1.300000e+00 2.400000e+00 3.500000e+00
+4.600000e+00 5.700000e+00 6.800000e+00
+7.900000e+00 8.000000e+00 9.100000e+00
+1.020000e+01 1.130000e+01 1.240000e+01
+1.350000e+01 1.460000e+01 1.570000e+01
+1.680000e+01 1.790000e+01 1.810000e+01
+1.920000e+01 2.030000e+01 2.140000e+01
+2.250000e+01 2.360000e+01 2.470000e+01
+SCALARS stress double 6
+LOOKUP_TABLE default
+1.100000e+00 1.200000e+00 1.300000e+00 1.400000e+00 1.500000e+00 1.600000e+00
+2.100000e+00 2.200000e+00 2.300000e+00 2.400000e+00 2.500000e+00 2.600000e+00
+3.100000e+00 3.200000e+00 3.300000e+00 3.400000e+00 3.500000e+00 3.600000e+00
+4.100000e+00 4.200000e+00 4.300000e+00 4.400000e+00 4.500000e+00 4.600000e+00
+5.100000e+00 5.200000e+00 5.300000e+00 5.400000e+00 5.500000e+00 5.600000e+00
+6.100000e+00 6.200000e+00 6.300000e+00 6.400000e+00 6.500000e+00 6.600000e+00
+7.100000e+00 7.200000e+00 7.300000e+00 7.400000e+00 7.500000e+00 7.600000e+00
+8.100000e+00 8.200000e+00 8.300000e+00 8.400000e+00 8.500000e+00 8.600000e+00
+9.100000e+00 9.200000e+00 9.300000e+00 9.400000e+00 9.500000e+00 9.600000e+00
+1.010000e+01 1.020000e+01 1.030000e+01 1.040000e+01 1.050000e+01 1.060000e+01
+1.110000e+01 1.120000e+01 1.130000e+01 1.140000e+01 1.150000e+01 1.160000e+01
+1.210000e+01 1.220000e+01 1.230000e+01 1.240000e+01 1.250000e+01 1.260000e+01
+1.310000e+01 1.320000e+01 1.330000e+01 1.340000e+01 1.350000e+01 1.360000e+01
+1.410000e+01 1.420000e+01 1.430000e+01 1.440000e+01 1.450000e+01 1.460000e+01
+1.510000e+01 1.520000e+01 1.530000e+01 1.540000e+01 1.550000e+01 1.560000e+01
+1.610000e+01 1.620000e+01 1.630000e+01 1.640000e+01 1.650000e+01 1.660000e+01
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -14,14 +14,18 @@
 3
 3
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 0.0 0.0
-2.200000e+00 0.0 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
-2.100000e+00
+1.100000e+00
 2.200000e+00
-SCALARS other double 1
+VECTORS traction double
+2.100000e+00 0.0 0.0
+2.200000e+00 0.0 0.0
+SCALARS stress double 1
 LOOKUP_TABLE default
 1.200000e+00
 2.300000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00
+3.400000e+00 2.200000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -12,11 +12,14 @@
 CELL_TYPES 1
 3
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 0.0 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
-2.100000e+00
-SCALARS other double 1
+1.100000e+00
+VECTORS traction double
+2.100000e+00 0.0 0.0
+SCALARS stress double 1
 LOOKUP_TABLE default
 1.200000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_mat_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -12,17 +12,23 @@
 CELL_TYPES 1
 3
 POINT_DATA 4
-VECTORS displacements double
-1.100000e+00 0.0 0.0
-2.200000e+00 0.0 0.0
-3.300000e+00 0.0 0.0
-4.400000e+00 0.0 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
-2.100000e+00
-3.200000e+00
-4.300000e+00
-5.400000e+00
+1.100000e+00
+2.200000e+00
+3.300000e+00
+4.400000e+00
+VECTORS displacement double
+2.100000e+00 0.0 0.0
+3.200000e+00 0.0 0.0
+4.300000e+00 0.0 0.0
+5.400000e+00 0.0 0.0
+SCALARS stress double 1
+LOOKUP_TABLE default
+3.100000e+00
+4.200000e+00
+5.300000e+00
+6.400000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -9,10 +9,13 @@
 CELL_TYPES 1
 1
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
-2.100000e+00
+1.100000e+00
+VECTORS traction double
+2.100000e+00 0.0 0.0
+SCALARS stress double 1
+LOOKUP_TABLE default
+3.100000e+00
 VECTORS other double
 1.200000e+00 2.300000e+00 3.400000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_surf_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -9,11 +9,14 @@
 CELL_TYPES 1
 1
 POINT_DATA 1
-VECTORS displacements double
-1.100000e+00 2.200000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
-2.100000e+00
+1.100000e+00
+VECTORS displacement double
+2.100000e+00 0.0 0.0
+SCALARS stress double 1
+LOOKUP_TABLE default
+3.100000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/line2_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -14,17 +14,23 @@
 3
 3
 POINT_DATA 4
-VECTORS displacements double
-1.100000e+00 0.0 0.0
-2.200000e+00 0.0 0.0
-3.300000e+00 0.0 0.0
-4.400000e+00 0.0 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
-2.100000e+00
-3.200000e+00
-4.300000e+00
-5.400000e+00
+1.100000e+00
+2.200000e+00
+3.300000e+00
+4.400000e+00
+VECTORS displacement double
+2.100000e+00 0.0 0.0
+3.200000e+00 0.0 0.0
+4.300000e+00 0.0 0.0
+5.400000e+00 0.0 0.0
+SCALARS stress double 1
+LOOKUP_TABLE default
+1.200000e+00
+1.300000e+00
+1.400000e+00
+1.500000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -13,13 +13,16 @@
 3
 3
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
+VECTORS traction double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+VECTORS stress double
+1.200000e+00 1.300000e+00 1.400000e+00
+2.200000e+00 2.300000e+00 2.400000e+00
 VECTORS other double
 1.200000e+00 2.300000e+00 3.400000e+00
 4.500000e+00 5.600000e+00 6.700000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_bc_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -13,15 +13,19 @@
 3
 3
 POINT_DATA 3
-VECTORS displacements double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
-5.500000e+00 6.600000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
 4.300000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+5.500000e+00 6.600000e+00 0.0
+VECTORS stress double
+1.100000e+00 1.200000e+00 1.300000e+00
+2.100000e+00 2.200000e+00 2.300000e+00
+3.100000e+00 3.200000e+00 3.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell.h5
===================================================================
(Binary files differ)

Copied: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell.xmf (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/unittests/libtests/meshio/data/quad4_cell.xmf)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell.xmf	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell.xmf	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,212 @@
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" [
+<!ENTITY HeavyData "quad4_cell.h5">
+]>
+
+<Xdmf>
+  <Domain Name="domain">
+    <DataItem Name="cells"
+	      ItemType="Uniform"
+	      Format="HDF"
+	      NumberType="Float" Precision="8"
+	      Dimensions="2 4">
+      &HeavyData;:/topology/cells
+    </DataItem>
+    <DataItem Name="vertices"
+	      Format="HDF"
+	      Dimensions="6 2">
+      &HeavyData;:/geometry/vertices
+    </DataItem>
+    <!-- ============================================================ -->
+    <Grid Name="domain" GridType="Uniform">
+	<Topology
+	   TopologyType="Quadrilateral"
+	   NumberOfElements="2">
+	  <DataItem Reference="XML">
+	    /Xdmf/Domain/DataItem[@Name="cells"]
+	  </DataItem>
+	</Topology>
+	<Geometry GeometryType="XY">
+	  <DataItem Reference="XML">
+	    /Xdmf/Domain/DataItem[@Name="vertices"]
+	  </DataItem>
+	</Geometry>
+	<Attribute
+	   Name="other_0"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 2"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="other_1"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 2"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="pressure"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 1"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/pressure
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xx"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 3"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yy"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 3"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xy"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 2
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 3"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="traction_x"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 2"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/traction
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="traction_y"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 2"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/traction
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+    </Grid>
+  </Domain>
+</Xdmf>

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -16,13 +16,17 @@
 9
 9
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 2.200000e+00
-VECTORS other double
+VECTORS traction double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+VECTORS stress double
 1.200000e+00 2.300000e+00 3.400000e+00
 4.500000e+00 5.600000e+00 6.700000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00
+4.500000e+00 5.600000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -10,10 +10,13 @@
 CELL_TYPES 1
 3
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
-VECTORS other double
+VECTORS traction double
+1.100000e+00 2.200000e+00 0.0
+VECTORS stress double
 1.200000e+00 2.300000e+00 3.400000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 3.200000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_fault_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -10,13 +10,16 @@
 CELL_TYPES 1
 3
 POINT_DATA 2
-VECTORS displacements double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+VECTORS stress double
+1.200000e+00 1.300000e+00 1.400000e+00
+2.200000e+00 2.300000e+00 2.400000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -14,10 +14,13 @@
 CELL_TYPES 1
 9
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
-VECTORS other double
+VECTORS traction double
+1.100000e+00 2.200000e+00 0.0
+VECTORS stress double
 1.200000e+00 2.300000e+00 3.400000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_mat_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -14,13 +14,6 @@
 CELL_TYPES 1
 9
 POINT_DATA 6
-VECTORS displacements double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
-5.500000e+00 6.600000e+00 0.0
-7.700000e+00 8.800000e+00 0.0
-9.900000e+00 1.010000e+01 0.0
-1.120000e+01 1.230000e+01 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
@@ -29,6 +22,20 @@
 5.400000e+00
 6.500000e+00
 7.600000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+5.500000e+00 6.600000e+00 0.0
+7.700000e+00 8.800000e+00 0.0
+9.900000e+00 1.010000e+01 0.0
+1.120000e+01 1.230000e+01 0.0
+VECTORS stress double
+1.100000e+00 1.200000e+00 1.300000e+00
+2.100000e+00 2.200000e+00 2.300000e+00
+3.100000e+00 3.200000e+00 3.300000e+00
+4.100000e+00 4.200000e+00 4.300000e+00
+5.100000e+00 5.200000e+00 5.300000e+00
+6.100000e+00 6.200000e+00 6.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_points_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_points_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_points_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -15,15 +15,19 @@
 1
 1
 POINT_DATA 3
-VECTORS displacements double
-4.400000e+00 5.500000e+00 0.0
-6.600000e+00 7.700000e+00 0.0
-9.900000e+00 1.010000e+01 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 3.750000e+00
 4.850000e+00
 6.500000e+00
+VECTORS displacement double
+4.400000e+00 5.500000e+00 0.0
+6.600000e+00 7.700000e+00 0.0
+9.900000e+00 1.010000e+01 0.0
+VECTORS stress double
+2.600000e+00 2.700000e+00 2.800000e+00
+3.600000e+00 3.700000e+00 3.800000e+00
+5.100000e+00 5.200000e+00 5.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 4.500000e+00 5.600000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -13,13 +13,17 @@
 3
 3
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
-VECTORS other double
+VECTORS traction double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+VECTORS stress double
 1.200000e+00 2.300000e+00 3.400000e+00
 4.500000e+00 5.600000e+00 6.700000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00
+4.500000e+00 5.600000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_surf_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -13,15 +13,19 @@
 3
 3
 POINT_DATA 3
-VECTORS displacements double
-1.100000e+00 2.200000e+00 0.0
-5.500000e+00 6.600000e+00 0.0
-9.900000e+00 1.000000e+01 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 4.300000e+00
 6.500000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 0.0
+5.500000e+00 6.600000e+00 0.0
+9.900000e+00 1.000000e+01 0.0
+VECTORS stress double
+1.100000e+00 1.200000e+00 1.300000e+00
+3.100000e+00 3.200000e+00 3.300000e+00
+5.100000e+00 5.200000e+00 5.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex.h5
===================================================================
(Binary files differ)

Copied: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex.xmf (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/unittests/libtests/meshio/data/quad4_vertex.xmf)
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex.xmf	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex.xmf	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,212 @@
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" [
+<!ENTITY HeavyData "quad4_vertex.h5">
+]>
+
+<Xdmf>
+  <Domain Name="domain">
+    <DataItem Name="cells"
+	      ItemType="Uniform"
+	      Format="HDF"
+	      NumberType="Float" Precision="8"
+	      Dimensions="2 4">
+      &HeavyData;:/topology/cells
+    </DataItem>
+    <DataItem Name="vertices"
+	      Format="HDF"
+	      Dimensions="6 2">
+      &HeavyData;:/geometry/vertices
+    </DataItem>
+    <!-- ============================================================ -->
+    <Grid Name="domain" GridType="Uniform">
+	<Topology
+	   TopologyType="Quadrilateral"
+	   NumberOfElements="2">
+	  <DataItem Reference="XML">
+	    /Xdmf/Domain/DataItem[@Name="cells"]
+	  </DataItem>
+	</Topology>
+	<Geometry GeometryType="XY">
+	  <DataItem Reference="XML">
+	    /Xdmf/Domain/DataItem[@Name="vertices"]
+	  </DataItem>
+	</Geometry>
+	<Attribute
+	   Name="displacement_x"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 2"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/displacement
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="displacement_y"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 2"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/displacement
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="other_0"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 2"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="other_1"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 2"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="pressure"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 1"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/pressure
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xx"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 3"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yy"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 3"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xy"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 2
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 3"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+    </Grid>
+  </Domain>
+</Xdmf>

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/quad4_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -16,13 +16,6 @@
 9
 9
 POINT_DATA 6
-VECTORS displacements double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
-5.500000e+00 6.600000e+00 0.0
-7.700000e+00 8.800000e+00 0.0
-9.900000e+00 1.010000e+01 0.0
-1.120000e+01 1.230000e+01 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
@@ -31,6 +24,20 @@
 5.400000e+00
 6.500000e+00
 7.600000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+5.500000e+00 6.600000e+00 0.0
+7.700000e+00 8.800000e+00 0.0
+9.900000e+00 1.010000e+01 0.0
+1.120000e+01 1.230000e+01 0.0
+VECTORS stress double
+1.100000e+00 1.200000e+00 1.300000e+00
+2.100000e+00 2.200000e+00 3.300000e+00
+3.100000e+00 3.200000e+00 4.300000e+00
+4.100000e+00 4.200000e+00 5.300000e+00
+5.100000e+00 5.200000e+00 6.300000e+00
+6.100000e+00 6.200000e+00 7.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -16,14 +16,18 @@
 5
 5
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
-SCALARS other double 6
+VECTORS traction double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+SCALARS stress double 6
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00 5.600000e+00 6.700000e+00
 7.800000e+00 8.900000e+00 9.000000e+00 1.010000e+01 1.120000e+01 1.230000e+01
+SCALARS other double 4
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00
+7.800000e+00 8.900000e+00 9.000000e+00 1.010000e+01

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_bc_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -16,13 +16,6 @@
 5
 5
 POINT_DATA 6
-VECTORS displacements double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
-7.700000e+00 8.800000e+00 9.900000e+00
-1.000000e+01 1.110000e+01 1.220000e+01
-1.330000e+01 1.440000e+01 1.550000e+01
-1.660000e+01 1.770000e+01 1.880000e+01
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
@@ -31,6 +24,21 @@
 5.400000e+00
 6.500000e+00
 7.600000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+7.700000e+00 8.800000e+00 9.900000e+00
+1.000000e+01 1.110000e+01 1.220000e+01
+1.330000e+01 1.440000e+01 1.550000e+01
+1.660000e+01 1.770000e+01 1.880000e+01
+SCALARS stress double 6
+LOOKUP_TABLE default
+1.100000e+00 1.200000e+00 1.300000e+00 1.400000e+00 1.500000e+00 1.600000e+00
+2.100000e+00 2.200000e+00 2.300000e+00 2.400000e+00 2.500000e+00 2.600000e+00
+3.100000e+00 3.200000e+00 3.300000e+00 3.400000e+00 3.500000e+00 3.600000e+00
+4.100000e+00 4.200000e+00 4.300000e+00 4.400000e+00 4.500000e+00 4.600000e+00
+5.100000e+00 5.200000e+00 5.300000e+00 5.400000e+00 5.500000e+00 5.600000e+00
+6.100000e+00 6.200000e+00 6.300000e+00 6.400000e+00 6.500000e+00 6.600000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell.xmf
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell.xmf	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell.xmf	2012-10-19 21:28:12 UTC (rev 20857)
@@ -32,28 +32,94 @@
 	  </DataItem>
 	</Geometry>
 	<Attribute
-	   Name="other"
-	   Type="Tensor6"
+	   Name="other_0"
+	   Type="Scalar"
 	   Center="Cell">
           <DataItem ItemType="HyperSlab"
-		    Dimensions="1 2 6"
+		    Dimensions="1 2 1"
 		    Type="HyperSlab">
             <DataItem
 	       Dimensions="3 3"
 	       Format="XML">
               0 0 0
               1 1 1
-              1 2 6
+              1 2 1
 	    </DataItem>
 	    <DataItem
 	       DataType="Float" Precision="8"
-	       Dimensions="1 2 6"
+	       Dimensions="1 2 4"
 	       Format="HDF">
 	      &HeavyData;:/cell_fields/other
 	    </DataItem>
 	  </DataItem>
 	</Attribute>
 	<Attribute
+	   Name="other_1"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 4"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="other_2"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 2
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 4"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="other_3"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 3
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 4"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
 	   Name="pressure"
 	   Type="Scalar"
 	   Center="Cell">
@@ -76,6 +142,138 @@
 	  </DataItem>
 	</Attribute>
 	<Attribute
+	   Name="stress_xx"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yy"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_zz"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 2
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xy"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 3
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yz"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 4
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xz"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 5
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 6"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
 	   Name="traction"
 	   Type="Vector"
 	   Center="Cell">

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -18,14 +18,18 @@
 10
 10
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
-SCALARS other double 6
+VECTORS traction double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+SCALARS stress double 6
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00 5.600000e+00 6.700000e+00
 7.800000e+00 8.900000e+00 9.000000e+00 1.010000e+01 1.120000e+01 1.230000e+01
+SCALARS other double 4
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00
+7.800000e+00 8.900000e+00 9.000000e+00 1.010000e+01

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -11,11 +11,13 @@
 CELL_TYPES 1
 5
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 2.200000e+00 3.300000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
-SCALARS other double 6
+VECTORS traction double
+1.100000e+00 2.200000e+00 3.300000e+00
+SCALARS stress double 6
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00 5.600000e+00 6.700000e+00
+VECTORS other double
+1.200000e+00 2.300000e+00 3.400000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_fault_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -11,15 +11,20 @@
 CELL_TYPES 1
 5
 POINT_DATA 3
-VECTORS displacements double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
-7.700000e+00 8.800000e+00 9.900000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
 4.300000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+7.700000e+00 8.800000e+00 9.900000e+00
+SCALARS stress double 6
+LOOKUP_TABLE default
+1.100000e+00 1.200000e+00 1.300000e+00 1.400000e+00 1.500000e+00 1.600000e+00
+2.100000e+00 2.200000e+00 2.300000e+00 2.400000e+00 2.500000e+00 2.600000e+00
+3.100000e+00 3.200000e+00 3.300000e+00 3.400000e+00 3.500000e+00 3.600000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -18,14 +18,18 @@
 10
 10
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
-SCALARS other double 6
+VECTORS traction double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+SCALARS stress double 6
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00 5.600000e+00 6.700000e+00
 7.800000e+00 8.900000e+00 9.000000e+00 1.010000e+01 1.120000e+01 1.230000e+01
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00
+7.800000e+00 8.900000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_mat_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -18,15 +18,6 @@
 10
 10
 POINT_DATA 8
-VECTORS displacements double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
-7.700000e+00 8.800000e+00 9.900000e+00
-1.000000e+01 1.110000e+01 1.220000e+01
-1.330000e+01 1.440000e+01 1.550000e+01
-1.660000e+01 1.770000e+01 1.880000e+01
-1.990000e+01 2.000000e+01 2.110000e+01
-2.220000e+01 2.330000e+01 2.440000e+01
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
@@ -37,6 +28,25 @@
 7.600000e+00
 8.700000e+00
 9.800000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+7.700000e+00 8.800000e+00 9.900000e+00
+1.000000e+01 1.110000e+01 1.220000e+01
+1.330000e+01 1.440000e+01 1.550000e+01
+1.660000e+01 1.770000e+01 1.880000e+01
+1.990000e+01 2.000000e+01 2.110000e+01
+2.220000e+01 2.330000e+01 2.440000e+01
+SCALARS stress double 6
+LOOKUP_TABLE default
+1.100000e+00 1.200000e+00 1.300000e+00 1.400000e+00 1.500000e+00 1.600000e+00
+2.100000e+00 2.200000e+00 2.300000e+00 2.400000e+00 2.500000e+00 2.600000e+00
+3.100000e+00 3.200000e+00 3.300000e+00 3.400000e+00 3.500000e+00 3.600000e+00
+4.100000e+00 4.200000e+00 4.300000e+00 4.400000e+00 4.500000e+00 4.600000e+00
+5.100000e+00 5.200000e+00 5.300000e+00 5.400000e+00 5.500000e+00 5.600000e+00
+6.100000e+00 6.200000e+00 6.300000e+00 6.400000e+00 6.500000e+00 6.600000e+00
+7.100000e+00 7.200000e+00 7.300000e+00 7.400000e+00 7.500000e+00 7.600000e+00
+8.100000e+00 8.200000e+00 8.300000e+00 8.400000e+00 8.500000e+00 8.600000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_points_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_points_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_points_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -18,17 +18,23 @@
 1
 1
 POINT_DATA 4
-VECTORS displacements double
-1.346667e+01 1.423333e+01 1.533333e+01
-7.366667e+00 8.466667e+00 9.566667e+00
-7.200000e+00 8.300000e+00 9.400000e+00
-1.660000e+01 1.770000e+01 1.880000e+01
 SCALARS pressure double 1
 LOOKUP_TABLE default
 6.500000e+00
 4.300000e+00
 4.300000e+00
 7.600000e+00
+VECTORS displacement double
+1.346667e+01 1.423333e+01 1.533333e+01
+7.366667e+00 8.466667e+00 9.566667e+00
+7.200000e+00 8.300000e+00 9.400000e+00
+1.660000e+01 1.770000e+01 1.880000e+01
+SCALARS stress double 6
+LOOKUP_TABLE default
+5.100000e+00 5.200000e+00 5.300000e+00 5.400000e+00 5.500000e+00 5.600000e+00
+3.100000e+00 3.200000e+00 3.300000e+00 3.400000e+00 3.500000e+00 3.600000e+00
+3.100000e+00 3.200000e+00 3.300000e+00 3.400000e+00 3.500000e+00 3.600000e+00
+6.100000e+00 6.200000e+00 6.300000e+00 6.400000e+00 6.500000e+00 6.600000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 9.333333e+00 1.043333e+01

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -14,14 +14,18 @@
 5
 5
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
-SCALARS other double 6
+VECTORS traction double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+SCALARS stress double 6
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00 5.600000e+00 6.700000e+00
 7.800000e+00 8.900000e+00 9.000000e+00 1.010000e+01 1.120000e+01 1.230000e+01
+SCALARS other double 4
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00
+7.800000e+00 8.900000e+00 9.000000e+00 1.010000e+01

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_surf_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -14,17 +14,23 @@
 5
 5
 POINT_DATA 4
-VECTORS displacements double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
-1.000000e+01 1.110000e+01 1.220000e+01
-1.330000e+01 1.440000e+01 1.550000e+01
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
 5.400000e+00
 6.500000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+1.000000e+01 1.110000e+01 1.220000e+01
+1.330000e+01 1.440000e+01 1.550000e+01
+SCALARS stress double 6
+LOOKUP_TABLE default
+1.100000e+00 1.200000e+00 1.300000e+00 1.400000e+00 1.500000e+00 1.600000e+00
+2.100000e+00 2.200000e+00 2.300000e+00 2.400000e+00 2.500000e+00 2.600000e+00
+4.100000e+00 4.200000e+00 4.300000e+00 4.400000e+00 4.500000e+00 4.600000e+00
+5.100000e+00 5.200000e+00 5.300000e+00 5.400000e+00 5.500000e+00 5.600000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex.xmf
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex.xmf	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex.xmf	2012-10-19 21:28:12 UTC (rev 20857)
@@ -32,7 +32,7 @@
 	  </DataItem>
 	</Geometry>
 	<Attribute
-	   Name="displacements"
+	   Name="displacement"
 	   Type="Vector"
 	   Center="Node">
           <DataItem ItemType="HyperSlab"
@@ -49,23 +49,23 @@
 	       DataType="Float" Precision="8"
 	       Dimensions="1 8 3"
 	       Format="HDF">
-	      &HeavyData;:/vertex_fields/displacements
+	      &HeavyData;:/vertex_fields/displacement
 	    </DataItem>
 	  </DataItem>
 	</Attribute>
 	<Attribute
-	   Name="other"
-	   Type="Matrix"
+	   Name="other_0"
+	   Type="Scalar"
 	   Center="Node">
           <DataItem ItemType="HyperSlab"
-		    Dimensions="1 8 2"
+		    Dimensions="1 8 1"
 		    Type="HyperSlab">
             <DataItem
 	       Dimensions="3 3"
 	       Format="XML">
               0 0 0
               1 1 1
-              1 8 2
+              1 8 1
 	    </DataItem>
 	    <DataItem
 	       DataType="Float" Precision="8"
@@ -76,6 +76,28 @@
 	  </DataItem>
 	</Attribute>
 	<Attribute
+	   Name="other_1"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 8 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 8 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 8 2"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/other
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
 	   Name="pressure"
 	   Type="Scalar"
 	   Center="Node">
@@ -97,6 +119,138 @@
 	    </DataItem>
 	  </DataItem>
 	</Attribute>
+	<Attribute
+	   Name="stress_xx"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 8 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 8 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 8 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yy"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 8 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 8 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 8 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_zz"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 8 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 2
+              1 1 1
+              1 8 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 8 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xy"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 8 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 3
+              1 1 1
+              1 8 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 8 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yz"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 8 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 4
+              1 1 1
+              1 8 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 8 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xz"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 8 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 5
+              1 1 1
+              1 8 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 8 6"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
     </Grid>
   </Domain>
 </Xdmf>

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tet4_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -18,15 +18,6 @@
 10
 10
 POINT_DATA 8
-VECTORS displacements double
-1.100000e+00 2.200000e+00 3.300000e+00
-4.400000e+00 5.500000e+00 6.600000e+00
-7.700000e+00 8.800000e+00 9.900000e+00
-1.000000e+01 1.110000e+01 1.220000e+01
-1.330000e+01 1.440000e+01 1.550000e+01
-1.660000e+01 1.770000e+01 1.880000e+01
-1.990000e+01 2.000000e+01 2.110000e+01
-2.220000e+01 2.330000e+01 2.440000e+01
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
@@ -37,6 +28,25 @@
 7.600000e+00
 8.700000e+00
 9.800000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 3.300000e+00
+4.400000e+00 5.500000e+00 6.600000e+00
+7.700000e+00 8.800000e+00 9.900000e+00
+1.000000e+01 1.110000e+01 1.220000e+01
+1.330000e+01 1.440000e+01 1.550000e+01
+1.660000e+01 1.770000e+01 1.880000e+01
+1.990000e+01 2.000000e+01 2.110000e+01
+2.220000e+01 2.330000e+01 2.440000e+01
+SCALARS stress double 6
+LOOKUP_TABLE default
+1.100000e+00 1.200000e+00 1.300000e+00 1.400000e+00 1.500000e+00 1.600000e+00
+2.100000e+00 2.200000e+00 2.300000e+00 2.400000e+00 2.500000e+00 2.600000e+00
+3.100000e+00 3.200000e+00 3.300000e+00 3.400000e+00 3.500000e+00 3.600000e+00
+4.100000e+00 4.200000e+00 4.300000e+00 4.400000e+00 4.500000e+00 4.600000e+00
+5.100000e+00 5.200000e+00 5.300000e+00 5.400000e+00 5.500000e+00 5.600000e+00
+6.100000e+00 6.200000e+00 6.300000e+00 6.400000e+00 6.500000e+00 6.600000e+00
+7.100000e+00 7.200000e+00 7.300000e+00 7.400000e+00 7.500000e+00 7.600000e+00
+8.100000e+00 8.200000e+00 8.300000e+00 8.400000e+00 8.500000e+00 8.600000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -10,10 +10,13 @@
 CELL_TYPES 1
 3
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
-VECTORS other double
+VECTORS traction double
+1.100000e+00 2.200000e+00 0.0
+VECTORS stress double
 1.200000e+00 2.300000e+00 3.400000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+2.100000e+00 2.200000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_bc_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -10,13 +10,16 @@
 CELL_TYPES 1
 3
 POINT_DATA 2
-VECTORS displacements double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+VECTORS stress double
+1.100000e+00 1.200000e+00 1.300000e+00
+2.100000e+00 2.200000e+00 2.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell.xmf
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell.xmf	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell.xmf	2012-10-19 21:28:12 UTC (rev 20857)
@@ -32,7 +32,7 @@
 	  </DataItem>
 	</Geometry>
 	<Attribute
-	   Name="other_xx"
+	   Name="other_0"
 	   Type="Scalar"
 	   Center="Cell">
           <DataItem ItemType="HyperSlab"
@@ -47,14 +47,14 @@
 	    </DataItem>
 	    <DataItem
 	       DataType="Float" Precision="8"
-	       Dimensions="1 2 3"
+	       Dimensions="1 2 2"
 	       Format="HDF">
 	      &HeavyData;:/cell_fields/other
 	    </DataItem>
 	  </DataItem>
 	</Attribute>
 	<Attribute
-	   Name="other_yy"
+	   Name="other_1"
 	   Type="Scalar"
 	   Center="Cell">
           <DataItem ItemType="HyperSlab"
@@ -69,14 +69,14 @@
 	    </DataItem>
 	    <DataItem
 	       DataType="Float" Precision="8"
-	       Dimensions="1 2 3"
+	       Dimensions="1 2 2"
 	       Format="HDF">
 	      &HeavyData;:/cell_fields/other
 	    </DataItem>
 	  </DataItem>
 	</Attribute>
 	<Attribute
-	   Name="other_xy"
+	   Name="pressure"
 	   Type="Scalar"
 	   Center="Cell">
           <DataItem ItemType="HyperSlab"
@@ -85,20 +85,20 @@
             <DataItem
 	       Dimensions="3 3"
 	       Format="XML">
-              0 0 2
+              0 0 0
               1 1 1
               1 2 1
 	    </DataItem>
 	    <DataItem
 	       DataType="Float" Precision="8"
-	       Dimensions="1 2 3"
+	       Dimensions="1 2 1"
 	       Format="HDF">
-	      &HeavyData;:/cell_fields/other
+	      &HeavyData;:/cell_fields/pressure
 	    </DataItem>
 	  </DataItem>
 	</Attribute>
 	<Attribute
-	   Name="pressure"
+	   Name="stress_xx"
 	   Type="Scalar"
 	   Center="Cell">
           <DataItem ItemType="HyperSlab"
@@ -113,13 +113,57 @@
 	    </DataItem>
 	    <DataItem
 	       DataType="Float" Precision="8"
-	       Dimensions="1 2 1"
+	       Dimensions="1 2 3"
 	       Format="HDF">
-	      &HeavyData;:/cell_fields/pressure
+	      &HeavyData;:/cell_fields/stress
 	    </DataItem>
 	  </DataItem>
 	</Attribute>
 	<Attribute
+	   Name="stress_yy"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 3"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xy"
+	   Type="Scalar"
+	   Center="Cell">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 2 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 2
+              1 1 1
+              1 2 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 2 3"
+	       Format="HDF">
+	      &HeavyData;:/cell_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
 	   Name="traction_x"
 	   Type="Scalar"
 	   Center="Cell">

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -16,13 +16,17 @@
 5
 5
 CELL_DATA 2
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 2.200000e+00
-VECTORS other double
+VECTORS traction double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+VECTORS stress double
 1.200000e+00 2.300000e+00 3.400000e+00
 4.500000e+00 5.600000e+00 6.700000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00
+4.500000e+00 5.600000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -10,10 +10,13 @@
 CELL_TYPES 1
 3
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
-VECTORS other double
+VECTORS traction double
+1.100000e+00 2.200000e+00 0.0
+VECTORS stress double
 1.200000e+00 2.300000e+00 3.400000e+00
+SCALARS other double 4
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00 3.400000e+00 4.500000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_fault_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -10,13 +10,16 @@
 CELL_TYPES 1
 3
 POINT_DATA 2
-VECTORS displacements double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
 3.200000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+VECTORS stress double
+1.100000e+00 1.200000e+00 1.300000e+00
+2.100000e+00 2.200000e+00 2.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -14,10 +14,13 @@
 CELL_TYPES 1
 5
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
-VECTORS other double
+VECTORS traction double
+1.100000e+00 2.200000e+00 0.0
+VECTORS stress double
 1.200000e+00 2.300000e+00 3.400000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_mat_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -14,13 +14,6 @@
 CELL_TYPES 1
 5
 POINT_DATA 6
-VECTORS displacements double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
-5.500000e+00 6.600000e+00 0.0
-7.700000e+00 8.800000e+00 0.0
-9.900000e+00 1.000000e+01 0.0
-1.110000e+01 1.220000e+01 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
@@ -29,6 +22,20 @@
 5.400000e+00
 6.500000e+00
 7.600000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+5.500000e+00 6.600000e+00 0.0
+7.700000e+00 8.800000e+00 0.0
+9.900000e+00 1.000000e+01 0.0
+1.110000e+01 1.220000e+01 0.0
+VECTORS stress double
+1.100000e+00 1.200000e+00 1.300000e+00
+2.100000e+00 2.200000e+00 3.300000e+00
+3.100000e+00 3.200000e+00 4.300000e+00
+4.100000e+00 4.200000e+00 5.300000e+00
+5.100000e+00 5.200000e+00 6.300000e+00
+6.100000e+00 6.200000e+00 7.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_points_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_points_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_points_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -15,15 +15,19 @@
 1
 1
 POINT_DATA 3
-VECTORS displacements double
-7.366667e+00 8.133334e+00 0.0
-4.400000e+00 5.500000e+00 0.0
-7.700000e+00 8.800000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 5.400000e+00
 3.750000e+00
 5.400000e+00
+VECTORS displacement double
+7.366667e+00 8.133334e+00 0.0
+4.400000e+00 5.500000e+00 0.0
+7.700000e+00 8.800000e+00 0.0
+VECTORS stress double
+4.100000e+00 4.200000e+00 4.300000e+00
+2.600000e+00 2.700000e+00 2.800000e+00
+4.100000e+00 4.200000e+00 4.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 7.133334e+00 8.233334e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_cell.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_cell_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_cell_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_cell_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -10,10 +10,13 @@
 CELL_TYPES 1
 3
 CELL_DATA 1
-VECTORS traction double
-1.100000e+00 2.200000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
-VECTORS other double
+VECTORS traction double
+1.100000e+00 2.200000e+00 0.0
+VECTORS stress double
 1.200000e+00 2.300000e+00 3.400000e+00
+SCALARS other double 2
+LOOKUP_TABLE default
+1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_surf_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -10,13 +10,16 @@
 CELL_TYPES 1
 3
 POINT_DATA 2
-VECTORS displacements double
-3.300000e+00 4.400000e+00 0.0
-7.700000e+00 8.800000e+00 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 3.200000e+00
 5.400000e+00
+VECTORS displacement double
+3.300000e+00 4.400000e+00 0.0
+7.700000e+00 8.800000e+00 0.0
+VECTORS stress double
+2.100000e+00 2.200000e+00 2.300000e+00
+4.100000e+00 4.200000e+00 4.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 3.400000e+00 4.500000e+00

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex.h5
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex.xmf
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex.xmf	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex.xmf	2012-10-19 21:28:12 UTC (rev 20857)
@@ -32,7 +32,7 @@
 	  </DataItem>
 	</Geometry>
 	<Attribute
-	   Name="displacements_x"
+	   Name="displacement_x"
 	   Type="Scalar"
 	   Center="Node">
           <DataItem ItemType="HyperSlab"
@@ -49,12 +49,12 @@
 	       DataType="Float" Precision="8"
 	       Dimensions="1 6 2"
 	       Format="HDF">
-	      &HeavyData;:/vertex_fields/displacements
+	      &HeavyData;:/vertex_fields/displacement
 	    </DataItem>
 	  </DataItem>
 	</Attribute>
 	<Attribute
-	   Name="displacements_y"
+	   Name="displacement_y"
 	   Type="Scalar"
 	   Center="Node">
           <DataItem ItemType="HyperSlab"
@@ -71,7 +71,7 @@
 	       DataType="Float" Precision="8"
 	       Dimensions="1 6 2"
 	       Format="HDF">
-	      &HeavyData;:/vertex_fields/displacements
+	      &HeavyData;:/vertex_fields/displacement
 	    </DataItem>
 	  </DataItem>
 	</Attribute>
@@ -141,6 +141,72 @@
 	    </DataItem>
 	  </DataItem>
 	</Attribute>
+	<Attribute
+	   Name="stress_xx"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 0
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 3"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_yy"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 1
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 3"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
+	<Attribute
+	   Name="stress_xy"
+	   Type="Scalar"
+	   Center="Node">
+          <DataItem ItemType="HyperSlab"
+		    Dimensions="1 6 1"
+		    Type="HyperSlab">
+            <DataItem
+	       Dimensions="3 3"
+	       Format="XML">
+              0 0 2
+              1 1 1
+              1 6 1
+	    </DataItem>
+	    <DataItem
+	       DataType="Float" Precision="8"
+	       Dimensions="1 6 3"
+	       Format="HDF">
+	      &HeavyData;:/vertex_fields/stress
+	    </DataItem>
+	  </DataItem>
+	</Attribute>
     </Grid>
   </Domain>
 </Xdmf>

Modified: short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex_t10.vtk
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex_t10.vtk	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/libtests/meshio/data/tri3_vertex_t10.vtk	2012-10-19 21:28:12 UTC (rev 20857)
@@ -16,13 +16,6 @@
 5
 5
 POINT_DATA 6
-VECTORS displacements double
-1.100000e+00 2.200000e+00 0.0
-3.300000e+00 4.400000e+00 0.0
-5.500000e+00 6.600000e+00 0.0
-7.700000e+00 8.800000e+00 0.0
-9.900000e+00 1.000000e+01 0.0
-1.110000e+01 1.220000e+01 0.0
 SCALARS pressure double 1
 LOOKUP_TABLE default
 2.100000e+00
@@ -31,6 +24,20 @@
 5.400000e+00
 6.500000e+00
 7.600000e+00
+VECTORS displacement double
+1.100000e+00 2.200000e+00 0.0
+3.300000e+00 4.400000e+00 0.0
+5.500000e+00 6.600000e+00 0.0
+7.700000e+00 8.800000e+00 0.0
+9.900000e+00 1.000000e+01 0.0
+1.110000e+01 1.220000e+01 0.0
+VECTORS stress double
+1.100000e+00 1.200000e+00 1.300000e+00
+2.100000e+00 2.200000e+00 2.300000e+00
+3.100000e+00 3.200000e+00 3.300000e+00
+4.100000e+00 4.200000e+00 4.300000e+00
+5.100000e+00 5.200000e+00 5.300000e+00
+6.100000e+00 6.200000e+00 6.300000e+00
 SCALARS other double 2
 LOOKUP_TABLE default
 1.200000e+00 2.300000e+00

Modified: short/3D/PyLith/trunk/unittests/pytests/feassemble/TestElasticityExplicit.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/feassemble/TestElasticityExplicit.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/pytests/feassemble/TestElasticityExplicit.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -121,8 +121,14 @@
     (mesh, integrator) = self._preinitialize()
     fields = self._initialize(mesh, integrator)
 
-    from pylith.utils.utils import maxscalar
-    self.assertAlmostEqual(1.0, integrator.stableTimeStep(mesh)/maxscalar(), 7)
+    b = 2**0.5
+    a = 2**0.5
+    c = 2.0
+    k = 0.5 * (a + b + c)
+    r = (k*(k-a)*(k-b)*(k-c))**0.5 / k
+    dtStable = 3*r/6000.0
+
+    self.assertAlmostEqual(1.0, integrator.stableTimeStep(mesh)/dtStable, 7)
     return
 
 
@@ -185,9 +191,12 @@
     (mesh, integrator) = self._preinitialize()
     fields = self._initialize(mesh, integrator)
 
-    from pylith.topology.Jacobian import Jacobian
-    jacobian = Jacobian(fields.solution())
+    from pylith.topology.Field import MeshField
+    jacobian = MeshField(mesh)
+    jacobian.newSection(jacobian.VERTICES_FIELD, mesh.coordsys().spaceDim())
+    jacobian.allocate()
     jacobian.zero()
+
     t = 7.3
     self.assertEqual(True, integrator.needNewJacobian())
     integrator.integrateJacobian(jacobian, t, fields)

Modified: short/3D/PyLith/trunk/unittests/pytests/feassemble/TestElasticityExplicitLgDeform.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/feassemble/TestElasticityExplicitLgDeform.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/pytests/feassemble/TestElasticityExplicitLgDeform.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -185,9 +185,12 @@
     (mesh, integrator) = self._preinitialize()
     fields = self._initialize(mesh, integrator)
 
-    from pylith.topology.Jacobian import Jacobian
-    jacobian = Jacobian(fields.solution())
+    from pylith.topology.Field import MeshField
+    jacobian = MeshField(mesh)
+    jacobian.newSection(jacobian.VERTICES_FIELD, mesh.coordsys().spaceDim())
+    jacobian.allocate()
     jacobian.zero()
+
     t = 7.3
     self.assertEqual(True, integrator.needNewJacobian())
     integrator.integrateJacobian(jacobian, t, fields)
@@ -309,6 +312,7 @@
     fields.add("disp(t+dt)", "displacement")
     fields.add("disp(t)", "displacement")
     fields.add("disp(t-dt)", "displacement")
+    fields.add("velocity(t)", "velocity")
     fields.add("acceleration(t)", "acceleration")
     fields.solutionName("disp(t+dt)")
 

Modified: short/3D/PyLith/trunk/unittests/pytests/mpi/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/mpi/Makefile.am	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/pytests/mpi/Makefile.am	2012-10-19 21:28:12 UTC (rev 20857)
@@ -25,7 +25,8 @@
 TESTS_ENVIRONMENT = $(PYTHON)
 
 noinst_PYTHON = \
-	TestCommunicator.py
+	TestCommunicator.py \
+	TestReduce.py
 
 
 # End of file 

Copied: short/3D/PyLith/trunk/unittests/pytests/mpi/TestReduce.py (from rev 20836, short/3D/PyLith/branches/v1.7-trunk/unittests/pytests/mpi/TestReduce.py)
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/mpi/TestReduce.py	                        (rev 0)
+++ short/3D/PyLith/trunk/unittests/pytests/mpi/TestReduce.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+#
+# ======================================================================
+#
+# Brad T. Aagaard, U.S. Geological Survey
+# Charles A. Williams, GNS Science
+# Matthew G. Knepley, University of Chicago
+#
+# This code was developed as part of the Computational Infrastructure
+# for Geodynamics (http://geodynamics.org).
+#
+# Copyright (c) 2010-2012 University of California, Davis
+#
+# See COPYING for license information.
+#
+# ======================================================================
+#
+
+## @file unittests/pytests/utils/TestReduce.py
+
+## @brief Unit testing of MPI reduce functions.
+
+import unittest
+
+import pylith.mpi.mpi as mpi
+
+# ----------------------------------------------------------------------
+class TestReduce(unittest.TestCase):
+  """
+  Unit testing of MPI reduce functions.
+  """
+  
+
+  def test_allreduce_scalar_double(self):
+    """
+    Test allreduce_double().
+    """
+    value = 2.0
+    result = mpi.allreduce_scalar_double(value, mpi.mpi_sum(), mpi.petsc_comm_world())
+    self.assertEqual(value, result)
+
+    result = mpi.allreduce_scalar_double(value, mpi.mpi_min(), mpi.petsc_comm_self())
+    self.assertEqual(value, result)
+
+    result = mpi.allreduce_scalar_double(value, mpi.mpi_max(), mpi.petsc_comm_world())
+    self.assertEqual(value, result)
+    return
+
+
+  def test_allreduce_scalar_int(self):
+    """
+    Test allreduce_int().
+    """
+    value = 3
+    result = mpi.allreduce_scalar_int(value, mpi.mpi_sum(), mpi.petsc_comm_world())
+    self.assertEqual(value, result)
+
+    result = mpi.allreduce_scalar_int(value, mpi.mpi_min(), mpi.petsc_comm_self())
+    self.assertEqual(value, result)
+
+    result = mpi.allreduce_scalar_int(value, mpi.mpi_max(), mpi.petsc_comm_world())
+    self.assertEqual(value, result)
+    return
+
+
+# End of file 

Modified: short/3D/PyLith/trunk/unittests/pytests/mpi/testmpi.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/mpi/testmpi.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/pytests/mpi/testmpi.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -65,6 +65,9 @@
     from TestCommunicator import TestCommunicator
     suite.addTest(unittest.makeSuite(TestCommunicator))
 
+    from TestReduce import TestReduce
+    suite.addTest(unittest.makeSuite(TestReduce))
+
     return suite
 
 

Modified: short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepAdapt.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepAdapt.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepAdapt.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -91,8 +91,12 @@
     tstep.adaptSkip = 2
     integrators = [Integrator(2.0),
                    Integrator(0.5)]
-    mesh = None
 
+    from pylith.topology.Mesh import Mesh
+    from pylith.mpi.Communicator import petsc_comm_world
+    mesh = Mesh()
+    mesh.setComm(petsc_comm_world())
+
     # Set time step
     dt = 0.5 / 2.0
     self.assertEqual(dt, tstep.timeStep(mesh, integrators))
@@ -145,7 +149,12 @@
     
     integrators = [Integrator(3.0),
                    Integrator(2.4)]
-    mesh = None
+
+    from pylith.topology.Mesh import Mesh
+    from pylith.mpi.Communicator import petsc_comm_world
+    mesh = Mesh()
+    mesh.setComm(petsc_comm_world())
+
     dt = 2.4 / 2.0
     tstep.timeStep(mesh, integrators)
     self.assertEqual(dt, tstep.currentStep())

Modified: short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepUniform.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepUniform.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepUniform.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -83,8 +83,12 @@
 
     integrators = [Integrator(4.0),
                    Integrator(8.0)]
-    mesh = None
 
+    from pylith.topology.Mesh import Mesh
+    from pylith.mpi.Communicator import petsc_comm_world
+    mesh = Mesh()
+    mesh.setComm(petsc_comm_world())
+
     self.assertEqual(1.0, tstep.timeStep(mesh, integrators))
 
     tstep.dtN = 0.5

Modified: short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepUser.py
===================================================================
--- short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepUser.py	2012-10-19 15:48:48 UTC (rev 20856)
+++ short/3D/PyLith/trunk/unittests/pytests/problems/TestTimeStepUser.py	2012-10-19 21:28:12 UTC (rev 20857)
@@ -108,8 +108,12 @@
 
     integrators = [Integrator(40.0),
                    Integrator(80.0)]
-    mesh = None
 
+    from pylith.topology.Mesh import Mesh
+    from pylith.mpi.Communicator import petsc_comm_world
+    mesh = Mesh()
+    #mesh.setComm(petsc_comm_world())
+
     self.assertEqual(step1, tstep.timeStep(mesh, integrators))
     self.assertEqual(step2, tstep.timeStep(mesh, integrators))
     self.assertEqual(step3, tstep.timeStep(mesh, integrators))
@@ -144,8 +148,12 @@
 
     integrators = [Integrator(4.0),
                    Integrator(8.0)]
-    mesh = None
 
+    from pylith.topology.Mesh import Mesh
+    from pylith.mpi.Communicator import petsc_comm_world
+    mesh = Mesh()
+    #mesh.setComm(petsc_comm_world())
+
     tstep.timeStep(mesh, integrators)
     stepE = 1.0 / 0.5 # Nondimensionalize
     self.assertEqual(stepE, tstep.currentStep())



More information about the CIG-COMMITS mailing list