[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