[cig-commits] r8353 - in short/3D/PyLith/trunk: libsrc/feassemble
libsrc/topology unittests/libtests/topology
brad at geodynamics.org
brad at geodynamics.org
Fri Nov 30 10:33:02 PST 2007
Author: brad
Date: 2007-11-30 10:33:01 -0800 (Fri, 30 Nov 2007)
New Revision: 8353
Modified:
short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc
short/3D/PyLith/trunk/libsrc/feassemble/ElasticityImplicit.cc
short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.hh
short/3D/PyLith/trunk/libsrc/topology/FieldsManager.cc
short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsManager.cc
Log:
More work on setting up tags for customized atlases for fields. Switched off optimized updateAdd() because it doesn't seem to work with time-stepping.
Modified: short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc 2007-11-30 00:03:10 UTC (rev 8352)
+++ short/3D/PyLith/trunk/libsrc/feassemble/ElasticityExplicit.cc 2007-11-30 18:33:01 UTC (rev 8353)
@@ -28,7 +28,7 @@
#include <assert.h> // USES assert()
#include <stdexcept> // USES std::runtime_error
-//#define FASTER
+#define FASTER
// ----------------------------------------------------------------------
// Constructor
@@ -180,9 +180,15 @@
if (_residualAtlasTags.find(materialId) == _residualAtlasTags.end()) {
_residualAtlasTags[materialId] =
- residual->copyCustomAtlas(dispT, dispTAtlasTag);
+ mesh->calculateCustomAtlas(residual, cells);
} // if
const int residualAtlasTag = _residualAtlasTags[materialId];
+ std::cout << "TAGS for material"
+ << " id: " << materialId
+ << ", dispT: " << dispTAtlasTag
+ << ", dispTmdt: " << dispTmdtAtlasTag
+ << ", residual: " << residualAtlasTag
+ << std::endl;
#endif
int c_index = 0;
@@ -239,7 +245,8 @@
CALL_MEMBER_FN(*this, elasticityResidualFn)(stress);
// Assemble cell contribution into field
-#ifdef FASTER
+//#ifdef FASTER
+#if 0
mesh->updateAdd(residual, residualAtlasTag, c_index, _cellVector);
#else
mesh->updateAdd(residual, *c_iter, _cellVector);
Modified: short/3D/PyLith/trunk/libsrc/feassemble/ElasticityImplicit.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/ElasticityImplicit.cc 2007-11-30 00:03:10 UTC (rev 8352)
+++ short/3D/PyLith/trunk/libsrc/feassemble/ElasticityImplicit.cc 2007-11-30 18:33:01 UTC (rev 8353)
@@ -262,7 +262,8 @@
#endif
// Assemble cell contribution into field
PetscLogEventBegin(updateEvent,0,0,0,0);
-#ifdef FASTER
+//#ifdef FASTER
+#if 0
mesh->updateAdd(residual, residualAtlasTag, c_index, _cellVector);
#else
mesh->updateAdd(residual, *c_iter, _cellVector);
Modified: short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.hh 2007-11-30 00:03:10 UTC (rev 8352)
+++ short/3D/PyLith/trunk/libsrc/feassemble/IntegratorElasticity.hh 2007-11-30 18:33:01 UTC (rev 8353)
@@ -181,8 +181,8 @@
/// Elastic material associated with integrator
materials::ElasticMaterial* _material;
- // Optimization
- std::map<int, int> _residualAtlasTags; ///< Tags indexing residual field.
+ /// Tag for custom atlas for residual field, optimized restrict()/update()
+ std::map<int,int> _residualAtlasTags;
}; // IntegratorElasticity
Modified: short/3D/PyLith/trunk/libsrc/topology/FieldsManager.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/FieldsManager.cc 2007-11-30 00:03:10 UTC (rev 8352)
+++ short/3D/PyLith/trunk/libsrc/topology/FieldsManager.cc 2007-11-30 18:33:01 UTC (rev 8353)
@@ -239,6 +239,14 @@
for (int i=size-1; i > 0; --i)
_real[_history[i]] = _real[_history[i-1]];
_real[_history[0]] = tmp;
+
+ // Shift custom atlas tags as well
+ if (_tags.size() > 0) {
+ std::map<int,int> tmp = _tags[_history[size-1]];
+ for (int i=size-1; i > 0; --i)
+ _tags[_history[i]] = _tags[_history[i-1]];
+ _tags[_history[0]] = tmp;
+ } // if
} // shiftHistory
// ----------------------------------------------------------------------
Modified: short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsManager.cc
===================================================================
--- short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsManager.cc 2007-11-30 00:03:10 UTC (rev 8352)
+++ short/3D/PyLith/trunk/unittests/libtests/topology/TestFieldsManager.cc 2007-11-30 18:33:01 UTC (rev 8353)
@@ -330,28 +330,50 @@
_initialize(&mesh);
FieldsManager manager(mesh);
- const char* labels[] = { "field A", "field B" };
- const int size = 2;
+ const char* fieldNames[] = { "field A", "field B" };
+ const int numFields = 2;
const int fiberDimA = 2;
const int fiberDimB = 3;
- for (int i=0; i < size; ++i)
- manager.addReal(labels[i]);
- manager.createHistory(labels, size);
+ for (int i=0; i < numFields; ++i)
+ manager.addReal(fieldNames[i]);
+ manager.createHistory(fieldNames, numFields);
const ALE::Obj<Mesh::label_sequence>& vertices = mesh->depthStratum(0);
- const ALE::Obj<real_section_type>& fieldA = manager.getReal(labels[0]);
- const ALE::Obj<real_section_type>& fieldB = manager.getReal(labels[1]);
+ const ALE::Obj<real_section_type>& fieldA = manager.getReal(fieldNames[0]);
+ const ALE::Obj<real_section_type>& fieldB = manager.getReal(fieldNames[1]);
fieldA->setFiberDimension(vertices, fiberDimA);
fieldB->setFiberDimension(vertices, fiberDimB);
manager.shiftHistory();
- const ALE::Obj<real_section_type>& testA = manager.getReal(labels[0]);
- const ALE::Obj<real_section_type>& testB = manager.getReal(labels[1]);
+ const ALE::Obj<real_section_type>& testA = manager.getReal(fieldNames[0]);
+ const ALE::Obj<real_section_type>& testB = manager.getReal(fieldNames[1]);
CPPUNIT_ASSERT_EQUAL(fiberDimB,
testA->getFiberDimension(*(vertices->begin())));
CPPUNIT_ASSERT_EQUAL(fiberDimA,
testB->getFiberDimension(*(vertices->begin())));
+
+ // Add custom atlas and retest shift history
+ const int materialIds[] = { 4, 3 };
+ const int numMaterials = 2;
+
+ for (int iMaterial=0; iMaterial < numMaterials; ++iMaterial)
+ manager.createCustomAtlas("material-id", materialIds[iMaterial]);
+
+ manager.shiftHistory(); // back to original
+ manager.shiftHistory(); // shift once more
+ for (int iField=0; iField < numFields; ++iField) {
+ FieldsManager::map_tags_type::iterator t_iter =
+ manager._tags.find(fieldNames[iField]);
+ CPPUNIT_ASSERT(t_iter != manager._tags.end());
+ const std::map<int,int>& tags = t_iter->second;
+ for (int iMaterial=0; iMaterial < numMaterials; ++iMaterial) {
+ std::map<int,int>::const_iterator tag =
+ tags.find(materialIds[iMaterial]);
+ CPPUNIT_ASSERT(tag != tags.end());
+ CPPUNIT_ASSERT_EQUAL(materialIds[iMaterial], tag->first);
+ } // for
+ } // for
} // testShiftHistory
// ----------------------------------------------------------------------
@@ -430,6 +452,7 @@
tags.find(materialIds[iMaterial]);
CPPUNIT_ASSERT(tag != tags.end());
CPPUNIT_ASSERT_EQUAL(materialIds[iMaterial], tag->first);
+ CPPUNIT_ASSERT_EQUAL(iMaterial, tag->second);
} // for
} // for
} // testCreateCustomAtlas
@@ -467,22 +490,13 @@
for (int iMaterial=0; iMaterial < numMaterials; ++iMaterial)
manager.createCustomAtlas("material-id", materialIds[iMaterial]);
- for (int iField=0; iField < numFields; ++iField) {
- FieldsManager::map_tags_type::iterator t_iter =
- manager._tags.find(fieldNames[iField]);
- CPPUNIT_ASSERT(t_iter != manager._tags.end());
- const std::map<int,int>& tags = t_iter->second;
+ for (int iField=0; iField < numFields; ++iField)
for (int iMaterial=0; iMaterial < numMaterials; ++iMaterial) {
- std::map<int,int>::const_iterator tag =
- tags.find(materialIds[iMaterial]);
- CPPUNIT_ASSERT(tag != tags.end());
- CPPUNIT_ASSERT_EQUAL(materialIds[iMaterial], tag->first);
- const int tagValueE = tag->second;
+ const int tagValueE = iMaterial;
const int tagValue =
manager.getFieldAtlasTag(fieldNames[iField], materialIds[iMaterial]);
CPPUNIT_ASSERT_EQUAL(tagValueE, tagValue);
} // for
- } // for
} // testGetFieldAtlasTag
// ----------------------------------------------------------------------
@@ -519,22 +533,13 @@
for (int iMaterial=0; iMaterial < numMaterials; ++iMaterial)
manager.createCustomAtlas("material-id", materialIds[iMaterial]);
- for (int iField=0; iField < numFields; ++iField) {
- FieldsManager::map_tags_type::iterator t_iter =
- manager._tags.find(fieldNames[iField]);
- CPPUNIT_ASSERT(t_iter != manager._tags.end());
- const std::map<int,int>& tags = t_iter->second;
+ for (int iField=0; iField < numFields; ++iField)
for (int iMaterial=0; iMaterial < numMaterials; ++iMaterial) {
- std::map<int,int>::const_iterator tag =
- tags.find(materialIds[iMaterial]);
- CPPUNIT_ASSERT(tag != tags.end());
- CPPUNIT_ASSERT_EQUAL(materialIds[iMaterial], tag->first);
- const int tagValueE = tag->second;
+ const int tagValueE = iMaterial;
const int tagValue =
manager.getFieldAtlasTagByHistory(iField, materialIds[iMaterial]);
CPPUNIT_ASSERT_EQUAL(tagValueE, tagValue);
} // for
- } // for
} // testGetFieldAtlasTagByHistory
// ----------------------------------------------------------------------
@@ -573,16 +578,8 @@
manager.createCustomAtlas("material-id", materialIds[iMaterial]);
- FieldsManager::map_tags_type::iterator t_iter =
- manager._tags.find(solnName);
- CPPUNIT_ASSERT(t_iter != manager._tags.end());
- const std::map<int,int>& tags = t_iter->second;
for (int iMaterial=0; iMaterial < numMaterials; ++iMaterial) {
- std::map<int,int>::const_iterator tag =
- tags.find(materialIds[iMaterial]);
- CPPUNIT_ASSERT(tag != tags.end());
- CPPUNIT_ASSERT_EQUAL(materialIds[iMaterial], tag->first);
- const int tagValueE = tag->second;
+ const int tagValueE = iMaterial;
const int tagValue =
manager.getSolutionAtlasTag(materialIds[iMaterial]);
CPPUNIT_ASSERT_EQUAL(tagValueE, tagValue);
More information about the cig-commits
mailing list