[cig-commits] r16206 - in short/3D/PyLith/trunk/libsrc: bc faults feassemble
brad at geodynamics.org
brad at geodynamics.org
Mon Feb 1 14:44:52 PST 2010
Author: brad
Date: 2010-02-01 14:44:51 -0800 (Mon, 01 Feb 2010)
New Revision: 16206
Modified:
short/3D/PyLith/trunk/libsrc/bc/AbsorbingDampers.cc
short/3D/PyLith/trunk/libsrc/bc/AbsorbingDampers.hh
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc
short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh
short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.cc
short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.hh
Log:
Added fine scale logging to integrateResidual() and integrateJacobian() for AbsorbingDampers and FaultCohesiveKin.
Modified: short/3D/PyLith/trunk/libsrc/bc/AbsorbingDampers.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/bc/AbsorbingDampers.cc 2010-02-01 20:05:58 UTC (rev 16205)
+++ short/3D/PyLith/trunk/libsrc/bc/AbsorbingDampers.cc 2010-02-01 22:44:51 UTC (rev 16206)
@@ -71,6 +71,8 @@
assert(0 != _quadrature);
assert(0 != _db);
+ _initializeLogger();
+
double_array up(upDir, 3);
const int numCorners = _quadrature->numBasis();
@@ -249,7 +251,16 @@
assert(0 != _boundaryMesh);
assert(0 != _parameters);
assert(0 != fields);
+ assert(0 != _logger);
+ const int setupEvent = _logger->eventId("AdIR setup");
+ const int geometryEvent = _logger->eventId("AdIR geometry");
+ const int computeEvent = _logger->eventId("AdIR compute");
+ const int restrictEvent = _logger->eventId("AdIR restrict");
+ const int updateEvent = _logger->eventId("AdIR update");
+
+ _logger->eventBegin(setupEvent);
+
// Get cell geometry information that doesn't depend on cell
const int numQuadPts = _quadrature->numQuadPts();
const double_array& quadWts = _quadrature->quadWts();
@@ -293,12 +304,16 @@
topology::Mesh::RestrictVisitor dispTmdtVisitor(*dispTmdtSection,
numBasis*spaceDim);
+ _logger->eventEnd(setupEvent);
+
#if !defined(PRECOMPUTE_GEOMETRY)
+ _logger->eventBegin(geometryEvent);
double_array coordinatesCell(numBasis*spaceDim);
const ALE::Obj<RealSection>& coordinates =
sieveSubMesh->getRealSection("coordinates");
RestrictVisitor coordsVisitor(*coordinates,
coordinatesCell.size(), &coordinatesCell[0]);
+ _logger->eventEnd(geometryEvent);
#endif
// Get parameters used in integration.
@@ -309,6 +324,7 @@
c_iter != cellsEnd;
++c_iter) {
// Get geometry information for current cell
+ _logger->eventBegin(geometryEvent);
#if defined(PRECOMPUTE_GEOMETRY)
_quadrature->retrieveGeometry(*c_iter);
#else
@@ -316,11 +332,13 @@
sieveSubMesh->restrictClosure(*c_iter, coordsVisitor);
_quadrature->computeGeometry(coordinatesCell, *c_iter);
#endif
+ _logger->eventEnd(geometryEvent);
// Reset element vector to zero
_resetCellVector();
// Restrict input fields to cell
+ _logger->eventBegin(restrictEvent);
dispTVisitor.clear();
sieveSubMesh->restrictClosure(*c_iter, dispTVisitor);
const double* dispTCell = dispTVisitor.getValues();
@@ -331,6 +349,9 @@
dampersSection->restrictPoint(*c_iter, &dampersCell[0], dampersCell.size());
+ _logger->eventEnd(restrictEvent);
+ _logger->eventBegin(computeEvent);
+
// Get cell geometry information that depends on cell
const double_array& basis = _quadrature->basis();
const double_array& jacobianDet = _quadrature->jacobianDet();
@@ -351,14 +372,17 @@
dispTCell[jBasis*spaceDim+iDim]);
} // for
} // for
-
} // for
- PetscLogFlops(numQuadPts*(3+numBasis*(1+numBasis*(5*spaceDim))));
+ _logger->eventEnd(computeEvent);
// Assemble cell contribution into field
+ _logger->eventBegin(updateEvent);
residualVisitor.clear();
sieveSubMesh->updateClosure(*c_iter, residualVisitor);
+ _logger->eventEnd(updateEvent);
} // for
+
+ PetscLogFlops(cells->size()*numQuadPts*(3+numBasis*(1+numBasis*(5*spaceDim))));
} // integrateResidual
// ----------------------------------------------------------------------
@@ -371,9 +395,18 @@
{ // integrateJacobian
assert(0 != _quadrature);
assert(0 != _boundaryMesh);
+ assert(0 != _logger);
assert(0 != jacobian);
assert(0 != fields);
+ const int setupEvent = _logger->eventId("AdIJ setup");
+ const int geometryEvent = _logger->eventId("AdIJ geometry");
+ const int computeEvent = _logger->eventId("AdIJ compute");
+ const int restrictEvent = _logger->eventId("AdIJ restrict");
+ const int updateEvent = _logger->eventId("AdIJ update");
+
+ _logger->eventBegin(setupEvent);
+
// Get cell geometry information that doesn't depend on cell
const int numQuadPts = _quadrature->numQuadPts();
const double_array& quadWts = _quadrature->quadWts();
@@ -408,13 +441,7 @@
(int) pow(sieveMesh->getSieve()->getMaxConeSize(),
sieveMesh->depth())*spaceDim);
-#if !defined(PRECOMPUTE_GEOMETRY)
- double_array coordinatesCell(numBasis*spaceDim);
- const ALE::Obj<RealSection>& coordinates =
- sieveSubMesh->getRealSection("coordinates");
- RestrictVisitor coordsVisitor(*coordinates,
- coordinatesCell.size(), &coordinatesCell[0]);
-#endif
+ _logger->eventEnd(setupEvent);
// Get sparse matrix
const PetscMat jacobianMat = jacobian->matrix();
@@ -427,10 +454,21 @@
// Allocate matrix for cell values.
_initCellMatrix();
+#if !defined(PRECOMPUTE_GEOMETRY)
+ _logger->eventBegin(geometryEvent);
+ double_array coordinatesCell(numBasis*spaceDim);
+ const ALE::Obj<RealSection>& coordinates =
+ sieveSubMesh->getRealSection("coordinates");
+ RestrictVisitor coordsVisitor(*coordinates,
+ coordinatesCell.size(), &coordinatesCell[0]);
+ _logger->eventEnd(geometryEvent);
+#endif
+
for (SieveSubMesh::label_sequence::iterator c_iter=cellsBegin;
c_iter != cellsEnd;
++c_iter) {
// Compute geometry information for current cell
+ _logger->eventBegin(geometryEvent);
#if defined(PRECOMPUTE_GEOMETRY)
_quadrature->retrieveGeometry(*c_iter);
#else
@@ -438,7 +476,16 @@
sieveSubMesh->restrictClosure(*c_iter, coordsVisitor);
_quadrature->computeGeometry(coordinatesCell, *c_iter);
#endif
+ _logger->eventEnd(geometryEvent);
+ // Get damping constants
+ _logger->eventBegin(restrictEvent);
+ assert(numQuadPts*spaceDim == dampersSection->getFiberDimension(*c_iter));
+ const double* dampingConstsCell = dampersSection->restrictPoint(*c_iter);
+ _logger->eventEnd(restrictEvent);
+
+ _logger->eventBegin(computeEvent);
+
// Reset element vector to zero
_resetCellMatrix();
@@ -446,9 +493,6 @@
const double_array& basis = _quadrature->basis();
const double_array& jacobianDet = _quadrature->jacobianDet();
- assert(numQuadPts*spaceDim == dampersSection->getFiberDimension(*c_iter));
- const double* dampingConstsCell = dampersSection->restrictPoint(*c_iter);
-
// Compute Jacobian for absorbing bc terms
for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
const double wt =
@@ -466,16 +510,20 @@
} // for
} // for
} // for
- PetscLogFlops(numQuadPts*(3+numBasis*(1+numBasis*(1+2*spaceDim))));
+ _logger->eventEnd(computeEvent);
// Assemble cell contribution into PETSc Matrix
+ _logger->eventBegin(updateEvent);
jacobianVisitor.clear();
PetscErrorCode err = updateOperator(jacobianMat, *sieveSubMesh->getSieve(),
jacobianVisitor, *c_iter,
&_cellMatrix[0], ADD_VALUES);
CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
+ _logger->eventEnd(updateEvent);
} // for
+ PetscLogFlops(cells->size()*numQuadPts*(3+numBasis*(1+numBasis*(1+2*spaceDim))));
+
_needNewJacobian = false;
} // integrateJacobian
@@ -489,9 +537,18 @@
{ // integrateJacobian
assert(0 != _quadrature);
assert(0 != _boundaryMesh);
+ assert(0 != _logger);
assert(0 != jacobian);
assert(0 != fields);
+ const int setupEvent = _logger->eventId("AdIJ setup");
+ const int geometryEvent = _logger->eventId("AdIJ geometry");
+ const int computeEvent = _logger->eventId("AdIJ compute");
+ const int restrictEvent = _logger->eventId("AdIJ restrict");
+ const int updateEvent = _logger->eventId("AdIJ update");
+
+ _logger->eventBegin(setupEvent);
+
// Get cell geometry information that doesn't depend on cell
const int numQuadPts = _quadrature->numQuadPts();
const double_array& quadWts = _quadrature->quadWts();
@@ -532,18 +589,23 @@
topology::Mesh::UpdateAddVisitor jacobianVisitor(*jacobianSection,
&_cellVector[0]);
+ _logger->eventEnd(setupEvent);
+
#if !defined(PRECOMPUTE_GEOMETRY)
+ _logger->eventBegin(geometryEvent);
double_array coordinatesCell(numBasis*spaceDim);
const ALE::Obj<RealSection>& coordinates =
sieveSubMesh->getRealSection("coordinates");
RestrictVisitor coordsVisitor(*coordinates,
coordinatesCell.size(), &coordinatesCell[0]);
+ _logger->eventEnd(geometryEvent);
#endif
for (SieveSubMesh::label_sequence::iterator c_iter=cellsBegin;
c_iter != cellsEnd;
++c_iter) {
// Compute geometry information for current cell
+ _logger->eventBegin(geometryEvent);
#if defined(PRECOMPUTE_GEOMETRY)
_quadrature->retrieveGeometry(*c_iter);
#else
@@ -551,7 +613,16 @@
sieveSubMesh->restrictClosure(*c_iter, coordsVisitor);
_quadrature->computeGeometry(coordinatesCell, *c_iter);
#endif
+ _logger->eventEnd(geometryEvent);
+ // Get damping constants
+ _logger->eventBegin(restrictEvent);
+ assert(numQuadPts*spaceDim == dampersSection->getFiberDimension(*c_iter));
+ const double* dampingConstsCell = dampersSection->restrictPoint(*c_iter);
+ _logger->eventEnd(restrictEvent);
+
+ _logger->eventBegin(computeEvent);
+
// Reset element vector to zero
_resetCellMatrix();
@@ -559,9 +630,6 @@
const double_array& basis = _quadrature->basis();
const double_array& jacobianDet = _quadrature->jacobianDet();
- assert(numQuadPts*spaceDim == dampersSection->getFiberDimension(*c_iter));
- const double* dampingConstsCell = dampersSection->restrictPoint(*c_iter);
-
// Compute Jacobian for absorbing bc terms
for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
const double wt =
@@ -579,13 +647,17 @@
} // for
} // for
} // for
- PetscLogFlops(numQuadPts*(3+numBasis*(1+numBasis*(1+2*spaceDim))));
_lumpCellMatrix();
+ _logger->eventEnd(computeEvent);
+
// Assemble cell contribution into lumped matrix.
+ _logger->eventBegin(updateEvent);
jacobianVisitor.clear();
sieveSubMesh->updateClosure(*c_iter, jacobianVisitor);
+ _logger->eventEnd(updateEvent);
} // for
+ PetscLogFlops(cells->size()*numQuadPts*(3+numBasis*(1+numBasis*(1+2*spaceDim))));
_needNewJacobian = false;
} // integrateJacobian
@@ -598,5 +670,28 @@
BCIntegratorSubMesh::verifyConfiguration(mesh);
} // verifyConfiguration
+// ----------------------------------------------------------------------
+// Initialize logger.
+void
+pylith::bc::AbsorbingDampers::_initializeLogger(void)
+{ // initializeLogger
+ delete _logger; _logger = new utils::EventLogger;
+ assert(0 != _logger);
+ _logger->className("AbsorbingDampers");
+ _logger->initialize();
+ _logger->registerEvent("AdIR setup");
+ _logger->registerEvent("AdIR geometry");
+ _logger->registerEvent("AdIR compute");
+ _logger->registerEvent("AdIR restrict");
+ _logger->registerEvent("AdIR update");
+
+ _logger->registerEvent("AdIJ setup");
+ _logger->registerEvent("AdIJ geometry");
+ _logger->registerEvent("AdIJ compute");
+ _logger->registerEvent("AdIJ restrict");
+ _logger->registerEvent("AdIJ update");
+} // initializeLogger
+
+
// End of file
Modified: short/3D/PyLith/trunk/libsrc/bc/AbsorbingDampers.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/bc/AbsorbingDampers.hh 2010-02-01 20:05:58 UTC (rev 16205)
+++ short/3D/PyLith/trunk/libsrc/bc/AbsorbingDampers.hh 2010-02-01 22:44:51 UTC (rev 16206)
@@ -124,6 +124,12 @@
*/
void verifyConfiguration(const topology::Mesh& mesh) const;
+ // PRIVATE METHODS ////////////////////////////////////////////////////
+private :
+
+ /// Initialize logger.
+ void _initializeLogger(void);
+
// PRIVATE MEMBERS ////////////////////////////////////////////////////
private :
Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc 2010-02-01 20:05:58 UTC (rev 16205)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.cc 2010-02-01 22:44:51 UTC (rev 16206)
@@ -99,6 +99,8 @@
assert(0 != _quadrature);
assert(0 != _normalizer);
+ _initializeLogger();
+
const spatialdata::geocoords::CoordSys* cs = mesh.coordsys();
assert(0 != cs);
@@ -212,6 +214,7 @@
assert(0 != fields);
assert(0 != _quadrature);
assert(0 != _fields);
+ assert(0 != _logger);
// Cohesive cells with normal vertices i and j, and constraint
// vertex k make 2 contributions to the residual:
@@ -220,6 +223,14 @@
// slip -[C]^T{L(t)+dL(t)}
// * DOF k: slip values -[C]{u(t)+dt(t)}
+ const int setupEvent = _logger->eventId("FkIR setup");
+ const int geometryEvent = _logger->eventId("FkIR geometry");
+ const int computeEvent = _logger->eventId("FkIR compute");
+ const int restrictEvent = _logger->eventId("FkIR restrict");
+ const int updateEvent = _logger->eventId("FkIR update");
+
+ _logger->eventBegin(setupEvent);
+
// Get cell information and setup storage for cell data
const int spaceDim = _quadrature->spaceDim();
const int orientationSize = spaceDim*spaceDim;
@@ -299,6 +310,8 @@
coordinatesCell.size(),
&coordinatesCell[0]);
+ _logger->eventEnd(setupEvent);
+
for (SieveMesh::label_sequence::iterator c_iter=cellsCohesiveBegin;
c_iter != cellsCohesiveEnd;
++c_iter) {
@@ -307,6 +320,7 @@
residualCell = 0.0;
// Compute geometry information for current cell
+ _logger->eventBegin(geometryEvent);
#if defined(PRECOMPUTE_GEOMETRY)
_quadrature->retrieveGeometry(c_fault);
#else
@@ -314,19 +328,14 @@
faultSieveMesh->restrictClosure(c_fault, coordsVisitor);
_quadrature->computeGeometry(coordinatesCell, c_fault);
#endif
+ _logger->eventEnd(geometryEvent);
+
// Get cell geometry information that depends on cell
const double_array& basis = _quadrature->basis();
const double_array& jacobianDet = _quadrature->jacobianDet();
- // Compute contributory area for cell (to weight contributions)
- for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
- const double wt = quadWts[iQuad] * jacobianDet[iQuad];
- for (int iBasis=0; iBasis < numBasis; ++iBasis) {
- const double dArea = wt*basis[iQuad*numBasis+iBasis];
- areaVertexCell[iBasis] += dArea;
- } // for
- } // for
-
+ _logger->eventBegin(restrictEvent);
+
// Get orientations at fault cell's vertices.
orientationVisitor.clear();
faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
@@ -343,51 +352,63 @@
dispTIncrVisitor.clear();
sieveMesh->restrictClosure(*c_iter, dispTIncrVisitor);
+ _logger->eventEnd(restrictEvent);
+ _logger->eventBegin(computeEvent);
+
// Compute current estimate of displacement at time t+dt using
// solution increment.
dispTpdtCell = dispTCell + dispTIncrCell;
- for (int iConstraint=0; iConstraint < numConstraintVert; ++iConstraint) {
+ // Compute contributory area for cell (to weight contributions)
+ for (int iQuad = 0; iQuad < numQuadPts; ++iQuad) {
+ const double wt = quadWts[iQuad] * jacobianDet[iQuad];
+ for (int iBasis = 0; iBasis < numBasis; ++iBasis) {
+ const double dArea = wt * basis[iQuad * numBasis + iBasis];
+ areaVertexCell[iBasis] += dArea;
+ } // for
+ } // for
+
+ for (int iConstraint = 0; iConstraint < numConstraintVert; ++iConstraint) {
// Blocks in cell matrix associated with normal cohesive
// vertices i and j and constraint vertex k
const int indexI = iConstraint;
- const int indexJ = iConstraint + numConstraintVert;
- const int indexK = iConstraint + 2*numConstraintVert;
+ const int indexJ = iConstraint + numConstraintVert;
+ const int indexK = iConstraint + 2 * numConstraintVert;
assert(areaCell[iConstraint] > 0);
const double wt = areaVertexCell[iConstraint] / areaCell[iConstraint];
-
+
// Get orientation at constraint vertex
- const double* orientationVertex =
- &orientationCell[iConstraint*orientationSize];
+ const double* orientationVertex = &orientationCell[iConstraint
+ * orientationSize];
assert(0 != orientationVertex);
-
+
// Entries associated with constraint forces applied at node i
- for (int iDim=0; iDim < spaceDim; ++iDim) {
- for (int kDim=0; kDim < spaceDim; ++kDim)
- residualCell[indexI*spaceDim+iDim] -=
- dispTpdtCell[indexK*spaceDim+kDim] *
- -orientationVertex[kDim*spaceDim+iDim] * wt;
+ for (int iDim = 0; iDim < spaceDim; ++iDim) {
+ for (int kDim = 0; kDim < spaceDim; ++kDim)
+ residualCell[indexI * spaceDim + iDim] -= dispTpdtCell[indexK
+ * spaceDim + kDim] * -orientationVertex[kDim * spaceDim + iDim]
+ * wt;
} // for
-
+
// Entries associated with constraint forces applied at node j
- for (int jDim=0; jDim < spaceDim; ++jDim) {
- for (int kDim=0; kDim < spaceDim; ++kDim)
- residualCell[indexJ*spaceDim+jDim] -=
- dispTpdtCell[indexK*spaceDim+kDim] *
- orientationVertex[kDim*spaceDim+jDim] * wt;
+ for (int jDim = 0; jDim < spaceDim; ++jDim) {
+ for (int kDim = 0; kDim < spaceDim; ++kDim)
+ residualCell[indexJ * spaceDim + jDim] -= dispTpdtCell[indexK
+ * spaceDim + kDim] * orientationVertex[kDim * spaceDim + jDim]
+ * wt;
} // for
// Entries associated with relative displacements between node i
// and node j for constraint node k
- for (int kDim=0; kDim < spaceDim; ++kDim) {
- for (int iDim=0; iDim < spaceDim; ++iDim)
- residualCell[indexK*spaceDim+kDim] -=
- (dispTpdtCell[indexJ*spaceDim+iDim] -
- dispTpdtCell[indexI*spaceDim+iDim]) *
- orientationVertex[kDim*spaceDim+iDim] * wt;
+ for (int kDim = 0; kDim < spaceDim; ++kDim) {
+ for (int iDim = 0; iDim < spaceDim; ++iDim)
+ residualCell[indexK * spaceDim + kDim] -= (dispTpdtCell[indexJ
+ * spaceDim + iDim] - dispTpdtCell[indexI * spaceDim + iDim])
+ * orientationVertex[kDim * spaceDim + iDim] * wt;
} // for
} // for
+ _logger->eventEnd(computeEvent);
#if 0 // DEBUGGING
std::cout << "Updating fault residual for cell " << *c_iter << std::endl;
@@ -405,8 +426,10 @@
}
#endif
+ _logger->eventBegin(updateEvent);
residualVisitor.clear();
sieveMesh->updateClosure(*c_iter, residualVisitor);
+ _logger->eventEnd(updateEvent);
} // for
// FIX THIS
@@ -424,12 +447,21 @@
{ // integrateResidualAssembled
assert(0 != fields);
assert(0 != _fields);
+ assert(0 != _logger);
// Cohesive cells with normal vertices i and j, and constraint
// vertex k make contributions to the assembled residual:
//
// * DOF k: slip values {D(t+dt)}
+ const int setupEvent = _logger->eventId("FkIR setup");
+ const int geometryEvent = _logger->eventId("FkIR geometry");
+ const int computeEvent = _logger->eventId("FkIR compute");
+ const int restrictEvent = _logger->eventId("FkIR restrict");
+ const int updateEvent = _logger->eventId("FkIR update");
+
+ _logger->eventBegin(setupEvent);
+
topology::Field<topology::SubMesh>& slip = _fields->get("slip");
slip.zero();
// Compute slip field at current time step
@@ -466,17 +498,26 @@
const SieveSubMesh::renumbering_type::const_iterator renumberingEnd =
renumbering.end();
+ _logger->eventEnd(setupEvent);
+
for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
v_iter != verticesEnd;
++v_iter)
if (renumbering.find(*v_iter) != renumberingEnd) {
const int vertexFault = renumbering[*v_iter];
const int vertexMesh = *v_iter;
+
+ _logger->eventBegin(restrictEvent);
const double* slipVertex = slipSection->restrictPoint(vertexFault);
+ _logger->eventEnd(restrictEvent);
+
assert(spaceDim == slipSection->getFiberDimension(vertexFault));
assert(spaceDim == residualSection->getFiberDimension(vertexMesh));
assert(0 != slipVertex);
+
+ _logger->eventBegin(updateEvent);
residualSection->updateAddPoint(vertexMesh, slipVertex);
+ _logger->eventEnd(updateEvent);
} // if
} // integrateResidualAssembled
@@ -493,6 +534,14 @@
assert(0 != fields);
assert(0 != _fields);
+ const int setupEvent = _logger->eventId("FkIJ setup");
+ const int geometryEvent = _logger->eventId("FkIJ geometry");
+ const int computeEvent = _logger->eventId("FkIJ compute");
+ const int restrictEvent = _logger->eventId("FkIJ restrict");
+ const int updateEvent = _logger->eventId("FkIJ update");
+
+ _logger->eventBegin(setupEvent);
+
// Add constraint information to Jacobian matrix; these are the
// direction cosines. Entries are associated with vertices ik, jk,
// ki, and kj.
@@ -570,16 +619,23 @@
(int) pow(sieveMesh->getSieve()->getMaxConeSize(),
sieveMesh->depth())*spaceDim);
+ _logger->eventEnd(setupEvent);
+
for (SieveMesh::label_sequence::iterator c_iter=cellsCohesiveBegin;
c_iter != cellsCohesiveEnd;
++c_iter) {
const SieveMesh::point_type c_fault = _cohesiveToFault[*c_iter];
+ _logger->eventBegin(restrictEvent);
+
matrixCell = 0.0;
// Get orientations at fault cell's vertices.
orientationVisitor.clear();
faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
+ _logger->eventEnd(restrictEvent);
+ _logger->eventBegin(computeEvent);
+
for (int iConstraint=0; iConstraint < numConstraintVert; ++iConstraint) {
// Blocks in cell matrix associated with normal cohesive
// vertices i and j and constraint vertex k
@@ -615,12 +671,17 @@
} // for
} // for
+ _logger->eventEnd(computeEvent);
+
// Insert cell contribution into PETSc Matrix
+ _logger->eventBegin(updateEvent);
jacobianVisitor.clear();
PetscErrorCode err = updateOperator(jacobianMatrix, *sieveMesh->getSieve(),
jacobianVisitor, *c_iter,
&matrixCell[0], INSERT_VALUES);
CHECK_PETSC_ERROR_MSG(err, "Update to PETSc Mat failed.");
+ _logger->eventEnd(updateEvent);
+
} // for
PetscLogFlops(cellsCohesiveSize*numConstraintVert*spaceDim*spaceDim*4);
_needNewJacobian = false;
@@ -639,6 +700,14 @@
assert(0 != fields);
assert(0 != _fields);
+ const int setupEvent = _logger->eventId("FkIJ setup");
+ const int geometryEvent = _logger->eventId("FkIJ geometry");
+ const int computeEvent = _logger->eventId("FkIJ compute");
+ const int restrictEvent = _logger->eventId("FkIJ restrict");
+ const int updateEvent = _logger->eventId("FkIJ update");
+
+ _logger->eventBegin(setupEvent);
+
// Add ones to diagonal Jacobian matrix (as field) for
// convenience. Instead of including the constraints in the Jacobian
// matrix, we adjust the solution to account for the Lagrange
@@ -668,13 +737,19 @@
double_array jacobianVertex(spaceDim);
jacobianVertex = 1.0;
const ALE::Obj<RealSection>& jacobianSection = jacobian->section();
- assert(!jacobianSection.isNull());
+ assert(!jacobianSection.isNull());
+
+ _logger->eventEnd(setupEvent);
+
for (SieveSubMesh::label_sequence::iterator v_iter=verticesBegin;
v_iter != verticesEnd;
++v_iter)
if (renumbering.find(*v_iter) != renumberingEnd) {
assert(jacobianSection->getFiberDimension(*v_iter) == spaceDim);
+
+ _logger->eventBegin(updateEvent);
jacobianSection->updatePoint(*v_iter, &jacobianVertex[0]);
+ _logger->eventEnd(updateEvent);
} // if
PetscLogFlops(0);
@@ -715,6 +790,14 @@
// du_i = +A_i^-1 C_ki^T dlk
// du_j = -A_j^-1 C_kj^T dlk
+ const int setupEvent = _logger->eventId("FkAS setup");
+ const int geometryEvent = _logger->eventId("FkAS geometry");
+ const int computeEvent = _logger->eventId("FkAS compute");
+ const int restrictEvent = _logger->eventId("FkAS restrict");
+ const int updateEvent = _logger->eventId("FkAS update");
+
+ _logger->eventBegin(setupEvent);
+
// Get cell information and setup storage for cell data
const int spaceDim = _quadrature->spaceDim();
const int orientationSize = spaceDim*spaceDim;
@@ -803,6 +886,8 @@
coordinatesCell.size(),
&coordinatesCell[0]);
+ _logger->eventEnd(setupEvent);
+
for (SieveMesh::label_sequence::iterator c_iter=cellsCohesiveBegin;
c_iter != cellsCohesiveEnd;
++c_iter) {
@@ -811,6 +896,7 @@
solutionCell = 0.0;
// Compute geometry information for current cell
+ _logger->eventBegin(geometryEvent);
#if defined(PRECOMPUTE_GEOMETRY)
_quadrature->retrieveGeometry(c_fault);
#else
@@ -818,19 +904,14 @@
faultSieveMesh->restrictClosure(c_fault, coordsVisitor);
_quadrature->computeGeometry(coordinatesCell, c_fault);
#endif
+ _logger->eventEnd(geometryEvent);
+
// Get cell geometry information that depends on cell
const double_array& basis = _quadrature->basis();
const double_array& jacobianDet = _quadrature->jacobianDet();
- // Compute contributory area for cell (to weight contributions)
- for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
- const double wt = quadWts[iQuad] * jacobianDet[iQuad];
- for (int iBasis=0; iBasis < numBasis; ++iBasis) {
- const double dArea = wt*basis[iQuad*numBasis+iBasis];
- areaVertexCell[iBasis] += dArea;
- } // for
- } // for
-
+ _logger->eventBegin(restrictEvent);
+
// Get orientations at fault cell's vertices.
orientationVisitor.clear();
faultSieveMesh->restrictClosure(c_fault, orientationVisitor);
@@ -855,6 +936,18 @@
dispTVisitor.clear();
sieveMesh->restrictClosure(*c_iter, dispTVisitor);
+ _logger->eventEnd(restrictEvent);
+ _logger->eventBegin(computeEvent);
+
+ // Compute contributory area for cell (to weight contributions)
+ for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
+ const double wt = quadWts[iQuad] * jacobianDet[iQuad];
+ for (int iBasis=0; iBasis < numBasis; ++iBasis) {
+ const double dArea = wt*basis[iQuad*numBasis+iBasis];
+ areaVertexCell[iBasis] += dArea;
+ } // for
+ } // for
+
for (int iConstraint=0; iConstraint < numConstraintVert; ++iConstraint) {
// Blocks in cell matrix associated with normal cohesive
// vertices i and j and constraint vertex k
@@ -867,7 +960,7 @@
// Get orientation at constraint vertex
const double* orientationVertex =
- &orientationCell[iConstraint*orientationSize];
+ &orientationCell[iConstraint*orientationSize];
assert(0 != orientationVertex);
// Get slip at constraint vertex
@@ -892,150 +985,151 @@
const double* uj = &dispTCell[indexJ*spaceDim];
assert(0 != uj);
- switch(spaceDim)
- { // switch
- case 1 : {
- assert(Ai[0] > 0.0);
- assert(Aj[0] > 0.0);
+ switch (spaceDim) { // switch
+ case 1: {
+ assert(Ai[0] > 0.0);
+ assert(Aj[0] > 0.0);
- const double Sinv = Ai[0] * Aj[0] / (Ai[0] + Aj[0]);
+ const double Sinv = Ai[0] * Aj[0] / (Ai[0] + Aj[0]);
- // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
- const double Aru = ri[0]/Ai[0] - rj[0]/Aj[0] + ui[0] - uj[0];
+ // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+ const double Aru = ri[0] / Ai[0] - rj[0] / Aj[0] + ui[0] - uj[0];
- // dl_k = D^{-1}( - C_{ki} Aru - d_k)
- const double Aruslip = -Aru - slipVertex[0] ;
- const double dlp = wt * Sinv * Aruslip;
+ // dl_k = D^{-1}( - C_{ki} Aru - d_k)
+ const double Aruslip = -Aru - slipVertex[0];
+ const double dlp = wt * Sinv * Aruslip;
- // Update displacements at node I
- solutionCell[indexI*spaceDim+0] = +1.0/Ai[0] * dlp;
+ // Update displacements at node I
+ solutionCell[indexI * spaceDim + 0] = +1.0 / Ai[0] * dlp;
- // Update displacements at node J
- solutionCell[indexJ*spaceDim+0] = -1.0/Aj[0] * dlp;
+ // Update displacements at node J
+ solutionCell[indexJ * spaceDim + 0] = -1.0 / Aj[0] * dlp;
- // Update Lagrange multipliers
- solutionCell[indexK*spaceDim+0] = dlp;
+ // Update Lagrange multipliers
+ solutionCell[indexK * spaceDim + 0] = dlp;
- PetscLogFlops(17);
- break;
- } // case 1
- case 2 : {
- assert(Ai[0] > 0.0);
- assert(Ai[1] > 0.0);
- assert(Aj[0] > 0.0);
- assert(Aj[1] > 0.0);
+ PetscLogFlops(17);
+ break;
+ } // case 1
+ case 2: {
+ assert(Ai[0] > 0.0);
+ assert(Ai[1] > 0.0);
+ assert(Aj[0] > 0.0);
+ assert(Aj[1] > 0.0);
- const double Cpx = orientationVertex[0];
- const double Cpy = orientationVertex[1];
- const double Cqx = orientationVertex[2];
- const double Cqy = orientationVertex[3];
+ const double Cpx = orientationVertex[0];
+ const double Cpy = orientationVertex[1];
+ const double Cqx = orientationVertex[2];
+ const double Cqy = orientationVertex[3];
- // Check to make sure Jacobian is same at all DOF for
- // vertices i and j (means S is diagonal with equal enties).
- assert(Ai[0] == Ai[1]);
- assert(Aj[0] == Aj[1]);
+ // Check to make sure Jacobian is same at all DOF for
+ // vertices i and j (means S is diagonal with equal enties).
+ assert(Ai[0] == Ai[1]);
+ assert(Aj[0] == Aj[1]);
- const double Sinv = Ai[0] * Aj[0] / (Ai[0] + Aj[0]);
+ const double Sinv = Ai[0] * Aj[0] / (Ai[0] + Aj[0]);
- // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
- const double Arux = ri[0]/Ai[0] - rj[0]/Aj[0] + ui[0] - uj[0];
- const double Aruy = ri[1]/Ai[1] - rj[1]/Aj[1] + ui[1] - uj[1];
+ // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+ const double Arux = ri[0] / Ai[0] - rj[0] / Aj[0] + ui[0] - uj[0];
+ const double Aruy = ri[1] / Ai[1] - rj[1] / Aj[1] + ui[1] - uj[1];
- // dl_k = S^{-1}(-C_{ki} Aru - d_k)
- const double Arup = Cpx*Arux + Cpy*Aruy;
- const double Aruq = Cqx*Arux + Cqy*Aruy;
- const double Arupslip = -Arup - slipVertex[0] ;
- const double Aruqslip = -Aruq - slipVertex[1];
- const double dlp = Sinv * Arupslip;
- const double dlq = Sinv * Aruqslip;
+ // dl_k = S^{-1}(-C_{ki} Aru - d_k)
+ const double Arup = Cpx * Arux + Cpy * Aruy;
+ const double Aruq = Cqx * Arux + Cqy * Aruy;
+ const double Arupslip = -Arup - slipVertex[0];
+ const double Aruqslip = -Aruq - slipVertex[1];
+ const double dlp = Sinv * Arupslip;
+ const double dlq = Sinv * Aruqslip;
- const double dlx = wt * (Cpx*dlp + Cqx*dlq);
- const double dly = wt * (Cpy*dlp + Cqy*dlq);
+ const double dlx = wt * (Cpx * dlp + Cqx * dlq);
+ const double dly = wt * (Cpy * dlp + Cqy * dlq);
- // Update displacements at node I
- solutionCell[indexI*spaceDim+0] = dlx / Ai[0];
- solutionCell[indexI*spaceDim+1] = dly / Ai[1];
+ // Update displacements at node I
+ solutionCell[indexI * spaceDim + 0] = dlx / Ai[0];
+ solutionCell[indexI * spaceDim + 1] = dly / Ai[1];
- // Update displacements at node J
- solutionCell[indexJ*spaceDim+0] = -dlx / Aj[0];
- solutionCell[indexJ*spaceDim+1] = -dly / Aj[0];
+ // Update displacements at node J
+ solutionCell[indexJ * spaceDim + 0] = -dlx / Aj[0];
+ solutionCell[indexJ * spaceDim + 1] = -dly / Aj[0];
- // Update Lagrange multipliers
- solutionCell[indexK*spaceDim+0] = wt * dlp;
- solutionCell[indexK*spaceDim+1] = wt * dlq;
+ // Update Lagrange multipliers
+ solutionCell[indexK * spaceDim + 0] = wt * dlp;
+ solutionCell[indexK * spaceDim + 1] = wt * dlq;
- PetscLogFlops(41);
- break;
- } // case 2
- case 3 : {
- assert(Ai[0] > 0.0);
- assert(Ai[1] > 0.0);
- assert(Ai[2] > 0.0);
- assert(Aj[0] > 0.0);
- assert(Aj[1] > 0.0);
- assert(Aj[2] > 0.0);
+ PetscLogFlops(41);
+ break;
+ } // case 2
+ case 3: {
+ assert(Ai[0] > 0.0);
+ assert(Ai[1] > 0.0);
+ assert(Ai[2] > 0.0);
+ assert(Aj[0] > 0.0);
+ assert(Aj[1] > 0.0);
+ assert(Aj[2] > 0.0);
- const double Cpx = orientationVertex[0];
- const double Cpy = orientationVertex[1];
- const double Cpz = orientationVertex[2];
- const double Cqx = orientationVertex[3];
- const double Cqy = orientationVertex[4];
- const double Cqz = orientationVertex[5];
- const double Crx = orientationVertex[6];
- const double Cry = orientationVertex[7];
- const double Crz = orientationVertex[8];
+ const double Cpx = orientationVertex[0];
+ const double Cpy = orientationVertex[1];
+ const double Cpz = orientationVertex[2];
+ const double Cqx = orientationVertex[3];
+ const double Cqy = orientationVertex[4];
+ const double Cqz = orientationVertex[5];
+ const double Crx = orientationVertex[6];
+ const double Cry = orientationVertex[7];
+ const double Crz = orientationVertex[8];
- // Check to make sure Jacobian is same at all DOF for
- // vertices i and j (means S is diagonal with equal enties).
- assert(Ai[0] == Ai[1] && Ai[0] == Ai[2]);
- assert(Aj[0] == Aj[1] && Aj[0] == Aj[2]);
+ // Check to make sure Jacobian is same at all DOF for
+ // vertices i and j (means S is diagonal with equal enties).
+ assert(Ai[0] == Ai[1] && Ai[0] == Ai[2]);
+ assert(Aj[0] == Aj[1] && Aj[0] == Aj[2]);
- const double Sinv = Ai[0] * Aj[0] / (Ai[0] + Aj[0]);
+ const double Sinv = Ai[0] * Aj[0] / (Ai[0] + Aj[0]);
- // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
- const double Arux = ri[0]/Ai[0] - rj[0]/Aj[0] + ui[0] - uj[0];
- const double Aruy = ri[1]/Ai[1] - rj[1]/Aj[1] + ui[1] - uj[1];
- const double Aruz = ri[2]/Ai[2] - rj[2]/Aj[2] + ui[2] - uj[2];
+ // Aru = A_i^{-1} r_i - A_j^{-1} r_j + u_i - u_j
+ const double Arux = ri[0] / Ai[0] - rj[0] / Aj[0] + ui[0] - uj[0];
+ const double Aruy = ri[1] / Ai[1] - rj[1] / Aj[1] + ui[1] - uj[1];
+ const double Aruz = ri[2] / Ai[2] - rj[2] / Aj[2] + ui[2] - uj[2];
- // dl_k = D^{-1}( -C_{ki} Aru - d_k)
- const double Arup = Cpx*Arux + Cpy*Aruy + Cpz*Aruz;
- const double Aruq = Cqx*Arux + Cqy*Aruy + Cqz*Aruz;
- const double Arur = Crx*Arux + Cry*Aruy + Crz*Aruz;
- const double Arupslip = -Arup - slipVertex[0];
- const double Aruqslip = -Aruq - slipVertex[1];
- const double Arurslip = -Arur - slipVertex[2];
- const double dlp = Sinv * Arupslip;
- const double dlq = Sinv * Aruqslip;
- const double dlr = Sinv * Arurslip;
+ // dl_k = D^{-1}( -C_{ki} Aru - d_k)
+ const double Arup = Cpx * Arux + Cpy * Aruy + Cpz * Aruz;
+ const double Aruq = Cqx * Arux + Cqy * Aruy + Cqz * Aruz;
+ const double Arur = Crx * Arux + Cry * Aruy + Crz * Aruz;
+ const double Arupslip = -Arup - slipVertex[0];
+ const double Aruqslip = -Aruq - slipVertex[1];
+ const double Arurslip = -Arur - slipVertex[2];
+ const double dlp = Sinv * Arupslip;
+ const double dlq = Sinv * Aruqslip;
+ const double dlr = Sinv * Arurslip;
- const double dlx = wt * (Cpx*dlp + Cqx*dlq + Crx*dlr);
- const double dly = wt * (Cpy*dlp + Cqy*dlq + Cry*dlr);
- const double dlz = wt * (Cpz*dlp + Cqz*dlq + Crz*dlr);
+ const double dlx = wt * (Cpx * dlp + Cqx * dlq + Crx * dlr);
+ const double dly = wt * (Cpy * dlp + Cqy * dlq + Cry * dlr);
+ const double dlz = wt * (Cpz * dlp + Cqz * dlq + Crz * dlr);
- // Update displacements at node I
- solutionCell[indexI*spaceDim+0] = dlx / Ai[0];
- solutionCell[indexI*spaceDim+1] = dly / Ai[1];
- solutionCell[indexI*spaceDim+2] = dlz / Ai[2];
+ // Update displacements at node I
+ solutionCell[indexI * spaceDim + 0] = dlx / Ai[0];
+ solutionCell[indexI * spaceDim + 1] = dly / Ai[1];
+ solutionCell[indexI * spaceDim + 2] = dlz / Ai[2];
- // Update displacements at node J
- solutionCell[indexJ*spaceDim+0] = -dlx / Aj[0];
- solutionCell[indexJ*spaceDim+1] = -dly / Aj[1];
- solutionCell[indexJ*spaceDim+2] = -dlz / Aj[2];
+ // Update displacements at node J
+ solutionCell[indexJ * spaceDim + 0] = -dlx / Aj[0];
+ solutionCell[indexJ * spaceDim + 1] = -dly / Aj[1];
+ solutionCell[indexJ * spaceDim + 2] = -dlz / Aj[2];
- // Update Lagrange multipliers
- solutionCell[indexK*spaceDim+0] = wt * dlp;
- solutionCell[indexK*spaceDim+1] = wt * dlq;
- solutionCell[indexK*spaceDim+2] = wt * dlr;
+ // Update Lagrange multipliers
+ solutionCell[indexK * spaceDim + 0] = wt * dlp;
+ solutionCell[indexK * spaceDim + 1] = wt * dlq;
+ solutionCell[indexK * spaceDim + 2] = wt * dlr;
- PetscLogFlops(72);
- break;
- } // case 3
- default :
- assert(0);
- throw std::logic_error("Unknown spatial dimension.");
- } // switch
+ PetscLogFlops(72);
+ break;
+ } // case 3
+ default:
+ assert(0);
+ throw std::logic_error("Unknown spatial dimension.");
+ } // switch
} // for
+ _logger->eventEnd(computeEvent);
+
#if 0 // DEBUGGING
std::cout << "Adjusting lumped solution for cell " << *c_iter << std::endl;
for(int i = 0; i < numCorners*spaceDim; ++i) {
@@ -1052,8 +1146,10 @@
}
#endif
+ _logger->eventBegin(updateEvent);
solutionVisitor.clear();
sieveMesh->updateClosure(*c_iter, solutionVisitor);
+ _logger->eventEnd(updateEvent);
} // for
// FIX THIS
@@ -1240,6 +1336,35 @@
} // cellField
// ----------------------------------------------------------------------
+// Initialize logger.
+void
+pylith::faults::FaultCohesiveKin::_initializeLogger(void)
+{ // initializeLogger
+ delete _logger; _logger = new utils::EventLogger;
+ assert(0 != _logger);
+ _logger->className("FaultCohesiveKin");
+ _logger->initialize();
+
+ _logger->registerEvent("FkAS setup");
+ _logger->registerEvent("FkAS geometry");
+ _logger->registerEvent("FkAS compute");
+ _logger->registerEvent("FkAS restrict");
+ _logger->registerEvent("FkAS update");
+
+ _logger->registerEvent("FkIR setup");
+ _logger->registerEvent("FkIR geometry");
+ _logger->registerEvent("FkIR compute");
+ _logger->registerEvent("FkIR restrict");
+ _logger->registerEvent("FkIR update");
+
+ _logger->registerEvent("FkIJ setup");
+ _logger->registerEvent("FkIJ geometry");
+ _logger->registerEvent("FkIJ compute");
+ _logger->registerEvent("FkIJ restrict");
+ _logger->registerEvent("FkIJ update");
+} // initializeLogger
+
+// ----------------------------------------------------------------------
// Calculate orientation at fault vertices.
void
pylith::faults::FaultCohesiveKin::_calcOrientation(const double upDir[3],
Modified: short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh 2010-02-01 20:05:58 UTC (rev 16205)
+++ short/3D/PyLith/trunk/libsrc/faults/FaultCohesiveKin.hh 2010-02-01 22:44:51 UTC (rev 16206)
@@ -246,6 +246,9 @@
// PRIVATE METHODS ////////////////////////////////////////////////////
private :
+ /// Initialize logger.
+ void _initializeLogger(void);
+
/** Calculate orientation at fault vertices.
*
* @param upDir Direction perpendicular to along-strike direction that is
Modified: short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.cc 2010-02-01 20:05:58 UTC (rev 16205)
+++ short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.cc 2010-02-01 22:44:51 UTC (rev 16206)
@@ -104,6 +104,8 @@
assert(0 != _quadrature);
assert(0 != _material);
+ _initializeLogger();
+
// Get cell information
const ALE::Obj<SieveMesh>& sieveMesh = mesh.sieveMesh();
assert(!sieveMesh.isNull());
@@ -124,26 +126,6 @@
_initCellVector();
_initCellMatrix();
- // Setup event logger.
- delete _logger; _logger = new utils::EventLogger;
- assert(0 != _logger);
- _logger->className("ElasticityIntegrator");
- _logger->initialize();
- _logger->registerEvent("ElIR setup");
- _logger->registerEvent("ElIR geometry");
- _logger->registerEvent("ElIR compute");
- _logger->registerEvent("ElIR restrict");
- _logger->registerEvent("ElIR stateVars");
- _logger->registerEvent("ElIR stress");
- _logger->registerEvent("ElIR update");
-
- _logger->registerEvent("ElIJ setup");
- _logger->registerEvent("ElIJ geometry");
- _logger->registerEvent("ElIJ compute");
- _logger->registerEvent("ElIJ restrict");
- _logger->registerEvent("ElIJ stateVars");
- _logger->registerEvent("ElIJ update");
-
// Set up gravity field database for querying
if (0 != _gravityField) {
const int spaceDim = _quadrature->spaceDim();
@@ -432,6 +414,31 @@
} // outputFields
// ----------------------------------------------------------------------
+// Initialize logger.
+void
+pylith::feassemble::IntegratorElasticity::_initializeLogger(void)
+{ // initializeLogger
+ delete _logger; _logger = new utils::EventLogger;
+ assert(0 != _logger);
+ _logger->className("ElasticityIntegrator");
+ _logger->initialize();
+ _logger->registerEvent("ElIR setup");
+ _logger->registerEvent("ElIR geometry");
+ _logger->registerEvent("ElIR compute");
+ _logger->registerEvent("ElIR restrict");
+ _logger->registerEvent("ElIR stateVars");
+ _logger->registerEvent("ElIR stress");
+ _logger->registerEvent("ElIR update");
+
+ _logger->registerEvent("ElIJ setup");
+ _logger->registerEvent("ElIJ geometry");
+ _logger->registerEvent("ElIJ compute");
+ _logger->registerEvent("ElIJ restrict");
+ _logger->registerEvent("ElIJ stateVars");
+ _logger->registerEvent("ElIJ update");
+} // initializeLogger
+
+// ----------------------------------------------------------------------
// Allocate buffer for tensor field at quadrature points.
void
pylith::feassemble::IntegratorElasticity::_allocateTensorField(
Modified: short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.hh 2010-02-01 20:05:58 UTC (rev 16205)
+++ short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.hh 2010-02-01 22:44:51 UTC (rev 16206)
@@ -126,6 +126,9 @@
// PROTECTED METHODS ////////////////////////////////////////////////////
protected :
+ /// Initialize logger.
+ void _initializeLogger(void);
+
/** Allocate buffer for tensor field at quadrature points.
*
* @param mesh Finite-element mesh.
More information about the CIG-COMMITS
mailing list