From 30c340287d6e1117715f6c477671090c557704a6 Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Thu, 28 Jun 2012 13:47:28 +0000
Subject: [PATCH] Work on bla.

---
 AMDiS/src/parallel/ElementObjectDatabase.cc | 105 ++++++++++++--------
 AMDiS/src/parallel/ElementObjectDatabase.h  |  42 +++-----
 AMDiS/src/parallel/InteriorBoundary.cc      |  16 ++-
 AMDiS/src/parallel/MeshDistributor.cc       |   8 +-
 AMDiS/src/parallel/PetscSolverFeti.cc       |  12 ++-
 5 files changed, 103 insertions(+), 80 deletions(-)

diff --git a/AMDiS/src/parallel/ElementObjectDatabase.cc b/AMDiS/src/parallel/ElementObjectDatabase.cc
index 12ffab84..4929ec30 100644
--- a/AMDiS/src/parallel/ElementObjectDatabase.cc
+++ b/AMDiS/src/parallel/ElementObjectDatabase.cc
@@ -41,9 +41,12 @@ namespace AMDiS {
 
       elInfo = stack.traverseNext(elInfo);
     }
-
-    // Create periodic data, if there are periodic boundary conditions.
-    createPeriodicData();
+    
+    // Handle periodic boudaries
+    if (removePeriodicBoundary == false) 
+      createPeriodicData();
+    else
+      removePeriodicData();
 
     // Create data about the reverse modes of neighbouring elements.
     createReverseModeData();
@@ -99,40 +102,21 @@ namespace AMDiS {
 	  DofEdge edge1 = neigh->getEdge(elInfo->getOppVertex(i));
 	  BoundaryType boundaryType = elInfo->getBoundary(EDGE, i);
 
-
-	  if (removePeriodicBoundary) {
-	    ElementObjectData elObjEdge(el->getIndex(), i);
-	    edgeElements[edge1].push_back(elObjEdge);
-	    edgeLocalMap[elObjEdge] = edge1;
-
-#if 0
-	    ElementObjectData elObjVertex0(el->getIndex(), 
-					   el->getVertexOfEdge(i, 0));
-	    vertexElements[edge1.first].push_back(elObjVertex0);
-	    vertexLocalMap[elObjVertex0] = edge1.first;
-
-	    ElementObjectData elObjVertex1(el->getIndex(), 
-					   el->getVertexOfEdge(i, 1));
-	    vertexElements[edge1.second].push_back(elObjVertex1);
-	    vertexLocalMap[elObjVertex1] = edge1.first;
-#endif
-	  } else {  
-	    // Add the periodic edge.
-	    periodicEdges[make_pair(edge0, edge1)] = boundaryType;
-	    periodicEdgeAssoc[edge0].insert(edge1);
-	    
-	    // Add both vertices of the edge to be periodic.
-	    periodicVertices[make_pair(edge0.first, edge1.first)] = boundaryType;
-	    periodicVertices[make_pair(edge0.second, edge1.second)] = boundaryType;
-	    periodicDofAssoc[edge0.first].insert(boundaryType);
-	    periodicDofAssoc[edge0.second].insert(boundaryType);
-	    
-	    TEST_EXIT_DBG(edge0.first == 
-			  mesh->getPeriodicAssociations(boundaryType)[edge1.first] &&
-			  edge0.second == 
-			  mesh->getPeriodicAssociations(boundaryType)[edge1.second])
-	      ("Should not happen!\n");
-	  }
+	  // Add the periodic edge.
+	  periodicEdges[make_pair(edge0, edge1)] = boundaryType;
+	  periodicEdgeAssoc[edge0].insert(edge1);
+	  
+	  // Add both vertices of the edge to be periodic.
+	  periodicVertices[make_pair(edge0.first, edge1.first)] = boundaryType;
+	  periodicVertices[make_pair(edge0.second, edge1.second)] = boundaryType;
+	  periodicDofAssoc[edge0.first].insert(boundaryType);
+	  periodicDofAssoc[edge0.second].insert(boundaryType);
+	  
+	  TEST_EXIT_DBG(edge0.first == 
+			mesh->getPeriodicAssociations(boundaryType)[edge1.first] &&
+			edge0.second == 
+			mesh->getPeriodicAssociations(boundaryType)[edge1.second])
+	    ("Should not happen!\n");
 	}
       }
       break;
@@ -148,9 +132,6 @@ namespace AMDiS {
 	  DofFace face1 = neigh->getFace(elInfo->getOppVertex(i));
 	  BoundaryType boundaryType = elInfo->getBoundary(FACE, i);
 
-	  TEST_EXIT(removePeriodicBoundary == false)
-	    ("Not yet implemented for 3D!\n");
-	  
 	  // Add the periodic face.
 	  periodicFaces[make_pair(face0, face1)] = elInfo->getBoundary(i);
 	  
@@ -197,6 +178,46 @@ namespace AMDiS {
     }       
   }
 
+  void ElementObjectDatabase::addVertex(Element *el, int ith)
+  {
+    DegreeOfFreedom vertex = el->getDof(ith, 0);
+    int elIndex = el->getIndex();
+    ElementObjectData elObj(elIndex, ith);
+
+    if (elIndex == 53 && ith == 0)
+      MSG("A: 53/0 ON DOF %d\n", vertex);
+
+    if (elIndex == 229 && ith == 0)
+      MSG("A: 229/0 ON DOF %d\n", vertex);
+    
+    vertexElements[vertex].push_back(elObj);
+    vertexLocalMap[elObj] = vertex;
+  }
+
+
+  void ElementObjectDatabase::addEdge(Element *el, int ith)
+  {
+    FUNCNAME("ElementObjectDatabase::addEdge()");
+
+    DofEdge edge = el->getEdge(ith);
+    int elIndex = el->getIndex();
+    ElementObjectData elObj(elIndex, ith);
+    
+    edgeElements[edge].push_back(elObj);
+    edgeLocalMap[elObj] = edge;
+  }
+
+  
+  void ElementObjectDatabase::addFace(Element *el, int ith)
+  {
+    DofFace face = el->getFace(ith);
+    int elIndex = el->getIndex();
+    ElementObjectData elObj(elIndex, ith);
+    
+    faceElements[face].push_back(elObj);
+    faceLocalMap[elObj] = face;
+  }
+
 
   void ElementObjectDatabase::createPeriodicData()
   {
@@ -391,6 +412,10 @@ namespace AMDiS {
   }
 
 
+void ElementObjectDatabase::removePeriodicData()
+{
+}
+
   BoundaryType ElementObjectDatabase::getNewBoundaryType()
   {
     FUNCNAME("ElementObjectDatabase::getNewBoundaryType()");
diff --git a/AMDiS/src/parallel/ElementObjectDatabase.h b/AMDiS/src/parallel/ElementObjectDatabase.h
index 6366f4d2..76ad6bc9 100644
--- a/AMDiS/src/parallel/ElementObjectDatabase.h
+++ b/AMDiS/src/parallel/ElementObjectDatabase.h
@@ -51,7 +51,8 @@ namespace AMDiS {
   struct ElementObjectData {
     ElementObjectData(int a = -1, int b = 0)
       : elIndex(a),
-	ithObject(b)
+	ithObject(b),
+	mappedOnPeriodicBoundary(false)
     {}
 
     /// Index of the element this object is part of.
@@ -59,12 +60,17 @@ namespace AMDiS {
     
     /// Index of the object within the element.
     int ithObject;
+
+    /// If true, the element does not exists in mesh but is due to a mapping
+    /// on a periodic boundary.
+    bool mappedOnPeriodicBoundary;
     
     /// Write this element object to disk.
     void serialize(ostream &out) const
     {
       SerUtil::serialize(out, elIndex);
       SerUtil::serialize(out, ithObject);
+      SerUtil::serialize(out, mappedOnPeriodicBoundary);
     }
 
     /// Read this element object from disk.
@@ -72,6 +78,7 @@ namespace AMDiS {
     {
       SerUtil::deserialize(in, elIndex);
       SerUtil::deserialize(in, ithObject);
+      SerUtil::deserialize(in, mappedOnPeriodicBoundary);
     }
 
     /// Compare this element object with another one.
@@ -426,37 +433,13 @@ namespace AMDiS {
     void addElement(ElInfo *elInfo);
 
     /// Adds the i-th DOF vertex of an element to the object database.
-    void addVertex(Element *el, int ith)
-    {
-      DegreeOfFreedom vertex = el->getDof(ith, 0);
-      int elIndex = el->getIndex();
-      ElementObjectData elObj(elIndex, ith);
-
-      vertexElements[vertex].push_back(elObj);
-      vertexLocalMap[elObj] = vertex;
-    }
+    void addVertex(Element *el, int ith);
 
     /// Adds the i-th edge of an element to the object database.
-    void addEdge(Element *el, int ith)
-    {
-      DofEdge edge = el->getEdge(ith);
-      int elIndex = el->getIndex();
-      ElementObjectData elObj(elIndex, ith);
-
-      edgeElements[edge].push_back(elObj);
-      edgeLocalMap[elObj] = edge;
-    }
+    void addEdge(Element *el, int ith);
 
     /// Adds the i-th face of an element to the object database.
-    void addFace(Element *el, int ith)
-    {
-      DofFace face = el->getFace(ith);
-      int elIndex = el->getIndex();
-      ElementObjectData elObj(elIndex, ith);
-
-      faceElements[face].push_back(elObj);
-      faceLocalMap[elObj] = face;
-    }
+    void addFace(Element *el, int ith);
 
     /** \brief
      * Creates final data of the periodic boundaries. Must be called after all
@@ -468,7 +451,8 @@ namespace AMDiS {
      * indirectly connected.
      */
     void createPeriodicData();
-
+    
+    void removePeriodicData();
 
     /// Creates on all boundaries the reverse mode flag.
     void createReverseModeData();
diff --git a/AMDiS/src/parallel/InteriorBoundary.cc b/AMDiS/src/parallel/InteriorBoundary.cc
index 4140ede0..1d7a5c4b 100644
--- a/AMDiS/src/parallel/InteriorBoundary.cc
+++ b/AMDiS/src/parallel/InteriorBoundary.cc
@@ -48,6 +48,8 @@ namespace AMDiS {
     for (int geoPos = 0; geoPos < mesh->getDim(); geoPos++) {
       GeoIndex geoIndex = INDEX_OF_DIM(geoPos, mesh->getDim());
 
+      MSG("---> start with geo index = %d\n", geoIndex);
+
       while (elObjDb.iterate(geoIndex)) {
 	map<int, ElementObjectData>& objData = elObjDb.getIterateData();
 
@@ -75,6 +77,9 @@ namespace AMDiS {
 	int owner = elObjDb.getIterateOwner(level);
 	ElementObjectData& rankBoundEl = objData[globalMpiRank];
 	
+	if (rankBoundEl.mappedOnPeriodicBoundary)
+	  continue;
+
 	AtomicBoundary bound;
 	bound.maxLevel = elObjDb.getIterateMaxLevel();
 	bound.rankObj.el = elObjDb.getElementPtr(rankBoundEl.elIndex);
@@ -82,7 +87,8 @@ namespace AMDiS {
 	bound.rankObj.elType = elObjDb.getElementType(rankBoundEl.elIndex);
 	bound.rankObj.subObj = geoIndex;
 	bound.rankObj.ithObj = rankBoundEl.ithObject;
-	
+
+
 	if (geoIndex == FACE) {
 	  for (int edgeNo = 0; edgeNo < 3; edgeNo++) {
 	    int edgeOfFace = 
@@ -92,7 +98,7 @@ namespace AMDiS {
 	  }
 	}
 	
-	
+
 	if (owner == globalMpiRank) {
 	  for (map<int, ElementObjectData>::iterator it2 = objData.begin();
 	       it2 != objData.end(); ++it2) {
@@ -125,6 +131,12 @@ namespace AMDiS {
 	    ("Should not happen!\n");
 	  
 	  ElementObjectData& ownerBoundEl = objData[owner];
+
+	  if (rankBoundEl.elIndex == 53 &&
+	      geoIndex == 1 &&
+	      rankBoundEl.ithObject == 0) {
+	    MSG("OWNER: %d %d\n", owner, ownerBoundEl);
+	  }
 	  
 	  bound.neighObj.el = elObjDb.getElementPtr(ownerBoundEl.elIndex);
 	  bound.neighObj.elIndex = ownerBoundEl.elIndex;
diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc
index 1c7727a4..386a578e 100644
--- a/AMDiS/src/parallel/MeshDistributor.cc
+++ b/AMDiS/src/parallel/MeshDistributor.cc
@@ -1558,15 +1558,11 @@ namespace AMDiS {
     elObjDb.updateRankData();
 
     intBoundary.create(levelData, 0, elObjDb);
-#if (DEBUG != 0)
     ParallelDebug::printBoundaryInfo(intBoundary);
-#endif
 
     if (levelData.getLevelNumber() > 1) {
       intBoundarySd.create(levelData, 1, elObjDb);
-#if (DEBUG != 0)
       ParallelDebug::printBoundaryInfo(intBoundarySd, 0, true);
-#endif
     }
   }
 
@@ -1692,6 +1688,10 @@ namespace AMDiS {
   
     lastMeshChangeIndex = mesh->getChangeIndex();
 
+    MSG("--------> REMOVE THIS LINE <------------\n");
+    debug::writeElementIndexMesh(mesh, debugOutputDir + "elementIndex-" + 
+				 lexical_cast<string>(mpiRank) + ".vtu");
+
 
 #if (DEBUG != 0)
     ParallelDebug::testDofContainerCommunication(*this);
diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc
index c0a42f67..eb9d57c3 100644
--- a/AMDiS/src/parallel/PetscSolverFeti.cc
+++ b/AMDiS/src/parallel/PetscSolverFeti.cc
@@ -436,21 +436,23 @@ namespace AMDiS {
     // === Define all vertices on the interior boundaries of the macro mesh ===
     // === to be primal variables.                                          ===
 
-    /// Set of DOF indices that are considered to be primal variables.
-    
+    // Set of DOF indices that are considered to be primal variables.
     DofContainerSet& vertices = 
       meshDistributor->getBoundaryDofInfo(feSpace, meshLevel).geoDofs[VERTEX];
 
     DofIndexSet primals;
     for (DofContainerSet::iterator it = vertices.begin(); 
 	 it != vertices.end(); ++it) {
-      WorldVector<double> c;
-      feSpace->getMesh()->getDofIndexCoords(*it, feSpace, c);
-
       double e = 1e-8;
       if (meshLevel == 0) {
+	WorldVector<double> c;
+	feSpace->getMesh()->getDofIndexCoords(*it, feSpace, c);
+	MSG("PRIMAL COORD %f %f\n", c[0], c[1]);
 	primals.insert(**it);
       } else {
+	WorldVector<double> c;
+	feSpace->getMesh()->getDofIndexCoords(*it, feSpace, c);
+
 	if (fabs(c[0]) < e || fabs(c[1]) < e ||
 	    fabs(c[0] - 25.0) < e || fabs(c[1] - 25.0) < e ||
 	    (fabs(c[0] - 12.5) < e && fabs(c[1] - 12.5) < e)) {
-- 
GitLab