diff --git a/AMDiS/src/parallel/InteriorBoundary.h b/AMDiS/src/parallel/InteriorBoundary.h index eb69baa66e08ed397b3c830ec4be354e6c47b82c..3102165e7eb4828ac6d3595b322e8ff73a62b86d 100644 --- a/AMDiS/src/parallel/InteriorBoundary.h +++ b/AMDiS/src/parallel/InteriorBoundary.h @@ -113,9 +113,12 @@ namespace AMDiS { { if (level > 0) { int r = levelData->mapRank(mapIt->first, level - 1, level); + TEST_EXIT_DBG(r >= 0) ("Mapping rank %d from level % to level %d does not work!\n", mapIt->first, level - 1, level); + + return r; } return mapIt->first; diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc index 55bf0f53e40ee832dcc4db8250af2bb2255f145f..027993db02295f18f69375e420708415f6c6439f 100644 --- a/AMDiS/src/parallel/MeshDistributor.cc +++ b/AMDiS/src/parallel/MeshDistributor.cc @@ -1873,7 +1873,8 @@ namespace AMDiS { } - void MeshDistributor::createBoundaryDofs(const FiniteElemSpace *feSpace, int level) + void MeshDistributor::createBoundaryDofs(const FiniteElemSpace *feSpace, + int level) { FUNCNAME("MeshDistributor::createBoundaryDofs()"); @@ -1893,7 +1894,8 @@ namespace AMDiS { DofContainer dofs; it->rankObj.el->getAllDofs(feSpace, it->rankObj, dofs); - DofContainer& tmp = sendDofs.getDofContainer(it.getRank(), feSpace, level); + DofContainer& tmp = + sendDofs.getDofContainer(it.getRank(), feSpace, level); tmp.insert(tmp.end(), dofs.begin(), dofs.end()); if (createBoundaryDofFlag.isSet(BOUNDARY_FILL_INFO_SEND_DOFS)) @@ -1910,7 +1912,8 @@ namespace AMDiS { DofContainer dofs; it->rankObj.el->getAllDofs(feSpace, it->rankObj, dofs); - DofContainer& tmp = recvDofs.getDofContainer(it.getRank(), feSpace, level); + DofContainer& tmp = + recvDofs.getDofContainer(it.getRank(), feSpace, level); tmp.insert(tmp.end(), dofs.begin(), dofs.end()); if (createBoundaryDofFlag.isSet(BOUNDARY_FILL_INFO_RECV_DOFS)) diff --git a/AMDiS/src/parallel/ParallelDofMapping.cc b/AMDiS/src/parallel/ParallelDofMapping.cc index 87e678d5c74565e8c57254a9f6dc4f714470b6f9..927847cd2c3746e32b0abc29bf915b6f959195b6 100644 --- a/AMDiS/src/parallel/ParallelDofMapping.cc +++ b/AMDiS/src/parallel/ParallelDofMapping.cc @@ -87,6 +87,7 @@ namespace AMDiS { // === other ranks that also include this DOF. === StdMpi<vector<int> > stdMpi(levelData->getMpiComm(level)); + for (DofComm::Iterator it(*sendDofs, level, feSpace); !it.end(); it.nextRank()) for (; !it.endDofIter(); it.nextDof()) @@ -108,7 +109,7 @@ namespace AMDiS { } } - if (recvFromRank) + if (recvFromRank) stdMpi.recv(it.getRank()); } @@ -159,6 +160,8 @@ namespace AMDiS { { FUNCNAME("ParallelDofMapping::clear()"); + TEST_EXIT_DBG(levelData)("No mesh level data object defined!\n"); + for (vector<const FiniteElemSpace*>::iterator it = feSpacesUnique.begin(); it != feSpacesUnique.end(); ++it) data[*it].clear(); diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc index d1e6df6269d6232364dcadd3f6a180d4e04b3c6e..4cfd74ae934f72e33a4c82ff2a9c1bf1c86dc057 100644 --- a/AMDiS/src/parallel/PetscSolverFeti.cc +++ b/AMDiS/src/parallel/PetscSolverFeti.cc @@ -284,29 +284,35 @@ namespace AMDiS { dualDofMap.clear(); lagrangeMap.clear(); localDofMap.clear(); - interiorDofMap.clear(); + if (fetiPreconditioner == FETI_DIRICHLET) + interiorDofMap.clear(); + + primalDofMap.setDofComm(meshDistributor->getSendDofs(), + meshDistributor->getRecvDofs()); + lagrangeMap.setDofComm(meshDistributor->getSendDofs(), + meshDistributor->getRecvDofs()); for (unsigned int i = 0; i < meshDistributor->getFeSpaces().size(); i++) { const FiniteElemSpace *feSpace = meshDistributor->getFeSpace(i); createPrimals(feSpace); - createDuals(feSpace); - createLagrange(feSpace); + createDuals(feSpace); createIndexB(feSpace); } - primalDofMap.setDofComm(meshDistributor->getSendDofs(), - meshDistributor->getRecvDofs()); - lagrangeMap.setDofComm(meshDistributor->getSendDofs(), - meshDistributor->getRecvDofs()); - primalDofMap.update(); dualDofMap.update(); - lagrangeMap.update(); localDofMap.update(); if (fetiPreconditioner != FETI_NONE) interiorDofMap.update(); + for (unsigned int i = 0; i < meshDistributor->getFeSpaces().size(); i++) { + const FiniteElemSpace *feSpace = meshDistributor->getFeSpace(i); + createLagrange(feSpace); + } + lagrangeMap.update(); + + for (unsigned int i = 0; i < meshDistributor->getFeSpaces().size(); i++) { const FiniteElemSpace *feSpace = meshDistributor->getFeSpace(i); MSG("FETI-DP data for %d-ith FE space:\n", i);