Skip to content
Snippets Groups Projects
Commit 7c59d88b authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

Fixed bug for mesh partitioning with 16 or more procs.

parent 4930cf1a
No related branches found
No related tags found
No related merge requests found
......@@ -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()");
......
......@@ -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,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment