From fe752c0cdebba17624e38f81c7a3899af33d03c7 Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Fri, 27 Apr 2012 12:54:10 +0000
Subject: [PATCH] And old single level code works now.

---
 AMDiS/src/parallel/ElementObjectDatabase.cc | 18 +++-----------
 AMDiS/src/parallel/ElementObjectDatabase.h  | 27 +++++++++------------
 AMDiS/src/parallel/MeshDistributor.cc       |  4 ++-
 AMDiS/src/parallel/MeshLevelData.cc         |  7 ++++++
 AMDiS/src/parallel/MeshLevelData.h          |  4 +--
 AMDiS/src/parallel/SubDomainSolver.cc       |  6 ++++-
 6 files changed, 31 insertions(+), 35 deletions(-)

diff --git a/AMDiS/src/parallel/ElementObjectDatabase.cc b/AMDiS/src/parallel/ElementObjectDatabase.cc
index 1554531a..7f6cc65c 100644
--- a/AMDiS/src/parallel/ElementObjectDatabase.cc
+++ b/AMDiS/src/parallel/ElementObjectDatabase.cc
@@ -399,11 +399,7 @@ namespace AMDiS {
 	if (it2->elIndex > vertexInRank[it->first][elementInRank].elIndex)
 	  vertexInRank[it->first][elementInRank] = *it2;
 
-	for (int level = 0; level < nLevel; level++) {
-	  int levelId = levelData.getLevelId(level, elementInRank);
-	  vertexOwner[it->first][level] = 
-	    std::max(vertexOwner[it->first][level], levelId);
-	}
+	vertexOwner[it->first] = std::max(vertexOwner[it->first], elementInRank);
 
 	ranksInLevel[0].insert(elementInRank);
 	for (int level = 1; level < nLevel; level++)
@@ -434,11 +430,7 @@ namespace AMDiS {
 	if (it2->elIndex > edgeInRank[it->first][elementInRank].elIndex)
 	  edgeInRank[it->first][elementInRank] = *it2;
 
-	for (int level = 0; level < nLevel; level++) {
-	  int levelId = levelData.getLevelId(level, elementInRank);
-	  edgeOwner[it->first][level] = 
-	    std::max(edgeOwner[it->first][level], levelId);
-	}
+	edgeOwner[it->first] = std::max(edgeOwner[it->first], elementInRank);
 
 	ranksInLevel[0].insert(elementInRank);
 	for (int level = 1; level < nLevel; level++)
@@ -469,11 +461,7 @@ namespace AMDiS {
 	if (it2->elIndex > faceInRank[it->first][elementInRank].elIndex)
 	  faceInRank[it->first][elementInRank] = *it2;
 
-	for (int level = 0; level < nLevel; level++) {
-	  int levelId = levelData.getLevelId(level, elementInRank);
-	  faceOwner[it->first][level] = 
-	    std::max(faceOwner[it->first][level], levelId);
-	}
+	faceOwner[it->first] = std::max(faceOwner[it->first], elementInRank);
 
 	ranksInLevel[0].insert(elementInRank);
 	for (int level = 1; level < nLevel; level++)
diff --git a/AMDiS/src/parallel/ElementObjectDatabase.h b/AMDiS/src/parallel/ElementObjectDatabase.h
index 96164cb1..051e57bc 100644
--- a/AMDiS/src/parallel/ElementObjectDatabase.h
+++ b/AMDiS/src/parallel/ElementObjectDatabase.h
@@ -259,17 +259,17 @@ namespace AMDiS {
 
 
     /// Returns the rank owner of the current iterator position.
-    int getIterateOwner(int level)
+    int getIterateOwner()
     {
       switch (iterGeoPos) {
       case VERTEX:
-	return vertexOwner[vertexIter->first][level];
+	return vertexOwner[vertexIter->first];
 	break;
       case EDGE:
-	return edgeOwner[edgeIter->first][level];
+	return edgeOwner[edgeIter->first];
 	break;
       case FACE:
-	return faceOwner[faceIter->first][level];
+	return faceOwner[faceIter->first];
 	break;
       default:
 	ERROR_EXIT("Should not happen!\n");
@@ -301,21 +301,21 @@ namespace AMDiS {
     }
 
     /// Returns the rank owner of a vertex DOF.
-    int getOwner(DegreeOfFreedom vertex, int level)
+    int getOwner(DegreeOfFreedom vertex)
     {
-      return vertexOwner[vertex][level];
+      return vertexOwner[vertex];
     }
 
     /// Returns the rank owner of an edge.
-    int getOwner(DofEdge edge, int level)
+    int getOwner(DofEdge edge)
     {
-      return edgeOwner[edge][level];
+      return edgeOwner[edge];
     }
 
     /// Returns the rank owner of an face.
     int getOwner(DofFace face, int level)
     {
-      return faceOwner[face][level];
+      return faceOwner[face];
     }
 
 
@@ -562,17 +562,14 @@ namespace AMDiS {
     /// Maps to an element object the corresponding face.
     map<ElementObjectData, DofFace> faceLocalMap;
 
-    /// Maps from level to rank number
-    typedef map<int, int> LevelRank;
-
     /// Defines for all vertex DOFs the rank that ownes this vertex DOF.
-    map<DegreeOfFreedom, LevelRank> vertexOwner;
+    map<DegreeOfFreedom, int> vertexOwner;
 
     /// Defines for all edges the rank that ownes this edge.
-    map<DofEdge, LevelRank> edgeOwner;
+    map<DofEdge, int> edgeOwner;
 
     /// Defines for all faces the rank that ownes this face.
-    map<DofFace, LevelRank> faceOwner;
+    map<DofFace, int> faceOwner;
 
     
     map<DegreeOfFreedom, int> vertexMaxLevel;
diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc
index ea6040ea..46df2f1b 100644
--- a/AMDiS/src/parallel/MeshDistributor.cc
+++ b/AMDiS/src/parallel/MeshDistributor.cc
@@ -847,6 +847,8 @@ namespace AMDiS {
 
     levelData.init(neighbours);
 
+    MSG("INIT MESH LEVEL %d\n", levelData.getLevelNumber());
+
     bool multiLevelTest = false;
     Parameters::get("parallel->multi level test", multiLevelTest);
     if (multiLevelTest) {
@@ -1590,7 +1592,7 @@ namespace AMDiS {
 	if (!(objData.count(mpiRank) && objData.size() > 1))
 	  continue;
 
-	int owner = elObjDb.getIterateOwner(0);
+	int owner = elObjDb.getIterateOwner();
 	ElementObjectData& rankBoundEl = objData[mpiRank];
 	
 	AtomicBoundary bound;
diff --git a/AMDiS/src/parallel/MeshLevelData.cc b/AMDiS/src/parallel/MeshLevelData.cc
index e0170a9d..cea8577b 100644
--- a/AMDiS/src/parallel/MeshLevelData.cc
+++ b/AMDiS/src/parallel/MeshLevelData.cc
@@ -19,6 +19,13 @@ namespace AMDiS {
   using namespace std;
 
 
+  MeshLevelData::MeshLevelData()
+  {
+    std::set<int> neighbours;
+    init(neighbours);
+  }
+
+
   void MeshLevelData::init(std::set<int> &neighbourRanks)
   {
     levelRanks.resize(1);
diff --git a/AMDiS/src/parallel/MeshLevelData.h b/AMDiS/src/parallel/MeshLevelData.h
index 0bb46175..babd5510 100644
--- a/AMDiS/src/parallel/MeshLevelData.h
+++ b/AMDiS/src/parallel/MeshLevelData.h
@@ -37,9 +37,7 @@ namespace AMDiS {
   class MeshLevelData 
   {
   public:
-    MeshLevelData()
-      : nLevel(0)
-    {}
+    MeshLevelData();
 
     void init(std::set<int> &neighbourRanks);
 
diff --git a/AMDiS/src/parallel/SubDomainSolver.cc b/AMDiS/src/parallel/SubDomainSolver.cc
index 9d0f7a87..366ccb4b 100644
--- a/AMDiS/src/parallel/SubDomainSolver.cc
+++ b/AMDiS/src/parallel/SubDomainSolver.cc
@@ -266,7 +266,11 @@ namespace AMDiS {
   {
     FUNCNAME("SubDomainSolver::solveGlobal()");
 
-    ERROR_EXIT("BLUB!\n");
+    int ml = 0;
+    Parameters::get("parallel->multi level test", ml);
+
+    if (ml > 0)
+      ERROR_EXIT("BLUB!\n");
 
     Vec tmp;
     VecCreateSeq(PETSC_COMM_SELF, interiorMap->getRankDofs(level), &tmp);
-- 
GitLab