From 7c59d88b8338271c62a119a221930b2ba52da585 Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Mon, 17 Aug 2009 11:43:04 +0000
Subject: [PATCH] Fixed bug for mesh partitioning with 16 or more procs.

---
 AMDiS/src/ParallelDomainBase.cc | 58 ++++++++++++++++-----------------
 AMDiS/src/ParallelDomainBase.h  |  7 ++++
 2 files changed, 35 insertions(+), 30 deletions(-)

diff --git a/AMDiS/src/ParallelDomainBase.cc b/AMDiS/src/ParallelDomainBase.cc
index 6c7cf067..8229af0e 100644
--- a/AMDiS/src/ParallelDomainBase.cc
+++ b/AMDiS/src/ParallelDomainBase.cc
@@ -82,6 +82,9 @@ namespace AMDiS {
 #if (DEBUG != 0)
     ElementIdxToDofs elMap;
     DbgCreateElementMap(elMap);
+
+    if (mpiRank == 0)
+      writePartitioningMesh("part.vtu");
 #endif
 
     // === Create new global and local DOF numbering. ===
@@ -748,6 +751,7 @@ namespace AMDiS {
 
       PartitionElementData *partitionData = 
 	dynamic_cast<PartitionElementData*>(element->getElementData(PARTITION_ED));   
+
       if (partitionData->getPartitionStatus() == IN) {
 	for (int i = 0; i < 3; i++) {
 	  if (!elInfo->getNeighbour(i))
@@ -759,39 +763,13 @@ namespace AMDiS {
  	  if (neighbourPartitionData->getPartitionStatus() == OUT) {
 	    // We have found an element that is at an interior boundary. 
 
-	    // === Find out, if the boundary part of the element corresponds to the  ===
-	    // === rank or to the rank "on the other side" of the interoir boundary. ===
-
-	    const DegreeOfFreedom* boundDOF1 = NULL;
-	    const DegreeOfFreedom* boundDOF2 = NULL;
-	    
-	    switch (i) {
-	    case 0:
-	      boundDOF1 = element->getDOF(1);
-	      boundDOF2 = element->getDOF(2);
-	      break;
-	    case 1:
-	      boundDOF1 = element->getDOF(0);
-	      boundDOF2 = element->getDOF(2);
-	      break;
-	    case 2:
-	      boundDOF1 = element->getDOF(0);
-	      boundDOF2 = element->getDOF(1);
-	      break;
-	    default:
-	      ERROR_EXIT("Should never happen!\n");
-	    }
-
-	    bool isRankDOF1 = (find(rankDOFs.begin(), rankDOFs.end(), boundDOF1) != rankDOFs.end());
-	    bool isRankDOF2 = (find(rankDOFs.begin(), rankDOFs.end(), boundDOF2) != rankDOFs.end());
-	    bool ranksBoundary = isRankDOF1 || isRankDOF2;
-
-	    // === And add the part of the interior boundary. ===
+	    int otherElementRank = partitionVec[elInfo->getNeighbour(i)->getIndex()];
+	    bool ranksBoundary = (mpiRank > otherElementRank);
 
 	    AtomicBoundary& bound = 
 	      (ranksBoundary ?
-	       myIntBoundary.getNewAtomicBoundary(partitionVec[elInfo->getNeighbour(i)->getIndex()]) :
-	       otherIntBoundary.getNewAtomicBoundary(partitionVec[elInfo->getNeighbour(i)->getIndex()]));
+	       myIntBoundary.getNewAtomicBoundary(otherElementRank) :
+	       otherIntBoundary.getNewAtomicBoundary(otherElementRank));
 
 	    bound.rankObject.el = element;
 	    bound.rankObject.elIndex = element->getIndex();
@@ -1772,6 +1750,26 @@ namespace AMDiS {
     }
   }
 
+
+  void ParallelDomainBase::writePartitioningMesh(std::string filename)
+  {
+    FUNCNAME("ParallelDomainBase::writePartitioningMesh()");
+
+    std::map<int, double> vec;    
+    TraverseStack stack;
+    ElInfo *elInfo = stack.traverseFirst(mesh, -1, 
+					 Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS);
+    
+    while (elInfo) {		  
+      int index = elInfo->getElement()->getIndex();
+      vec[index] = partitionVec[index];
+      elInfo = stack.traverseNext(elInfo);
+    }
+
+    ElementFileWriter::writeFile(vec, feSpace, filename);
+  }
+
+
   Flag ParallelDomainBase::oneIteration(AdaptInfo *adaptInfo, Flag toDo)
   {
     FUNCNAME("ParallelDomainBase::oneIteration()");
diff --git a/AMDiS/src/ParallelDomainBase.h b/AMDiS/src/ParallelDomainBase.h
index 6f6f3ef9..a4a0b4b8 100644
--- a/AMDiS/src/ParallelDomainBase.h
+++ b/AMDiS/src/ParallelDomainBase.h
@@ -272,6 +272,13 @@ namespace AMDiS {
      */
     void DbgTestCommonDofs(bool printCoords = false);
 
+    /** \brief
+     * This functions create a Paraview file with the macro mesh where the elements
+     * are colored by the partition they are part of. This function can be used for
+     * debugging.
+     */
+    void writePartitioningMesh(std::string filename);
+
     inline void orderDOFs(const DegreeOfFreedom* dof1,
 			  const DegreeOfFreedom* dof2,
 			  const DegreeOfFreedom* dof3,
-- 
GitLab