[cig-commits] r16040 - short/3D/PyLith/branches/pylith-friction/libsrc/faults

brad at geodynamics.org brad at geodynamics.org
Wed Nov 25 20:07:55 PST 2009


Author: brad
Date: 2009-11-25 20:07:55 -0800 (Wed, 25 Nov 2009)
New Revision: 16040

Modified:
   short/3D/PyLith/branches/pylith-friction/libsrc/faults/FaultCohesiveDynL.cc
Log:
Fixed bug in slip estimate. Need to account for the difference between change in tractions and change in Lagrange multiplier.

Modified: short/3D/PyLith/branches/pylith-friction/libsrc/faults/FaultCohesiveDynL.cc
===================================================================
--- short/3D/PyLith/branches/pylith-friction/libsrc/faults/FaultCohesiveDynL.cc	2009-11-25 19:07:26 UTC (rev 16039)
+++ short/3D/PyLith/branches/pylith-friction/libsrc/faults/FaultCohesiveDynL.cc	2009-11-26 04:07:55 UTC (rev 16040)
@@ -641,6 +641,7 @@
   double_array tractionTpdtVertex(spaceDim);
   double_array slipTpdtVertex(spaceDim);
   double_array lagrangeTpdtVertex(spaceDim);
+  double_array dLagrangeTpdtVertex(spaceDim);
 
   // Get domain mesh and fault mesh
   const ALE::Obj<SieveMesh>& sieveMesh = fields->mesh().sieveMesh();
@@ -739,13 +740,14 @@
       
       // Compute Lagrange multiplier at time t+dt
       lagrangeTpdtVertex = lagrangeTVertex + lagrangeTIncrVertex;
+      dLagrangeTpdtVertex = 0.0;
       
       // :KLUDGE: Solution at Lagrange constraint vertices is the
       // Lagrange multiplier value, which is currently the force.
       // Compute traction by dividing force by area
       assert(*areaVertex > 0);
       tractionTVertex = lagrangeTVertex / (*areaVertex);
-      tractionTpdtVertex = lagrangeTpdtVertex / (*areaVertex);
+      tractionTpdtVertex = lagrangeTpdtVertex / (*areaVertex);      
       
       // Use fault constitutive model to compute traction associated with
       // friction.
@@ -768,7 +770,8 @@
 	      
 	      // Update slip based on value required to stick versus
 	      // zero traction
-	      slipVertex[0] += Spp * tractionTpdtVertex[0];
+	      dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
+	      slipVertex[0] += Spp * dLagrangeTpdtVertex[0];
 
 	      // Set traction to zero.
 	      tractionTpdtVertex[0] = 0.0;
@@ -813,7 +816,9 @@
 		std::cout << "LIMIT TRACTION, HAVE SLIDING" << std::endl;
 
 		// Update slip based on value required to stick versus friction
-		slipVertex[0] += Spp * (tractionTpdtVertex[0]-friction);
+		dLagrangeTpdtVertex[0] = 
+		  (tractionTpdtVertex[0] - friction) * (*areaVertex);
+		slipVertex[0] += Spp * dLagrangeTpdtVertex[0];
 		std::cout << "Estimated slip: " << slipVertex[0] << std::endl;
 		// Limit traction
 		tractionTpdtVertex[0] = friction;
@@ -828,13 +833,15 @@
 	      
 		// Update slip based on value required to stick versus
 		// zero traction
+	      dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
+	      dLagrangeTpdtVertex[1] = tractionTpdtVertex[1] * (*areaVertex);
 	      slipVertex[0] += 
-		Spp * tractionTpdtVertex[0] +
-		Spq * tractionTpdtVertex[1];
+		Spp * dLagrangeTpdtVertex[0] +
+		Spq * dLagrangeTpdtVertex[1];
 	      slipVertex[1] += 
-		Spq * tractionTpdtVertex[0] +
-		Sqq * tractionTpdtVertex[1];
-
+		Spq * dLagrangeTpdtVertex[0] +
+		Sqq * dLagrangeTpdtVertex[1];
+	      
 	      // Set traction to zero
 	      tractionTpdtVertex = 0.0;
 	    } // else
@@ -892,22 +899,29 @@
 		std::cout << "LIMIT TRACTION, HAVE SLIDING" << std::endl;
 
 		// Update slip based on value required to stick versus friction
-		slipVertex[0] += Spp * (tractionShearVertex-friction) 
-		  *tractionTpdtVertex[0] / tractionShearVertex +
-		                  Spq * (tractionShearVertex-friction) 
-		  *tractionTpdtVertex[1]/ tractionShearVertex;
+		dLagrangeTpdtVertex[0] = (tractionShearVertex-friction) *
+		  tractionTpdtVertex[0] / tractionShearVertex * (*areaVertex);
+		dLagrangeTpdtVertex[1] = (tractionShearVertex-friction) *
+		  tractionTpdtVertex[1] / tractionShearVertex * (*areaVertex);
+		slipVertex[0] += 
+		  Spp * dLagrangeTpdtVertex[0] +
+		  Spq * dLagrangeTpdtVertex[1];
 
-		slipVertex[1] += Spq * (tractionShearVertex-friction) 
-		  *tractionTpdtVertex[0] / tractionShearVertex +
-		                  Sqq * (tractionShearVertex-friction) 
-		  *tractionTpdtVertex[1]/ tractionShearVertex;
+		slipVertex[1] += 
+		  Spq * dLagrangeTpdtVertex[0] +
+		  Sqq * dLagrangeTpdtVertex[1];
 
+	      std::cout << "Estimated slip: "
+			<< "  " << slipVertex[0]
+			<< "  " << slipVertex[1]
+			<< "  " << slipVertex[2]
+			<< std::endl;
 
-
-		std::cout << "Estimated slip: " << slipVertex[0] << std::endl;
 		// Limit traction
-		tractionTpdtVertex[0] = friction *tractionTpdtVertex[0]/ tractionShearVertex;
-		tractionTpdtVertex[1] = friction *tractionTpdtVertex[1]/ tractionShearVertex;
+		tractionTpdtVertex[0] = 
+		  friction * tractionTpdtVertex[0] / tractionShearVertex;
+		tractionTpdtVertex[1] = 
+		  friction * tractionTpdtVertex[1] / tractionShearVertex;
 	      } else {
 		// else friction exceeds value necessary, so stick
 		std::cout << "STICK" << std::endl;
@@ -919,19 +933,28 @@
 	      
 		// Update slip based on value required to stick versus
 		// zero traction
+	      dLagrangeTpdtVertex[0] = tractionTpdtVertex[0] * (*areaVertex);
+	      dLagrangeTpdtVertex[1] = tractionTpdtVertex[1] * (*areaVertex);
+	      dLagrangeTpdtVertex[2] = tractionTpdtVertex[2] * (*areaVertex);
 	      slipVertex[0] += 
-		Spp * tractionTpdtVertex[0] +
-		Spq * tractionTpdtVertex[1] +
-		Spr * tractionTpdtVertex[2];
+		Spp * dLagrangeTpdtVertex[0] +
+		Spq * dLagrangeTpdtVertex[1] +
+		Spr * dLagrangeTpdtVertex[2];
 	      slipVertex[1] += 
-		Spq * tractionTpdtVertex[0] +
-		Sqq * tractionTpdtVertex[1] +
-		Sqr * tractionTpdtVertex[2];
+		Spq * dLagrangeTpdtVertex[0] +
+		Sqq * dLagrangeTpdtVertex[1] +
+		Sqr * dLagrangeTpdtVertex[2];
 	      slipVertex[2] += 
-		Spr * tractionTpdtVertex[0] +
-		Sqr * tractionTpdtVertex[1] +
-		Srr * tractionTpdtVertex[2];
+		Spr * dLagrangeTpdtVertex[0] +
+		Sqr * dLagrangeTpdtVertex[1] +
+		Srr * dLagrangeTpdtVertex[2];
 
+	      std::cout << "Estimated slip: "
+			<< "  " << slipVertex[0]
+			<< "  " << slipVertex[1]
+			<< "  " << slipVertex[2]
+			<< std::endl;
+
 	      // Set traction to zero
 	      tractionTpdtVertex = 0.0;
 	    } // else



More information about the CIG-COMMITS mailing list