Commit 7c59d88b authored by Thomas Witkowski's avatar Thomas Witkowski

Fixed bug for mesh partitioning with 16 or more procs.

parent 4930cf1a
......@@ -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,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment