[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