[cig-commits] r16840 - in short/3D/PyLith/branches/pylith-scecdynrup: . doc/install doc/releasenotes doc/userguide doc/userguide/benchmarks doc/userguide/benchmarks/savageprescott/figs doc/userguide/boundaryconditions doc/userguide/extending doc/userguide/governingeqns doc/userguide/install doc/userguide/intro doc/userguide/runpylith doc/userguide/tutorials examples/3d/hex8 examples/3d/hex8/mesh examples/3d/hex8/spatialdb examples/bar_shearwave examples/bar_shearwave/hex8 examples/bar_shearwave/quad4 examples/bar_shearwave/tet4 examples/bar_shearwave/tri3 examples/greensfns/hex8 libsrc libsrc/bc libsrc/faults libsrc/feassemble libsrc/friction libsrc/materials libsrc/meshio libsrc/problems libsrc/topology libsrc/utils modulesrc/bc modulesrc/faults modulesrc/feassemble modulesrc/materials modulesrc/meshio modulesrc/problems playpen playpen/friction pylith pylith/feassemble pylith/meshio pylith/problems pylith/topology templates templates/friction templates/materials tests_auto/2d/quad4 tests_auto/2d/tri3 unittests/libtests/bc unittests/libtests/bc/data unittests/libtests/faults unittests/libtests/faults/data unittests/libtests/feassemble unittests/libtests/feassemble/data unittests/libtests/materials unittests/libtests/meshio unittests/pytests/bc unittests/pytests/materials unittests/pytests/meshio

brad at geodynamics.org brad at geodynamics.org
Sun May 30 14:53:49 PDT 2010


Author: brad
Date: 2010-05-30 14:53:47 -0700 (Sun, 30 May 2010)
New Revision: 16840

Added:
   short/3D/PyLith/branches/pylith-scecdynrup/doc/install/Cluster_CIT-garuda.txt
   short/3D/PyLith/branches/pylith-scecdynrup/doc/install/Cluster_CIT-garuda/
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/savageprescott/figs/model-3d.png
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/savageprescott/figs/model-3d.svg
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/savageprescott/figs/model_3d.eps
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/cover/
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/tutorials/shearwave/
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/mat_druckerprager.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step03.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step04.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step05.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step06.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step07.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step08.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step09.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step10.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step11.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step12.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_ratestateageing.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_slipweakening.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_staticfriction.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_risetime.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_slip.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_sliptime.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTri3.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTri3.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/tet4_elasticity.wxm
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/tri3_elasticity.wxm
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/ElasticityExplicitTri3.i
   short/3D/PyLith/branches/pylith-scecdynrup/playpen/faultpc/
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/ElasticityExplicitTri3.py
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/ExplicitLumpedTri3.py
   short/3D/PyLith/branches/pylith-scecdynrup/templates/friction/
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTri3.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTri3.hh
Removed:
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/coverimage.png
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/pylith_cover.psd
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_risetime.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_slip.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_sliptime.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/playpen/friction/bar_shearwave/
Modified:
   short/3D/PyLith/branches/pylith-scecdynrup/README
   short/3D/PyLith/branches/pylith-scecdynrup/TODO
   short/3D/PyLith/branches/pylith-scecdynrup/doc/install/Cluster_CIT-pangu.txt
   short/3D/PyLith/branches/pylith-scecdynrup/doc/releasenotes/announce_v1.5.0.txt
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/benchmarks.lyx
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/boundaryconditions/boundaryconditions.lyx
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/extending/extending.lyx
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/governingeqns/governingeqns.lyx
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/install/install.lyx
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/intro/intro.lyx
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/runpylith/runpylith.lyx
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/tutorials/tutorials.lyx
   short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/userguide.lyx
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/mesh/box_hex8_1000m.exo
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/mesh/mesh_hex8_1000m.jou
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/pylithapp.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/finalslip.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/finalslip_rupture.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/fixeddisp_axial.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/fixeddisp_shear.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/sliprate_creep.spatialdb
   short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step01.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/README
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/hex8/bar_hex8_200m.exo
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/hex8/pylithapp.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/Makefile.am
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/README
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/bar_quad4_200m.exo
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/geometry.jou
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/mesh_quad4_200m.jou
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/pylithapp.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tet4/pylithapp.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/bar_tri3_200m.exo
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/geometry.jou
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/mesh_tri3_200m.jou
   short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/pylithapp.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/examples/greensfns/hex8/pylithapp.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/Makefile.am
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/BoundaryCondition.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/DirichletBC.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/DirichletBC.icc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/PointForce.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/PointForce.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveDyn.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveDyn.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveKin.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveKin.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveLagrange.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveLagrange.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Constraint.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicit.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTet4.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTet4.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryLine3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryQuad2D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTet3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTri2D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTri3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Integrator.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Integrator.icc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/IntegratorElasticity.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Makefile.am
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1Din2D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1Din3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature2D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature2Din3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/feassemblefwd.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/RateStateAgeing.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/SlipWeakening.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/StaticFriction.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/DruckerPrager3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/DruckerPrager3D.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticIsotropic3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticIsotropic3D.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStrain.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStrain.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStress.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStress.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStrain1D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStrain1D.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStress1D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStress1D.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/GenMaxwellIsotropic3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/GenMaxwellIsotropic3D.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.icc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellIsotropic3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellIsotropic3D.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellPlaneStrain.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellPlaneStrain.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/PowerLaw3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/PowerLaw3D.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/DataWriterVTK.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.icc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Formulation.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Formulation.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Solver.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Solver.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/SolverLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/SolverLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/topology/Distributor.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/topology/ReverseCuthillMcKee.cc
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/utils/petscerror.h
   short/3D/PyLith/branches/pylith-scecdynrup/libsrc/utils/petscfwd.h
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/bc/DirichletBC.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/bc/PointForce.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveDyn.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveKin.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveLagrange.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Constraint.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Integrator.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Makefile.am
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/feassemble.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/DruckerPrager3D.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticIsotropic3D.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticPlaneStrain.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticPlaneStress.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticStrain1D.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticStress1D.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/GenMaxwellIsotropic3D.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/Material.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/MaxwellIsotropic3D.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/MaxwellPlaneStrain.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/PowerLaw3D.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/meshio/MeshIOCubit.i
   short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/problems/Formulation.i
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/Makefile.am
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/ElasticityExplicitTet4.py
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/FIATSimplex.py
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/Integrator.py
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/meshio/MeshIOCubit.py
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Explicit.py
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Formulation.py
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Implicit.py
   short/3D/PyLith/branches/pylith-scecdynrup/pylith/topology/Jacobian.py
   short/3D/PyLith/branches/pylith-scecdynrup/templates/Makefile.am
   short/3D/PyLith/branches/pylith-scecdynrup/templates/README
   short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/PlaneStrainState.cc
   short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/PlaneStrainState.py
   short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/materialscontrib.i
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/axialdisp.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/dislocation.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/dislocation2.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_compression.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_opening.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_shear_sliding.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_shear_stick.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/lgdeformrigidbody.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/lgdeformtraction.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/sheardisp.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_compression.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_opening.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_shear_sliding.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_shear_stick.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/axialdisp.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/dislocation.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/dislocation2.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/sheardisp.cfg
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBC.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBC.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCLine2.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCLine2b.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCQuad4.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCTet4.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCTri3.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForce.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForce.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceHex8.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceLine2.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceQuad4.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceTet4.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceTri3.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/data/AbsorbingDampersDataTet4.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/data/NeumannDataTet4.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKin.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKin.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinHex8.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinLine2.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinQuad4.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinQuad4e.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsHex8.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsLine2.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsQuad4.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsTet4.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsTri3.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4e.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4f.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTri3.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTri3d.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveDynDataTet4.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataQuad4e.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4e.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4f.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTri3d.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/slipth.py
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/Makefile.am
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTet4.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DLinear.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DQuadratic.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/Quadrature2DLinear.py
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXY.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXYZ.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXZ.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearYZ.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DQuadratic.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData3DLinear.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestDruckerPrager3D.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestDruckerPrager3D.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestMaterial.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestMaterial.hh
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/meshio/TestMeshIOCubit.cc
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/bc/TestDirichletBC.py
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/materials/TestMaterial.py
   short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/meshio/TestMeshIOCubit.py
Log:
Merge from trunk.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/README
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/README	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/README	2010-05-30 21:53:47 UTC (rev 16840)
@@ -33,19 +33,135 @@
 PyLith is under active development and we expect a number of additions
 and improvements in the near future. Likely enhancements will include
 additional constitutive models for both volume elements and cohesive
-(fault) elements, implementation of finite-strain and large
-deformations, and the generation of Green's functions to be used in
-inversions.  Many of these features should be available in early 2010.
+(fault) elements and the generation of Green's functions to be used in
+inversions.
 
+======================================================================
+TIPS
+======================================================================
 
+  * For most crustal deformation problems, we recommend using the
+    Additive Schwartz preconditioner via the following PETSc
+    settings:
+
+      - Command line arguments
+
+        --petsc.pc_type=asm
+        --petsc.ksp_max_it=100
+        --petsc.ksp_gmres_restart=50
+        --petsc.ksp_rtol=1.0e-08
+
+      - pylithapp.cfg (or your other favorite .cfg file)
+
+        [pylithapp.petsc]
+        pc_type = asm
+        ksp_max_it = 200
+        ksp_gmres_restart = 50
+        ksp_rtol = 1.0e-08
+
+  * 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 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.
+
+
 ======================================================================
 MIGRATING FROM VERSION 1.4 TO 1.5
 ======================================================================
 
-Power-law stuff
+Two changes to the code require updating old parameters settings for use
+with version 1.5.
 
-many new features
+(1) Recent releases of CUBIT include nodeset names in the Exodus file
+and PyLith now uses them to associate vertices with boundary
+conditions and faults. Use the netcdf utility ncdump to examine the
+contents of the Exodus (.exo) file to see it it includes the variable
+ns_names. If it does use nodeset names rather than nodeset ids for
+boundary condition label properties. If your Exodus file does not
+contain nodeset names, then set the MeshIOCubit property
+use_nodeset_names to False to continue to use nodeset id values for
+boundary condition labels.
 
+(2) The power-law constitutive parameters have been changed in order
+to facilitate nondimensionalization. [CHARLES ADD SOME FURTHER
+EXPLANATION]
+
+----------------------------------------------------------------------
+Version 1.5.0
+----------------------------------------------------------------------
+
+  * Fault constitutive models
+
+    Added fault friction interface conditions with static
+    friction, linear slip-weakening friction, and rate- and
+    state-friction with the ageing law. The implementation can be used
+    in static, quasi-static, or dynamic problems.
+
+  * Drucker-Prager elastoplastic bulk rheology
+
+    Added a Drucker-Prager elastoplastic bulk rheology. [NEED SOME
+    WORDS FROM CHARLES]
+
+  * Finite-deformation formulation
+
+    Added a finite-deformation (rigid body motion and small strains)
+    implementation of elasticity with stress calculated using the
+    Second Piola Kirchhoff stress tensor and strains calculated using
+    the Green-Lagrange strain tensor.
+
+  * Lumped Jacobian for explicit-time stepping
+
+    Added the option to lump cell Jacobian matrices to form a diagonal
+    system Jacobian matrix for explicit time stepping. This decouples
+    all degrees of freedom and permits use of a fast, trivial, direct
+    solver.
+
+  * Optimized elasticity objects
+
+    Added optimized elasticity objects for the most popular cell types
+    and basis functions (linear polynomials). For tri3 and tet4 cells
+    with one quadrature point, the optimized implementations do not
+    use mapped cells to reduce the number of operations. For quad4 and
+    hex8 cells the optimized objects provide hardwired loop bounds
+    which can lead to faster performance for some compilers.
+
+  * Scientific notation for ASCII VTK files
+
+    Data values in ASCII data files are written in scientific notation
+    with user-specified precision.
+
+  * Nodeset names in CUBIT Exodus files
+
+    Use of nodeset names in CUBIT Exodus files for boundary conditions
+    and faults. Users can specify to use nodeset names (default
+    behavior) or ids.
+
+  * Velocity and slip rate as output fields
+
+    Velocity (domain and subdomain) and slip rate (fault) fields are
+    can be requested as output fields. The fields are computed using
+    the time-stepping algorithm and alleviates the need to compute
+    them via post-processing.
+
+  * Dimensionless values in spatial databases no longer need
+    artificial dimensions. Values without dimensions are understood by
+    the parser as dimensionless quantities.
+
+  * Bug fixes
+
+    - Updating state variables did not retrieve physical properties
+      for cell. Last physical properties retrieved were used. Physical
+      properties are now retrieved when updating state variables.
+
+    - Fixed incorrect dimensioning of physical properties and state
+      variables for the power-law rheology in output.
+
+    - Fixed memory bug for a fault in a 1-D mesh when constructing the
+      cohesive cells.
+
+
 ======================================================================
 MIGRATING FROM VERSION 1.3 TO 1.4
 ======================================================================
@@ -102,66 +218,6 @@
 1.2. The time stepping is specified under the time-stepping
 formulation rather than the problem (i.e., one level deeper).
 
-======================================================================
-MIGRATING FROM VERSION 1.1 TO 1.2
-======================================================================
-
-There are two new features in PyLith version 1.2 that require users to
-adjust input parameters from those used with PyLith 1.1. A dynamic
-array of kinematic rupture replaces a single kinematic rupture on a
-fault. Additionally, the default slip time function is now a
-step-function. This eliminates the need to specify a peak slip rate
-for quasi-static simulations. When using PyLith version 1.2 with a
-problem previously setup for PyLith 1.1, look for warnings about
-unknown components and settings in the screen output at the beginning
-of a run.
-
-======================================================================
-MIGRATING FROM VERSION 1.0 TO 1.1
-======================================================================
-
-There are two new features in PyLith version 1.1 that require users to
-adjust input parameters from those used with PyLith 1.0. The
-elimination of containers in favor of the dynamic arrays of components
-present in the latest version of Pyre requires switching from setting
-the container to specifying the array of components on the command
-line or .cfg file. Additionally, the new implementation of output
-requires a completely new set of parameters. When using PyLith version
-1.1 with a problem previously setup for PyLith 1.0, look for warnings
-about unknown components and settings in the output at the beginning
-of a run.
-
-======================================================================
-TIPS
-======================================================================
-
-  * For most crustal deformation problems, we recommend using the
-    Additive Schwartz preconditioner via the following PETSc
-    settings:
-
-      - Command line arguments
-
-        --petsc.pc_type=asm
-        --petsc.ksp_max_it=100
-        --petsc.ksp_gmres_restart=50
-        --petsc.ksp_rtol=1.0e-08
-
-      - pylithapp.cfg (or your other favorite .cfg file)
-
-        [pylithapp.petsc]
-        pc_type = asm
-        ksp_max_it = 200
-        ksp_gmres_restart = 50
-        ksp_rtol = 1.0e-08
-
-  * 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 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.
-
-
 ----------------------------------------------------------------------
 Version 1.3.1
 ----------------------------------------------------------------------
@@ -207,6 +263,20 @@
       viscoelastic and generalized Maxwell viscoelastic materials (mu
       and lambda were switched).
 
+======================================================================
+MIGRATING FROM VERSION 1.1 TO 1.2
+======================================================================
+
+There are two new features in PyLith version 1.2 that require users to
+adjust input parameters from those used with PyLith 1.1. A dynamic
+array of kinematic rupture replaces a single kinematic rupture on a
+fault. Additionally, the default slip time function is now a
+step-function. This eliminates the need to specify a peak slip rate
+for quasi-static simulations. When using PyLith version 1.2 with a
+problem previously setup for PyLith 1.1, look for warnings about
+unknown components and settings in the screen output at the beginning
+of a run.
+
 ----------------------------------------------------------------------
 Version 1.2.0
 ----------------------------------------------------------------------
@@ -216,7 +286,7 @@
     The previous implementation of Sieve provided a very generalized
     implementation of data structures and operations for
     finite-element meshes. Switching to a more rigid implementation in
-    the new implementation strealined the data structures, resulting
+    the new implementation streamlined the data structures, resulting
     in a significant reduction in the memory use for storing the
     mesh. This leads to an overall reduction in memory use of 25-30%
     in many cases.
@@ -254,6 +324,21 @@
   * Fixed Makefile.am files to not delete source files during "make
     clean" when building in the source tree.
 
+======================================================================
+MIGRATING FROM VERSION 1.0 TO 1.1
+======================================================================
+
+There are two new features in PyLith version 1.1 that require users to
+adjust input parameters from those used with PyLith 1.0. The
+elimination of containers in favor of the dynamic arrays of components
+present in the latest version of Pyre requires switching from setting
+the container to specifying the array of components on the command
+line or .cfg file. Additionally, the new implementation of output
+requires a completely new set of parameters. When using PyLith version
+1.1 with a problem previously setup for PyLith 1.0, look for warnings
+about unknown components and settings in the output at the beginning
+of a run.
+
 ----------------------------------------------------------------------
 Version 1.1.2
 ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/TODO
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/TODO	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/TODO	2010-05-30 21:53:47 UTC (rev 16840)
@@ -2,45 +2,68 @@
 CURRENT ISSUES/PRIORITIES
 ======================================================================
 
-need Cygwin binbot
+BINBOTS
 
-MAIN PRIORITIES
+  need cygwin binbot
 
-* Better preconditioning
-  + Need settings for Schur complement
+  Add ML to petsc on all binbots (requires fortran compiler)
 
-  We should temporarily hardwire the Schur complement settings (enable
-  with #define) and see how well it works.
+top-level README [add fault preconditioner when done]
+  Need Charles to add some additional description
 
-  MATT is thinking about how to setup Schur complement settings
-  (recursive specification of field splits).
+release announcement [add fault preconditioner when done]
 
-* Drucker-Prager elastoplastic
-  Need to link isJacobianSymmetric() in Integrator with materials.
-  Need to pass hint when creating Jacobian.
+DOC/INSTALL
+  Update MacBookPro
+    development, easy to switch among different versions of MPI and
+    test compatibility of newer versions of various package
+  Update linux
+  Add garuda, pangu
+    Clusters - dependencies and multiple versions of PyLith
+      (development and stable)
 
-* Friction
-  + Add stuff to manual
+MANUAL
 
-* Optimization
-  + Specialized elasticity integrator objects for Tri3, Quad4, Hex8
-  + inline methods (what isn't getting inlined) -Winline
+  Governing equations [Brad]
 
-* Lumped solver
-  + Need to finish unit tests
+  Mesher parameters [Charles]
+    Need outline of parameters to MeshImporter like other objects
 
-* Updates to manual
-  + tutorial
-  + governing equations
-  + Large deformation formulation
-  + mesh reordering
-  + Lumped solver
-  + Cleanup bulk constitutive models (consistent w/governing eqns)
+    MeshIOAscii
+    MeshIOLaGriT
+    MeshIOCubit
+      use_nodeset_names Flag for using nodeset names of ids.
+    reorder_mesh
+    distribution
+      partitioner
 
-* Cleanup PETSc setttings in examples
-    ksp_view, monitor, converged reason
+  Small strain formulation [Brad]
 
-* Tutorials
+  Fault
+    governing equations [Brad]
+    dynamic rupture parameters [Brad]
+    fault constitutive models [Surendra]
+
+  Tutorials
+    3d/hex8 [Charles]
+    bar_shearwave [Brad]
+      kinematic
+      friction
+        static (stick, sliding)
+        dynamic (static, slip-weakening, rate-and-state)
+    meshgeneration [Charles]
+
+  Benchmarks
+    Update performance?
+    SCEC dynamic rupture benchmarks [Surendra]        
+    Savage-Prescott
+      change .cfg file to output velocities, update post-processing
+
+  Materials [Charles]
+    Are material models consistent with governing equations discussion?
+
+TUTORIALS/EXAMPLES
+  
   3d/hex8
     directory structure
     1. Dirichlet BC (static)
@@ -50,7 +73,7 @@
     3. Earthquake rupture (static)
        add fault slip w/greater slip at depth
     4. Dirichlet BC (quasi-static)
-       constant velocity BC
+       constant velocity BC + MaxwellIsotropic3D (lower crust)
     5. Dirichlet + Neumann (quasi-static)
        constant velocity + time-dependent traction BC
     6. Multiple earthquake rupture + creep (quasi-static)
@@ -75,28 +98,33 @@
    16. Gravity w/prestress
    17. Gravity w/small strain
 
-  bar_shearwave
-    * quad4
-      + kinematic [explicit NOT lumped]
-      + static friction [lumped]
-      + slip-weakening friction
-      + rate- and state- friction
-    * tri3
-    * hex8
-    * tet4
+  meshgeneration
 
-  meshes
 
-Write up description of Savage and Prescott (1978) benchmark and
-distribute to Greg Lyzenga and Jay Parker
+OTHER
 
-Need full-scale test with variation in physical properties within a material.
+  Write up description of Savage and Prescott (1978) benchmark and
+  distribute to Greg Lyzenga and Jay Parker
 
+    Add time step information
+
+CODE
+
+  * Better preconditioning [Matt/Brad]
+
+    Diagonal preconditioner does not work very well. It looks like the
+    preconditioner needs off-diagonal terms consistent with the
+    coupling of the Lagrange multiplier constraints (sparsity pattern
+    matches the union of the matrices associated with the fault
+    meshes).
+
+    Need field split working for both SolverLinear and SolverNonlinear.
+
 ----------------------------------------------------------------------
 SECONDARY PRIORITIES
 ----------------------------------------------------------------------
 
-* Output to HDF5 files
+* Output to VTK XML files w/data values as binary
 
 * Uniform global refinement for tets with faults
 
@@ -110,15 +138,26 @@
 
 * Optimization
   + Reimplement Fields to use a single section.
+    - SolutionFields (RealSection)
+    - UniformFields (UniformSection)?
   + May be gotchas associated with Petsc Vec and scatters
+  + inline methods (what isn't getting inlined) -Winline
+  + Specialized elasticity integrator objects for Quad4, Hex8
+    - Add for lgdeform, implicit time integration?
 
+* Testing
+  + Need full-scale test with variation in physical properties
+    within a material.
+
 * utilities
   + pylith_eqsummary
     Calculate eq statistics for given slip model (VTK output).
     Ability to get shear modulus on both sides of the fault (use fault normal).
 
-* VTKDataReaderZip
+* GenMaxwellPlaneStrain (plane strain Generalize Maxwell model) [Charles]
 
+* VTKDataReaderZip (obsolete if use VTK XML files?)
+
   Read VTK files from zipfile.
 
   import zipfile
@@ -129,30 +168,17 @@
     reader.update()
     data = reader.get_output()
 
+* Lumped solver [Brad]
+  + Need to finish unit tests
 
-----------------------------------------------------------------------
-FRICTION
-----------------------------------------------------------------------
-
-TPV205-2D
-  quad4, tri3
-TPV205
-  hex8, tet4
-
-TPV?? (rate and state)
-TPV?? Drucker-Prager
-
-----------------------------------------------------------------------
-LUMPED SOLVER
-----------------------------------------------------------------------
-
-Unit tests
-
   AbsorbingDampers
     integrateResidualLumped()
   FaultCohesiveDyn
     adjustSolnLumped()
 
+  Make fault nucleation (initial tractions) modular (allow space/time
+  variation).
+
 ----------------------------------------------------------------------
 CLEANUP
 ----------------------------------------------------------------------
@@ -297,11 +323,6 @@
 RELEASE 1.5
 ----------------------------------------------------------------------
 
-1. Nondimensionalization
-
-  Ask constraints if a block matrix is okay. If okay and matrix type
-  is "unknown" (not set by user), then set block size. Do this in Python.
-
 2. 2-D Plane strain Maxwell viscoelastic rheology [Charles]
 
 3. 2-D Plane strain Generalized Maxwell viscoelastic rheology [Charles]
@@ -324,8 +345,6 @@
 
 Modularize output? [Matt]
 
-Fault friction
-
 Uniform refinement (debug, check, all cell types)
 
 

Copied: short/3D/PyLith/branches/pylith-scecdynrup/doc/install/Cluster_CIT-garuda (from rev 16839, short/3D/PyLith/trunk/doc/install/Cluster_CIT-garuda)

Copied: short/3D/PyLith/branches/pylith-scecdynrup/doc/install/Cluster_CIT-garuda.txt (from rev 16839, short/3D/PyLith/trunk/doc/install/Cluster_CIT-garuda.txt)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/install/Cluster_CIT-garuda.txt	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/install/Cluster_CIT-garuda.txt	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,29 @@
+Python
+  http://www.python.org/ftp/python/2.6.5/Python-2.6.5.tgz
+
+cppunit
+
+proj.4
+
+FIAT
+
+swig
+
+pythia
+
+netcdf
+
+numpy
+
+spatialdata
+
+mercurial
+
+PETSc
+
+nemesis
+
+PyLith
+
+
+

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/install/Cluster_CIT-pangu.txt
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/install/Cluster_CIT-pangu.txt	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/install/Cluster_CIT-pangu.txt	2010-05-30 21:53:47 UTC (rev 16840)
@@ -2,6 +2,53 @@
 INSTRUCTIONS FOR INSTALLING PYLITH ON THE CALTECH LINUX CLUSTER PANGU
 ======================================================================
 
+/opt/openmpi/1.4.2/intel
+/opt/intel/Compiler/11.1/072/
+/opt/intel/Compiler/11.1/072/mkl/lib
+
+Python
+  http://www.python.org/ftp/python/2.6.5/Python-2.6.5.tgz
+
+cppunit
+  http://downloads.sourceforge.net/cppunit/cppunit-1.12.1.tar.gz
+
+proj.4
+  http://download.osgeo.org/proj/proj-4.7.0.tar.gz
+  http://download.osgeo.org/proj/proj-datumgrid-1.5.zip
+
+FIAT
+  http://www.fenics.org/pub/software/fiat/FIAT-0.3.5.tar.gz
+
+swig
+  http://downloads.sourceforge.net/project/swig/swig/swig-1.3.40/swig-1.3.40.tar.gz?use_mirror=voxel
+
+pythia
+  svn co http://geodynamics.org/svn/cig/cs/pythia/trunk pythia
+
+netcdf
+  http://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-4.1.1.tar.gz
+
+numpy
+  http://downloads.sourceforge.net/project/numpy/NumPy/1.4.1/numpy-1.4.1.tar.gz?use_mirror=hivelocity
+
+spatialdata
+  svn co http://geodynamics.org/svn/cig/cs/spatialdata-0.1/trunk spatialdata-dev
+  Comment out postdep_objects (bug in ifort)
+
+mercurial
+  http://mercurial.selenic.com/release/mercurial-1.5.2.tar.gz
+
+PETSc
+  hg clone http://petsc.cs.iit.edu/petsc/petsc-dev
+  cd petsc-dev/config
+  hg clone http://petsc.cs.iit.edu/petsc/BuildSystem BuildSystem
+
+nemesis
+  svn co http://geodynamics.org/svn/cig/cs/nemesis/trunk nemesis-dev  
+
+PyLith
+  svn co http://geodynamics.org/svn/cig/short/3D/PyLith/trunk pylith-dev
+
 I place applications that are rarely updated in $HOME/tools. For CIG
 source code, I separate the source code, build directories, and
 installed code. The source code sits in $HOME/src/cig, I build the

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/releasenotes/announce_v1.5.0.txt
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/releasenotes/announce_v1.5.0.txt	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/releasenotes/announce_v1.5.0.txt	2010-05-30 21:53:47 UTC (rev 16840)
@@ -7,17 +7,19 @@
 This release adds several new features to PyLith, including (1) fault
 friction with several widely-used fault constitutive models, (2) an
 optimized solver for explicit time-stepping with a lumped Jacobian
-sparse matrix, (3) Total Langrangian formulation for large
-deformations, (4) use of scientific notation in VTK output files with
-user-specified precision, (5) ??, (6) ??, and (7) ??. We encourage all
-users of previous PyLith releases to switch to this latest release.
+sparse matrix, (3) a total Langrangian formulation for rigid-body
+motion and small strains, (4) use of scientific notation in VTK output
+files with user-specified precision, and (5) use of nodeset names in
+CUBIT Exodus files. We encourage all users of previous PyLith releases
+to switch to this latest release.
 
 We strongly recommend all users of previous PyLith releases to switch
-to this latest release. Switching from v1.4.0 or v1.4.1 to v1.4.2 only
-requires changes to parameter files when using adaptive time stepping
-with a non-default stability factor (see the release notes below for
-details). See the README file for changes required to switch to the
-v1.4.x release series from previous versions.
+to this latest release. In addition to adding features this release
+also fixes a number of bugs (see top-level README file). Switching
+from v1.5.0 only requires changes to parameter files when using CUBIT
+meshes or the power-law rheology. See the README file for changes
+required to switch to the v1.5.x release series from previous
+versions.
 
 You can download the source code and binaries from
 
@@ -30,8 +32,73 @@
 
 RELEASE NOTES
 
- *
+  * Fault constitutive models
 
- * Bug fixes
+    Added fault friction interface conditions with static
+    friction, linear slip-weakening friction, and rate- and
+    state-friction with the ageing law. The implementation can be used
+    in static, quasi-static, or dynamic problems.
 
-  - 
+  * Drucker-Prager elastoplastic bulk rheology
+
+    Added a Drucker-Prager elastoplastic bulk rheology. [NEED SOME
+    WORDS FROM CHARLES]
+
+  * Finite-deformation formulation
+
+    Added a finite-deformation (rigid body motion and small strains)
+    implementation of elasticity with stress calculated using the
+    Second Piola Kirchhoff stress tensor and strains calculated using
+    the Green-Lagrange strain tensor.
+
+  * Lumped Jacobian for explicit-time stepping
+
+    Added the option to lump cell Jacobian matrices to form a diagonal
+    system Jacobian matrix for explicit time stepping. This decouples
+    all degrees of freedom and permits use of a fast, trivial, direct
+    solver.
+
+  * Optimized elasticity objects
+
+    Added optimized elasticity objects for the most popular cell types
+    and basis functions (linear polynomials). For tri3 and tet4 cells
+    with one quadrature point, the optimized implementations do not
+    use mapped cells to reduce the number of operations. For quad4 and
+    hex8 cells the optimized objects provide hardwired loop bounds
+    which can lead to faster performance for some compilers.
+
+  * Scientific notation for ASCII VTK files
+
+    Data values in ASCII data files are written in scientific notation
+    with user-specified precision.
+
+  * Nodeset names in CUBIT Exodus files
+
+    Use of nodeset names in CUBIT Exodus files for boundary conditions
+    and faults. Users can specify to use nodeset names (default
+    behavior) or ids.
+
+  * Velocity and slip rate as output fields
+
+    Velocity (domain and subdomain) and slip rate (fault) fields are
+    can be requested as output fields. The fields are computed using
+    the time-stepping algorithm and alleviates the need to compute
+    them via post-processing.
+
+  * Dimensionless values in spatial databases no longer need
+    artificial dimensions. Values without dimensions are understood by
+    the parser as dimensionless quantities.
+
+  * Bug fixes
+
+    - Updating state variables did not retrieve physical properties
+      for cell. Last physical properties retrieved were used. Physical
+      properties are now retrieved when updating state variables.
+
+    - Fixed incorrect dimensioning of physical properties and state
+      variables for the power-law rheology in output.
+
+    - Fixed memory bug for a fault in a 1-D mesh when constructing the
+      cohesive cells.
+
+

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/benchmarks.lyx
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/benchmarks.lyx	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/benchmarks.lyx	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,4 +1,4 @@
-#LyX 1.6.0 created this file. For more info see http://www.lyx.org/
+#LyX 1.6.4 created this file. For more info see http://www.lyx.org/
 \lyxformat 345
 \begin_document
 \begin_header
@@ -143,5 +143,9 @@
 
 \end_layout
 
+\begin_layout Subsection
+ADD SCEC DYNAMIC RUPTURE BENCHMARKS
+\end_layout
+
 \end_body
 \end_document

Copied: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/savageprescott/figs/model-3d.png (from rev 16839, short/3D/PyLith/trunk/doc/userguide/benchmarks/savageprescott/figs/model-3d.png)
===================================================================
(Binary files differ)

Copied: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/savageprescott/figs/model-3d.svg (from rev 16839, short/3D/PyLith/trunk/doc/userguide/benchmarks/savageprescott/figs/model-3d.svg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/savageprescott/figs/model-3d.svg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/savageprescott/figs/model-3d.svg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1052.3622"
+   height="744.09448"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="model-3d.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path4045"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Send"
+       style="overflow:visible;">
+      <path
+         id="path4051"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.2) rotate(180) translate(6,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5436"
+       inkscape:persp3d-origin="-1134.7583 : 2281.7848 : 1"
+       inkscape:vp_z="1786.0074 : 1036.1992 : 0"
+       inkscape:vp_y="2.2341584e-14 : 366.65173 : 0"
+       inkscape:vp_x="-898.60862 : 521.35145 : 0"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="TriangleOutL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="TriangleOutL"
+       style="overflow:visible">
+      <path
+         id="path4179"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path4063"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) rotate(180) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path4039"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lend"
+       style="overflow:visible;">
+      <path
+         id="path4057"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) rotate(180) translate(1,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4001"
+       inkscape:persp3d-origin="-1134.7583 : 2276.1342 : 1"
+       inkscape:vp_z="1786.0074 : 1036.1992 : 0"
+       inkscape:vp_y="2.2341584e-14 : 366.65173 : 0"
+       inkscape:vp_x="-898.60862 : 521.35145 : 0"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-898.60862 : 521.35145 : 0"
+       inkscape:vp_y="2.2341584e-14 : 366.65173 : 0"
+       inkscape:vp_z="1786.0074 : 1036.1992 : 0"
+       inkscape:persp3d-origin="-686.84163 : 2207.3842 : 1"
+       id="perspective3992" />
+    <inkscape:perspective
+       id="perspective3967"
+       inkscape:persp3d-origin="-686.84163 : 2207.3842 : 1"
+       inkscape:vp_z="1786.0074 : 1036.1992 : 0"
+       inkscape:vp_y="2.2341584e-14 : 366.65173 : 0"
+       inkscape:vp_x="-898.60862 : 521.35145 : 0"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3951"
+       inkscape:persp3d-origin="-994.67766 : 1717.4033 : 1"
+       inkscape:vp_z="1787.6805 : 776.58694 : 0"
+       inkscape:vp_y="2.2362514e-14 : 274.78977 : 0"
+       inkscape:vp_x="-899.45044 : 390.73059 : 0"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-898.60862 : 521.35145 : 0"
+       inkscape:vp_y="2.2341584e-14 : 366.65173 : 0"
+       inkscape:vp_z="1786.0074 : 1036.1992 : 0"
+       inkscape:persp3d-origin="-851.0546 : 2273.6367 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.78"
+     inkscape:cx="534.75707"
+     inkscape:cy="330.72989"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1425"
+     inkscape:window-height="972"
+     inkscape:window-x="97"
+     inkscape:window-y="47"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-308.2677)">
+    <g
+       id="g4003">
+      <g
+         inkscape:corner7="-1.7875494 : -3.6100944 : 0.25 : 1"
+         inkscape:corner0="-1.483669 : -2.8373358 : 0 : 1"
+         inkscape:perspectiveID="#perspective5436"
+         id="g3923"
+         style="fill:#ff0000;stroke:#ff0000;stroke-width:5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="inkscape:box3d">
+        <path
+           d="m 644.9813,325.35465 273.06955,158.42848 0,283.33328 L 644.9813,608.68792 z"
+           inkscape:box3dsidetype="11"
+           style="fill:#e9e9ff;fill-rule:evenodd;stroke:none"
+           id="path3935"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           d="m 198.47945,584.40445 0,283.33327 446.50185,-259.0498 0,-283.33327 z"
+           inkscape:box3dsidetype="6"
+           style="fill:#353564;fill-rule:evenodd;stroke:none"
+           id="path3925"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           d="M 198.47945,867.73772 471.549,1026.1662 918.05085,767.11641 644.9813,608.68792 z"
+           inkscape:box3dsidetype="13"
+           style="fill:#afafde;fill-rule:evenodd;stroke:none"
+           id="path3933"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           d="M 198.47945,584.40445 471.549,742.83293 918.05085,483.78313 644.9813,325.35465 z"
+           inkscape:box3dsidetype="5"
+           style="fill:#338000;fill-rule:evenodd;stroke:none"
+           id="path3927"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           d="m 471.549,742.83293 0,283.33327 446.50185,-259.04979 0,-283.33328 z"
+           inkscape:box3dsidetype="14"
+           style="fill:#ffd5d5;fill-rule:evenodd;stroke:none"
+           id="path3931"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           d="m 198.47945,584.40445 273.06955,158.42848 0,283.33327 -273.06955,-158.42848 z"
+           inkscape:box3dsidetype="3"
+           style="fill:#ff8080;fill-rule:evenodd;stroke:none"
+           id="path3929"
+           sodipodi:type="inkscape:box3dside" />
+      </g>
+      <g
+         inkscape:corner7="-1.2882972 : -3.5877161 : 0.24870746 : 1"
+         inkscape:corner0="-0.98922373 : -3.3338284 : 0 : 1"
+         inkscape:perspectiveID="#perspective3967"
+         id="g3953"
+         style="fill:#338000;stroke:none"
+         sodipodi:type="inkscape:box3d">
+        <path
+           d="m 646.2767,325.35469 268.75,155.92238 0,93.08837 -268.75,-155.92239 z"
+           inkscape:box3dsidetype="11"
+           style="fill:#e9e9ff;fill-rule:evenodd;stroke:none"
+           id="path3965"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           d="m 202.08334,583.06516 0,93.08836 444.19336,-257.71047 0,-93.08836 z"
+           inkscape:box3dsidetype="6"
+           style="fill:#353564;fill-rule:evenodd;stroke:none"
+           id="path3955"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           d="m 202.08334,676.15352 268.75,155.92239 444.19336,-257.71047 -268.75,-155.92239 z"
+           inkscape:box3dsidetype="13"
+           style="fill:#afafde;fill-rule:evenodd;stroke:none"
+           id="path3963"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           d="m 202.08334,583.06516 268.75,155.92239 444.19336,-257.71048 -268.75,-155.92238 z"
+           inkscape:box3dsidetype="5"
+           style="fill:#338000;stroke:none"
+           id="path3957"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           d="m 470.83334,738.98755 0,93.08836 444.19336,-257.71047 0,-93.08837 z"
+           inkscape:box3dsidetype="14"
+           style="fill:#b3ff80;stroke:none"
+           id="path3961"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           d="m 202.08334,583.06516 268.75,155.92239 0,93.08836 -268.75,-155.92239 z"
+           inkscape:box3dsidetype="3"
+           style="fill:#44aa00;stroke:none"
+           id="path3959"
+           sodipodi:type="inkscape:box3dside" />
+      </g>
+    </g>
+    <path
+       style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 427.94118,452.36219 C 695.58824,606.77395 695.58824,606.77395 695.58824,606.77395"
+       id="path4019" />
+    <path
+       style="fill:none;stroke:#ff0000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 693.8984,606.79057 c 0,49.98391 0,51.09466 0,51.09466"
+       id="path4027" />
+    <path
+       id="path4029"
+       d="m 693.8984,653.24218 c 0,49.98391 0,51.09466 0,51.09466"
+       style="fill:none;stroke:#0000ff;stroke-width:5;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <g
+       id="g5431"
+       transform="translate(77.29344,-500.82621)">
+      <path
+         transform="translate(0,308.2677)"
+         id="path4031"
+         d="m 471.11111,715.94633 c 90.37037,-51.85185 91.11111,-51.85185 91.11111,-51.85185"
+         style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:none" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:none"
+         d="M 471.52656,1024.0367 C 381.43638,971.69953 381.06601,971.05803 381.06601,971.05803"
+         id="path5427" />
+      <path
+         id="path5429"
+         d="m 470.41545,1023.2959 c 0.2802,-104.18895 0.65057,-104.83045 0.65057,-104.83045"
+         style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:none" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="646.01691"
+       y="483.19366"
+       id="text5438"><tspan
+         sodipodi:role="line"
+         id="tspan5440"
+         x="646.01691"
+         y="483.19366">X</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="426.67416"
+       y="502.38705"
+       id="text5442"><tspan
+         sodipodi:role="line"
+         id="tspan5444"
+         x="426.67416"
+         y="502.38705">Y</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="537.27905"
+       y="408.43634"
+       id="text5446"><tspan
+         sodipodi:role="line"
+         id="tspan5448"
+         x="537.27905"
+         y="408.43634">Z</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)"
+       d="m 295.72238,653.67967 c 73.50508,43.55925 73.50508,43.55925 73.50508,43.55925"
+       id="path5452" />
+    <path
+       id="path6414"
+       d="M 822.76434,413.10107 C 749.25926,369.54182 749.25926,369.54182 749.25926,369.54182"
+       style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" />
+    <text
+       xml:space="preserve"
+       style="font-size:32px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%"
+       x="302.91263"
+       y="638.76996"
+       id="text6416"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6418"
+         x="302.91263"
+         y="638.76996">1 cm/yr</tspan></text>
+    <text
+       id="text6420"
+       y="393.13889"
+       x="798.05829"
+       style="font-size:32px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%"
+       xml:space="preserve"
+       sodipodi:linespacing="125%"><tspan
+         y="393.13889"
+         x="798.05829"
+         id="tspan6422"
+         sodipodi:role="line">1 cm/yr</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       x="529.12622"
+       y="732.9447"
+       id="text6424"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6426"
+         x="529.12622"
+         y="732.9447">Elastic</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:32px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%"
+       x="533.0097"
+       y="837.79907"
+       id="text6428"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6430"
+         x="533.0097"
+         y="837.79907">Viscoelastic</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       x="701.94171"
+       y="641.68256"
+       id="text6432"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6434"
+         x="701.94171"
+         y="641.68256">Locked</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#0000ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+       x="700"
+       y="691.19714"
+       id="text6436"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6438"
+         x="700"
+         y="691.19714">Creeping</tspan></text>
+  </g>
+</svg>

Copied: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/benchmarks/savageprescott/figs/model_3d.eps (from rev 16839, short/3D/PyLith/trunk/doc/userguide/benchmarks/savageprescott/figs/model_3d.eps)
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/boundaryconditions/boundaryconditions.lyx
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/boundaryconditions/boundaryconditions.lyx	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/boundaryconditions/boundaryconditions.lyx	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,4 +1,4 @@
-#LyX 1.6.2 created this file. For more info see http://www.lyx.org/
+#LyX 1.6.4 created this file. For more info see http://www.lyx.org/
 \lyxformat 345
 \begin_document
 \begin_header
@@ -1821,9 +1821,8 @@
  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.
- The current release of PyLith only supports kinematic (prescribed) slip.
- Support for fault constitutive models for frictional interface conditions
- will be supported in a future release (December 2008).
+ PyLith supports kinematic (prescribed) slip and dynamic (spontaneous) rupture
+ simulations.
 \end_layout
 
 \begin_layout Subsection
@@ -1991,7 +1990,7 @@
 \begin_layout Plain Layout
 \align center
 \begin_inset Graphics
-	filename figs/quad4cohesive.eps
+	filename figs/quad4cohesivekin.eps
 
 \end_inset
 
@@ -2025,58 +2024,6 @@
 
 \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 using Lagrange multipliers inserted into a mesh
- of two quadrilateral cells.
- The zero thickness cohesive cell (shown with dashed lines) controls slip
- on the fault.
- The Lagrange multipliers for a kinematic earthquake source are associated
- with the degrees of freedom for vertices 8 and 9.
- The constraint associated with vertex 8 controls the relative motion between
- vertices 2 and 6, and the constraint associated with vertex 9 controls
- the relative motion between vertices 3 and 7.
- 
-\begin_inset CommandInset label
-LatexCommand label
-name "fig:fault:cohesive:quad4:kin"
-
-\end_inset
-
- 
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
 \begin_layout Subsection
 Fault Parameters
 \end_layout
@@ -2667,7 +2614,7 @@
 \end_layout
 
 \begin_layout Subsubsection
-Kinematic Earthquake Rupture Parameters
+Kinematic Rupture Parameters
 \end_layout
 
 \begin_layout Standard
@@ -3752,6 +3699,22 @@
 
 \end_layout
 
+\begin_layout Subsection
+Dynamic Earthquake Rupture
+\end_layout
+
+\begin_layout Subsubsection
+Governing Equations
+\end_layout
+
+\begin_layout Subsubsection
+Dynamic Rupture Parameters
+\end_layout
+
+\begin_layout Subsubsection
+Fault Constitutive Models
+\end_layout
+
 \begin_layout Section
 Gravitational Body Forces
 \end_layout

Copied: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/cover (from rev 16839, short/3D/PyLith/trunk/doc/userguide/cover)

Deleted: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/coverimage.png
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/extending/extending.lyx
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/extending/extending.lyx	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/extending/extending.lyx	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,4 +1,4 @@
-#LyX 1.6.2 created this file. For more info see http://www.lyx.org/
+#LyX 1.6.5 created this file. For more info see http://www.lyx.org/
 \lyxformat 345
 \begin_document
 \begin_header
@@ -68,7 +68,13 @@
  you set the spatial database to UniformDB, SimpleDB, or SCECCVMH you are
  switching between different compatible components for a spatial database
  facility.
- In this section we provide examples of how to extend PyLith for components
+ Modifying the governing equations to include other physical processes requires
+ changing the data structures associated with the solution and altering
+ the PyLith code.
+\end_layout
+
+\begin_layout Standard
+In this section we provide examples of how to extend PyLith for components
  that users will most likely want to replace with their own custom versions.
  You will need a familiarity with Python, Makefiles, and C++ to write your
  own components.
@@ -718,7 +724,7 @@
 \begin_layout LyX-Code
 
 \family typewriter
---material.problem.homogeneous.material=pylith.materials.contrib.PlaneStrainState
+--timedependent.homogeneous.material=pylith.materials.contrib.PlaneStrainState
 \end_layout
 
 \begin_layout Standard
@@ -734,5 +740,296 @@
 .
 \end_layout
 
+\begin_layout Section
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Extending:FaultConstitutiveModels"
+
+\end_inset
+
+Fault Constitutive Models
+\end_layout
+
+\begin_layout Standard
+PyLith includes a two of the most widely used fault constitutive models,
+ but there are a wide range of models that have been proposed to explain
+ earthquake source processes.
+ In this example, we demonstrate how to extend PyLith by adding your own
+ fault constitutive model.
+ We implement a linear viscous fault constitutive model wherein the perturbation
+ in the coeficient of friction is linearly proportional to the slip rate.
+ This constitutive model, 
+\family typewriter
+ViscousFriction
+\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
+ 
+\family typewriter
+templates/friction
+\family default
+ directory.
+ The 
+\family typewriter
+README
+\family default
+ file in 
+\family typewriter
+templates/friction
+\family default
+ provides detailed instructions for the various steps, and the source files
+ contain numerous comments to guide you through the customization process.
+\end_layout
+
+\begin_layout Standard
+Similar to our previous example of creating a customized bulk constitutive
+ model, the parameters are defined in the C++ code, not in the Pyre framework.
+ As a result, the Python object for the fault constitutive model component
+ is very simple and customization is limited to simply changing the names
+ of objects and labels.
+\end_layout
+
+\begin_layout Standard
+The properties and state variables used in the fault constitutive model
+ are set using arguments to the constuctor of the C++ 
+\family typewriter
+FrictionModel
+\family default
+ object, analogous to the 
+\family typewriter
+ElasticMaterial
+\family default
+ object for bulk constitutive models.
+ In fact, both types of constitutive models used the same underlying C++
+ object (
+\family typewriter
+Metadata::ParamDescription
+\family default
+) to store the description of the parameters and state variables.
+ We define a number of constants at the top of the C++ file and use the
+ 
+\family typewriter
+Metadata
+\family default
+ object to define the properties and state variables.
+ The C++ object for the fault constitutive component includes a number of
+ functions that implement friction as well as several utility routines:
+\end_layout
+
+\begin_layout Description
+
+\family typewriter
+_dbToProperties()
+\family default
+ Computes the physical properties used in the constitutive model equations
+ from the physical properties supplied in spatial databases.
+\end_layout
+
+\begin_layout Description
+
+\family typewriter
+_nondimProperties()
+\family default
+ Nondimensionalizes the physical properties used in the constitutive model
+ equations.
+\end_layout
+
+\begin_layout Description
+
+\family typewriter
+_dimProperties()
+\family default
+ Dimensionalizes the physical properties used in the constitutive model
+ equations.
+\end_layout
+
+\begin_layout Description
+
+\family typewriter
+_dbToStateVars()
+\family default
+ Computes the initial state variables used in the constitutive model equations
+ from the initial values supplied in spatial databases.
+\end_layout
+
+\begin_layout Description
+
+\family typewriter
+_nondimStateVars()
+\family default
+ Nondimensionalizes the state variables used in the constitutive model equations.
+\end_layout
+
+\begin_layout Description
+
+\family typewriter
+_dimStateVars()
+\family default
+ Dimensionalizes the state variables used in the constitutive model equations.
+\end_layout
+
+\begin_layout Description
+
+\family typewriter
+_calcFriction()
+\family default
+ Computes the friction stress given the physical properties, state variables,
+ slip, slip rate, and normal traction.
+\end_layout
+
+\begin_layout Description
+
+\family typewriter
+_updateStateVars()
+\family default
+ Updates the state variables given the physical properties, slip, slip rate,
+ and normal traction.
+\end_layout
+
+\begin_layout Standard
+If a constitutive model does not use state variables, then the state variable
+ routines are omitted.
+ 
+\end_layout
+
+\begin_layout Standard
+Because it is sometimes convenient to supply physical properties for a fault
+ constitutive model that are equivalent but different from the ones that
+ appear in the constitutive equations, each fault constitutive model component
+ has routines to convert the physical property parameters and state variables
+ a user specifies via spatial databases to the physical property properties
+ and state variables used in the constitutive model equations.
+ 
+\end_layout
+
+\begin_layout Standard
+The SWIG interface files for a fault constitutive component are setup 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 (
+\family typewriter
+frictioncontrib.i
+\family default
+ in this case) sets up the Python module, and the SWIG interface file for
+ the component (
+\family typewriter
+ViscousFriction.i
+\family default
+ in this case) defines the functions that should be included in the Python
+ module.
+ Note that because the C++ 
+\family typewriter
+FrictionModel
+\family default
+ object defines a number of pure virtual methods (which merely specify the
+ interface for the functions and do not implement default behavior), we
+ must include many protected functions in the SWIG interface file.
+ If these are omitted, SWIG will give a warning indicating that some of
+ the functions remain abstract (i.e., some pure virtual functions defined
+ in the parent class 
+\family typewriter
+FrictionModel
+\family default
+ were not implemented in the child class 
+\family typewriter
+ViscousFriction
+\family default
+), and no constructor is created.
+ When this happens, you cannot create a 
+\family typewriter
+ViscousFriction
+\family default
+ Python object.
+\end_layout
+
+\begin_layout Standard
+Once the Python, C++, and SWIG interface files are complete, you are ready
+ to configure and build the C++ library and Python module for the component.
+ Edit the 
+\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 
+\family typewriter
+README
+\family default
+ file for detailed instructions).
+\end_layout
+
+\begin_layout Standard
+Because most functionality of the fault constitutive model component is
+ at the C++ level, properly constructed unit tests for the 
+\family typewriter
+component
+\family default
+ should include tests for both the C++ code and Python code.
+ The C++ unit tests can be quite complex, and it is best to examine those
+ used for the fault constitutive models included with PyLith.
+ In this example we create the Python unit tests to verify that we can create
+ a 
+\family typewriter
+ViscousFriction
+\family default
+ Python object and call some of the simple underlying C++ functions.
+ The source files are in the 
+\family typewriter
+templates/friction/tests
+\family default
+ directory.
+ The 
+\family typewriter
+testcontrib.py
+\family default
+ Python script runs the tests defined in 
+\family typewriter
+TestViscousFriction.py
+\family default
+.
+\end_layout
+
+\begin_layout Standard
+Once you have built, installed, and tested the 
+\family typewriter
+ViscousFriction
+\family default
+ component, it is time to use it in a simple example.
+ 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
+\family default
+ replace the line
+\end_layout
+
+\begin_layout LyX-Code
+friction = pylith.friction.StaticFriction
+\end_layout
+
+\begin_layout Standard
+with the line
+\end_layout
+
+\begin_layout LyX-Code
+friction = pylith.friction.contrib.ViscousFriction
+\end_layout
+
+\begin_layout Standard
+or simply add the command line argument
+\end_layout
+
+\begin_layout LyX-Code
+
+\family typewriter
+--timedependent.interfaces.fault.friction=pylith.friction.contrib.ViscousFriction
+\end_layout
+
+\begin_layout Standard
+when running any of the friction examples.
+ You will also need to supply a corresponding spatial database with the
+ physical properties for the viscous friction constitutive model.
+\end_layout
+
 \end_body
 \end_document

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/governingeqns/governingeqns.lyx
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/governingeqns/governingeqns.lyx	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/governingeqns/governingeqns.lyx	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,4 +1,4 @@
-#LyX 1.6.4.1 created this file. For more info see http://www.lyx.org/
+#LyX 1.6.5 created this file. For more info see http://www.lyx.org/
 \lyxformat 345
 \begin_document
 \begin_header
@@ -59,8 +59,8 @@
 \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 acceleratio
-n terms in the quasi-static case), we first derive these equations.
+ 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
@@ -610,7 +610,7 @@
 \begin_inset Formula $S_{f}$
 \end_inset
 
-.
+ (we will consider the case of fault constitutive models in a later section).
  Note that since both 
 \begin_inset Formula $T_{i}$
 \end_inset
@@ -767,7 +767,7 @@
 
 \begin_layout Standard
 We formulate a set of algebraic equations using Galerkin's method.
- We consider a trial solution, 
+ We consider (1) a trial solution, 
 \begin_inset Formula $\vec{u}$
 \end_inset
 
@@ -776,7 +776,7 @@
 \begin_inset Formula $S_{u}$
 \end_inset
 
-, and a weighting function, 
+, and (2) a weighting function, 
 \begin_inset Formula $\vec{\phi}$
 \end_inset
 
@@ -807,16 +807,6 @@
 
 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 Note Greyedout
-status open
-
-\begin_layout Plain Layout
-Add fault constraint
-\end_layout
-
-\end_inset
-
-
 \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}
@@ -842,16 +832,6 @@
 \end_inset
 
 Substituting into the weak form gives
-\begin_inset Note Greyedout
-status open
-
-\begin_layout Plain Layout
-Add fault constraint
-\end_layout
-
-\end_inset
-
-
 \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}
 
@@ -870,17 +850,11 @@
 \begin_inset Formula $S_{u}$
 \end_inset
 
-,
-\begin_inset Note Greyedout
-status open
-
-\begin_layout Plain Layout
-Add fault constraint
-\end_layout
-
+ (we will 
+\begin_inset Formula $S_{f}$
 \end_inset
 
-
+ in section ?? [TODO]),
 \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}
 
@@ -894,26 +868,48 @@
 \end_inset
 
 so that the equation reduces to
-\begin_inset Note Greyedout
-status open
+\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}
 
-\begin_layout Plain Layout
-Add fault constraint
-\end_layout
+\end_inset
 
+Now, 
+\begin_inset Formula $\sigma_{ij}\phi_{i,j}$
 \end_inset
 
+ is a scalar, so it is symmetric,
+\begin_inset Formula \begin{equation}
+\sigma_{ij}\phi_{i,j}=\sigma_{ji}\phi_{j,i},\end{equation}
 
+\end_inset
+
+and we know that 
+\begin_inset Formula $\sigma_{ij}$
+\end_inset
+
+ is symmetric, so
 \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}
+\sigma_{ij}\phi_{i,j}=\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
+
 We express the trial solution and weighting function as linear combinations
  of basis functions,
 \begin_inset Formula \begin{gather*}
-u=\sum_{m}a_{i}^{m}N^{m},\\
-\phi=\sum_{n}c_{i}^{n}N^{n}.\end{gather*}
+u_{i}=\sum_{m}a_{i}^{m}N^{m},\\
+\phi_{i}=\sum_{n}c_{i}^{n}N^{n}.\end{gather*}
 
 \end_inset
 
@@ -934,8 +930,8 @@
  Substituting in the expressions for the trial solution and weighting function
  yields
 \begin_inset Formula \begin{gather*}
--\int_{V}\sigma_{ij}\sum_{m}c_{i}^{m}N_{,j}^{m}\: dV+\int_{S_{T}}T_{i}\sum_{m}c_{i}^{m}N^{m}\, dS+\int_{V}f_{i}\sum_{m}c_{i}^{m}N^{m}\, dV-\int_{V}\rho\sum_{n}\ddot{a}_{i}^{n}N^{n}\sum_{m}c_{i}^{m}N^{m}\ dV=0,\text{ or}\\
-\sum_{m}c_{i}^{m}(-\int_{V}\sigma_{ij}N_{,j}^{m}\: dV+\int_{S_{T}}T_{i}N^{m}\, dS+\int_{V}f_{i}N^{m}\, dV-\int_{V}\rho\sum_{n}\ddot{a}_{i}^{n}N^{n}N^{m}\ dV)=0.\end{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
 
@@ -950,7 +946,7 @@
 
 
 \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=0.\label{eq:elasticity:integral-1}\end{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-1}\end{equation}
 
 \end_inset
 
@@ -958,10 +954,30 @@
 \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*}
+\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},\text{ and}\\
+R_{ki}(u_{i}^{+}-u_{i}^{-})=d_{k}\text{ on }S_{f},\end{gather*}
+
+\end_inset
+
+
+\end_layout
+
 \begin_layout Subsection
 Old
 \end_layout
@@ -1000,16 +1016,6 @@
 \end_inset
 
 Substituting into the first term gives
-\begin_inset Note Greyedout
-status open
-
-\begin_layout Plain Layout
-Add fault constraint
-\end_layout
-
-\end_inset
-
-
 \begin_inset Formula \begin{equation}
 -\int_{V}\frac{1}{2}\sigma_{ij}\left(\phi_{i,j}+\phi_{j,i}\right)\, 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}
 
@@ -1044,7 +1050,7 @@
 
 ,
 \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:t+dt}\end{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
 
@@ -1059,7 +1065,7 @@
 We employ numerical quadrature in the finite-element discretization and
  replace the integrals with sums over the cells and quadrature points,
 \begin_inset Formula \[
-R_{i}^{n}=-\sum_{\text{vol cells}}\sum_{\text{quad pts}}\sigma_{ij}(x_{q},t+\Delta 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+\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})|,\]
+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_inset
 
@@ -1091,7 +1097,7 @@
 Substituting into equation 
 \begin_inset CommandInset ref
 LatexCommand eqref
-reference "eq:elasticity:integral:dynamic:t"
+reference "eq:elasticity:integral:quasistatic"
 
 \end_inset
 
@@ -1111,6 +1117,12 @@
 
 
 \begin_inset Formula \[
+\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_inset
+
+
+\begin_inset Formula \[
 \int_{V}\frac{1}{2}d\sigma_{ij}(t)(\phi_{i,j}+\phi_{j,i})\: dV=-\int_{V}\frac{1}{2}\sigma_{ij}(t)(\phi_{i,j}+\phi_{j,i})\: dV+\int_{S_{T}}T_{i}(t+\Delta t)\phi_{i}\, dS+\int_{V}f_{i}(t+\Delta t)\phi_{i}\, dV.\]
 
 \end_inset

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/install/install.lyx
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/install/install.lyx	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/install/install.lyx	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,4 +1,4 @@
-#LyX 1.6.2 created this file. For more info see http://www.lyx.org/
+#LyX 1.6.4 created this file. For more info see http://www.lyx.org/
 \lyxformat 345
 \begin_document
 \begin_header
@@ -224,7 +224,7 @@
 
 \begin_deeper
 \begin_layout LyX-Code
-$ tar -xzf pylith-1.4.2-linux-i686.tgz
+$ tar -xzf pylith-1.5.0-linux-i686.tgz
 \end_layout
 
 \end_deeper
@@ -298,7 +298,7 @@
 
 \begin_deeper
 \begin_layout LyX-Code
-$ tar -xzf pylith-1.4.2-darwin-powerpc.tgz
+$ tar -xzf pylith-1.5.0-darwin-powerpc.tgz
 \end_layout
 
 \end_deeper
@@ -516,6 +516,8 @@
 \family default
  projects offer pre-built binaries for a variety of systems, including Mac
  OS X.
+ A number of optional PETSc packages that provide additional preconditioners
+ and solvers require a Fortran compiler.
 \end_layout
 
 \begin_layout Subsubsection
@@ -952,7 +954,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ tar xzf petsc-dev-pylith-1.4.2.tgz
+$ tar xzf petsc-dev-pylith-1.5.0.tgz
 \end_layout
 
 \begin_layout Standard
@@ -960,7 +962,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ gunzip -c petsc-dev-pylith-1.4.2.tgz | tar xf -
+$ gunzip -c petsc-dev-pylith-1.5.0.tgz | tar xf -
 \end_layout
 
 \begin_layout Standard
@@ -1569,7 +1571,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ tar xzf nemesis-1.0.tar.gz
+$ tar xzf nemesis-1.0.1.tar.gz
 \end_layout
 
 \begin_layout Standard
@@ -1577,7 +1579,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ gunzip -c nemesis-1.0.tar.gz | tar xf -
+$ gunzip -c nemesis-1.0.1.tar.gz | tar xf -
 \end_layout
 
 \begin_layout Subsubsection
@@ -1649,7 +1651,7 @@
 \begin_inset Newline newline
 \end_inset
 
-$ cd nemesis-1.0
+$ cd nemesis-1.0.1
 \end_layout
 
 \begin_layout Enumerate
@@ -1782,7 +1784,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ tar xzf proj-4.6.1.tar.gz
+$ tar xzf proj-4.7.0.tar.gz
 \end_layout
 
 \begin_layout Standard
@@ -1790,13 +1792,13 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ gunzip -c proj-4.6.1.tar.gz | tar xf -
+$ gunzip -c proj-4.7.0.tar.gz | tar xf -
 \end_layout
 
 \begin_layout Standard
 Download the datum shift archive and unpack it in the 
 \family typewriter
-proj-4.6.0/nad
+proj-4.7.0/nad
 \family default
  directory using the 
 \family typewriter
@@ -1806,7 +1808,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ cd proj-4.6.1/nad$ unzip proj-datumgrid-1.4.zip
+$ cd proj-4.6.1/nad$ unzip proj-datumgrid-1.5.zip
 \end_layout
 
 \begin_layout Standard
@@ -1839,7 +1841,7 @@
 \begin_inset Newline newline
 \end_inset
 
-$ cd proj-4.6.1
+$ cd proj-4.7.0
 \end_layout
 
 \begin_layout Enumerate
@@ -1965,7 +1967,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ tar xzf numpy-1.3.0.tar.gz
+$ tar xzf numpy-1.4.1.tar.gz
 \end_layout
 
 \begin_layout Standard
@@ -1973,7 +1975,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ gunzip -c numpy-1.3.0.tar.gz | tar xf -
+$ gunzip -c numpy-1.4.1.tar.gz | tar xf -
 \end_layout
 
 \begin_layout Subsubsection
@@ -1999,7 +2001,7 @@
 \begin_inset Newline newline
 \end_inset
 
-$ cd numpy-1.3.0
+$ cd numpy-1.4.1
 \end_layout
 
 \begin_layout Enumerate
@@ -2039,6 +2041,8 @@
 PATH
 \family default
 .
+ You can customize the BLAS and LAPACK libraries used in building numpy
+ by editing the site.cfg file.
 \end_layout
 
 \begin_layout Subsection
@@ -2080,6 +2084,7 @@
 \end_inset
 
 .
+ Versions newer than v0.3.5 have are not compatible with PyLith.
  Download the source archive and unpack it using the 
 \family typewriter
 tar
@@ -2088,7 +2093,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ tar xzf FIAT-0.3.4.tar.gz
+$ tar xzf FIAT-0.3.5.tar.gz
 \end_layout
 
 \begin_layout Standard
@@ -2096,7 +2101,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ gunzip -c FIAT-0.3.4.tar.gz | tar xf -
+$ gunzip -c FIAT-0.3.5.tar.gz | tar xf -
 \end_layout
 
 \begin_layout Subsubsection
@@ -2122,7 +2127,7 @@
 \begin_inset Newline newline
 \end_inset
 
-$ cd FIAT-0.3.4
+$ cd FIAT-0.3.5
 \end_layout
 
 \begin_layout Enumerate
@@ -2215,7 +2220,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ tar xzf spatialdata-0.5.tgz
+$ tar xzf spatialdata-0.5.2.tgz
 \end_layout
 
 \begin_layout Standard
@@ -2223,7 +2228,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ gunzip -c spatialdata-0.5.tgz | tar xf -
+$ gunzip -c spatialdata-0.5.2.tgz | tar xf -
 \end_layout
 
 \begin_layout Subsubsection
@@ -2431,7 +2436,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ tar xzf pylith-1.4.2.tgz
+$ tar xzf pylith-1.5.0.tgz
 \end_layout
 
 \begin_layout Standard
@@ -2439,7 +2444,7 @@
 \end_layout
 
 \begin_layout LyX-Code
-$ gunzip -c pylith-1.4.2.tgz | tar xf -
+$ gunzip -c pylith-1.5.0.tgz | tar xf -
 \end_layout
 
 \begin_layout Subsubsection
@@ -2511,7 +2516,7 @@
 \begin_inset Newline newline
 \end_inset
 
-$ cd pylith-1.4.2
+$ cd pylith-1.5.0
 \end_layout
 
 \begin_layout Enumerate

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/intro/intro.lyx
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/intro/intro.lyx	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/intro/intro.lyx	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,4 +1,4 @@
-#LyX 1.6.3 created this file. For more info see http://www.lyx.org/
+#LyX 1.6.4 created this file. For more info see http://www.lyx.org/
 \lyxformat 345
 \begin_document
 \begin_header
@@ -106,31 +106,27 @@
  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.
+ 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.
  Higher-order (quadratic) elements are also supported, but it is not presently
  possible to create a quadratic mesh from the linear meshes provided by
  most meshing packages.
  Materials presently available include isotropic elastic, linear Maxwell
- viscoelastic (3D only), generalized Maxwell viscoelastic (3D only), and
- power-law viscoelastic (3D only).
+ viscoelastic (2-D and 3-D), generalized Maxwell viscoelastic (3-D only),
+ power-law viscoelastic (3-D only), and Drucker-Prager elastoplastic (3-D
+ only).
  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).
- At present, only kinematically-specified fault slip is available.
- In the near future, we will provide several constitutive models for cohesive
- elements, which will allow slip to occur using various fault constitutive
- models.
+ Cohesive elements are used to implement slip across interior surfaces (faults)
+ with both kinematically-specified fault slip and slip governed by fault
+ constitutive models.
 \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 fault constitutive models with cohesive
- (fault) cells, additional bulk constitutive models, automatic generation
- of higher-order elements from linear elements, and the generation of Green's
- functions to be used in inversions.
- Several of these features should be available by Jan 2010.
+ Likely enhancements will include additional bulk and fault constitutive
+ models and generation of Green's functions to be used in inversions.
 \end_layout
 
 \begin_layout Section
@@ -333,8 +329,9 @@
  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 benchmarks for strike-slip and reverse-slip to determine the
- relative local and global error (see Chapter 
+ 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"

Deleted: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/pylith_cover.psd
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/runpylith/runpylith.lyx
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/runpylith/runpylith.lyx	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/runpylith/runpylith.lyx	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,4 +1,4 @@
-#LyX 1.6.3 created this file. For more info see http://www.lyx.org/
+#LyX 1.6.4 created this file. For more info see http://www.lyx.org/
 \lyxformat 345
 \begin_document
 \begin_header
@@ -813,6 +813,20 @@
 \end_layout
 
 \begin_layout Standard
+ADD STUFF HERE 
+\begin_inset Note Greyedout
+status open
+
+\begin_layout Plain Layout
+ADD STUFF HERE ABOUT reorder_mesh AND OTHER MESH GENERATOR SETTINGS
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
 Geometrical and topological information for the finite element mesh may
  be provided by exporting an EXODUS format file from CUBIT, by exporting
  a GMV file and an accompanying Pset file from LaGriT, or by specifying
@@ -1726,7 +1740,7 @@
 <lyxtabular version="3" rows="9" columns="3">
 <features>
 <column alignment="left" valignment="top" width="2in">
-<column alignment="center" valignment="middle" width="0.6in">
+<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">
@@ -1807,7 +1821,7 @@
 \begin_inset Newline newline
 \end_inset
 
-positive_definite
+type
 \end_layout
 
 \end_inset
@@ -1817,8 +1831,8 @@
 
 \begin_layout Plain Layout
 
-\shape italic
-0
+\emph on
+nonzero
 \end_layout
 
 \end_inset
@@ -1827,7 +1841,7 @@
 \begin_inset Text
 
 \begin_layout Plain Layout
-Turn off positive definite shifting.
+Turn on nonzero shifting.
 \end_layout
 
 \end_inset
@@ -1840,11 +1854,7 @@
 \begin_layout Plain Layout
 
 \family typewriter
-sub_pc_factor_shift_
-\begin_inset Newline newline
-\end_inset
-
-nonzero
+ksp_max_it
 \end_layout
 
 \end_inset
@@ -1853,7 +1863,9 @@
 \begin_inset Text
 
 \begin_layout Plain Layout
-n/a
+
+\emph on
+100
 \end_layout
 
 \end_inset
@@ -1862,7 +1874,7 @@
 \begin_inset Text
 
 \begin_layout Plain Layout
-Turn on nonzero shifting.
+Maximum number of iterations.
 \end_layout
 
 \end_inset
@@ -1875,7 +1887,7 @@
 \begin_layout Plain Layout
 
 \family typewriter
-ksp_max_it
+ksp_gmres_restart
 \end_layout
 
 \end_inset
@@ -1884,9 +1896,7 @@
 \begin_inset Text
 
 \begin_layout Plain Layout
-
-\emph on
-100
+50
 \end_layout
 
 \end_inset
@@ -1895,7 +1905,7 @@
 \begin_inset Text
 
 \begin_layout Plain Layout
-Maximum number of iterations.
+Number of iterations after which Gram-Schmidt orthogonalization is restarted.
 \end_layout
 
 \end_inset
@@ -1908,7 +1918,7 @@
 \begin_layout Plain Layout
 
 \family typewriter
-ksp_gmres_restart
+ksp_rtol
 \end_layout
 
 \end_inset
@@ -1917,7 +1927,9 @@
 \begin_inset Text
 
 \begin_layout Plain Layout
-50
+
+\shape italic
+1.0e-08
 \end_layout
 
 \end_inset
@@ -1926,7 +1938,7 @@
 \begin_inset Text
 
 \begin_layout Plain Layout
-Number of iterations after which Gram-Schmidt orthogonalization is restarted.
+Convergence tolerance for relative decrease in residual norm.
 \end_layout
 
 \end_inset
@@ -1937,9 +1949,7 @@
 \begin_inset Text
 
 \begin_layout Plain Layout
-
-\family typewriter
-ksp_rtol
+ksp_atol
 \end_layout
 
 \end_inset
@@ -1949,8 +1959,8 @@
 
 \begin_layout Plain Layout
 
-\shape italic
-1.0e-08
+\emph on
+1.0e-15
 \end_layout
 
 \end_inset
@@ -1959,7 +1969,7 @@
 \begin_inset Text
 
 \begin_layout Plain Layout
-Convergence tolerance for relative decrease in residual norm.
+Convergence tolerance for absolute value in residual norm.
 \end_layout
 
 \end_inset
@@ -2060,7 +2070,15 @@
  Implicit time stepping should be used for quasi-static problems, whereas
  explicit time stepping should be used for dynamic problems which include
  inertial terms.
- An example of setting the formulation facility to the implicit time stepping
+ Two options for explicit time-stepping are available: using a full, consistent
+ Jacobian matrix and a lumped Jacobian matrix.
+ In the lumped Jacobian formulation, the Jacobian is a diagonal matrix and
+ stored as a vector, and PyLith employs an optimized built-in solver rather
+ than a PETSc solver.
+\end_layout
+
+\begin_layout Standard
+An example of setting the formulation facility to the implicit time stepping
  component is:
 \end_layout
 
@@ -2085,6 +2103,19 @@
 formulation = pylith.problems.Explicit
 \end_layout
 
+\begin_layout Standard
+An example of setting the formulation facility to the lumped explicit time
+ stepping component is:
+\end_layout
+
+\begin_layout LyX-Code
+[pylithapp.timedependent]
+\end_layout
+
+\begin_layout LyX-Code
+formulation = pylith.problems.ExplicitLumped
+\end_layout
+
 \begin_layout Subsection
 Time-Stepping Formulation
 \end_layout
@@ -2127,9 +2158,10 @@
 \end_layout
 
 \begin_layout Description
-split_fields Split solution field into a displacement portion (field 0)
- and a Lagrange multiplier portion (field 1) to permit application of sophistica
-ted PETSc preconditions (default is false; for expert users only).
+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; for expert users
+ only).
 \end_layout
 
 \begin_layout Standard

Copied: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/tutorials/shearwave (from rev 16839, short/3D/PyLith/trunk/doc/userguide/tutorials/shearwave)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/tutorials/tutorials.lyx
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/tutorials/tutorials.lyx	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/tutorials/tutorials.lyx	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,4 +1,4 @@
-#LyX 1.6.2 created this file. For more info see http://www.lyx.org/
+#LyX 1.6.5 created this file. For more info see http://www.lyx.org/
 \lyxformat 345
 \begin_document
 \begin_header
@@ -90,7 +90,7 @@
 \color none
  For more complex tutorials, you will also need either CUBIT 
 \begin_inset Flex URL
-status collapsed
+status open
 
 \begin_layout Plain Layout
 
@@ -223,185 +223,155 @@
 \end_layout
 
 \begin_layout Section
-Additional Examples
+Shear Wave in a Bar
 \end_layout
 
 \begin_layout Standard
-The 
-\family typewriter
-examples
-\family default
- directory also contains other examples which are not described in this
- chapter.
- The files associated with these examples contain comments to explain the
- problems they solve.
- Once you understand the examples described in detail in the previous sections
- of this chapter, you should have little trouble understanding these additional
- ones.
- Currently, these problems are very simple cases of using dynamic time stepping
- with absorbing boundaries to simulate shear wave propagation in a 2D or
- 3D bar.
- More complex examples of wave propagation problems will be included in
- future releases.
- 
+This suite of examples focuses on the dynamics of a shear wave propagating
+ down an 8 km long bar with a 400 m wide cross-section.
+ Motion is limited to shear deformation by fixing the longitudinal degree
+ of freedom.
+ For each cell type (tri3, quad4, tet4, and hex8) we generate a shear wave
+ using a kinematic fault rupture with simultaneous slip over the fault surface,
+ which we place at the center of the bar.
+ The discretization size is 200 m in all cases.
+ The slip time histories follows the integral of Brune's far-field time
+ function with slip initiating at 0.1 s, a left-lateral final slip of 1.0
+ m, and a rise time of 2.0 s.
+ The shear wave speed in the bar is 1.0 km/s, so the shear wave reaches each
+ end of the bar at 4.1 s.
+ Absorbing boundaries on the ends of the bar prevent significant reflections.
+ The bar comes to a rest with a static offset.
 \end_layout
 
 \begin_layout Standard
 \noindent
 \align center
-\begin_inset Float table
-placement H
+\begin_inset Float figure
 wide false
 sideways false
 status open
 
 \begin_layout Plain Layout
 \align center
-\begin_inset Tabular
-<lyxtabular version="3" rows="5" columns="2">
-<features>
-<column alignment="left" valignment="top" width="1.75in">
-<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_inset Graphics
+	filename figs/bar.eps
+	lyxscale 50
 
-\begin_layout Plain Layout
-
-\series bold
-Directory
-\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
+\begin_inset Caption
 
-\family typewriter
-bar_shearwave/tri3
-\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
-Wave propagation in a 2D bar discretized with triangular cells
-\end_layout
+Domain for shear wave propagation in a 8.0 km bar with 400 m cross-section.
+ We generate a shear wave via slip on a fault located in the middle of the
+ bar while limiting deformation to the transverse direction.
+\begin_inset CommandInset label
+LatexCommand label
+name "fig:shearwave:domain"
 
 \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
-bar_shearwave/quad4
 \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
-Wave propagation in a 2D bar discretized with quadrilateral cells
+
 \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
-bar_shearwave/tet4
 \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
-Wave propagation in a 3D bar discretized with tetrahedral cells
+\begin_layout Standard
+For the bar discretized with quad4 cells we also consider the fault subjected
+ to frictional sliding controlled by static friction, linear slip-weakening
+ friction, and rate- and state-friction.
+ We use initial tractions applied to the fault to drive the dislocation
+ and generate the shear wave.
+ Because the fault tractions are constant in time, they continue to drive
+ the motion even after the shear wave reaches the absorbing boundary, leading
+ to a steady state solution with uniform shear deformation in the bar and
+ a constant slip rate on the fault.
+ 
 \end_layout
 
+\begin_layout Standard
+\begin_inset CommandInset include
+LatexCommand input
+filename "shearwave/tri3.lyx"
+
 \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
-bar_shearwave/hex8
-\end_layout
+\begin_inset CommandInset include
+LatexCommand input
+filename "shearwave/tet4.lyx"
 
 \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
-Wave propagation in a 3D bar discretized with hexahedral cells
-\end_layout
 
-\end_inset
-</cell>
-</row>
-</lyxtabular>
+\begin_inset CommandInset include
+LatexCommand input
+filename "shearwave/hex8.lyx"
 
 \end_inset
 
 
-\end_layout
+\begin_inset CommandInset include
+LatexCommand input
+filename "shearwave/quad4.lyx"
 
-\begin_layout Plain Layout
-\begin_inset Caption
+\end_inset
 
-\begin_layout Plain Layout
-\begin_inset CommandInset label
-LatexCommand label
-name "tab:additional:examples"
 
-\end_inset
+\end_layout
 
-Additional examples distributed with the PyLith source code.
+\begin_layout Section
+Additional Examples
 \end_layout
 
-\end_inset
+\begin_layout Standard
+The 
+\family typewriter
+examples
+\family default
+ directory also contains an example of using PyLith to compute Green's functions
+ associated with slip at points on a fault surface in the 
+\family typewriter
+greensfns
+\family default
+ directory.
+ The files associated with this example contain comments to explain how
+ the simulation is setup.
+ Once you understand the examples described in detail in the previous sections
+ of this chapter, you should have little trouble understanding this additional
+ one.
+\end_layout
 
+\begin_layout Standard
+The CIG subversion software repository 
+\begin_inset Flex URL
+status collapsed
 
+\begin_layout Plain Layout
+
+http://geodynamics.org/svn/cig/short/3D/PyLith/benchmarks/trunk
 \end_layout
 
 \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
+ are so large; instead they include the CUBIT journal files that can be
+ used to generate the meshes.
 \end_layout
 
 \end_body

Modified: short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/userguide.lyx
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/userguide.lyx	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/doc/userguide/userguide.lyx	2010-05-30 21:53:47 UTC (rev 16840)
@@ -66,7 +66,7 @@
 \noindent
 \align center
 \begin_inset Graphics
-	filename pylith_cover.pdf
+	filename cover/cover.pdf
 	width 75page%
 
 \end_inset

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/mesh/box_hex8_1000m.exo
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/mesh/mesh_hex8_1000m.jou
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/mesh/mesh_hex8_1000m.jou	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/mesh/mesh_hex8_1000m.jou	2010-05-30 21:53:47 UTC (rev 16840)
@@ -44,7 +44,7 @@
 group "face_xpos" add node in surface 20
 group "face_xpos" add node in surface 28
 nodeset 11 group face_xpos
-nodeset 11 name "face xpos"
+nodeset 11 name "face_xpos"
 
 # ----------------------------------------------------------------------
 # Create nodeset for -x face
@@ -52,7 +52,7 @@
 group "face_xneg" add node in surface 30
 group "face_xneg" add node in surface 38
 nodeset 12 group face_xneg
-nodeset 12 name "face xneg"
+nodeset 12 name "face_xneg"
 
 # ----------------------------------------------------------------------
 # Create nodeset for +y face
@@ -62,7 +62,7 @@
 group "face_ypos" add node in surface 33
 group "face_ypos" add node in surface 35
 nodeset 13 group face_ypos
-nodeset 13 name "face ypos"
+nodeset 13 name "face_ypos"
 
 # ----------------------------------------------------------------------
 # Create nodeset for -y face
@@ -72,7 +72,7 @@
 group "face_yneg" add node in surface 31
 group "face_yneg" add node in surface 37
 nodeset 14 group face_yneg
-nodeset 14 name "face yneg"
+nodeset 14 name "face_yneg"
 
 # ----------------------------------------------------------------------
 # Create nodeset for -z face
@@ -80,7 +80,7 @@
 group "face_zneg" add node in surface 12
 group "face_zneg" add node in surface 16
 nodeset 15 group face_zneg
-nodeset 15 name "face zneg"
+nodeset 15 name "face_zneg"
 
 # ----------------------------------------------------------------------
 # Create nodeset for -z face w/o fault
@@ -88,7 +88,7 @@
 group "face_zneg_nofault" add node in face_zneg
 group "face_zneg_nofault" remove node in fault
 nodeset 16 group face_zneg_nofault
-nodeset 16 name "face zneg nofault"
+nodeset 16 name "face_zneg_nofault"
 
 # ----------------------------------------------------------------------
 # Create nodeset for +z face
@@ -96,7 +96,7 @@
 group "face_zpos" add node in surface 10
 group "face_zpos" add node in surface 17
 nodeset 17 group face_zpos
-nodeset 17 name "face zpos"
+nodeset 17 name "face_zpos"
 
 # ----------------------------------------------------------------------
 # Export exodus file

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/pylithapp.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/pylithapp.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/pylithapp.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,6 +1,10 @@
 # -*- Python -*-
 [pylithapp]
 
+# This is not a self-contained simulation configuration file. This
+# file only specifies the general parameters common to the simulations
+# in this directory.
+
 # ----------------------------------------------------------------------
 # journal
 # ----------------------------------------------------------------------
@@ -16,8 +20,6 @@
 fiatlagrange = 1
 pylithapp = 1
 materials = 1
-powerlaw3d = 1
-##implicit = 1
 
 # ----------------------------------------------------------------------
 # mesh_generator
@@ -45,25 +47,20 @@
 [pylithapp.timedependent]
 
 # Set materials to an array of 2 materials:
-#   'elastic' and 'inelastic'
-materials = [elastic,inelastic]
+#   'upper_crust' and 'lower_crust'
+materials = [upper_crust,lower_crust]
 
-# Change from default material (elastic, isotropic, 3-D material) to
-# Maxwell viscoelastic, isotropic 3-D material.
-materials.inelastic = pylith.materials.MaxwellIsotropic3D
-
-[pylithapp.timedependent.materials.elastic]
-label = Elastic material
+[pylithapp.timedependent.materials.upper_crust]
+label = Upper crust material
 id = 1
 db_properties.iohandler.filename = spatialdb/mat_elastic.spatialdb
 quadrature.cell = pylith.feassemble.FIATLagrange
 quadrature.cell.dimension = 3
 
-# We do not define the database info for the inelastic material, since
-# a different database type may be used for some examples.
-[pylithapp.timedependent.materials.inelastic]
-label = Inelastic material
+[pylithapp.timedependent.materials.lower_crust]
+label = Lower crust material
 id = 2
+db_properties.iohandler.filename = spatialdb/mat_elastic.spatialdb
 quadrature.cell = pylith.feassemble.FIATLagrange
 quadrature.cell.dimension = 3
 
@@ -76,25 +73,29 @@
 
 # Preconditioner settings.
 pc_type = asm
-sub_pc_factor_shift_type = none
+sub_pc_factor_shift_type = nonzero
 
 # Convergence parameters.
 ksp_rtol = 1.0e-8
-ksp_max_it = 500
+ksp_atol = 1.0e-15
+ksp_max_it = 100
 ksp_gmres_restart = 50
 
-# Linear solution logging options.
+# Linear solver monitoring options.
 ksp_monitor = true
 ksp_view = true
 ksp_converged_reason = true
 
-# Nonlinear solution logging options.
+# Nonlinear solver monitoring options.
+snes_rtol = 1.0e-8
+snes_atol = 1.0e-15
+snes_max_it = 100
 snes_monitor = true
 snes_view = true
 snes_converged_reason = true
 
-# PETSc run summary -- useful for performance information.
+# PETSc summary -- useful for performance information.
 log_summary = true
 
-# Hopefully not necessary.
+# Uncomment to launch gdb when starting PyLith.
 # start_in_debugger = true

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/finalslip.spatialdb
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/finalslip.spatialdb	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/finalslip.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -2,7 +2,7 @@
 //
 // This spatial database specifies the distribution of slip on the
 // fault surface. In this case we prescribe a piecewise linear, depth
-// dependent distribution of slip. The slip is 2.0 m right-lateral
+// dependent distribution of slip. The slip is 2.0 m left-lateral
 // with 0.25 m of reverse slip at the surface with a linear taper from
 // 2.0 m to 0.0 m from -2 km to -4 km.
 //
@@ -26,6 +26,6 @@
 // (4) left-lateral-slip (m) (right-lateral is negative)
 // (5) reverse-slip (m)
 // (6) fault-opening (m)
-0.0  0.0  0.0    -2.00  0.25  0.00
-0.0  0.0 -2.0    -2.00  0.00  0.00
+0.0  0.0  0.0     2.00  0.25  0.00
+0.0  0.0 -2.0     2.00  0.00  0.00
 0.0  0.0 -4.0     0.00  0.00  0.00

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/finalslip_rupture.spatialdb
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/finalslip_rupture.spatialdb	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/finalslip_rupture.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,7 +1,7 @@
 // -*- C++ -*- (tell Emacs to use C++ mode for syntax highlighting)
 //
 // This spatial database specifies the distribution of slip on the
-// fault surface. In this case we impose 4.0 m of right-lateral slip
+// fault surface. In this case we impose 4.0 m of left-lateral slip
 // for z >= -2.0 km with zero slip for z < -2.0 km. There is no reverse
 // slip or fault opening.
 //
@@ -25,7 +25,7 @@
 // (4) left-lateral-slip (m) (right-lateral is negative)
 // (5) reverse-slip (m)
 // (6) fault-opening (m)
-0.0  0.0   0.00    -4.0  0.0  0.0
-0.0  0.0  -2.00    -4.0  0.0  0.0
+0.0  0.0   0.00     4.0  0.0  0.0
+0.0  0.0  -2.00     4.0  0.0  0.0
 0.0  0.0  -2.01     0.0  0.0  0.0
 0.0  0.0  -4.00     0.0  0.0  0.0

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/fixeddisp_axial.spatialdb
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/fixeddisp_axial.spatialdb	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/fixeddisp_axial.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -4,9 +4,6 @@
 // displacement field for Dirichlet boundary conditions associated
 // with axial displacements on -x and +x
 //
-// dof-0: Ux(x) = 0
-// dof-1: Uy(x) = 1.0 m * x / 3 km
-// dof-2: Uz(x) = 0
 //
 #SPATIAL.ascii 1
 SimpleDB {
@@ -28,5 +25,5 @@
 // (4) Ux (m)
 // (5) Uy (m)
 // (6) Uz (m)
--3.0  0.0  0.0   -1.0   0.0  0.0
-+3.0  0.0  0.0    1.0   0.0  0.0
+-3.0  0.0  0.0   +1.0   0.0  0.0
++3.0  0.0  0.0   -1.0   0.0  0.0

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/fixeddisp_shear.spatialdb
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/fixeddisp_shear.spatialdb	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/fixeddisp_shear.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -4,10 +4,6 @@
 // displacement field for Dirichlet boundary conditions associated
 // with shear in the xy plane.
 //
-// dof-0: Ux(x) = 0
-// dof-1: Uy(x) = 1.0 m * x / 3 km
-// dof-2: Uz(x) = 0
-//
 #SPATIAL.ascii 1
 SimpleDB {
   num-values = 3

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/mat_druckerprager.spatialdb (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/spatialdb/mat_druckerprager.spatialdb)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/mat_druckerprager.spatialdb	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/mat_druckerprager.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,30 @@
+// -*- C++ -*- (tell Emacs to use C++ mode for syntax highlighting)
+//
+// This spatial database specifies the distribution of material
+// properties for a power-law viscoelastic material. In this case,
+// the material properties are uniform.
+//
+#SPATIAL.ascii 1
+SimpleDB {
+  num-values = 6 // number of material property values
+  value-names =  density vs vp friction-angle cohesion dilatation-angle // names of the material property values
+  value-units =  kg/m**3  m/s  m/s degree kPa degree // units
+  num-locs = 1 // number of locations
+  data-dim = 0
+  space-dim = 3
+  cs-data = cartesian {
+    to-meters = 1.0
+    space-dim = 3
+  }
+}
+// Columns are
+// (1) x coordinate (m)
+// (2) y coordinate (m)
+// (3) z coordinate (m)
+// (4) density (kg/m^3)
+// (5) vs (m/s)
+// (6) vp (m/s)
+// (7) friction-angle (degree)
+// (8) cohesion (kPa)
+// (8) dilatation-angle (degree)
+0.0  0.0  0.0   2500.0  3000.0  5291.502622129181 30.0 5000.0 30.0

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/sliprate_creep.spatialdb
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/sliprate_creep.spatialdb	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/spatialdb/sliprate_creep.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -2,7 +2,7 @@
 //
 // This spatial database specifies the distribution of slip rate on
 // the fault surface for a constant slip rate time function. In this
-// case we specify a uniform slip rate of -2.0 cm/yr
+// case we specify a uniform slip rate of 2.0 cm/yr
 // (6.3376175628057904e-10 m/s) for z < -2.0 km and zero slip for z >=
 // -2.0 km. There is no reverse-slip or fault opening.
 //
@@ -28,5 +28,5 @@
 // (6) fault-opening rate (m/s)
 0.0   0.0   0.00     0.00  0.0  0.0
 0.0   0.0  -2.00     0.00  0.0  0.0
-0.0   0.0  -2.01    -2.00  0.0  0.0
-0.0   0.0  -4.00    -2.00  0.0  0.0
+0.0   0.0  -2.01     2.00  0.0  0.0
+0.0   0.0  -4.00     2.00  0.0  0.0

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step01.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step01.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step01.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,6 +1,22 @@
 # -*- Python -*-
 [pylithapp]
 
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This is a purely elastic static problem using only Dirichlet
+# (displacement) boundary conditions. The lower (minimum z) boundary is
+# held fixed in the z-direction. On the positive and negative x-boundaries,
+# displacements are applied corresponding to 1 m of shear displacement in
+# the positive and negative y-directions, and 1 m of axial (x) compression
+# on each side.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
 # This is not a self-contained simulation configuration file. This
 # file only specifies parameters specific to tutorial step01.
 # The general parameters are specificed in the pylithapp.cfg
@@ -9,7 +25,7 @@
 # To run the simulation:
 # pylith step01.cfg
 #
-# Output will be directed to directory step01.
+# Output will be directed to the directory step01.
 
 # ----------------------------------------------------------------------
 # problem
@@ -23,53 +39,48 @@
 # We will output the solution over the domain and the ground surface.
 output = [domain,subdomain]
 
-# Set subdomain component to OutputSolnSubset (subset of domain).
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
 output.subdomain = pylith.meshio.OutputSolnSubset
 
 # ----------------------------------------------------------------------
-# materials
-# ----------------------------------------------------------------------
-
-# We specifically define the database info for the inelastic material
-# for each model, since the type of spatialdb can be different.
-
-[pylithapp.timedependent.materials.inelastic]
-db_properties.iohandler.filename = spatialdb/mat_maxwell.spatialdb
-
-# ----------------------------------------------------------------------
 # boundary conditions
 # ----------------------------------------------------------------------
+# Set the parameters for Dirichlet boundary conditions applied on the
+# +x, -x, and -z faces of the box.
+#
+# We fix the x and y degrees of freedom on the +x and -x faces, and
+# fix the z degree of freedom on the bottom (-z) face.
+#
 # For x_pos and x_neg, we change the database from ZeroDispDB (which
-# specifies a zero value everywhere) to SimpleDB (which uses a data file
-# to specify a spatial variation).
+# specifies a zero value) to SimpleDB (which uses a data file to
+# specify a spatial variation).
+#
 # For z_neg, we keep the default ZeroDispDB, since we just want zero
 # z-displacements on that boundary.
+#
 
-# Set the parameters for Dirichlet boundary conditions applied on the
-# +x and -x faces of the box.
+# The label corresponds to the name of the nodeset in CUBIT.
 
-# We fix the x and y degrees of freedom on the +x and -x faces, and
-# fix the z degree of freedom on the bottom face.
-
-# The label corresponds to the nodeset ID in CUBIT.
-
+# +x face
 [pylithapp.timedependent.bc.x_pos]
 bc_dof = [0, 1]
-label = 11
+label = face_xpos
 db_initial = spatialdata.spatialdb.SimpleDB
 db_initial.label = Dirichlet BC on +x
 db_initial.iohandler.filename = spatialdb/fixeddisp_axial_shear.spatialdb
 
+# -x face
 [pylithapp.timedependent.bc.x_neg]
 bc_dof = [0, 1]
-label = 12
+label = face_xneg
 db_initial = spatialdata.spatialdb.SimpleDB
 db_initial.label = Dirichlet BC on -x
 db_initial.iohandler.filename = spatialdb/fixeddisp_axial_shear.spatialdb
 
+# -z face
 [pylithapp.timedependent.bc.z_neg]
 bc_dof = [2]
-label = 15
+label = face_zneg
 db_initial.label = Dirichlet BC on -z
 
 # ----------------------------------------------------------------------
@@ -81,19 +92,18 @@
 
 # Give basename for VTK domain output of solution over ground surface.
 [pylithapp.problem.formulation.output.subdomain]
-label = 17 ; nodeset for subdomain
+# Name of nodeset for ground surface.
+label = face_zpos
 writer.filename = step01/step01-groundsurf.vtk
 
-# Give basename for VTK output of elastic state variables.
-[pylithapp.timedependent.materials.elastic.output]
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+# Average values over quadrature points.
 cell_filter = pylith.meshio.CellFilterAvgMesh
-writer.filename = step01/step01-elastic.vtk
+writer.filename = step01/step01-upper_crust.vtk
 
-# Give basename for VTK output of inelastic state variables.
-[pylithapp.timedependent.materials.inelastic.output]
-# Default (elastic) info and data fields do not include viscoelastic
-# information, so we include it here.
-cell_info_fields = [density,mu,lambda,maxwell_time]
-cell_data_fields = [total_strain,stress,viscous_strain]
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+# Average values over quadrature points.
 cell_filter = pylith.meshio.CellFilterAvgMesh
-writer.filename = step01/step01-inelastic.vtk
+writer.filename = step01/step01-lower_crust.vtk

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step03.cfg (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/step03.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step03.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step03.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,130 @@
+# -*- Python -*-
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This is a purely elastic static problem using Dirichlet (displacement)
+# boundary conditions and slip on a vertical fault, where the amount of
+# slip increases with depth. On the +x and -x boundaries, the x and
+# y-displacements are held fixed, while on the -z boundary, the
+# z-displacements are held fixed. The fault slip is predominantly
+# left-lateral, with 2 m of slip applied between 0 and 2 km depth,
+# tapering linearly to 0 m at the base of the model (4 km depth).
+# A small amount of reverse slip (0.25 m) is applied at the surface,
+# tapering to 0 m at 2 km depth.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies parameters specific to tutorial step03.
+# The general parameters are specificed in the pylithapp.cfg
+# file which PyLith reads by default.
+#
+# To run the simulation:
+# pylith step03.cfg
+#
+# Output will be directed to directory step03.
+
+# ----------------------------------------------------------------------
+# problem
+# ----------------------------------------------------------------------
+[pylithapp.timedependent]
+# Set bc to an array of 3 boundary conditions: 'x_pos','x_neg', and 'z_neg'.
+bc = [x_pos,x_neg,z_neg]
+
+# Set interfaces to an array of 1 fault: 'fault'.
+interfaces = [fault]
+
+[pylithapp.timedependent.implicit]
+# Set the output to an array of 2 output managers.
+# We will output the solution over the domain and the ground surface.
+output = [domain,subdomain]
+
+# Set subdomain component to OutputSolnSubset (subset of domain).
+output.subdomain = pylith.meshio.OutputSolnSubset
+
+# ----------------------------------------------------------------------
+# boundary conditions
+# ----------------------------------------------------------------------
+# Set the parameters for Dirichlet boundary conditions applied on the
+# -x, +x, and -z faces of the box.
+#
+# We fix the x and y degrees of freedom on the -x and +x faces, and
+# fix the z degree of freedom on the bottom (-z) face.
+#
+# For all boundaries, we retain the default ZeroDispDB, which specifies
+# a zero value.
+#
+
+# The label corresponds to the name of the nodeset in CUBIT.
+
+# +x face
+[pylithapp.timedependent.bc.x_pos]
+bc_dof = [0, 1]
+label = face_xpos
+db_initial.label = Dirichlet BC on +x
+
+# -x face
+[pylithapp.timedependent.bc.x_neg]
+bc_dof = [0, 1]
+label = face_xneg
+db_initial.label = Dirichlet BC on -x
+
+# -z face
+[pylithapp.timedependent.bc.z_neg]
+bc_dof = [2]
+label = face_zneg_nofault
+db_initial.label = Dirichlet BC on -z
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+# Set the type of fault interface condition.
+[pylithapp.timedependent.interfaces]
+fault = pylith.faults.FaultCohesiveKin
+
+# Set the parameters for the fault interface condition.
+[pylithapp.timedependent.interfaces.fault]
+# The label corresponds to the name of the nodeset in CUBIT.
+label = fault
+
+# We must define the quadrature information for fault cells.
+# The fault cells are 2D (surface).
+quadrature.cell = pylith.feassemble.FIATLagrange
+quadrature.cell.dimension = 2
+
+# The slip time and final slip are defined in spatial databases.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.rupture.slip_function]
+slip.iohandler.filename = spatialdb/finalslip.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.domain.writer]
+filename = step03/step03.vtk
+
+# Give basename for VTK domain output of solution over ground surface.
+[pylithapp.problem.formulation.output.subdomain]
+label = face_zpos ; Name of nodeset for ground surface.
+writer.filename = step03/step03-groundsurf.vtk
+
+# Give basename for VTK fault output.
+[pylithapp.problem.interfaces.fault.output]
+writer.filename = step03/step03-fault.vtk
+
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+cell_filter = pylith.meshio.CellFilterAvgMesh
+writer.filename = step03/step03-upper_crust.vtk
+
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+cell_filter = pylith.meshio.CellFilterAvgMesh
+writer.filename = step03/step03-lower_crust.vtk

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step04.cfg (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/step04.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step04.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step04.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,160 @@
+# -*- Python -*-
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This is a time-dependent problem with velocity boundary conditions.
+# Velocities in the + and - y-directions are applied on the + and -
+# x-faces, and the x-displacements are held fixed on those boundaries.
+# The z-displacements are held fixed on the -z face.
+# Two materials are used:
+# 1. Elastic upper crust.
+# 2. Viscoelastic (Maxwell) lower crust.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies parameters specific to tutorial step04.
+# The general parameters are specificed in the pylithapp.cfg
+# file which PyLith reads by default.
+#
+# To run the simulation:
+# pylith step04.cfg
+#
+# Output will be directed to the directory step04.
+
+# ----------------------------------------------------------------------
+# problem
+# ----------------------------------------------------------------------
+[pylithapp.timedependent]
+# Set bc to an array of 3 boundary conditions: 'x_pos','x_neg', and 'z_neg'.
+bc = [x_pos,x_neg,z_neg]
+
+[pylithapp.timedependent.implicit]
+# Set the output to an array of 2 output managers.
+# We will output the solution over the domain and the ground surface.
+output = [domain,subdomain]
+
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
+output.subdomain = pylith.meshio.OutputSolnSubset
+
+# Change the total simulation time to 200 years, and use a constant time
+# step size of 20 years.
+[pylithapp.timedependent.implicit.time_step]
+total_time = 200.0*year
+dt = 20.0*year
+
+# ----------------------------------------------------------------------
+# materials
+# ----------------------------------------------------------------------
+# Change material type of lower crust to Maxwell viscoelastic.
+[pylithapp.timedependent]
+materials.lower_crust = pylith.materials.MaxwellIsotropic3D
+
+# Provide a spatial database from which to obtain property values.
+# Since there are additional properties and state variables for the Maxwell
+# model, we explicitly request that they be output. Properties are named in
+# cell_info_fields and state variables are named in cell_data_fields.
+[pylithapp.timedependent.materials.lower_crust]
+db_properties.iohandler.filename = spatialdb/mat_maxwell.spatialdb
+output.cell_info_fields = [density,mu,lambda,maxwell_time]
+output.cell_data_fields = [total_strain,stress,viscous_strain]
+
+# ----------------------------------------------------------------------
+# boundary conditions
+# ----------------------------------------------------------------------
+# Set the parameters for Dirichlet boundary conditions applied on the
+# +x, -x, and -z faces of the box.
+#
+# We fix the x degree of freedom on the +x and -x faces, and
+# fix the z degree of freedom on the bottom (-z) face. Constant velocities
+# in the +y and -y directions are applied on +x and -x.
+#
+# For x_pos and x_neg, we retain the default ZeroDispDB for displacements
+# (db_initial), since we do not want initial displacements. We change the
+# default database for velocities (db_rate) to UniformDB, which allows
+# nonzero velocities. Using UniformDB, we also specify the velocity values
+# in this .cfg file, rather than using a spatialdb file.
+#
+# For z_neg, we keep the default ZeroDispDB, since we just want zero
+# z-displacements on that boundary.
+#
+
+# The label corresponds to the name of the nodeset in CUBIT.
+
+# +x face
+[pylithapp.timedependent.bc.x_pos]
+bc_dof = [0, 1]
+label = face_xpos
+db_initial.label = Dirichlet BC on +x
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on +x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,1.0*cm/year,0.0*year]
+
+# -x face
+[pylithapp.timedependent.bc.x_neg]
+bc_dof = [0, 1]
+label = face_xneg
+db_initial.label = Dirichlet BC on -x
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on +x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,-1.0*cm/year,0.0*year]
+
+# -z face
+[pylithapp.timedependent.bc.z_neg]
+bc_dof = [2]
+label = face_zneg
+db_initial.label = Dirichlet BC on -z
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.domain]
+# We specify that output occurs in terms of a given time frequency, and
+# ask for output every 40 years. The time stamps of the output files are
+# in years (rather than the default of seconds), and we give a format for
+# the time stamp.
+output_freq = time_step
+time_step = 40.0*year
+writer.filename = step04/step04.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK domain output of solution over ground surface.
+[pylithapp.problem.formulation.output.subdomain]
+# Name of nodeset for ground surface.
+label = face_zpos
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step04/step04-groundsurf.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 40.0*year
+writer.filename = step04/step04-upper_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 40.0*year
+writer.filename = step04/step04-lower_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step05.cfg (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/step05.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step05.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step05.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,186 @@
+# -*- Python -*-
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This is a time-dependent problem using a combination of constant
+# velocity Dirichlet boundary conditions and time-dependent Neumann
+# (traction) boundary conditions.
+
+# This problem is similar to example 4, with the following differences:
+# 1. The Dirichlet BC on -x in the y-direction include an initial
+# displacement (applied in the elastic solution) as well as a constant
+# velocity.
+# 2. Neumann (traction) BC are applied in the -x direction on the +x face.
+# An initial traction is applied in the elastic solution, and then at
+# t=100 years the traction reduces linearly until it reaches zero at
+# t=200 years (the end of the simulation).
+#
+# Two materials are used:
+# 1. Elastic upper crust.
+# 2. Viscoelastic (Maxwell) lower crust.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies parameters specific to tutorial step05.
+# The general parameters are specificed in the pylithapp.cfg
+# file which PyLith reads by default.
+#
+# To run the simulation:
+# pylith step05.cfg
+#
+# Output will be directed to the directory step05.
+
+# ----------------------------------------------------------------------
+# problem
+# ----------------------------------------------------------------------
+[pylithapp.timedependent]
+# Set bc to an array of 3 boundary conditions: 'x_pos','x_neg', and 'z_neg'.
+bc = [x_pos,x_neg,z_neg]
+
+[pylithapp.timedependent.implicit]
+# Set the output to an array of 2 output managers.
+# We will output the solution over the domain and the ground surface.
+output = [domain,subdomain]
+
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
+output.subdomain = pylith.meshio.OutputSolnSubset
+
+# Change the total simulation time to 200 years, and use a constant time
+# step size of 20 years.
+[pylithapp.timedependent.implicit.time_step]
+total_time = 200.0*year
+dt = 20.0*year
+
+# ----------------------------------------------------------------------
+# materials
+# ----------------------------------------------------------------------
+# Change material type of lower crust to Maxwell viscoelastic.
+[pylithapp.timedependent]
+materials.lower_crust = pylith.materials.MaxwellIsotropic3D
+
+# Provide a spatial database from which to obtain property values.
+# Since there are additional properties and state variables for the Maxwell
+# model, we explicitly request that they be output. Properties are named in
+# cell_info_fields and state variables are named in cell_data_fields.
+[pylithapp.timedependent.materials.lower_crust]
+db_properties.iohandler.filename = spatialdb/mat_maxwell.spatialdb
+output.cell_info_fields = [density,mu,lambda,maxwell_time]
+output.cell_data_fields = [total_strain,stress,viscous_strain]
+
+# ----------------------------------------------------------------------
+# boundary conditions
+# ----------------------------------------------------------------------
+# Set the parameters for boundary conditions applied on the
+# +x, -x, and -z faces of the box.
+#
+# We fix the x degree of freedom on the -x face, and
+# fix the z degree of freedom on the bottom (-z) face. Constant velocities
+# in the -y direction are applied on -x, along with an initial displacement.
+# On the +x face, we apply compressional traction (Neumann) BC initially,
+# and then at t=100 years we begin reducing the magnitudes until they are
+# reduced to zero at t=200 years (the end of the simulation).
+#
+# For x_neg, we use a UniformDB for both initial displacements and
+# velocities.
+#
+# For z_neg, we keep the default ZeroDispDB, since we just want zero
+# z-displacements on that boundary.
+#
+
+# The label corresponds to the name of the nodeset in CUBIT.
+
+# +x face -- first change bc type to Neumann
+[pylithapp.timedependent.bc]
+x_pos = pylith.bc.Neumann
+
+[pylithapp.timedependent.bc.x_pos]
+label = face_xpos
+# Give quadrature information for integration of tractions.
+quadrature.cell = pylith.feassemble.FIATLagrange
+quadrature.cell.dimension = 2
+quadrature.cell.quad_order = 2
+
+# Fist specify a UniformDB for the initial tractions, along with the values.
+db_initial = spatialdata.spatialdb.UniformDB
+db_initial.label = Neumann BC on +x
+db_initial.values = [traction-shear-horiz,traction-shear-vert,traction-normal]
+db_initial.data = [0.0*MPa,0.0*MPa,-1.0*MPa]
+# Provide information on traction rates.
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Neumann rate BC on +x
+db_rate.values = [traction-rate-shear-horiz,traction-rate-shear-vert,traction-rate-normal,rate-start-time]
+db_rate.data = [0.0*MPa/year,0.0*MPa/year,0.01*MPa/year,100.0*year]
+
+# -x face
+[pylithapp.timedependent.bc.x_neg]
+bc_dof = [0, 1]
+label = face_xneg
+# Initial displacements.
+db_initial = spatialdata.spatialdb.UniformDB
+db_initial.label = Dirichlet BC on -x
+db_initial.values = [displacement-x,displacement-y]
+db_initial.data = [0.0*cm,-0.5*cm]
+# Velocities.
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on +x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,-1.0*cm/year,0.0*year]
+
+# -z face
+[pylithapp.timedependent.bc.z_neg]
+bc_dof = [2]
+label = face_zneg
+db_initial.label = Dirichlet BC on -z
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.domain]
+# We specify that output occurs in terms of a given time frequency, and
+# ask for output every 40 years. The time stamps of the output files are
+# in years (rather than the default of seconds), and we give a format for
+# the time stamp.
+output_freq = time_step
+time_step = 40.0*year
+writer.filename = step05/step05.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK domain output of solution over ground surface.
+[pylithapp.problem.formulation.output.subdomain]
+# Name of nodeset for ground surface.
+label = face_zpos
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step05/step05-groundsurf.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 40.0*year
+writer.filename = step05/step05-upper_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 40.0*year
+writer.filename = step05/step05-lower_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step06.cfg (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/step06.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step06.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step06.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,221 @@
+# -*- Python -*-
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This is a time-dependent problem with Dirichlet boundary conditions
+# and multiple earthquake ruptures as well as fault creep at constant
+# velocity.
+# The x-faces are held fixed in x and y, and the z-displacements are held
+# fixed on the -z face.
+# The upper (locked) portion of the fault ruptures at regular intervals,
+# and constant velocities are applied on the lower section of the fault.
+# The problem bears some similarity to the analytical Savage and Prescott
+# (1978) strike-slip analytical solution for an elastic layer over a
+# viscoelastic half-space. The difference is that the creeping portion of
+# the fault extends through the entire domain, and the far-field boundaries
+# are held fixed.
+# Two materials are used:
+# 1. Elastic upper crust.
+# 2. Viscoelastic (Maxwell) lower crust.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies parameters specific to tutorial step06.
+# The general parameters are specificed in the pylithapp.cfg
+# file which PyLith reads by default.
+#
+# To run the simulation:
+# pylith step06.cfg
+#
+# Output will be directed to the directory step06.
+
+# ----------------------------------------------------------------------
+# problem
+# ----------------------------------------------------------------------
+[pylithapp.timedependent]
+# Set bc to an array of 3 boundary conditions: 'x_pos','x_neg', and 'z_neg'.
+bc = [x_pos,x_neg,z_neg]
+
+# Set interfaces to an array of 1 fault: 'fault'.
+interfaces = [fault]
+
+[pylithapp.timedependent.implicit]
+# Set the output to an array of 2 output managers.
+# We will output the solution over the domain and the ground surface.
+output = [domain,subdomain]
+
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
+output.subdomain = pylith.meshio.OutputSolnSubset
+
+# Change time stepping algorithm from uniform time step, to adaptive
+# time stepping.
+time_step = pylith.problems.TimeStepAdapt
+
+# Change the total simulation time to 700 years, and set the maximum time
+# step size to 10 years.
+[pylithapp.timedependent.implicit.time_step]
+total_time = 700.0*year
+max_dt = 10.0*year
+stability_factor = 1.0 ; use time step equal to stable value from materials
+
+# ----------------------------------------------------------------------
+# materials
+# ----------------------------------------------------------------------
+# Change material type of lower crust to Maxwell viscoelastic.
+[pylithapp.timedependent]
+materials.lower_crust = pylith.materials.MaxwellIsotropic3D
+
+# Provide a spatial database from which to obtain property values.
+# Since there are additional properties and state variables for the Maxwell
+# model, we explicitly request that they be output. Properties are named in
+# cell_info_fields and state variables are named in cell_data_fields.
+[pylithapp.timedependent.materials.lower_crust]
+db_properties.iohandler.filename = spatialdb/mat_maxwell.spatialdb
+output.cell_info_fields = [density,mu,lambda,maxwell_time]
+output.cell_data_fields = [total_strain,stress,viscous_strain]
+
+# ----------------------------------------------------------------------
+# boundary conditions
+# ----------------------------------------------------------------------
+# Set the parameters for Dirichlet boundary conditions applied on the
+# +x, -x, and -z faces of the box.
+#
+# We fix the x and y degrees of freedom on the +x and -x faces, and
+# fix the z degree of freedom on the bottom (-z) face.
+#
+# Since we are applying zero displacements on all boundaries, we retain
+# the default ZeroDispDB for displacements (db_initial).
+#
+# Note that since the fault cuts through the base of the model (z_neg),
+# we can only constrain the portion of the bottom boundary that does not
+# include the fault. A nodeset named 'face_zneg_nofault' has been defined
+# in Cubit for this purpose.
+#
+
+# The label corresponds to the name of the nodeset in CUBIT.
+
+# +x face
+[pylithapp.timedependent.bc.x_pos]
+bc_dof = [0, 1]
+label = face_xpos
+db_initial.label = Dirichlet BC on +x
+
+# -x face
+[pylithapp.timedependent.bc.x_neg]
+bc_dof = [0, 1]
+label = face_xneg
+db_initial.label = Dirichlet BC on -x
+
+# -z face
+[pylithapp.timedependent.bc.z_neg]
+bc_dof = [2]
+label = face_zneg_nofault
+db_initial.label = Dirichlet BC on -z
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces]
+
+# Set the parameters for the fault interface conditions.
+[pylithapp.timedependent.interfaces.fault]
+# This corresponds to the label of the Cubit nodeset defining the fault.
+label = fault
+# Provide quadrature information for the fault surface.
+quadrature.cell = pylith.feassemble.FIATLagrange
+quadrature.cell.dimension = 2
+
+# Due to the complex time history used for the fault, a number of additional
+# info fields are available.
+output.vertex_info_fields = [normal_dir,strike_dir,dip_dir,final_slip_creep,final_slip_one,final_slip_two,final_slip_three,slip_time_creep,slip_time_one,slip_time_two,slip_time_three]
+
+# Set earthquake sources to an array consisting of creep and 3 ruptures.
+eq_srcs = [creep,one,two,three]
+eq_srcs.creep.origin_time = 00.0*year
+eq_srcs.one.origin_time = 200.0*year
+eq_srcs.two.origin_time = 400.0*year
+eq_srcs.three.origin_time = 600.0*year
+
+# Define slip and origin time for first rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.one.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip and origin time for second rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.two.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip and origin time for third rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.three.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip rate and origin time for fault creep.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.creep]
+slip_function = pylith.faults.ConstRateSlipFn
+origin_time = 0.0*s
+slip_function.slip_rate.iohandler.filename = spatialdb/sliprate_creep.spatialdb
+slip_function.slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.domain]
+# We specify that output occurs in terms of a given time frequency, and
+# ask for output every 50 years. The time stamps of the output files are
+# in years (rather than the default of seconds), and we give a format for
+# the time stamp.
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step06/step06.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK domain output of solution over ground surface.
+[pylithapp.problem.formulation.output.subdomain]
+# Name of nodeset for ground surface.
+label = face_zpos
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step06/step06-groundsurf.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK fault rupture output.
+[pylithapp.problem.interfaces.fault.output]
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step06/step06-fault.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step06/step06-upper_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step06/step06-lower_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step07.cfg (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/step07.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step07.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step07.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,235 @@
+# -*- Python -*-
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This is a time-dependent problem with velocity boundary conditions
+# and multiple earthquake ruptures as well as fault creep at constant
+# velocity.
+# Velocities in the + and - y-directions are applied on the + and -
+# x-faces, and the x-displacements are held fixed on those boundaries.
+# The z-displacements are held fixed on the -z face.
+# The upper (locked) portion of the fault ruptures at regular intervals,
+# and constant velocities are applied on the lower section of the fault.
+# The problem bears some similarity to the analytical Savage and Prescott
+# (1978) strike-slip analytical solution for an elastic layer over a
+# viscoelastic half-space. The difference is that the creeping portion of
+# the fault extends through the entire domain.
+# Two materials are used:
+# 1. Elastic upper crust.
+# 2. Viscoelastic (Maxwell) lower crust.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies parameters specific to tutorial step07.
+# The general parameters are specificed in the pylithapp.cfg
+# file which PyLith reads by default.
+#
+# To run the simulation:
+# pylith step07.cfg
+#
+# Output will be directed to the directory step07.
+
+# ----------------------------------------------------------------------
+# problem
+# ----------------------------------------------------------------------
+[pylithapp.timedependent]
+# Set bc to an array of 3 boundary conditions: 'x_pos','x_neg', and 'z_neg'.
+bc = [x_pos,x_neg,z_neg]
+
+# Set interfaces to an array of 1 fault: 'fault'.
+interfaces = [fault]
+
+[pylithapp.timedependent.implicit]
+# Set the output to an array of 2 output managers.
+# We will output the solution over the domain and the ground surface.
+output = [domain,subdomain]
+
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
+output.subdomain = pylith.meshio.OutputSolnSubset
+
+# Change time stepping algorithm from uniform time step, to adaptive
+# time stepping.
+time_step = pylith.problems.TimeStepAdapt
+
+# Change the total simulation time to 700 years, and set the maximum time
+# step size to 10 years.
+[pylithapp.timedependent.implicit.time_step]
+total_time = 700.0*year
+max_dt = 10.0*year
+stability_factor = 1.0 ; use time step equal to stable value from materials
+
+# ----------------------------------------------------------------------
+# materials
+# ----------------------------------------------------------------------
+# Change material type of lower crust to Maxwell viscoelastic.
+[pylithapp.timedependent]
+materials.lower_crust = pylith.materials.MaxwellIsotropic3D
+
+# Provide a spatial database from which to obtain property values.
+# Since there are additional properties and state variables for the Maxwell
+# model, we explicitly request that they be output. Properties are named in
+# cell_info_fields and state variables are named in cell_data_fields.
+[pylithapp.timedependent.materials.lower_crust]
+db_properties.iohandler.filename = spatialdb/mat_maxwell.spatialdb
+output.cell_info_fields = [density,mu,lambda,maxwell_time]
+output.cell_data_fields = [total_strain,stress,viscous_strain]
+
+# ----------------------------------------------------------------------
+# boundary conditions
+# ----------------------------------------------------------------------
+# Set the parameters for Dirichlet boundary conditions applied on the
+# +x, -x, and -z faces of the box.
+#
+# We fix the x degree of freedom on the +x and -x faces, and
+# fix the z degree of freedom on the bottom (-z) face. Constant velocities
+# in the +y and -y directions are applied on +x and -x.
+#
+# For x_pos and x_neg, we retain the default ZeroDispDB for displacements
+# (db_initial), since we do not want initial displacements. We change the
+# default database for velocities (db_rate) to UniformDB, which allows
+# nonzero velocities. Using UniformDB, we also specify the velocity values
+# in this .cfg file, rather than using a spatialdb file.
+#
+# For z_neg, we keep the default ZeroDispDB, since we just want zero
+# z-displacements on that boundary.
+# Note that since the fault cuts through the base of the model (z_neg),
+# we can only constrain the portion of the bottom boundary that does not
+# include the fault. A nodeset named 'face_zneg_nofault' has been defined
+# in Cubit for this purpose.
+#
+
+# The label corresponds to the name of the nodeset in CUBIT.
+
+# +x face
+[pylithapp.timedependent.bc.x_pos]
+bc_dof = [0, 1]
+label = face_xpos
+db_initial.label = Dirichlet BC on +x
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on +x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,1.0*cm/year,0.0*year]
+
+# -x face
+[pylithapp.timedependent.bc.x_neg]
+bc_dof = [0, 1]
+label = face_xneg
+db_initial.label = Dirichlet BC on -x
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on +x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,-1.0*cm/year,0.0*year]
+
+# -z face
+[pylithapp.timedependent.bc.z_neg]
+bc_dof = [2]
+label = face_zneg_nofault
+db_initial.label = Dirichlet BC on -z
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces]
+
+# Set the parameters for the fault interface conditions.
+[pylithapp.timedependent.interfaces.fault]
+# This corresponds to the label of the Cubit nodeset defining the fault.
+label = fault
+# Provide quadrature information for the fault surface.
+quadrature.cell = pylith.feassemble.FIATLagrange
+quadrature.cell.dimension = 2
+
+# Due to the complex time history used for the fault, a number of additional
+# info fields are available.
+output.vertex_info_fields = [normal_dir,strike_dir,dip_dir,final_slip_creep,final_slip_one,final_slip_two,final_slip_three,slip_time_creep,slip_time_one,slip_time_two,slip_time_three]
+
+# Set earthquake sources to an array consisting of creep and 3 ruptures.
+eq_srcs = [creep,one,two,three]
+eq_srcs.creep.origin_time = 00.0*year
+eq_srcs.one.origin_time = 200.0*year
+eq_srcs.two.origin_time = 400.0*year
+eq_srcs.three.origin_time = 600.0*year
+
+# Define slip and origin time for first rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.one.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip and origin time for second rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.two.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip and origin time for third rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.three.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip rate and origin time for fault creep.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.creep]
+slip_function = pylith.faults.ConstRateSlipFn
+origin_time = 0.0*s
+slip_function.slip_rate.iohandler.filename = spatialdb/sliprate_creep.spatialdb
+slip_function.slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.domain]
+# We specify that output occurs in terms of a given time frequency, and
+# ask for output every 50 years. The time stamps of the output files are
+# in years (rather than the default of seconds), and we give a format for
+# the time stamp.
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step07/step07.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK domain output of solution over ground surface.
+[pylithapp.problem.formulation.output.subdomain]
+# Name of nodeset for ground surface.
+label = face_zpos
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step07/step07-groundsurf.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK fault rupture output.
+[pylithapp.problem.interfaces.fault.output]
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step07/step07-fault.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step07/step07-upper_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step07/step07-lower_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step08.cfg (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/step08.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step08.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step08.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,250 @@
+# -*- Python -*-
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This is a time-dependent problem with velocity boundary conditions
+# and multiple earthquake ruptures as well as fault creep at constant
+# velocity.
+# This problem is identical to example 7 except that it includes
+# power-law rheology, which requires the use of a nonlinear solver.
+# Two materials are used:
+# 1. Elastic upper crust.
+# 2. Viscoelastic (power-law) lower crust.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies parameters specific to tutorial step08.
+# The general parameters are specificed in the pylithapp.cfg
+# file which PyLith reads by default.
+#
+# To run the simulation:
+# pylith step08.cfg
+#
+# Output will be directed to the directory step08.
+
+# ----------------------------------------------------------------------
+# problem
+# ----------------------------------------------------------------------
+[pylithapp.timedependent]
+# For this problem we must switch to a nonlinear solver.
+implicit.solver = pylith.problems.SolverNonlinear
+
+# Set bc to an array of 3 boundary conditions: 'x_pos','x_neg', and 'z_neg'.
+bc = [x_pos,x_neg,z_neg]
+
+# Set interfaces to an array of 1 fault: 'fault'.
+interfaces = [fault]
+
+[pylithapp.timedependent.implicit]
+# Set the output to an array of 2 output managers.
+# We will output the solution over the domain and the ground surface.
+output = [domain,subdomain]
+
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
+output.subdomain = pylith.meshio.OutputSolnSubset
+
+# Change time stepping algorithm from uniform time step, to adaptive
+# time stepping.
+time_step = pylith.problems.TimeStepAdapt
+
+# Change the total simulation time to 700 years, and set the maximum time
+# step size to 10 years.
+[pylithapp.timedependent.implicit.time_step]
+total_time = 700.0*year
+max_dt = 10.0*year
+stability_factor = 1.0 ; use time step equal to stable value from materials
+# For this problem we set adapt_skip to zero so that the time step size is
+# readjusted every time step.
+adapt_skip = 0
+
+# ----------------------------------------------------------------------
+# materials
+# ----------------------------------------------------------------------
+# Change material type of lower crust to power-law viscoelastic.
+[pylithapp.timedependent]
+materials.lower_crust = pylith.materials.PowerLaw3D
+
+# Provide a spatial database from which to obtain property values.
+# In this case, we prefer to obtain the power-law properties from one
+# database and the elastic properties from another database, so we use
+# a CompositeDB. Each part of the CompositeDB is a SimpleDB.
+[pylithapp.timedependent.materials.lower_crust]
+db_properties = spatialdata.spatialdb.CompositeDB
+db_properties.db_A = spatialdata.spatialdb.SimpleDB
+db_properties.db_B = spatialdata.spatialdb.SimpleDB
+# Since there are additional properties and state variables for the
+# power-law model, we explicitly request that they be output. Properties are
+# named in cell_info_fields and state variables are named in
+# cell_data_fields.
+output.cell_info_fields = [density,mu,lambda,reference_strain_rate,reference_stress,power_law_exponent]
+output.cell_data_fields = [total_strain,stress,viscous_strain]
+
+# Provide the values to be obtained from each database and the database
+# name.
+[pylithapp.timedependent.materials.lower_crust.db_properties]
+values_A = [density,vs,vp]   ; Elastic properties.
+db_A.label = Elastic properties
+db_A.iohandler.filename = spatialdb/mat_elastic.spatialdb
+values_B = [reference-stress,reference-strain-rate,power-law-exponent]   ; Power-law properties.
+db_B.label = Power-law properties
+db_B.iohandler.filename = spatialdb/mat_powerlaw.spatialdb
+
+# ----------------------------------------------------------------------
+# boundary conditions
+# ----------------------------------------------------------------------
+# Set the parameters for Dirichlet boundary conditions applied on the
+# +x, -x, and -z faces of the box.
+#
+# We fix the x degree of freedom on the +x and -x faces, and
+# fix the z degree of freedom on the bottom (-z) face. Constant velocities
+# in the +y and -y directions are applied on +x and -x.
+#
+# For x_pos and x_neg, we retain the default ZeroDispDB for displacements
+# (db_initial), since we do not want initial displacements. We change the
+# default database for velocities (db_rate) to UniformDB, which allows
+# nonzero velocities. Using UniformDB, we also specify the velocity values
+# in this .cfg file, rather than using a spatialdb file.
+#
+# For z_neg, we keep the default ZeroDispDB, since we just want zero
+# z-displacements on that boundary.
+# Note that since the fault cuts through the base of the model (z_neg),
+# we can only constrain the portion of the bottom boundary that does not
+# include the fault. A nodeset named 'face_zneg_nofault' has been defined
+# in Cubit for this purpose.
+#
+
+# The label corresponds to the name of the nodeset in CUBIT.
+
+# +x face
+[pylithapp.timedependent.bc.x_pos]
+bc_dof = [0, 1]
+label = face_xpos
+db_initial.label = Dirichlet BC on +x
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on +x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,1.0*cm/year,0.0*year]
+
+# -x face
+[pylithapp.timedependent.bc.x_neg]
+bc_dof = [0, 1]
+label = face_xneg
+db_initial.label = Dirichlet BC on -x
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on +x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,-1.0*cm/year,0.0*year]
+
+# -z face
+[pylithapp.timedependent.bc.z_neg]
+bc_dof = [2]
+label = face_zneg_nofault
+db_initial.label = Dirichlet BC on -z
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces]
+
+# Set the parameters for the fault interface conditions.
+[pylithapp.timedependent.interfaces.fault]
+# This corresponds to the label of the Cubit nodeset defining the fault.
+label = fault
+# Provide quadrature information for the fault surface.
+quadrature.cell = pylith.feassemble.FIATLagrange
+quadrature.cell.dimension = 2
+
+# Due to the complex time history used for the fault, a number of additional
+# info fields are available.
+output.vertex_info_fields = [normal_dir,strike_dir,dip_dir,final_slip_creep,final_slip_one,final_slip_two,final_slip_three,slip_time_creep,slip_time_one,slip_time_two,slip_time_three]
+
+# Set earthquake sources to an array consisting of creep and 3 ruptures.
+eq_srcs = [creep,one,two,three]
+eq_srcs.creep.origin_time = 00.0*year
+eq_srcs.one.origin_time = 200.0*year
+eq_srcs.two.origin_time = 400.0*year
+eq_srcs.three.origin_time = 600.0*year
+
+# Define slip and origin time for first rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.one.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip and origin time for second rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.two.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip and origin time for third rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.three.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip rate and origin time for fault creep.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.creep]
+slip_function = pylith.faults.ConstRateSlipFn
+origin_time = 0.0*s
+slip_function.slip_rate.iohandler.filename = spatialdb/sliprate_creep.spatialdb
+slip_function.slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.domain]
+# We specify that output occurs in terms of a given time frequency, and
+# ask for output every 50 years. The time stamps of the output files are
+# in years (rather than the default of seconds), and we give a format for
+# the time stamp.
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step08/step08.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK domain output of solution over ground surface.
+[pylithapp.problem.formulation.output.subdomain]
+# Name of nodeset for ground surface.
+label = face_zpos
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step08/step08-groundsurf.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK fault rupture output.
+[pylithapp.problem.interfaces.fault.output]
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step08/step08-fault.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step08/step08-upper_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step08/step08-lower_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step09.cfg (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/step09.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step09.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step09.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,251 @@
+# -*- Python -*-
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This is a time-dependent problem with velocity boundary conditions
+# and multiple earthquake ruptures as well as fault creep at constant
+# velocity.
+# This problem is identical to example 8 except that it includes
+# Drucker-Prager elastoplastic rheology, which requires the use of a
+# nonlinear solver.
+# Two materials are used:
+# 1. Elastic upper crust.
+# 2. Elastoplastic (Drucker-Prager) lower crust.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies parameters specific to tutorial step09.
+# The general parameters are specificed in the pylithapp.cfg
+# file which PyLith reads by default.
+#
+# To run the simulation:
+# pylith step09.cfg
+#
+# Output will be directed to the directory step09.
+
+# ----------------------------------------------------------------------
+# problem
+# ----------------------------------------------------------------------
+[pylithapp.timedependent]
+# For this problem we must switch to a nonlinear solver.
+implicit.solver = pylith.problems.SolverNonlinear
+
+# Set bc to an array of 3 boundary conditions: 'x_pos','x_neg', and 'z_neg'.
+bc = [x_pos,x_neg,z_neg]
+
+# Set interfaces to an array of 1 fault: 'fault'.
+interfaces = [fault]
+
+[pylithapp.timedependent.implicit]
+# Set the output to an array of 2 output managers.
+# We will output the solution over the domain and the ground surface.
+output = [domain,subdomain]
+
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
+output.subdomain = pylith.meshio.OutputSolnSubset
+
+# Change time stepping algorithm from uniform time step, to adaptive
+# time stepping.
+time_step = pylith.problems.TimeStepAdapt
+
+# Change the total simulation time to 700 years, and set the maximum time
+# step size to 5 years.
+[pylithapp.timedependent.implicit.time_step]
+total_time = 700.0*year
+max_dt = 5.0*year
+stability_factor = 1.0 ; use time step equal to stable value from materials
+# For this problem we set adapt_skip to zero so that the time step size is
+# readjusted every time step.
+adapt_skip = 0
+
+# ----------------------------------------------------------------------
+# materials
+# ----------------------------------------------------------------------
+# Change material type of lower crust to Drucker-Prager.
+[pylithapp.timedependent]
+materials.lower_crust = pylith.materials.DruckerPrager3D
+
+# Provide a spatial database from which to obtain property values.
+# In this case, we prefer to obtain the Drucker-Prager properties from one
+# database and the elastic properties from another database, so we use
+# a CompositeDB. Each part of the CompositeDB is a SimpleDB.
+[pylithapp.timedependent.materials.lower_crust]
+db_properties = spatialdata.spatialdb.CompositeDB
+db_properties.db_A = spatialdata.spatialdb.SimpleDB
+db_properties.db_B = spatialdata.spatialdb.SimpleDB
+# Since there are additional properties and state variables for the
+# Drucker-Prager model, we explicitly request that they be output.
+# Properties are named in cell_info_fields and state variables are named in
+# cell_data_fields.
+output.cell_info_fields = [density,mu,lambda,alpha_yield,beta,alpha_flow]
+output.cell_data_fields = [total_strain,stress,plastic_strain]
+
+# Provide the values to be obtained from each database and the database
+# name.
+[pylithapp.timedependent.materials.lower_crust.db_properties]
+values_A = [density,vs,vp]   ; Elastic properties.
+db_A.label = Elastic properties
+db_A.iohandler.filename = spatialdb/mat_elastic.spatialdb
+values_B = [friction-angle,cohesion,dilatation-angle]   ; Drucker-Prager properties.
+db_B.label = Drucker-Prager properties
+db_B.iohandler.filename = spatialdb/mat_druckerprager.spatialdb
+
+# ----------------------------------------------------------------------
+# boundary conditions
+# ----------------------------------------------------------------------
+# Set the parameters for Dirichlet boundary conditions applied on the
+# +x, -x, and -z faces of the box.
+#
+# We fix the x degree of freedom on the +x and -x faces, and
+# fix the z degree of freedom on the bottom (-z) face. Constant velocities
+# in the +y and -y directions are applied on +x and -x.
+#
+# For x_pos and x_neg, we retain the default ZeroDispDB for displacements
+# (db_initial), since we do not want initial displacements. We change the
+# default database for velocities (db_rate) to UniformDB, which allows
+# nonzero velocities. Using UniformDB, we also specify the velocity values
+# in this .cfg file, rather than using a spatialdb file.
+#
+# For z_neg, we keep the default ZeroDispDB, since we just want zero
+# z-displacements on that boundary.
+# Note that since the fault cuts through the base of the model (z_neg),
+# we can only constrain the portion of the bottom boundary that does not
+# include the fault. A nodeset named 'face_zneg_nofault' has been defined
+# in Cubit for this purpose.
+#
+
+# The label corresponds to the name of the nodeset in CUBIT.
+
+# +x face
+[pylithapp.timedependent.bc.x_pos]
+bc_dof = [0, 1]
+label = face_xpos
+db_initial.label = Dirichlet BC on +x
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on +x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,1.0*cm/year,0.0*year]
+
+# -x face
+[pylithapp.timedependent.bc.x_neg]
+bc_dof = [0, 1]
+label = face_xneg
+db_initial.label = Dirichlet BC on -x
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on +x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,-1.0*cm/year,0.0*year]
+
+# -z face
+[pylithapp.timedependent.bc.z_neg]
+bc_dof = [2]
+label = face_zneg_nofault
+db_initial.label = Dirichlet BC on -z
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces]
+
+# Set the parameters for the fault interface conditions.
+[pylithapp.timedependent.interfaces.fault]
+# This corresponds to the label of the Cubit nodeset defining the fault.
+label = fault
+# Provide quadrature information for the fault surface.
+quadrature.cell = pylith.feassemble.FIATLagrange
+quadrature.cell.dimension = 2
+
+# Due to the complex time history used for the fault, a number of additional
+# info fields are available.
+output.vertex_info_fields = [normal_dir,strike_dir,dip_dir,final_slip_creep,final_slip_one,final_slip_two,final_slip_three,slip_time_creep,slip_time_one,slip_time_two,slip_time_three]
+
+# Set earthquake sources to an array consisting of creep and 3 ruptures.
+eq_srcs = [creep,one,two,three]
+eq_srcs.creep.origin_time = 00.0*year
+eq_srcs.one.origin_time = 200.0*year
+eq_srcs.two.origin_time = 400.0*year
+eq_srcs.three.origin_time = 600.0*year
+
+# Define slip and origin time for first rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.one.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip and origin time for second rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.two.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip and origin time for third rupture.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.three.slip_function]
+slip.iohandler.filename = spatialdb/finalslip_rupture.spatialdb
+slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# Define slip rate and origin time for fault creep.
+[pylithapp.timedependent.interfaces.fault.eq_srcs.creep]
+slip_function = pylith.faults.ConstRateSlipFn
+origin_time = 0.0*s
+slip_function.slip_rate.iohandler.filename = spatialdb/sliprate_creep.spatialdb
+slip_function.slip_time.iohandler.filename = spatialdb/sliptime.spatialdb
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.domain]
+# We specify that output occurs in terms of a given time frequency, and
+# ask for output every 50 years. The time stamps of the output files are
+# in years (rather than the default of seconds), and we give a format for
+# the time stamp.
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step09/step09.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK domain output of solution over ground surface.
+[pylithapp.problem.formulation.output.subdomain]
+# Name of nodeset for ground surface.
+label = face_zpos
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step09/step09-groundsurf.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK fault rupture output.
+[pylithapp.problem.interfaces.fault.output]
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step09/step09-fault.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step09/step09-upper_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 50.0*year
+writer.filename = step09/step09-lower_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step10.cfg (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/step10.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step10.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step10.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,168 @@
+# -*- Python -*-
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This problem demonstrates the use of static fault friction.
+# The problem is identical to example 1, except for the presence of a fault
+# with static friction. In this case, the applied displacements are
+# insufficient to initiate slip, so the solution should be identical to
+# the results of example 1.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies parameters specific to tutorial step10.
+# The general parameters are specificed in the pylithapp.cfg
+# file which PyLith reads by default.
+#
+# To run the simulation:
+# pylith step10.cfg
+#
+# Output will be directed to the directory step10.
+
+# ----------------------------------------------------------------------
+# problem
+# ----------------------------------------------------------------------
+[pylithapp.timedependent]
+# Set bc to an array of 3 boundary conditions: 'x_pos','x_neg', and 'z_neg'.
+bc = [x_pos,x_neg,z_neg]
+
+# Set interfaces to an array of 1 fault: 'fault'.
+interfaces = [fault]
+
+[pylithapp.timedependent.implicit]
+# Set the output to an array of 2 output managers.
+# We will output the solution over the domain and the ground surface.
+output = [domain,subdomain]
+
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
+output.subdomain = pylith.meshio.OutputSolnSubset
+
+# Fault friction is a nonlinear problem so we need to use the nonlinear
+# solver.
+solver = pylith.problems.SolverNonlinear
+
+# ----------------------------------------------------------------------
+# boundary conditions
+# ----------------------------------------------------------------------
+# Set the parameters for Dirichlet boundary conditions applied on the
+# +x, -x, and -z faces of the box.
+#
+# We apply shear (y) and axial (x) displacements on the +x and -x faces, and
+# fix the z degree of freedom on the bottom (-z) face.
+#
+# For x_pos and x_neg, we change the database from ZeroDispDB (which
+# specifies a zero value) to SimpleDB (which uses a data file to
+# specify a spatial variation).
+#
+# For z_neg, we keep the default ZeroDispDB, since we just want zero
+# z-displacements on that boundary.
+#
+# Note that since the fault cuts through the base of the model (z_neg),
+# we can only constrain the portion of the bottom boundary that does not
+# include the fault. A nodeset named 'face_zneg_nofault' has been defined
+# in Cubit for this purpose.
+#
+
+# The label corresponds to the name of the nodeset in CUBIT.
+
+# +x face
+[pylithapp.timedependent.bc.x_pos]
+bc_dof = [0, 1]
+label = face_xpos
+db_initial = spatialdata.spatialdb.SimpleDB
+db_initial.label = Dirichlet BC on +x
+db_initial.iohandler.filename = spatialdb/fixeddisp_axial_shear.spatialdb
+
+# -x face
+[pylithapp.timedependent.bc.x_neg]
+bc_dof = [0, 1]
+label = face_xneg
+db_initial = spatialdata.spatialdb.SimpleDB
+db_initial.label = Dirichlet BC on -x
+db_initial.iohandler.filename = spatialdb/fixeddisp_axial_shear.spatialdb
+
+# -z face
+[pylithapp.timedependent.bc.z_neg]
+bc_dof = [2]
+label = face_zneg_nofault
+db_initial.label = Dirichlet BC on -z
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces]
+# Change fault to dynamic fault interface.
+fault = pylith.faults.FaultCohesiveDyn
+
+[pylithapp.timedependent.interfaces.fault]
+# The label corresponds to the name of the nodeset in CUBIT.
+label = fault
+
+# Use the static friction model.
+friction = pylith.friction.StaticFriction
+
+# We must define the quadrature information for fault cells.
+# The fault cells are 2D (surface).
+quadrature.cell = pylith.feassemble.FIATLagrange
+quadrature.cell.dimension = 2
+
+# Set static friction model parameters using a uniform DB. Set the
+# static coefficient of friction to 0.6 and cohesion to 0.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]
+
+# ----------------------------------------------------------------------
+# PETSc settings
+# ----------------------------------------------------------------------
+# NOTE: There are additional setting specific to fault friction.
+[pylithapp.petsc]
+
+# Friction sensitivity solve used to compute the increment in slip
+# associated with changes in the Lagrange multiplier imposed by the
+# fault constitutive model.
+friction_pc_type = asm
+friction_sub_pc_factor_shift_type = nonzero
+friction_ksp_max_it = 25
+friction_ksp_gmres_restart = 30
+# Uncomment to view details of friction sensitivity solve.
+#friction_ksp_monitor = true
+#friction_ksp_view = true
+friction_ksp_converged_reason = true
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.domain.writer]
+filename = step10/step10.vtk
+
+# Give basename for VTK domain output of solution over ground surface.
+[pylithapp.problem.formulation.output.subdomain]
+# Name of nodeset for ground surface.
+label = face_zpos
+writer.filename = step10/step10-groundsurf.vtk
+
+# Give basename for VTK fault output.
+[pylithapp.problem.interfaces.fault.output]
+writer.filename = step10/step10-fault.vtk
+
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+writer.filename = step10/step10-upper_crust.vtk
+
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+writer.filename = step10/step10-lower_crust.vtk

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step11.cfg (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/step11.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step11.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step11.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,170 @@
+# -*- Python -*-
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This problem demonstrates the use of static fault friction.
+# The problem is similar to example 10, except that in this case,
+# enough displacement is applied to induce slip on the fault.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies parameters specific to tutorial step11.
+# The general parameters are specificed in the pylithapp.cfg
+# file which PyLith reads by default.
+#
+# To run the simulation:
+# pylith step11.cfg
+#
+# Output will be directed to the directory step11.
+
+# ----------------------------------------------------------------------
+# problem
+# ----------------------------------------------------------------------
+[pylithapp.timedependent]
+# Set bc to an array of 3 boundary conditions: 'x_pos','x_neg', and 'z_neg'.
+bc = [x_pos,x_neg,z_neg]
+
+# Set interfaces to an array of 1 fault: 'fault'.
+interfaces = [fault]
+
+[pylithapp.timedependent.implicit]
+# Set the output to an array of 2 output managers.
+# We will output the solution over the domain and the ground surface.
+output = [domain,subdomain]
+
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
+output.subdomain = pylith.meshio.OutputSolnSubset
+
+# Fault friction is a nonlinear problem so we need to use the nonlinear
+# solver.
+solver = pylith.problems.SolverNonlinear
+
+# ----------------------------------------------------------------------
+# boundary conditions
+# ----------------------------------------------------------------------
+# Set the parameters for Dirichlet boundary conditions applied on the
+# +x, -x, and -z faces of the box.
+#
+# We apply shear (y) and axial (x) displacements on the +x and -x faces, and
+# fix the z degree of freedom on the bottom (-z) face.
+#
+# For x_pos and x_neg, we change the database from ZeroDispDB (which
+# specifies a zero value) to UniformDB, which allows us to provide
+# displacement values within the .cfg file.
+# Note that for this simulation, we apply twice as much shear displacement
+# as we did for example 10, which is sufficient to induce slip on the fault.
+#
+# For z_neg, we keep the default ZeroDispDB, since we just want zero
+# z-displacements on that boundary.
+#
+# Note that since the fault cuts through the base of the model (z_neg),
+# we can only constrain the portion of the bottom boundary that does not
+# include the fault. A nodeset named 'face_zneg_nofault' has been defined
+# in Cubit for this purpose.
+#
+
+# The label corresponds to the name of the nodeset in CUBIT.
+
+# +x face
+[pylithapp.timedependent.bc.x_pos]
+bc_dof = [0, 1]
+label = face_xpos
+db_initial = spatialdata.spatialdb.UniformDB
+db_initial.label = Dirichlet BC on +x
+db_initial.values = [displacement-x,displacement-y]
+db_initial.data = [-1.0*m,2.0*m]
+
+# -x face
+[pylithapp.timedependent.bc.x_neg]
+bc_dof = [0, 1]
+label = face_xneg
+db_initial = spatialdata.spatialdb.UniformDB
+db_initial.label = Dirichlet BC on -x
+db_initial.values = [displacement-x,displacement-y]
+db_initial.data = [1.0*m,-2.0*m]
+
+# -z face
+[pylithapp.timedependent.bc.z_neg]
+bc_dof = [2]
+label = face_zneg_nofault
+db_initial.label = Dirichlet BC on -z
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces]
+# Change fault to dynamic fault interface.
+fault = pylith.faults.FaultCohesiveDyn
+
+[pylithapp.timedependent.interfaces.fault]
+# The label corresponds to the name of the nodeset in CUBIT.
+label = fault
+
+# Use the static friction model.
+friction = pylith.friction.StaticFriction
+
+# We must define the quadrature information for fault cells.
+# The fault cells are 2D (surface).
+quadrature.cell = pylith.feassemble.FIATLagrange
+quadrature.cell.dimension = 2
+
+# Set static friction model parameters using a uniform DB. Set the
+# static coefficient of friction to 0.6 and cohesion to 0.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]
+
+# ----------------------------------------------------------------------
+# PETSc settings
+# ----------------------------------------------------------------------
+# NOTE: There are additional setting specific to fault friction.
+[pylithapp.petsc]
+
+# Friction sensitivity solve used to compute the increment in slip
+# associated with changes in the Lagrange multiplier imposed by the
+# fault constitutive model.
+friction_pc_type = asm
+friction_sub_pc_factor_shift_type = nonzero
+friction_ksp_max_it = 25
+friction_ksp_gmres_restart = 30
+# Uncomment to view details of friction sensitivity solve.
+#friction_ksp_monitor = true
+#friction_ksp_view = true
+friction_ksp_converged_reason = true
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.domain.writer]
+filename = step11/step11.vtk
+
+# Give basename for VTK domain output of solution over ground surface.
+[pylithapp.problem.formulation.output.subdomain]
+# Name of nodeset for ground surface.
+label = face_zpos
+writer.filename = step11/step11-groundsurf.vtk
+
+# Give basename for VTK fault output.
+[pylithapp.problem.interfaces.fault.output]
+writer.filename = step11/step11-fault.vtk
+
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+writer.filename = step11/step11-upper_crust.vtk
+
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+writer.filename = step11/step11-lower_crust.vtk

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step12.cfg (from rev 16839, short/3D/PyLith/trunk/examples/3d/hex8/step12.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step12.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/3d/hex8/step12.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,211 @@
+# -*- Python -*-
+[pylithapp]
+
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
+
+#
+# This problem demonstrates the use of static fault friction for a
+# quasi-static problem.
+# The problem is similar to example 11, except that velocity boundary
+# conditions are applied rather than displacement BC. Rather than applying
+# axial displacements, normal tractions (compressional) are applied on the
+# +x face, while the -x face is held fixed in the x-direction. This
+# maintains a normal stress on the fault.  The model is run for 200 years,
+# resulting in periodic fault slip as the friction threshold is reached on
+# the fault.
+
+# ----------------------------------------------------------------------
+# RUNNING THE SIMULATON
+# ----------------------------------------------------------------------
+
+# This is not a self-contained simulation configuration file. This
+# file only specifies parameters specific to tutorial step12.
+# The general parameters are specificed in the pylithapp.cfg
+# file which PyLith reads by default.
+#
+# To run the simulation:
+# pylith step12.cfg
+#
+# Output will be directed to the directory step12.
+
+# ----------------------------------------------------------------------
+# problem
+# ----------------------------------------------------------------------
+[pylithapp.timedependent]
+# Set bc to an array of 3 boundary conditions: 'x_pos', 'x_neg', and 'z_neg'.
+bc = [x_pos,x_neg,z_neg]
+
+# Set interfaces to an array of 1 fault: 'fault'.
+interfaces = [fault]
+
+[pylithapp.timedependent.implicit]
+# Set the output to an array of 2 output managers.
+# We will output the solution over the domain and the ground surface.
+output = [domain,subdomain]
+
+# Set subdomain component to OutputSolnSubset (boundary of the domain).
+output.subdomain = pylith.meshio.OutputSolnSubset
+
+# Fault friction is a nonlinear problem so we need to use the nonlinear
+# solver.
+solver = pylith.problems.SolverNonlinear
+
+# Change the total simulation time to 200 years, and use a constant time
+# step size of 5 years.
+[pylithapp.timedependent.implicit.time_step]
+total_time = 200.0*year
+dt = 5.0*year
+
+# ----------------------------------------------------------------------
+# boundary conditions
+# ----------------------------------------------------------------------
+# Set the parameters for boundary conditions applied on the
+# +x, -x, and -z faces of the box.
+#
+# On the -x and +x faces, we fix the x degrees of freedom and apply
+# velocities in the y-direction. We fix the z degree of freedom on the
+# bottom (-z) face.
+#
+# We use a UniformDB to apply the displacements and velocities, while
+# retaining the default ZeroDispDB for zero x-displacements on the -x
+# face and and zero z-displacements on -z.
+#
+# Note that since the fault cuts through the base of the model (z_neg),
+# we can only constrain the portion of the bottom boundary that does not
+# include the fault. A nodeset named 'face_zneg_nofault' has been defined
+# in Cubit for this purpose.
+#
+
+# The label corresponds to the name of the nodeset in CUBIT.
+
+# +x face -- Dirichlet
+[pylithapp.timedependent.bc.x_pos]
+bc_dof = [0,1]
+label = face_xpos
+
+db_initial = spatialdata.spatialdb.UniformDB
+db_initial.label = Dirichlet BC on +x
+db_initial.values = [displacement-x,displacement-y]
+db_initial.data = [-1.0*m,0.0*m]
+
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on +x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,1.0*cm/year,0.0*year]
+
+# -x face
+[pylithapp.timedependent.bc.x_neg]
+bc_dof = [0, 1]
+label = face_xneg
+db_initial.label = Dirichlet BC on -x
+db_rate = spatialdata.spatialdb.UniformDB
+db_rate.label = Dirichlet rate BC on -x
+db_rate.values = [displacement-rate-x,displacement-rate-y,rate-start-time]
+db_rate.data = [0.0*cm/year,-1.0*cm/year,0.0*year]
+
+# -z face
+[pylithapp.timedependent.bc.z_neg]
+bc_dof = [2]
+label = face_zneg_nofault
+db_initial.label = Dirichlet BC on -z
+
+# ----------------------------------------------------------------------
+# faults
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces]
+# Change fault to dynamic fault interface.
+fault = pylith.faults.FaultCohesiveDyn
+
+[pylithapp.timedependent.interfaces.fault]
+# The label corresponds to the name of the nodeset in CUBIT.
+label = fault
+
+# Use the static friction model.
+friction = pylith.friction.StaticFriction
+
+# We must define the quadrature information for fault cells.
+# The fault cells are 2D (surface).
+quadrature.cell = pylith.feassemble.FIATLagrange
+quadrature.cell.dimension = 2
+
+# Set static friction model parameters using a uniform DB. Set the
+# static coefficient of friction to 0.6 and cohesion to 0.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,2.0*MPa]
+
+# ----------------------------------------------------------------------
+# PETSc settings
+# ----------------------------------------------------------------------
+# NOTE: There are additional setting specific to fault friction.
+[pylithapp.petsc]
+
+# Friction sensitivity solve used to compute the increment in slip
+# associated with changes in the Lagrange multiplier imposed by the
+# fault constitutive model.
+friction_pc_type = asm
+friction_sub_pc_factor_shift_type = nonzero
+friction_ksp_max_it = 25
+friction_ksp_gmres_restart = 30
+# Uncomment to view details of friction sensitivity solve.
+#friction_ksp_monitor = true
+#friction_ksp_view = true
+friction_ksp_converged_reason = true
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+# Give basename for VTK domain output of solution over domain.
+[pylithapp.problem.formulation.output.domain]
+# We specify that output occurs in terms of a given time frequency, and
+# ask for output every 20 years. The time stamps of the output files are
+# in years (rather than the default of seconds), and we give a format for
+# the time stamp.
+output_freq = time_step
+time_step = 20.0*year
+writer.filename = step12/step12.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK domain output of solution over ground surface.
+[pylithapp.problem.formulation.output.subdomain]
+# Name of nodeset for ground surface.
+label = face_zpos
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step12/step12-groundsurf.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK fault output.
+[pylithapp.problem.interfaces.fault.output]
+# We keep the default output frequency behavior (skip every n steps), and
+# ask to skip 0 steps between output, so that we get output every time step.
+skip = 0
+writer.filename = step12/step12-fault.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of upper_crust state variables.
+[pylithapp.timedependent.materials.upper_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 20.0*year
+writer.filename = step12/step12-upper_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year
+
+# Give basename for VTK output of lower_crust state variables.
+[pylithapp.timedependent.materials.lower_crust.output]
+# Average values over quadrature points.
+cell_filter = pylith.meshio.CellFilterAvgMesh
+output_freq = time_step
+time_step = 20.0*year
+writer.filename = step12/step12-lower_crust.vtk
+writer.time_format = %04.0f
+writer.time_constant = 1.0*year

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/README
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/README	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/README	2010-05-30 21:53:47 UTC (rev 16840)
@@ -10,7 +10,9 @@
 
   pylith
 
-in any of the subdirectories.
+in the tri3, tet4, or hex8 subdirectories. The quad4 subdirectory also
+contains some additional dynamic examples, so the problem is run by
+entering "pylith shearwave_kinematicslip.cfg".
 
 
 Subdirectories
@@ -20,8 +22,10 @@
   - tet4: Mesh with tetrahedral cells
   - quad4: Mesh with quadrilateral cells
 
-Each of the subdirectories contains the files listed below (along with
-other files for the mesh).
+Each of the tri3, tet4, and hex8 subdirectories contains the files
+listed below (along with other files for the mesh). The files in the
+quad4 subdirectory are named differently (see the README in the quad4
+subdirectory for more information).
 
   - pylithapp.cfg: Parameter settings for the shear wave dislocation problem
   - matprops.spatialdb: Material database of physical properties
@@ -30,4 +34,3 @@
     peak slip rate
   - shearwave_sliptime.spatialdb: Spatial database with values for the
     slip initiation time
-

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/hex8/bar_hex8_200m.exo
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/hex8/pylithapp.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/hex8/pylithapp.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/hex8/pylithapp.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,11 +1,28 @@
 # -*- Python -*-
+[pylithapp]
 
-# These settings define an explicit time-stepping problem using a fault with
-# kinematically-specified slip.
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
 
-[pylithapp]
+# 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 a self-contained simulation configuration file.
+#
+# To run the simulation:
+# pylith
+
+# ----------------------------------------------------------------------
 # journal
 # ----------------------------------------------------------------------
 [pylithapp.journal.info]
@@ -46,8 +63,8 @@
 # Nondimensionalize problem using wave propagation parameters.
 normalizer = spatialdata.units.NondimElasticDynamic
 
-# Set bc to an array with 3 boundary conditions: 'x_neg', 'x_pos', and 'y_pos'.
-bc = [x_pos,x_neg,y_pos]
+# Set bc to an array with 3 boundary conditions: 'x_neg', 'x_pos', and 'all_nofault'.
+bc = [x_pos,x_neg,all_nofault]
 
 # Change the DirichletPoints BC to the AbsorbingDampers BC
 bc.x_pos = pylith.bc.AbsorbingDampers
@@ -71,7 +88,7 @@
 # Label for material
 label = Elastic material
 
-# Nodeset id from CUBIT
+# Block id from CUBIT
 id = 1
 
 # Spatial database with physical properties for elastic material
@@ -89,8 +106,8 @@
 [pylithapp.timedependent.bc.x_pos]
 # Absorbing boundary condition on +x face of bar
 
-# Nodeset id from CUBIT
-label = 11
+# Nodeset name from CUBIT
+label = face_xpos
 
 # Specify label and filename for spatial database with physical properties
 db.label = Absorbing BC +x
@@ -105,8 +122,8 @@
 [pylithapp.timedependent.bc.x_neg]
 # Absorbing boundary condition on -x face of bar
 
-# Nodeset id from CUBIT
-label = 12
+# Nodeset name from CUBIT
+label = face_xneg
 
 # Specify label and filename for spatial database with physical properties
 db.label = Absorbing BC -x
@@ -118,14 +135,14 @@
 quadrature.cell.dimension = 2
 quadrature.cell.quad_order = 2
 
-[pylithapp.timedependent.bc.y_pos]
+[pylithapp.timedependent.bc.all_nofault]
 # Dirichlet boundary condition on all vertices except fault vertices
 
 # Pin x and z degrees of freedom
 bc_dof = [0, 2]
 
-# Nodeset id from CUBIT
-label = 13
+# Nodeset name from CUBIT
+label = vertices_nofault
 
 # ----------------------------------------------------------------------
 # faults
@@ -146,8 +163,8 @@
 # Material id
 id = 100
 
-# Nodeset id from CUBIT
-label = 10
+# Nodeset name from CUBIT
+label = fault
 
 # Specify the basis functions and quadrature:
 # 2-D Lagrange cell in 3-D space with 2nd order quadrature
@@ -199,19 +216,20 @@
 
 # Give basename for VTK domain output of solution over domain.
 [pylithapp.problem.formulation.output.output]
-skip = 3
+vertex_data_fields = [displacement,velocity]
+skip = 1
 writer.filename = output/shearwave.vtk
 writer.time_format = %05.2f
 
 # Give basename for VTK fault output.
 [pylithapp.timedependent.interfaces.fault.output]
-skip = 3
+skip = 1
 writer.filename = output/shearwave-fault.vtk
 writer.time_format = %05.2f
 
 # Give basename for VTK output of state variables.
 [pylithapp.timedependent.materials.elastic.output]
-skip = 33
+skip = 19
 writer.filename = output/shearwave-statevars.vtk
 writer.time_format = %05.2f
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/Makefile.am	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/Makefile.am	2010-05-30 21:53:47 UTC (rev 16840)
@@ -20,8 +20,13 @@
 	matprops.spatialdb \
 	mesh_quad4_200m.jou \
 	pylithapp.cfg \
-	shearwave_slip.spatialdb \
-	shearwave_risetime.spatialdb \
-	shearwave_sliptime.spatialdb
+	kinematic.cfg \
+	kinematic_slip.spatialdb \
+	kinematic_risetime.spatialdb \
+	kinematic_sliptime.spatialdb \
+	dynamic.cfg \
+	dynamic_staticfriction.cfg \
+	dynamic_slipweakening.cfg \
+	dynamic_ratestateageing.cfg
 
 # End of file 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/README
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/README	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/README	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,18 +1,47 @@
-The bar is discretized with quadrilateral cells.
+The bar is discretized with quadrilateral cells. Detailed descriptions
+of the problems are in the .cfg files associated with each example. In
+each example the output (VTK files) are written to the output
+directory.
 
-Files associated with the example problem:
+Example problems
 
+  * Kinematic fault slip (same as problem in tri3, tet4, and hex8
+    subdirectories)
+
+  * Dynamic fault slip with static friction fault constitutive model
+
+  * Dynamic fault slip with linear slip-weakening fault constitutive model
+
+  * Dynamic fault slip with rate- and state-friction fault constitutive model
+
+
+Files common to all example problems
+
   - geometry.jou: CUBIT journal file defining the geometry of the mesh
   - mesh_quad4_200m.jou: CUBIT journal file for meshing the problem
-  - pylithapp.cfg: Parameter settings for the shear wave dislocation problem
+  - pylithapp.cfg: Parameter settings common to all example problems
   - matprops.spatialdb: Material database of physical properties
   - bar_quad4_200m.exo: Exodus file with mesh generated by CUBIT
-  - shearwave_slip.spatialdb: Spatial database with values for final slip
-  - shearwave_sliprate.spatialdb: Spatial database with values for the
-    peak slip rate
-  - shearwave_sliptime.spatialdb: Spatial database with values for the
-    slip initiation time
 
-To run the problem, enter
+Files associated with the example problems:
 
-  pylith
+  + 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 
+
+  + Dynamic fault slip with static friction fault constitutive model
+
+    - dynamic.cfg: Parameters common to dynamic friction problems
+    - dynamic_staticfriction.cfg: Parameters for simulation 
+
+  + Dynamic fault slip with linear slip-weakening fault constitutive model
+
+    - dynamic.cfg: Parameters common to dynamic friction problems
+    - dynamic_slipweakening.cfg: Parameters for simulation 
+
+  + Dynamic fault slip with rate- and state-friction fault constitutive model
+
+    - dynamic.cfg: Parameters common to dynamic friction problems
+    - dynamic_ratestateageing.cfg: Parameters for simulation 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/bar_quad4_200m.exo
===================================================================
(Binary files differ)

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic.cfg (from rev 16839, short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,49 @@
+# -*- Python -*-
+[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)
+db_initial_tractions = spatialdata.spatialdb.UniformDB
+db_initial_tractions.label = Initial fault tractions
+db_initial_tractions.values = [traction-shear,traction-normal]
+db_initial_tractions.data = [-6.1*MPa, -10.0*MPa]
+
+# ----------------------------------------------------------------------
+# output
+# ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces.fault.output]
+# Add slip rate to the default output fiels of slip and traction.
+vertex_data_fields=[slip,slip_rate,traction]
+skip = 1
+writer.time_format = %05.2f

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_ratestateageing.cfg (from rev 16839, short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_ratestateageing.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_ratestateageing.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_ratestateageing.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,66 @@
+# -*- Python -*-
+[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
+
+# 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/shearwave-ratestateageing.vtk
+
+[pylithapp.timedependent.interfaces.fault.output]
+writer.filename = output/shearwave-ratestateageing-fault.vtk
+
+[pylithapp.timedependent.materials.elastic.output]
+writer.filename = output/shearwave-ratestateageing-statevars.vtk

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_slipweakening.cfg (from rev 16839, short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_slipweakening.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_slipweakening.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_slipweakening.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,65 @@
+# -*- Python -*-
+[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
+
+# 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,initial_traction,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/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_staticfriction.cfg (from rev 16839, short/3D/PyLith/trunk/examples/bar_shearwave/quad4/dynamic_staticfriction.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_staticfriction.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/dynamic_staticfriction.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,53 @@
+# -*- Python -*-
+[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
+
+# 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/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/geometry.jou
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/geometry.jou	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/geometry.jou	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,12 +1,3 @@
-## /tools/common/cubit-10.2/bin/clarox
-## Cubit Version 10.2
-## Cubit Build 24
-## Revised 12/15/2006 16:09:40 MST
-## Running 06/18/2007 10:26:50 AM
-## Command Options:
-## -warning = On
-## -information = On
-
 # ----------------------------------------------------------------------
 # Create block
 # ----------------------------------------------------------------------
@@ -26,8 +17,8 @@
 # ----------------------------------------------------------------------
 
 # Create fault (yz plane) at x = 0.0
-split surface 8 across location position 0 -200 0 location position 0 200 0
-curve 21 name "fault_surface"
+split surface 7 across location position 0 -200 0 location position 0 200 0
+curve 17 name "fault_surface"
 
 # ----------------------------------------------------------------------
 # Imprint all volumes, merging surfaces

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic.cfg (from rev 16839, short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic.cfg)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic.cfg	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,83 @@
+# -*- Python -*-
+[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.iohandler.filename = kinematic_slip.spatialdb
+
+# Database specifying rise_time.
+rise_time.iohandler.filename = kinematic_risetime.spatialdb
+
+# Database specifying time at which slip begins at each point.
+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

Copied: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_risetime.spatialdb (from rev 16839, short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_risetime.spatialdb)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_risetime.spatialdb	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_risetime.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -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/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_slip.spatialdb (from rev 16839, short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_slip.spatialdb)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_slip.spatialdb	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_slip.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -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/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_sliptime.spatialdb (from rev 16839, short/3D/PyLith/trunk/examples/bar_shearwave/quad4/kinematic_sliptime.spatialdb)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_sliptime.spatialdb	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/kinematic_sliptime.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -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/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/mesh_quad4_200m.jou
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/mesh_quad4_200m.jou	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/mesh_quad4_200m.jou	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,12 +1,3 @@
-## /tools/common/cubit-10.2/bin/clarox
-## Cubit Version 10.2
-## Cubit Build 24
-## Revised 12/15/2006 16:09:40 MST
-## Running 06/18/2007 10:26:50 AM
-## Command Options:
-## -warning = On
-## -information = On
-
 # ----------------------------------------------------------------------
 # Generate geometry
 # ----------------------------------------------------------------------
@@ -25,7 +16,7 @@
 # ----------------------------------------------------------------------
 # Create blocks for materials
 # ----------------------------------------------------------------------
-block 1 surface 9 10
+block 1 surface 8 9
 block 1 name "elastic"
 
 # ----------------------------------------------------------------------
@@ -38,24 +29,24 @@
 # ----------------------------------------------------------------------
 # Create nodeset for +x face
 # ----------------------------------------------------------------------
-group "face_xpos" add node in curve 18
-nodeset 11 group face_xpos
-nodeset 11 name "face xpos"
+group "face_xpos" add node in curve 14
+nodeset 20 group face_xpos
+nodeset 20 name "face xpos"
 
 # ----------------------------------------------------------------------
 # Create nodeset for -x face
 # ----------------------------------------------------------------------
-group "face_xneg" add node in curve 20
-nodeset 12 group face_xneg
-nodeset 12 name "face xneg"
+group "face_xneg" add node in curve 16
+nodeset 21 group face_xneg
+nodeset 21 name "face xneg"
 
 # ----------------------------------------------------------------------
 # Create nodeset for all vertices but fault
 # ----------------------------------------------------------------------
 group "vertices_nofault" add node all
 group "vertices_nofault" remove node in fault
-nodeset 13 group vertices_nofault
-nodeset 13 name "vertices_nofault"
+nodeset 22 group vertices_nofault
+nodeset 22 name "vertices_nofault"
 
 # ----------------------------------------------------------------------
 # Export exodus file

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/pylithapp.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/pylithapp.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/pylithapp.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,22 +1,22 @@
 # -*- Python -*-
-
-# These settings define an explicit time-stepping problem using a fault with
-# kinematically-specified slip.
-
 [pylithapp]
 
+# This is not a self-contained simulation configuration file. This
+# file only specifies the general parameters common to the simulations
+# in this directory.
+
 # ----------------------------------------------------------------------
 # journal
 # ----------------------------------------------------------------------
+# Turn on some journals to show progress.
 [pylithapp.journal.info]
 timedependent = 1
-#explicit = 1
-#petsc = 1
+explicit = 1
+petsc = 1
 meshiocubit = 1
-#explicitelasticity = 1
-#quadrature2d = 1
-#fiatlagrange = 1
-#faultcohesivekin = 1
+explicitelasticity = 1
+quadrature2d = 1
+fiatlagrange = 1
 
 [pylithapp.journal.debug]
 pylithapp = 1
@@ -27,10 +27,14 @@
 # mesh_generator
 # ----------------------------------------------------------------------
 [pylithapp.mesh_generator]
+# uncomment to get very verbose mesh information
 #debug = 1
+
+# Change the default mesh reader to the CUBIT reader.
 reader = pylith.meshio.MeshIOCubit
 
 [pylithapp.mesh_generator.reader]
+# Set filename of mesh to read and dimension for coordinate system.
 filename = bar_quad4_200m.exo
 coordsys.space_dim = 2
 
@@ -38,22 +42,21 @@
 # problem
 # ----------------------------------------------------------------------
 [pylithapp.timedependent]
+# Set the spatial dimension of the problem.
 dimension = 2
 
-# Change to an explicit time stepping formulation
-#formulation = pylith.problems.Explicit
-formulation = pylith.problems.ExplicitLumped
+# Change to an explicit time stepping formulation.  We use explicit
+# time-stepping with a consistent (full) Jacobian matrix.
+formulation = pylith.problems.Explicit
 
 # Nondimensionalize problem using wave propagation parameters.
 normalizer = spatialdata.units.NondimElasticDynamic
+normalizer.shear_wave_speed = 1.0*km/s
 
-# Set bc to an array with 3 boundary conditions: 'x_neg', 'x_pos', and 'y_pos'.
-bc = [x_pos,x_neg,y_pos]
+# Set bc to an array with 3 boundary conditions: 'x_neg', 'x_pos', and
+# 'all_nofault'.
+bc = [x_pos,x_neg,all_nofault]
 
-# Change the DirichletPoints BC to the AbsorbingDampers BC
-bc.x_pos = pylith.bc.AbsorbingDampers
-bc.x_neg = pylith.bc.AbsorbingDampers
-
 # Set interfaces to an array with 1 fault: 'fault'.
 interfaces = [fault]
 
@@ -61,6 +64,7 @@
 materials = [elastic]
 
 [pylithapp.timedependent.formulation.time_step]
+# Set the total time of the simulation and the time step.
 total_time = 12.0*s
 dt = 0.05*s
 
@@ -68,6 +72,7 @@
 # materials
 # ----------------------------------------------------------------------
 [pylithapp.timedependent.materials]
+# Use elastic plane strain bulk constitutive model.
 elastic = pylith.materials.ElasticPlaneStrain
 
 [pylithapp.timedependent.materials.elastic]
@@ -90,11 +95,16 @@
 # ----------------------------------------------------------------------
 # boundary conditions
 # ----------------------------------------------------------------------
+[pylithapp.timedependent.bc]
+# Change the default Dirichlet BC to the AbsorbingDampers BC
+x_pos = pylith.bc.AbsorbingDampers
+x_neg = pylith.bc.AbsorbingDampers
+
 [pylithapp.timedependent.bc.x_pos]
-# Absorbing boundary condition on +x face of bar
+# Absorbing BC on +x face of bar
 
-# Nodeset id from CUBIT
-label = 11
+# Name of nodeset in CUBIT
+label = face_xpos
 
 # Specify label and filename for spatial database with physical properties
 db.label = Absorbing BC +x
@@ -107,10 +117,10 @@
 quadrature.cell.quad_order = 2
 
 [pylithapp.timedependent.bc.x_neg]
-# Absorbing boundary condition on -x face of bar
+# Absorbing BC on -x face of bar
 
-# Nodeset id from CUBIT
-label = 12
+# Name of nodeset in CUBIT
+label = face_xneg
 
 # Specify label and filename for spatial database with physical properties
 db.label = Absorbing BC -x
@@ -122,18 +132,19 @@
 quadrature.cell.dimension = 1
 quadrature.cell.quad_order = 2
 
-[pylithapp.timedependent.bc.y_pos]
+[pylithapp.timedependent.bc.all_nofault]
 # Dirichlet boundary condition on all vertices except fault vertices
 
-# Pin x and z degrees of freedom
+# Pin x degree of freedom
 bc_dof = [0]
 
-# Nodeset id from CUBIT
-label = 13
+# Name of nodeset from CUBIT.
+label = vertices_nofault
 
 # ----------------------------------------------------------------------
 # faults
 # ----------------------------------------------------------------------
+[pylithapp.timedependent.interfaces.fault]
 # NOTE: It is possible to assign an ID number to a fault (e.g.,
 # 'id = 10').  Care must be taken when doing this, however, because the
 # assigned ID will become the material ID for the cohesive element.
@@ -145,13 +156,11 @@
 # 2.  If you use the default fault ID, make sure that none of your
 #     material ID's are equal to 100.
 
-[pylithapp.timedependent.interfaces.fault]
-
 # Material id
 id = 100
 
-# Nodeset id from CUBIT
-label = 10
+# Name of nodeset from CUBIT
+label = fault
 
 # Specify the basis functions and quadrature:
 # 1-D Lagrange cell in 2-D space with 2nd order quadrature
@@ -159,65 +168,50 @@
 quadrature.cell.dimension = 1
 quadrature.cell.quad_order = 2
 
-# 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.iohandler.filename = shearwave_slip.spatialdb
-
-# Database specifying rise_time.
-rise_time.iohandler.filename = shearwave_risetime.spatialdb
-
-# Database specifying time at which slip begins at each point.
-slip_time.iohandler.filename = shearwave_sliptime.spatialdb
-
 # ----------------------------------------------------------------------
 # PETSc
 # ----------------------------------------------------------------------
 [pylithapp.petsc]
-ksp_type = gmres
-pc_type = asm
 
-# Change the preconditioner settings.
+# 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 = 50
-ksp_gmres_restart = 75
+ksp_max_it = 500
+ksp_gmres_restart = 100
+snes_max_it = 500
 
+# Linear solver monitoring options.
 ksp_monitor = true
 ksp_view = true
-#log_summary = 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
+
 # ----------------------------------------------------------------------
 # output
 # ----------------------------------------------------------------------
-# We set three output manager parameters for each type of output.
+# We set two output manager parameters for each type of output.
 #   skip - Number of time steps to skip between output
-#   writer.filename - Root name for VTK file
 #   writer.time_format - Format of time stamp (decimal point is removed)
-
-# Give basename for VTK domain output of solution over domain.
+# We will set the output filename in the problem specific .cfg file.
 [pylithapp.problem.formulation.output.output]
-skip = 3
-writer.filename = output/shearwave.vtk
+vertex_data_fields = [displacement,velocity]
+skip = 1
 writer.time_format = %05.2f
 
-# Give basename for VTK fault output.
-[pylithapp.timedependent.interfaces.fault.output]
-skip = 3
-writer.filename = output/shearwave-fault.vtk
-writer.time_format = %05.2f
-
-# Give basename for VTK output of state variables.
 [pylithapp.timedependent.materials.elastic.output]
-skip = 33
-writer.filename = output/shearwave-statevars.vtk
+skip = 19
 writer.time_format = %05.2f
 
-# Averate state variables over cell
+# Averate state variables over quadrature points.
 cell_filter = pylith.meshio.CellFilterAvgMesh

Deleted: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_risetime.spatialdb
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_risetime.spatialdb	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_risetime.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -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/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_slip.spatialdb
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_slip.spatialdb	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_slip.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -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/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_sliptime.spatialdb
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_sliptime.spatialdb	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/quad4/shearwave_sliptime.spatialdb	2010-05-30 21:53:47 UTC (rev 16840)
@@ -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

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tet4/pylithapp.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tet4/pylithapp.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tet4/pylithapp.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,11 +1,28 @@
 # -*- Python -*-
+[pylithapp]
 
-# These settings define an explicit time-stepping problem using a fault with
-# kinematically-specified slip.
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
 
-[pylithapp]
+# 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 a self-contained simulation configuration file.
+#
+# To run the simulation:
+# pylith
+
+# ----------------------------------------------------------------------
 # journal
 # ----------------------------------------------------------------------
 [pylithapp.journal.info]
@@ -42,14 +59,19 @@
 
 # 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
 
 # Nondimensionalize problem using wave propagation parameters.
 normalizer = spatialdata.units.NondimElasticDynamic
 
-# Set bc to an array with 3 boundary conditions: 'x_neg', 'x_pos', and 'y_pos'.
-bc = [x_pos,x_neg,y_pos]
+# Set bc to an array with 3 boundary conditions: 'x_neg', 'x_pos', and 'all_nofault'.
+bc = [x_pos,x_neg,all_nofault]
 
 # Change the DirichletPoints BC to the AbsorbingDampers BC
 bc.x_pos = pylith.bc.AbsorbingDampers
@@ -137,7 +159,7 @@
 quadrature.cell.shape = triangle
 quadrature.cell.quad_order = 2
 
-[pylithapp.timedependent.bc.y_pos]
+[pylithapp.timedependent.bc.all_nofault]
 # Dirichlet boundary condition on all vertices except fault vertices
 
 bc_dof = [0, 2]
@@ -216,19 +238,20 @@
 
 # Give basename for VTK domain output of solution over domain.
 [pylithapp.problem.formulation.output.output]
-skip = 3
+vertex_data_fields = [displacement,velocity]
+skip = 2
 writer.filename = output/shearwave.vtk
 writer.time_format = %05.2f
 
 # Give basename for VTK fault output.
 [pylithapp.timedependent.interfaces.fault.output]
-skip = 3
+skip = 2
 writer.filename = output/shearwave-fault.vtk
 writer.time_format = %05.2f
 
 # Give basename for VTK output of state variables.
 [pylithapp.timedependent.materials.pos.output]
-skip = 33
+skip = 29
 writer.filename = output/shearwave-statevars-pos.vtk
 writer.time_format = %05.2f
 
@@ -237,7 +260,7 @@
 
 # Give basename for VTK output of state variables.
 [pylithapp.timedependent.materials.neg.output]
-skip = 33
+skip = 29
 writer.filename = output/shearwave-statevars-neg.vtk
 writer.time_format = %05.2f
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/bar_tri3_200m.exo
===================================================================
(Binary files differ)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/geometry.jou
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/geometry.jou	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/geometry.jou	2010-05-30 21:53:47 UTC (rev 16840)
@@ -26,11 +26,12 @@
 # ----------------------------------------------------------------------
 
 # Create fault (yz plane) at x = 0.0
-split surface 8 across location position 0 -200 0 location position 0 200 0
-curve 21 name "fault_surface"
+split surface 7 across location position 0 -200 0 location position 0 200 0
+curve 17 name "fault_surface"
 
 # ----------------------------------------------------------------------
 # Imprint all volumes, merging surfaces
 # ----------------------------------------------------------------------
 imprint all
 merge all
+

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/mesh_tri3_200m.jou
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/mesh_tri3_200m.jou	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/mesh_tri3_200m.jou	2010-05-30 21:53:47 UTC (rev 16840)
@@ -20,7 +20,7 @@
 # ----------------------------------------------------------------------
 # Set the meshing scheme
 # ----------------------------------------------------------------------
-surface 9 10 scheme trimesh
+surface 8 9 scheme trimesh
 
 # ----------------------------------------------------------------------
 # Generate the mesh
@@ -30,7 +30,7 @@
 # ----------------------------------------------------------------------
 # Create blocks for materials
 # ----------------------------------------------------------------------
-block 1 surface 9 10
+block 1 surface 8 9
 block 1 name "elastic"
 
 # ----------------------------------------------------------------------
@@ -43,14 +43,14 @@
 # ----------------------------------------------------------------------
 # Create nodeset for +x face
 # ----------------------------------------------------------------------
-group "face_xpos" add node in curve 18
+group "face_xpos" add node in curve 14
 nodeset 11 group face_xpos
 nodeset 11 name "face xpos"
 
 # ----------------------------------------------------------------------
 # Create nodeset for -x face
 # ----------------------------------------------------------------------
-group "face_xneg" add node in curve 20
+group "face_xneg" add node in curve 16
 nodeset 12 group face_xneg
 nodeset 12 name "face xneg"
 
@@ -66,3 +66,4 @@
 # Export exodus file
 # ----------------------------------------------------------------------
 export mesh "bar_tri3_200m.exo" dimension 2 overwrite
+

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/pylithapp.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/pylithapp.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/bar_shearwave/tri3/pylithapp.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,11 +1,28 @@
 # -*- Python -*-
+[pylithapp]
 
-# These settings define an explicit time-stepping problem using a fault with
-# kinematically-specified slip.
+# ----------------------------------------------------------------------
+# PROBLEM DESCRIPTION
+# ----------------------------------------------------------------------
 
-[pylithapp]
+# 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 a self-contained simulation configuration file.
+#
+# To run the simulation:
+# pylith
+
+# ----------------------------------------------------------------------
 # journal
 # ----------------------------------------------------------------------
 [pylithapp.journal.info]
@@ -47,8 +64,8 @@
 # Nondimensionalize problem using wave propagation parameters.
 normalizer = spatialdata.units.NondimElasticDynamic
 
-# Set bc to an array with 3 boundary conditions: 'x_neg', 'x_pos', and 'y_pos'.
-bc = [x_pos,x_neg,y_pos]
+# Set bc to an array with 3 boundary conditions: 'x_neg', 'x_pos', and 'all_nofault'.
+bc = [x_pos,x_neg,all_nofault]
 
 # Change the DirichletPoints BC to the AbsorbingDampers BC
 bc.x_pos = pylith.bc.AbsorbingDampers
@@ -75,7 +92,7 @@
 # Label for material
 label = Elastic material
 
-# Nodeset id from CUBIT
+# Block id from CUBIT
 id = 1
 
 # Spatial database with physical properties for elastic material
@@ -93,8 +110,8 @@
 [pylithapp.timedependent.bc.x_pos]
 # Absorbing boundary condition on +x face of bar
 
-# Nodeset id from CUBIT
-label = 11
+# Nodeset name from CUBIT
+label = face_xpos
 
 # Specify label and filename for spatial database with physical properties
 db.label = Absorbing BC +x
@@ -109,8 +126,8 @@
 [pylithapp.timedependent.bc.x_neg]
 # Absorbing boundary condition on -x face of bar
 
-# Nodeset id from CUBIT
-label = 12
+# Nodeset name from CUBIT
+label = face_xneg
 
 # Specify label and filename for spatial database with physical properties
 db.label = Absorbing BC -x
@@ -122,14 +139,14 @@
 quadrature.cell.shape = line
 quadrature.cell.quad_order = 2
 
-[pylithapp.timedependent.bc.y_pos]
+[pylithapp.timedependent.bc.all_nofault]
 # Dirichlet boundary condition on all vertices except fault vertices
 
 # Pin x and z degrees of freedom
 bc_dof = [0]
 
-# Nodeset id from CUBIT
-label = 13
+# Nodeset name from CUBIT
+label = vertices_nofault
 
 # ----------------------------------------------------------------------
 # faults
@@ -150,8 +167,8 @@
 # Material id
 id = 100
 
-# Nodeset id from CUBIT
-label = 10
+# Nodeset name from CUBIT
+label = fault
 
 # Specify the basis functions and quadrature:
 # 1-D simplex cell in 2-D space with 2nd order quadrature
@@ -186,7 +203,7 @@
 ksp_rtol = 1.0e-8
 ksp_atol = 1.0e-10
 ksp_max_it = 50
-ksp_gmres_restart = 10
+ksp_gmres_restart = 25
 
 #ksp_monitor = true
 #ksp_view = true
@@ -203,19 +220,20 @@
 
 # Give basename for VTK domain output of solution over domain.
 [pylithapp.problem.formulation.output.output]
-skip = 3
+vertex_data_fields = [displacement,velocity]
+skip = 2
 writer.filename = output/shearwave.vtk
 writer.time_format = %05.2f
 
 # Give basename for VTK fault output.
 [pylithapp.timedependent.interfaces.fault.output]
-skip = 3
+skip = 2
 writer.filename = output/shearwave-fault.vtk
 writer.time_format = %05.2f
 
 # Give basename for VTK output of state variables.
 [pylithapp.timedependent.materials.elastic.output]
-skip = 33
+skip = 29
 writer.filename = output/shearwave-statevars.vtk
 writer.time_format = %05.2f
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/examples/greensfns/hex8/pylithapp.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/examples/greensfns/hex8/pylithapp.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/examples/greensfns/hex8/pylithapp.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -33,6 +33,7 @@
 [pylithapp.mesh_generator.reader]
 # Set filename of mesh to import.
 filename = box_hex8_1000m.exo
+use_nodeset_names = False
 
 # ----------------------------------------------------------------------
 # problem

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/Makefile.am	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/Makefile.am	2010-05-30 21:53:47 UTC (rev 16840)
@@ -75,6 +75,7 @@
 	feassemble/IntegratorElasticity.cc \
 	feassemble/ElasticityImplicit.cc \
 	feassemble/ElasticityExplicit.cc \
+	feassemble/ElasticityExplicitTri3.cc \
 	feassemble/ElasticityExplicitTet4.cc \
 	feassemble/IntegratorElasticityLgDeform.cc \
 	feassemble/ElasticityImplicitLgDeform.cc \

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/BoundaryCondition.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/BoundaryCondition.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/BoundaryCondition.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -50,7 +50,7 @@
   if (!sieveMesh->hasIntSection(_label)) {
     std::ostringstream msg;
     msg << "Mesh missing group of vertices '" << _label
-	<< " for boundary condition.";
+	<< "' for boundary condition.";
     throw std::runtime_error(msg.str());
   } // if
 } // verifyConfiguration

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/DirichletBC.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/DirichletBC.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/DirichletBC.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -47,6 +47,12 @@
   virtual
   void deallocate(void);
   
+  /** Get number of constraints per location.
+   *
+   * @returns Number of constraints per location.
+   */
+  int numDimConstrained(void) const;
+
   /** Initialize boundary condition.
    *
    * @param mesh PETSc mesh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/DirichletBC.icc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/DirichletBC.icc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/DirichletBC.icc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -24,5 +24,12 @@
   return *_normalizer;
 }
 
+// Get number of constraints per location.
+inline
+int
+pylith::bc::DirichletBC::numDimConstrained(void) const {
+  return _bcDOF.size();
+}
 
+
 // End of file 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/PointForce.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/PointForce.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/PointForce.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -16,6 +16,7 @@
 
 #include "pylith/topology/Field.hh" // USES Field
 #include "pylith/topology/Fields.hh" // USES Fields
+#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
 #include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
 #include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
 
@@ -70,10 +71,9 @@
 } // initialize
 
 // ----------------------------------------------------------------------
-// Integrate contributions to residual term (r) for operator that
-// do not require assembly over cells, vertices, or processors.
+// Integrate contributions to residual term (r) for operator.
 void
-pylith::bc::PointForce::integrateResidualAssembled(
+pylith::bc::PointForce::integrateResidual(
 			   const topology::Field<topology::Mesh>& residual,
 			   const double t,
 			   topology::SolutionFields* const fields)
@@ -96,6 +96,14 @@
   const ALE::Obj<RealSection>& residualSection = residual.section();
   assert(!residualSection.isNull());
 
+  // Get global order
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::order_type>& globalOrder =
+      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
+        residualSection);
+  assert(!globalOrder.isNull());
+
   double_array valuesVertex(numBCDOF);
   const ALE::Obj<RealSection>& valueSection = 
     _parameters->get("value").section();
@@ -103,6 +111,11 @@
   
   for (int iPoint=0; iPoint < numPoints; ++iPoint) {
     const int p_bc = _points[iPoint]; // Get point label.
+
+    // Contribute to residual if point is local.
+    if (!globalOrder->isLocal(p_bc))
+      continue;
+
     residualVertex *= 0.0; // Reset residual contribution to zero.
     
     valueSection->restrictPoint(p_bc, &valuesVertex[0], valuesVertex.size());

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/PointForce.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/PointForce.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/bc/PointForce.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -57,9 +57,9 @@
    * @param t Current time
    * @param fields Solution fields
    */
-  void integrateResidualAssembled(const topology::Field<topology::Mesh>& residual,
-				  const double t,
-				  topology::SolutionFields* const fields);
+  void integrateResidual(const topology::Field<topology::Mesh>& residual,
+			 const double t,
+			 topology::SolutionFields* const fields);
 
   /** Verify configuration is acceptable.
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveDyn.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveDyn.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveDyn.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -142,16 +142,19 @@
 // ----------------------------------------------------------------------
 // Integrate contributions to residual term (r) for operator.
 void
-pylith::faults::FaultCohesiveDyn::integrateResidualAssembled(
+pylith::faults::FaultCohesiveDyn::integrateResidual(
 			     const topology::Field<topology::Mesh>& residual,
 			     const double t,
 			     topology::SolutionFields* const fields)
-{ // integrateResidualAssembled
+{ // integrateResidual
   assert(0 != fields);
   assert(0 != _fields);
 
-  FaultCohesiveLagrange::integrateResidualAssembled(residual, t, fields);
+  // Initial fault tractions have been assembled, so they do not need
+  // assembling across processors.
 
+  FaultCohesiveLagrange::integrateResidual(residual, t, fields);
+
   // No contribution if no initial tractions are specified.
   if (0 == _dbInitialTract)
     return;
@@ -171,6 +174,13 @@
   const ALE::Obj<RealSection>& slipSection = _fields->get("slip").section();
   assert(!slipSection.isNull());
 
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::order_type>& globalOrder =
+    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", 
+					    residualSection);
+  assert(!globalOrder.isNull());
+
   const int numVertices = _cohesiveVertices.size();
   for (int iVertex=0; iVertex < numVertices; ++iVertex) {
     const int v_fault = _cohesiveVertices[iVertex].fault;
@@ -178,6 +188,10 @@
     const int v_negative = _cohesiveVertices[iVertex].negative;
     const int v_positive = _cohesiveVertices[iVertex].positive;
 
+    // Compute contribution only if Lagrange constraint is local.
+    if (!globalOrder->isLocal(v_lagrange))
+      continue;
+
     // Get initial forces at fault vertex. Forces are in the global
     // coordinate system so no rotation is necessary.
     forcesInitialSection->restrictPoint(v_fault, 
@@ -191,6 +205,7 @@
     // only apply initial tractions if there is no opening
     if (0.0 == slipVertex[spaceDim-1]) {
       residualVertex = forcesInitialVertex;
+
       assert(residualVertex.size() == 
 	     residualSection->getFiberDimension(v_positive));
       residualSection->updateAddPoint(v_positive, &residualVertex[0]);
@@ -203,7 +218,7 @@
   } // for
 
   PetscLogFlops(numVertices*spaceDim);
-} // integrateResidualAssembled
+} // integrateResidual
 
 // ----------------------------------------------------------------------
 // Update state variables as needed.
@@ -671,6 +686,10 @@
       fields->get("dispIncr(t->t+dt)").section();
   assert(!dispTIncrSection.isNull());
 
+  const ALE::Obj<RealSection>& dispTIncrAdjSection = fields->get(
+    "dispIncr adjust").section();
+  assert(!dispTIncrAdjSection.isNull());
+
   double_array jacobianVertexN(spaceDim);
   double_array jacobianVertexP(spaceDim);
   const ALE::Obj<RealSection>& jacobianSection = jacobian.section();
@@ -681,6 +700,13 @@
   const ALE::Obj<RealSection>& residualSection =
       fields->get("residual").section();
 
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::order_type>& globalOrder =
+    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", 
+					    jacobianSection);
+  assert(!globalOrder.isNull());
+
   adjustSolnLumped_fn_type adjustSolnLumpedFn;
   constrainSolnSpace_fn_type constrainSolnSpaceFn;
   sensitivitySolveLumped_fn_type sensitivitySolveLumpedFn;
@@ -728,6 +754,10 @@
     const int v_negative = _cohesiveVertices[iVertex].negative;
     const int v_positive = _cohesiveVertices[iVertex].positive;
 
+    // Compute contribution only if Lagrange constraint is local.
+    if (!globalOrder->isLocal(v_lagrange))
+      continue;
+
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventBegin(restrictEvent);
 #endif
@@ -923,12 +953,12 @@
     // Adjust displacements to account for Lagrange multiplier values
     // (assumed to be zero in perliminary solve).
     assert(dispTIncrVertexN.size() == 
-	   dispTIncrSection->getFiberDimension(v_negative));
-    dispTIncrSection->updateAddPoint(v_negative, &dispTIncrVertexN[0]);
+	   dispTIncrAdjSection->getFiberDimension(v_negative));
+    dispTIncrAdjSection->updateAddPoint(v_negative, &dispTIncrVertexN[0]);
 
     assert(dispTIncrVertexP.size() == 
-	   dispTIncrSection->getFiberDimension(v_positive));
-    dispTIncrSection->updateAddPoint(v_positive, &dispTIncrVertexP[0]);
+	   dispTIncrAdjSection->getFiberDimension(v_positive));
+    dispTIncrAdjSection->updateAddPoint(v_positive, &dispTIncrVertexP[0]);
 
     // Set Lagrange multiplier value. Value from preliminary solve is
     // bogus due to artificial diagonal entry of 1.0.
@@ -1578,8 +1608,6 @@
   const int spaceDim = _quadrature->spaceDim();
   const int subnrows = numBasis*spaceDim;
   const int submatrixSize = subnrows * subnrows;
-  const int nrows = 3*subnrows;
-  const int matrixSize = nrows * nrows;
 
   // Get solution field
   const topology::Field<topology::Mesh>& solutionDomain = fields.solution();
@@ -1598,17 +1626,16 @@
     cellsCohesive->end();
 
   // Visitor for Jacobian matrix associated with domain.
-  double_array jacobianDomainCell(matrixSize);
   const PetscMat jacobianDomainMatrix = jacobian.matrix();
   assert(0 != jacobianDomainMatrix);
   const ALE::Obj<SieveMesh::order_type>& globalOrderDomain =
     sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", solutionDomainSection);
   assert(!globalOrderDomain.isNull());
-  // We would need to request unique points here if we had an interpolated mesh
-  topology::Mesh::IndicesVisitor jacobianDomainVisitor(*solutionDomainSection,
-                                                 *globalOrderDomain,
-                           (int) pow(sieveMesh->getSieve()->getMaxConeSize(),
-                                     sieveMesh->depth())*spaceDim);
+  const ALE::Obj<SieveMesh::sieve_type>& sieve = sieveMesh->getSieve();
+  assert(!sieve.isNull());
+  ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type> ncV(*sieve,
+      (size_t) pow(sieve->getMaxConeSize(), std::max(0, sieveMesh->depth())));
+  int_array indicesGlobal(subnrows);
 
   // Get fault Sieve mesh
   const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
@@ -1620,7 +1647,7 @@
   assert(!solutionFaultSection.isNull());
 
   // Visitor for Jacobian matrix associated with fault.
-  double_array jacobianFaultCell(submatrixSize);
+  double_array jacobianSubCell(submatrixSize);
   assert(0 != _jacobian);
   const PetscMat jacobianFaultMatrix = _jacobian->matrix();
   assert(0 != jacobianFaultMatrix);
@@ -1633,47 +1660,50 @@
                            (int) pow(faultSieveMesh->getSieve()->getMaxConeSize(),
                                      faultSieveMesh->depth())*spaceDim);
 
-  const int indexOffset = (negativeSide) ? 0 : 3*submatrixSize + subnrows;
-
+  const int iCone = (negativeSide) ? 0 : 1;
   for (SieveMesh::label_sequence::iterator c_iter=cellsCohesiveBegin;
        c_iter != cellsCohesiveEnd;
        ++c_iter) {
+    // Get cone for cohesive cell
+    ncV.clear();
+    ALE::ISieveTraversal<SieveMesh::sieve_type>::orientedClosure(*sieve,
+								 *c_iter, ncV);
+    const int coneSize = ncV.getSize();
+    assert(coneSize == 3*numBasis);
+    const Mesh::point_type *cohesiveCone = ncV.getPoints();
+    assert(0 != cohesiveCone);
+
     const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
-    jacobianDomainCell = 0.0;
-    jacobianFaultCell = 0.0;
+    jacobianSubCell = 0.0;
 
-    // Get cell contribution in PETSc Matrix
-    jacobianDomainVisitor.clear();
-#if 0
+    // Get indices
+    for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
+      // negative side of the fault: iCone=0
+      // positive side of the fault: iCone=1
+      const int v_domain = cohesiveCone[iCone*numBasis+iBasis];
+      
+      for (int iDim=0, iB=iBasis*spaceDim; iDim < spaceDim; ++iDim) {
+	if (globalOrderDomain->isLocal(v_domain))
+	  indicesGlobal[iB+iDim] = globalOrderDomain->getIndex(v_domain) + iDim;
+	else
+	  indicesGlobal[iB+iDim] = -1;
 
-    PetscErrorCode err = restrictOperator(jacobianDomainMatrix, *sieveMesh->getSieve(),
-                                              jacobianDomainVisitor, *c_iter,
-                                              &jacobianDomainCell[0]);
-    CHECK_PETSC_ERROR_MSG(err, "Restrict from PETSc Mat failed.");
-#else
-    ALE::ISieveTraversal<SieveMesh::sieve_type>::orientedClosure(*sieveMesh->getSieve(), 
-						 *c_iter, 
-						 jacobianDomainVisitor);
-    const int* indices = jacobianDomainVisitor.getValues();
-    const int numIndices = jacobianDomainVisitor.getSize();
+	// Set matrix diagonal entries to 1.0 (used when vertex is not local).
+	jacobianSubCell[(iB+iDim)*numBasis*spaceDim+iB+iDim] = 1.0;
+      } // for
+    } // for
+    
     PetscErrorCode err = MatGetValues(jacobianDomainMatrix, 
-				      numIndices, indices,
-				      numIndices, indices,
-				      &jacobianDomainCell[0]);
+				      indicesGlobal.size(), &indicesGlobal[0],
+				      indicesGlobal.size(), &indicesGlobal[0],
+				      &jacobianSubCell[0]);
     CHECK_PETSC_ERROR_MSG(err, "Restrict from PETSc Mat failed.");
-#endif
 
-    for (int iRow=0, i=0; iRow < subnrows; ++iRow) {
-      const int indexR = indexOffset + iRow*nrows;
-      for (int iCol=0; iCol < subnrows; ++iCol, ++i)
-        jacobianFaultCell[i] = jacobianDomainCell[indexR+iCol];
-    } // for
-
     // Insert cell contribution into PETSc Matrix
     jacobianFaultVisitor.clear();
     err = updateOperator(jacobianFaultMatrix, *faultSieveMesh->getSieve(),
 			 jacobianFaultVisitor, c_fault,
-			 &jacobianFaultCell[0], INSERT_VALUES);
+			 &jacobianSubCell[0], INSERT_VALUES);
     CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
   } // for
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveDyn.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveDyn.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveDyn.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -77,19 +77,19 @@
 		  const double normalDir[3]);
 
   /** Integrate contributions to residual term (r) for operator that
-   * do not require assembly across cells, vertices, or processors.
+   * do not require assembly across processors.
    *
-   * Initial tractions (if specified) contribute to the residual like
-   * Neumann boundary conditions.
+   * Initial tractions (if specified) are already assembled and
+   * contribute to the residual like Neumann boundary conditions.
    *
    * @param residual Field containing values for residual
    * @param t Current time
    * @param fields Solution fields
    */
   virtual
-  void integrateResidualAssembled(const topology::Field<topology::Mesh>& residual,
-				  const double t,
-				  topology::SolutionFields* const fields);
+  void integrateResidual(const topology::Field<topology::Mesh>& residual,
+			 const double t,
+			 topology::SolutionFields* const fields);
 
   /** Update state variables as needed.
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveKin.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveKin.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveKin.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -113,10 +113,11 @@
 // Integrate contribution of cohesive cells to residual term that do
 // not require assembly across cells, vertices, or processors.
 void
-pylith::faults::FaultCohesiveKin::integrateResidualAssembled(const topology::Field<
-                                                                      topology::Mesh>& residual,
-                                                                  const double t,
-                                                                  topology::SolutionFields* const fields) { // integrateResidualAssembled
+pylith::faults::FaultCohesiveKin::integrateResidual(
+			     const topology::Field<topology::Mesh>& residual,
+			     const double t,
+			     topology::SolutionFields* const fields)
+{ // integrateResidual
   assert(0 != fields);
   assert(0 != _fields);
   assert(0 != _logger);
@@ -137,9 +138,9 @@
 
   _logger->eventEnd(setupEvent);
 
-  FaultCohesiveLagrange::integrateResidualAssembled(residual, t, fields);
+  FaultCohesiveLagrange::integrateResidual(residual, t, fields);
 
-} // integrateResidualAssembled
+} // integrateResidual
 
 // ----------------------------------------------------------------------
 // Get vertex field associated with integrator.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveKin.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveKin.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveKin.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -80,9 +80,9 @@
    * @param t Current time
    * @param fields Solution fields
    */
-  void integrateResidualAssembled(const topology::Field<topology::Mesh>& residual,
-				  const double t,
-				  topology::SolutionFields* const fields);
+  void integrateResidual(const topology::Field<topology::Mesh>& residual,
+			 const double t,
+			 topology::SolutionFields* const fields);
 
   /** Get vertex field associated with integrator.
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveLagrange.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveLagrange.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveLagrange.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -37,6 +37,8 @@
 #include <sstream> // USES std::ostringstream
 #include <stdexcept> // USES std::runtime_error
 
+#include <petscblaslapack.h> // USES svd and dgemm
+
 //#define PRECOMPUTE_GEOMETRY
 //#define DETAILED_EVENT_LOGGING
 
@@ -44,6 +46,7 @@
 typedef pylith::topology::Mesh::SieveMesh SieveMesh;
 typedef pylith::topology::Mesh::RealSection RealSection;
 typedef pylith::topology::SubMesh::SieveMesh SieveSubMesh;
+typedef pylith::topology::Mesh::RestrictVisitor RestrictVisitor;
 
 // ----------------------------------------------------------------------
 // Default constructor.
@@ -158,13 +161,13 @@
 } // splitField
 
 // ----------------------------------------------------------------------
-// Integrate contribution of cohesive cells to residual term that do
-// not require assembly across cells, vertices, or processors.
+// Integrate contribution of cohesive cells to residual term.
 void
-pylith::faults::FaultCohesiveLagrange::integrateResidualAssembled(const topology::Field<
-                                                                      topology::Mesh>& residual,
-                                                                  const double t,
-                                                                  topology::SolutionFields* const fields) { // integrateResidualAssembled
+pylith::faults::FaultCohesiveLagrange::integrateResidual(
+			 const topology::Field<topology::Mesh>& residual,
+			 const double t,
+			 topology::SolutionFields* const fields)
+{ // integrateResidual
   assert(0 != fields);
   assert(0 != _fields);
   assert(0 != _logger);
@@ -225,6 +228,12 @@
   const ALE::Obj<RealSection>& dispTIncrSection = dispTIncr.section();
   assert(!dispTIncrSection.isNull());
 
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::order_type>& globalOrder =
+    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", residualSection);
+  assert(!globalOrder.isNull());
+
   _logger->eventEnd(setupEvent);
 #if !defined(DETAILED_EVENT_LOGGING)
   _logger->eventBegin(computeEvent);
@@ -237,6 +246,10 @@
     const int v_negative = _cohesiveVertices[iVertex].negative;
     const int v_positive = _cohesiveVertices[iVertex].positive;
 
+    // Compute contribution only if Lagrange constraint is local.
+    if (!globalOrder->isLocal(v_lagrange))
+      continue;
+
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventBegin(restrictEvent);
 #endif
@@ -319,16 +332,16 @@
 #if !defined(DETAILED_EVENT_LOGGING)
   _logger->eventEnd(computeEvent);
 #endif
-} // integrateResidualAssembled
+} // integrateResidual
 
 // ----------------------------------------------------------------------
-// Compute Jacobian matrix (A) associated with operator that do not
-// require assembly across cells, vertices, or processors.
+// Compute Jacobian matrix (A) associated with operator.
 void
-pylith::faults::FaultCohesiveLagrange::integrateJacobianAssembled(topology::Jacobian* jacobian,
-                                                                  const double t,
-                                                                  topology::SolutionFields* const fields)
-{ // integrateJacobianAssembled
+pylith::faults::FaultCohesiveLagrange::integrateJacobian(
+				   topology::Jacobian* jacobian,
+				   const double t,
+				   topology::SolutionFields* const fields)
+{ // integrateJacobian
   assert(0 != jacobian);
   assert(0 != fields);
   assert(0 != _fields);
@@ -390,6 +403,10 @@
     const int v_negative = _cohesiveVertices[iVertex].negative;
     const int v_positive = _cohesiveVertices[iVertex].positive;
 
+    // Compute contribution only if Lagrange constraint is local.
+    if (!globalOrder->isLocal(v_lagrange))
+      continue;
+
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventBegin(restrictEvent);
 #endif
@@ -414,7 +431,7 @@
                  indicesL.size(), &indicesL[0],
                  indicesP.size(), &indicesP[0],
                  &jacobianVertex[0],
-                 INSERT_VALUES);
+                 ADD_VALUES);
 
     // Values at negative vertex, entry L,N in Jacobian
     jacobianVertex *= -1.0;
@@ -422,19 +439,22 @@
                  indicesL.size(), &indicesL[0],
                  indicesN.size(), &indicesN[0],
                  &jacobianVertex[0],
-                 INSERT_VALUES);
+                 ADD_VALUES);
 
     // Values associated with [C]^T
     // Transpose orientation matrix
+    jacobianVertex = 0.0;
     for (int iDim=0; iDim < spaceDim; ++iDim)
       for (int jDim=0; jDim < spaceDim; ++jDim)
-        jacobianVertex[iDim*spaceDim+jDim] = orientationVertex[jDim*spaceDim+iDim];
+        jacobianVertex[iDim*spaceDim+jDim] = 
+	  orientationVertex[jDim*spaceDim+iDim];
+
     // Values at positive vertex, entry P,L in Jacobian
     MatSetValues(jacobianMatrix,
                  indicesP.size(), &indicesP[0],
                  indicesL.size(), &indicesL[0],
                  &jacobianVertex[0],
-                 INSERT_VALUES);
+                 ADD_VALUES);
 
     // Values at negative vertex, entry L,N in Jacobian
     jacobianVertex *= -1.0;
@@ -442,7 +462,7 @@
                  indicesN.size(), &indicesN[0],
                  indicesL.size(), &indicesL[0],
                  &jacobianVertex[0],
-                 INSERT_VALUES);
+                 ADD_VALUES);
 
     // Values at Lagrange vertex, entry L,L in Jacobian
     jacobianVertex = 0.0;
@@ -450,10 +470,10 @@
                  indicesL.size(), &indicesL[0],
                  indicesL.size(), &indicesL[0],
                  &jacobianVertex[0],
-                 INSERT_VALUES);
+                 ADD_VALUES);
 
 #if defined(DETAILED_EVENT_LOGGING)
-    PetscLogFlops(numVertices*(spaceDim*spaceDim*2));
+    PetscLogFlops(spaceDim*spaceDim*2);
     _logger->eventBegin(updateEvent);
 #endif
 
@@ -465,17 +485,16 @@
 #endif
 
   _needNewJacobian = false;
-} // integrateJacobianAssembled
+} // integrateJacobian
 
 // ----------------------------------------------------------------------
-// Compute Jacobian matrix (A) associated with operator that do not
-// require assembly across cells, vertices, or processors.
+// Compute Jacobian matrix (A) associated with operator.
 void
-pylith::faults::FaultCohesiveLagrange::integrateJacobianAssembled(
+pylith::faults::FaultCohesiveLagrange::integrateJacobian(
 	                  topology::Field<topology::Mesh>* jacobian,
 			  const double t,
 			  topology::SolutionFields* const fields)
-{ // integrateJacobianAssembled
+{ // integrateJacobian
   assert(0 != jacobian);
   assert(0 != fields);
   assert(0 != _fields);
@@ -500,6 +519,12 @@
   const ALE::Obj<RealSection>& jacobianSection = jacobian->section();
   assert(!jacobianSection.isNull());
 
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::order_type>& globalOrder =
+    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", jacobianSection);
+  assert(!globalOrder.isNull());
+
   _logger->eventEnd(setupEvent);
 #if !defined(DETAILED_EVENT_LOGGING)
   _logger->eventBegin(computeEvent);
@@ -509,6 +534,10 @@
   for (int iVertex=0; iVertex < numVertices; ++iVertex) {
     const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
 
+    // Compute contribution only if Lagrange constraint is local.
+    if (!globalOrder->isLocal(v_lagrange))
+      continue;
+
     assert(jacobianSection->getFiberDimension(v_lagrange) == spaceDim);
 
 #if defined(DETAILED_EVENT_LOGGING)
@@ -526,9 +555,629 @@
 #endif
 
   _needNewJacobian = false;
-} // integrateJacobianAssembled
+} // integrateJacobian
 
 // ----------------------------------------------------------------------
+// Integrate contributions to Jacobian matrix (A) associated with
+// operator.
+void
+pylith::faults::FaultCohesiveLagrange::calcPreconditioner(
+				   PetscMat* const precondMatrix,
+				   topology::Jacobian* const jacobian,
+				   topology::SolutionFields* const fields)
+{ // calcPreconditioner
+  assert(0 != precondMatrix);
+  assert(0 != jacobian);
+  assert(0 != fields);
+  assert(0 != _fields);
+  assert(0 != _logger);
+
+  /** We have J = [A C^T]
+   *              [C   0]
+   *
+   * We want to approximate -( C A^(-1) C^T)^(-1)
+   *
+   * Consider Lagrange vertex L that constrains the relative
+   * displacement between vertex N on the negative side of the fault
+   * and vertex P on the positive side of the fault.
+   *
+   * If we approximate A(-1) by 1/diag(A), then we can write 
+   * C A^(-1) C^T for a 2-D case as
+   *
+   * [-R00 -R01  R00 R01][Ai_nx 0      0     0    ][-R00 -R10]
+   * [-R10 -R11  R10 R11][      Ai_ny  0     0    ][-R01 -R11]
+   *                     [      0      Ai_px 0    ][ R00  R10]
+   *                     [                   Ai_py][ R01  R11]
+   *
+   * where
+   *
+   * Ai_nx is the inverse of the diag(A) for DOF x of vertex N
+   * Ai_ny is the inverse of the diag(A) for DOF y of vertex N
+   * Ai_px is the inverse of the diag(A) for DOF x of vertex P
+   * Ai_py is the inverse of the diag(A) for DOF y of vertex P
+   *
+   * If Ai_nx == Ai_ny and Ai_px == Ai_py, then the result is
+   * diagonal. Otherwise, the off-diagonal terms will be nonzero,
+   * but we expect them to be small. Since we already approximate
+   * the inverse of A by the inverse of the diagonal, we drop the
+   * off-diagonal terms of C A^(-1) C^T:
+   *
+   * Term for DOF x of vertex L is: 
+   * -1.0 / (R00^2 (Ai_nx + Ai_px) + R01^2 (Ai_ny + Ai_py))
+   *
+   * Term for DOF y of vertex L is: 
+   * -1.0 / (R10^2 (Ai_nx + Ai_px) + R11^2 (Ai_ny + Ai_py))
+   *
+   * Translate DOF for global vertex L into DOF in split field for
+   * preconditioner.
+   */
+
+#if 1 // DIAGONAL PRECONDITIONER
+  const int setupEvent = _logger->eventId("FaPr setup");
+  const int computeEvent = _logger->eventId("FaPr compute");
+  const int restrictEvent = _logger->eventId("FaPr restrict");
+  const int updateEvent = _logger->eventId("FaPr update");
+
+  _logger->eventBegin(setupEvent);
+
+  // Get cell information and setup storage for cell data
+  const int spaceDim = _quadrature->spaceDim();
+  const int orientationSize = spaceDim * spaceDim;
+
+  // Allocate vectors for vertex values
+  double_array orientationVertex(orientationSize);
+  double_array jacobianVertexP(spaceDim*spaceDim);
+  double_array jacobianVertexN(spaceDim*spaceDim);
+  double_array jacobianInvVertexP(spaceDim);
+  double_array jacobianInvVertexN(spaceDim);
+  double_array precondVertexL(spaceDim);
+  int_array indicesN(spaceDim);
+  int_array indicesP(spaceDim);
+  int_array indicesRel(spaceDim);
+  for (int i=0; i < spaceDim; ++i) {indicesRel[i] = i;}
+
+  // Get sections
+  const ALE::Obj<RealSection>& solutionSection = fields->solution().section();
+  assert(!solutionSection.isNull());
+
+  const ALE::Obj<RealSection>& orientationSection =
+      _fields->get("orientation").section();
+  assert(!orientationSection.isNull());
+
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::order_type>& globalOrder =
+      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default",
+        solutionSection);
+  assert(!globalOrder.isNull());
+
+  // Get Jacobian matrix
+  const PetscMat jacobianMatrix = jacobian->matrix();
+  assert(0 != jacobianMatrix);
+
+  const ALE::Obj<SieveMesh::order_type>& lagrangeGlobalOrder =
+      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "faultDefault",
+        solutionSection, spaceDim);
+  assert(!lagrangeGlobalOrder.isNull());
+
+  _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  const int numVertices = _cohesiveVertices.size();
+  for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+    const int v_lagrange = _cohesiveVertices[iVertex].lagrange;
+    const int v_fault = _cohesiveVertices[iVertex].fault;
+    const int v_negative = _cohesiveVertices[iVertex].negative;
+    const int v_positive = _cohesiveVertices[iVertex].positive;
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(restrictEvent);
+#endif
+
+    // Get orientations at fault cell's vertices.
+    orientationSection->restrictPoint(v_fault, &orientationVertex[0],
+				      orientationVertex.size());
+
+    // Set global order indices
+    indicesN = indicesRel + globalOrder->getIndex(v_negative);
+    indicesP = indicesRel + globalOrder->getIndex(v_positive);
+
+    PetscErrorCode err = 0;
+
+    err = MatGetValues(jacobianMatrix,
+		       indicesN.size(), &indicesN[0],
+		       indicesN.size(), &indicesN[0],
+		       &jacobianVertexN[0]); CHECK_PETSC_ERROR(err);
+    err = MatGetValues(jacobianMatrix,
+		       indicesP.size(), &indicesP[0],
+		       indicesP.size(), &indicesP[0],
+		       &jacobianVertexP[0]); CHECK_PETSC_ERROR(err);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(restrictEvent);
+    _logger->eventBegin(computeEvent);
+#endif
+
+    // Compute inverse of Jacobian diagonals
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      jacobianInvVertexN[iDim] = 1.0/jacobianVertexN[iDim*spaceDim+iDim];
+      jacobianInvVertexP[iDim] = 1.0/jacobianVertexP[iDim*spaceDim+iDim];
+    } // for
+
+    // Compute -[C] [Adiag]^(-1) [C]^T
+    //   C_{ij}          = orientationVertex[i*spaceDim+j]
+    //   C^T_{ij}        = orientationVertex[j*spaceDim+i]
+    //   Adiag^{-1}_{ii} = jacobianInvVertexN[i] + jacobianInvVertexP[i] (BRAD: Are you sure its not a minus sign here?)
+    //  \sum_{j} C_{ij} Adiag^{-1}_{jj} C^T_{ji}
+    precondVertexL = 0.0;
+    for (int kDim=0; kDim < spaceDim; ++kDim) {
+      double value = 0.0;
+      for (int iDim=0; iDim < spaceDim; ++iDim)
+	value -= 
+          orientationVertex[kDim*spaceDim+iDim] * 
+          orientationVertex[kDim*spaceDim+iDim] * 
+          (jacobianInvVertexN[iDim] + jacobianInvVertexP[iDim]);
+      if (fabs(value) > 1.0e-8)
+	precondVertexL[kDim] = 1.0 / value;
+    } // for
+    
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(computeEvent);
+    _logger->eventBegin(updateEvent);
+#endif
+
+    for (int iDim=0; iDim < spaceDim; ++iDim) {
+      std::cout << "Vertex " << v_lagrange << " J^{-1}_{nn}["<<iDim<<"] " << jacobianInvVertexN[iDim] << " J^{-1}_{pp}["<<iDim<<"] " << jacobianInvVertexP[iDim] << " M["<<iDim<<"] " << precondVertexL[iDim] << std::endl;
+    }
+
+    // Set global preconditioner index associated with Lagrange constraint vertex.
+    const int indexLprecond = lagrangeGlobalOrder->getIndex(v_lagrange);
+    
+    // Set diagonal entries in preconditioned matrix.
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      MatSetValue(*precondMatrix,
+		  indexLprecond + iDim,
+		  indexLprecond + iDim,
+		  precondVertexL[iDim],
+		  INSERT_VALUES);
+    
+#if defined(DETAILED_EVENT_LOGGING)
+    PetscLogFlops(spaceDim*spaceDim*4);
+    _logger->eventEnd(updateEvent);
+#endif
+
+  } // for
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventEnd(computeEvent);
+  PetscLogFlops(numVertices*(spaceDim*spaceDim*4));
+#endif
+
+#else // FULL PRECONDITIONER
+
+  // Compute -( [C] [A]^(-1) [C]^T )^-1 for cell.
+  //
+  // numBasis = number of corners in fault cell
+  // spaceDim = spatial dimension
+  //
+  // For the cell, [A] is 2*numBasis*spaceDim x 2*numBasis*spaceDim,
+  // [C] is numBasis*spaceDim x 2*numBasis*spaceDim
+  //
+  // Decompose [A] into [An] and [Ap], where [An] contains the terms
+  // for vertices on the negative side of the fault and [Ap] contains
+  // the terms for vertices on the positive side of the fault.
+  //
+  // [An] and [Ap] are numBasis*spaceDim x numBasis*spaceDim
+  // 
+  // Let [CAC] = [C] [A]^(-1) [C]^T.
+  //
+  // CAiC_kl = Cij Ai_jk C_lk
+  //
+  // Cij: iLagrange, iDim, jBasis, jDim
+  // Ai_jk: jBasis, jDim, kBasis, kDim
+  // C_lk: lLagrange, lDim, kBasis, kDim
+  
+
+  const int setupEvent = _logger->eventId("FaPr setup");
+  const int computeEvent = _logger->eventId("FaPr compute");
+  const int restrictEvent = _logger->eventId("FaPr restrict");
+  const int updateEvent = _logger->eventId("FaPr update");
+
+  _logger->eventBegin(setupEvent);
+
+  // Get cell information and setup storage for cell data
+  const int spaceDim = _quadrature->spaceDim();
+  const int numBasis = _quadrature->numBasis();
+  const int orientationSize = spaceDim * spaceDim;
+  const int nrowsF = numBasis*spaceDim; // number of rows/cols in fault matrix
+
+  // Size of fault preconditioner matrix for cell
+  const int matrixSizeF = nrowsF * nrowsF;
+  PetscBLASInt workSize = 6*nrowsF;
+
+  // Allocate vectors for vertex values
+  double_array preconditionerCell(matrixSizeF);
+  double_array preconditionerInvCell(matrixSizeF);
+  int_array indicesN(nrowsF);
+  int_array indicesP(nrowsF);
+  int_array indicesLagrange(nrowsF);
+  double_array jacobianCellP(matrixSizeF);
+  double_array jacobianCellN(matrixSizeF);
+  double_array jacobianInvCellP(matrixSizeF);
+  double_array jacobianInvCellN(matrixSizeF);
+  double_array UN(matrixSizeF);
+  double_array UP(matrixSizeF);
+  double_array VNt(matrixSizeF);
+  double_array VPt(matrixSizeF);
+  double_array singularValuesN(nrowsF);
+  double_array singularValuesP(nrowsF);
+  double_array work(workSize);
+
+  // Get sections
+  const ALE::Obj<RealSection>& solutionSection = fields->solution().section();
+  assert(!solutionSection.isNull());
+
+  double_array orientationCell(numBasis*orientationSize);
+  const ALE::Obj<RealSection>& orientationSection =
+      _fields->get("orientation").section();
+  assert(!orientationSection.isNull());
+  RestrictVisitor orientationVisitor(*orientationSection,
+				     orientationCell.size(),
+				     &orientationCell[0]);
+
+  const int numConstraintVert = numBasis;
+  const int numCorners = 3 * numConstraintVert; // cohesive cell
+
+  // Get cohesive cells
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::order_type>& lagrangeGlobalOrder =
+      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "faultDefault",
+        solutionSection, spaceDim);
+  assert(!lagrangeGlobalOrder.isNull());
+  const ALE::Obj<SieveMesh::label_sequence>& cellsCohesive =
+    sieveMesh->getLabelStratum("material-id", id());
+  assert(!cellsCohesive.isNull());
+  const SieveMesh::label_sequence::iterator cellsCohesiveBegin =
+    cellsCohesive->begin();
+  const SieveMesh::label_sequence::iterator cellsCohesiveEnd =
+    cellsCohesive->end();
+
+  const PetscMat jacobianMatrix = jacobian->matrix();
+  assert(0 != jacobianMatrix);
+  const ALE::Obj<SieveMesh::order_type>& globalOrder =
+    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", 
+					    solutionSection);
+  assert(!globalOrder.isNull());
+  // We would need to request unique points here if we had an interpolated mesh
+  topology::Mesh::IndicesVisitor jacobianVisitor(*solutionSection, *globalOrder,
+			  (int) pow(sieveMesh->getSieve()->getMaxConeSize(),
+				    sieveMesh->depth())*spaceDim);
+
+
+
+  const ALE::Obj<SieveMesh::sieve_type>& sieve = sieveMesh->getSieve();
+  assert(!sieve.isNull());
+  ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type> ncV(*sieve,
+      (size_t) pow(sieve->getMaxConeSize(), std::max(0, sieveMesh->depth())));
+
+
+  const ALE::Obj<SieveSubMesh>& faultSieveMesh = _faultMesh->sieveMesh();
+  assert(!faultSieveMesh.isNull());
+  const ALE::Obj<SieveSubMesh::sieve_type>& faultSieve = faultSieveMesh->getSieve();
+  assert(!faultSieve.isNull());
+  ALE::ISieveVisitor::NConeRetriever<SieveSubMesh::sieve_type> fncV(*faultSieve,
+      (size_t) pow(faultSieve->getMaxConeSize(), std::max(0, faultSieveMesh->depth())));
+
+  _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  for (SieveMesh::label_sequence::iterator c_iter=cellsCohesiveBegin;
+       c_iter != cellsCohesiveEnd;
+       ++c_iter) {
+    // Get cone for cohesive cell
+    ncV.clear();
+    ALE::ISieveTraversal<SieveMesh::sieve_type>::orientedClosure(*sieve,
+								 *c_iter, ncV);
+    const int coneSize = ncV.getSize();
+    assert(coneSize == numCorners);
+    const Mesh::point_type *cohesiveCone = ncV.getPoints();
+    assert(0 != cohesiveCone);
+
+    // Get cone for corresponding fault cell
+    const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
+    fncV.clear();
+    ALE::ISieveTraversal<SieveMesh::sieve_type>::orientedClosure(*faultSieve,
+								 c_fault, fncV);
+    const int coneSizeFault = fncV.getSize();
+    assert(coneSizeFault == numBasis);
+    const Mesh::point_type *faultCone = fncV.getPoints();
+    assert(0 != faultCone);
+
+    jacobianCellP = 0.0;
+    jacobianCellN = 0.0;
+    preconditionerInvCell = 0.0;
+    preconditionerCell = 0.0;
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(restrictEvent);
+#endif
+
+    // Get indices
+    for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
+      // constraint vertex k
+      const int v_negative = cohesiveCone[0*numBasis+iBasis];
+      const int v_positive = cohesiveCone[1*numBasis+iBasis];
+      const int v_lagrange = cohesiveCone[2*numBasis+iBasis];
+      
+      for (int iDim=0, iB=iBasis*spaceDim; iDim < spaceDim; ++iDim) {
+	if (globalOrder->isLocal(v_negative))
+	  indicesN[iB+iDim] = globalOrder->getIndex(v_negative) + iDim;
+	else
+	  indicesN[iB+iDim] = -1;
+	if (globalOrder->isLocal(v_positive))
+	  indicesP[iB+iDim] = globalOrder->getIndex(v_positive) + iDim;
+	else
+	  indicesP[iB+iDim] = -1;
+	if (globalOrder->isLocal(v_lagrange))
+	  indicesLagrange[iB+iDim] = lagrangeGlobalOrder->getIndex(v_lagrange) + iDim;
+	else
+	  indicesLagrange[iB+iDim] = -1;
+
+	// Set matrix diagonal entries to 1.0 (used when vertex is not local).
+	jacobianCellN[iB+iDim] = 1.0;
+	jacobianCellP[iB+iDim] = 1.0;
+      } // for
+    } // for
+    
+    // Get values from Jacobian matrix.
+    PetscErrorCode err = 0;
+    err = MatGetValues(jacobianMatrix, 
+		       indicesN.size(), &indicesN[0],
+		       indicesN.size(), &indicesN[0],
+		       &jacobianCellN[0]);
+    CHECK_PETSC_ERROR_MSG(err, "Restrict from PETSc Mat failed.");
+    
+    err = MatGetValues(jacobianMatrix, 
+		       indicesP.size(), &indicesP[0],
+		       indicesP.size(), &indicesP[0],
+		       &jacobianCellP[0]);
+    CHECK_PETSC_ERROR_MSG(err, "Restrict from PETSc Mat failed.");
+   
+    // Get orientation at fault vertices.
+    orientationVisitor.clear();
+    faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
+
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(restrictEvent);
+    _logger->eventBegin(computeEvent);
+#endif
+
+    // Invert jacobianCellN and jacobianCellP, result goes in
+    // jacobianInvCellN and jacobianInvCellP if need separate place
+    // for result.
+    PetscBLASInt elemRows = nrowsF;
+    PetscScalar  one      = 1.0;
+    PetscBLASInt berr;
+
+#if 0
+    std::cout << "AN_cell " << *c_iter << std::endl;
+    for(int i = 0; i < nrowsF; ++i) {
+      for(int j = 0; j < nrowsF; ++j) {
+        std::cout << "  " << jacobianCellN[i*nrowsF+j];
+      }
+      std::cout << std::endl;
+    }
+#endif
+
+    // Transpose matrices so we can call LAPACK
+    for(int i = 0; i < nrowsF; ++i) {
+      for(int j = 0; j < i; ++j) {
+        PetscInt    k  = i*nrowsF+j;
+        PetscInt    kp = j*nrowsF+i;
+        PetscScalar tmp;
+        tmp               = jacobianCellN[k];
+        jacobianCellN[k]  = jacobianCellN[kp];
+        jacobianCellN[kp] = tmp;
+        tmp               = jacobianCellP[k];
+        jacobianCellP[k]  = jacobianCellP[kp];
+        jacobianCellP[kp] = tmp;
+      }
+    }
+    LAPACKgesvd_("A", "A", &elemRows, &elemRows, &jacobianCellN[0], &elemRows, &singularValuesN[0], &UN[0], &elemRows, &VNt[0], &elemRows, &work[0], &workSize, &berr);
+    CHECK_PETSC_ERROR_MSG(berr, "Inversion of negative-side element matrix failed.");
+    LAPACKgesvd_("A", "A", &elemRows, &elemRows, &jacobianCellP[0], &elemRows, &singularValuesP[0], &UP[0], &elemRows, &VPt[0], &elemRows, &work[0], &workSize, &berr);
+    CHECK_PETSC_ERROR_MSG(berr, "Inversion of positive-side element matrix failed.");
+
+#if 0
+    for(int i = 0; i < nrowsF; ++i) {
+      std::cout << "sigmaN["<<i<<"]: " << singularValuesN[i] << " sigmaP["<<i<<"]: " << singularValuesP[i] << std::endl;
+    }
+    std::cout << "UN_cell " << *c_iter << std::endl;
+    for(int i = 0; i < nrowsF; ++i) {
+      for(int j = 0; j < nrowsF; ++j) {
+        std::cout << "  " << UN[j*nrowsF+i];
+      }
+      std::cout << std::endl;
+    }
+    std::cout << "VNt_cell " << *c_iter << std::endl;
+    for(int i = 0; i < nrowsF; ++i) {
+      for(int j = 0; j < nrowsF; ++j) {
+        std::cout << "  " << VNt[j*nrowsF+i];
+      }
+      std::cout << std::endl;
+    }
+#endif
+
+    // Row scale Vt by the inverse of the singular values
+    for(int i = 0; i < nrowsF; ++i) {
+      const PetscReal invN = singularValuesN[i] > 1.0e-10 ? 1.0/singularValuesN[i] : 0.0;
+      const PetscReal invP = singularValuesP[i] > 1.0e-10 ? 1.0/singularValuesP[i] : 0.0;
+
+      for(int j = 0; j < nrowsF; ++j) {
+        VNt[j*nrowsF+i] *= invN;
+        VPt[j*nrowsF+i] *= invP;
+      }
+    }
+    BLASgemm_("N", "N", &elemRows, &elemRows, &elemRows, &one, &UN[0], &elemRows, &VNt[0], &elemRows, &one, &jacobianInvCellN[0], &elemRows);
+    BLASgemm_("N", "N", &elemRows, &elemRows, &elemRows, &one, &UP[0], &elemRows, &VPt[0], &elemRows, &one, &jacobianInvCellP[0], &elemRows);
+
+    // Transpose matrices from LAPACK
+    for(int i = 0; i < nrowsF; ++i) {
+      for(int j = 0; j < i; ++j) {
+        PetscInt    k  = i*nrowsF+j;
+        PetscInt    kp = j*nrowsF+i;
+        PetscScalar tmp;
+        tmp                  = jacobianInvCellN[k];
+        jacobianInvCellN[k]  = jacobianInvCellN[kp];
+        jacobianInvCellN[kp] = tmp;
+        tmp                  = jacobianInvCellP[k];
+        jacobianInvCellP[k]  = jacobianInvCellP[kp];
+        jacobianInvCellP[kp] = tmp;
+      }
+    }
+
+    // Combine Jacbian inverse terms with result in jacobianInvCellN
+    jacobianInvCellN += jacobianInvCellP;
+
+    for (int iLagrange=0; iLagrange < numBasis; ++iLagrange) {
+      // Exploit structure of C in matrix multiplication.
+      // C_ij Ai_jk C_lk - Structure of C means j == i;
+      const int jBasis = iLagrange;
+      
+      for (int lLagrange=0; lLagrange < numBasis; ++lLagrange) {
+	// Exploit structure of C in matrix multiplication.
+	// -C_ij Ai_jk C_lk - Structure of C means k == l;
+	const int kBasis = lLagrange;
+
+	for (int iDim=0; iDim < spaceDim; ++iDim) {
+	  const int iL = iLagrange*spaceDim + iDim;
+
+	  for (int lDim=0; lDim < spaceDim; ++lDim) {
+	    const int lL = lLagrange*spaceDim + lDim;
+
+	    for (int jDim=0; jDim < spaceDim; ++jDim) {
+	      const int jB = jBasis*spaceDim + jDim;
+
+	      for (int kDim=0; kDim < spaceDim; ++kDim) {
+		const int kB = kBasis*spaceDim + kDim;
+
+		preconditionerInvCell[iL*nrowsF+lL] -= 
+		  orientationCell[iLagrange*orientationSize+iDim*spaceDim+jDim] *
+		  jacobianInvCellN[jB*nrowsF+kB] *
+		  orientationCell[lLagrange*orientationSize+kDim*spaceDim+lDim];
+
+	      } // for
+	    } // for
+	  } // for
+	} // for
+      } // for
+    } // for
+
+#if 1
+    std::cout << "1/P_cell " << *c_iter << std::endl;
+    for(int i = 0; i < nrowsF; ++i) {
+      for(int j = 0; j < nrowsF; ++j) {
+        std::cout << "  " << preconditionerInvCell[i*nrowsF+j];
+      }
+      std::cout << std::endl;
+    }
+#endif
+
+    // Invert (C Ai C^T)
+
+    // Transpose matrices so we can call LAPACK
+    for(int i = 0; i < nrowsF; ++i) {
+      for(int j = 0; j < i; ++j) {
+        PetscInt    k  = i*nrowsF+j;
+        PetscInt    kp = j*nrowsF+i;
+        PetscScalar tmp;
+        tmp               = preconditionerInvCell[k];
+        preconditionerInvCell[k]  = preconditionerInvCell[kp];
+        preconditionerInvCell[kp] = tmp;
+      }
+    }
+    LAPACKgesvd_("A", "A", &elemRows, &elemRows, &preconditionerInvCell[0], &elemRows, &singularValuesN[0], &UN[0], &elemRows, &VNt[0], &elemRows, &work[0], &workSize, &berr);
+    CHECK_PETSC_ERROR_MSG(berr, "Inversion of preconditioner element matrix failed.");
+
+#if 1
+    for(int i = 0; i < nrowsF; ++i) {
+      std::cout << "sigmaN["<<i<<"]: " << singularValuesN[i] << " sigmaP["<<i<<"]: " << singularValuesP[i] << std::endl;
+    }
+    std::cout << "UN_cell " << *c_iter << std::endl;
+    for(int i = 0; i < nrowsF; ++i) {
+      for(int j = 0; j < nrowsF; ++j) {
+        std::cout << "  " << UN[j*nrowsF+i];
+      }
+      std::cout << std::endl;
+    }
+    std::cout << "VNt_cell " << *c_iter << std::endl;
+    for(int i = 0; i < nrowsF; ++i) {
+      for(int j = 0; j < nrowsF; ++j) {
+        std::cout << "  " << VNt[j*nrowsF+i];
+      }
+      std::cout << std::endl;
+    }
+#endif
+
+    // Row scale Vt by the inverse of the singular values
+    for(int i = 0; i < nrowsF; ++i) {
+      const PetscReal invN = singularValuesN[i] > 1.0e-10 ? 1.0/singularValuesN[i] : 0.0;
+      const PetscReal invP = singularValuesP[i] > 1.0e-10 ? 1.0/singularValuesP[i] : 0.0;
+
+      for(int j = 0; j < nrowsF; ++j) {
+        VNt[j*nrowsF+i] *= invN;
+        VPt[j*nrowsF+i] *= invP;
+      }
+    }
+    BLASgemm_("N", "N", &elemRows, &elemRows, &elemRows, &one, &UN[0], &elemRows, &VNt[0], &elemRows, &one, &preconditionerCell[0], &elemRows);
+
+    // Transpose matrices from LAPACK
+    for(int i = 0; i < nrowsF; ++i) {
+      for(int j = 0; j < i; ++j) {
+        PetscInt    k  = i*nrowsF+j;
+        PetscInt    kp = j*nrowsF+i;
+        PetscScalar tmp;
+        tmp                  = preconditionerCell[k];
+        preconditionerCell[k]  = preconditionerCell[kp];
+        preconditionerCell[kp] = tmp;
+      }
+    }
+
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(computeEvent);
+    _logger->eventBegin(updateEvent);
+#endif
+
+    err = MatSetValues(*precondMatrix,
+                 indicesLagrange.size(), &indicesLagrange[0],
+                 indicesLagrange.size(), &indicesLagrange[0],
+                 &preconditionerCell[0],
+                 ADD_VALUES);
+    CHECK_PETSC_ERROR_MSG(err, "Setting values in fault preconditioner failed.");
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(updateEvent);
+#endif
+
+  } // for
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventEnd(computeEvent);
+#endif
+
+#endif
+
+} // calcPreconditioner
+
+// ----------------------------------------------------------------------
 // Adjust solution from solver with lumped Jacobian to match Lagrange
 // multiplier constraints.
 void
@@ -590,17 +1239,30 @@
   double_array residualVertexP(spaceDim);
   const ALE::Obj<RealSection>& residualSection =
       fields->get("residual").section();
+  assert(!residualSection.isNull());
 
   double_array dispTVertexN(spaceDim);
   double_array dispTVertexP(spaceDim);
   const ALE::Obj<RealSection>& dispTSection = fields->get("disp(t)").section();
+  assert(!dispTSection.isNull());
 
   double_array dispTIncrVertexN(spaceDim);
   double_array dispTIncrVertexP(spaceDim);
-  double_array lagrangeIncrVertex(spaceDim);
+  double_array lagrangeTIncrVertex(spaceDim);
   const ALE::Obj<RealSection>& dispTIncrSection = fields->get(
     "dispIncr(t->t+dt)").section();
+  assert(!dispTIncrSection.isNull());
 
+  const ALE::Obj<RealSection>& dispTIncrAdjSection = fields->get(
+    "dispIncr adjust").section();
+  assert(!dispTIncrAdjSection.isNull());
+
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const ALE::Obj<SieveMesh::order_type>& globalOrder =
+    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", jacobianSection);
+  assert(!globalOrder.isNull());
+
   adjustSolnLumped_fn_type adjustSolnLumpedFn;
   switch (spaceDim) { // switch
   case 1:
@@ -634,6 +1296,10 @@
     const int v_negative = _cohesiveVertices[iVertex].negative;
     const int v_positive = _cohesiveVertices[iVertex].positive;
 
+    // Compute contribution only if Lagrange constraint is local.
+    if (!globalOrder->isLocal(v_lagrange))
+      continue;
+
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventBegin(restrictEvent);
 #endif
@@ -669,7 +1335,7 @@
 #endif
 
     CALL_MEMBER_FN(*this, 
-		   adjustSolnLumpedFn)(&lagrangeIncrVertex, 
+		   adjustSolnLumpedFn)(&lagrangeTIncrVertex, 
 				       &dispTIncrVertexN, &dispTIncrVertexP,
 				       slipVertex, orientationVertex, 
 				       dispTVertexN, dispTVertexP,
@@ -682,20 +1348,20 @@
 #endif
 
     // Adjust displacements to account for Lagrange multiplier values
-    // (assumed to be zero in perliminary solve).
+    // (assumed to be zero in preliminary solve).
     assert(dispTIncrVertexN.size() == 
-	   dispTIncrSection->getFiberDimension(v_negative));
-    dispTIncrSection->updateAddPoint(v_negative, &dispTIncrVertexN[0]);
+	   dispTIncrAdjSection->getFiberDimension(v_negative));
+    dispTIncrAdjSection->updateAddPoint(v_negative, &dispTIncrVertexN[0]);
 
     assert(dispTIncrVertexP.size() == 
-	   dispTIncrSection->getFiberDimension(v_positive));
-    dispTIncrSection->updateAddPoint(v_positive, &dispTIncrVertexP[0]);
+	   dispTIncrAdjSection->getFiberDimension(v_positive));
+    dispTIncrAdjSection->updateAddPoint(v_positive, &dispTIncrVertexP[0]);
 
     // Set Lagrange multiplier value. Value from preliminary solve is
     // bogus due to artificial diagonal entry of 1.0.
-    assert(lagrangeIncrVertex.size() == 
+    assert(lagrangeTIncrVertex.size() == 
 	   dispTIncrSection->getFiberDimension(v_lagrange));
-    dispTIncrSection->updatePoint(v_lagrange, &lagrangeIncrVertex[0]);
+    dispTIncrSection->updatePoint(v_lagrange, &lagrangeTIncrVertex[0]);
 
 #if defined(DETAILED_EVENT_LOGGING)
     _logger->eventEnd(updateEvent);
@@ -835,7 +1501,6 @@
 
   const ALE::Obj<SieveMesh::sieve_type>& sieve = mesh.sieveMesh()->getSieve();
   assert(!sieve.isNull());
-  typedef ALE::SieveAlg<SieveMesh> SieveAlg;
 
   ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type> ncV(*sieve,
       (size_t) pow(sieve->getMaxConeSize(), std::max(0, sieveMesh->depth())));
@@ -912,6 +1577,12 @@
   _logger->registerEvent("FaIJ compute");
   _logger->registerEvent("FaIJ restrict");
   _logger->registerEvent("FaIJ update");
+
+  _logger->registerEvent("FaPr setup");
+  _logger->registerEvent("FaPr geometry");
+  _logger->registerEvent("FaPr compute");
+  _logger->registerEvent("FaPr restrict");
+  _logger->registerEvent("FaPr update");
 } // initializeLogger
 
 // ----------------------------------------------------------------------
@@ -991,7 +1662,6 @@
 
   const ALE::Obj<SieveSubMesh::sieve_type>& sieve = faultSieveMesh->getSieve();
   assert(!sieve.isNull());
-  typedef ALE::SieveAlg<SieveSubMesh> SieveAlg;
 
   ALE::ISieveVisitor::NConeRetriever<SieveMesh::sieve_type>
       ncV(*sieve, (size_t) pow(sieve->getMaxConeSize(), std::max(0,
@@ -1130,7 +1800,6 @@
 
   // Allocate area field.
   _fields->add("area", "area");
-
   topology::Field<topology::SubMesh>& area = _fields->get("area");
   const topology::Field<topology::SubMesh>& slip = _fields->get("slip");
   area.newSection(slip, 1);
@@ -1314,7 +1983,7 @@
 // Adjust solution in lumped formulation to match slip for 1-D.
 void
 pylith::faults::FaultCohesiveLagrange::_adjustSolnLumped1D(
-					  double_array* lagrangeIncr,
+					  double_array* lagrangeTIncr,
 					  double_array* dispTIncrN,
 					  double_array* dispTIncrP,
 					  const double_array& slip,
@@ -1326,7 +1995,7 @@
 					  const double_array& jacobianN,
 					  const double_array& jacobianP)
 { // _adjustSoln1D
-  assert(0 != lagrangeIncr);
+  assert(0 != lagrangeTIncr);
   assert(0 != dispTIncrN);
   assert(0 != dispTIncrP);
 
@@ -1352,7 +2021,7 @@
   (*dispTIncrP)[0] = -1.0 / jacobianP[0] * dlp;
   
   // Update Lagrange multiplier.
-  (*lagrangeIncr)[0] = dlp;
+  (*lagrangeTIncr)[0] = dlp;
 
   PetscLogFlops(17);
 } // _adjustSoln1D
@@ -1361,7 +2030,7 @@
 // Adjust solution in lumped formulation to match slip for 2-D.
 void
 pylith::faults::FaultCohesiveLagrange::_adjustSolnLumped2D(
-					  double_array* lagrangeIncr,
+					  double_array* lagrangeTIncr,
 					  double_array* dispTIncrN,
 					  double_array* dispTIncrP,
 					  const double_array& slip,
@@ -1373,7 +2042,7 @@
 					  const double_array& jacobianN,
 					  const double_array& jacobianP)
 { // _adjustSoln2D
-  assert(0 != lagrangeIncr);
+  assert(0 != lagrangeTIncr);
   assert(0 != dispTIncrN);
   assert(0 != dispTIncrP);
 
@@ -1423,8 +2092,8 @@
   (*dispTIncrP)[1] = -dly / jacobianP[0];
   
   // Update Lagrange multiplier.
-  (*lagrangeIncr)[0] = dlp;
-  (*lagrangeIncr)[1] = dlq;
+  (*lagrangeTIncr)[0] = dlp;
+  (*lagrangeTIncr)[1] = dlq;
 
     PetscLogFlops(41);
 } // _adjustSoln2D
@@ -1433,7 +2102,7 @@
 // Adjust solution in lumped formulation to match slip for 3-D.
 void
 pylith::faults::FaultCohesiveLagrange::_adjustSolnLumped3D(
-					  double_array* lagrangeIncr,
+					  double_array* lagrangeTIncr,
 					  double_array* dispTIncrN,
 					  double_array* dispTIncrP,
 					  const double_array& slip,
@@ -1445,7 +2114,7 @@
 					  const double_array& jacobianN,
 					  const double_array& jacobianP)
 { // _adjustSoln3D
-  assert(0 != lagrangeIncr);
+  assert(0 != lagrangeTIncr);
   assert(0 != dispTIncrN);
   assert(0 != dispTIncrP);
 
@@ -1513,9 +2182,9 @@
   (*dispTIncrP)[2] = -dlz / jacobianP[2];
 
   // Update Lagrange multiplier.
-  (*lagrangeIncr)[0] = dlp;
-  (*lagrangeIncr)[1] = dlq;
-  (*lagrangeIncr)[2] = dlr;
+  (*lagrangeTIncr)[0] = dlp;
+  (*lagrangeTIncr)[1] = dlq;
+  (*lagrangeTIncr)[2] = dlr;
 
   PetscLogFlops(72);
 } // _adjustSoln3D

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveLagrange.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveLagrange.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/faults/FaultCohesiveLagrange.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -117,43 +117,57 @@
   void splitField(topology::Field<topology::Mesh>* field);
 
   /** Integrate contributions to residual term (r) for operator that
-   * do not require assembly across cells, vertices, or processors.
+   * require assembly processors.
    *
    * @param residual Field containing values for residual
    * @param t Current time
    * @param fields Solution fields
    */
   virtual
-  void integrateResidualAssembled(const topology::Field<topology::Mesh>& residual,
+  void integrateResidual(const topology::Field<topology::Mesh>& residual,
 				  const double t,
 				  topology::SolutionFields* const fields);
 
   /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator that do not require assembly across cells, vertices, or
-   * processors.
+   * operator that require assembly across processors.
    *
    * @param jacobian Sparse matrix
    * @param t Current time
    * @param fields Solution fields
    */
   virtual
-  void integrateJacobianAssembled(topology::Jacobian* jacobian,
+  void integrateJacobian(topology::Jacobian* jacobian,
 				  const double t,
 				  topology::SolutionFields* const fields);
 
   /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator that do not require assembly across cells, vertices, or
-   * processors.
+   * operator that require assembly processors.
    *
    * @param jacobian Diagonal Jacobian matrix as a field.
    * @param t Current time
    * @param fields Solution fields
    */
   virtual
-  void integrateJacobianAssembled(topology::Field<topology::Mesh>* jacobian,
+  void integrateJacobian(topology::Field<topology::Mesh>* jacobian,
 				  const double t,
 				  topology::SolutionFields* const fields);
 
+  /** Compute custom fault precoditioner using Schur complement.
+   *
+   * We have J = [A C^T]
+   *             [C   0]
+   *
+   * We approximate C A^(-1) C^T.
+   *
+   * @param pc PETSc preconditioner structure.
+   * @param jacobian Sparse matrix for Jacobian of system.
+   * @param fields Solution fields
+   */
+  virtual
+  void calcPreconditioner(PetscMat* const precondMatrix,
+			  topology::Jacobian* const jacobian,
+			  topology::SolutionFields* const fields);
+
   /** Adjust solution from solver with lumped Jacobian to match Lagrange
    *  multiplier constraints.
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Constraint.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Constraint.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Constraint.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -53,6 +53,21 @@
    */
   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.
+   */
+  virtual
+  int numDimConstrained(void) const = 0;
+
   /** Set number of degrees of freedom that are constrained at points in field.
    *
    * @param field Solution field
@@ -67,14 +82,6 @@
   virtual
   void setConstraints(const topology::Field<topology::Mesh>& field) = 0;
 
-  /** 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);
-
   /** Set values in field.
    *
    * @param t Current time

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicit.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicit.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicit.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -319,6 +319,7 @@
     // Compute B(transpose) * sigma, first computing strains
     calcTotalStrainFn(&strainCell, basisDeriv, dispCell, 
 		      numBasis, numQuadPts);
+
     const double_array& stressCell = _material->calcStress(strainCell, true);
 
 #if defined(DETAILED_EVENT_LOGGING)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTet4.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTet4.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTet4.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -249,7 +249,8 @@
       quadPtsGlobal = 0.0;
       for (int iBasis=0; iBasis < numBasis; ++iBasis)
         for (int iDim=0; iDim < spaceDim; ++iDim)
-          quadPtsGlobal[iDim] += 0.25 * coordinatesCell[iBasis*spaceDim+iDim];
+          quadPtsGlobal[iDim] += 
+	    coordinatesCell[iBasis*spaceDim+iDim] / numBasis;
       _normalizer->dimensionalize(&quadPtsGlobal[0], quadPtsGlobal.size(),
           lengthScale);
 
@@ -545,7 +546,8 @@
       quadPtsGlobal = 0.0;
       for (int iBasis=0; iBasis < numBasis; ++iBasis)
         for (int iDim=0; iDim < spaceDim; ++iDim)
-          quadPtsGlobal[iDim] += 0.25 * coordinatesCell[iBasis*spaceDim+iDim];
+          quadPtsGlobal[iDim] += 
+	    coordinatesCell[iBasis*spaceDim+iDim] / numBasis;
       _normalizer->dimensionalize(&quadPtsGlobal[0], quadPtsGlobal.size(),
           lengthScale);
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTet4.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTet4.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTet4.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -143,7 +143,7 @@
    */
   double _volume(const double_array& coordinatesCell) const;
 
-  /** Compute volume of tetrahedral cell.
+  /** Compute derivatives of basis functions of tetrahedral cell.
    *
    * @param coordinatesCell Coordinates of vertices of cell.
    * @returns Derivatives of basis functions.

Copied: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTri3.cc (from rev 16839, short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicitTri3.cc)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTri3.cc	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTri3.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,915 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#include <portinfo>
+
+#include "ElasticityExplicitTri3.hh" // implementation of class methods
+
+#include "Quadrature.hh" // USES Quadrature
+
+#include "pylith/materials/ElasticMaterial.hh" // USES ElasticMaterial
+#include "pylith/topology/Field.hh" // USES Field
+#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+#include "pylith/topology/Jacobian.hh" // USES Jacobian
+
+#include "pylith/utils/array.hh" // USES double_array
+#include "pylith/utils/macrodefs.h" // USES CALL_MEMBER_FN
+#include "pylith/utils/lapack.h" // USES LAPACKdgesvd
+
+#include "petscmat.h" // USES PetscMat
+#include "spatialdata/geocoords/CoordSys.hh" // USES CoordSys
+#include "spatialdata/units/Nondimensional.hh" // USES Nondimendional
+
+#include "pylith/utils/petscerror.h" // USES CHECK_PETSC_ERROR
+#include <cassert> // USES assert()
+#include <stdexcept> // USES std::runtime_error
+
+//#define DETAILED_EVENT_LOGGING
+
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+typedef pylith::topology::Mesh::RestrictVisitor RestrictVisitor;
+typedef pylith::topology::Mesh::UpdateAddVisitor UpdateAddVisitor;
+
+// ----------------------------------------------------------------------
+const int pylith::feassemble::ElasticityExplicitTri3::_spaceDim = 2;
+const int pylith::feassemble::ElasticityExplicitTri3::_cellDim = 2;
+const int pylith::feassemble::ElasticityExplicitTri3::_tensorSize = 3;
+const int pylith::feassemble::ElasticityExplicitTri3::_numBasis = 3;
+const int pylith::feassemble::ElasticityExplicitTri3::_numQuadPts = 1;
+
+// ----------------------------------------------------------------------
+// Constructor
+pylith::feassemble::ElasticityExplicitTri3::ElasticityExplicitTri3(void) :
+  _dtm1(-1.0)
+{ // constructor
+  _basisDerivArray.resize(_numQuadPts*_numBasis*_spaceDim);
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor
+pylith::feassemble::ElasticityExplicitTri3::~ElasticityExplicitTri3(void)
+{ // destructor
+  deallocate();
+} // destructor
+  
+// ----------------------------------------------------------------------
+// Deallocate PETSc and local data structures.
+void
+pylith::feassemble::ElasticityExplicitTri3::deallocate(void)
+{ // deallocate
+  IntegratorElasticity::deallocate();
+} // deallocate
+  
+// ----------------------------------------------------------------------
+// Set time step for advancing from time t to time t+dt.
+void
+pylith::feassemble::ElasticityExplicitTri3::timeStep(const double dt)
+{ // timeStep
+  if (_dt != -1.0)
+    _dtm1 = _dt;
+  else
+    _dtm1 = dt;
+  _dt = dt;
+  assert(_dt == _dtm1); // For now, don't allow variable time step
+  if (0 != _material)
+    _material->timeStep(_dt);
+} // timeStep
+
+// ----------------------------------------------------------------------
+// Set flag for setting constraints for total field solution or
+// incremental field solution.
+void
+pylith::feassemble::ElasticityExplicitTri3::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::ElasticityExplicitTri3::integrateResidual(
+			  const topology::Field<topology::Mesh>& residual,
+			  const double 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 double_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.
+  double_array strainCell(numQuadPts*tensorSize);
+  strainCell = 0.0;
+  double_array gravVec(spaceDim);
+  double_array quadPtsGlobal(numQuadPts*spaceDim);
+
+  // Get cell information
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const int materialId = _material->id();
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+  assert(!cells.isNull());
+  const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
+  const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
+
+  // Get sections
+  double_array accCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& accSection = 
+    fields->get("acceleration(t)").section();
+  assert(!accSection.isNull());
+  RestrictVisitor accVisitor(*accSection, accCell.size(), &accCell[0]);
+
+  double_array dispCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& dispSection = 
+    fields->get("disp(t)").section();
+  assert(!dispSection.isNull());
+  RestrictVisitor dispVisitor(*dispSection, dispCell.size(), &dispCell[0]);
+
+  const ALE::Obj<RealSection>& residualSection = residual.section();
+  UpdateAddVisitor residualVisitor(*residualSection, &_cellVector[0]);
+  
+  double_array coordinatesCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& coordinates = 
+    sieveMesh->getRealSection("coordinates");
+  assert(!coordinates.isNull());
+  RestrictVisitor coordsVisitor(*coordinates, 
+				coordinatesCell.size(), &coordinatesCell[0]);
+
+  assert(0 != _normalizer);
+  const double lengthScale = _normalizer->lengthScale();
+  const double gravityScale = 
+    _normalizer->pressureScale() / (_normalizer->lengthScale() *
+				    _normalizer->densityScale());
+
+  _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  // Loop over cells
+  for (SieveMesh::label_sequence::iterator c_iter=cellsBegin;
+       c_iter != cellsEnd;
+       ++c_iter) {
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(geometryEvent);
+#endif
+
+    // Compute geometry information for current cell
+    coordsVisitor.clear();
+    sieveMesh->restrictClosure(*c_iter, coordsVisitor);
+    const double area = _area(coordinatesCell);
+    assert(area > 0.0);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(geometryEvent);
+    _logger->eventBegin(stateVarsEvent);
+#endif
+
+    // Get state variables for cell.
+    _material->retrievePropsAndVars(*c_iter);
+
+    #if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(stateVarsEvent);
+    _logger->eventBegin(restrictEvent);
+#endif
+
+    // Reset element vector to zero
+    _resetCellVector();
+
+    // Restrict input fields to cell
+    accVisitor.clear();
+    sieveMesh->restrictClosure(*c_iter, accVisitor);
+    
+    dispVisitor.clear();
+    sieveMesh->restrictClosure(*c_iter, dispVisitor);
+    
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(restrictEvent);
+    _logger->eventBegin(computeEvent);
+#endif
+
+    const double_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
+      const int err = _gravityField->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 double 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 double 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 * accCell[jBasis*spaceDim+iDim];
+
+#if defined(DETAILED_EVENT_LOGGING)
+    PetscLogFlops(3 + numBasis*numBasis*spaceDim*2);
+    _logger->eventEnd(computeEvent);
+    _logger->eventBegin(stressEvent);
+#endif
+
+    // Compute B(transpose) * sigma, first computing strains
+    const double x0 = coordinatesCell[0];
+    const double y0 = coordinatesCell[1];
+
+    const double x1 = coordinatesCell[2];
+    const double y1 = coordinatesCell[3];
+
+    const double x2 = coordinatesCell[4];
+    const double y2 = coordinatesCell[5];
+
+    const double scaleB = 2.0 * area;
+    const double b0 = (y1 - y2) / scaleB;
+    const double c0 = (x2 - x1) / scaleB;
+
+    const double b1 = (y2 - y0) / scaleB;
+    const double c1 = (x0 - x2) / scaleB;
+
+    const double b2 = (y0 - y1) / scaleB;
+    const double c2 = (x1 - x0) / scaleB;
+
+    assert(strainCell.size() == 3);
+    strainCell[0] = b2*dispCell[4] + b1*dispCell[2] + b0*dispCell[0];
+    
+    strainCell[1] = c2*dispCell[5] + c1*dispCell[3] + c0*dispCell[1];
+
+    strainCell[2] = (b2*dispCell[5] + c2*dispCell[4] + b1*dispCell[3] + 
+		     c1*dispCell[2] + b0*dispCell[1] + c0*dispCell[0]) / 2.0;
+
+
+    const double_array& stressCell = _material->calcStress(strainCell, true);
+
+#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
+    residualVisitor.clear();
+    sieveMesh->updateClosure(*c_iter, residualVisitor);
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(updateEvent);
+#endif
+  } // for
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  PetscLogFlops(cells->size()*(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 double t,
+        topology::SolutionFields* const fields)
+{ // integrateResidualLumped
+  /// Member prototype for _elasticityResidualXD()
+  typedef void (pylith::feassemble::ElasticityExplicitTri3::*elasticityResidual_fn_type)
+    (const double_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
+  assert(_quadrature->numQuadPts() == _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.
+  double_array strainCell(numQuadPts*tensorSize);
+  strainCell = 0.0;
+  double_array gravVec(spaceDim);
+  double_array quadPtsGlobal(numQuadPts*spaceDim);
+
+  // Get cell information
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const int materialId = _material->id();
+  const ALE::Obj<SieveMesh::label_sequence>& cells =
+    sieveMesh->getLabelStratum("material-id", materialId);
+  assert(!cells.isNull());
+  const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
+  const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
+
+  const ALE::Obj<SieveMesh::sieve_type>& sieve = sieveMesh->getSieve();
+  assert(!sieve.isNull());
+
+  // Get sections
+  double_array accCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& accSection = 
+    fields->get("acceleration(t)").section();
+  assert(!accSection.isNull());
+  RestrictVisitor accVisitor(*accSection, accCell.size(), &accCell[0]);
+
+  double_array dispCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& dispSection = 
+    fields->get("disp(t)").section();
+  assert(!dispSection.isNull());
+  RestrictVisitor dispVisitor(*dispSection, dispCell.size(), &dispCell[0]);
+
+  const ALE::Obj<RealSection>& residualSection = residual.section();
+  UpdateAddVisitor residualVisitor(*residualSection, &_cellVector[0]);
+
+  double_array coordinatesCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& coordinates =
+    sieveMesh->getRealSection("coordinates");
+  assert(!coordinates.isNull());
+  RestrictVisitor coordsVisitor(*coordinates, 
+				coordinatesCell.size(), &coordinatesCell[0]);
+
+  assert(0 != _normalizer);
+  const double lengthScale = _normalizer->lengthScale();
+  const double gravityScale =
+    _normalizer->pressureScale() / (_normalizer->lengthScale() *
+            _normalizer->densityScale());
+
+  // Get parameters used in integration.
+  double_array valuesIJ(numBasis);
+
+  _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  // Loop over cells
+  for (SieveMesh::label_sequence::iterator c_iter=cellsBegin;
+       c_iter != cellsEnd;
+       ++c_iter) {
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(restrictEvent);
+#endif
+
+    // Restrict input fields to cell
+#if 1
+    coordsVisitor.clear();
+    sieveMesh->restrictClosure(*c_iter, coordsVisitor);
+
+    accVisitor.clear();
+    sieveMesh->restrictClosure(*c_iter, accVisitor);
+
+    dispVisitor.clear();
+    sieveMesh->restrictClosure(*c_iter, dispVisitor);
+#else
+    coordsVisitor.clear();
+    sieve->orientedConeOpt(*c_iter, coordsVisitor, numBasis, spaceDim);
+
+    accVisitor.clear();
+    sieve->orientedConeOpt(*c_iter, accVisitor, numBasis, spaceDim);
+
+    dispVisitor.clear();
+    sieve->orientedConeOpt(*c_iter, dispVisitor, numBasis, spaceDim);
+#endif
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(restrictEvent);
+    _logger->eventBegin(geometryEvent);
+#endif
+
+    // Compute geometry information for current cell
+    const double area = _area(coordinatesCell);
+    assert(area > 0.0);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(geometryEvent);
+    _logger->eventBegin(stateVarsEvent);
+#endif
+
+    // Get state variables for cell.
+    _material->retrievePropsAndVars(*c_iter);
+
+    // Get density at quadrature points for this cell
+    const double_array& density = _material->calcDensity();
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(stateVarsEvent);
+    _logger->eventBegin(computeEvent);
+#endif
+
+    // Reset element vector to zero
+    _resetCellVector();
+
+    // 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
+      const int err = _gravityField->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 double 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 double wtVertex = density[0] * area / 3.0;
+    _cellVector -= wtVertex * accCell;
+
+#if defined(DETAILED_EVENT_LOGGING)
+    PetscLogFlops(2 + numBasis*spaceDim*2);
+    _logger->eventEnd(computeEvent);
+    _logger->eventBegin(stressEvent);
+#endif
+
+    // Compute B(transpose) * sigma, first computing strains
+    const double x0 = coordinatesCell[0];
+    const double y0 = coordinatesCell[1];
+
+    const double x1 = coordinatesCell[2];
+    const double y1 = coordinatesCell[3];
+
+    const double x2 = coordinatesCell[4];
+    const double y2 = coordinatesCell[5];
+
+    const double scaleB = 2.0 * area;
+    const double b0 = (y1 - y2) / scaleB;
+    const double c0 = (x2 - x1) / scaleB;
+
+    const double b1 = (y2 - y0) / scaleB;
+    const double c1 = (x0 - x2) / scaleB;
+
+    const double b2 = (y0 - y1) / scaleB;
+    const double c2 = (x1 - x0) / scaleB;
+
+    assert(strainCell.size() == 3);
+    strainCell[0] = b2*dispCell[4] + b1*dispCell[2] + b0*dispCell[0];
+    
+    strainCell[1] = c2*dispCell[5] + c1*dispCell[3] + c0*dispCell[1];
+
+    strainCell[2] = (b2*dispCell[5] + c2*dispCell[4] + b1*dispCell[3] + 
+		     c1*dispCell[2] + b0*dispCell[1] + c0*dispCell[0]) / 2.0;
+
+    const double_array& stressCell = _material->calcStress(strainCell, true);
+
+#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
+    residualVisitor.clear();
+    sieveMesh->updateClosure(*c_iter, residualVisitor);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(updateEvent);
+#endif
+  } // for
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  PetscLogFlops(cells->size()*(2 + numBasis*spaceDim*2 + 34+30));
+  _logger->eventEnd(computeEvent);
+#endif
+} // integrateResidualLumped
+
+// ----------------------------------------------------------------------
+// Compute matrix associated with operator.
+void
+pylith::feassemble::ElasticityExplicitTri3::integrateJacobian(
+					topology::Jacobian* jacobian,
+					const double 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 double_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
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const int materialId = _material->id();
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+  assert(!cells.isNull());
+  const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
+  const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
+
+  // Get sections
+  double_array dispCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& dispSection = 
+    fields->get("disp(t)").section();
+  assert(!dispSection.isNull());
+
+  // Get sparse matrix
+  const PetscMat jacobianMat = jacobian->matrix();
+  assert(0 != jacobianMat);
+
+  // Get parameters used in integration.
+  const double dt = _dt;
+  const double dt2 = dt*dt;
+  assert(dt > 0);
+
+  const ALE::Obj<SieveMesh::order_type>& globalOrder = 
+    sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", dispSection);
+  assert(!globalOrder.isNull());
+  // We would need to request unique points here if we had an interpolated mesh
+  topology::Mesh::IndicesVisitor jacobianVisitor(*dispSection, *globalOrder,
+		  (int) pow(sieveMesh->getSieve()->getMaxConeSize(),
+			    sieveMesh->depth())*spaceDim);
+
+  double_array coordinatesCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& coordinates = 
+    sieveMesh->getRealSection("coordinates");
+  assert(!coordinates.isNull());
+  topology::Mesh::RestrictVisitor coordsVisitor(*coordinates, 
+						coordinatesCell.size(),
+						&coordinatesCell[0]);
+
+  _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+
+  // Loop over cells
+  for (SieveMesh::label_sequence::iterator c_iter=cellsBegin;
+       c_iter != cellsEnd;
+       ++c_iter) {
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(geometryEvent);
+#endif
+
+    // Compute geometry information for current cell
+    coordsVisitor.clear();
+    sieveMesh->restrictClosure(*c_iter, coordsVisitor);
+    const double area = _area(coordinatesCell);
+    assert(area > 0.0);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(geometryEvent);
+    _logger->eventBegin(stateVarsEvent);
+#endif
+
+    // Get state variables for cell.
+    _material->retrievePropsAndVars(*c_iter);
+
+#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 double_array& density = _material->calcDensity();
+    assert(density.size() == 1);
+
+    // Compute Jacobian for inertial terms
+    const double 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.
+    jacobianVisitor.clear();
+    PetscErrorCode err = updateOperator(jacobianMat, *sieveMesh->getSieve(),
+					jacobianVisitor, *c_iter,
+					&_cellMatrix[0], ADD_VALUES);
+    CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(updateEvent);
+#endif
+  } // for
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  PetscLogFlops(cells->size()*(3+numBasis*numBasis*spaceDim*1));
+  _logger->eventEnd(computeEvent);
+#endif
+
+  _needNewJacobian = false;
+  _material->resetNeedNewJacobian();
+} // integrateJacobian
+
+// ----------------------------------------------------------------------
+// Compute matrix associated with operator.
+void
+pylith::feassemble::ElasticityExplicitTri3::integrateJacobian(
+			    topology::Field<topology::Mesh>* jacobian,
+			    const double 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
+  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 numBasis = _numBasis;
+  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
+  const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
+  assert(!sieveMesh.isNull());
+  const int materialId = _material->id();
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->getLabelStratum("material-id", materialId);
+  assert(!cells.isNull());
+  const SieveMesh::label_sequence::iterator cellsBegin = cells->begin();
+  const SieveMesh::label_sequence::iterator cellsEnd = cells->end();
+
+  // Get parameters used in integration.
+  const double dt = _dt;
+  const double dt2 = dt*dt;
+  assert(dt > 0);
+
+  // Get sections
+  const ALE::Obj<RealSection>& jacobianSection = jacobian->section();
+  assert(!jacobianSection.isNull());
+  topology::Mesh::UpdateAddVisitor jacobianVisitor(*jacobianSection, 
+						   &_cellVector[0]);
+
+  double_array coordinatesCell(numBasis*spaceDim);
+  const ALE::Obj<RealSection>& coordinates = 
+    sieveMesh->getRealSection("coordinates");
+  assert(!coordinates.isNull());
+  topology::Mesh::RestrictVisitor coordsVisitor(*coordinates, 
+						coordinatesCell.size(),
+						&coordinatesCell[0]);
+
+  _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+  _logger->eventBegin(computeEvent);
+#endif
+  // Loop over cells
+  for (SieveMesh::label_sequence::iterator c_iter=cellsBegin;
+       c_iter != cellsEnd;
+       ++c_iter) {
+    // Compute geometry information for current cell
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventBegin(geometryEvent);
+#endif
+    coordsVisitor.clear();
+    sieveMesh->restrictClosure(*c_iter, coordsVisitor);
+    const double area = _area(coordinatesCell);
+    assert(area > 0.0);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(geometryEvent);
+    _logger->eventBegin(stateVarsEvent);
+#endif
+
+    // Get state variables for cell.
+    _material->retrievePropsAndVars(*c_iter);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(stateVarsEvent);
+    _logger->eventBegin(computeEvent);
+#endif
+
+    // Compute Jacobian for inertial terms
+    const double_array& density = _material->calcDensity();
+    _cellVector = density[0] * area / (3.0 * dt2);
+    
+#if defined(DETAILED_EVENT_LOGGING)
+    PetscLogFlops(3);
+    _logger->eventEnd(computeEvent);
+    _logger->eventBegin(updateEvent);
+#endif
+    
+    // Assemble cell contribution into lumped matrix.
+    jacobianVisitor.clear();
+    sieveMesh->updateClosure(*c_iter, jacobianVisitor);
+
+#if defined(DETAILED_EVENT_LOGGING)
+    _logger->eventEnd(updateEvent);
+#endif
+  } // for
+
+#if !defined(DETAILED_EVENT_LOGGING)
+  PetscLogFlops(cells->size()*3);
+  _logger->eventEnd(computeEvent);
+#endif
+
+  _needNewJacobian = false;
+  _material->resetNeedNewJacobian();
+} // integrateJacobian
+
+// ----------------------------------------------------------------------
+// Compute area of triangular cell.
+double
+pylith::feassemble::ElasticityExplicitTri3::_area(
+			     const double_array& coordinatesCell) const
+{ // __area
+  assert(6 == coordinatesCell.size());
+
+  const double x0 = coordinatesCell[0];
+  const double y0 = coordinatesCell[1];
+
+  const double x1 = coordinatesCell[2];
+  const double y1 = coordinatesCell[3];
+
+  const double x2 = coordinatesCell[4];
+  const double y2 = coordinatesCell[5];
+
+  const double area = 0.5*((x1-x0)*(y2-y0) - (x2-x0)*(y1-y0));
+  PetscLogFlops(8);
+
+  return area;  
+} // _area
+
+
+// End of file 

Copied: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTri3.hh (from rev 16839, short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicitTri3.hh)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTri3.hh	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/ElasticityExplicitTri3.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,180 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+/**
+ * @file libsrc/feassemble/ElasticityExplicitTri3.hh
+ *
+ * @brief Explicit time integration of dynamic elasticity equation
+ * using linear triangular finite-elements.
+ */
+
+#if !defined(pylith_feassemble_elasticityexplicittri3_hh)
+#define pylith_feassemble_elasticityexplicittri3_hh
+
+// Include directives ---------------------------------------------------
+#include "IntegratorElasticity.hh" // ISA IntegratorElasticity
+
+// ElasticityExplicitTri3 ---------------------------------------------------
+/**@brief Explicit time integration of the dynamic elasticity equation
+ * using linear triangular finite-elements.
+ *
+ * Note: This object operates on a single finite-element family, which
+ * is defined by the quadrature and a database of material property
+ * parameters.
+ *
+ * Computes contributions to terms A and r in
+ *
+ * A(t+dt) du(t) = b(t+dt, u(t), u(t-dt)) - A(t+dt) u(t),
+ *
+ * r(t+dt) = b(t+dt) - A(t+dt) (u(t) + du(t))
+ *
+ * where A(t) is a sparse matrix or vector, u(t+dt) is the field we
+ * want to compute at time t+dt, b is a vector that depends on the
+ * field at time t and t-dt, and u0 is zero at unknown DOF and set to
+ * the known values at the constrained DOF.
+ *
+ * Contributions from elasticity include the intertial and stiffness
+ * terms, so this object computes the following portions of A and r:
+ *
+ * A = 1/(dt*dt) [M]
+ *
+ * r = (1/(dt*dt) [M])(- {u(t+dt)} + 2/(dt*dt){u(t)} - {u(t-dt)}) - [K]{u(t)}
+ *
+ * Translational inertia.
+ *   - Residual action over cell
+ *     \f[
+ *       \int_{V^e} \rho N^p \sum_q N^q u_i^q \, dV
+ *     \f]
+ *   - Jacobian action over cell
+ *     \f[
+ *       \int_{V^e} (\rho N^q N^q)_i \, dV
+ *     \f]
+ *
+ * See governing equations section of user manual for more
+ * information.
+*/
+class pylith::feassemble::ElasticityExplicitTri3 : public IntegratorElasticity
+{ // ElasticityExplicitTri3
+  friend class TestElasticityExplicitTri3; // unit testing
+
+// PUBLIC MEMBERS ///////////////////////////////////////////////////////
+public :
+
+  /// Constructor
+  ElasticityExplicitTri3(void);
+
+  /// Destructor
+  ~ElasticityExplicitTri3(void);
+
+  /// Deallocate PETSc and local data structures.
+  void deallocate(void);
+  
+  /** Set time step for advancing from time t to time t+dt.
+   *
+   * @param dt Time step
+   */
+  void timeStep(const double dt);
+
+  /** 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
+   * @param t Current time
+   * @param fields Solution fields
+   */
+  void integrateResidual(const topology::Field<topology::Mesh>& residual,
+			 const double t,
+			 topology::SolutionFields* const fields);
+
+  /** Integrate contributions to residual term (r) for operator.
+   *
+   * @param residual Field containing values for residual
+   * @param t Current time
+   * @param fields Solution fields
+   */
+  void integrateResidualLumped(const topology::Field<topology::Mesh>& residual,
+       const double 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 double 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
+   */
+  void integrateJacobian(topology::Field<topology::Mesh>* jacobian,
+			 const double t,
+			 topology::SolutionFields* const fields);
+
+// PRIVATE METHODS //////////////////////////////////////////////////////
+private :
+
+  /** Compute area of triangular cell.
+   *
+   * @param coordinatesCell Coordinates of vertices of cell.
+   * @returns Area of cell.
+   */
+  double _area(const double_array& coordinatesCell) const;
+
+  /** Compute derivatives of basis functions of triangular cell.
+   *
+   * @param coordinatesCell Coordinates of vertices of cell.
+   * @returns Derivatives of basis functions.
+   */
+  const double_array& _basisDeriv(const double_array& coordinatesCell) const;
+
+// PRIVATE MEMBERS //////////////////////////////////////////////////////
+private :
+
+  double_array _basisDerivArray; ///< Array of basis derivatives
+
+  double _dtm1; ///< Time step for t-dt1 -> t
+
+  static const int _spaceDim;
+  static const int _cellDim;
+  static const int _tensorSize;
+  static const int _numBasis;
+  static const int _numQuadPts;
+
+// NOT IMPLEMENTED //////////////////////////////////////////////////////
+private :
+
+  /// Not implemented.
+  ElasticityExplicitTri3(const ElasticityExplicitTri3&);
+
+  /// Not implemented
+  const ElasticityExplicitTri3& operator=(const ElasticityExplicitTri3&);
+
+}; // ElasticityExplicitTri3
+
+#endif // pylith_feassemble_elasticityexplicittri3_hh
+
+
+// End of file 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryLine3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryLine3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryLine3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -138,7 +138,7 @@
   assert(0 != det);
   assert(0 != vertices);
   assert(0 != location);
-  assert(2 == dim);
+  assert(3 == dim);
   assert(spaceDim() == dim);
 
   const double x0 = vertices[0];

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryQuad2D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryQuad2D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryQuad2D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -194,16 +194,16 @@
     const double p1 = 0.5 * (1.0 + ptsRef[iR++]);
     assert(0 <= p0 && p0 <= 1.0);
     assert(0 <= p1 && p1 <= 1.0);
-    const double j0 = (f_1 + f_01 * p1) / 2.0; 
-    const double j1 = (f_3 + f_01 * p0) / 2.0; 
-    const double j2 = (g_1 + g_01 * p1) / 2.0;
-    const double j3 = (g_3 + g_01 * p0) / 2.0; 
+    const double j00 = (f_1 + f_01 * p1) / 2.0; 
+    const double j01 = (f_3 + f_01 * p0) / 2.0; 
+    const double j10 = (g_1 + g_01 * p1) / 2.0;
+    const double j11 = (g_3 + g_01 * p0) / 2.0; 
 
-    jacobian[iJ++] = j0;
-    jacobian[iJ++] = j1;
-    jacobian[iJ++] = j2;
-    jacobian[iJ++] = j3;
-    det[i] = j0*j3 - j1*j2;
+    jacobian[iJ++] = j00;
+    jacobian[iJ++] = j01;
+    jacobian[iJ++] = j10;
+    jacobian[iJ++] = j11;
+    det[i] = j00*j11 - j01*j10;
   } // for
 
   PetscLogFlops(10 + npts*19);

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTet3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTet3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTet3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -225,6 +225,9 @@
     jacobian[iJ++] = j3;
     jacobian[iJ++] = j4;
     jacobian[iJ++] = j5;
+    jacobian[iJ++] = j6;
+    jacobian[iJ++] = j7;
+    jacobian[iJ++] = j8;
     det[i] = jdet;
   } // for
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTri2D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTri2D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTri2D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -158,19 +158,17 @@
   const double y2 = vertices[5];
 
 
-  const double j1 = (x1 - x0) / 2.0;
-  const double j2 = (x2 - x0) / 2.0;
-  const double j3 = (y1 - y0) / 2.0;
-  const double j4 = (y2 - y0) / 2.0;
-  const double jdet = 
-    jacobian[0]*jacobian[3] - 
-    jacobian[1]*jacobian[2];
+  const double j00 = (x1 - x0) / 2.0;
+  const double j01 = (x2 - x0) / 2.0;
+  const double j10 = (y1 - y0) / 2.0;
+  const double j11 = (y2 - y0) / 2.0;
+  const double jdet = j00*j11 - j10*j01;
 
   for (int i=0, iJ=0; i < npts; ++i) {
-    jacobian[iJ++] = j1;
-    jacobian[iJ++] = j2;
-    jacobian[iJ++] = j3;
-    jacobian[iJ++] = j4;
+    jacobian[iJ++] = j00;
+    jacobian[iJ++] = j01;
+    jacobian[iJ++] = j10;
+    jacobian[iJ++] = j11;
     det[i] = jdet;
   } // for
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTri3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTri3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/GeometryTri3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -183,28 +183,28 @@
   const double y2 = vertices[7];
   const double z2 = vertices[8];
 
-  const double j0 = (x1 - x0) / 2.0;
-  const double j1 = (x2 - x0) / 2.0;
+  const double j00 = (x1 - x0) / 2.0;
+  const double j01 = (x2 - x0) / 2.0;
 
-  const double j2 = (y1 - y0) / 2.0;
-  const double j3 = (y2 - y0) / 2.0;
+  const double j10 = (y1 - y0) / 2.0;
+  const double j11 = (y2 - y0) / 2.0;
 
-  const double j4 = (z1 - z0) / 2.0;
-  const double j5 = (z2 - z0) / 2.0;
+  const double j20 = (z1 - z0) / 2.0;
+  const double j21 = (z2 - z0) / 2.0;
 
-  const double jj00 = j0*j0 + j2*j2 + j4*j4;
-  const double jj10 = j0*j1 + j2*j3 + j4*j5;
+  const double jj00 = j00*j00 + j10*j10 + j20*j20;
+  const double jj10 = j00*j01 + j10*j11 + j20*j21;
   const double jj01 = jj10;
-  const double jj11 = j1*j1 + j3*j3 + j5*j5;
+  const double jj11 = j01*j01 + j11*j11 + j21*j21;
   const double jdet = sqrt(jj00*jj11 - jj01*jj10);
 
   for (int i=0, iJ=0; i < npts; ++i) {
-    jacobian[iJ++] = j0;
-    jacobian[iJ++] = j1;
-    jacobian[iJ++] = j2;
-    jacobian[iJ++] = j3;
-    jacobian[iJ++] = j4;
-    jacobian[iJ++] = j5;
+    jacobian[iJ++] = j00;
+    jacobian[iJ++] = j01;
+    jacobian[iJ++] = j10;
+    jacobian[iJ++] = j11;
+    jacobian[iJ++] = j20;
+    jacobian[iJ++] = j21;
     det[i] = jdet;
   } // for
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Integrator.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Integrator.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Integrator.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -25,6 +25,7 @@
 
 #include "pylith/topology/topologyfwd.hh" // USES Mesh, Field, SolutionFields
 #include "pylith/utils/utilsfwd.hh" // HOLDSA EventLogger
+#include "pylith/utils/petscfwd.h" // USES PetscMat
 
 #include "spatialdata/spatialdb/spatialdbfwd.hh" // USES GravityField
 #include "spatialdata/units/unitsfwd.hh" // USES Nondimensional
@@ -108,11 +109,12 @@
   virtual
   bool needNewJacobian(void) const;
 
-   /** Check whether integrator needs velocity.
-    *
-    * @returns True if integrator needs velocity for computation.
-    */
-   bool isJacobianSymmetric(void) const;
+  /** Check whether integrator generates a symmetric Jacobian.
+   *
+   * @returns True if integrator generates symmetric Jacobian.
+   */
+  virtual
+  bool isJacobianSymmetric(void) const;
 
   /** Set flag for setting constraints for total field solution or
    *  incremental field solution.
@@ -147,18 +149,6 @@
 			 const double t,
 			 topology::SolutionFields* const fields);
 
-  /** Integrate contributions to residual term (r) for operator that
-   * do not require assembly over cells, vertices, or processors.
-   *
-   * @param residual Field containing values for residual
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  virtual
-  void integrateResidualAssembled(const topology::Field<topology::Mesh>& residual,
-				  const double t,
-				  topology::SolutionFields* const fields);
-
   /** Integrate contributions to residual term (r) for operator.
    *
    * @param residual Field containing values for residual
@@ -170,18 +160,6 @@
        const double t,
        topology::SolutionFields* const fields);
 
-  /** Integrate contributions to residual term (r) for operator that
-   * do not require assembly over cells, vertices, or processors.
-   *
-   * @param residual Field containing values for residual
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  virtual
-  void integrateResidualLumpedAssembled(const topology::Field<topology::Mesh>& residual,
-          const double t,
-          topology::SolutionFields* const fields);
-
   /** Integrate contributions to Jacobian matrix (A) associated with
    * operator.
    *
@@ -195,19 +173,6 @@
 			 topology::SolutionFields* const fields);
 
   /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator that do not require assembly over cells, vertices, or
-   * processors
-   *
-   * @param jacobian Sparse matrix for Jacobian of system.
-   * @param t Current time
-   * @param fields Solution fields
-   */
-  virtual
-  void integrateJacobianAssembled(topology::Jacobian* jacobian,
-				  const double t,
-				  topology::SolutionFields* const fields);
-
-  /** Integrate contributions to Jacobian matrix (A) associated with
    * operator.
    *
    * @param jacobian Diagonal matrix (as field) for Jacobian of system.
@@ -220,17 +185,16 @@
 			 topology::SolutionFields* const fields);
 
   /** Integrate contributions to Jacobian matrix (A) associated with
-   * operator that do not require assembly over cells, vertices, or
-   * processors
+   * operator.
    *
-   * @param jacobian Diagonal matrix (as field) for Jacobian of system.
-   * @param t Current time
+   * @param precondMatrix Custom preconditioning matrix.
+   * @param jacobian Sparse matrix for Jacobian of system.
    * @param fields Solution fields
    */
   virtual
-  void integrateJacobianAssembled(topology::Field<topology::Mesh>* jacobian,
-				  const double t,
-				  topology::SolutionFields* const fields);
+  void calcPreconditioner(PetscMat* const precondMatrix,
+			  topology::Jacobian* const jacobian,
+			  topology::SolutionFields* const fields);
 
   /** Update state variables as needed.
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Integrator.icc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Integrator.icc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Integrator.icc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -70,17 +70,6 @@
 			     topology::SolutionFields* const fields) {
 } // integrateResidual
 
-// Integrate contributions to residual term (r) for operator that
-// do not require assembly over cells, vertices, or processors.
-template<typename quadrature_type>
-inline
-void
-pylith::feassemble::Integrator<quadrature_type>::integrateResidualAssembled(
-			     const topology::Field<topology::Mesh>& residual,
-			     const double t,
-			     topology::SolutionFields* const fields) {
-} // integrateResidualAssembled
-
 // Integrate contributions to residual term (r) for operator.
 template<typename quadrature_type>
 inline
@@ -92,18 +81,6 @@
   integrateResidual(residual, t, fields);
 } // integrateResidual
 
-// Integrate contributions to residual term (r) for operator that
-// do not require assembly over cells, vertices, or processors.
-template<typename quadrature_type>
-inline
-void
-pylith::feassemble::Integrator<quadrature_type>::integrateResidualLumpedAssembled(
-           const topology::Field<topology::Mesh>& residual,
-           const double t,
-           topology::SolutionFields* const fields) {
-  integrateResidualAssembled(residual, t, fields);
-} // integrateResidualAssembled
-
 // Integrate contributions to Jacobian matrix (A) associated with
 // operator.
 template<typename quadrature_type>
@@ -117,18 +94,6 @@
 } // integrateJacobian
 
 // Integrate contributions to Jacobian matrix (A) associated with
-// operator that do not require assembly over cells, vertices, or
-// processors
-template<typename quadrature_type>
-inline
-void
-pylith::feassemble::Integrator<quadrature_type>::integrateJacobianAssembled(
-				      topology::Jacobian* jacobian,
-				      const double t,
-				      topology::SolutionFields* const fields) {
-} // integrateJacobianAssembled
-
-// Integrate contributions to Jacobian matrix (A) associated with
 // operator.
 template<typename quadrature_type>
 inline
@@ -141,16 +106,15 @@
 } // integrateJacobian
 
 // Integrate contributions to Jacobian matrix (A) associated with
-// operator that do not require assembly over cells, vertices, or
-// processors
+// operator.
 template<typename quadrature_type>
 inline
-void
-pylith::feassemble::Integrator<quadrature_type>::integrateJacobianAssembled(
-			      topology::Field<topology::Mesh>* jacobian,
-			      const double t,
-			      topology::SolutionFields* const fields) {
-} // integrateJacobianAssembled
+void 
+pylith::feassemble::Integrator<quadrature_type>::calcPreconditioner(
+			          PetscMat* const precondMatrix,
+				  topology::Jacobian* const jacobian,
+				  topology::SolutionFields* const fields) {
+} // calcPreconditioner
 
 // Update state variables as needed.
 template<typename quadrature_type>

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/IntegratorElasticity.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/IntegratorElasticity.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/IntegratorElasticity.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -121,6 +121,7 @@
 
   // Initialize material.
   _material->initialize(mesh, _quadrature);
+  _isJacobianSymmetric = _material->isJacobianSymmetric();
 
   // Allocate vectors and matrices for cell values.
   _initCellVector();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Makefile.am	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Makefile.am	2010-05-30 21:53:47 UTC (rev 16840)
@@ -19,6 +19,7 @@
 	Constraint.hh \
 	Constraint.icc \
 	ElasticityExplicit.hh \
+	ElasticityExplicitTri3.hh \
 	ElasticityExplicitTet4.hh \
 	ElasticityExplicitLgDeform.hh \
 	ElasticityImplicit.hh \

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -21,7 +21,7 @@
 
 #include <cassert> // USES assert()
 
-#define ISOPARAMETRIC
+//#define ISOPARAMETRIC
 
 // ----------------------------------------------------------------------
 // Constructor
@@ -76,8 +76,8 @@
     for (int iBasis=0; iBasis < numBasis; ++iBasis)
       _quadPts[iQuadPt] += basis[iQ+iBasis]*coordinatesCell[iBasis];
 #else
-    geometry.coordsRefToGlobal(&_quadPts[iQuadPt], &quadPtsRef[iQuadPt],
-			       &coordinatesCell[0], spaceDim);
+    geometry.ptsRefToGlobal(&_quadPts[iQuadPt], &quadPtsRef[iQuadPt],
+			    &coordinatesCell[0], spaceDim, 1);
 #endif
 
 #if defined(ISOPARAMETRIC)
@@ -93,9 +93,8 @@
     _jacobianDet[iQuadPt] = _jacobian[iQuadPt];
 #else
     // Compute Jacobian and determinant of Jacobian at quadrature point
-    assert(0 != _geometry);
-    geometry->jacobian(&_jacobian[iQuadPt], &_jacobianDet[iQuadPt],
-		       &coordinatesCell[0], &quadPtsRef[iQuadPt], spaceDim);
+    geometry.jacobian(&_jacobian[iQuadPt], &_jacobianDet[iQuadPt],
+		      &coordinatesCell[0], &quadPtsRef[iQuadPt], spaceDim, 1);
     _checkJacobianDet(_jacobianDet[iQuadPt], cell);
 #endif
     

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1Din2D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1Din2D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1Din2D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -21,7 +21,7 @@
 
 #include <cassert> // USES assert()
 
-#define ISOPARAMETRIC
+//#define ISOPARAMETRIC
 
 // ----------------------------------------------------------------------
 // Constructor
@@ -81,9 +81,9 @@
 	  valueBasis * coordinatesCell[iBasis*spaceDim+iDim];
     } // for
 #else
-    geometry.coordsRefToGlobal(&_quadPts[iQuadPt*spaceDim],
-			       &quadPtsRef[iQuadPt*cellDim],
-			       &coordinatesCell[0], spaceDim);
+    geometry.ptsRefToGlobal(&_quadPts[iQuadPt*spaceDim],
+			    &quadPtsRef[iQuadPt*cellDim],
+			    &coordinatesCell[0], spaceDim, 1);
 #endif
 
 #if defined(ISOPARAMETRIC)
@@ -98,7 +98,7 @@
 	_jacobian[iQuadPt*spaceDim+iDim] += 
 	  deriv * coordinatesCell[iBasis*spaceDim+iDim];
     } // for
-
+    
     // Compute determinant of Jacobian at quadrature point
     // |J| = sqrt(transpose(J) J)
     double det = 0.0;
@@ -110,10 +110,11 @@
     _jacobianDet[iQuadPt] = det;
 #else
     // Compute Jacobian and determinant of Jacobian at quadrature point
-    geometry.jacobian(&_jacobian[iQuadPt*_cellDim*spaceDim],
+    geometry.jacobian(&_jacobian[iQuadPt*cellDim*spaceDim],
 		      &_jacobianDet[iQuadPt],
-		      &coordinatesCell0], &quadPtsRef[iQuadPt*cellDim], spaceDim);
-    _checkJacobianDet(_jacobianDet[iQuadPt], cell);
+		      &coordinatesCell[0], &quadPtsRef[iQuadPt*cellDim],
+		      spaceDim, 1);
+  _checkJacobianDet(_jacobianDet[iQuadPt], cell);
 #endif
 
     // Compute inverse of Jacobian at quadrature point

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1Din3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1Din3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature1Din3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -21,7 +21,7 @@
 
 #include <cassert> // USES assert()
 
-#define ISOPARAMETRIC
+//#define ISOPARAMETRIC
 
 // ----------------------------------------------------------------------
 // Constructor
@@ -82,9 +82,9 @@
 	  valueBasis * coordinatesCell[iBasis*spaceDim+iDim];
     } // for
 #else
-    geometry.coordsRefToGlobal(&_quadPts[iQuadPt*spaceDim],
-			       &quadPtsRef[iQuadPt*cellDim],
-			       &coordinatesCell[0], spaceDim);
+    geometry.ptsRefToGlobal(&_quadPts[iQuadPt*spaceDim],
+			    &quadPtsRef[iQuadPt*cellDim],
+			    &coordinatesCell[0], spaceDim, 1);
 #endif
     
 #if defined(ISOPARAMETRIC)
@@ -115,7 +115,8 @@
     // Compute Jacobian and determinant of Jacobian at quadrature point
     geometry.jacobian(&_jacobian[iQuadPt*cellDim*spaceDim],
 		      &_jacobianDet[iQuadPt],
-		      &coordinatesCell[0], &quadPtsRef[iQuadPt*cellDim], spaceDim);
+		      &coordinatesCell[0], &quadPtsRef[iQuadPt*cellDim],
+		      spaceDim, 1);
     _checkJacobianDet(_jacobianDet[iQuadPt], cell);
 #endif
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature2D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature2D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature2D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -21,7 +21,7 @@
 
 #include <cassert> // USES assert()
 
-#define ISOPARAMETRIC
+//#define ISOPARAMETRIC
 
 // ----------------------------------------------------------------------
 // Constructor
@@ -79,9 +79,9 @@
 	  valueBasis * coordinatesCell[iBasis*spaceDim+iDim];
     } // for
 #else
-    geometry.coordsRefToGlobal(&_quadPts[iQuadPt*spaceDim],
-			       &quadPtsRef[iQuadPt*cellDim],
-			       &coordinatesCell[0], spaceDim);
+    geometry.ptsRefToGlobal(&_quadPts[iQuadPt*spaceDim],
+			    &quadPtsRef[iQuadPt*cellDim],
+			    &coordinatesCell[0], spaceDim, 1);
 #endif
 
 #if defined(ISOPARAMETRIC)
@@ -115,10 +115,17 @@
     _jacobianDet[iQuadPt] = det;
 #else
     // Compute Jacobian and determinant of Jacobian at quadrature point
+    const int iJ = iQuadPt*cellDim*spaceDim;
+    const int i00 = iJ + 0*spaceDim + 0;
+    const int i01 = iJ + 0*spaceDim + 1;
+    const int i10 = iJ + 1*spaceDim + 0;
+    const int i11 = iJ + 1*spaceDim + 1;
     geometry.jacobian(&_jacobian[iQuadPt*cellDim*spaceDim],
 		      &_jacobianDet[iQuadPt],
-		      &coordinatesCell[0], &quadPtsRef[iQuadPt*cellDim], spaceDim);
+		      &coordinatesCell[0], &quadPtsRef[iQuadPt*cellDim], 
+		      spaceDim, 1);
     _checkJacobianDet(_jacobianDet[iQuadPt], cell);
+    const double det = _jacobianDet[iQuadPt];
 #endif
 
     // Compute inverse of Jacobian at quadrature point

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature2Din3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature2Din3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature2Din3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -23,7 +23,7 @@
 #include <cassert> // USES assert()
 #include <stdexcept> // USES std::runtime_error()
 
-#define ISOPARAMETRIC
+//#define ISOPARAMETRIC
 
 // ----------------------------------------------------------------------
 // Constructor
@@ -83,9 +83,9 @@
 	  valueBasis * coordinatesCell[iBasis*spaceDim+iDim];
     } // for
 #else
-    geometry.coordsRefToGlobal(&_quadPts[iQuadPt*spaceDim],
-			       &quadPtsRef[iQuadPt*cellDim],
-			       &coordinatesCell[0], spaceDim);
+    geometry.ptsRefToGlobal(&_quadPts[iQuadPt*spaceDim],
+			    &quadPtsRef[iQuadPt*cellDim],
+			    &coordinatesCell[0], spaceDim, 1);
 #endif
 
 #if defined(ISOPARAMETRIC)
@@ -136,9 +136,17 @@
     _jacobianDet[iQuadPt] = det;
 #else
     // Compute Jacobian and determinant of Jacobian at quadrature point
+    const int iJ = iQuadPt*cellDim*spaceDim;
+    const int i00 = iJ + 0*cellDim + 0;
+    const int i01 = iJ + 0*cellDim + 1;
+    const int i10 = iJ + 1*cellDim + 0;
+    const int i11 = iJ + 1*cellDim + 1;
+    const int i20 = iJ + 2*cellDim + 0;
+    const int i21 = iJ + 2*cellDim + 1;
     geometry.jacobian(&_jacobian[iQuadPt*cellDim*spaceDim],
 		      &_jacobianDet[iQuadPt],
-		      &coordinatesCell[0], &quadPtsRef[iQuadPt*cellDim], spaceDim);
+		      &coordinatesCell[0], &quadPtsRef[iQuadPt*cellDim], 
+		      spaceDim, 1);
     _checkJacobianDet(_jacobianDet[iQuadPt], cell);
 #endif
     

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/Quadrature3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -21,7 +21,7 @@
 
 #include <cassert> // USES assert()
 
-#define ISOPARAMETRIC
+//#define ISOPARAMETRIC
 
 // ----------------------------------------------------------------------
 // Constructor
@@ -80,9 +80,9 @@
 	  valueBasis * coordinatesCell[iBasis*spaceDim+iDim];
     } // for
 #else
-    geometry.coordsRefToGlobal(&quadPts[iQuadPt*spaceDim],
-			       &quadPtsRef[iQuadPt*cellDim],
-			       &coordinatesCell[0], spaceDim);
+    geometry.ptsRefToGlobal(&_quadPts[iQuadPt*spaceDim],
+			    &quadPtsRef[iQuadPt*cellDim],
+			    &coordinatesCell[0], spaceDim, 1);
 #endif
     
 #if defined(ISOPARAMETRIC)
@@ -133,10 +133,22 @@
     _jacobianDet[iQuadPt] = det;
 #else
     // Compute Jacobian and determinant of Jacobian at quadrature point
+    const int iJ = iQuadPt*cellDim*spaceDim;
+    const int i00 = iJ + 0*spaceDim + 0;
+    const int i01 = iJ + 0*spaceDim + 1;
+    const int i02 = iJ + 0*spaceDim + 2;
+    const int i10 = iJ + 1*spaceDim + 0;
+    const int i11 = iJ + 1*spaceDim + 1;
+    const int i12 = iJ + 1*spaceDim + 2;
+    const int i20 = iJ + 2*spaceDim + 0;
+    const int i21 = iJ + 2*spaceDim + 1;
+    const int i22 = iJ + 2*spaceDim + 2;
     geometry.jacobian(&_jacobian[iQuadPt*cellDim*spaceDim],
 		      &_jacobianDet[iQuadPt],
-		      &coordinatesCell[0], &quadPtsRef[iQuadPt*cellDim], spaceDim);
+		      &coordinatesCell[0], &quadPtsRef[iQuadPt*cellDim],
+		      spaceDim, 1);
     _checkJacobianDet(_jacobianDet[iQuadPt], cell);
+    const double det = _jacobianDet[iQuadPt];
 #endif
     
     // Compute inverse of Jacobian at quadrature point

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/feassemblefwd.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/feassemblefwd.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/feassemblefwd.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -57,6 +57,7 @@
     class ElasticityExplicit;
 
     class ElasticityExplicitTet4;
+    class ElasticityExplicitTri3;
 
     class IntegratorElasticityLgDeform;
     class ElasticityImplicitLgDeform;

Copied: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/tet4_elasticity.wxm (from rev 16839, short/3D/PyLith/trunk/libsrc/feassemble/tet4_elasticity.wxm)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/tet4_elasticity.wxm	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/tet4_elasticity.wxm	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,54 @@
+/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/
+/* [ Created with wxMaxima version 0.8.2 ] */
+
+/* [wxMaxima: input   start ] */
+b : matrix([1,y1,z1],[1,y2,z2],[1,y3,z3]);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+-determinant(b);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+c : matrix([x1, 1, z1],[x2,1,z2],[x3,1,z3]);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+-determinant(c);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+d : matrix([x0, y0,1],[x1,y1,1],[x2,y2,1]);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+determinant(d);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+B : matrix([b1,0,0,b2,0,0,b3,0,0,b4,0,0],
+[0,c1,0,0,c2,0,0,c3,0,0,c4,0],
+[0,0,d1,0,0,d2,0,0,d3,0,0,d4],
+[c1,b1,0,c2,b2,0,c3,b3,0,c4,b4,0],
+[0,d1,c1,0,d2,c2,0,d3,c3,0,d4,c4],
+[d1,0,b1,d2,0,b2,d3,0,b3,d4,0,b4]);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+disp : matrix([dispTCell0,dispTCell1,dispTCell2,dispTCell3,dispTCell4,dispTCell5,dispTCell6,dispTCell7,dispTCell8,dispTCell9,dispTCell10,dispTCell11]);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+B . transpose(disp);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+stress : matrix([stressCell0, stressCell1, stressCell2, stressCell3, stressCell4, stressCell5]);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+transpose(B) . transpose(stress);
+/* [wxMaxima: input   end   ] */
+
+/* Maxima can't load/batch files which end with a comment! */
+"Created with wxMaxima"$

Copied: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/tri3_elasticity.wxm (from rev 16839, short/3D/PyLith/trunk/libsrc/feassemble/tri3_elasticity.wxm)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/tri3_elasticity.wxm	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/feassemble/tri3_elasticity.wxm	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,27 @@
+/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/
+/* [ Created with wxMaxima version 0.8.2 ] */
+
+/* [wxMaxima: input   start ] */
+B : matrix([b0,0,b1,0,b2,0],
+[0,c0,0,c1,0,c2],
+[c0,b0,c1,b1,c2,b2]);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+disp : matrix([dispCell0,dispCell1,dispCell2,dispCell3,dispCell4,dispCell5]);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+B . transpose(disp);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+stress : matrix([stressCell0, stressCell1, stressCell2]);
+/* [wxMaxima: input   end   ] */
+
+/* [wxMaxima: input   start ] */
+transpose(B) . transpose(stress);
+/* [wxMaxima: input   end   ] */
+
+/* Maxima can't load/batch files which end with a comment! */
+"Created with wxMaxima"$

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/RateStateAgeing.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/RateStateAgeing.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/RateStateAgeing.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -286,7 +286,7 @@
 
   double friction = 0.0;
   double mu_f = 0.0;
-  if (normalTraction < 0.0) {
+  if (normalTraction <= 0.0) {
     // if fault is in compression
     // Using Regularized Rate and State equation
     const double f0 = properties[p_coef];
@@ -350,8 +350,6 @@
 
   stateVars[s_state] = thetaTpdtVertex;
 
-  std::cout << "STATEVAR before: " << thetaTVertex << ", after: " << thetaTpdtVertex << std::endl;
-  std::cout << "SLIP RATE: " << slipRate << std::endl;
   PetscLogFlops(6);
 } // _updateStateVars
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/SlipWeakening.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/SlipWeakening.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/SlipWeakening.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -266,7 +266,7 @@
 
   double friction = 0.0;
   double mu_f = 0.0;
-  if (normalTraction < 0.0) {
+  if (normalTraction <= 0.0) {
     // if fault is in compression
     if (stateVars[s_slipCum] < properties[p_d0]) {
 	// if/else linear slip-weakening form of mu_f 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/StaticFriction.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/StaticFriction.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/friction/StaticFriction.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -150,7 +150,7 @@
   assert(_numPropsVertex == numProperties);
   assert(0 == numStateVars);
 
-  const double friction = (normalTraction < 0.0) ?
+  const double friction = (normalTraction <= 0.0) ?
     -properties[p_coef] * normalTraction + properties[p_cohesion]: 
     properties[p_cohesion];
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/DruckerPrager3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/DruckerPrager3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/DruckerPrager3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -181,7 +181,7 @@
 void
 pylith::materials::DruckerPrager3D::_dbToProperties(
 				double* const propValues,
-				const double_array& dbValues) const
+				const double_array& dbValues)
 { // _dbToProperties
   assert(0 != propValues);
   const int numDBValues = dbValues.size();
@@ -209,6 +209,9 @@
     throw std::runtime_error(msg.str());
   } // if
 
+  if (fabs(frictionAngle - dilatationAngle) > 1.0e-6)
+    _isJacobianSymmetric = false;
+
   const double mu = density * vs*vs;
   const double lambda = density * vp*vp - 2.0*mu;
   const double denomFriction = sqrt(3.0) * (3.0 - sin(frictionAngle));
@@ -293,7 +296,7 @@
 void
 pylith::materials::DruckerPrager3D::_dbToStateVars(
 				double* const stateValues,
-				const double_array& dbValues) const
+				const double_array& dbValues)
 { // _dbToStateVars
   assert(0 != stateValues);
   const int numDBValues = dbValues.size();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/DruckerPrager3D.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/DruckerPrager3D.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/DruckerPrager3D.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -71,7 +71,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const;
+		       const double_array& dbValues);
 
   /** Nondimensionalize properties.
    *
@@ -95,7 +95,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToStateVars(double* const stateValues,
-		      const double_array& dbValues) const;
+		      const double_array& dbValues);
 
   /** Nondimensionalize state variables..
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticIsotropic3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticIsotropic3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticIsotropic3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -103,7 +103,7 @@
 void
 pylith::materials::ElasticIsotropic3D::_dbToProperties(
 					   double* const propValues,
-					   const double_array& dbValues) const
+					   const double_array& dbValues)
 { // _dbToProperties
   assert(0 != propValues);
   const int numDBValues = dbValues.size();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticIsotropic3D.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticIsotropic3D.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticIsotropic3D.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -69,7 +69,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const;
+		       const double_array& dbValues);
 
   /** Nondimensionalize properties.
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStrain.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStrain.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStrain.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -103,7 +103,7 @@
 void
 pylith::materials::ElasticPlaneStrain::_dbToProperties(
 				          double* const propValues,
-                                          const double_array& dbValues) const
+                                          const double_array& dbValues)
 { // _dbToProperties
   assert(0 != propValues);
   const int numDBValues = dbValues.size();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStrain.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStrain.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStrain.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -69,7 +69,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const;
+		       const double_array& dbValues);
 
   /** Nondimensionalize properties.
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStress.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStress.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStress.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -103,7 +103,7 @@
 void
 pylith::materials::ElasticPlaneStress::_dbToProperties(
 					  double* propValues,
-					  const double_array& dbValues) const
+					  const double_array& dbValues)
 { // _dbToProperties
   assert(0 != propValues);
   const int numDBValues = dbValues.size();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStress.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStress.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticPlaneStress.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -71,7 +71,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const;
+		       const double_array& dbValues);
 
   /** Nondimensionalize properties.
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStrain1D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStrain1D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStrain1D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -103,7 +103,7 @@
 void
 pylith::materials::ElasticStrain1D::_dbToProperties(
 					    double* const propValues,
-					    const double_array& dbValues) const
+					    const double_array& dbValues)
 { // _dbToProperties
   assert(0 != propValues);
   const int numDBValues = dbValues.size();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStrain1D.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStrain1D.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStrain1D.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -70,7 +70,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const;
+		       const double_array& dbValues);
 
   /** Nondimensionalize properties.
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStress1D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStress1D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStress1D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -103,7 +103,7 @@
 void
 pylith::materials::ElasticStress1D::_dbToProperties(
 					    double* const propValues,
-					    const double_array& dbValues) const
+					    const double_array& dbValues)
 { // _dbToProperties
   assert(0 != propValues);
   const int numDBValues = dbValues.size();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStress1D.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStress1D.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/ElasticStress1D.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -71,7 +71,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const;
+		       const double_array& dbValues);
 
   /** Nondimensionalize properties.
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/GenMaxwellIsotropic3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/GenMaxwellIsotropic3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/GenMaxwellIsotropic3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -231,7 +231,7 @@
 void
 pylith::materials::GenMaxwellIsotropic3D::_dbToProperties(
 					    double* const propValues,
-					    const double_array& dbValues) const
+					    const double_array& dbValues)
 { // _dbToProperties
   assert(0 != propValues);
   const int numDBValues = dbValues.size();
@@ -364,7 +364,7 @@
 void
 pylith::materials::GenMaxwellIsotropic3D::_dbToStateVars(
 					double* const stateValues,
-					const double_array& dbValues) const
+					const double_array& dbValues)
 { // _dbToStateVars
   assert(0 != stateValues);
   const int numDBValues = dbValues.size();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/GenMaxwellIsotropic3D.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/GenMaxwellIsotropic3D.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/GenMaxwellIsotropic3D.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -81,7 +81,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const;
+		       const double_array& dbValues);
 
   /** Nondimensionalize properties.
    *
@@ -105,7 +105,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToStateVars(double* const stateValues,
-		      const double_array& dbValues) const;
+		      const double_array& dbValues);
 
   // Note: We do not need to dimensionalize or nondimensionalize state
   // variables because there are strains, which are dimensionless.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -49,6 +49,7 @@
   _dimension(dimension),
   _tensorSize(tensorSize),
   _needNewJacobian(false),
+  _isJacobianSymmetric(true),
   _dbProperties(0),
   _dbInitialState(0),
   _id(0),

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -150,6 +150,12 @@
    */
   bool needNewJacobian(void) const;
 
+   /** Check whether material generates a symmetric Jacobian.
+    *
+    * @returns True if material generates symmetric Jacobian.
+    */
+   bool isJacobianSymmetric(void) const;
+
   /// Reset flag indicating whether Jacobian matrix must be reformed for
   /// current state.
   void resetNeedNewJacobian(void);
@@ -202,7 +208,7 @@
    */
   virtual
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const = 0;
+		       const double_array& dbValues) = 0;
 
   /** Nondimensionalize properties.
    *
@@ -229,7 +235,7 @@
    */
   virtual
   void _dbToStateVars(double* const stateValues,
-		      const double_array& dbValues) const;
+		      const double_array& dbValues);
 
   /** Nondimensionalize state variables.
    *
@@ -267,6 +273,7 @@
   const int _dimension; ///< Spatial dimension associated with material.
   const int _tensorSize; ///< Tensor size for material.
   bool _needNewJacobian; ///< True if need to reform Jacobian, false otherwise.
+  bool _isJacobianSymmetric; ///< True if Jacobian is symmetric;
 
   // PRIVATE METHODS ////////////////////////////////////////////////////
 private :

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.icc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.icc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/Material.icc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -100,11 +100,18 @@
   _needNewJacobian = false;
 } // resetNeedNewJacobian
 
+// Check whether material generates a symmetric Jacobian.
+inline
+bool
+pylith::materials::Material::isJacobianSymmetric(void) const {
+  return _isJacobianSymmetric;
+} // isJacobianSymmetric
+
 // Compute initial state variables from values in spatial database.
 inline
 void
 pylith::materials::Material::_dbToStateVars(double* const stateValues,
-					    const double_array& dbValues) const
+					    const double_array& dbValues)
 {}
 
 // Nondimensionalize state variables.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellIsotropic3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellIsotropic3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellIsotropic3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -178,7 +178,7 @@
 void
 pylith::materials::MaxwellIsotropic3D::_dbToProperties(
 					    double* const propValues,
-					    const double_array& dbValues) const
+					    const double_array& dbValues)
 { // _dbToProperties
   assert(0 != propValues);
   const int numDBValues = dbValues.size();
@@ -279,7 +279,7 @@
 void
 pylith::materials::MaxwellIsotropic3D::_dbToStateVars(
 					double* const stateValues,
-					const double_array& dbValues) const
+					const double_array& dbValues)
 { // _dbToStateVars
   assert(0 != stateValues);
   const int numDBValues = dbValues.size();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellIsotropic3D.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellIsotropic3D.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellIsotropic3D.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -68,7 +68,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const;
+		       const double_array& dbValues);
 
   /** Nondimensionalize properties.
    *
@@ -92,7 +92,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToStateVars(double* const stateValues,
-		      const double_array& dbValues) const;
+		      const double_array& dbValues);
 
   // Note: We do not need to dimensionalize or nondimensionalize state
   // variables because there are strains, which are dimensionless.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellPlaneStrain.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellPlaneStrain.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellPlaneStrain.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -172,7 +172,7 @@
 void
 pylith::materials::MaxwellPlaneStrain::_dbToProperties(
 					    double* const propValues,
-					    const double_array& dbValues) const
+					    const double_array& dbValues)
 { // _dbToProperties
   assert(0 != propValues);
   const int numDBValues = dbValues.size();
@@ -273,7 +273,7 @@
 void
 pylith::materials::MaxwellPlaneStrain::_dbToStateVars(
 					double* const stateValues,
-					const double_array& dbValues) const
+					const double_array& dbValues)
 { // _dbToStateVars
   assert(0 != stateValues);
   const int numDBValues = dbValues.size();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellPlaneStrain.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellPlaneStrain.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/MaxwellPlaneStrain.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -70,7 +70,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const;
+		       const double_array& dbValues);
 
   /** Nondimensionalize properties.
    *
@@ -94,7 +94,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToStateVars(double* const stateValues,
-		      const double_array& dbValues) const;
+		      const double_array& dbValues);
 
   // Note: We do not need to dimensionalize or nondimensionalize state
   // variables because there are strains, which are dimensionless.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/PowerLaw3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/PowerLaw3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/PowerLaw3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -198,7 +198,7 @@
 void
 pylith::materials::PowerLaw3D::_dbToProperties(
 				double* const propValues,
-				const double_array& dbValues) const
+				const double_array& dbValues)
 { // _dbToProperties
   assert(0 != propValues);
   const int numDBValues = dbValues.size();
@@ -312,7 +312,7 @@
 void
 pylith::materials::PowerLaw3D::_dbToStateVars(
 				double* const stateValues,
-				const double_array& dbValues) const
+				const double_array& dbValues)
 { // _dbToStateVars
   assert(0 != stateValues);
   const int numDBValues = dbValues.size();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/PowerLaw3D.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/PowerLaw3D.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/materials/PowerLaw3D.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -96,7 +96,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToProperties(double* const propValues,
-		       const double_array& dbValues) const;
+		       const double_array& dbValues);
 
   /** Nondimensionalize properties.
    *
@@ -120,7 +120,7 @@
    * @param dbValues Array of database values.
    */
   void _dbToStateVars(double* const stateValues,
-		      const double_array& dbValues) const;
+		      const double_array& dbValues);
 
   /** Nondimensionalize state variables..
    *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/DataWriterVTK.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/DataWriterVTK.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/DataWriterVTK.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -112,7 +112,7 @@
 
     err = PetscViewerCreate(mesh.comm(), &_viewer);
     CHECK_PETSC_ERROR(err);
-    err = PetscViewerSetType(_viewer, PETSC_VIEWER_ASCII);
+    err = PetscViewerSetType(_viewer, PETSCVIEWERASCII);
     CHECK_PETSC_ERROR(err);
     err = PetscViewerSetFormat(_viewer, PETSC_VIEWER_ASCII_VTK);
     CHECK_PETSC_ERROR(err);
@@ -121,7 +121,7 @@
 
     const ALE::Obj<typename mesh_type::SieveMesh>& sieveMesh = mesh.sieveMesh();
     
-    err = VTKViewer::writeHeader(_viewer);
+    err = VTKViewer::writeHeader(sieveMesh, _viewer);
     CHECK_PETSC_ERROR(err);
     //std::cout << "Wrote header for " << filename << std::endl;
     err = VTKViewer::writeVertices(sieveMesh, _viewer);
@@ -133,8 +133,7 @@
     } else {
       const std::string labelName = 
 	(sieveMesh->hasLabel("censored depth")) ? "censored depth" : "depth";
-      err = VTKViewer::writeElements(sieveMesh, label, labelId, labelName,
-				     0, _viewer);      
+      err = VTKViewer::writeElements(sieveMesh, label, labelId, labelName, 0, _viewer);      
       CHECK_PETSC_ERROR(err);
     } // if
     //std::cout << "Wrote elements for " << filename << std::endl;

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -31,7 +31,8 @@
 // ----------------------------------------------------------------------
 // Constructor
 pylith::meshio::MeshIOCubit::MeshIOCubit(void) :
-  _filename("")
+  _filename(""),
+  _useNodesetNames(true)
 { // constructor
 } // constructor
 
@@ -291,6 +292,32 @@
   bool ok = ns_prop1->get(&ids[0], counts);
   delete[] counts; counts = 0;
       
+  string_vector groupNames(numGroups);
+  if (_useNodesetNames) {
+    NcVar* ns_names = ncfile.get_var("ns_names");
+    if (0 == ns_names) 
+      throw std::runtime_error("Could not get variable 'ns_names'.");
+    long* counts = ns_names->edges();
+    if (ns_names->num_dims() != 2)
+      throw std::runtime_error("Expected variable 'ns_names' to have "
+			       "2 dimensions.");
+    const int bufferSize = counts[1];
+    char* buffer = (bufferSize > 0) ? new char[bufferSize] : 0;
+    for (int i=0; i < numGroups; ++i) {
+      ns_names->set_cur(i);
+      bool ok = ns_names->get(buffer, 1, bufferSize, 0, 0, 0);
+      if (!ok) {
+	std::ostringstream msg;
+	msg << "Could not read name of nodeset " << ids[i] << ".";
+	throw std::runtime_error(msg.str());
+      } // if
+      groupNames[i] = buffer;
+      std::cout << "GROUP: '" << groupNames[i] << "'." << std::endl;
+    } // for
+    delete[] buffer; buffer = 0;
+    delete[] counts; counts = 0;
+  } // if
+
   for (int iGroup=0; iGroup < numGroups; ++iGroup) {
     std::valarray<int> points;
 	
@@ -314,9 +341,13 @@
     points -= 1; // use zero index
 
     GroupPtType type = VERTEX;
-    std::ostringstream name;
-    name << ids[iGroup];
-    _setGroup(name.str().c_str(), type, points);
+    if (_useNodesetNames)
+      _setGroup(groupNames[iGroup], type, points);
+    else {
+      std::ostringstream name;
+      name << ids[iGroup];
+      _setGroup(name.str().c_str(), type, points);
+    } // if/else
   } // for  
 } // _readGroups
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -57,6 +57,12 @@
    */
   const char* filename(void) const;
 
+  /** Set flag on whether to use nodeset ids or names.
+   *
+   * @param flag True to use node set names.
+   */
+  void useNodesetNames(const bool flag);
+
 // PROTECTED METHODS ////////////////////////////////////////////////////
 protected :
 
@@ -136,6 +142,7 @@
 private :
 
   std::string _filename; ///< Name of file
+  bool _useNodesetNames; ///< True to use node set names instead of ids.
 
 }; // MeshIOCubit
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.icc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.icc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/meshio/MeshIOCubit.icc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -28,6 +28,13 @@
   return _filename.c_str();
 }
 
+// Set flag on whether to use nodeset ids or names.
+inline
+void
+pylith::meshio::MeshIOCubit::useNodesetNames(const bool flag) {
+  _useNodesetNames = flag;
+}
+
 #endif
 
 // End of file

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Formulation.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Formulation.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Formulation.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -32,6 +32,7 @@
   _jacobian(0),
   _jacobianLumped(0),
   _fields(0),
+  _precondMatrix(0),
   _isJacobianSymmetric(false)
 { // constructor
 } // constructor
@@ -51,9 +52,51 @@
   _jacobian = 0; // :TODO: Use shared pointer.
   _jacobianLumped = 0; // :TODO: Use shared pointer.
   _fields = 0; // :TODO: Use shared pointer.
+
+#if 0   // :KLUDGE: Assume Solver deallocates matrix.
+  PetscErrorCode err = 0;
+  if (0 != _precondMatrix) {
+    err = PetscObjectDereference((PetscObject) _precondMatrix);
+    _precondMatrix = 0; CHECK_PETSC_ERROR(err);
+  } // if
+#else
+  _precondMatrix = 0;
+#endif
 } // deallocate
   
 // ----------------------------------------------------------------------
+// Set flag for splitting fields.
+void
+pylith::problems::Formulation::splitFields(const bool flag)
+{ // splitFields
+  _splitFields = flag;
+} // splitFields
+
+// ----------------------------------------------------------------------
+// Get flag for splitting fields.
+bool
+pylith::problems::Formulation::splitFields(void) const
+{ // splitFields
+  return _splitFields;
+} // splitFields
+
+// ----------------------------------------------------------------------
+// Set flag for using custom preconditioner for Lagrange constraints.
+void
+pylith::problems::Formulation::useCustomConstraintPC(const bool flag)
+{ // useCustomConstraintPC
+  _useCustomConstraintPC = flag;
+} // useCustomConstraintPC
+
+// ----------------------------------------------------------------------
+// Get flag indicating use of custom conditioner for Lagrange constraints.
+bool
+pylith::problems::Formulation::useCustomConstraintPC(void) const
+{ // useCustomConstraintPC
+  return _useCustomConstraintPC;
+} // useCustomConstraintPC
+
+// ----------------------------------------------------------------------
 // Return the fields
 const pylith::topology::SolutionFields&
 pylith::problems::Formulation::fields(void) const
@@ -96,6 +139,19 @@
 } // submeshIntegrators
 
 // ----------------------------------------------------------------------
+// Set handle to preconditioner.
+void
+pylith::problems::Formulation::customPCMatrix(PetscMat& mat)
+{ // preconditioner
+  _precondMatrix = mat;
+
+#if 0 // :KLUDGE: Assume solver deallocates matrix
+  PetscErrorCode err = 0;
+  err = PetscObjectReference((PetscObject) mat); CHECK_PETSC_ERROR(err);
+#endif
+} // preconditioner
+
+// ----------------------------------------------------------------------
 // Initialize formulation.
 void
 pylith::problems::Formulation::initialize(void)
@@ -196,14 +252,6 @@
   // Assemble residual.
   residual.complete();
 
-  // Add in contributions that do not require assembly.
-  numIntegrators = _meshIntegrators.size();
-  for (int i=0; i < numIntegrators; ++i)
-    _meshIntegrators[i]->integrateResidualAssembled(residual, _t, _fields);
-  numIntegrators = _submeshIntegrators.size();
-  for (int i=0; i < numIntegrators; ++i)
-    _submeshIntegrators[i]->integrateResidualAssembled(residual, _t, _fields);
-
   // Update PETSc view of residual
   if (0 != tmpResidualVec)
     residual.scatterSectionToVector(*tmpResidualVec);
@@ -252,14 +300,6 @@
   // Assemble residual.
   residual.complete();
 
-  // Add in contributions that do not require assembly.
-  numIntegrators = _meshIntegrators.size();
-  for (int i=0; i < numIntegrators; ++i)
-    _meshIntegrators[i]->integrateResidualLumpedAssembled(residual, _t, _fields);
-  numIntegrators = _submeshIntegrators.size();
-  for (int i=0; i < numIntegrators; ++i)
-    _submeshIntegrators[i]->integrateResidualLumpedAssembled(residual, _t, _fields);
-
   // Update PETSc view of residual
   if (0 != tmpResidualVec)
     residual.scatterSectionToVector(*tmpResidualVec);
@@ -288,20 +328,9 @@
   // Set jacobian to zero.
   _jacobian->zero();
 
-  // Add in contributions that do not require assembly.
+  // Add in contributions that require assembly.
   int numIntegrators = _meshIntegrators.size();
   for (int i=0; i < numIntegrators; ++i)
-    _meshIntegrators[i]->integrateJacobianAssembled(_jacobian, _t, _fields);
-  numIntegrators = _submeshIntegrators.size();
-  for (int i=0; i < numIntegrators; ++i)
-    _submeshIntegrators[i]->integrateJacobianAssembled(_jacobian, _t, _fields);
-
-  // Flush assembled portion.
-  _jacobian->assemble("flush_assembly");
-
-  // Add in contributions that require assembly.
-  numIntegrators = _meshIntegrators.size();
-  for (int i=0; i < numIntegrators; ++i)
     _meshIntegrators[i]->integrateJacobian(_jacobian, _t, _fields);
   numIntegrators = _submeshIntegrators.size();
   for (int i=0; i < numIntegrators; ++i)
@@ -310,6 +339,23 @@
   // Assemble jacobian.
   _jacobian->assemble("final_assembly");
 
+  if (0 != _precondMatrix) {
+    // Recalculate preconditioner.
+    numIntegrators = _meshIntegrators.size();
+    for (int i=0; i < numIntegrators; ++i)
+      _meshIntegrators[i]->calcPreconditioner(&_precondMatrix,
+					      _jacobian, _fields);
+    numIntegrators = _submeshIntegrators.size();
+    for (int i=0; i < numIntegrators; ++i)
+      _submeshIntegrators[i]->calcPreconditioner(&_precondMatrix,
+						 _jacobian, _fields);
+
+    MatAssemblyBegin(_precondMatrix, MAT_FINAL_ASSEMBLY);
+    MatAssemblyEnd(_precondMatrix, MAT_FINAL_ASSEMBLY);
+
+    std::cout << "Preconditioner Matrix" << std::endl;
+    MatView(_precondMatrix, PETSC_VIEWER_STDOUT_WORLD);
+  } // if
 } // reformJacobian
 
 // ----------------------------------------------------------------------
@@ -334,16 +380,6 @@
   // Assemble jacbian.
   _jacobianLumped->complete();
 
-  // Add in contributions that do not require assembly.
-  numIntegrators = _meshIntegrators.size();
-  for (int i=0; i < numIntegrators; ++i)
-    _meshIntegrators[i]->integrateJacobianAssembled(_jacobianLumped, 
-						    _t, _fields);
-  numIntegrators = _submeshIntegrators.size();
-  for (int i=0; i < numIntegrators; ++i)
-    _submeshIntegrators[i]->integrateJacobianAssembled(_jacobianLumped,
-						       _t, _fields);
-
 } // reformJacobian
 
 // ----------------------------------------------------------------------
@@ -385,6 +421,16 @@
 void
 pylith::problems::Formulation::adjustSolnLumped(void)
 { // adjustSolnLumped
+  topology::Field<topology::Mesh>& solution = _fields->solution();
+
+  if (!_fields->hasField("dispIncr adjust")) {
+    _fields->add("dispIncr adjust", "dispIncr_adjust");
+    topology::Field<topology::Mesh>& adjust = _fields->get("dispIncr adjust");
+    adjust.cloneSection(solution);
+  } // for
+  topology::Field<topology::Mesh>& adjust = _fields->get("dispIncr adjust");
+  adjust.zero();
+
   int numIntegrators = _meshIntegrators.size();
   for (int i=0; i < numIntegrators; ++i)
     _meshIntegrators[i]->adjustSolnLumped(_fields, *_jacobianLumped);
@@ -392,6 +438,9 @@
   numIntegrators = _submeshIntegrators.size();
   for (int i=0; i < numIntegrators; ++i)
     _submeshIntegrators[i]->adjustSolnLumped(_fields, *_jacobianLumped);
+
+  adjust.complete();
+  solution += adjust;
 } // adjustSolnLumped
 
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Formulation.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Formulation.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Formulation.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -26,7 +26,7 @@
 #include "pylith/feassemble/feassemblefwd.hh" // USES Integrator
 #include "pylith/topology/topologyfwd.hh" // USES Mesh, Field, SolutionFields
 
-#include "pylith/utils/petscfwd.h" // USES PetscVec, PetscMat, PetscSNES
+#include "pylith/utils/petscfwd.h" // USES PetscVec, PetscMat
 
 #include "pylith/utils/array.hh" // HASA std::vector
 
@@ -55,6 +55,30 @@
   /// Deallocate PETSc and local data structures.
   void deallocate(void);
   
+  /** Set flag for splitting fields.
+   *
+   * @param flag True if splitting fields, false otherwise.
+   */
+  void splitFields(const bool flag);
+
+  /** Get flag for splitting fields.
+   *
+   * @returns flag True if splitting fields, false otherwise.
+   */
+  bool splitFields(void) const;
+
+  /** Set flag for using custom preconditioner for Lagrange constraints.
+   *
+   * @param flag True if using custom fault preconditioner, false otherwise.
+   */
+  void useCustomConstraintPC(const bool flag);
+
+  /** Get flag indicating use of custom conditioner for Lagrange constraints.
+   *
+   * @returns True if using custom fault preconditioner, false otherwise.
+   */
+  bool useCustomConstraintPC(void) const;
+
   /** Get solution fields.
    *
    * @returns solution fields.
@@ -83,6 +107,12 @@
   void submeshIntegrators(IntegratorSubMesh** integrators,
 			  const int numIntegrators);
 
+  /** Set handle to preconditioner.
+   *
+   * @param pc PETSc preconditioner.
+   */
+  void customPCMatrix(PetscMat& mat);
+
   /// Initialize formulation.
   virtual
   void initialize(void);
@@ -167,6 +197,7 @@
   double _t; ///< Current time (nondimensional).
   double _dt; ///< Current time step (nondimensional).
   topology::Jacobian* _jacobian; ///< Handle to Jacobian of system.
+  PetscMat _precondMatrix; ///< Custom PETSc preconditioning matrix.
   topology::Field<topology::Mesh>* _jacobianLumped; ///< Handle to lumped Jacobian of system.
   topology::SolutionFields* _fields; ///< Handle to solution fields for system.
 
@@ -177,7 +208,11 @@
   std::vector<IntegratorSubMesh*> _submeshIntegrators;
 
   bool _isJacobianSymmetric; ///< Is system Jacobian symmetric?
+  bool _splitFields; ///< True if splitting fields.
 
+  /// True if using custom preconditioner for Lagrange constraints.
+  bool _useCustomConstraintPC;
+
 // NOT IMPLEMENTED //////////////////////////////////////////////////////
 private :
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Solver.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Solver.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Solver.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -14,11 +14,26 @@
 
 #include "Solver.hh" // implementation of class methods
 
+#include "Formulation.hh" // USES Formulation
+
+#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+
 #include "pylith/utils/EventLogger.hh" // USES EventLogger
+#include "pylith/utils/petscerror.h" // USES CHECK_PETSC_ERROR
 
 #include <cassert> // USES assert()
 
+#define FIELD_SPLIT
+
+#if defined(FIELD_SPLIT)
+#include <petscmesh_solvers.hh> // USES constructFieldSplit()
+#endif
+
 // ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+
+// ----------------------------------------------------------------------
 // Constructor
 pylith::problems::Solver::Solver(void) :
   _formulation(0),
@@ -54,5 +69,79 @@
   _formulation = formulation;
 } // initialize
 
+// ----------------------------------------------------------------------
+// Setup preconditioner for preconditioning with split fields.
+void
+pylith::problems::Solver::_setupFieldSplit(PetscPC* const pc,
+					   PetscMat* const precondMatrix,
+					   Formulation* const formulation,
+					   const topology::SolutionFields& fields)
+{ // _setupFieldSplit
+  assert(0 != pc);
+  assert(0 != precondMatrix);
+  assert(0 != formulation);
 
+  PetscErrorCode err = 0;
+
+  const ALE::Obj<SieveMesh>& sieveMesh = fields.mesh().sieveMesh();
+  const topology::Field<topology::Mesh>& solution = fields.solution();
+  const ALE::Obj<RealSection>& solutionSection = solution.section();
+  assert(!solutionSection.isNull());
+
+  err = PCSetType(*pc, PCFIELDSPLIT); CHECK_PETSC_ERROR(err);
+  err = PCSetOptionsPrefix(*pc, "fs_"); CHECK_PETSC_ERROR(err);
+  err = PCSetFromOptions(*pc); CHECK_PETSC_ERROR(err);
+
+#if defined(FIELD_SPLIT)
+  constructFieldSplit(solutionSection, 
+	      sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", 
+						      solutionSection), 
+		      solution.vector(), *pc);
+
+  const int spaceDim = sieveMesh->getDimension();
+  if (solutionSection->getNumSpaces() > spaceDim &&
+      formulation->useCustomConstraintPC()) {
+    // Get total number of DOF associated with constraints field split
+    const ALE::Obj<RealSection>& constraintSection = 
+      solutionSection->getFibration(spaceDim);
+    assert(!constraintSection.isNull());
+
+    // :TODO: Is this assembled across processors?
+    const int ndof = constraintSection->size(); 
+    
+    if (0 != *precondMatrix) {
+      err = MatDestroy(*precondMatrix); *precondMatrix = 0;
+      CHECK_PETSC_ERROR(err);
+    } // if
+    PetscInt nrows = ndof;
+    PetscInt ncols = ndof;
+
+    err = MatCreate(sieveMesh->comm(), precondMatrix); CHECK_PETSC_ERROR(err);
+    err = MatSetSizes(*precondMatrix, nrows, ncols, 
+		      PETSC_DECIDE, PETSC_DECIDE); CHECK_PETSC_ERROR(err);
+    err = MatSetType(*precondMatrix, MATAIJ);
+    err = MatSetFromOptions(*precondMatrix); CHECK_PETSC_ERROR(err);
+    
+#if 1
+    // Allocate just the diagonal.
+    err = MatSeqAIJSetPreallocation(*precondMatrix, 1, 
+				    PETSC_NULL); CHECK_PETSC_ERROR(err);
+    err = MatMPIAIJSetPreallocation(*precondMatrix, 1, PETSC_NULL, 
+				    0, PETSC_NULL); CHECK_PETSC_ERROR(err);
+#else
+    // Allocate full matrix (overestimate).
+    err = MatSeqAIJSetPreallocation(*precondMatrix, ncols, 
+				    PETSC_NULL); CHECK_PETSC_ERROR(err);
+    err = MatMPIAIJSetPreallocation(*precondMatrix, ncols, PETSC_NULL, 
+				    0, PETSC_NULL); CHECK_PETSC_ERROR(err);
+#endif
+    
+    // Set preconditioning matrix in formulation
+    formulation->customPCMatrix(*precondMatrix);
+  } // if
+
+#endif
+} // _setupFieldSplit
+
+
 // End of file

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Solver.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Solver.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/Solver.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -25,6 +25,7 @@
 
 #include "pylith/topology/topologyfwd.hh" // USES SolutionFields
 #include "pylith/utils/utilsfwd.hh" // USES EventLogger
+#include "pylith/utils/petscfwd.h" // USES PetscMat
 
 // Solver ---------------------------------------------------------
 /** @brief Abstract C++ base class for using PETSc linear and
@@ -60,6 +61,22 @@
 	     const topology::Jacobian& jacobian,
 	     Formulation* const formulation);
 
+// PROTECTED METHODS ////////////////////////////////////////////////////
+protected :
+
+  /** Setup preconditioner for preconditioning using split fields.
+   *
+   * @param pc PETSc preconditioner.
+   * @param precondMatrix Matrix for custom preconditioner.
+   * @param formulation Formulation of system of equations.
+   * @param fields Solution fields.
+   */
+  void
+  _setupFieldSplit(PetscPC* const pc,
+		   PetscMat* const precondMatrix,
+		   Formulation* const formulation,
+		   const topology::SolutionFields& fields);
+
 // PROTECTED MEMBERS ////////////////////////////////////////////////////
 protected :
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/SolverLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/SolverLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/SolverLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -23,16 +23,15 @@
 
 #include "pylith/utils/petscerror.h" // USES CHECK_PETSC_ERROR
 
-#define FIELD_SPLIT
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
 
-#if defined(FIELD_SPLIT)
-#include <petscmesh_solvers.hh> // USES constructFieldSplit()
-#endif
-
 // ----------------------------------------------------------------------
 // Constructor
 pylith::problems::SolverLinear::SolverLinear(void) :
-  _ksp(0)
+  _ksp(0),
+  _precondMatrix(0)
 { // constructor
 } // constructor
 
@@ -54,6 +53,11 @@
     PetscErrorCode err = KSPDestroy(_ksp); _ksp = 0;
     CHECK_PETSC_ERROR(err);
   } // if
+
+  if (0 != _precondMatrix) {
+    PetscErrorCode err = MatDestroy(_precondMatrix); _precondMatrix = 0;
+    CHECK_PETSC_ERROR(err);
+  } // if
 } // deallocate
   
 // ----------------------------------------------------------------------
@@ -78,21 +82,11 @@
   err = KSPSetInitialGuessNonzero(_ksp, PETSC_FALSE); CHECK_PETSC_ERROR(err);
   err = KSPSetFromOptions(_ksp); CHECK_PETSC_ERROR(err);
 
-  const topology::Field<topology::Mesh>& residual = fields.get("residual");
-
-  // Check for fibration
-  if (residual.section()->getNumSpaces() > 0) {
-    const ALE::Obj<topology::Mesh::SieveMesh>& sieveMesh = fields.mesh().sieveMesh();
-    PC pc;
-
+  if (formulation->splitFields()) {
+    PetscPC pc = 0;
     err = KSPGetPC(_ksp, &pc); CHECK_PETSC_ERROR(err);
-    err = PCSetType(pc, PCFIELDSPLIT); CHECK_PETSC_ERROR(err);
-    err = PCSetOptionsPrefix(pc, "fs_"); CHECK_PETSC_ERROR(err);
-    err = PCSetFromOptions(pc); CHECK_PETSC_ERROR(err);
-#if defined(FIELD_SPLIT)
-    constructFieldSplit(residual.section(), sieveMesh->getFactory()->getGlobalOrder(sieveMesh, "default", residual.section()), residual.vector(), pc);
-#endif
-  }
+    _setupFieldSplit(&pc, &_precondMatrix, formulation, fields);
+  } // if
 } // initialize
 
 // ----------------------------------------------------------------------
@@ -129,6 +123,34 @@
   } // else
   jacobian->resetValuesChanged();
 
+  // 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() &&
+      0 != _precondMatrix) {
+    
+    PetscPC pc = 0;
+    PetscKSP *ksps = 0;
+    PetscMat A = 0;
+    PetscInt num = 0;
+    
+    err = KSPSetUp(_ksp); CHECK_PETSC_ERROR(err);
+    err = KSPGetPC(_ksp, &pc); CHECK_PETSC_ERROR(err);
+    err = PCFieldSplitGetSubKSP(pc, &num, &ksps); CHECK_PETSC_ERROR(err);
+    assert(solutionSection->getNumSpaces() == num);
+
+    MatStructure flag;
+    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, _precondMatrix, 
+			  flag); CHECK_PETSC_ERROR(err);
+    err = PetscFree(ksps); CHECK_PETSC_ERROR(err);
+  } // if
+
+
   const PetscVec residualVec = residual.vector();
   const PetscVec solutionVec = solution->vector();
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/SolverLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/SolverLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/problems/SolverLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -79,6 +79,7 @@
 private :
 
   PetscKSP _ksp; ///< PETSc KSP linear solver.
+  PetscMat _precondMatrix; ///< Preconditioning matrix for Lagrange constraints.
 
 // NOT IMPLEMENTED //////////////////////////////////////////////////////
 private :

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/topology/Distributor.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/topology/Distributor.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/topology/Distributor.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -277,10 +277,7 @@
 					newLabel);
     newLabel->symmetrize();
 #else
-    // Get remote labels
-    ALE::New::Completion<SieveMesh,SieveMesh::point_type>::scatterCones(origLabel, newLabel, sendMeshOverlap, recvMeshOverlap, renumbering);
-    // Create local label
-    newLabel->add(origLabel, newSieveMesh->getSieve(), renumbering);
+	DistributionType::distributeLabelV(newSieveMesh->getSieve(), origLabel, partition, renumbering, sendMeshOverlap, recvMeshOverlap, newLabel);
 #if 0 // DEBUGGING
     std::string serialName("Serial ");
     std::string parallelName("Parallel ");

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/topology/ReverseCuthillMcKee.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/topology/ReverseCuthillMcKee.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/topology/ReverseCuthillMcKee.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -52,7 +52,7 @@
     //sieveMesh->view("MESH AFTER RELABEL");
   } // if    
 
-    //logger.stagePop();
+  //logger.stagePop();
 } // reorder
 
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/utils/petscerror.h
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/utils/petscerror.h	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/utils/petscerror.h	2010-05-30 21:53:47 UTC (rev 16840)
@@ -26,14 +26,11 @@
 #define __FUNCT__ "<unknown>"
 #endif
 
-#define CHECK_PETSC_ERROR(err) \
-  if (err) { \
-    PetscError(PETSC_COMM_SELF, __LINE__, __FUNCT__, __FILE__, __SDIR__, err, 0, " "); \
-    throw std::runtime_error("PETSc error."); }
+#define CHECK_PETSC_ERROR(err) CHKERRXX(err)
 
 #define CHECK_PETSC_ERROR_MSG(err, msg) \
   if (err) { \
-    PetscError(PETSC_COMM_SELF, __LINE__, __FUNCT__, __FILE__, __SDIR__, err, 0, " "); \
+    PetscError(PETSC_COMM_SELF, __LINE__, __FUNCT__, __FILE__, __SDIR__, err, PETSC_ERROR_IN_CXX, 0, " "); \
     throw std::runtime_error(msg); }
 
 #endif // pylith_utils_petscerror_h

Modified: short/3D/PyLith/branches/pylith-scecdynrup/libsrc/utils/petscfwd.h
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/libsrc/utils/petscfwd.h	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/libsrc/utils/petscfwd.h	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,6 +38,9 @@
 /// forward declaration for PETSc SNES
 typedef struct _p_SNES* PetscSNES;
 
+/// forward declaration for PETSc PC
+typedef struct _p_PC* PetscPC;
+
 /// forward declaration for PETSc PetscErrorCode
 typedef int PetscErrorCode;
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/bc/DirichletBC.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/bc/DirichletBC.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/bc/DirichletBC.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -36,6 +36,12 @@
       virtual
       void deallocate(void);
   
+      /** Get number of constraints per location.
+       *
+       * @returns Number of constraints per location.
+       */
+      int numDimConstrained(void) const;
+
       /** Initialize boundary condition.
        *
        * @param mesh PETSc mesh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/bc/PointForce.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/bc/PointForce.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/bc/PointForce.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -48,9 +48,9 @@
        * @param t Current time
        * @param fields Solution fields
        */
-      void integrateResidualAssembled(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
+      void integrateResidual(const pylith::topology::Field<pylith::topology::Mesh>& residual,
+			     const double t,
+			     pylith::topology::SolutionFields* const fields);
       
       /** Verify configuration is acceptable.
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveDyn.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveDyn.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveDyn.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -62,6 +62,21 @@
 		      const double upDir[3],
 		      const double normalDir[3]);
       
+      /** Integrate contributions to residual term (r) for operator that
+       * do not require assembly across processors.
+       *
+       * Initial tractions (if specified) are already assembled and
+       * contribute to the residual like Neumann boundary conditions.
+       *
+       * @param residual Field containing values for residual
+       * @param t Current time
+       * @param fields Solution fields
+       */
+      virtual
+      void integrateResidual(const pylith::topology::Field<pylith::topology::Mesh>& residual,
+				      const double t,
+				      pylith::topology::SolutionFields* const fields);
+
       /** Update state variables as needed.
        *
        * @param t Current time

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveKin.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveKin.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveKin.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -74,9 +74,9 @@
        * @param t Current time
        * @param fields Solution fields
        */
-      void integrateResidualAssembled(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
+      void integrateResidual(const pylith::topology::Field<pylith::topology::Mesh>& residual,
+			     const double t,
+			     pylith::topology::SolutionFields* const fields);
 
       /** Get vertex field associated with integrator.
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveLagrange.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveLagrange.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/faults/FaultCohesiveLagrange.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -58,41 +58,39 @@
       void splitField(pylith::topology::Field<pylith::topology::Mesh>* field);
 
       /** Integrate contributions to residual term (r) for operator that
-       * do not require assembly across cells, vertices, or processors.
+       * do not require assembly across processors.
        *
        * @param residual Field containing values for residual
        * @param t Current time
        * @param fields Solution fields
        */
       virtual
-      void integrateResidualAssembled(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
+      void integrateResidual(const pylith::topology::Field<pylith::topology::Mesh>& residual,
+			     const double t,
+			     pylith::topology::SolutionFields* const fields);
 
       /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator that do not require assembly across cells, vertices, or
-       * processors.
+       * operator that do not require assembly processors.
        *
        * @param jacobian Sparse matrix
        * @param t Current time
        * @param fields Solution fields
        * @param mesh Finite-element mesh
        */
-      void integrateJacobianAssembled(pylith::topology::Jacobian* jacobian,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
+      void integrateJacobian(pylith::topology::Jacobian* jacobian,
+			     const double t,
+			     pylith::topology::SolutionFields* const fields);
       
       /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator that do not require assembly across cells, vertices, or
-       * processors.
+       * operator that do not require assembly across processors.
        *
        * @param jacobian Diagonal Jacobian matrix as a field.
        * @param t Current time
        * @param fields Solution fields
        */
-      void integrateJacobianAssembled(pylith::topology::Field<pylith::topology::Mesh>* jacobian,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
+      void integrateJacobian(pylith::topology::Field<pylith::topology::Mesh>* jacobian,
+			     const double t,
+			     pylith::topology::SolutionFields* const fields);
 
       /** Adjust solution from solver with lumped Jacobian to match Lagrange
        *  multiplier constraints.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Constraint.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Constraint.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Constraint.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -35,6 +35,21 @@
       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.
+       */
+      virtual
+      int numDimConstrained(void) const = 0;
+
       /** Set manager of scales used to nondimensionalize problem.
        *
        * @param dim Nondimensionalizer.
@@ -56,14 +71,6 @@
       virtual
       void setConstraints(const pylith::topology::Field<pylith::topology::Mesh>& field) = 0;
 
-      /** 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);
-      
       /** Set values in field.
        *
        * @param t Current time

Copied: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/ElasticityExplicitTri3.i (from rev 16839, short/3D/PyLith/trunk/modulesrc/feassemble/ElasticityExplicitTri3.i)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/ElasticityExplicitTri3.i	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/ElasticityExplicitTri3.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,98 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file modulesrc/feassemble/ElasticityExplicitTri3.i
+ *
+ * @brief Python interface to C++ ElasticityExplicitTri3 object.
+ */
+
+namespace pylith {
+  namespace feassemble {
+
+    class ElasticityExplicitTri3 : public IntegratorElasticity
+    { // ElasticityExplicitTri3
+
+      // PUBLIC MEMBERS /////////////////////////////////////////////////
+    public :
+      
+      /// Constructor
+      ElasticityExplicitTri3(void);
+      
+      /// Destructor
+      ~ElasticityExplicitTri3(void);
+      
+      /// Deallocate PETSc and local data structures.
+      void deallocate(void);
+  
+      /** Set time step for advancing from time t to time t+dt.
+       *
+       * @param dt Time step
+       */
+      void timeStep(const double dt);
+      
+      /** 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
+       * @param t Current time
+       * @param fields Solution fields
+       */
+      void integrateResidual(const pylith::topology::Field<pylith::topology::Mesh>& residual,
+			     const double t,
+			     pylith::topology::SolutionFields* const fields);
+      
+      /** Integrate contributions to residual term (r) for operator.
+       *
+       * @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 double 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 double t,
+			     pylith::topology::SolutionFields* const fields);
+
+      /** Integrate contributions to Jacobian matrix (A) associated
+       * with operator that require assembly across cells, vertices,
+       * or processors.
+       *
+       * @param jacobian Diagonal Jacobian matrix as a field.
+       * @param t Current time
+       * @param fields Solution fields
+       */
+      void integrateJacobian(pylith::topology::Field<pylith::topology::Mesh>* jacobian,
+			     const double t,
+			     pylith::topology::SolutionFields* const fields);
+
+    }; // ElasticityExplicitTri3
+
+  } // feassemble
+} // pylith
+
+
+// End of file 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Integrator.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Integrator.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Integrator.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -86,6 +86,13 @@
       virtual
       bool needNewJacobian(void) const;
       
+      /** Check whether integrator generates a symmetric Jacobian.
+       *
+       * @returns True if integrator generates symmetric Jacobian.
+       */
+      virtual
+      bool isJacobianSymmetric(void) const;
+
       /** Set flag for setting constraints for total field solution or
        *  incremental field solution.
        *
@@ -119,18 +126,6 @@
 			     const double t,
 			     pylith::topology::SolutionFields* const fields);
 
-      /** Integrate contributions to residual term (r) for operator that
-       * do not require assembly over cells, vertices, or processors.
-       *
-       * @param residual Field containing values for residual
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      virtual 
-      void integrateResidualAssembled(const pylith::topology::Field<pylith::topology::Mesh>& residual,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
-
       /** Integrate contributions to Jacobian matrix (A) associated with
        * operator.
        *
@@ -144,19 +139,6 @@
 			     pylith::topology::SolutionFields* const fields);
 
       /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator that do not require assembly over cells, vertices, or
-       * processors
-       *
-       * @param jacobian Sparse matrix for Jacobian of system.
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      virtual
-      void integrateJacobianAssembled(pylith::topology::Jacobian* jacobian,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
-
-      /** Integrate contributions to Jacobian matrix (A) associated with
        * operator.
        *
        * @param jacobian Diagonal matrix (as field) for Jacobian of system.
@@ -168,19 +150,6 @@
 			     const double t,
 			     pylith::topology::SolutionFields* const fields);
       
-      /** Integrate contributions to Jacobian matrix (A) associated with
-       * operator that do not require assembly over cells, vertices, or
-       * processors
-       *
-       * @param jacobian Diagonal matrix (as field) for Jacobian of system.
-       * @param t Current time
-       * @param fields Solution fields
-       */
-      virtual
-      void integrateJacobianAssembled(pylith::topology::Field<pylith::topology::Mesh>* jacobian,
-				      const double t,
-				      pylith::topology::SolutionFields* const fields);
-
       /** Update state variables as needed.
        *
        * @param t Current time

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Makefile.am	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/Makefile.am	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,6 +38,7 @@
 	IntegratorElasticity.i \
 	ElasticityImplicit.i \
 	ElasticityExplicit.i \
+	ElasticityExplicitTri3.i \
 	ElasticityExplicitTet4.i \
 	IntegratorElasticityLgDeform.i \
 	ElasticityImplicitLgDeform.i \

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/feassemble.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/feassemble.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/feassemble/feassemble.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -35,6 +35,7 @@
 #include "pylith/feassemble/Quadrature.hh"
 #include "pylith/feassemble/ElasticityImplicit.hh"
 #include "pylith/feassemble/ElasticityExplicit.hh"
+#include "pylith/feassemble/ElasticityExplicitTri3.hh"
 #include "pylith/feassemble/ElasticityExplicitTet4.hh"
 #include "pylith/feassemble/ElasticityImplicitLgDeform.hh"
 #include "pylith/feassemble/ElasticityExplicitLgDeform.hh"
@@ -85,6 +86,7 @@
 %include "ElasticityImplicit.i"
 %include "ElasticityExplicit.i"
 %include "ElasticityExplicitTet4.i"
+%include "ElasticityExplicitTri3.i"
 %include "IntegratorElasticityLgDeform.i"
 %include "ElasticityImplicitLgDeform.i"
 %include "ElasticityExplicitLgDeform.i"

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/DruckerPrager3D.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/DruckerPrager3D.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/DruckerPrager3D.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -54,7 +54,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const;
+			   const pylith::double_array& dbValues);
       
       /** Nondimensionalize properties.
        *
@@ -78,7 +78,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToStateVars(double* const stateValues,
-			  const pylith::double_array& dbValues) const;
+			  const pylith::double_array& dbValues);
       
       /** Nondimensionalize state variables..
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticIsotropic3D.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticIsotropic3D.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticIsotropic3D.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -52,7 +52,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const;
+			   const pylith::double_array& dbValues);
 
       /** Nondimensionalize properties.
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticPlaneStrain.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticPlaneStrain.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticPlaneStrain.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -52,7 +52,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const;
+			   const pylith::double_array& dbValues);
 
       /** Nondimensionalize properties.
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticPlaneStress.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticPlaneStress.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticPlaneStress.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -52,7 +52,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const;
+			   const pylith::double_array& dbValues);
 
       /** Nondimensionalize properties.
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticStrain1D.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticStrain1D.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticStrain1D.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -52,7 +52,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const;
+			   const pylith::double_array& dbValues);
       
       /** Nondimensionalize properties.
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticStress1D.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticStress1D.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/ElasticStress1D.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -52,7 +52,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const;
+			   const pylith::double_array& dbValues);
       
       /** Nondimensionalize properties.
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/GenMaxwellIsotropic3D.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/GenMaxwellIsotropic3D.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/GenMaxwellIsotropic3D.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -54,7 +54,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const;
+			   const pylith::double_array& dbValues);
       
       /** Nondimensionalize properties.
        *
@@ -78,7 +78,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToStateVars(double* const stateValues,
-			  const pylith::double_array& dbValues) const;
+			  const pylith::double_array& dbValues);
       
       /** Compute density from properties.
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/Material.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/Material.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/Material.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -120,6 +120,12 @@
       /// current state.
       void resetNeedNewJacobian(void);
       
+      /** Check whether integrator generates a symmetric Jacobian.
+       *
+       * @returns True if integrator generates symmetric Jacobian.
+       */
+      bool isJacobianSymmetric(void) const;
+
       /** Get physical property or state variable field. Data is returned
        * via the argument.
        *
@@ -151,7 +157,7 @@
        */
       virtual
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const = 0;
+			   const pylith::double_array& dbValues) = 0;
       
       /** Nondimensionalize properties.
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/MaxwellIsotropic3D.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/MaxwellIsotropic3D.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/MaxwellIsotropic3D.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -54,7 +54,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const;
+			   const pylith::double_array& dbValues);
       
       /** Nondimensionalize properties.
        *
@@ -78,7 +78,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToStateVars(double* const stateValues,
-			  const pylith::double_array& dbValues) const;
+			  const pylith::double_array& dbValues);
       
       // Note: We do not need to dimensionalize or nondimensionalize state
       // variables because there are strains, which are dimensionless.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/MaxwellPlaneStrain.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/MaxwellPlaneStrain.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/MaxwellPlaneStrain.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -54,7 +54,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const;
+			   const pylith::double_array& dbValues);
       
       /** Nondimensionalize properties.
        *
@@ -78,7 +78,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToStateVars(double* const stateValues,
-			  const pylith::double_array& dbValues) const;
+			  const pylith::double_array& dbValues);
       
       // Note: We do not need to dimensionalize or nondimensionalize state
       // variables because there are strains, which are dimensionless.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/PowerLaw3D.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/PowerLaw3D.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/materials/PowerLaw3D.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -54,7 +54,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToProperties(double* const propValues,
-			   const pylith::double_array& dbValues) const;
+			   const pylith::double_array& dbValues);
       
       /** Nondimensionalize properties.
        *
@@ -78,7 +78,7 @@
        * @param dbValues Array of database values.
        */
       void _dbToStateVars(double* const stateValues,
-			  const pylith::double_array& dbValues) const;
+			  const pylith::double_array& dbValues);
       
       /** Nondimensionalize state variables..
        *

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/meshio/MeshIOCubit.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/meshio/MeshIOCubit.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/meshio/MeshIOCubit.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -46,6 +46,12 @@
        */
       const char* filename(void) const;
       
+      /** Set flag on whether to use nodeset ids or names.
+       *
+       * @param flag True to use node set names.
+       */
+      void useNodesetNames(const bool flag);
+
       // PROTECTED METHODS ////////////////////////////////////////////////////
     protected :
       

Modified: short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/problems/Formulation.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/problems/Formulation.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/modulesrc/problems/Formulation.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -34,6 +34,32 @@
       /// Deallocate PETSc and local data structures.
       void deallocate(void);
   
+      /** Set flag for splitting fields.
+       *
+       * @param flag True if splitting fields, false otherwise.
+       */
+      void splitFields(const bool flag);
+
+      /** Get flag for splitting fields.
+       *
+       * @returns flag True if splitting fields, false otherwise.
+       */
+      bool splitFields(void) const;
+
+      /** Set flag for using custom Lagrange constraint preconditioner.
+       *
+       * @param flag True if using custom constraint precondition,
+       * false otherwise.
+       */
+      void useCustomConstraintPC(const bool flag);
+
+      /** Get flag indicating use of custom Lagrange constraint conditioner.
+       *
+       * @returns flag True if using custom constraint preconditioner, 
+       * false otherwise.
+       */
+      bool useCustomConstraintPC(void) const;
+
       /** Get solution fields.
        *
        * @returns solution fields.

Copied: short/3D/PyLith/branches/pylith-scecdynrup/playpen/faultpc (from rev 16839, short/3D/PyLith/trunk/playpen/faultpc)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/pylith/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/Makefile.am	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/Makefile.am	2010-05-30 21:53:47 UTC (rev 16840)
@@ -44,6 +44,7 @@
 	feassemble/Constraint.py \
 	feassemble/ElasticityExplicit.py \
 	feassemble/ElasticityExplicitTet4.py \
+	feassemble/ElasticityExplicitTri3.py \
 	feassemble/ElasticityExplicitLgDeform.py \
 	feassemble/ElasticityImplicit.py \
 	feassemble/ElasticityImplicitLgDeform.py \
@@ -118,6 +119,7 @@
 	problems/__init__.py \
 	problems/Explicit.py \
 	problems/ExplicitLumped.py \
+	problems/ExplicitLumpedTri3.py \
 	problems/ExplicitLumpedTet4.py \
 	problems/ExplicitLgDeform.py \
 	problems/Formulation.py \

Modified: short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/ElasticityExplicitTet4.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/ElasticityExplicitTet4.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/ElasticityExplicitTet4.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -29,7 +29,7 @@
 
   # PUBLIC METHODS /////////////////////////////////////////////////////
 
-  def __init__(self, name="elasticityexplicit"):
+  def __init__(self, name="elasticityexplicittet4"):
     """
     Constructor.
     """

Copied: short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/ElasticityExplicitTri3.py (from rev 16839, short/3D/PyLith/trunk/pylith/feassemble/ElasticityExplicitTri3.py)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/ElasticityExplicitTri3.py	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/ElasticityExplicitTri3.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+#
+# ----------------------------------------------------------------------
+#
+#                           Brad T. Aagaard
+#                        U.S. Geological Survey
+#
+# <LicenseText>
+#
+# ----------------------------------------------------------------------
+#
+
+## @file pylith/feassemble/ElasticityExplicitTri3.py
+##
+## @brief Python object for explicit time integration of dynamic
+## elasticity equation using finite-elements.
+##
+## Factory: integrator
+
+from IntegratorElasticity import IntegratorElasticity
+from feassemble import ElasticityExplicitTri3 as ModuleElasticityExplicitTri3
+
+# ElasticityExplicitTri3 class
+class ElasticityExplicitTri3(IntegratorElasticity, ModuleElasticityExplicitTri3):
+  """
+  Python object for explicit time integration of dynamic elasticity
+  equation using finite-elements.
+  """
+
+  # PUBLIC METHODS /////////////////////////////////////////////////////
+
+  def __init__(self, name="elasticityexplicittri3"):
+    """
+    Constructor.
+    """
+    IntegratorElasticity.__init__(self, name)
+    ModuleElasticityExplicitTri3.__init__(self)
+    self._loggingPrefix = "ElEx "
+    return
+
+
+  def initialize(self, totalTime, numTimeSteps, normalizer):
+    """
+    Do initialization.
+    """
+    logEvent = "%sinit" % self._loggingPrefix
+    self._eventLogger.eventBegin(logEvent)
+
+    IntegratorElasticity.initialize(self, totalTime, numTimeSteps, normalizer)
+    ModuleElasticityExplicitTri3.initialize(self, self.mesh)
+    self._initializeOutput(totalTime, numTimeSteps, normalizer)
+    
+    self._eventLogger.eventEnd(logEvent)
+    return
+
+
+# FACTORIES ////////////////////////////////////////////////////////////
+
+def integrator():
+  """
+  Factory associated with ElasticityExplicitTri3.
+  """
+  return ElasticityExplicitTri3()
+
+
+# End of file 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/FIATSimplex.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/FIATSimplex.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/FIATSimplex.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -185,8 +185,8 @@
       elif 3 == spaceDim:
         self.geometry = CellGeometry.GeometryPoint3D()
     if None == self.geometry:
-      raise ValueError("Could not set shape of cell for '%s' in spatial " \
-                       "dimension '%s'." % (self.name, spaceDim))
+      raise ValueError("Could not set shape '%s' of cell for '%s' in spatial " \
+                       "dimension '%s'." % (name, self.name, spaceDim))
     return
   
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/Integrator.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/Integrator.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/feassemble/Integrator.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -28,8 +28,6 @@
               "useSolnIncr",
               "integrateResidual",
               "integrateJacobian",
-              "integrateResidualAssembled",
-              "integrateJacobianAssembled",
               "preinitialize",
               "verifyConfiguration",
               "initialize",

Modified: short/3D/PyLith/branches/pylith-scecdynrup/pylith/meshio/MeshIOCubit.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/meshio/MeshIOCubit.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/meshio/MeshIOCubit.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -49,6 +49,9 @@
     filename = pyre.inventory.str("filename", default="mesh.exo")
     filename.meta['tip'] = "Name of Cubit Exodus file."
 
+    useNames = pyre.inventory.bool("use_nodeset_names", default=True)
+    useNames.meta['tip'] = "Use nodeset names instead of ids."
+
     from spatialdata.geocoords.CSCart import CSCart
     coordsys = pyre.inventory.facility("coordsys", family="coordsys",
                                        factory=CSCart)
@@ -73,7 +76,8 @@
     """
     MeshIOObj._configure(self)
     self.coordsys = self.inventory.coordsys
-    self.filename(self.inventory.filename)
+    ModuleMeshIOCubit.filename(self, self.inventory.filename)
+    ModuleMeshIOCubit.useNodesetNames(self, self.inventory.useNames)
     return
 
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Explicit.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Explicit.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Explicit.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -92,8 +92,10 @@
     logger.stagePop()
 
     self._info.log("Creating Jacobian matrix.")
+    self._setJacobianMatrixType()
     from pylith.topology.Jacobian import Jacobian
-    self.jacobian = Jacobian(self.fields.solution(), self.matrixType)
+    self.jacobian = Jacobian(self.fields.solution(),
+                             self.matrixType, self.blockMatrixOkay)
     self.jacobian.zero() # TEMPORARY, to get correct memory usage
     self._debug.log(resourceUsageString())
 

Copied: short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/ExplicitLumpedTri3.py (from rev 16839, short/3D/PyLith/trunk/pylith/problems/ExplicitLumpedTri3.py)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/ExplicitLumpedTri3.py	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/ExplicitLumpedTri3.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+#
+# ----------------------------------------------------------------------
+#
+#                           Brad T. Aagaard
+#                        U.S. Geological Survey
+#
+# <LicenseText>
+#
+# ----------------------------------------------------------------------
+#
+
+## @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
+    return ElasticityExplicitTri3()
+
+
+  # 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 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Formulation.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Formulation.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Formulation.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -58,9 +58,10 @@
     ## \b Properties
     ## @li \b matrix_type Type of PETSc sparse matrix.
     ## @li \b split_fields Split solution fields into displacements
-    ## and Lagrange multipliers for separate preconditioning.
+    ## @li \b use_custom_constraint_pc Use custom preconditioner for
+    ##   Lagrange constraints.
     ## @li \b view_jacobian Flag to output Jacobian matrix when it is
-    ## reformed.
+    ##   reformed.
     ##
     ## \b Facilities
     ## @li \b time_step Time step size manager.
@@ -73,10 +74,15 @@
     matrixType = pyre.inventory.str("matrix_type", default="unknown")
     matrixType.meta['tip'] = "Type of PETSc sparse matrix."
 
-    splitFields = pyre.inventory.bool("split_fields", default=False)
-    splitFields.meta['tip'] = "Split solution fields into displacements "\
+    useSplitFields = pyre.inventory.bool("split_fields", default=False)
+    useSplitFields.meta['tip'] = "Split solution fields into displacements "\
         "and Lagrange multipliers for separate preconditioning."
 
+    useCustomConstraintPC = pyre.inventory.bool("use_custom_constraint_pc",
+                                                default=False)
+    useCustomConstraintPC.meta['tip'] = "Use custom preconditioner for " \
+                                        "Lagrange constraints."
+
     viewJacobian = pyre.inventory.bool("view_jacobian", default=False)
     viewJacobian.meta['tip'] = "Write Jacobian matrix to binary file."
     
@@ -279,7 +285,6 @@
     """
     PetscComponent._configure(self)
     self.matrixType = self.inventory.matrixType
-    self.splitFields = self.inventory.splitFields
     self.timeStep = self.inventory.timeStep
     self.solver = self.inventory.solver
     self.output = self.inventory.output
@@ -289,9 +294,46 @@
 
     import journal
     self._debug = journal.debug(self.name)
+
+    if self.inventory.useCustomConstraintPC and \
+           not self.inventory.useSplitFields:
+      print "WARNING: Request to use custom preconditioner for Lagrange " \
+            "constraints without splitting fields. " \
+            "Setting split fields flag to 'True'."
+      self.inventory.useSplitFields = True
+
+    ModuleFormulation.splitFields(self, self.inventory.useSplitFields)
+    ModuleFormulation.useCustomConstraintPC(self,
+                                            self.inventory.useCustomConstraintPC)
     return
 
 
+  def _setJacobianMatrixType(self):
+    """
+    Determine appropriate PETSc matrix type for Jacobian matrix.
+    """
+    # Mapping from symmetric matrix type to nonsymmetric matrix type
+    matrixMap = {'sbaij': 'baij',
+                 'seqsbaij': 'seqbaij',
+                 'mpisbaij': 'mpibaij',
+                 'unknown': 'aij'}
+    isJacobianSymmetric = True
+    for integrator in self.integratorsMesh + self.integratorsSubMesh:
+      if not integrator.isJacobianSymmetric():
+        isJacobianSymmetric = False
+    if not isJacobianSymmetric:
+      if self.matrixType in matrixMap.keys():
+        print "WARNING: Jacobian matrix will not be symmetric.\n" \
+              "         Switching matrix type from '%s' to '%s'." % \
+              (self.matrixType, matrixMap[self.matrixType])
+        self.matrixType = matrixMap[self.matrixType]
+    self.blockMatrixOkay = True
+    for constraint in self.constraints:
+      numDimConstrained = constraint.numDimConstrained()
+      if numDimConstrained > 0 and self.mesh.dimension() != numDimConstrained:
+        self.blockMatrixOkay = False
+    return
+
   def _setupMaterials(self, materials):
     """
     Setup materials as integrators.

Modified: short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Implicit.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Implicit.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/problems/Implicit.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -132,8 +132,10 @@
 
     # Allocates memory for nonzero pattern and Jacobian
     self._info.log("Creating Jacobian matrix.")
+    self._setJacobianMatrixType()
     from pylith.topology.Jacobian import Jacobian
-    self.jacobian = Jacobian(self.fields.solution(), self.matrixType)
+    self.jacobian = Jacobian(self.fields.solution(),
+                             self.matrixType, self.blockMatrixOkay)
     self.jacobian.zero() # TEMPORARY, to get correct memory usage
     self._debug.log(resourceUsageString())
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/pylith/topology/Jacobian.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/pylith/topology/Jacobian.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/pylith/topology/Jacobian.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -25,7 +25,7 @@
 
   # PUBLIC METHODS /////////////////////////////////////////////////////
 
-  def __init__(self, field, matrixType="unknown"):
+  def __init__(self, field, matrixType="unknown", blockOkay=False):
     """
     Constructor.
 
@@ -35,7 +35,8 @@
     if matrixType == "unknown":
       matrixType = "sbaij"
 
-    ModuleJacobian.__init__(self, field, matrixType)
+    #print "MATRIX TYPE: %s, BLOCKOKAY: %s" % (matrixType, blockOkay)
+    ModuleJacobian.__init__(self, field, matrixType, blockOkay)
     return
     
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/templates/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/templates/Makefile.am	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/templates/Makefile.am	2010-05-30 21:53:47 UTC (rev 16840)
@@ -27,7 +27,22 @@
 	materials/tests/TestPlaneStrainState.py \
 	materials/m4/ac_pkg_swig.m4 \
 	materials/m4/cit_numpy.m4 \
-	materials/m4/cit_python.m4
+	materials/m4/cit_python.m4 \
+	friction/README \
+	friction/configure.ac \
+	friction/Makefile.am \
+	friction/ViscousFriction.hh \
+	friction/ViscousFriction.cc \
+	friction/ViscousFriction.i \
+	friction/frictioncontrib.i \
+	friction/__init__.py \
+	friction/ViscousFriction.py \
+	friction/tests/Makefile.am \
+	friction/tests/testcontrib.py \
+	friction/tests/TestViscousFriction.py \
+	friction/m4/ac_pkg_swig.m4 \
+	friction/m4/cit_numpy.m4 \
+	friction/m4/cit_python.m4
 
 
 # End of file 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/templates/README
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/templates/README	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/templates/README	2010-05-30 21:53:47 UTC (rev 16840)
@@ -1,3 +1,6 @@
 This directory contains templates for extending the functionality of
-PyLith. This includes creating user-defined bulk constitutive models
-(see the materials directory).
+PyLith.
+
+Directories
+  * friction - fault constitutive models
+  * materials - bulk constitutive models

Copied: short/3D/PyLith/branches/pylith-scecdynrup/templates/friction (from rev 16839, short/3D/PyLith/trunk/templates/friction)


Property changes on: short/3D/PyLith/branches/pylith-scecdynrup/templates/friction
___________________________________________________________________
Name: svn:externals
   + m4 http://geodynamics.org/svn/cig/cs/autoconf/trunk


Modified: short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/PlaneStrainState.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/PlaneStrainState.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/PlaneStrainState.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -13,7 +13,7 @@
 // See PlaneStrainState.hh for a description of each C++ function and
 // its arguments.
 
-#include <portinfo> // machine specificinfo generated by configure
+#include <portinfo> // machine specific info generated by configure
 
 #include "PlaneStrainState.hh" // implementation of object methods
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/PlaneStrainState.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/PlaneStrainState.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/PlaneStrainState.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -20,7 +20,7 @@
 
 # Import the SWIG module PlanseStrainState object and rename it
 # ModulePlaneStrainState so that it doesn't clash with the local
-# Python class with the same name.
+# Python class of the same name.
 from materialscontrib import PlaneStrainState as ModulePlaneStrainState
 
 # PlaneStrainState class

Modified: short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/materialscontrib.i
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/materialscontrib.i	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/templates/materials/materialscontrib.i	2010-05-30 21:53:47 UTC (rev 16840)
@@ -10,7 +10,7 @@
 // ======================================================================
 //
 
-// Define the spatialdatacontrib SWIG interface module.
+// Define the materialscontrib SWIG interface module.
 
 // Set module name
 %module materialscontrib

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/axialdisp.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/axialdisp.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/axialdisp.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -26,6 +26,7 @@
 
 [axialdisp.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/dislocation.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/dislocation.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/dislocation.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -26,6 +26,7 @@
 
 [dislocation.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/dislocation2.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/dislocation2.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/dislocation2.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -31,6 +31,7 @@
 
 [pylithapp.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_compression.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_compression.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_compression.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -28,6 +28,7 @@
 
 [friction_compression.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_opening.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_opening.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_opening.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -35,6 +35,7 @@
 # the mesh.
 [friction_opening.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_shear_sliding.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_shear_sliding.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_shear_sliding.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -35,6 +35,7 @@
 # the mesh.
 [friction_shear_sliding.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_shear_stick.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_shear_stick.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/friction_shear_stick.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -35,6 +35,7 @@
 # the mesh.
 [friction_shear_stick.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/lgdeformrigidbody.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/lgdeformrigidbody.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/lgdeformrigidbody.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -26,6 +26,7 @@
 
 [lgdeformrigidbody.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/lgdeformtraction.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/lgdeformtraction.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/lgdeformtraction.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -26,6 +26,7 @@
 
 [lgdeformtraction.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/sheardisp.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/sheardisp.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/sheardisp.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -26,6 +26,7 @@
 
 [sheardisp.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_compression.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_compression.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_compression.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -28,6 +28,7 @@
 
 [slipweakening_compression.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_opening.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_opening.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_opening.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -35,6 +35,7 @@
 # the mesh.
 [slipweakening_opening.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_shear_sliding.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_shear_sliding.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_shear_sliding.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -35,6 +35,7 @@
 # the mesh.
 [slipweakening_shear_sliding.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_shear_stick.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_shear_stick.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/quad4/slipweakening_shear_stick.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -35,6 +35,7 @@
 # the mesh.
 [slipweakening_shear_stick.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/axialdisp.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/axialdisp.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/axialdisp.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -26,6 +26,7 @@
 
 [axialdisp.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/dislocation.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/dislocation.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/dislocation.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -23,6 +23,7 @@
 
 [dislocation.mesh_generator.reader]
 filename = box_tri3_100m.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/dislocation2.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/dislocation2.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/dislocation2.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -23,6 +23,7 @@
 
 [dislocation2.mesh_generator.reader]
 filename = box_tri3_100m.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/sheardisp.cfg
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/sheardisp.cfg	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/tests_auto/2d/tri3/sheardisp.cfg	2010-05-30 21:53:47 UTC (rev 16840)
@@ -26,6 +26,7 @@
 
 [sheardisp.mesh_generator.reader]
 filename = mesh.exo
+use_nodeset_names = False
 coordsys.space_dim = 2
 
 # ----------------------------------------------------------------------

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBC.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBC.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBC.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -120,6 +120,19 @@
 } // testInitialize
 
 // ----------------------------------------------------------------------
+// Test numDimConstrained().
+void
+pylith::bc::TestDirichletBC::testNumDimConstrained(void)
+{ // testNumDimConstrained
+  topology::Mesh mesh;
+  DirichletBC bc;
+  _initialize(&mesh, &bc);
+  CPPUNIT_ASSERT(0 != _data);
+
+  CPPUNIT_ASSERT_EQUAL(_data->numFixedDOF, bc.numDimConstrained());
+} // testNumDimConstrained
+
+// ----------------------------------------------------------------------
 // Test setConstraintSizes().
 void
 pylith::bc::TestDirichletBC::testSetConstraintSizes(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBC.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBC.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBC.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -60,6 +60,9 @@
   /// Test initialize().
   void testInitialize(void);
 
+  /// Test numDimConstrained().
+  void testNumDimConstrained(void);
+
   /// Test setConstraintSizes().
   void testSetConstraintSizes(void);
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCLine2.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCLine2.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCLine2.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,6 +38,7 @@
   CPPUNIT_TEST_SUB_SUITE( TestDirichletBCLine2, TestDirichletBC );
 
   CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testNumDimConstrained );
   CPPUNIT_TEST( testSetConstraintSizes );
   CPPUNIT_TEST( testSetConstraints );
   CPPUNIT_TEST( testSetField );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCLine2b.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCLine2b.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCLine2b.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -36,10 +36,13 @@
 
   // CPPUNIT TEST SUITE /////////////////////////////////////////////////
   CPPUNIT_TEST_SUB_SUITE( TestDirichletBCLine2b, TestDirichletBC );
+
   CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testNumDimConstrained );
   CPPUNIT_TEST( testSetConstraintSizes );
   CPPUNIT_TEST( testSetConstraints );
   CPPUNIT_TEST( testSetField );
+
   CPPUNIT_TEST_SUITE_END();
 
   // PUBLIC METHODS /////////////////////////////////////////////////////

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCQuad4.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCQuad4.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCQuad4.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,6 +38,7 @@
   CPPUNIT_TEST_SUB_SUITE( TestDirichletBCQuad4, TestDirichletBC );
 
   CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testNumDimConstrained );
   CPPUNIT_TEST( testSetConstraintSizes );
   CPPUNIT_TEST( testSetConstraints );
   CPPUNIT_TEST( testSetField );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCTet4.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCTet4.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCTet4.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,6 +38,7 @@
   CPPUNIT_TEST_SUB_SUITE( TestDirichletBCTet4, TestDirichletBC );
 
   CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testNumDimConstrained );
   CPPUNIT_TEST( testSetConstraintSizes );
   CPPUNIT_TEST( testSetConstraints );
   CPPUNIT_TEST( testSetField );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCTri3.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCTri3.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestDirichletBCTri3.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,6 +38,7 @@
   CPPUNIT_TEST_SUB_SUITE( TestDirichletBCTri3, TestDirichletBC );
 
   CPPUNIT_TEST( testInitialize );
+  CPPUNIT_TEST( testNumDimConstrained );
   CPPUNIT_TEST( testSetConstraintSizes );
   CPPUNIT_TEST( testSetConstraints );
   CPPUNIT_TEST( testSetField );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForce.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForce.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForce.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -131,10 +131,10 @@
 } // testInitialize
 
 // ----------------------------------------------------------------------
-// Test integrateResidualAssembled().
+// Test integrateResidual().
 void
-pylith::bc::TestPointForce::testIntegrateResidualAssembled(void)
-{ // testIntegrateResidualAssembled
+pylith::bc::TestPointForce::testIntegrateResidual(void)
+{ // testIntegrateResidual
   topology::Mesh mesh;
   PointForce bc;
   _initialize(&mesh, &bc);
@@ -150,7 +150,7 @@
   topology::SolutionFields fields(mesh);
 
   const double t = _data->tResidual;
-  bc.integrateResidualAssembled(residual, t, &fields);
+  bc.integrateResidual(residual, t, &fields);
 
   const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
   CPPUNIT_ASSERT(!sieveMesh.isNull());
@@ -174,7 +174,7 @@
       CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vals[i]/valsE[i], tolerance);
     else
       CPPUNIT_ASSERT_DOUBLES_EQUAL(valsE[i], vals[i], tolerance);
-} // testIntegrateResidualAssembled
+} // testIntegrateResidual
 
 // ----------------------------------------------------------------------
 // Test verifyConfiguration().

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForce.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForce.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForce.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -64,8 +64,8 @@
   /// Test initialize().
   void testInitialize(void);
 
-  /// Test integrateResidualAssembled().
-  void testIntegrateResidualAssembled(void);
+  /// Test integrateResidual().
+  void testIntegrateResidual(void);
 
   /// Test verifyConfiguration().
   void testVerifyConfiguration(void);

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceHex8.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceHex8.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceHex8.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,7 +38,7 @@
   CPPUNIT_TEST_SUB_SUITE( TestPointForceHex8, TestPointForce );
 
   CPPUNIT_TEST( testInitialize );
-  CPPUNIT_TEST( testIntegrateResidualAssembled );
+  CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testVerifyConfiguration );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceLine2.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceLine2.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceLine2.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,7 +38,7 @@
   CPPUNIT_TEST_SUB_SUITE( TestPointForceLine2, TestPointForce );
 
   CPPUNIT_TEST( testInitialize );
-  CPPUNIT_TEST( testIntegrateResidualAssembled );
+  CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testVerifyConfiguration );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceQuad4.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceQuad4.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceQuad4.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,7 +38,7 @@
   CPPUNIT_TEST_SUB_SUITE( TestPointForceQuad4, TestPointForce );
 
   CPPUNIT_TEST( testInitialize );
-  CPPUNIT_TEST( testIntegrateResidualAssembled );
+  CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testVerifyConfiguration );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceTet4.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceTet4.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceTet4.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,7 +38,7 @@
   CPPUNIT_TEST_SUB_SUITE( TestPointForceTet4, TestPointForce );
 
   CPPUNIT_TEST( testInitialize );
-  CPPUNIT_TEST( testIntegrateResidualAssembled );
+  CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testVerifyConfiguration );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceTri3.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceTri3.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/TestPointForceTri3.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -38,7 +38,7 @@
   CPPUNIT_TEST_SUB_SUITE( TestPointForceTri3, TestPointForce );
 
   CPPUNIT_TEST( testInitialize );
-  CPPUNIT_TEST( testIntegrateResidualAssembled );
+  CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testVerifyConfiguration );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/data/AbsorbingDampersDataTet4.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/data/AbsorbingDampersDataTet4.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/data/AbsorbingDampersDataTet4.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -18,10 +18,10 @@
 const int pylith::bc::AbsorbingDampersDataTet4::_numBasis = 3;
 const int pylith::bc::AbsorbingDampersDataTet4::_numQuadPts = 1;
 const double pylith::bc::AbsorbingDampersDataTet4::_quadPts[] = {
-  0.3333333333333333, 0.3333333333333333
+  -0.3333333333333333, -0.3333333333333333
 };
 const double pylith::bc::AbsorbingDampersDataTet4::_quadWts[] = {
-  0.5,
+  2.0,
 };
 const double pylith::bc::AbsorbingDampersDataTet4::_basis[] = {
   0.3333333333333333,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/data/NeumannDataTet4.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/data/NeumannDataTet4.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/bc/data/NeumannDataTet4.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -36,10 +36,10 @@
 const int pylith::bc::NeumannDataTet4::_numBasis = 3;
 const int pylith::bc::NeumannDataTet4::_numQuadPts = 1;
 const double pylith::bc::NeumannDataTet4::_quadPts[] = {
-  0.3333333333333333, 0.3333333333333333
+  -0.3333333333333333, -0.3333333333333333
 };
 const double pylith::bc::NeumannDataTet4::_quadWts[] = {
-  0.5,
+  2.0,
 };
 const double pylith::bc::NeumannDataTet4::_basis[] = {
   0.3333333333333333,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKin.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKin.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKin.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -252,95 +252,6 @@
   const ALE::Obj<RealSection>& residualSection = residual.section();
   CPPUNIT_ASSERT(!residualSection.isNull());
 
-  const ALE::Obj<RealSection>& dispSection = 
-    fields.get("disp(t)").section();
-  CPPUNIT_ASSERT(!dispSection.isNull());
-
-  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
-  CPPUNIT_ASSERT(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& vertices =
-    sieveMesh->depthStratum(0);
-  CPPUNIT_ASSERT(!vertices.isNull());
-  const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
-  const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-  int iVertex = 0;
-  for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
-       v_iter != verticesEnd;
-       ++v_iter, ++iVertex)
-    dispSection->updatePoint(*v_iter, &_data->fieldT[iVertex*spaceDim]);
-  
-  const double t = 2.134;
-  const double dt = 0.01;
-  fault.timeStep(dt);
-  { // Integrate residual with disp (as opposed to disp increment).
-    fault.useSolnIncr(false);
-    fault.integrateResidual(residual, t, &fields);
-
-    //residual.view("RESIDUAL"); // DEBUGGING
-
-    // Check values
-    iVertex = 0;
-    const int fiberDimE = spaceDim;
-    const double tolerance = 1.0e-06;
-    for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
-	 v_iter != verticesEnd;
-	 ++v_iter, ++iVertex) {
-      const int fiberDim = residualSection->getFiberDimension(*v_iter);
-      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
-      const double* vals = residualSection->restrictPoint(*v_iter);
-      CPPUNIT_ASSERT(0 != vals);
-      
-      for (int i=0; i < fiberDimE; ++i) {
-	const int index = iVertex*spaceDim+i;
-	const double valE = 0.0;
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
-      } // for
-    } // for
-  } // Integrate residual with disp (as opposed to disp increment).
-
-  residual.zero();
-  { // Integrate residual with disp increment.
-    fault.useSolnIncr(true);
-    fault.integrateResidual(residual, t, &fields);
-
-    //residual.view("RESIDUAL"); // DEBUGGING
-
-    // Check values
-    iVertex = 0;
-    const int fiberDimE = spaceDim;
-    const double tolerance = 1.0e-06;
-    for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
-	 v_iter != verticesEnd;
-	 ++v_iter, ++iVertex) {
-      const int fiberDim = residualSection->getFiberDimension(*v_iter);
-      CPPUNIT_ASSERT_EQUAL(fiberDimE, fiberDim);
-      const double* vals = residualSection->restrictPoint(*v_iter);
-      CPPUNIT_ASSERT(0 != vals);
-      
-      for (int i=0; i < fiberDimE; ++i) {
-	const int index = iVertex*spaceDim+i;
-	const double valE = 0.0;
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[i], tolerance);
-      } // for
-    } // for
-  } // Integrate residual with disp increment.
-} // testIntegrateResidual
-
-// ----------------------------------------------------------------------
-// Test integrateResidualAssembled().
-void
-pylith::faults::TestFaultCohesiveKin::testIntegrateResidualAssembled(void)
-{ // testIntegrateResidualAssembled
-  topology::Mesh mesh;
-  FaultCohesiveKin fault;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &fault, &fields);
-
-  const int spaceDim = _data->spaceDim;
-  topology::Field<topology::Mesh>& residual = fields.get("residual");
-  const ALE::Obj<RealSection>& residualSection = residual.section();
-  CPPUNIT_ASSERT(!residualSection.isNull());
-
   const ALE::Obj<RealSection>& dispSection = fields.get("disp(t)").section();
   CPPUNIT_ASSERT(!dispSection.isNull());
 
@@ -359,9 +270,10 @@
   const double t = 2.134;
   const double dt = 0.01;
   fault.timeStep(dt);
+
   { // Integrate residual with disp (as opposed to disp increment).
     fault.useSolnIncr(false);
-    fault.integrateResidualAssembled(residual, t, &fields);
+    fault.integrateResidual(residual, t, &fields);
 
     //residual.view("RESIDUAL"); // DEBUGGING
 
@@ -392,9 +304,9 @@
   residual.zero();
   { // Integrate residual with disp increment.
     fault.useSolnIncr(true);
-    fault.integrateResidualAssembled(residual, t, &fields);
+    fault.integrateResidual(residual, t, &fields);
 
-    //residual->view("RESIDUAL"); // DEBUGGING
+    //residual.view("RESIDUAL"); // DEBUGGING
 
     // Check values
     const double* valsE = _data->residualIncr;
@@ -419,7 +331,7 @@
       } // for
     } // for
   } // Integrate residual with disp increment.
-} // testIntegrateResidualAssembled
+} // testIntegrateResidual
 
 // ----------------------------------------------------------------------
 // Test integrateJacobian().
@@ -431,87 +343,7 @@
   topology::SolutionFields fields(mesh);
   _initialize(&mesh, &fault, &fields);
 
-  const ALE::Obj<RealSection>& dispSection = fields.get("disp(t)").section();
-  CPPUNIT_ASSERT(!dispSection.isNull());
-
   const int spaceDim = _data->spaceDim;
-  const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
-  CPPUNIT_ASSERT(!sieveMesh.isNull());
-  const ALE::Obj<SieveMesh::label_sequence>& vertices = sieveMesh->depthStratum(0);
-  CPPUNIT_ASSERT(!vertices.isNull());
-  const SieveMesh::label_sequence::iterator verticesBegin = vertices->begin();
-  const SieveMesh::label_sequence::iterator verticesEnd = vertices->end();
-  int iVertex = 0;
-  for (SieveMesh::label_sequence::iterator v_iter=verticesBegin;
-       v_iter != verticesEnd;
-       ++v_iter, ++iVertex) {
-    dispSection->updatePoint(*v_iter, &_data->fieldT[iVertex*spaceDim]);
-  } // for
-  
-  topology::Jacobian jacobian(fields.solution());
-
-  const double t = 2.134;
-  fault.integrateJacobian(&jacobian, t, &fields);
-  CPPUNIT_ASSERT_EQUAL(false, fault.needNewJacobian());
-
-  jacobian.assemble("final_assembly");
-
-  //MatView(jacobian, PETSC_VIEWER_STDOUT_WORLD); // DEBUGGING
-
-  const double* valsE = _data->jacobian;
-  const int nrowsE = dispSection->sizeWithBC();
-  const int ncolsE = nrowsE;
-
-  int nrows = 0;
-  int ncols = 0;
-  PetscMat jacobianMat = jacobian.matrix();
-  MatGetSize(jacobianMat, &nrows, &ncols);
-  CPPUNIT_ASSERT_EQUAL(nrowsE, nrows);
-  CPPUNIT_ASSERT_EQUAL(ncolsE, ncols);
-
-  PetscMat jDense;
-  PetscMat jSparseAIJ;
-  MatConvert(jacobianMat, MATSEQAIJ, MAT_INITIAL_MATRIX, &jSparseAIJ);
-  MatConvert(jSparseAIJ, MATSEQDENSE, MAT_INITIAL_MATRIX, &jDense);
-
-  double_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 double tolerance = 1.0e-06;
-  for (int iRow=0; iRow < nrows; ++iRow)
-    for (int iCol=0; iCol < ncols; ++iCol) {
-      const int index = ncols*iRow+iCol;
-      const double valE = 0.0;
-#if 0 // DEBUGGING
-      if (fabs(valE-vals[index]) > tolerance)
-	std::cout << "ERROR: iRow: " << iRow << ", iCol: " << iCol
-		  << "valE: " << valE
-		  << ", val: " << vals[index]
-		  << std::endl;
-#endif // DEBUGGING
-      CPPUNIT_ASSERT_DOUBLES_EQUAL(valE, vals[index], tolerance);
-    } // for
-  MatDestroy(jDense);
-  MatDestroy(jSparseAIJ);
-  CPPUNIT_ASSERT_EQUAL(false, fault.needNewJacobian());
-} // testIntegrateJacobian
-
-// ----------------------------------------------------------------------
-// Test integrateJacobianAssembled().
-void
-pylith::faults::TestFaultCohesiveKin::testIntegrateJacobianAssembled(void)
-{ // testIntegrateJacobianAssembled
-  topology::Mesh mesh;
-  FaultCohesiveKin fault;
-  topology::SolutionFields fields(mesh);
-  _initialize(&mesh, &fault, &fields);
-
-  const int spaceDim = _data->spaceDim;
   const ALE::Obj<RealSection>& dispSection = fields.get("disp(t)").section();
   CPPUNIT_ASSERT(!dispSection.isNull());
 
@@ -530,7 +362,7 @@
   topology::Jacobian jacobian(fields.solution());
 
   const double t = 2.134;
-  fault.integrateJacobianAssembled(&jacobian, t, &fields);
+  fault.integrateJacobian(&jacobian, t, &fields);
   CPPUNIT_ASSERT_EQUAL(false, fault.needNewJacobian());
 
   jacobian.assemble("final_assembly");
@@ -582,13 +414,13 @@
   MatDestroy(jDense);
   MatDestroy(jSparseAIJ);
   CPPUNIT_ASSERT_EQUAL(false, fault.needNewJacobian());
-} // testIntegrateJacobianAssembled
+} // testIntegrateJacobian
 
 // ----------------------------------------------------------------------
-// Test integrateJacobianAssembled() with lumped Jacobian.
+// Test integrateJacobian() with lumped Jacobian.
 void
-pylith::faults::TestFaultCohesiveKin::testIntegrateJacobianAssembledLumped(void)
-{ // testIntegrateJacobianAssembledLumped
+pylith::faults::TestFaultCohesiveKin::testIntegrateJacobianLumped(void)
+{ // testIntegrateJacobianLumped
   topology::Mesh mesh;
   FaultCohesiveKin fault;
   topology::SolutionFields fields(mesh);
@@ -601,7 +433,7 @@
   jacobian.allocate();
 
   const double t = 2.134;
-  fault.integrateJacobianAssembled(&jacobian, t, &fields);
+  fault.integrateJacobian(&jacobian, t, &fields);
   CPPUNIT_ASSERT_EQUAL(false, fault.needNewJacobian());
   jacobian.complete();
 
@@ -651,7 +483,7 @@
       CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, jacobianVertex[iDim],
 				   tolerance);
   } // for
-} // testIntegrateJacobianAssembledLumped
+} // testIntegrateJacobianLumped
 
 // ----------------------------------------------------------------------
 // Test adjustSolnLumped().
@@ -690,7 +522,6 @@
   topology::Field<topology::Mesh>& residual = fields.get("residual");
   fault.integrateResidual(residual, t, &fields);
   residual.complete();
-  fault.integrateResidualAssembled(residual, t, &fields);
 
   { // setup disp increment
     const ALE::Obj<RealSection>& dispIncrSection = fields.get("dispIncr(t->t+dt)").section();
@@ -721,8 +552,11 @@
   } // setup disp
   jacobian.complete();
 
-  const topology::Field<topology::Mesh>& solution = fields.get("dispIncr(t->t+dt)");
+  topology::Field<topology::Mesh>& solution = fields.get("dispIncr(t->t+dt)");
   fault.adjustSolnLumped(&fields, jacobian);
+  const topology::Field<topology::Mesh>& dispIncrAdj = 
+    fields.get("dispIncr adjust");
+  solution += dispIncrAdj;
 
   //solution.view("SOLUTION AFTER ADJUSTMENT"); // DEBUGGING
 
@@ -783,7 +617,7 @@
   const double dt = 0.01;
   fault.useSolnIncr(false);
   fault.timeStep(dt);
-  fault.integrateResidualAssembled(residual, t, &fields);
+  fault.integrateResidual(residual, t, &fields);
   fault.updateStateVars(t, &fields);
 
   CPPUNIT_ASSERT(0 != fault._faultMesh);
@@ -1103,6 +937,7 @@
   fields->add("residual", "residual");
   fields->add("disp(t)", "displacement");
   fields->add("dispIncr(t->t+dt)", "displacement_increment");
+  fields->add("dispIncr adjust", "displacement_adjust");
   fields->solutionName("dispIncr(t->t+dt)");
   
   const int spaceDim = _data->spaceDim;

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKin.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKin.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKin.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -92,18 +92,12 @@
   /// Test integrateResidual().
   void testIntegrateResidual(void);
 
-  /// Test integrateResidualAssembled().
-  void testIntegrateResidualAssembled(void);
-
   /// Test integrateJacobian().
   void testIntegrateJacobian(void);
 
-  /// Test integrateJacobianAssembled().
-  void testIntegrateJacobianAssembled(void);
+  /// Test integrateJacobian() with lumped Jacobian.
+  void testIntegrateJacobianLumped(void);
 
-  /// Test integrateJacobianAssembled() with lumped Jacobian.
-  void testIntegrateJacobianAssembledLumped(void);
-
   /// Test adjustSolnLumped().
   void testAdjustSolnLumped(void);
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinHex8.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinHex8.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinHex8.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -39,10 +39,8 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualAssembled );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testAdjustSolnLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinLine2.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinLine2.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinLine2.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -39,10 +39,8 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualAssembled );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testAdjustSolnLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinQuad4.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinQuad4.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinQuad4.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -39,10 +39,8 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualAssembled );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testAdjustSolnLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinQuad4e.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinQuad4e.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinQuad4e.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -40,8 +40,7 @@
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsHex8.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsHex8.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsHex8.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -40,8 +40,7 @@
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testCalcTractionsChange );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsLine2.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsLine2.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsLine2.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -41,8 +41,7 @@
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testCalcTractionsChange );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsQuad4.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsQuad4.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsQuad4.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -40,8 +40,7 @@
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testCalcTractionsChange );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsTet4.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsTet4.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsTet4.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -40,8 +40,7 @@
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testCalcTractionsChange );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsTri3.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsTri3.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinSrcsTri3.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -40,8 +40,7 @@
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testCalcTractionsChange );
 
   CPPUNIT_TEST_SUITE_END();

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -39,10 +39,8 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualAssembled );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testAdjustSolnLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4e.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4e.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4e.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -40,8 +40,7 @@
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4f.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4f.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTet4f.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -40,8 +40,7 @@
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTri3.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTri3.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTri3.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -39,10 +39,8 @@
 
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
-  CPPUNIT_TEST( testIntegrateResidualAssembled );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testAdjustSolnLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTri3d.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTri3d.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/TestFaultCohesiveKinTri3d.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -40,8 +40,7 @@
   CPPUNIT_TEST( testInitialize );
   CPPUNIT_TEST( testIntegrateResidual );
   CPPUNIT_TEST( testIntegrateJacobian );
-  CPPUNIT_TEST( testIntegrateJacobianAssembled );
-  CPPUNIT_TEST( testIntegrateJacobianAssembledLumped );
+  CPPUNIT_TEST( testIntegrateJacobianLumped );
   CPPUNIT_TEST( testUpdateStateVars );
   CPPUNIT_TEST( testCalcTractionsChange );
   CPPUNIT_TEST( testSplitField );

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveDynDataTet4.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveDynDataTet4.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveDynDataTet4.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -42,11 +42,11 @@
 const int pylith::faults::CohesiveDynDataTet4::_numQuadPts = 1;
 
 const double pylith::faults::CohesiveDynDataTet4::_quadPts[] = {
-  3.33333333e-01,  3.33333333e-01,
+  -3.33333333e-01,  -3.33333333e-01,
 };
 
 const double pylith::faults::CohesiveDynDataTet4::_quadWts[] = {
-  5.00000000e-01,
+  2.0,
 };
 
 const double pylith::faults::CohesiveDynDataTet4::_basis[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataQuad4e.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataQuad4e.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataQuad4e.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -176,9 +176,9 @@
  +6.1, +4.1, // 13
  +6.3, +4.3, // 15
  +6.5, +4.5, // 17
- -0.3, -0.3, // 16
-  0.8,  0.8, // 17
-  0.6,  0.6, // 18
+ -0.3+1.77538035254, -0.3+0.14794836271, // 16
+  0.8+1.89546413727,  0.8+0.08241148423, // 17
+  0.6+1.59887481971,  0.6+0.19186497837, // 18
 };
 
 const double pylith::faults::CohesiveKinDataQuad4e::_residualIncr[] = {
@@ -194,9 +194,9 @@
  +6.1, +4.1, // 13
  +6.3, +4.3, // 15
  +6.5, +4.5, // 17
- -0.3, -0.3, // 16
-  0.8,  0.8, // 17
-  0.6,  0.6, // 18
+ -0.3+1.77538035254, -0.3+0.14794836271, // 16
+  0.8+1.89546413727,  0.8+0.08241148423, // 17
+  0.6+1.59887481971,  0.6+0.19186497837, // 18
 };
 
 const double pylith::faults::CohesiveKinDataQuad4e::_jacobian[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -41,11 +41,11 @@
 const int pylith::faults::CohesiveKinDataTet4::_numQuadPts = 1;
 
 const double pylith::faults::CohesiveKinDataTet4::_quadPts[] = {
-  3.33333333e-01,  3.33333333e-01,
+  -3.33333333e-01,  -3.33333333e-01,
 };
 
 const double pylith::faults::CohesiveKinDataTet4::_quadWts[] = {
-  5.00000000e-01,
+  2.0,
 };
 
 const double pylith::faults::CohesiveKinDataTet4::_basis[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4e.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4e.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4e.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -41,11 +41,11 @@
 const int pylith::faults::CohesiveKinDataTet4e::_numQuadPts = 1;
 
 const double pylith::faults::CohesiveKinDataTet4e::_quadPts[] = {
-  3.33333333e-01,  3.33333333e-01,
+  -3.33333333e-01,  -3.33333333e-01,
 };
 
 const double pylith::faults::CohesiveKinDataTet4e::_quadWts[] = {
-  5.00000000e-01,
+  2.0,
 };
 
 const double pylith::faults::CohesiveKinDataTet4e::_basis[] = {
@@ -144,10 +144,10 @@
  -7.0, -3.0, -5.0, // 11
  -8.2, -4.2, -6.2, // 12
  -8.4, -4.4, -6.4, // 13
- -0.5, -0.5, -0.5, // 14
- -0.6, -0.6, -0.6, // 15
- -0.7, -0.7, -0.7, // 16
- -0.8, -0.8, -0.8, // 17
+ -0.5+1.82575588523, -0.5+-0.55566483464, -0.5+0.07938069066, // 14
+ -0.6+1.69682900001, -0.6+-0.56560966667, -0.6+0.14140241667, // 15
+ -0.7+1.51709826228, -0.7-0.54615537442, -0.7+0.18205179147, // 16
+ -0.8+1.29378670385, -0.8-0.49761027071, -0.8+0.19904410828, // 17
 };
 
 const double pylith::faults::CohesiveKinDataTet4e::_residualIncr[] = {
@@ -161,10 +161,10 @@
  -7.0, -3.0, -5.0, // 11
  -8.2, -4.2, -6.2, // 12
  -8.4, -4.4, -6.4, // 13
- -0.5, -0.5, -0.5, // 14
- -0.6, -0.6, -0.6, // 15
- -0.7, -0.7, -0.7, // 16
- -0.8, -0.8, -0.8, // 17
+ -0.5+1.82575588523, -0.5+-0.55566483464, -0.5+0.07938069066, // 14
+ -0.6+1.69682900001, -0.6+-0.56560966667, -0.6+0.14140241667, // 15
+ -0.7+1.51709826228, -0.7-0.54615537442, -0.7+0.18205179147, // 16
+ -0.8+1.29378670385, -0.8-0.49761027071, -0.8+0.19904410828, // 17
 };
 
 const double pylith::faults::CohesiveKinDataTet4e::_jacobian[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4f.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4f.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTet4f.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -41,11 +41,11 @@
 const int pylith::faults::CohesiveKinDataTet4f::_numQuadPts = 1;
 
 const double pylith::faults::CohesiveKinDataTet4f::_quadPts[] = {
-  3.33333333e-01,  3.33333333e-01,
+  -3.33333333e-01,  -3.33333333e-01,
 };
 
 const double pylith::faults::CohesiveKinDataTet4f::_quadWts[] = {
-  5.00000000e-01,
+  2.0,
 };
 
 const double pylith::faults::CohesiveKinDataTet4f::_basis[] = {
@@ -136,9 +136,9 @@
  +9.7, +7.7, +8.7, // 7
  +9.9, +7.9, +8.9, // 8
  +9.1, +7.1, +8.1, // 9
-  0.4,  0.4,  0.4, // 10
-  0.5,  0.5,  0.5, // 11
- -0.4, -0.4, -0.4, // 12
+  0.4+1.82575588523,  0.4+-0.55566483464,  0.4+0.07938069066, // 10
+  0.5+1.69682900001,  0.5+-0.56560966667,  0.5+0.14140241667, // 11
+ -0.4+1.51709826228, -0.4+-0.54615537442, -0.4+0.18205179147, // 12
 };
 
 const double pylith::faults::CohesiveKinDataTet4f::_residualIncr[] = {
@@ -150,9 +150,9 @@
  +9.7, +7.7, +8.7, // 7
  +9.9, +7.9, +8.9, // 8
  +9.1, +7.1, +8.1, // 9
-  0.4,  0.4,  0.4, // 10
-  0.5,  0.5,  0.5, // 11
- -0.4, -0.4, -0.4, // 12
+  0.4+1.82575588523,  0.4+-0.55566483464,  0.4+0.07938069066, // 10
+  0.5+1.69682900001,  0.5+-0.56560966667,  0.5+0.14140241667, // 11
+ -0.4+1.51709826228, -0.4+-0.54615537442, -0.4+0.18205179147, // 12
 };
 
 const double pylith::faults::CohesiveKinDataTet4f::_jacobian[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTri3d.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTri3d.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinDataTri3d.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -168,9 +168,9 @@
  +1.4142135623730949, +11.030865786510143, // 10
  +8.0, +6.0, // 11
  -7.2, +9.2, // 12
-  0.0, +0.70710678118654757, // 13
-  0.6, 0.6, // 14
- -0.6, 0.6, // 15
+  0.0+1.89546413727, +0.70710678118654757+0.08241148423, // 13
+  0.6+1.77538035254, 0.6+0.14794836271, // 14
+ -0.6+1.59887481971,  0.6+0.19186497837, // 15
 };
 
 const double pylith::faults::CohesiveKinDataTri3d::_residualIncr[] = {
@@ -183,9 +183,9 @@
  +1.4142135623730949, +11.030865786510143, // 10
  +8.0, +6.0, // 11
  -7.2, +9.2, // 12
-  0.0, +0.70710678118654757, // 13
-  0.6, 0.6, // 14
- -0.6, 0.6, // 15
+  0.0+1.89546413727, +0.70710678118654757+0.08241148423, // 13
+  0.6+1.77538035254, 0.6+0.14794836271, // 14
+ -0.6+1.59887481971,  0.6+0.19186497837, // 15
 };
 
 const double pylith::faults::CohesiveKinDataTri3d::_jacobian[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataHex8.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -176,10 +176,10 @@
  +9.6,+5.6,+7.6, // 15
  +9.8,+5.8,+7.8, // 16
  +9.0,+5.0,+7.0, // 17
-  0.8, 0.8, 0.8, // 18 (constraint)
-  0.9, 0.9, 0.9, // 19 (constraint)
-  1.0, 1.0, 1.0, // 20 (constraint)
-  1.1, 1.1, 1.1, // 21 (constraint)
+  0.8+1.82575588523+0.91680340354, 0.8+-0.55566483464-0.27902712282, 0.8+0.07938069066+0.03986101755, // 18 (constraint)
+  0.9+1.69682900001+0.62551316338, 0.9+-0.56560966667-0.20850438779, 0.9+0.14140241667+0.05212609695, // 19 (constraint)
+  1.0+1.51709826228+0.34903622931, 1.0+-0.54615537442-0.12565304255, 1.0+0.18205179147+0.04188434752, // 20 (constraint)
+  1.1+1.29378670385+0.12855127934, 1.1+-0.49761027071+-0.04944279975, 1.1+0.19904410828+0.01977711990, // 21 (constraint)
 };
 
 const double pylith::faults::CohesiveKinSrcsDataHex8::_residualIncr[] = {
@@ -199,10 +199,10 @@
  +9.6,+5.6,+7.6, // 15
  +9.8,+5.8,+7.8, // 16
  +9.0,+5.0,+7.0, // 17
-  0.8, 0.8, 0.8, // 18 (constraint)
-  0.9, 0.9, 0.9, // 19 (constraint)
-  1.0, 1.0, 1.0, // 20 (constraint)
-  1.1, 1.1, 1.1, // 21 (constraint)
+  0.8+1.82575588523+0.91680340354, 0.8+-0.55566483464-0.27902712282, 0.8+0.07938069066+0.03986101755, // 18 (constraint)
+  0.9+1.69682900001+0.62551316338, 0.9+-0.56560966667-0.20850438779, 0.9+0.14140241667+0.05212609695, // 19 (constraint)
+  1.0+1.51709826228+0.34903622931, 1.0+-0.54615537442-0.12565304255, 1.0+0.18205179147+0.04188434752, // 20 (constraint)
+  1.1+1.29378670385+0.12855127934, 1.1+-0.49761027071+-0.04944279975, 1.1+0.19904410828+0.01977711990, // 21 (constraint)
 };
 
 const double pylith::faults::CohesiveKinSrcsDataHex8::_jacobian[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataLine2.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -112,7 +112,7 @@
    7.5,
    0.0,
   -7.5,
-  -0.2
+  -0.2+1.89546413727+0.99414665414,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataLine2::_residual[] = {
@@ -120,7 +120,7 @@
    7.5,
    0.0,
   -7.5,
-  -0.2
+  -0.2+1.89546413727+0.99414665414,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataLine2::_jacobian[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataQuad4.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -145,8 +145,8 @@
   0.0,  0.0,
  -9.8, -8.8, // 8
  -9.0, -8.0, // 9
- -0.4, -0.4, // 10
- -0.5, -0.5, // 11
+ -0.4+1.77538035254+0.68377062865, -0.4+0.14794836271+0.05698088572, // 10
+ -0.5+1.89546413727+0.99414665414, -0.5+0.08241148423+0.04322376757, // 11
 };
 
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_residualIncr[] = {
@@ -158,8 +158,8 @@
   0.0,  0.0,
  -9.8, -8.8, // 8
  -9.0, -8.0, // 9
- -0.4, -0.4, // 10
- -0.5, -0.5, // 11
+ -0.4+1.77538035254+0.68377062865, -0.4+0.14794836271+0.05698088572, // 10
+ -0.5+1.89546413727+0.99414665414, -0.5+0.08241148423+0.04322376757, // 11
 };
 
 const double pylith::faults::CohesiveKinSrcsDataQuad4::_jacobian[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataTet4.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -41,11 +41,11 @@
 const int pylith::faults::CohesiveKinSrcsDataTet4::_numQuadPts = 1;
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_quadPts[] = {
-  3.33333333e-01,  3.33333333e-01,
+  -3.33333333e-01,  -3.33333333e-01,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_quadWts[] = {
-  5.00000000e-01,
+  2.0,
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_basis[] = {
@@ -136,9 +136,9 @@
  -9.7, -7.7, -8.7, // 7
  -9.9, -7.9, -8.9, // 4
  -9.1, -7.1, -8.1, // 5
- -0.4, -0.4, -0.4, // 10
- -0.5, -0.5, -0.5, // 11
-  0.4,  0.4,  0.4, // 12
+ -0.4+1.82575588523+0.91680340354, -0.4+-0.55566483464+-0.27902712282, -0.4+0.07938069066+0.03986101755, // 10
+ -0.5+1.69682900001+0.62551316338, -0.5+-0.56560966667+-0.20850438779, -0.5+0.14140241667+0.05212609695, // 11
+  0.4+1.51709826228+0.34903622931,  0.4+-0.54615537442+-0.12565304255,  0.4+0.18205179147+0.04188434752, // 12
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_residualIncr[] = {
@@ -150,9 +150,9 @@
  -9.7, -7.7, -8.7, // 7
  -9.9, -7.9, -8.9, // 4
  -9.1, -7.1, -8.1, // 5
- -0.4, -0.4, -0.4, // 10
- -0.5, -0.5, -0.5, // 11
-  0.4,  0.4,  0.4, // 12
+ -0.4+1.82575588523+0.91680340354, -0.4+-0.55566483464+-0.27902712282, -0.4+0.07938069066+0.03986101755, // 10
+ -0.5+1.69682900001+0.62551316338, -0.5+-0.56560966667+-0.20850438779, -0.5+0.14140241667+0.05212609695, // 11
+  0.4+1.51709826228+0.34903622931,  0.4+-0.54615537442+-0.12565304255,  0.4+0.18205179147+0.04188434752, // 12
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTet4::_jacobian[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/CohesiveKinSrcsDataTri3.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -155,8 +155,8 @@
   0.0,  0.0,
  +9.6, +8.6, // 6
  +9.8, +8.8, // 7
-  0.3,  0.3, // 8
-  0.4,  0.4, // 9
+  0.3+1.89546413727+0.99414665414,  0.3+0.08241148423+0.04322376757, // 8
+  0.4+1.77538035254+0.68377062865,  0.4+0.14794836271+0.05698088572, // 9
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTri3::_residualIncr[] = {
@@ -166,8 +166,8 @@
   0.0,  0.0,
  +9.6, +8.6, // 6
  +9.8, +8.8, // 7
-  0.3,  0.3, // 8
-  0.4,  0.4, // 9
+  0.3+1.89546413727+0.99414665414,  0.3+0.08241148423+0.04322376757, // 8
+  0.4+1.77538035254+0.68377062865,  0.4+0.14794836271+0.05698088572, // 9
 };
 
 const double pylith::faults::CohesiveKinSrcsDataTri3::_jacobian[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/slipth.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/slipth.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/faults/data/slipth.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -5,8 +5,8 @@
 
 slipMag = (finalSlip[0]**2+finalSlip[1]**2+finalSlip[2]**2)**0.5
 
-slipTime1 = 1.5
-slipTime2 = 1.5
+slipTime1 = 2.0
+slipTime2 = 0.7
 t = 2.134
 dt = 0.01
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/Makefile.am
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/Makefile.am	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/Makefile.am	2010-05-30 21:53:47 UTC (rev 16840)
@@ -59,6 +59,7 @@
 	TestElasticityExplicitGrav2DQuadratic.cc \
 	TestElasticityExplicitGrav3DLinear.cc \
 	TestElasticityExplicitGrav3DQuadratic.cc \
+	TestElasticityExplicitTri3.cc \
 	TestElasticityExplicitTet4.cc \
 	TestElasticityImplicit.cc \
 	TestElasticityImplicit1DLinear.cc \
@@ -119,6 +120,7 @@
 	TestElasticityExplicitGrav2DQuadratic.hh \
 	TestElasticityExplicitGrav3DLinear.hh \
 	TestElasticityExplicitGrav3DQuadratic.hh \
+	TestElasticityExplicitTri3.hh \
 	TestElasticityExplicitTet4.hh \
 	TestElasticityImplicit.hh \
 	TestElasticityImplicit1DLinear.hh \

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTet4.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTet4.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTet4.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -231,7 +231,7 @@
   const int size = residualSection->sizeWithBC();
   CPPUNIT_ASSERT_EQUAL(sizeE, size);
 
-#if 1 // DEBUGGING
+#if 0 // DEBUGGING
   residual.view("RESIDUAL");
   std::cout << "EXPECTED RESIDUAL" << std::endl;
   for (int i=0; i < size; ++i)

Copied: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTri3.cc (from rev 16839, short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTri3.cc)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTri3.cc	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTri3.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,536 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TestElasticityExplicitTri3.hh" // Implementation of class methods
+
+#include "pylith/feassemble/ElasticityExplicitTri3.hh" // USES ElasticityExplicitTri3
+#include "data/ElasticityExplicitData2DLinear.hh"
+#include "pylith/feassemble/GeometryTri2D.hh" // USES GeometryTri2D
+
+#include "pylith/materials/ElasticPlaneStrain.hh" // USES ElasticPlaneStrain
+#include "pylith/feassemble/Quadrature.hh" // USES Quadrature
+#include "pylith/topology/Mesh.hh" // USES Mesh
+#include "pylith/topology/SubMesh.hh" // USES SubMesh
+#include "pylith/topology/SolutionFields.hh" // USES SolutionFields
+#include "pylith/topology/Jacobian.hh" // USES Jacobian
+
+#include "spatialdata/geocoords/CSCart.hh" // USES CSCart
+#include "spatialdata/spatialdb/SimpleDB.hh" // USES SimpleDB
+#include "spatialdata/spatialdb/SimpleIOAscii.hh" // USES SimpleIOAscii
+#include "spatialdata/spatialdb/GravityField.hh" // USES GravityField
+#include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
+
+#include <math.h> // USES fabs()
+
+#include <stdexcept> // USES std::exception
+
+// ----------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( pylith::feassemble::TestElasticityExplicitTri3 );
+
+// ----------------------------------------------------------------------
+typedef pylith::topology::Mesh::SieveMesh SieveMesh;
+typedef pylith::topology::Mesh::RealSection RealSection;
+
+// ----------------------------------------------------------------------
+// Setup testing data.
+void
+pylith::feassemble::TestElasticityExplicitTri3::setUp(void)
+{ // setUp
+  _quadrature = new Quadrature<topology::Mesh>();
+  CPPUNIT_ASSERT(0 != _quadrature);
+  GeometryTri2D geometry;
+  _quadrature->refGeometry(&geometry);
+
+  _data = new ElasticityExplicitData2DLinear();
+  CPPUNIT_ASSERT(0 != _data);
+  _material = new materials::ElasticPlaneStrain;
+  CPPUNIT_ASSERT(0 != _material);
+  CPPUNIT_ASSERT_EQUAL(std::string("ElasticPlaneStrain"),
+		       std::string(_data->matType));
+  _gravityField = 0;
+} // setUp
+
+// ----------------------------------------------------------------------
+// Tear down testing data.
+void
+pylith::feassemble::TestElasticityExplicitTri3::tearDown(void)
+{ // tearDown
+  delete _data; _data = 0;
+  delete _quadrature; _quadrature = 0;
+  delete _material; _material = 0;
+  delete _gravityField; _gravityField = 0;
+} // tearDown
+
+// ----------------------------------------------------------------------
+// Test constructor.
+void
+pylith::feassemble::TestElasticityExplicitTri3::testConstructor(void)
+{ // testConstructor
+  ElasticityExplicitTri3 integrator;
+} // testConstructor
+
+// ----------------------------------------------------------------------
+// Test timeStep().
+void
+pylith::feassemble::TestElasticityExplicitTri3::testTimeStep(void)
+{ // testTimeStep
+  ElasticityExplicitTri3 integrator;
+
+  const double dt1 = 2.0;
+  integrator.timeStep(dt1);
+  CPPUNIT_ASSERT_EQUAL(dt1, integrator._dt);
+  integrator.timeStep(dt1);
+  CPPUNIT_ASSERT_EQUAL(dt1, integrator._dtm1);
+  CPPUNIT_ASSERT_EQUAL(dt1, integrator._dt);
+} // testTimeStep
+
+// ----------------------------------------------------------------------
+// Test material().
+void
+pylith::feassemble::TestElasticityExplicitTri3::testMaterial(void)
+{ // testMaterial
+  ElasticityExplicitTri3 integrator;
+
+  materials::ElasticPlaneStrain material;
+  const int id = 3;
+  const std::string label("my material");
+  material.id(id);
+  material.label(label.c_str());
+  integrator.material(&material);
+  CPPUNIT_ASSERT_EQUAL(id, integrator._material->id());
+  CPPUNIT_ASSERT_EQUAL(label, std::string(integrator._material->label()));
+  CPPUNIT_ASSERT_EQUAL(integrator._dt, integrator._material->timeStep());
+  const double dt = 2.0;
+  integrator.timeStep(dt);
+  CPPUNIT_ASSERT_EQUAL(dt, integrator._material->timeStep());
+} // testMaterial
+
+// ----------------------------------------------------------------------
+// Test needNewJacobian().
+void
+pylith::feassemble::TestElasticityExplicitTri3::testNeedNewJacobian(void)
+{ // testNeedNewJacobian
+  ElasticityExplicitTri3 integrator;
+
+  materials::ElasticPlaneStrain material;
+  integrator.material(&material);
+  CPPUNIT_ASSERT_EQUAL(true, integrator.needNewJacobian());
+  integrator._needNewJacobian = false;
+  CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());  
+} // 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)
+{ // testInitialize
+  CPPUNIT_ASSERT(0 != _data);
+
+  topology::Mesh mesh;
+  ElasticityExplicitTri3 integrator;
+  topology::SolutionFields fields(mesh);
+  _initialize(&mesh, &integrator, &fields);
+
+} // testInitialize
+
+// ----------------------------------------------------------------------
+// Test integrateResidual().
+void
+pylith::feassemble::TestElasticityExplicitTri3::testIntegrateResidual(void)
+{ // testIntegrateResidual
+  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 double t = 1.0;
+  integrator.integrateResidual(residual, t, &fields);
+
+  const double* valsE = _data->valsResidual;
+  const int sizeE = _data->spaceDim * _data->numVertices;
+
+  const ALE::Obj<RealSection>& residualSection = residual.section();
+  CPPUNIT_ASSERT(!residualSection.isNull());
+  const double* vals = residualSection->restrictSpace();
+  const int size = residualSection->sizeWithBC();
+  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 double 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);
+} // 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 double t = 1.0;
+  integrator.integrateResidualLumped(residual, t, &fields);
+
+  const double* valsE = _data->valsResidualLumped;
+  const int sizeE = _data->spaceDim * _data->numVertices;
+
+  const ALE::Obj<RealSection>& residualSection = residual.section();
+  CPPUNIT_ASSERT(!residualSection.isNull());
+  const double* vals = residualSection->restrictSpace();
+  const int size = residualSection->sizeWithBC();
+  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 double 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);
+} // testIntegrateResidualLumped
+
+// ----------------------------------------------------------------------
+// Test integrateJacobian().
+void
+pylith::feassemble::TestElasticityExplicitTri3::testIntegrateJacobian(void)
+{ // testIntegrateJacobian
+  CPPUNIT_ASSERT(0 != _data);
+
+  topology::Mesh mesh;
+  ElasticityExplicitTri3 integrator;
+  topology::SolutionFields fields(mesh);
+  _initialize(&mesh, &integrator, &fields);
+  integrator._needNewJacobian = true;
+
+  topology::Jacobian jacobian(fields.solution());
+
+  const double t = 1.0;
+  integrator.integrateJacobian(&jacobian, t, &fields);
+  CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());
+  jacobian.assemble("final_assembly");
+
+  const double* 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;
+  PetscMat jSparseAIJ;
+  MatConvert(jacobianMat, MATSEQAIJ, MAT_INITIAL_MATRIX, &jSparseAIJ);
+  MatConvert(jSparseAIJ, MATSEQDENSE, MAT_INITIAL_MATRIX, &jDense);
+
+  double_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 double 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);
+  MatDestroy(jSparseAIJ);
+} // 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);
+  jacobian.newSection(topology::FieldBase::VERTICES_FIELD, _data->spaceDim);
+  jacobian.allocate();
+
+  const double t = 1.0;
+  integrator.integrateJacobian(&jacobian, t, &fields);
+  CPPUNIT_ASSERT_EQUAL(false, integrator.needNewJacobian());
+  jacobian.complete();
+
+  const double* valsMatrixE = _data->valsJacobian;
+  const int sizeE = _data->numVertices * _data->spaceDim;
+  double_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;
+      double 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");
+  std::cout << "\n\nJACOBIAN FULL" << std::endl;
+  const int n = numBasis*spaceDim;
+  for (int i=0; i < n; ++i)
+    std::cout << "  " << valsE[i] << "\n";
+#endif // DEBUGGING
+
+  const ALE::Obj<RealSection>& jacobianSection = jacobian.section();
+  CPPUNIT_ASSERT(!jacobianSection.isNull());
+  const double* vals = jacobianSection->restrictSpace();
+  const int size = jacobianSection->sizeWithBC();
+  CPPUNIT_ASSERT_EQUAL(sizeE, size);
+
+  const double 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);
+} // testIntegrateJacobianLumped
+
+// ----------------------------------------------------------------------
+// Test updateStateVars().
+void 
+pylith::feassemble::TestElasticityExplicitTri3::testUpdateStateVars(void)
+{ // testUpdateStateVars
+  CPPUNIT_ASSERT(0 != _data);
+
+  topology::Mesh mesh;
+  ElasticityExplicitTri3 integrator;
+  topology::SolutionFields fields(mesh);
+  _initialize(&mesh, &integrator, &fields);
+
+  const double t = 1.0;
+  integrator.updateStateVars(t, &fields);
+} // testUpdateStateVars
+
+// ----------------------------------------------------------------------
+// Test StableTimeStep().
+void
+pylith::feassemble::TestElasticityExplicitTri3::testStableTimeStep(void)
+{ // testStableTimeStep
+  topology::Mesh mesh;
+  ElasticityExplicitTri3 integrator;
+  topology::SolutionFields fields(mesh);
+  _initialize(&mesh, &integrator, &fields);
+
+  const double stableTimeStep = integrator.stableTimeStep(mesh);
+  CPPUNIT_ASSERT_EQUAL(1.0e+30, stableTimeStep);
+} // testStableTimeStep
+
+// ----------------------------------------------------------------------
+// Initialize elasticity integrator.
+void
+pylith::feassemble::TestElasticityExplicitTri3::_initialize(
+					 topology::Mesh* mesh,
+					 ElasticityExplicitTri3* const integrator,
+					 topology::SolutionFields* fields)
+{ // _initialize
+  CPPUNIT_ASSERT(0 != mesh);
+  CPPUNIT_ASSERT(0 != integrator);
+  CPPUNIT_ASSERT(0 != _data);
+  CPPUNIT_ASSERT(0 != _quadrature);
+  CPPUNIT_ASSERT(0 != _material);
+
+  const int spaceDim = _data->spaceDim;
+  const double dt = _data->dt;
+
+  // Setup mesh
+  mesh->createSieveMesh(_data->cellDim);
+  const ALE::Obj<SieveMesh>& sieveMesh = mesh->sieveMesh();
+  CPPUNIT_ASSERT(!sieveMesh.isNull());
+  ALE::Obj<SieveMesh::sieve_type> sieve = 
+    new SieveMesh::sieve_type(mesh->comm());
+  CPPUNIT_ASSERT(!sieve.isNull());
+
+  // Cells and vertices
+  const bool interpolate = false;
+  ALE::Obj<ALE::Mesh::sieve_type> s = 
+    new ALE::Mesh::sieve_type(sieve->comm(), sieve->debug());
+  
+  ALE::SieveBuilder<ALE::Mesh>::buildTopology(s, 
+					      _data->cellDim, _data->numCells,
+                                              const_cast<int*>(_data->cells), 
+					      _data->numVertices,
+                                              interpolate, _data->numBasis);
+  std::map<ALE::Mesh::point_type,ALE::Mesh::point_type> renumbering;
+  ALE::ISieveConverter::convertSieve(*s, *sieve, renumbering);
+  sieveMesh->setSieve(sieve);
+  sieveMesh->stratify();
+  ALE::SieveBuilder<SieveMesh>::buildCoordinates(sieveMesh, spaceDim, 
+						 _data->vertices);
+
+  // Material ids
+  const ALE::Obj<SieveMesh::label_sequence>& cells = 
+    sieveMesh->heightStratum(0);
+  CPPUNIT_ASSERT(!cells.isNull());
+  const ALE::Obj<SieveMesh::label_type>& labelMaterials = 
+    sieveMesh->createLabel("material-id");
+  CPPUNIT_ASSERT(!labelMaterials.isNull());
+  int i = 0;
+  for(SieveMesh::label_sequence::iterator e_iter=cells->begin(); 
+      e_iter != cells->end();
+      ++e_iter)
+    sieveMesh->setValue(labelMaterials, *e_iter, _data->matId);
+
+  // Setup quadrature
+  _quadrature->initialize(_data->basis, _data->numQuadPts, _data->numBasis,
+			  _data->basisDerivRef, _data->numQuadPts,
+			  _data->numBasis, _data->cellDim,
+			  _data->quadPts, _data->numQuadPts, _data->cellDim,
+			  _data->quadWts, _data->numQuadPts,
+			  spaceDim);
+
+  spatialdata::units::Nondimensional normalizer;
+  spatialdata::geocoords::CSCart cs;
+  cs.setSpaceDim(spaceDim);
+  cs.initialize();
+  mesh->coordsys(&cs);
+  mesh->nondimensionalize(normalizer);
+
+  // Setup material
+  spatialdata::spatialdb::SimpleIOAscii iohandler;
+  iohandler.filename(_data->matDBFilename);
+  spatialdata::spatialdb::SimpleDB dbProperties;
+  dbProperties.ioHandler(&iohandler);
+  
+  _material->id(_data->matId);
+  _material->label(_data->matLabel);
+  _material->dbProperties(&dbProperties);
+  _material->normalizer(normalizer);
+
+  integrator->quadrature(_quadrature);
+  integrator->gravityField(_gravityField);
+  integrator->timeStep(_data->dt);
+  integrator->material(_material);
+  integrator->initialize(*mesh);
+
+  // Setup fields
+  CPPUNIT_ASSERT(0 != fields);
+  fields->add("residual", "residual");
+  fields->add("dispIncr(t->t+dt)", "displacement_increment");
+  fields->add("disp(t)", "displacement");
+  fields->add("disp(t-dt)", "displacement");
+  fields->add("acceleration(t)", "acceleration");
+  fields->solutionName("dispIncr(t->t+dt)");
+  
+  topology::Field<topology::Mesh>& residual = fields->get("residual");
+  residual.newSection(topology::FieldBase::VERTICES_FIELD, spaceDim);
+  residual.allocate();
+  residual.zero();
+  fields->copyLayout("residual");
+
+  const int fieldSize = spaceDim * _data->numVertices;
+  topology::Field<topology::Mesh>& dispIncr = fields->get("dispIncr(t->t+dt)");
+  topology::Field<topology::Mesh>& dispT = fields->get("disp(t)");
+  topology::Field<topology::Mesh>& dispTmdt = fields->get("disp(t-dt)");
+  const ALE::Obj<RealSection>& dispIncrSection = 
+    fields->get("dispIncr(t->t+dt)").section();
+  const ALE::Obj<RealSection>& dispTSection = 
+    fields->get("disp(t)").section();
+  const ALE::Obj<RealSection>& dispTmdtSection = 
+    fields->get("disp(t-dt)").section();
+  const ALE::Obj<RealSection>& accSection = 
+    fields->get("acceleration(t)").section();
+  CPPUNIT_ASSERT(!dispIncrSection.isNull());
+  CPPUNIT_ASSERT(!dispTSection.isNull());
+  CPPUNIT_ASSERT(!dispTmdtSection.isNull());
+  CPPUNIT_ASSERT(!accSection.isNull());
+
+  double_array accVertex(spaceDim);
+
+  const int offset = _data->numCells;
+  for (int iVertex=0; iVertex < _data->numVertices; ++iVertex) {
+    dispIncrSection->updatePoint(iVertex+offset, 
+				 &_data->fieldTIncr[iVertex*spaceDim]);
+    dispTSection->updatePoint(iVertex+offset, 
+			      &_data->fieldT[iVertex*spaceDim]);
+    dispTmdtSection->updatePoint(iVertex+offset, 
+				 &_data->fieldTmdt[iVertex*spaceDim]);
+
+    for (int iDim=0; iDim < spaceDim; ++iDim)
+      accVertex[iDim] = (_data->fieldTIncr[iVertex*spaceDim+iDim] -
+			 _data->fieldT[iVertex*spaceDim+iDim] +
+			 _data->fieldTmdt[iVertex*spaceDim+iDim]) / (dt*dt);
+    accSection->updatePoint(iVertex+offset, &accVertex[0]);
+  } // for
+} // _initialize
+
+
+// End of file 

Copied: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTri3.hh (from rev 16839, short/3D/PyLith/trunk/unittests/libtests/feassemble/TestElasticityExplicitTri3.hh)
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTri3.hh	                        (rev 0)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/TestElasticityExplicitTri3.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -0,0 +1,133 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/**
+ * @file unittests/libtests/feassemble/TestElasticityExplicitTri3.hh
+ *
+ * @brief C++ TestElasticityExplicitTri3 object
+ *
+ * C++ unit testing for ElasticityExplicitTri3.
+ */
+
+#if !defined(pylith_feassemble_testelasticityexplicittri3_hh)
+#define pylith_feassemble_testelasticityexplicittri3_hh
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include "pylith/feassemble/feassemblefwd.hh" // forward declarations
+#include "pylith/topology/topologyfwd.hh" // USES Mesh, SolutionFields
+#include "pylith/materials/materialsfwd.hh" // USES ElasticMaterial
+
+#include "spatialdata/spatialdb/spatialdbfwd.hh" // USES GravityField
+
+/// Namespace for pylith package
+namespace pylith {
+  namespace feassemble {
+    class TestElasticityExplicitTri3;
+    class ElasticityExplicitData;
+  } // feassemble
+} // pylith
+
+/// C++ unit testing for ElasticityExplicitTri3
+class pylith::feassemble::TestElasticityExplicitTri3 : public CppUnit::TestFixture
+{ // class TestElasticityExplicitTri3
+
+  // CPPUNIT TEST SUITE /////////////////////////////////////////////////
+  CPPUNIT_TEST_SUITE( TestElasticityExplicitTri3 );
+
+  CPPUNIT_TEST( testConstructor );
+  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 );
+
+  CPPUNIT_TEST_SUITE_END();
+
+  // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+  /// Setup testing data.
+  void setUp(void);
+
+  /// Tear down testing data.
+  void tearDown(void);
+
+  /// Test constructor.
+  void testConstructor(void);
+
+  /// Test timeStep().
+  void testTimeStep(void);
+
+  /// Test material().
+  void testMaterial(void);
+
+  /// 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);
+
+  /// Test StableTimeStep().
+  void testStableTimeStep(void);
+
+  // PROTECTED MEMBERS //////////////////////////////////////////////////
+protected :
+
+  ElasticityExplicitData* _data; ///< Data for testing.
+  materials::ElasticMaterial* _material; ///< Elastic material.
+  Quadrature<topology::Mesh>* _quadrature; ///< Quadrature information.
+  spatialdata::spatialdb::GravityField* _gravityField; ///< Gravity field.
+
+  // PRIVATE METHODS ////////////////////////////////////////////////////
+private :
+
+  /** Initialize elasticity integrator.
+   *
+   * @param mesh Finite-element mesh to initialize.
+   * @param integrator ElasticityIntegrator to initialize.
+   * @param fields Solution fields.
+   */
+  void _initialize(topology::Mesh* mesh,
+		   ElasticityExplicitTri3* const integrator,
+		   topology::SolutionFields* const fields);
+
+}; // class TestElasticityExplicitTri3
+
+#endif // pylith_feassemble_testelasticityexplicittri3_hh
+
+
+// End of file 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitData2DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -62,7 +62,7 @@
 };
 
 const double pylith::feassemble::ElasticityExplicitData2DLinear::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::ElasticityExplicitData2DLinear::_basis[] = {
@@ -94,42 +94,42 @@
 };
 
 const double pylith::feassemble::ElasticityExplicitData2DLinear::_valsResidual[] = {
- -1.66799924e+10,  3.09147184e+10,
- -2.30534754e+09, -2.72120571e+10,
-  1.89829337e+10, -3.70346338e+09,
+ -6.67199697e+10,  1.23658874e+11,
+ -9.22139015e+09, -1.08848229e+11,
+  7.59317348e+10, -1.48138535e+10,
 };
 
 const double pylith::feassemble::ElasticityExplicitData2DLinear::_valsJacobian[] = {
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
+  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 double pylith::feassemble::ElasticityExplicitData2DLinear::_valsResidualLumped[] = {
- -1.66797633e+10,  3.09149858e+10,
- -2.30569129e+09, -2.72130502e+10,
-  1.89830483e+10, -3.70273769e+09,
+ -6.67190530e+10,  1.23659943e+11,
+ -9.22276515e+09, -1.08852201e+11,
+  7.59321932e+10, -1.48109508e+10,
 };
 
 const double pylith::feassemble::ElasticityExplicitData2DLinear::_valsJacobianLumped[] = {
-  1.14583333e+06,  1.14583333e+06,
-  1.14583333e+06,  1.14583333e+06,
-  1.14583333e+06,  1.14583333e+06,
+  4.58333333e+06,  4.58333333e+06,
+  4.58333333e+06,  4.58333333e+06,
+  4.58333333e+06,  4.58333333e+06,
 };
 
 pylith::feassemble::ElasticityExplicitData2DLinear::ElasticityExplicitData2DLinear(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitData3DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -511,9 +511,9 @@
 
 const double pylith::feassemble::ElasticityExplicitData3DQuadratic::_valsJacobianLumped[] = {
   2.57903646e+06,  2.57903646e+06,  2.57903646e+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,
+  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,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitGravData2DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -62,7 +62,7 @@
 };
 
 const double pylith::feassemble::ElasticityExplicitGravData2DLinear::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::ElasticityExplicitGravData2DLinear::_basis[] = {
@@ -94,42 +94,42 @@
 };
 
 const double pylith::feassemble::ElasticityExplicitGravData2DLinear::_valsResidual[] = {
- -1.66799924e+10,  1.94563851e+10,
- -2.30534754e+09, -3.86703905e+10,
-  1.89829337e+10, -1.51617967e+10,
+ -6.67199697e+10,  7.78255404e+10,
+ -9.22139015e+09, -1.54681562e+11,
+  7.59317348e+10, -6.06471869e+10,
 };
 
 const double pylith::feassemble::ElasticityExplicitGravData2DLinear::_valsJacobian[] = {
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
+  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 double pylith::feassemble::ElasticityExplicitGravData2DLinear::_valsResidualLumped[] = {
- -1.66797633e+10,  1.94566525e+10,
- -2.30569129e+09, -3.86713835e+10,
-  1.89830483e+10, -1.51610710e+10,
+ -6.67190530e+10,  7.78266098e+10,
+ -9.22276515e+09, -1.54685534e+11,
+  7.59321932e+10, -6.06442841e+10,
 };
 
 const double pylith::feassemble::ElasticityExplicitGravData2DLinear::_valsJacobianLumped[] = {
-  1.14583333e+06,  1.14583333e+06,
-  1.14583333e+06,  1.14583333e+06,
-  1.14583333e+06,  1.14583333e+06,
+  4.58333333e+06,  4.58333333e+06,
+  4.58333333e+06,  4.58333333e+06,
+  4.58333333e+06,  4.58333333e+06,
 };
 
 pylith::feassemble::ElasticityExplicitGravData2DLinear::ElasticityExplicitGravData2DLinear(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitGravData3DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -511,9 +511,9 @@
 
 const double pylith::feassemble::ElasticityExplicitGravData3DQuadratic::_valsJacobianLumped[] = {
   2.57903646e+06,  2.57903646e+06,  2.57903646e+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,
+  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,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData2DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -62,7 +62,7 @@
 };
 
 const double pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_basis[] = {
@@ -94,42 +94,42 @@
 };
 
 const double pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_valsResidual[] = {
- -1.30908158e+11,  1.45826462e+11,
-  4.13431858e+10, -1.44671497e+11,
-  8.95625655e+10, -1.15576609e+09,
+ -5.23632630e+11,  5.83305846e+11,
+  1.65372743e+11, -5.78685990e+11,
+  3.58250262e+11, -4.62306437e+09,
 };
 
 const double pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_valsJacobian[] = {
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
+  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 double pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_valsResidualLumped[] = {
- -1.30907928e+11,  1.45826729e+11,
-  4.13428421e+10, -1.44672491e+11,
-  8.95626801e+10, -1.15504040e+09,
+ -5.23631714e+11,  5.83306915e+11,
+  1.65371368e+11, -5.78689962e+11,
+  3.58250720e+11, -4.62016160e+09,
 };
 
 const double pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::_valsJacobianLumped[] = {
-  1.14583333e+06,  1.14583333e+06,
-  1.14583333e+06,  1.14583333e+06,
-  1.14583333e+06,  1.14583333e+06,
+  4.58333333e+06,  4.58333333e+06,
+  4.58333333e+06,  4.58333333e+06,
+  4.58333333e+06,  4.58333333e+06,
 };
 
 pylith::feassemble::ElasticityExplicitLgDeformData2DLinear::ElasticityExplicitLgDeformData2DLinear(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformData3DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -511,9 +511,9 @@
 
 const double pylith::feassemble::ElasticityExplicitLgDeformData3DQuadratic::_valsJacobianLumped[] = {
   2.57903646e+06,  2.57903646e+06,  2.57903646e+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,
+  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,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData2DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -62,7 +62,7 @@
 };
 
 const double pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_basis[] = {
@@ -94,42 +94,42 @@
 };
 
 const double pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_valsResidual[] = {
- -1.30908158e+11,  1.34368128e+11,
-  4.13431858e+10, -1.56129831e+11,
-  8.95625655e+10, -1.26140994e+10,
+ -5.23632630e+11,  5.37472513e+11,
+  1.65372743e+11, -6.24519323e+11,
+  3.58250262e+11, -5.04563977e+10,
 };
 
 const double pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_valsJacobian[] = {
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  3.81944444e+05,  0.00000000e+00,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
-  0.00000000e+00,  3.81944444e+05,
+  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 double pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_valsResidualLumped[] = {
- -1.30907928e+11,  1.34368396e+11,
-  4.13428421e+10, -1.56130824e+11,
-  8.95626801e+10, -1.26133737e+10,
+ -5.23631714e+11,  5.37473582e+11,
+  1.65371368e+11, -6.24523296e+11,
+  3.58250720e+11, -5.04534949e+10,
 };
 
 const double pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::_valsJacobianLumped[] = {
-  1.14583333e+06,  1.14583333e+06,
-  1.14583333e+06,  1.14583333e+06,
-  1.14583333e+06,  1.14583333e+06,
+  4.58333333e+06,  4.58333333e+06,
+  4.58333333e+06,  4.58333333e+06,
+  4.58333333e+06,  4.58333333e+06,
 };
 
 pylith::feassemble::ElasticityExplicitLgDeformGravData2DLinear::ElasticityExplicitLgDeformGravData2DLinear(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityExplicitLgDeformGravData3DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -511,9 +511,9 @@
 
 const double pylith::feassemble::ElasticityExplicitLgDeformGravData3DQuadratic::_valsJacobianLumped[] = {
   2.57903646e+06,  2.57903646e+06,  2.57903646e+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,
+  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,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitData1DLinear.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitdata1dlinear_hh)
 #define pylith_feassemble_elasticityimplicitdata1dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitData1DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData1DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitdata1dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitdata1dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitData2DLinear.hh"
 
@@ -62,7 +62,7 @@
 };
 
 const double pylith::feassemble::ElasticityImplicitData2DLinear::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::ElasticityImplicitData2DLinear::_basis[] = {
@@ -94,30 +94,30 @@
 };
 
 const double pylith::feassemble::ElasticityImplicitData2DLinear::_valsResidual[] = {
- -2.62107244e+10,  7.10820313e+10,
- -7.87159091e+09, -6.58203125e+10,
-  3.40823153e+10, -5.26171875e+09,
+ -1.04842898e+11,  2.84328125e+11,
+ -3.14863636e+10, -2.63281250e+11,
+  1.36329261e+11, -2.10468750e+10,
 };
 
 const double pylith::feassemble::ElasticityImplicitData2DLinear::_valsJacobian[] = {
-  1.08927557e+10, -6.13991477e+09,
- -3.99715909e+09,  1.83948864e+09,
- -6.89559659e+09,  4.30042614e+09,
- -6.13991477e+09,  1.89893466e+10,
-  2.07386364e+09, -1.54673295e+10,
-  4.06605114e+09, -3.52201705e+09,
- -3.99715909e+09,  2.07386364e+09,
-  5.42045455e+09,  1.61931818e+09,
- -1.42329545e+09, -3.69318182e+09,
-  1.83948864e+09, -1.54673295e+10,
-  1.61931818e+09,  1.48664773e+10,
- -3.45880682e+09,  6.00852273e+08,
- -6.89559659e+09,  4.06605114e+09,
- -1.42329545e+09, -3.45880682e+09,
-  8.31889205e+09, -6.07244318e+08,
-  4.30042614e+09, -3.52201705e+09,
- -3.69318182e+09,  6.00852273e+08,
- -6.07244318e+08,  2.92116477e+09,
+  4.35710227e+10, -2.45596591e+10,
+ -1.59886364e+10,  7.35795455e+09,
+ -2.75823864e+10,  1.72017045e+10,
+ -2.45596591e+10,  7.59573864e+10,
+  8.29545455e+09, -6.18693182e+10,
+  1.62642045e+10, -1.40880682e+10,
+ -1.59886364e+10,  8.29545455e+09,
+  2.16818182e+10,  6.47727273e+09,
+ -5.69318182e+09, -1.47727273e+10,
+  7.35795455e+09, -6.18693182e+10,
+  6.47727273e+09,  5.94659091e+10,
+ -1.38352273e+10,  2.40340909e+09,
+ -2.75823864e+10,  1.62642045e+10,
+ -5.69318182e+09, -1.38352273e+10,
+  3.32755682e+10, -2.42897727e+09,
+  1.72017045e+10, -1.40880682e+10,
+ -1.47727273e+10,  2.40340909e+09,
+ -2.42897727e+09,  1.16846591e+10,
 };
 
 pylith::feassemble::ElasticityImplicitData2DLinear::ElasticityImplicitData2DLinear(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitdata2dlinear_hh)
 #define pylith_feassemble_elasticityimplicitdata2dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitData2DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData2DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitdata2dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitdata2dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitData3DLinear.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitdata3dlinear_hh)
 #define pylith_feassemble_elasticityimplicitdata3dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitData3DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitData3DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitdata3dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitdata3dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitGravData1DLinear.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitgravdata1dlinear_hh)
 #define pylith_feassemble_elasticityimplicitgravdata1dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitGravData1DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData1DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitgravdata1dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitgravdata1dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitGravData2DLinear.hh"
 
@@ -62,7 +62,7 @@
 };
 
 const double pylith::feassemble::ElasticityImplicitGravData2DLinear::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::ElasticityImplicitGravData2DLinear::_basis[] = {
@@ -94,30 +94,30 @@
 };
 
 const double pylith::feassemble::ElasticityImplicitGravData2DLinear::_valsResidual[] = {
- -2.62107244e+10,  5.96236979e+10,
- -7.87159091e+09, -7.72786458e+10,
-  3.40823153e+10, -1.67200521e+10,
+ -1.04842898e+11,  2.38494792e+11,
+ -3.14863636e+10, -3.09114583e+11,
+  1.36329261e+11, -6.68802083e+10,
 };
 
 const double pylith::feassemble::ElasticityImplicitGravData2DLinear::_valsJacobian[] = {
-  1.08927557e+10, -6.13991477e+09,
- -3.99715909e+09,  1.83948864e+09,
- -6.89559659e+09,  4.30042614e+09,
- -6.13991477e+09,  1.89893466e+10,
-  2.07386364e+09, -1.54673295e+10,
-  4.06605114e+09, -3.52201705e+09,
- -3.99715909e+09,  2.07386364e+09,
-  5.42045455e+09,  1.61931818e+09,
- -1.42329545e+09, -3.69318182e+09,
-  1.83948864e+09, -1.54673295e+10,
-  1.61931818e+09,  1.48664773e+10,
- -3.45880682e+09,  6.00852273e+08,
- -6.89559659e+09,  4.06605114e+09,
- -1.42329545e+09, -3.45880682e+09,
-  8.31889205e+09, -6.07244318e+08,
-  4.30042614e+09, -3.52201705e+09,
- -3.69318182e+09,  6.00852273e+08,
- -6.07244318e+08,  2.92116477e+09,
+  4.35710227e+10, -2.45596591e+10,
+ -1.59886364e+10,  7.35795455e+09,
+ -2.75823864e+10,  1.72017045e+10,
+ -2.45596591e+10,  7.59573864e+10,
+  8.29545455e+09, -6.18693182e+10,
+  1.62642045e+10, -1.40880682e+10,
+ -1.59886364e+10,  8.29545455e+09,
+  2.16818182e+10,  6.47727273e+09,
+ -5.69318182e+09, -1.47727273e+10,
+  7.35795455e+09, -6.18693182e+10,
+  6.47727273e+09,  5.94659091e+10,
+ -1.38352273e+10,  2.40340909e+09,
+ -2.75823864e+10,  1.62642045e+10,
+ -5.69318182e+09, -1.38352273e+10,
+  3.32755682e+10, -2.42897727e+09,
+  1.72017045e+10, -1.40880682e+10,
+ -1.47727273e+10,  2.40340909e+09,
+ -2.42897727e+09,  1.16846591e+10,
 };
 
 pylith::feassemble::ElasticityImplicitGravData2DLinear::ElasticityImplicitGravData2DLinear(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitgravdata2dlinear_hh)
 #define pylith_feassemble_elasticityimplicitgravdata2dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitGravData2DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData2DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitgravdata2dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitgravdata2dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitGravData3DLinear.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitgravdata3dlinear_hh)
 #define pylith_feassemble_elasticityimplicitgravdata3dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #include "ElasticityImplicitGravData3DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitGravData3DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticity.
+// This file was generated from python application elasticityapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitgravdata3dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitgravdata3dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformData1DLinear.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformdata1dlinear_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformdata1dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformData1DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData1DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformdata1dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformdata1dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformData2DLinear.hh"
 
@@ -62,7 +62,7 @@
 };
 
 const double pylith::feassemble::ElasticityImplicitLgDeformData2DLinear::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::ElasticityImplicitLgDeformData2DLinear::_basis[] = {
@@ -94,30 +94,30 @@
 };
 
 const double pylith::feassemble::ElasticityImplicitLgDeformData2DLinear::_valsResidual[] = {
- -3.65540787e+11,  1.05895913e+12,
-  9.00343192e+10, -1.09679715e+12,
-  2.75506468e+11,  3.78380237e+10,
+ -1.46216315e+12,  4.23583651e+12,
+  3.60137277e+11, -4.38718860e+12,
+  1.10202587e+12,  1.51352095e+11,
 };
 
 const double pylith::feassemble::ElasticityImplicitLgDeformData2DLinear::_valsJacobian[] = {
-  4.36313261e+11, -1.48699027e+11,
- -2.81223194e+11,  8.77736676e+10,
- -1.55090067e+11,  6.09253592e+10,
- -1.48699027e+11,  7.56519651e+11,
-  9.16706846e+10, -6.28762859e+11,
-  5.70283422e+10, -1.27756792e+11,
- -2.81223194e+11,  9.16706846e+10,
-  2.80835568e+11, -2.94466026e+10,
-  3.87626315e+08, -6.22240820e+10,
-  8.77736676e+10, -6.28762859e+11,
- -2.94466026e+10,  6.55682896e+11,
- -5.83270649e+10, -2.69200376e+10,
- -1.55090067e+11,  5.70283422e+10,
-  3.87626315e+08, -5.83270649e+10,
-  1.54702440e+11,  1.29872276e+09,
-  6.09253592e+10, -1.27756792e+11,
- -6.22240820e+10, -2.69200376e+10,
-  1.29872276e+09,  1.54676830e+11,
+  1.74525304e+12, -5.94796107e+11,
+ -1.12489278e+12,  3.51094670e+11,
+ -6.20360267e+11,  2.43701437e+11,
+ -5.94796107e+11,  3.02607860e+12,
+  3.66682739e+11, -2.51505144e+12,
+  2.28113369e+11, -5.11027168e+11,
+ -1.12489278e+12,  3.66682739e+11,
+  1.12334227e+12, -1.17786411e+11,
+  1.55050526e+09, -2.48896328e+11,
+  3.51094670e+11, -2.51505144e+12,
+ -1.17786411e+11,  2.62273159e+12,
+ -2.33308260e+11, -1.07680150e+11,
+ -6.20360267e+11,  2.28113369e+11,
+  1.55050526e+09, -2.33308260e+11,
+  6.18809761e+11,  5.19489106e+09,
+  2.43701437e+11, -5.11027168e+11,
+ -2.48896328e+11, -1.07680150e+11,
+  5.19489106e+09,  6.18707319e+11,
 };
 
 pylith::feassemble::ElasticityImplicitLgDeformData2DLinear::ElasticityImplicitLgDeformData2DLinear(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformdata2dlinear_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformdata2dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformData2DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData2DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformdata2dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformdata2dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformData3DLinear.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformdata3dlinear_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformdata3dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformData3DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformData3DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformdata3dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformdata3dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformGravData1DLinear.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformgravdata1dlinear_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformgravdata1dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformGravData1DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData1DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformgravdata1dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformgravdata1dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformGravData2DLinear.hh"
 
@@ -62,7 +62,7 @@
 };
 
 const double pylith::feassemble::ElasticityImplicitLgDeformGravData2DLinear::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::ElasticityImplicitLgDeformGravData2DLinear::_basis[] = {
@@ -94,30 +94,30 @@
 };
 
 const double pylith::feassemble::ElasticityImplicitLgDeformGravData2DLinear::_valsResidual[] = {
- -3.65540787e+11,  1.04750079e+12,
-  9.00343192e+10, -1.10825548e+12,
-  2.75506468e+11,  2.63796904e+10,
+ -1.46216315e+12,  4.19000317e+12,
+  3.60137277e+11, -4.43302194e+12,
+  1.10202587e+12,  1.05518761e+11,
 };
 
 const double pylith::feassemble::ElasticityImplicitLgDeformGravData2DLinear::_valsJacobian[] = {
-  4.36313261e+11, -1.48699027e+11,
- -2.81223194e+11,  8.77736676e+10,
- -1.55090067e+11,  6.09253592e+10,
- -1.48699027e+11,  7.56519651e+11,
-  9.16706846e+10, -6.28762859e+11,
-  5.70283422e+10, -1.27756792e+11,
- -2.81223194e+11,  9.16706846e+10,
-  2.80835568e+11, -2.94466026e+10,
-  3.87626315e+08, -6.22240820e+10,
-  8.77736676e+10, -6.28762859e+11,
- -2.94466026e+10,  6.55682896e+11,
- -5.83270649e+10, -2.69200376e+10,
- -1.55090067e+11,  5.70283422e+10,
-  3.87626315e+08, -5.83270649e+10,
-  1.54702440e+11,  1.29872276e+09,
-  6.09253592e+10, -1.27756792e+11,
- -6.22240820e+10, -2.69200376e+10,
-  1.29872276e+09,  1.54676830e+11,
+  1.74525304e+12, -5.94796107e+11,
+ -1.12489278e+12,  3.51094670e+11,
+ -6.20360267e+11,  2.43701437e+11,
+ -5.94796107e+11,  3.02607860e+12,
+  3.66682739e+11, -2.51505144e+12,
+  2.28113369e+11, -5.11027168e+11,
+ -1.12489278e+12,  3.66682739e+11,
+  1.12334227e+12, -1.17786411e+11,
+  1.55050526e+09, -2.48896328e+11,
+  3.51094670e+11, -2.51505144e+12,
+ -1.17786411e+11,  2.62273159e+12,
+ -2.33308260e+11, -1.07680150e+11,
+ -6.20360267e+11,  2.28113369e+11,
+  1.55050526e+09, -2.33308260e+11,
+  6.18809761e+11,  5.19489106e+09,
+  2.43701437e+11, -5.11027168e+11,
+ -2.48896328e+11, -1.07680150e+11,
+  5.19489106e+09,  6.18707319e+11,
 };
 
 pylith::feassemble::ElasticityImplicitLgDeformGravData2DLinear::ElasticityImplicitLgDeformGravData2DLinear(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformgravdata2dlinear_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformgravdata2dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformGravData2DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData2DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformgravdata2dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformgravdata2dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformGravData3DLinear.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DLinear.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DLinear.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DLinear.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformgravdata3dlinear_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformgravdata3dlinear_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #include "ElasticityImplicitLgDeformGravData3DQuadratic.hh"
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DQuadratic.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DQuadratic.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/ElasticityImplicitLgDeformGravData3DQuadratic.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -11,7 +11,7 @@
 //
 
 // DO NOT EDIT THIS FILE
-// This file was generated from python application integratorelasticitylgdeform.
+// This file was generated from python application elasticitylgdeformapp.
 
 #if !defined(pylith_feassemble_elasticityimplicitlgdeformgravdata3dquadratic_hh)
 #define pylith_feassemble_elasticityimplicitlgdeformgravdata3dquadratic_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/Quadrature2DLinear.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/Quadrature2DLinear.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/Quadrature2DLinear.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -67,7 +67,7 @@
     
     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([0.5], dtype=numpy.float64)
+    self.quadWts = numpy.array([2.0], dtype=numpy.float64)
     self.numBasis = 3
     self.numQuadPts = 1
     self.spaceDim = 2

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -44,20 +44,20 @@
 };
 
 const double pylith::feassemble::QuadratureData2DLinear::_quadPtsRef[] = {
-  3.33333333e-01,  3.33333333e-01,
+ -3.33333333e-01, -3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2DLinear::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::QuadratureData2DLinear::_quadPts[] = {
- -5.33333333e-01,  3.33333333e-01,
+ -1.66666667e-01, -3.33333333e-02,
 };
 
 const double pylith::feassemble::QuadratureData2DLinear::_basis[] = {
- -3.33333333e-01,  6.66666667e-01,
-  6.66666667e-01,};
+  3.33333333e-01,  3.33333333e-01,
+  3.33333333e-01,};
 
 const double pylith::feassemble::QuadratureData2DLinear::_basisDerivRef[] = {
  -5.00000000e-01, -5.00000000e-01,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -25,7 +25,7 @@
 
 const int pylith::feassemble::QuadratureData2DQuadratic::_numBasis = 6;
 
-const int pylith::feassemble::QuadratureData2DQuadratic::_numQuadPts = 3;
+const int pylith::feassemble::QuadratureData2DQuadratic::_numQuadPts = 6;
 
 const double pylith::feassemble::QuadratureData2DQuadratic::_vertices[] = {
  -1.00000000e+00, -1.00000000e+00,
@@ -50,35 +50,68 @@
 };
 
 const double pylith::feassemble::QuadratureData2DQuadratic::_quadPtsRef[] = {
+ -7.50000000e-01, -7.50000000e-01,
+  7.50000000e-01, -7.50000000e-01,
+ -7.50000000e-01,  7.50000000e-01,
   0.00000000e+00, -7.50000000e-01,
  -7.50000000e-01,  0.00000000e+00,
- -7.50000000e-01, -7.50000000e-01,
+  2.50000000e-01,  2.50000000e-01,
 };
 
 const double pylith::feassemble::QuadratureData2DQuadratic::_quadWts[] = {
-  6.66666667e-01,  6.66666667e-01,  6.66666667e-01,
+  3.33333333e-01,  3.33333333e-01,  3.33333333e-01,  3.33333333e-01,  3.33333333e-01,  3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2DQuadratic::_quadPts[] = {
+ -8.12500000e-01, -6.62500000e-01,
+  6.87500000e-01,  2.37500000e-01,
+ -1.18750000e+00,  4.62500000e-01,
  -6.25000000e-02, -2.12500000e-01,
  -1.00000000e+00, -1.00000000e-01,
- -8.12500000e-01, -6.62500000e-01,
+ -6.25000000e-02,  6.87500000e-01,
 };
 
 const double pylith::feassemble::QuadratureData2DQuadratic::_basis[] = {
+  3.75000000e-01, -9.37500000e-02,
+ -9.37500000e-02,  6.25000000e-02,
+  3.75000000e-01,  3.75000000e-01,
+  0.00000000e+00,  6.56250000e-01,
+ -9.37500000e-02,  4.37500000e-01,
+ -0.00000000e+00, -0.00000000e+00,
+  0.00000000e+00, -9.37500000e-02,
+  6.56250000e-01,  4.37500000e-01,
+ -0.00000000e+00, -0.00000000e+00,
  -9.37500000e-02,  0.00000000e+00,
  -9.37500000e-02,  2.50000000e-01,
   1.87500000e-01,  7.50000000e-01,
  -9.37500000e-02, -9.37500000e-02,
   0.00000000e+00,  2.50000000e-01,
   7.50000000e-01,  1.87500000e-01,
-  3.75000000e-01, -9.37500000e-02,
- -9.37500000e-02,  6.25000000e-02,
-  3.75000000e-01,  3.75000000e-01,
+  3.75000000e-01,  1.56250000e-01,
+  1.56250000e-01,  1.56250000e+00,
+ -6.25000000e-01, -6.25000000e-01,
 };
 
 const double pylith::feassemble::QuadratureData2DQuadratic::_basisDerivRef[] = {
+ -1.00000000e+00, -1.00000000e+00,
+ -2.50000000e-01,  0.00000000e+00,
+  0.00000000e+00, -2.50000000e-01,
+  2.50000000e-01,  2.50000000e-01,
+ -2.50000000e-01,  1.25000000e+00,
+  1.25000000e+00, -2.50000000e-01,
+  5.00000000e-01,  5.00000000e-01,
+  1.25000000e+00,  0.00000000e+00,
+  0.00000000e+00, -2.50000000e-01,
+  2.50000000e-01,  1.75000000e+00,
  -2.50000000e-01, -2.50000000e-01,
+ -1.75000000e+00, -1.75000000e+00,
+  5.00000000e-01,  5.00000000e-01,
+ -2.50000000e-01,  0.00000000e+00,
+  0.00000000e+00,  1.25000000e+00,
+  1.75000000e+00,  2.50000000e-01,
+ -1.75000000e+00, -1.75000000e+00,
+ -2.50000000e-01, -2.50000000e-01,
+ -2.50000000e-01, -2.50000000e-01,
   5.00000000e-01,  0.00000000e+00,
   0.00000000e+00, -2.50000000e-01,
   2.50000000e-01,  1.00000000e+00,
@@ -90,16 +123,34 @@
   1.00000000e+00,  2.50000000e-01,
  -1.00000000e+00, -2.50000000e-01,
   5.00000000e-01, -2.50000000e-01,
- -1.00000000e+00, -1.00000000e+00,
- -2.50000000e-01,  0.00000000e+00,
-  0.00000000e+00, -2.50000000e-01,
-  2.50000000e-01,  2.50000000e-01,
- -2.50000000e-01,  1.25000000e+00,
-  1.25000000e+00, -2.50000000e-01,
+  1.00000000e+00,  1.00000000e+00,
+  7.50000000e-01,  0.00000000e+00,
+  0.00000000e+00,  7.50000000e-01,
+  1.25000000e+00,  1.25000000e+00,
+ -1.25000000e+00, -1.75000000e+00,
+ -1.75000000e+00, -1.25000000e+00,
 };
 
 const double pylith::feassemble::QuadratureData2DQuadratic::_basisDeriv[] = {
+ -1.66666667e-01, -1.38888889e+00,
+ -2.08333333e-01, -6.94444444e-02,
+  1.66666667e-01, -2.77777778e-01,
+  4.16666667e-02,  3.47222222e-01,
+ -1.04166667e+00,  1.31944444e+00,
+  1.20833333e+00,  6.94444444e-02,
+  8.33333333e-02,  6.94444444e-01,
+  1.04166667e+00,  3.47222222e-01,
+  1.66666667e-01, -2.77777778e-01,
+ -9.58333333e-01,  2.01388889e+00,
  -4.16666667e-02, -3.47222222e-01,
+ -2.91666667e-01, -2.43055556e+00,
+  8.33333333e-02,  6.94444444e-01,
+ -2.08333333e-01, -6.94444444e-02,
+ -8.33333333e-01,  1.38888889e+00,
+  1.29166667e+00,  7.63888889e-01,
+ -2.91666667e-01, -2.43055556e+00,
+ -4.16666667e-02, -3.47222222e-01,
+ -4.16666667e-02, -3.47222222e-01,
   4.16666667e-01,  1.38888889e-01,
   1.66666667e-01, -2.77777778e-01,
  -4.58333333e-01,  1.18055556e+00,
@@ -111,12 +162,12 @@
   6.66666667e-01,  5.55555556e-01,
  -6.66666667e-01, -5.55555556e-01,
   5.83333333e-01, -1.38888889e-01,
- -1.66666667e-01, -1.38888889e+00,
- -2.08333333e-01, -6.94444444e-02,
-  1.66666667e-01, -2.77777778e-01,
-  4.16666667e-02,  3.47222222e-01,
- -1.04166667e+00,  1.31944444e+00,
-  1.20833333e+00,  6.94444444e-02,
+  1.66666667e-01,  1.38888889e+00,
+  6.25000000e-01,  2.08333333e-01,
+ -5.00000000e-01,  8.33333333e-01,
+  2.08333333e-01,  1.73611111e+00,
+  1.25000000e-01, -2.29166667e+00,
+ -6.25000000e-01, -1.87500000e+00,
 };
 
 const double pylith::feassemble::QuadratureData2DQuadratic::_jacobian[] = {
@@ -126,10 +177,16 @@
   6.00000000e-01,  7.50000000e-01,
   1.00000000e+00, -2.50000000e-01,
   6.00000000e-01,  7.50000000e-01,
+  1.00000000e+00, -2.50000000e-01,
+  6.00000000e-01,  7.50000000e-01,
+  1.00000000e+00, -2.50000000e-01,
+  6.00000000e-01,  7.50000000e-01,
+  1.00000000e+00, -2.50000000e-01,
+  6.00000000e-01,  7.50000000e-01,
 };
 
 const double pylith::feassemble::QuadratureData2DQuadratic::_jacobianDet[] = {
-  9.00000000e-01,  9.00000000e-01,  9.00000000e-01,
+  9.00000000e-01,  9.00000000e-01,  9.00000000e-01,  9.00000000e-01,  9.00000000e-01,  9.00000000e-01,
 };
 
 const double pylith::feassemble::QuadratureData2DQuadratic::_jacobianInv[] = {
@@ -139,6 +196,12 @@
  -6.66666667e-01,  1.11111111e+00,
   8.33333333e-01,  2.77777778e-01,
  -6.66666667e-01,  1.11111111e+00,
+  8.33333333e-01,  2.77777778e-01,
+ -6.66666667e-01,  1.11111111e+00,
+  8.33333333e-01,  2.77777778e-01,
+ -6.66666667e-01,  1.11111111e+00,
+  8.33333333e-01,  2.77777778e-01,
+ -6.66666667e-01,  1.11111111e+00,
 };
 
 pylith::feassemble::QuadratureData2DQuadratic::QuadratureData2DQuadratic(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXY.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXY.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXY.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -44,20 +44,20 @@
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXY::_quadPtsRef[] = {
-  3.33333333e-01,  3.33333333e-01,
+ -3.33333333e-01, -3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXY::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXY::_quadPts[] = {
- -6.66666667e-01,  0.00000000e+00,  6.66666667e-01,
+ -3.33333333e-01,  0.00000000e+00,  3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXY::_basis[] = {
- -3.33333333e-01,  6.66666667e-01,
-  6.66666667e-01,};
+  3.33333333e-01,  3.33333333e-01,
+  3.33333333e-01,};
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXY::_basisDerivRef[] = {
  -5.00000000e-01, -5.00000000e-01,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXYZ.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXYZ.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXYZ.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -44,20 +44,20 @@
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXYZ::_quadPtsRef[] = {
-  3.33333333e-01,  3.33333333e-01,
+ -3.33333333e-01, -3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXYZ::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXYZ::_quadPts[] = {
- -6.66666667e-01,  0.00000000e+00,  6.66666667e-01,
+ -3.33333333e-01,  0.00000000e+00,  3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXYZ::_basis[] = {
- -3.33333333e-01,  6.66666667e-01,
-  6.66666667e-01,};
+  3.33333333e-01,  3.33333333e-01,
+  3.33333333e-01,};
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXYZ::_basisDerivRef[] = {
  -5.00000000e-01, -5.00000000e-01,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXZ.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXZ.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearXZ.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -44,20 +44,20 @@
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXZ::_quadPtsRef[] = {
-  3.33333333e-01,  3.33333333e-01,
+ -3.33333333e-01, -3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXZ::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXZ::_quadPts[] = {
- -6.66666667e-01,  0.00000000e+00,  6.66666667e-01,
+ -3.33333333e-01,  0.00000000e+00,  3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXZ::_basis[] = {
- -3.33333333e-01,  6.66666667e-01,
-  6.66666667e-01,};
+  3.33333333e-01,  3.33333333e-01,
+  3.33333333e-01,};
 
 const double pylith::feassemble::QuadratureData2Din3DLinearXZ::_basisDerivRef[] = {
  -5.00000000e-01, -5.00000000e-01,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearYZ.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearYZ.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DLinearYZ.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -44,20 +44,20 @@
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearYZ::_quadPtsRef[] = {
-  3.33333333e-01,  3.33333333e-01,
+ -3.33333333e-01, -3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearYZ::_quadWts[] = {
-  5.00000000e-01,
+  2.00000000e+00,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearYZ::_quadPts[] = {
-  0.00000000e+00,  6.66666667e-01,  6.66666667e-01,
+  0.00000000e+00,  3.33333333e-01,  3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DLinearYZ::_basis[] = {
- -3.33333333e-01,  6.66666667e-01,
-  6.66666667e-01,};
+  3.33333333e-01,  3.33333333e-01,
+  3.33333333e-01,};
 
 const double pylith::feassemble::QuadratureData2Din3DLinearYZ::_basisDerivRef[] = {
  -5.00000000e-01, -5.00000000e-01,

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DQuadratic.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DQuadratic.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData2Din3DQuadratic.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -25,7 +25,7 @@
 
 const int pylith::feassemble::QuadratureData2Din3DQuadratic::_numBasis = 6;
 
-const int pylith::feassemble::QuadratureData2Din3DQuadratic::_numQuadPts = 3;
+const int pylith::feassemble::QuadratureData2Din3DQuadratic::_numQuadPts = 6;
 
 const double pylith::feassemble::QuadratureData2Din3DQuadratic::_vertices[] = {
   2.00000000e+00, -5.00000000e-01, -5.00000000e-01,
@@ -50,35 +50,68 @@
 };
 
 const double pylith::feassemble::QuadratureData2Din3DQuadratic::_quadPtsRef[] = {
+ -7.50000000e-01, -7.50000000e-01,
+  7.50000000e-01, -7.50000000e-01,
+ -7.50000000e-01,  7.50000000e-01,
   0.00000000e+00, -7.50000000e-01,
  -7.50000000e-01,  0.00000000e+00,
- -7.50000000e-01, -7.50000000e-01,
+  2.50000000e-01,  2.50000000e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DQuadratic::_quadWts[] = {
-  6.66666667e-01,  6.66666667e-01,  6.66666667e-01,
+  3.33333333e-01,  3.33333333e-01,  3.33333333e-01,  3.33333333e-01,  3.33333333e-01,  3.33333333e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DQuadratic::_quadPts[] = {
+  1.50000000e+00,  0.00000000e+00, -1.25000000e-01,
+  3.75000000e-01,  2.62500000e+00,  2.50000000e-01,
+ -3.75000000e-01,  3.75000000e-01,  1.75000000e+00,
   9.37500000e-01,  1.31250000e+00,  6.25000000e-02,
   5.62500000e-01,  1.87500000e-01,  8.12500000e-01,
-  1.50000000e+00,  0.00000000e+00, -1.25000000e-01,
+ -5.00000000e-01,  2.00000000e+00,  1.37500000e+00,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DQuadratic::_basis[] = {
+  3.75000000e-01, -9.37500000e-02,
+ -9.37500000e-02,  6.25000000e-02,
+  3.75000000e-01,  3.75000000e-01,
+  0.00000000e+00,  6.56250000e-01,
+ -9.37500000e-02,  4.37500000e-01,
+ -0.00000000e+00, -0.00000000e+00,
+  0.00000000e+00, -9.37500000e-02,
+  6.56250000e-01,  4.37500000e-01,
+ -0.00000000e+00, -0.00000000e+00,
  -9.37500000e-02,  0.00000000e+00,
  -9.37500000e-02,  2.50000000e-01,
   1.87500000e-01,  7.50000000e-01,
  -9.37500000e-02, -9.37500000e-02,
   0.00000000e+00,  2.50000000e-01,
   7.50000000e-01,  1.87500000e-01,
-  3.75000000e-01, -9.37500000e-02,
- -9.37500000e-02,  6.25000000e-02,
-  3.75000000e-01,  3.75000000e-01,
+  3.75000000e-01,  1.56250000e-01,
+  1.56250000e-01,  1.56250000e+00,
+ -6.25000000e-01, -6.25000000e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DQuadratic::_basisDerivRef[] = {
+ -1.00000000e+00, -1.00000000e+00,
+ -2.50000000e-01,  0.00000000e+00,
+  0.00000000e+00, -2.50000000e-01,
+  2.50000000e-01,  2.50000000e-01,
+ -2.50000000e-01,  1.25000000e+00,
+  1.25000000e+00, -2.50000000e-01,
+  5.00000000e-01,  5.00000000e-01,
+  1.25000000e+00,  0.00000000e+00,
+  0.00000000e+00, -2.50000000e-01,
+  2.50000000e-01,  1.75000000e+00,
  -2.50000000e-01, -2.50000000e-01,
+ -1.75000000e+00, -1.75000000e+00,
+  5.00000000e-01,  5.00000000e-01,
+ -2.50000000e-01,  0.00000000e+00,
+  0.00000000e+00,  1.25000000e+00,
+  1.75000000e+00,  2.50000000e-01,
+ -1.75000000e+00, -1.75000000e+00,
+ -2.50000000e-01, -2.50000000e-01,
+ -2.50000000e-01, -2.50000000e-01,
   5.00000000e-01,  0.00000000e+00,
   0.00000000e+00, -2.50000000e-01,
   2.50000000e-01,  1.00000000e+00,
@@ -90,16 +123,34 @@
   1.00000000e+00,  2.50000000e-01,
  -1.00000000e+00, -2.50000000e-01,
   5.00000000e-01, -2.50000000e-01,
- -1.00000000e+00, -1.00000000e+00,
- -2.50000000e-01,  0.00000000e+00,
-  0.00000000e+00, -2.50000000e-01,
-  2.50000000e-01,  2.50000000e-01,
- -2.50000000e-01,  1.25000000e+00,
-  1.25000000e+00, -2.50000000e-01,
+  1.00000000e+00,  1.00000000e+00,
+  7.50000000e-01,  0.00000000e+00,
+  0.00000000e+00,  7.50000000e-01,
+  1.25000000e+00,  1.25000000e+00,
+ -1.25000000e+00, -1.75000000e+00,
+ -1.75000000e+00, -1.25000000e+00,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DQuadratic::_basisDeriv[] = {
+  7.50000000e-01, -2.50000000e-01, -7.05882353e-01,
+ -3.12500000e-02, -1.56250000e-01,  2.94117647e-02,
+  2.18750000e-01,  9.37500000e-02, -2.05882353e-01,
+ -1.87500000e-01,  6.25000000e-02,  1.76470588e-01,
+ -1.12500000e+00, -6.25000000e-01,  1.05882353e+00,
+  3.75000000e-01,  8.75000000e-01, -3.52941176e-01,
+ -3.75000000e-01,  1.25000000e-01,  3.52941176e-01,
+  1.56250000e-01,  7.81250000e-01, -1.47058824e-01,
+  2.18750000e-01,  9.37500000e-02, -2.05882353e-01,
+ -1.50000000e+00, -5.00000000e-01,  1.41176471e+00,
   1.87500000e-01, -6.25000000e-02, -1.76470588e-01,
+  1.31250000e+00, -4.37500000e-01, -1.23529412e+00,
+ -3.75000000e-01,  1.25000000e-01,  3.52941176e-01,
+ -3.12500000e-02, -1.56250000e-01,  2.94117647e-02,
+ -1.09375000e+00, -4.68750000e-01,  1.02941176e+00,
+  0.00000000e+00,  1.00000000e+00,  2.77555756e-17,
+  1.31250000e+00, -4.37500000e-01, -1.23529412e+00,
+  1.87500000e-01, -6.25000000e-02, -1.76470588e-01,
+  1.87500000e-01, -6.25000000e-02, -1.76470588e-01,
   6.25000000e-02,  3.12500000e-01, -5.88235294e-02,
   2.18750000e-01,  9.37500000e-02, -2.05882353e-01,
  -8.43750000e-01, -2.18750000e-01,  7.94117647e-01,
@@ -111,12 +162,12 @@
  -9.37500000e-02,  5.31250000e-01,  8.82352941e-02,
   9.37500000e-02, -5.31250000e-01, -8.82352941e-02,
   2.81250000e-01,  4.06250000e-01, -2.64705882e-01,
-  7.50000000e-01, -2.50000000e-01, -7.05882353e-01,
- -3.12500000e-02, -1.56250000e-01,  2.94117647e-02,
-  2.18750000e-01,  9.37500000e-02, -2.05882353e-01,
- -1.87500000e-01,  6.25000000e-02,  1.76470588e-01,
- -1.12500000e+00, -6.25000000e-01,  1.05882353e+00,
-  3.75000000e-01,  8.75000000e-01, -3.52941176e-01,
+ -7.50000000e-01,  2.50000000e-01,  7.05882353e-01,
+  9.37500000e-02,  4.68750000e-01, -8.82352941e-02,
+ -6.56250000e-01, -2.81250000e-01,  6.17647059e-01,
+ -9.37500000e-01,  3.12500000e-01,  8.82352941e-01,
+  1.37500000e+00, -1.25000000e-01, -1.29411765e+00,
+  8.75000000e-01, -6.25000000e-01, -8.23529412e-01,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DQuadratic::_jacobian[] = {
@@ -129,10 +180,19 @@
  -7.50000000e-01, -1.25000000e+00,
   1.75000000e+00,  2.50000000e-01,
   2.50000000e-01,  1.25000000e+00,
+ -7.50000000e-01, -1.25000000e+00,
+  1.75000000e+00,  2.50000000e-01,
+  2.50000000e-01,  1.25000000e+00,
+ -7.50000000e-01, -1.25000000e+00,
+  1.75000000e+00,  2.50000000e-01,
+  2.50000000e-01,  1.25000000e+00,
+ -7.50000000e-01, -1.25000000e+00,
+  1.75000000e+00,  2.50000000e-01,
+  2.50000000e-01,  1.25000000e+00,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DQuadratic::_jacobianDet[] = {
-  2.98433410e+00,  2.98433410e+00,  2.98433410e+00,
+  2.98433410e+00,  2.98433410e+00,  2.98433410e+00,  2.98433410e+00,  2.98433410e+00,  2.98433410e+00,
 };
 
 const double pylith::feassemble::QuadratureData2Din3DQuadratic::_jacobianInv[] = {
@@ -142,6 +202,12 @@
  -8.75000000e-01, -3.75000000e-01,  8.23529412e-01,
   1.25000000e-01,  6.25000000e-01, -1.17647059e-01,
  -8.75000000e-01, -3.75000000e-01,  8.23529412e-01,
+  1.25000000e-01,  6.25000000e-01, -1.17647059e-01,
+ -8.75000000e-01, -3.75000000e-01,  8.23529412e-01,
+  1.25000000e-01,  6.25000000e-01, -1.17647059e-01,
+ -8.75000000e-01, -3.75000000e-01,  8.23529412e-01,
+  1.25000000e-01,  6.25000000e-01, -1.17647059e-01,
+ -8.75000000e-01, -3.75000000e-01,  8.23529412e-01,
 };
 
 pylith::feassemble::QuadratureData2Din3DQuadratic::QuadratureData2Din3DQuadratic(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData3DLinear.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData3DLinear.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/feassemble/data/QuadratureData3DLinear.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -54,11 +54,11 @@
 };
 
 const double pylith::feassemble::QuadratureData3DLinear::_quadPts[] = {
-  8.25000000e-01,  2.25000000e-01,  4.50000000e-01,
+  5.75000000e-01, -2.75000000e-01,  2.00000000e-01,
 };
 
 const double pylith::feassemble::QuadratureData3DLinear::_basis[] = {
- -2.50000000e-01,  2.50000000e-01,  2.50000000e-01,
+  2.50000000e-01,  2.50000000e-01,  2.50000000e-01,
   2.50000000e-01,};
 
 const double pylith::feassemble::QuadratureData3DLinear::_basisDerivRef[] = {

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestDruckerPrager3D.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestDruckerPrager3D.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestDruckerPrager3D.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -211,5 +211,17 @@
   CPPUNIT_ASSERT(material.hasStateVar("plastic_strain"));
 } // testHasStateVar
 
+// ----------------------------------------------------------------------
+// Test _dbToProperties().
+void
+pylith::materials::TestDruckerPrager3D::testDBToProperties(void)
+{ // testDBToProperties
+  CPPUNIT_ASSERT(0 != _material);
+  
+  TestMaterial::testDBToProperties();
 
+  CPPUNIT_ASSERT_EQUAL(false, _material->isJacobianSymmetric());
+} // testDBToProperties
+
+
 // End of file 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestDruckerPrager3D.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestDruckerPrager3D.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestDruckerPrager3D.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -109,6 +109,9 @@
   /// Test hasStateVar()
   void testHasStateVar(void);
 
+  /// Test _dbToProperties() and check flag for symmetry of Jacobian.
+  void testDBToProperties(void);
+
 }; // class TestDruckerPrager3D
 
 #endif // pylith_materials_testdruckerprager3d_hh

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestMaterial.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestMaterial.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestMaterial.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -145,6 +145,20 @@
 } // testNeedNewJacobian
 
 // ----------------------------------------------------------------------
+// Test isJacobianSymmetric()
+void
+pylith::materials::TestMaterial::testIsJacobianSymmetric(void)
+{ // testIsJacobianSymmetric
+  ElasticIsotropic3D material;
+
+  CPPUNIT_ASSERT_EQUAL(true, material.isJacobianSymmetric());
+
+  bool flag = false;
+  material._isJacobianSymmetric = flag;
+  CPPUNIT_ASSERT_EQUAL(flag, material.isJacobianSymmetric());
+} // testIsJacobianSymmetric
+
+// ----------------------------------------------------------------------
 // Test initialize()
 void
 pylith::materials::TestMaterial::testInitialize(void)

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestMaterial.hh
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestMaterial.hh	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/materials/TestMaterial.hh	2010-05-30 21:53:47 UTC (rev 16840)
@@ -47,6 +47,7 @@
   CPPUNIT_TEST( testDBStateVars );
   CPPUNIT_TEST( testNormalizer );
   CPPUNIT_TEST( testNeedNewJacobian );
+  CPPUNIT_TEST( testIsJacobianSymmetric );
   CPPUNIT_TEST( testInitialize );
 
   CPPUNIT_TEST_SUITE_END();
@@ -75,6 +76,9 @@
   /// Test needNewJacobian()
   void testNeedNewJacobian(void);
 
+  /// Test isJacobianSymmetric()
+  void testIsJacobianSymmetric(void);
+
   /// Test initialize()
   void testInitialize(void);
 

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/meshio/TestMeshIOCubit.cc
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/meshio/TestMeshIOCubit.cc	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/libtests/meshio/TestMeshIOCubit.cc	2010-05-30 21:53:47 UTC (rev 16840)
@@ -118,6 +118,7 @@
 { // _testRead
   MeshIOCubit iohandler;
   iohandler.filename(filename);
+  iohandler.useNodesetNames(false);
 
   // Read mesh
   topology::Mesh mesh;

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/bc/TestDirichletBC.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/bc/TestDirichletBC.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/bc/TestDirichletBC.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -80,6 +80,17 @@
     return
 
 
+  def test_numDimConstrained(self):
+    """
+    Test numDimConstrained().
+    """
+
+    (mesh, bc, field) = self._initialize()
+
+    self.assertEqual(1, bc.numDimConstrained())
+    return
+
+
   def test_setConstraintSizes(self):
     """
     Test setConstraintSizes().

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/materials/TestMaterial.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/materials/TestMaterial.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/materials/TestMaterial.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -116,6 +116,16 @@
     return
 
 
+  def testIsJacobianSymmetric(self):
+    """
+    Test isJacobianSymmetric().
+    """
+    # Default should be True.
+    self.failUnless(self.material.isJacobianSymmetric())
+
+    return
+  
+
   def test_preinitialize(self):
     """
     Test preinitialize().

Modified: short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/meshio/TestMeshIOCubit.py
===================================================================
--- short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/meshio/TestMeshIOCubit.py	2010-05-30 20:58:53 UTC (rev 16839)
+++ short/3D/PyLith/branches/pylith-scecdynrup/unittests/pytests/meshio/TestMeshIOCubit.py	2010-05-30 21:53:47 UTC (rev 16840)
@@ -60,6 +60,7 @@
     # For now, we only test reading the file.
     io = MeshIOCubit()
     io.inventory.filename = filenameIn
+    io.inventory.useNames = False
     io._configure()
     
     from spatialdata.units.Nondimensional import Nondimensional



More information about the CIG-COMMITS mailing list