[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