[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