[cig-commits] r16238 - short/3D/PyLith/trunk/libsrc/feassemble

brad at geodynamics.org brad at geodynamics.org
Sun Feb 7 18:08:04 PST 2010


Author: brad
Date: 2010-02-07 18:08:04 -0800 (Sun, 07 Feb 2010)
New Revision: 16238

Modified:
   short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc
Log:
Fixed bugs in optimization of computing lumped intertial terms.

Modified: short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc	2010-02-08 02:06:19 UTC (rev 16237)
+++ short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc	2010-02-08 02:08:04 UTC (rev 16238)
@@ -411,8 +411,10 @@
       &pylith::feassemble::ElasticityExplicit::_elasticityResidual3D;
     calcTotalStrainFn =
       &pylith::feassemble::IntegratorElasticity::_calcTotalStrain3D;
-  } else
+  } else {
     assert(0);
+    throw std::runtime_error("Error unknown cell dimension.");
+  } // if/else
 
   // Allocate vectors for cell values.
   double_array dispTCell(numBasis*spaceDim);
@@ -553,61 +555,23 @@
 
     // Compute action for inertial terms
     const double_array& density = _material->calcDensity();
-#if 1
+    valuesIJ = 0.0;
     for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
       const double wt = quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad]
-          / dt2;
+	/ dt2;
       const int iQ = iQuad * numBasis;
       double valJ = 0.0;
       for (int jBasis = 0; jBasis < numBasis; ++jBasis)
-        valJ += basis[iQ + jBasis];
+	valJ += basis[iQ + jBasis];
       valJ *= wt;
-      for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
-        const double valIJ = basis[iQ + iBasis] * valJ;
-        for (int iDim = 0; iDim < spaceDim; ++iDim) {
-          _cellVector[iBasis*spaceDim+iDim] += valIJ *
-              (dispTCell[iBasis*spaceDim+iDim] - dispTmdtCell[iBasis*spaceDim+iDim]);
-        } // for
-      } // for
-    } // for
-#else
-    valuesIJ = 0.0;
-    if (spaceDim != 3 || numBasis != 8 || numQuadPts != 8) {
-      for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
-        const double wt = quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad]
-            / dt2;
-        const int iQ = iQuad * numBasis;
-        double valJ = 0.0;
-        for (int jBasis = 0; jBasis < numBasis; ++jBasis)
-          valJ += basis[iQ + jBasis];
-        valJ *= wt;
-        for (int iBasis = 0; iBasis < numBasis; ++iBasis)
-          valuesIJ[iBasis] = basis[iQ + iBasis] * valJ;
-      } // for
       for (int iBasis = 0; iBasis < numBasis; ++iBasis)
-        for (int iDim = 0; iDim < spaceDim; ++iDim)
-          _cellVector[iBasis*spaceDim+iDim] += valuesIJ[iBasis] *
-                (dispTCell[iBasis*spaceDim+iDim] - dispTmdtCell[iBasis*spaceDim+iDim]);
-    } else {
-      for (int iQuad = 0; iQuad < 8; ++iQuad) {
-        const double wt = quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad]
-            / dt2;
-        const int iQ = iQuad * 8;
-        double valJ = 0.0;
-        for (int jBasis = 0; jBasis < 8; ++jBasis)
-          valJ += basis[iQ + jBasis];
-        valJ *= wt;
-        for (int iBasis = 0; iBasis < 8; ++iBasis)
-          valuesIJ[iBasis] += basis[iQ + iBasis] * valJ;
-      } // for
-      for (int iBasis = 0; iBasis < 8; ++iBasis) {
-        for (int iDim = 0; iDim < 3; ++iDim) {
-          _cellVector[iBasis*3+iDim] += valuesIJ[iBasis] *
-              (dispTCell[iBasis*3+iDim] - dispTmdtCell[iBasis*3+iDim]);
-        } // for
-      } // for
-    } // if/else
-#endif
+	valuesIJ[iBasis] += basis[iQ + iBasis] * valJ;
+    } // for
+    for (int iBasis = 0; iBasis < numBasis; ++iBasis)
+      for (int iDim = 0; iDim < spaceDim; ++iDim)
+	_cellVector[iBasis*spaceDim+iDim] += valuesIJ[iBasis] *
+	  (dispTCell[iBasis*spaceDim+iDim] - dispTmdtCell[iBasis*spaceDim+iDim]);
+
 #if defined(DETAILED_EVENT_LOGGING)
     PetscLogFlops(numQuadPts*(4+numBasis*3) + numBasis*spaceDim*3);
     _logger->eventEnd(computeEvent);
@@ -641,7 +605,7 @@
   } // for
 
 #if !defined(DETAILED_EVENT_LOGGING)
-  PetscLogFlops(cells->size()*numQuadPts*(4+numBasis+numBasis*(1+spaceDim*2)));
+  PetscLogFlops(cells->size()*(numQuadPts*(4+numBasis*3)+numBasis*spaceDim*3));
   _logger->eventEnd(computeEvent);
 #endif
 } // integrateResidualLumped
@@ -925,10 +889,10 @@
     const double_array& density = _material->calcDensity();
 
     // Compute Jacobian for inertial terms
-#if 1
-     for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
+#if 0
+    for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
       const double wt = quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad]
-          / dt2;
+	/ dt2;
       const int iQ = iQuad * numBasis;
       double valJ = 0.0;
       for (int jBasis = 0; jBasis < numBasis; ++jBasis)
@@ -938,17 +902,16 @@
         // Compute value for DOF 0
         const double valIJ = basis[iQ + iBasis] * valJ;
         _cellVector[iBasis*spaceDim] += valIJ;
-
-        // Copy values to DOF 1 and 2
-        for (int iDim = 1; iDim < spaceDim; ++iDim)
-          _cellVector[iBasis*spaceDim+iDim] = _cellVector[iBasis*spaceDim];
       } // for
     } // for
+    for (int iBasis = 0; iBasis < numBasis; ++iBasis)
+      for (int iDim = 1; iDim < spaceDim; ++iDim)
+	_cellVector[iBasis*spaceDim+iDim] += _cellVector[iBasis*spaceDim];
  #else
     valuesIJ = 0.0;
     for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
       const double wt = quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad]
-          / dt2;
+	/ dt2;
       const int iQ = iQuad * numBasis;
       double valJ = 0.0;
       for (int jBasis = 0; jBasis < numBasis; ++jBasis)
@@ -962,7 +925,7 @@
       for (int iDim = 0; iDim < spaceDim; ++iDim)
         _cellVector[iBasis*spaceDim+iDim] += valuesIJ[iBasis];
 #endif
-
+    
 #if defined(DETAILED_EVENT_LOGGING)
     PetscLogFlops(numQuadPts*(4 + numBasis*3) + numBasis*spaceDim);
     _logger->eventEnd(computeEvent);
@@ -979,7 +942,7 @@
   } // for
 
 #if !defined(DETAILED_EVENT_LOGGING)
-  PetscLogFlops(cells->size()*numQuadPts*(4 + numBasis*3) + numBasis*spaceDim);
+  PetscLogFlops(cells->size()*(numQuadPts*(4 + numBasis*3) + numBasis*spaceDim));
   _logger->eventEnd(computeEvent);
 #endif
 



More information about the CIG-COMMITS mailing list