[cig-commits] r7681 - in short/3D/PyLith/trunk/libsrc: faults materials topology

brad at geodynamics.org brad at geodynamics.org
Mon Jul 16 17:44:57 PDT 2007


Author: brad
Date: 2007-07-16 17:44:56 -0700 (Mon, 16 Jul 2007)
New Revision: 7681

Modified:
   short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc
   short/3D/PyLith/trunk/libsrc/materials/Material.cc
   short/3D/PyLith/trunk/libsrc/topology/FieldsManager.cc
Log:
Improved memory management by reusing section atlas and layout where possible.

Modified: short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc	2007-07-16 23:45:52 UTC (rev 7680)
+++ short/3D/PyLith/trunk/libsrc/faults/BruneSlipFn.cc	2007-07-17 00:44:56 UTC (rev 7681)
@@ -75,21 +75,31 @@
   const ALE::Obj<real_section_type>& finalSlip = 
     _parameters->getReal("final slip");
   assert(!finalSlip.isNull());
+  const vert_iterator vBegin = vertices.begin();
+  const vert_iterator vEnd = vertices.end();
+  for (vert_iterator v_iter=vBegin; v_iter != vEnd; ++v_iter)
+    finalSlip->setFiberDimension(*v_iter, spaceDim);
+  mesh->allocate(finalSlip);
 
   // Parameter: slip initiation time
   _parameters->addReal("slip time");
   const ALE::Obj<real_section_type>& slipTime = 
     _parameters->getReal("slip time");
   assert(!slipTime.isNull());
+  // reuse atlas from finalSlip (but use local fiber dimension)
+  for (vert_iterator v_iter=vBegin; v_iter != vEnd; ++v_iter)
+    slipTime->setFiberDimension(*v_iter, 1);
+  mesh->allocate(slipTime);  
+  slipTime->getAtlas()->setAtlas(finalSlip->getAtlas()->getAtlas());
 
   // Parameter: peak slip rate
   _parameters->addReal("peak rate");
   const ALE::Obj<real_section_type>& peakRate = 
     _parameters->getReal("peak rate");
   assert(!peakRate.isNull());
+  peakRate->setAtlas(slipTime->getAtlas()); // reuse atlas from slipTime
+  peakRate->allocateStorage();
 
-  const vert_iterator vBegin = vertices.begin();
-  const vert_iterator vEnd = vertices.end();
   for (vert_iterator v_iter=vBegin; v_iter != vEnd; ++v_iter) {
     finalSlip->setFiberDimension(*v_iter, spaceDim);
     slipTime->setFiberDimension(*v_iter, 1);

Modified: short/3D/PyLith/trunk/libsrc/materials/Material.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/materials/Material.cc	2007-07-16 23:45:52 UTC (rev 7680)
+++ short/3D/PyLith/trunk/libsrc/materials/Material.cc	2007-07-17 00:44:56 UTC (rev 7681)
@@ -84,6 +84,8 @@
   _parameters = new topology::FieldsManager(mesh);
   assert(0 != _parameters);
   const int numQuadPts = quadrature->numQuadPts();
+  const int spaceDim = quadrature->spaceDim();
+  const int tensorSize = (3 == spaceDim) ? 6 : ((2 == spaceDim) ? 4 : 1);
 
   int_array numParamValues;
   _numParamValues(&numParamValues);
@@ -92,16 +94,50 @@
 
   std::vector<ALE::Obj<real_section_type> > paramSections(numParams);
   
+  // Reduce memory storage by reusing layouts from basic sections we expect
+  int indexScalarLayout = -1;
+  int indexVectorLayout = -1;
+  int indexTensorLayout = -1;
   for (int iParam=0; iParam < numParams; ++iParam) {
+    _parameters->addReal(paramNames[iParam]);
+    paramSections[iParam] = _parameters->getReal(paramNames[iParam]);
+    assert(!paramSections[iParam].isNull());
+
     // Fiber dimension is number of quadrature points times number of
     // values per parameter
     const int fiberDim = numQuadPts * numParamValues[iParam];
-
-    _parameters->addReal(paramNames[iParam]);
-    paramSections[iParam] = _parameters->getReal(paramNames[iParam]);
-    assert(!paramSections[iParam].isNull());
-    paramSections[iParam]->setFiberDimension(cells, fiberDim);
-    mesh->allocate(paramSections[iParam]);
+    if (1 == numParamValues[iParam])
+      if (-1 != indexScalarLayout) {
+	paramSections[iParam]->setAtlas(paramSections[indexScalarLayout]->getAtlas());
+	paramSections[iParam]->allocateStorage();
+      } else {
+	indexScalarLayout = iParam;
+	paramSections[iParam]->setFiberDimension(cells, fiberDim);
+	mesh->allocate(paramSections[iParam]);
+      } // if/else
+    else if (spaceDim == numParamValues[iParam]) {
+      if (-1 != indexVectorLayout) {
+	paramSections[iParam]->setAtlas(paramSections[indexVectorLayout]->getAtlas());
+	paramSections[iParam]->allocateStorage();
+      } else {
+	indexVectorLayout = iParam;
+	paramSections[iParam]->setFiberDimension(cells, fiberDim);
+	mesh->allocate(paramSections[iParam]);
+      } // if/else
+    } // if/else
+    else if (tensorSize == numParamValues[iParam]) {
+      if (-1 != indexTensorLayout) {
+	paramSections[iParam]->setAtlas(paramSections[indexTensorLayout]->getAtlas());
+	paramSections[iParam]->allocateStorage();
+      } else {
+	indexTensorLayout = iParam;
+	paramSections[iParam]->setFiberDimension(cells, fiberDim);
+	mesh->allocate(paramSections[iParam]);
+      } // if/else
+    } else {
+      paramSections[iParam]->setFiberDimension(cells, fiberDim);
+      mesh->allocate(paramSections[iParam]);
+    } // if/else
   } // for
 
   // Setup database for querying
@@ -161,10 +197,9 @@
       } // for
     } // for
     // Insert cell contribution into fields
-    for (int iParam=0; iParam < numParams; ++iParam) {
+    for (int iParam=0; iParam < numParams; ++iParam)
       //mesh->update(paramSections[iParam], *cellIter, &cellData[iParam][0]);
       paramSections[iParam]->updatePoint(*cellIter, &cellData[iParam][0]);
-    }
   } // for
 
   // Close database

Modified: short/3D/PyLith/trunk/libsrc/topology/FieldsManager.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/FieldsManager.cc	2007-07-16 23:45:52 UTC (rev 7680)
+++ short/3D/PyLith/trunk/libsrc/topology/FieldsManager.cc	2007-07-17 00:44:56 UTC (rev 7681)
@@ -144,31 +144,16 @@
     throw std::runtime_error(msg.str());
   } // if
   
-  assert(!src->second.isNull());
-  const real_section_type::chart_type& srcChart = src->second->getChart();
-  const real_section_type::chart_type::iterator srcBegin = srcChart.begin();
-  const real_section_type::chart_type::iterator srcEnd = srcChart.end();
-  
+  assert(!src->second.isNull());  
   const map_real_type::iterator begin = _real.begin();
   const map_real_type::iterator end = _real.end();
   for (map_real_type::iterator iter=begin; iter != end; ++iter)
     if (iter != src) {
       // Make sure fields are same size
       assert(!iter->second.isNull());
-      for (real_section_type::chart_type::iterator p_iter=srcBegin;
-	   p_iter != srcEnd;
-	   ++p_iter) {
-	iter->second->setFiberDimension(*p_iter, 
-					src->second->getFiberDimension(*p_iter));
-	iter->second->setConstraintDimension(*p_iter, 
-					     src->second->getConstraintDimension(*p_iter));
-      } // for
-      _mesh->allocate(iter->second);
-      for (real_section_type::chart_type::iterator p_iter=srcBegin;
-	   p_iter != srcEnd;
-	   ++p_iter)
-	iter->second->setConstraintDof(*p_iter, 
-				       src->second->getConstraintDof(*p_iter));
+      iter->second->setAtlas(src->second->getAtlas());
+      iter->second->allocateStorage();
+      iter->second->setBC(src->second->getBC());
     } // if
 } // copyLayout
 
@@ -181,29 +166,14 @@
   assert(!_mesh.isNull());
   assert(!field.isNull());
   
-  const real_section_type::chart_type& srcChart = field->getChart();
-  const real_section_type::chart_type::iterator srcBegin = srcChart.begin();
-  const real_section_type::chart_type::iterator srcEnd = srcChart.end();
-  
   const map_real_type::iterator begin = _real.begin();
   const map_real_type::iterator end = _real.end();
   for (map_real_type::iterator iter=begin; iter != end; ++iter) {
     // Make sure fields are same size
     assert(!iter->second.isNull());
-    for (real_section_type::chart_type::iterator p_iter=srcBegin;
-	 p_iter != srcEnd;
-	 ++p_iter) {
-      iter->second->setFiberDimension(*p_iter, 
-				      field->getFiberDimension(*p_iter));
-      iter->second->setConstraintDimension(*p_iter, 
-					   field->getConstraintDimension(*p_iter));
-    } // for
-    _mesh->allocate(iter->second);
-    for (real_section_type::chart_type::iterator p_iter=srcBegin;
-	 p_iter != srcEnd;
-	 ++p_iter)
-      iter->second->setConstraintDof(*p_iter, 
-				     field->getConstraintDof(*p_iter));
+    iter->second->setAtlas(field->getAtlas());
+    iter->second->allocateStorage();
+    iter->second->setBC(field->getBC());
   } // for
 } // copyLayout
 



More information about the cig-commits mailing list