diff --git a/AMDiS/src/ParallelDomainBase.cc b/AMDiS/src/ParallelDomainBase.cc index 6c7cf0672dbbcbeb703d6198c8e02042b1bb8a44..8229af0ec2fc7d7d61b3b30060b273f7b5c973d7 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 6f6f3ef95bd57b41cf1541125fff9f7975ba292f..a4a0b4b838abe31eb1420971422ddf2895692504 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,