[cig-commits] r16234 - short/3D/PyLith/trunk/libsrc/feassemble
brad at geodynamics.org
brad at geodynamics.org
Thu Feb 4 17:51:46 PST 2010
Author: brad
Date: 2010-02-04 17:51:46 -0800 (Thu, 04 Feb 2010)
New Revision: 16234
Modified:
short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc
Log:
More work on optimizing lumped solve.
Modified: short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc 2010-02-05 01:50:58 UTC (rev 16233)
+++ short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc 2010-02-05 01:51:46 UTC (rev 16234)
@@ -466,6 +466,7 @@
const double dt = _dt;
const double dt2 = dt*dt;
assert(dt > 0);
+ double_array valuesIJ(numBasis);
_logger->eventEnd(setupEvent);
#if !defined(DETAILED_EVENT_LOGGING)
@@ -552,6 +553,7 @@
// Compute action for inertial terms
const double_array& density = _material->calcDensity();
+#if 1
for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
const double wt = quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad]
/ dt2;
@@ -568,8 +570,46 @@
} // 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
#if defined(DETAILED_EVENT_LOGGING)
- PetscLogFlops(numQuadPts*(4+numBasis+numBasis*(1+spaceDim*2)));
+ PetscLogFlops(numQuadPts*(4+numBasis*3) + numBasis*spaceDim*3);
_logger->eventEnd(computeEvent);
_logger->eventBegin(stressEvent);
#endif
@@ -820,6 +860,7 @@
const double dt = _dt;
const double dt2 = dt*dt;
assert(dt > 0);
+ double_array valuesIJ(numBasis);
// Get sections
double_array dispTCell(numBasis*spaceDim);
@@ -884,7 +925,8 @@
const double_array& density = _material->calcDensity();
// Compute Jacobian for inertial terms
- for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
+#if 1
+ for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
const double wt = quadWts[iQuad] * jacobianDet[iQuad] * density[iQuad]
/ dt2;
const int iQ = iQuad * numBasis;
@@ -902,8 +944,27 @@
_cellVector[iBasis*spaceDim+iDim] = _cellVector[iBasis*spaceDim];
} // for
} // for
+ #else
+ valuesIJ = 0.0;
+ 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
+ for (int iBasis = 0; iBasis < numBasis; ++iBasis)
+ for (int iDim = 0; iDim < spaceDim; ++iDim)
+ _cellVector[iBasis*spaceDim+iDim] += valuesIJ[iBasis];
+#endif
+
#if defined(DETAILED_EVENT_LOGGING)
- PetscLogFlops(numQuadPts*(4+numBasis+numBasis*(1+spaceDim)));
+ PetscLogFlops(numQuadPts*(4 + numBasis*3) + numBasis*spaceDim);
_logger->eventEnd(computeEvent);
_logger->eventBegin(updateEvent);
#endif
@@ -918,7 +979,7 @@
} // for
#if !defined(DETAILED_EVENT_LOGGING)
- PetscLogFlops(cells->size()*numQuadPts*(4+numBasis+numBasis*(1+spaceDim)));
+ PetscLogFlops(cells->size()*numQuadPts*(4 + numBasis*3) + numBasis*spaceDim);
_logger->eventEnd(computeEvent);
#endif
More information about the CIG-COMMITS
mailing list