[cig-commits] r17033 - in short/3D/PyLith/trunk/libsrc: . friction
surendra at geodynamics.org
surendra at geodynamics.org
Sat Jul 10 07:15:47 PDT 2010
Author: surendra
Date: 2010-07-10 07:15:47 -0700 (Sat, 10 Jul 2010)
New Revision: 17033
Added:
short/3D/PyLith/trunk/libsrc/friction/TimeWeakening.cc
short/3D/PyLith/trunk/libsrc/friction/TimeWeakening.hh
Modified:
short/3D/PyLith/trunk/libsrc/Makefile.am
short/3D/PyLith/trunk/libsrc/friction/Makefile.am
short/3D/PyLith/trunk/libsrc/friction/frictionfwd.hh
Log:
Implemented time-weakening friction
Modified: short/3D/PyLith/trunk/libsrc/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/libsrc/Makefile.am 2010-07-09 23:13:33 UTC (rev 17032)
+++ short/3D/PyLith/trunk/libsrc/Makefile.am 2010-07-10 14:15:47 UTC (rev 17033)
@@ -84,6 +84,7 @@
friction/StaticFriction.cc \
friction/SlipWeakening.cc \
friction/RateStateAgeing.cc \
+ friction/TimeWeakening.cc \
materials/Metadata.cc \
materials/Material.cc \
materials/ElasticMaterial.cc \
Modified: short/3D/PyLith/trunk/libsrc/friction/Makefile.am
===================================================================
--- short/3D/PyLith/trunk/libsrc/friction/Makefile.am 2010-07-09 23:13:33 UTC (rev 17032)
+++ short/3D/PyLith/trunk/libsrc/friction/Makefile.am 2010-07-10 14:15:47 UTC (rev 17033)
@@ -19,6 +19,7 @@
StaticFriction.hh \
SlipWeakening.hh \
RateStateAgeing.hh \
+ TimeWeakening.hh \
frictionfwd.hh
Added: short/3D/PyLith/trunk/libsrc/friction/TimeWeakening.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/friction/TimeWeakening.cc (rev 0)
+++ short/3D/PyLith/trunk/libsrc/friction/TimeWeakening.cc 2010-07-10 14:15:47 UTC (rev 17033)
@@ -0,0 +1,298 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+#include <portinfo>
+
+#include "TimeWeakening.hh" // implementation of object methods
+
+#include "pylith/materials/Metadata.hh" // USES Metadata
+
+#include "pylith/utils/array.hh" // USES double_array
+#include "pylith/utils/constdefs.h" // USES MAXDOUBLE
+
+#include "spatialdata/units/Nondimensional.hh" // USES Nondimensional
+
+#include "petsc.h" // USES PetscLogFlops
+
+#include <cassert> // USES assert()
+#include <sstream> // USES std::ostringstream
+#include <stdexcept> // USES std::runtime_error
+#include <iostream>
+// ----------------------------------------------------------------------
+namespace pylith {
+ namespace friction {
+ namespace _TimeWeakening {
+
+ // Number of physical properties.
+ const int numProperties = 4;
+
+ // Physical properties.
+ const pylith::materials::Metadata::ParamDescription properties[] = {
+ { "static_coefficient", 1, pylith::topology::FieldBase::SCALAR },
+ { "dynamic_coefficient", 1, pylith::topology::FieldBase::SCALAR },
+ { "time_weakening_parameter", 1, pylith::topology::FieldBase::SCALAR },
+ { "cohesion", 1, pylith::topology::FieldBase::SCALAR },
+ };
+
+ // Number of State Variables.
+ const int numStateVars = 1;
+
+ // State Variables.
+ const pylith::materials::Metadata::ParamDescription stateVars[] = {
+ { "Elapsed_time", 1, pylith::topology::FieldBase::SCALAR },
+ };
+
+ // Values expected in spatial database
+ const int numDBProperties = 4;
+ const char* dbProperties[4] = { "static-coefficient",
+ "dynamic-coefficient",
+ "time-weakening-parameter",
+ "cohesion",
+ };
+
+ const int numDBStateVars = 1;
+ const char* dbStateVars[1] = { "Elapsed-time",
+ };
+
+ } // _TimeWeakening
+ } // friction
+} // pylith
+
+// Indices of physical properties
+const int pylith::friction::TimeWeakening::p_coefS = 0;
+const int pylith::friction::TimeWeakening::p_coefD =
+ pylith::friction::TimeWeakening::p_coefS + 1;
+const int pylith::friction::TimeWeakening::p_Tc =
+ pylith::friction::TimeWeakening::p_coefD + 1;
+const int pylith::friction::TimeWeakening::p_cohesion =
+ pylith::friction::TimeWeakening::p_Tc + 1;
+
+// Indices of database values (order must match dbProperties)
+const int pylith::friction::TimeWeakening::db_coefS = 0;
+const int pylith::friction::TimeWeakening::db_coefD =
+ pylith::friction::TimeWeakening::db_coefS + 1;
+const int pylith::friction::TimeWeakening::db_Tc =
+ pylith::friction::TimeWeakening::db_coefD + 1;
+const int pylith::friction::TimeWeakening::db_cohesion =
+ pylith::friction::TimeWeakening::db_Tc + 1;
+
+// Indices of state variables.
+const int pylith::friction::TimeWeakening::s_time = 0;
+
+// Indices of database values (order must match dbProperties)
+const int pylith::friction::TimeWeakening::db_time = 0;
+
+// ----------------------------------------------------------------------
+// Default constructor.
+pylith::friction::TimeWeakening::TimeWeakening(void) :
+ FrictionModel(materials::Metadata(_TimeWeakening::properties,
+ _TimeWeakening::numProperties,
+ _TimeWeakening::dbProperties,
+ _TimeWeakening::numDBProperties,
+ _TimeWeakening::stateVars,
+ _TimeWeakening::numStateVars,
+ _TimeWeakening::dbStateVars,
+ _TimeWeakening::numDBStateVars))
+{ // constructor
+} // constructor
+
+// ----------------------------------------------------------------------
+// Destructor.
+pylith::friction::TimeWeakening::~TimeWeakening(void)
+{ // destructor
+} // destructor
+
+// ----------------------------------------------------------------------
+// Compute properties from values in spatial database.
+void
+pylith::friction::TimeWeakening::_dbToProperties(
+ double* const propValues,
+ const double_array& dbValues) const
+{ // _dbToProperties
+ assert(0 != propValues);
+ const int numDBValues = dbValues.size();
+ assert(_TimeWeakening::numDBProperties == numDBValues);
+
+ const double db_static = dbValues[db_coefS];
+ const double db_dynamic = dbValues[db_coefD];
+ const double db_To = dbValues[db_Tc];
+ const double db_c = dbValues[db_cohesion];
+
+ if (db_static < 0.0) {
+ std::ostringstream msg;
+ msg << "Spatial database returned negative value for static coefficient "
+ << "of friction.\n"
+ << "static coefficient of friction: " << db_static << "\n";
+ throw std::runtime_error(msg.str());
+ } // if
+
+ if (db_dynamic < 0.0) {
+ std::ostringstream msg;
+ msg << "Spatial database returned negative value for dynamic coefficient "
+ << "of friction.\n"
+ << "dynamic coefficient of friction: " << db_dynamic << "\n";
+ throw std::runtime_error(msg.str());
+ } // if
+
+ if (db_To <= 0.0) {
+ std::ostringstream msg;
+ msg << "Spatial database returned nonpositive value for time weakening parameter "
+ << "of friction.\n"
+ << "time weakening parameter of friction: " << db_To << "\n";
+ throw std::runtime_error(msg.str());
+ } // if
+
+ propValues[p_coefS] = db_static;
+ propValues[p_coefD] = db_dynamic;
+ propValues[p_Tc] = db_To;
+ propValues[p_cohesion] = db_c;
+
+} // _dbToProperties
+
+// ----------------------------------------------------------------------
+// Nondimensionalize properties.
+void
+pylith::friction::TimeWeakening::_nondimProperties(double* const values,
+ const int nvalues) const
+{ // _nondimProperties
+ assert(0 != _normalizer);
+ assert(0 != values);
+ assert(nvalues == _TimeWeakening::numProperties);
+
+ const double timeScale = _normalizer->timeScale();
+ const double pressureScale = _normalizer->pressureScale();
+
+ values[p_Tc] /= timeScale;
+ values[p_cohesion] /= pressureScale;
+} // _nondimProperties
+
+// ----------------------------------------------------------------------
+// Dimensionalize properties.
+void
+pylith::friction::TimeWeakening::_dimProperties(double* const values,
+ const int nvalues) const
+{ // _dimProperties
+ assert(0 != _normalizer);
+ assert(0 != values);
+ assert(nvalues == _TimeWeakening::numProperties);
+
+ const double timeScale = _normalizer->timeScale();
+ const double pressureScale = _normalizer->pressureScale();
+
+ values[p_Tc] *= timeScale;
+ values[p_cohesion] *= pressureScale;
+} // _dimProperties
+
+// ----------------------------------------------------------------------
+// Compute state variables from values in spatial database.
+void
+pylith::friction::TimeWeakening::_dbToStateVars(
+ double* const stateValues,
+ const double_array& dbValues) const
+{ // _dbToStateVars
+ assert(0 != stateValues);
+ const int numDBValues = dbValues.size();
+ assert(_TimeWeakening::numDBStateVars == numDBValues);
+
+ const double timeElasped = dbValues[db_time];
+
+ stateValues[s_time] = timeElasped;
+} // _dbToStateVars
+
+// ----------------------------------------------------------------------
+// Nondimensionalize state variables.
+void
+pylith::friction::TimeWeakening::_nondimStateVars(double* const values,
+ const int nvalues) const
+{ // _nondimStateVars
+ assert(0 != _normalizer);
+ assert(0 != values);
+ assert(nvalues == _TimeWeakening::numStateVars);
+
+ const double timeScale = _normalizer->timeScale();
+
+ values[s_time] /= timeScale;
+} // _nondimStateVars
+
+// ----------------------------------------------------------------------
+// Dimensionalize state variables.
+void
+pylith::friction::TimeWeakening::_dimStateVars(double* const values,
+ const int nvalues) const
+{ // _dimStateVars
+ assert(0 != _normalizer);
+ assert(0 != values);
+ assert(nvalues == _TimeWeakening::numStateVars);
+
+ const double timeScale = _normalizer->timeScale();
+
+ values[s_time] *= timeScale;
+} // _dimStateVars
+
+// ----------------------------------------------------------------------
+// Compute friction from properties and state variables.
+double
+pylith::friction::TimeWeakening::_calcFriction(const double slip,
+ const double slipRate,
+ const double normalTraction,
+ const double* properties,
+ const int numProperties,
+ const double* stateVars,
+ const int numStateVars)
+{ // _calcFriction
+ assert(0 != properties);
+ assert(_numPropsVertex == numProperties);
+ assert(0 != numStateVars);
+ assert(_numVarsVertex == numStateVars);
+
+ double friction = 0.0;
+ double mu_f = 0.0;
+ if (normalTraction <= 0.0) {
+ // if fault is in compression
+ if (stateVars[s_time] < properties[p_Tc]) {
+ // if/else linear slip-weakening form of mu_f
+ mu_f = properties[p_coefS] -
+ (properties[p_coefS] - properties[p_coefD]) *
+ stateVars[s_time] / properties[p_Tc];
+ } else {
+ mu_f = properties[p_coefD];
+ } // if/else
+ friction = - mu_f * normalTraction + properties[p_cohesion];
+ } // if
+
+ PetscLogFlops(6);
+
+ return friction;
+} // _calcFriction
+
+// ----------------------------------------------------------------------
+// Update state variables (for next time step).
+void
+pylith::friction::TimeWeakening::_updateStateVars(const double slip,
+ const double slipRate,
+ const double normalTraction,
+ double* const stateVars,
+ const int numStateVars,
+ const double* properties,
+ const int numProperties)
+{ // _updateStateVars
+ assert(0 != numStateVars);
+ assert(0 != numProperties);
+
+ const double dt = _dt;
+
+ stateVars[s_time] += dt;
+
+} // _updateStateVars
+
+
+// End of file
Added: short/3D/PyLith/trunk/libsrc/friction/TimeWeakening.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/friction/TimeWeakening.hh (rev 0)
+++ short/3D/PyLith/trunk/libsrc/friction/TimeWeakening.hh 2010-07-10 14:15:47 UTC (rev 17033)
@@ -0,0 +1,168 @@
+// -*- C++ -*-
+//
+// ----------------------------------------------------------------------
+//
+// Brad T. Aagaard
+// U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ----------------------------------------------------------------------
+//
+
+/** @file libsrc/friction/TimeWeakening.hh
+ *
+ * @brief C++ slip weakening fault constitutive model.
+ */
+
+#if !defined(pylith_friction_timeweakening_hh)
+#define pylith_friction_timeweakening_hh
+
+// Include directives ---------------------------------------------------
+#include "FrictionModel.hh" // ISA FrictionModel
+
+// TimeWeakening -------------------------------------------------------
+/** @brief C++ slip weakening fault constitutive model.
+ *
+ * Friction is equal to the product of a coefficient of friction (function
+ * of slip path length) and the normal traction.
+ */
+
+class pylith::friction::TimeWeakening : public FrictionModel
+{ // class TimeWeakening
+ friend class TestTimeWeakening; // unit testing
+
+ // PUBLIC METHODS /////////////////////////////////////////////////////
+public :
+
+ /// Default constructor.
+ TimeWeakening(void);
+
+ /// Destructor.
+ ~TimeWeakening(void);
+
+ // PROTECTED METHODS //////////////////////////////////////////////////
+protected :
+
+ /// These methods should be implemented by every constitutive model.
+
+ /** Compute properties from values in spatial database.
+ *
+ * @param propValues Array of property values.
+ * @param dbValues Array of database values.
+ */
+ void _dbToProperties(double* const propValues,
+ const double_array& dbValues) const;
+
+ /** Nondimensionalize properties.
+ *
+ * @param values Array of property values.
+ * @param nvalues Number of values.
+ */
+ void _nondimProperties(double* const values,
+ const int nvalues) const;
+
+ /** Dimensionalize properties.
+ *
+ * @param values Array of property values.
+ * @param nvalues Number of values.
+ */
+ void _dimProperties(double* const values,
+ const int nvalues) const;
+
+ /** Compute friction from properties and state variables.
+ *
+ * @param slip Current slip at location.
+ * @param slipRate Current slip rate at location.
+ * @param normalTraction Normal traction at location.
+ * @param properties Properties at location.
+ * @param numProperties Number of properties.
+ * @param stateVars State variables at location.
+ * @param numStateVars Number of state variables.
+ */
+ void _dbToStateVars(double* const stateValues,
+ const double_array& dbValues) const;
+
+ /** Nondimensionalize state variables.
+ *
+ * @param values Array of initial state values.
+ * @param nvalues Number of values.
+ */
+ void _nondimStateVars(double* const values,
+ const int nvalues) const;
+
+ /** Dimensionalize state variables.
+ *
+ * @param values Array of initial state values.
+ * @param nvalues Number of values.
+ */
+ void _dimStateVars(double* const values,
+ const int nvalues) const;
+
+ /** Compute friction from properties and state variables.
+ *
+ * @param slip Current slip at location.
+ * @param slipRate Current slip rate at location.
+ * @param normalTraction Normal traction at location.
+ * @param properties Properties at location.
+ * @param numProperties Number of properties.
+ * @param stateVars State variables at location.
+ * @param numStateVars Number of state variables.
+ */
+ double _calcFriction(const double slip,
+ const double slipRate,
+ const double normalTraction,
+ const double* properties,
+ const int numProperties,
+ const double* stateVars,
+ const int numStateVars);
+
+ /** Update state variables (for next time step).
+ *
+ * @param slip Current slip at location.
+ * @param slipRate Current slip rate at location.
+ * @param normalTraction Normal traction at location.
+ * @param stateVars State variables at location.
+ * @param numStateVars Number of state variables.
+ * @param properties Properties at location.
+ * @param numProperties Number of properties.
+ */
+ void _updateStateVars(const double slip,
+ const double slipRate,
+ const double normalTraction,
+ double* const stateVars,
+ const int numStateVars,
+ const double* properties,
+ const int numProperties);
+
+ // PRIVATE MEMBERS ////////////////////////////////////////////////////
+private :
+
+ /// Indices for properties in section and spatial database.
+ static const int p_coefS;
+ static const int p_coefD;
+ static const int p_Tc;
+ static const int p_cohesion;
+
+ static const int db_coefS;
+ static const int db_coefD;
+ static const int db_Tc;
+ static const int db_cohesion;
+
+ /// Indices for state variables in section and spatial database.
+ static const int s_time;
+
+ static const int db_time;
+
+ // NOT IMPLEMENTED ////////////////////////////////////////////////////
+private :
+
+ TimeWeakening(const TimeWeakening&); ///< Not implemented.
+ const TimeWeakening& operator=(const TimeWeakening&); ///< Not implemented
+
+}; // class TimeWeakening
+
+#endif // pylith_friction_timeweakening_hh
+
+
+// End of file
Modified: short/3D/PyLith/trunk/libsrc/friction/frictionfwd.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/friction/frictionfwd.hh 2010-07-09 23:13:33 UTC (rev 17032)
+++ short/3D/PyLith/trunk/libsrc/friction/frictionfwd.hh 2010-07-10 14:15:47 UTC (rev 17033)
@@ -32,6 +32,8 @@
class RateStateAgeing;
+ class TimeWeakening;
+
} // friction
} // pylith
More information about the CIG-COMMITS
mailing list