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