[cig-commits] [commit] baagaard/dynrup-new-lagrange: Name change (TractPerturbation -> TractionPerturbation). (0736169)
cig_noreply at geodynamics.org
cig_noreply at geodynamics.org
Wed Nov 5 15:44:38 PST 2014
- Previous message: [cig-commits] [commit] baagaard/dynrup-new-lagrange: Merge branch 'master' into baagaard/dynrup-new-lagrange (c771342)
- Next message: [cig-commits] [commit] baagaard/add-release-2.0.3, baagaard/add-release-2.1.0, baagaard/dynrup-new-lagrange, baagaard/feature-output-station-names, baagaard/feature-progress-monitor, baagaard/fix-custom-faultpc, baagaard/fix-faults-intersect, baagaard/fix-friction-initial-state, baagaard/update-autoconf, knepley/feature-petsc-fe, knepley/upgrade-petsc-3.5, knepley/upgrade-petsc-master, maint, master, next, willic3/fix-plasticity: Added test case for embedded fault and initial state for friction. (3dcf71c)
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Repository : https://github.com/geodynamics/pylith
On branch : baagaard/dynrup-new-lagrange
Link : https://github.com/geodynamics/pylith/compare/f33c75b19fd60eedb2a3405db76a1fee333bb1d7...5b6d812b1612809fea3bd331c4e5af98c25a536a
>---------------------------------------------------------------
commit 0736169fc2892037b3242762ba7b83f014557a1c
Author: Brad Aagaard <baagaard at usgs.gov>
Date: Tue Jul 1 12:52:50 2014 -0700
Name change (TractPerturbation -> TractionPerturbation).
Also small change to FaultCohesiveDyn (add Jacobian from
FaultCohesiveLagrange); needs reimplementation.
>---------------------------------------------------------------
0736169fc2892037b3242762ba7b83f014557a1c
libsrc/pylith/faults/FaultCohesiveDyn.cc | 161 +++++++++++++++++++++
libsrc/pylith/faults/FaultCohesiveDyn.hh | 12 ++
modulesrc/faults/FaultCohesiveDyn.i | 28 ++--
modulesrc/faults/faults.i | 4 +-
pylith/Makefile.am | 2 +-
...ractPerturbation.py => TractionPerturbation.py} | 16 +-
unittests/pytests/faults/Makefile.am | 2 +-
...Perturbation.py => TestTractionPerturbation.py} | 16 +-
unittests/pytests/faults/testfaults.py | 4 +-
9 files changed, 210 insertions(+), 35 deletions(-)
diff --git a/libsrc/pylith/faults/FaultCohesiveDyn.cc b/libsrc/pylith/faults/FaultCohesiveDyn.cc
index 0784d50..00b3242 100644
--- a/libsrc/pylith/faults/FaultCohesiveDyn.cc
+++ b/libsrc/pylith/faults/FaultCohesiveDyn.cc
@@ -463,6 +463,167 @@ pylith::faults::FaultCohesiveDyn::integrateResidual(const topology::Field& resid
PYLITH_METHOD_END;
} // integrateResidual
+
+// ----------------------------------------------------------------------
+// Compute Jacobian matrix (A) associated with operator.
+void
+pylith::faults::FaultCohesiveDyn::integrateJacobian(topology::Jacobian* jacobian,
+ const PylithScalar t,
+ topology::SolutionFields* const fields)
+{ // integrateJacobian
+ PYLITH_METHOD_BEGIN;
+
+ assert(jacobian);
+ assert(fields);
+ assert(_fields);
+ assert(_logger);
+
+ const int setupEvent = _logger->eventId("FaIJ setup");
+ const int geometryEvent = _logger->eventId("FaIJ geometry");
+ const int computeEvent = _logger->eventId("FaIJ compute");
+ const int restrictEvent = _logger->eventId("FaIJ restrict");
+ const int updateEvent = _logger->eventId("FaIJ update");
+
+ _logger->eventBegin(setupEvent);
+
+ // Add constraint information to Jacobian matrix; Entries are
+ // associated with vertices ik, jk, ki, and kj.
+
+ // Get cell geometry information that doesn't depend on cell
+ const int spaceDim = _quadrature->spaceDim();
+
+ // Get fields.
+ topology::Field& area = _fields->get("area");
+ topology::VecVisitorMesh areaVisitor(area);
+ const PetscScalar* areaArray = areaVisitor.localArray();
+
+ PetscDM solnDM = fields->solution().dmMesh();assert(solnDM);
+ PetscSection solnSection = fields->solution().petscSection();assert(solnSection);
+ PetscSection solnGlobalSection = NULL;
+ PetscErrorCode err = DMGetDefaultGlobalSection(solnDM, &solnGlobalSection);PYLITH_CHECK_ERROR(err);assert(solnGlobalSection);
+
+ // Get fault information
+ PetscDM dmMesh = fields->mesh().dmMesh();assert(dmMesh);
+
+ // Allocate vectors for vertex values
+ scalar_array jacobianVertex(spaceDim*spaceDim);
+ int_array indicesL(spaceDim);
+ int_array indicesN(spaceDim);
+ int_array indicesP(spaceDim);
+ int_array indicesRel(spaceDim);
+ for (int i=0; i < spaceDim; ++i) {
+ indicesRel[i] = i;
+ } // for
+
+ // Get sparse matrix
+ const PetscMat jacobianMatrix = jacobian->matrix();assert(jacobianMatrix);
+
+ _logger->eventEnd(setupEvent);
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(computeEvent);
+#endif
+
+ const int numVertices = _cohesiveVertices.size();
+ for (int iVertex=0; iVertex < numVertices; ++iVertex) {
+ const int e_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 (e_lagrange < 0) { // Skip clamped edges.
+ continue;
+ } // if
+
+ // Compute contribution only if Lagrange constraint is local.
+ PetscInt gloff = 0;
+ err = PetscSectionGetOffset(solnGlobalSection, e_lagrange, &gloff);PYLITH_CHECK_ERROR(err);
+ if (gloff < 0)
+ continue;
+
+ PetscInt gnoff = 0;
+ err = PetscSectionGetOffset(solnGlobalSection, v_negative, &gnoff);PYLITH_CHECK_ERROR(err);
+ gnoff = gnoff < 0 ? -(gnoff+1) : gnoff;
+
+ PetscInt gpoff = 0;
+ err = PetscSectionGetOffset(solnGlobalSection, v_positive, &gpoff);PYLITH_CHECK_ERROR(err);
+ gpoff = gpoff < 0 ? -(gpoff+1) : gpoff;
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventBegin(restrictEvent);
+#endif
+
+ // Get area associated with fault vertex.
+ const PetscInt aoff = areaVisitor.sectionOffset(v_fault);
+ assert(1 == areaVisitor.sectionDof(v_fault));
+
+ // Set global order indices
+ indicesL = indicesRel + gloff;
+ indicesN = indicesRel + gnoff;
+ indicesP = indicesRel + gpoff;
+ PetscInt cdof;
+ err = PetscSectionGetConstraintDof(solnSection, v_negative, &cdof);PYLITH_CHECK_ERROR(err);assert(0 == cdof);
+ err = PetscSectionGetConstraintDof(solnSection, v_positive, &cdof);PYLITH_CHECK_ERROR(err);assert(0 == cdof);
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(restrictEvent);
+ _logger->eventBegin(updateEvent);
+#endif
+
+ // Set diagonal entries of Jacobian at positive vertex to area
+ // associated with vertex.
+ for (int iDim=0; iDim < spaceDim; ++iDim)
+ jacobianVertex[iDim*spaceDim+iDim] = areaArray[aoff];
+
+ // Values at positive vertex, entry L,P in Jacobian
+ err = MatSetValues(jacobianMatrix,
+ indicesL.size(), &indicesL[0],
+ indicesP.size(), &indicesP[0],
+ &jacobianVertex[0], ADD_VALUES);PYLITH_CHECK_ERROR(err);
+
+ // Values at positive vertex, entry P,L in Jacobian
+ err = MatSetValues(jacobianMatrix,
+ indicesP.size(), &indicesP[0],
+ indicesL.size(), &indicesL[0],
+ &jacobianVertex[0], ADD_VALUES);PYLITH_CHECK_ERROR(err);
+
+ // Values at negative vertex, entry L,N in Jacobian
+ jacobianVertex *= -1.0;
+ err = MatSetValues(jacobianMatrix,
+ indicesL.size(), &indicesL[0],
+ indicesN.size(), &indicesN[0],
+ &jacobianVertex[0], ADD_VALUES);PYLITH_CHECK_ERROR(err);
+
+ // Values at negative vertex, entry N,L in Jacobian
+ err = MatSetValues(jacobianMatrix,
+ indicesN.size(), &indicesN[0],
+ indicesL.size(), &indicesL[0],
+ &jacobianVertex[0], ADD_VALUES);PYLITH_CHECK_ERROR(err);
+
+ // Values at Lagrange vertex, entry L,L in Jacobian
+ // We must have entries on the diagonal.
+ jacobianVertex = 0.0;
+ err = MatSetValues(jacobianMatrix,
+ indicesL.size(), &indicesL[0],
+ indicesL.size(), &indicesL[0],
+ &jacobianVertex[0], ADD_VALUES);PYLITH_CHECK_ERROR(err);
+
+#if defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(updateEvent);
+#endif
+
+ } // for
+ PetscLogFlops(numVertices*spaceDim*2);
+
+#if !defined(DETAILED_EVENT_LOGGING)
+ _logger->eventEnd(computeEvent);
+#endif
+
+ _needNewJacobian = false;
+
+ PYLITH_METHOD_END;
+} // integrateJacobian
+
+
// ----------------------------------------------------------------------
// Update state variables as needed.
void
diff --git a/libsrc/pylith/faults/FaultCohesiveDyn.hh b/libsrc/pylith/faults/FaultCohesiveDyn.hh
index b0e9e7d..eefb156 100644
--- a/libsrc/pylith/faults/FaultCohesiveDyn.hh
+++ b/libsrc/pylith/faults/FaultCohesiveDyn.hh
@@ -109,6 +109,18 @@ public :
const PylithScalar t,
topology::SolutionFields* const fields);
+ /** Integrate contributions to Jacobian matrix (A) associated with
+ * operator that require assembly across processors.
+ *
+ * @param jacobian Sparse matrix
+ * @param t Current time
+ * @param fields Solution fields
+ */
+ virtual
+ void integrateJacobian(topology::Jacobian* jacobian,
+ const PylithScalar t,
+ topology::SolutionFields* const fields);
+
/** Update state variables as needed.
*
* @param t Current time
diff --git a/modulesrc/faults/FaultCohesiveDyn.i b/modulesrc/faults/FaultCohesiveDyn.i
index 0d639c7..8333fc2 100644
--- a/modulesrc/faults/FaultCohesiveDyn.i
+++ b/modulesrc/faults/FaultCohesiveDyn.i
@@ -45,7 +45,7 @@ namespace pylith {
*
* @param tract Spatial and temporal variation of tractions.
*/
- void tractionPerturbation(TractPerturbation* tract);
+ void tractionPerturbation(TractionPerturbation* tract);
/** Set the friction (constitutive) model.
*
@@ -92,8 +92,20 @@ namespace pylith {
*/
virtual
void integrateResidual(const pylith::topology::Field& residual,
- const PylithScalar t,
- pylith::topology::SolutionFields* const fields);
+ const PylithScalar t,
+ pylith::topology::SolutionFields* const fields);
+
+ /** Integrate contributions to Jacobian matrix (A) associated with
+ * operator that require assembly across processors.
+ *
+ * @param jacobian Sparse matrix
+ * @param t Current time
+ * @param fields Solution fields
+ */
+ virtual
+ void integrateJacobian(pylith::topology::Jacobian* jacobian,
+ const PylithScalar t,
+ pylith::topology::SolutionFields* const fields);
/** Update state variables as needed.
*
@@ -104,16 +116,6 @@ namespace pylith {
void updateStateVars(const PylithScalar t,
pylith::topology::SolutionFields* const fields);
- /** Constrain solution space based on friction.
- *
- * @param fields Solution fields.
- * @param t Current time.
- * @param jacobian Sparse matrix for system Jacobian.
- */
- void constrainSolnSpace(pylith::topology::SolutionFields* const fields,
- const PylithScalar t,
- const pylith::topology::Jacobian& jacobian);
-
/** Adjust solution from solver with lumped Jacobian to match Lagrange
* multiplier constraints.
*
diff --git a/modulesrc/faults/faults.i b/modulesrc/faults/faults.i
index 098d350..d078f54 100644
--- a/modulesrc/faults/faults.i
+++ b/modulesrc/faults/faults.i
@@ -28,7 +28,7 @@
#include "pylith/faults/LiuCosSlipFn.hh"
#include "pylith/faults/TimeHistorySlipFn.hh"
#include "pylith/faults/EqKinSrc.hh"
-#include "pylith/faults/TractPerturbation.hh"
+#include "pylith/faults/TractionPerturbation.hh"
#include "pylith/faults/Fault.hh"
#include "pylith/faults/FaultCohesive.hh"
#include "pylith/faults/FaultCohesiveLagrange.hh"
@@ -72,7 +72,7 @@ import_array();
%include "LiuCosSlipFn.i"
%include "TimeHistorySlipFn.i"
%include "EqKinSrc.i"
-%include "TractPerturbation.i"
+%include "TractionPerturbation.i"
%include "Fault.i"
%include "FaultCohesive.i"
%include "FaultCohesiveLagrange.i"
diff --git a/pylith/Makefile.am b/pylith/Makefile.am
index bf0ddcc..4ae0759 100644
--- a/pylith/Makefile.am
+++ b/pylith/Makefile.am
@@ -41,7 +41,7 @@ nobase_pkgpyexec_PYTHON = \
faults/SlipTimeFn.py \
faults/StepSlipFn.py \
faults/TimeHistorySlipFn.py \
- faults/TractPerturbation.py \
+ faults/TractionPerturbation.py \
faults/Fault.py \
faults/FaultCohesive.py \
faults/FaultCohesiveKin.py \
diff --git a/pylith/faults/TractPerturbation.py b/pylith/faults/TractionPerturbation.py
similarity index 84%
rename from pylith/faults/TractPerturbation.py
rename to pylith/faults/TractionPerturbation.py
index dd2b595..c935692 100644
--- a/pylith/faults/TractPerturbation.py
+++ b/pylith/faults/TractionPerturbation.py
@@ -16,24 +16,24 @@
# ----------------------------------------------------------------------
#
-## @file pylith/faults/TractPerturbation.py
+## @file pylith/faults/TractionPerturbation.py
##
## @brief Python object for managing parameters for a kinematic
## earthquake sources.
##
-## TractPerturbation is responsible for providing the value of
+## TractionPerturbation is responsible for providing the value of
## specified traction at time t over a fault surface.
##
## Factory: eq_kinematic_src
from pylith.bc.TimeDependent import TimeDependent
-from faults import TractPerturbation as ModuleTractPerturbation
+from faults import TractionPerturbation as ModuleTractionPerturbation
from pylith.utils.NullComponent import NullComponent
-# TractPerturbation class
-class TractPerturbation(TimeDependent, ModuleTractPerturbation):
+# TractionPerturbation class
+class TractionPerturbation(TimeDependent, ModuleTractionPerturbation):
"""
Python object for managing specified tractions on a fault surface.
@@ -78,7 +78,7 @@ class TractPerturbation(TimeDependent, ModuleTractPerturbation):
"""
Create handle to corresponding C++ object.
"""
- ModuleTractPerturbation.__init__(self)
+ ModuleTractionPerturbation.__init__(self)
return
@@ -86,9 +86,9 @@ class TractPerturbation(TimeDependent, ModuleTractPerturbation):
def traction_perturbation():
"""
- Factory associated with TractPerturbation.
+ Factory associated with TractionPerturbation.
"""
- return TractPerturbation()
+ return TractionPerturbation()
# End of file
diff --git a/unittests/pytests/faults/Makefile.am b/unittests/pytests/faults/Makefile.am
index 67e3676..94e8000 100644
--- a/unittests/pytests/faults/Makefile.am
+++ b/unittests/pytests/faults/Makefile.am
@@ -32,7 +32,7 @@ noinst_PYTHON = \
TestEqKinSrc.py \
TestFaultCohesiveKin.py \
TestFaultCohesiveDyn.py \
- TestTractPerturbation.py \
+ TestTractionPerturbation.py \
TestFaultCohesiveImpulses.py \
TestLiuCosSlipFn.py \
TestSingleRupture.py \
diff --git a/unittests/pytests/faults/TestTractPerturbation.py b/unittests/pytests/faults/TestTractionPerturbation.py
similarity index 80%
rename from unittests/pytests/faults/TestTractPerturbation.py
rename to unittests/pytests/faults/TestTractionPerturbation.py
index f6a3032..2b1ac62 100644
--- a/unittests/pytests/faults/TestTractPerturbation.py
+++ b/unittests/pytests/faults/TestTractionPerturbation.py
@@ -16,25 +16,25 @@
# ======================================================================
#
-## @file unittests/pytests/faults/TestTractPerturbation.py
+## @file unittests/pytests/faults/TestTractionPerturbation.py
-## @brief Unit testing of TractPerturbation object.
+## @brief Unit testing of TractionPerturbation object.
import unittest
-from pylith.faults.TractPerturbation import TractPerturbation
+from pylith.faults.TractionPerturbation import TractionPerturbation
# ----------------------------------------------------------------------
-class TestTractPerturbation(unittest.TestCase):
+class TestTractionPerturbation(unittest.TestCase):
"""
- Unit testing of TractPerturbation object.
+ Unit testing of TractionPerturbation object.
"""
def test_constructor(self):
"""
Test constructor.
"""
- tract = TractPerturbation()
+ tract = TractionPerturbation()
return
@@ -62,7 +62,7 @@ class TestTractPerturbation(unittest.TestCase):
dbChange.inventory.label = "traction change"
dbChange._configure()
- tract = TractPerturbation()
+ tract = TractionPerturbation()
tract.inventory.dbInitial = dbInitial
tract.inventory.dbChange = dbChange
tract._configure()
@@ -73,7 +73,7 @@ class TestTractPerturbation(unittest.TestCase):
"""
Test factory method.
"""
- from pylith.faults.TractPerturbation import traction_perturbation
+ from pylith.faults.TractionPerturbation import traction_perturbation
fn = traction_perturbation()
return
diff --git a/unittests/pytests/faults/testfaults.py b/unittests/pytests/faults/testfaults.py
index 4add3b6..b80aa4e 100644
--- a/unittests/pytests/faults/testfaults.py
+++ b/unittests/pytests/faults/testfaults.py
@@ -81,8 +81,8 @@ class TestApp(Script):
from TestEqKinSrc import TestEqKinSrc
suite.addTest(unittest.makeSuite(TestEqKinSrc))
- from TestTractPerturbation import TestTractPerturbation
- suite.addTest(unittest.makeSuite(TestTractPerturbation))
+ from TestTractionPerturbation import TestTractionPerturbation
+ suite.addTest(unittest.makeSuite(TestTractionPerturbation))
from TestFaultCohesiveKin import TestFaultCohesiveKin
suite.addTest(unittest.makeSuite(TestFaultCohesiveKin))
- Previous message: [cig-commits] [commit] baagaard/dynrup-new-lagrange: Merge branch 'master' into baagaard/dynrup-new-lagrange (c771342)
- Next message: [cig-commits] [commit] baagaard/add-release-2.0.3, baagaard/add-release-2.1.0, baagaard/dynrup-new-lagrange, baagaard/feature-output-station-names, baagaard/feature-progress-monitor, baagaard/fix-custom-faultpc, baagaard/fix-faults-intersect, baagaard/fix-friction-initial-state, baagaard/update-autoconf, knepley/feature-petsc-fe, knepley/upgrade-petsc-3.5, knepley/upgrade-petsc-master, maint, master, next, willic3/fix-plasticity: Added test case for embedded fault and initial state for friction. (3dcf71c)
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the CIG-COMMITS
mailing list