[cig-commits] r11169 - short/3D/PyLith/trunk/libsrc/faults

brad at geodynamics.org brad at geodynamics.org
Fri Feb 15 14:11:44 PST 2008


Author: brad
Date: 2008-02-15 14:11:44 -0800 (Fri, 15 Feb 2008)
New Revision: 11169

Modified:
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc
   short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh
Log:
Added computation of change in tractions on fault surface.

Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc	2008-02-15 22:09:53 UTC (rev 11168)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc	2008-02-15 22:11:44 UTC (rev 11169)
@@ -470,13 +470,16 @@
 { // cellField
   assert(!_faultMesh.isNull());
   assert(!_orientation.isNull());
+  assert(0 != fields);
   assert(0 != _eqsrc);
 
   const int cohesiveDim = _faultMesh->getDimension();
 
   if (0 == strcasecmp("traction_change", name)) {
     _allocateBufferCellVector();
-    // ADD STUFF HERE
+    *fieldType = VECTOR_FIELD;
+    const ALE::Obj<real_section_type>& solution = fields->getSolution();
+    _calcTractionsChange(&_bufferCellVector, solution);
     return _bufferCellVector;
   } // if
 
@@ -776,6 +779,53 @@
 } // _calcConditioning
 
 // ----------------------------------------------------------------------
+// Compute change in tractions on fault surface using solution.
+void
+pylith::faults::FaultCohesiveKin::_calcTractionsChange(
+				 ALE::Obj<real_section_type>* tractions,
+				 const ALE::Obj<real_section_type>& solution)
+{ // _calcTractionsChange
+  assert(0 != tractions);
+  assert(!tractions->isNull());
+  assert(!solution.isNull());
+  assert(!_faultMesh.isNull());
+  assert(!_pseudoStiffness.isNull());
+  assert(0 != _quadrature);
+
+  const ALE::Obj<Mesh::label_sequence>& cells = 
+    _faultMesh->heightStratum(0);
+  const Mesh::label_sequence::iterator cellsEnd = cells->end();
+  
+  const int numBasis = _quadrature->numBasis();
+  const int spaceDim = _quadrature->spaceDim();
+  const int numQuadPts = _quadrature->numQuadPts();
+  const double_array& basis = _quadrature->basis();
+
+  double_array solutionCell(numBasis*spaceDim);
+  double_array stiffnessCell(numBasis);
+  double_array tractionsCell(numQuadPts*spaceDim);
+
+  int count = 0;
+  for (Mesh::label_sequence::iterator c_iter=cells->begin();
+       c_iter != cellsEnd;
+       ++c_iter, ++count) {
+    _faultMesh->restrict(solution, *c_iter, 
+			 &solutionCell[0], solutionCell.size());
+    _faultMesh->restrict(_pseudoStiffness, *c_iter, 
+			 &stiffnessCell[0], stiffnessCell.size());
+    for (int iQuad=0; iQuad < numQuadPts; ++iQuad)
+      for (int iBasis=0; iBasis < numBasis; ++iBasis)
+	for (int iDim=0; iDim < spaceDim; ++iDim)
+	  tractionsCell[iQuad*spaceDim+iDim] = basis[iBasis] *
+	    solutionCell[iBasis*spaceDim+iDim] * stiffnessCell[iBasis];
+    (*tractions)->updatePoint(*c_iter, &tractionsCell[0]);
+  } // for
+
+  //solution->view("SOLUTION");
+  //(*tractions)->view("TRACTIONS");
+} // _calcTractionsChange
+
+// ----------------------------------------------------------------------
 // Allocate scalar field for output of vertex information.
 void
 pylith::faults::FaultCohesiveKin::_allocateBufferVertexScalar(void)
@@ -814,7 +864,9 @@
 pylith::faults::FaultCohesiveKin::_allocateBufferCellVector(void)
 { // _allocateBufferCellVector
   assert(0 != _quadrature);
-  const int fiberDim = _quadrature->spaceDim();
+  const int numQuadPts = _quadrature->numQuadPts();
+  const int spaceDim = _quadrature->spaceDim();
+  const int fiberDim = numQuadPts * spaceDim;
   if (_bufferCellVector.isNull()) {
     _bufferCellVector = new real_section_type(_faultMesh->comm(), 
 					      _faultMesh->debug());

Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh	2008-02-15 22:09:53 UTC (rev 11168)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh	2008-02-15 22:11:44 UTC (rev 11169)
@@ -193,6 +193,14 @@
   void _calcConditioning(const spatialdata::geocoords::CoordSys* cs,
 			 spatialdata::spatialdb::SpatialDB* matDB);
 
+  /** Compute change in tractions on fault surface using solution.
+   *
+   * @param tractions Field for tractions.
+   * @param solution Solution field.
+   */
+  void _calcTractionsChange(ALE::Obj<real_section_type>* tractions,
+			    const ALE::Obj<real_section_type>& solution);
+
   /// Allocate scalar field for output of vertex information.
   void _allocateBufferVertexScalar(void);
 



More information about the cig-commits mailing list