[cig-commits] r8061 - short/3D/PyLith/trunk/libsrc/materials

brad at geodynamics.org brad at geodynamics.org
Fri Sep 28 17:10:09 PDT 2007


Author: brad
Date: 2007-09-28 17:10:09 -0700 (Fri, 28 Sep 2007)
New Revision: 8061

Modified:
   short/3D/PyLith/trunk/libsrc/materials/ElasticMaterial.cc
   short/3D/PyLith/trunk/libsrc/materials/ElasticMaterial.hh
Log:
Eliminated use of small temporary array in ElasticMaterial::updateState(). Added buffer _parameterCell to object to replace temporary array.

Modified: short/3D/PyLith/trunk/libsrc/materials/ElasticMaterial.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/materials/ElasticMaterial.cc	2007-09-29 00:00:34 UTC (rev 8060)
+++ short/3D/PyLith/trunk/libsrc/materials/ElasticMaterial.cc	2007-09-29 00:10:09 UTC (rev 8061)
@@ -99,16 +99,23 @@
     _density.resize(numQuadPts);
     _stress.resize(numQuadPts);
     _elasticConsts.resize(numQuadPts);
+
+    const int_array& numParamValues = _getNumParamValues();
+    const int numParams = numParamValues.size();
     for (int iQuad=0; iQuad < numQuadPts; ++iQuad) {
       _density[iQuad].resize(1);
       _stress[iQuad].resize(_tensorSize());
       _elasticConsts[iQuad].resize(_numElasticConsts());
-      const int_array& numParamValues = _getNumParamValues();
-      const int numParams = numParamValues.size();
       _paramsCell[iQuad].resize(numParams);
       for (int iParam=0; iParam < numParams; ++iParam)
 	_paramsCell[iQuad][iParam].resize(numParamValues[iParam]);
     } // for
+
+    int maxNumValues = 0;
+    for (int iParam=0; iParam < numParams; ++iParam)
+      if (numParamValues[iParam] > maxNumValues)
+	maxNumValues = numParamValues[iParam];
+    _parameterCell.resize(numQuadPts*maxNumValues);
   } // if
 
   _getParameters(cell);
@@ -133,19 +140,19 @@
   const char** paramNames = _parameterNames();
   
   for (int iParam=0; iParam < numParams; ++iParam) {
-    const ALE::Obj<real_section_type> parameter = 
+    const ALE::Obj<real_section_type>& parameter = 
       _parameters->getReal(paramNames[iParam]);
     assert(!parameter.isNull());
 
     const int numValues = numParamValues[iParam];
-    double_array parameterCell(numQuadPts*numValues);
+    assert(_parameterCell.size() >= numQuadPts*numValues);
     
     assert(parameter->getFiberDimension(cell) == numQuadPts*numValues);
     for (int iQuadPt=0; iQuadPt < numQuadPts; ++iQuadPt)
       for (int iValue=0; iValue < numValues; ++iValue)
-	parameterCell[iQuadPt*numValues+iValue] = 
+	_parameterCell[iQuadPt*numValues+iValue] = 
 	  _paramsCell[iQuadPt][iParam][iValue];
-    parameter->updatePoint(cell, &parameterCell[0]);
+    parameter->updatePoint(cell, &_parameterCell[0]);
   } // for
 } // updateState
 
@@ -169,7 +176,6 @@
     assert(!parameter.isNull());
 
     const int numValues = numParamValues[iParam];
-    
     assert(parameter->getFiberDimension(cell) == numQuadPts*numValues);
     const real_section_type::value_type* parameterCell =
       parameter->restrictPoint(cell);

Modified: short/3D/PyLith/trunk/libsrc/materials/ElasticMaterial.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/materials/ElasticMaterial.hh	2007-09-29 00:00:34 UTC (rev 8060)
+++ short/3D/PyLith/trunk/libsrc/materials/ElasticMaterial.hh	2007-09-29 00:10:09 UTC (rev 8061)
@@ -225,6 +225,13 @@
    */
   std::vector<std::vector<double_array> > _paramsCell;
 
+  /** Single parameter at quadrature points for current cell.
+   *
+   * size = [numQuadPts*numValues]
+   * index = [iQuadPt*numValues+iValue]
+   */
+  double_array _parameterCell;
+
   /** Density value at quadrature points for current cell.
    *
    * size = [numQuadPts][1]



More information about the cig-commits mailing list