diff --git a/AMDiS/src/parallel/DofComm.h b/AMDiS/src/parallel/DofComm.h index 5155e31fc82c9e30a843afabdf397e71c1cd5850..40b9833371f50bbba21c5196a2a622cd7f1ed244 100644 --- a/AMDiS/src/parallel/DofComm.h +++ b/AMDiS/src/parallel/DofComm.h @@ -128,7 +128,8 @@ namespace AMDiS { : data(d), dofCounter(-1), traverseFeSpace(fe), - traverseLevel(0) + traverseLevel(0), + removedDof(false) { goFirst(); } @@ -139,7 +140,8 @@ namespace AMDiS { : data(d), dofCounter(-1), traverseFeSpace(fe), - traverseLevel(level) + traverseLevel(level), + removedDof(false) { goFirst(); } @@ -202,8 +204,18 @@ namespace AMDiS { inline void nextDof() { - ++dofIter; - ++dofCounter; + if (removedDof) { + removedDof = false; + } else { + ++dofIter; + ++dofCounter; + } + } + + inline void removeDof() + { + dofIter = feMapIter->second.erase(dofIter); + removedDof = true; } inline int getRank() @@ -261,6 +273,8 @@ namespace AMDiS { const FiniteElemSpace *traverseFeSpace; int traverseLevel; + + bool removedDof; }; diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc index d9b282016b83f5ee31999502cc8c0192396dfbc3..970f3aec48856536270a5a28dc9820aecf15cd99 100644 --- a/AMDiS/src/parallel/MeshDistributor.cc +++ b/AMDiS/src/parallel/MeshDistributor.cc @@ -508,6 +508,8 @@ namespace AMDiS { TEST_EXIT_DBG(level >= 0 && level <= 1)("Wrong level number!\n"); + MSG("-----------------\n"); + MPI::Intracomm &levelComm = levelData.getMpiComm(level); DofComm &dc = (level == 0 ? dofComm : dofCommSd); @@ -520,14 +522,18 @@ namespace AMDiS { for (int i = 0; i < vec.getSize(); i++) { DOFVector<double> &dofVec = *(vec.getDOFVector(i)); - for (it.beginDofIter(vec.getFeSpace(i)); !it.endDofIter(); it.nextDof()) + for (it.beginDofIter(vec.getFeSpace(i)); !it.endDofIter(); it.nextDof()) { + // MSG("SEND TO RANK %d FOR COMP %d\n", it.getRank(), i); dofs.push_back(dofVec[it.getDofIndex()]); + } } int rank = it.getRank(); if (level > 0) rank = levelData.mapRank(rank, 0, level); stdMpi.send(rank, dofs); + + MSG("SEND TO RANK %d OF SIZE %d\n", rank, dofs.size()); } for (DofComm::Iterator it(dc.getRecvDofs()); !it.end(); it.nextRank()) { @@ -538,6 +544,10 @@ namespace AMDiS { } stdMpi.startCommunication(); + + for (DofComm::Iterator it(dc.getRecvDofs()); !it.end(); it.nextRank()) { + MSG("RECV FROM RANK %d OF SIZE %d\n", it.getRank(), stdMpi.getRecvData(it.getRank()).size()); + } for (DofComm::Iterator it(dc.getRecvDofs()); !it.end(); it.nextRank()) { int rank = it.getRank(); @@ -545,12 +555,16 @@ namespace AMDiS { rank = levelData.mapRank(rank, 0, level); int counter = 0; + vector<double> &recvData = stdMpi.getRecvData(rank); for (int i = 0; i < vec.getSize(); i++) { DOFVector<double> &dofVec = *(vec.getDOFVector(i)); - for (it.beginDofIter(vec.getFeSpace(i)); !it.endDofIter(); it.nextDof()) - dofVec[it.getDofIndex()] = stdMpi.getRecvData(rank)[counter++]; + for (it.beginDofIter(vec.getFeSpace(i)); !it.endDofIter(); it.nextDof()) { + TEST_EXIT_DBG(counter < recvData.size()) + ("Recv data from rank %d has only %d entries!\n", rank, recvData.size()); + dofVec[it.getDofIndex()] = recvData[counter++]; + } } } } @@ -1557,6 +1571,7 @@ namespace AMDiS { dofCommSd.create(intBoundarySd); } + // === If requested, create more information on communication DOFs. === if (!createBoundaryDofFlag.isSet(BOUNDARY_SUBOBJ_SORTED)) diff --git a/AMDiS/src/parallel/ParallelDofMapping.cc b/AMDiS/src/parallel/ParallelDofMapping.cc index 05f6c476511984a478f957e8f87801a89fba2fe5..bc306d6ccdd9a49347791e294dc337dad4a432ea 100644 --- a/AMDiS/src/parallel/ParallelDofMapping.cc +++ b/AMDiS/src/parallel/ParallelDofMapping.cc @@ -84,7 +84,7 @@ namespace AMDiS { int rank = it.getRank(); if (meshLevel > 0) rank = levelData->mapRank(rank, 0, meshLevel); - + for (; !it.endDofIter(); it.nextDof()) if (dofMap.count(it.getDofIndex()) && !nonRankDofs.count(it.getDofIndex())) diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc index 1fee204c87b92394c8856adae3b0b976b543c61c..0fd4edf9feedcfbaa597588cad0cecc1d59bebb8 100644 --- a/AMDiS/src/parallel/PetscSolverFeti.cc +++ b/AMDiS/src/parallel/PetscSolverFeti.cc @@ -306,7 +306,7 @@ namespace AMDiS { primalDofMap.setMpiComm(levelData.getMpiComm(0), 0); dualDofMap.setMpiComm(levelData.getMpiComm(0), 0); - lagrangeMap.setMpiComm(levelData.getMpiComm(0), 0); + lagrangeMap.setMpiComm(levelData.getMpiComm(0), 0); localDofMap.setMpiComm(levelData.getMpiComm(meshLevel), meshLevel); if (fetiPreconditioner != FETI_NONE) interiorDofMap.setMpiComm(levelData.getMpiComm(meshLevel), meshLevel); @@ -330,12 +330,11 @@ namespace AMDiS { 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(); @@ -347,10 +346,6 @@ namespace AMDiS { } else { MeshLevelData& levelData = meshDistributor->getMeshLevelData(); - MSG("RANK %d FROM %d\n", - levelData.getMpiComm(1).Get_rank(), - levelData.getMpiComm(1).Get_size()); - int groupRowsInterior = 0; if (levelData.getMpiComm(1).Get_rank() == 0) groupRowsInterior = localDofMap.getOverallDofs(); @@ -363,12 +358,6 @@ namespace AMDiS { tmp = rStartInterior; levelData.getMpiComm(1).Allreduce(&tmp, &rStartInterior, 1, MPI_INT, MPI_SUM); - - MSG("COMM TEST FETI-DP: %d %d %d %d %d\n", - levelData.getMpiComm(1).Get_size(), - localDofMap.getRankDofs(), - localDofMap.getOverallDofs(), - nGlobalOverallInterior, rStartInterior); } MSG("FETI-DP data created on mesh level %d\n", meshLevel); @@ -393,7 +382,6 @@ namespace AMDiS { ("Should not happen!\n"); } - // If multi level test, inform sub domain solver about coarse space. subDomainSolver->setDofMapping(&primalDofMap, &localDofMap); } @@ -456,10 +444,10 @@ namespace AMDiS { if (!isPrimal(feSpace, **it)) if (meshLevel == 0) { dualDofMap[feSpace].insertRankDof(**it); - } else { - if (meshDistributor->getDofMapSd()[feSpace].isRankDof(**it)) - dualDofMap[feSpace].insertRankDof(**it); - } + } else { + if (meshDistributor->getDofMapSd()[feSpace].isRankDof(**it)) + dualDofMap[feSpace].insertRankDof(**it); + } } @@ -510,7 +498,6 @@ namespace AMDiS { sdRankDofs[it.getRank()].insert(it.getDofIndex()); } - if (dualDofMap[feSpace].nLocalDofs == 0) return; @@ -525,9 +512,11 @@ namespace AMDiS { if (!isPrimal(feSpace, it.getDofIndex())) { boundaryDofRanks[feSpace][it.getDofIndex()].insert(mpiRank); - if (meshLevel == 0 || - (meshLevel > 0 && sdRankDofs[it.getRank()].count(it.getDofIndex()))) - boundaryDofRanks[feSpace][it.getDofIndex()].insert(it.getRank()); + if (meshLevel == 0 || + (meshLevel > 0 && sdRankDofs[it.getRank()].count(it.getDofIndex()))) { + boundaryDofRanks[feSpace][it.getDofIndex()].insert(it.getRank()); + } + } } } @@ -542,9 +531,9 @@ namespace AMDiS { !it.end(); it.nextRank()) for (; !it.endDofIter(); it.nextDof()) if (!isPrimal(feSpace, it.getDofIndex())) - if (meshLevel == 0 || - (meshLevel > 0 && sdRankDofs[it.getRank()].count(it.getDofIndex()))) - stdMpi.getSendData(it.getRank()).push_back(boundaryDofRanks[feSpace][it.getDofIndex()]); + if (meshLevel == 0 || + (meshLevel > 0 && sdRankDofs[it.getRank()].count(it.getDofIndex()))) + stdMpi.getSendData(it.getRank()).push_back(boundaryDofRanks[feSpace][it.getDofIndex()]); stdMpi.updateSendDataSize(); @@ -553,9 +542,9 @@ namespace AMDiS { bool recvFromRank = false; for (; !it.endDofIter(); it.nextDof()) { if (!isPrimal(feSpace, it.getDofIndex())) { - if (meshLevel == 0 || - (meshLevel > 0 && - meshDistributor->getDofMapSd()[feSpace].isRankDof(it.getDofIndex()))) { + if (meshLevel == 0 || + (meshLevel > 0 && + meshDistributor->getDofMapSd()[feSpace].isRankDof(it.getDofIndex()))) { recvFromRank = true; break; } @@ -573,11 +562,13 @@ namespace AMDiS { int i = 0; for (; !it.endDofIter(); it.nextDof()) if (!isPrimal(feSpace, it.getDofIndex())) - if (meshLevel == 0 || - (meshLevel > 0 && - meshDistributor->getDofMapSd()[feSpace].isRankDof(it.getDofIndex()))) + if (meshLevel == 0 || + (meshLevel > 0 && + meshDistributor->getDofMapSd()[feSpace].isRankDof(it.getDofIndex()))) boundaryDofRanks[feSpace][it.getDofIndex()] = stdMpi.getRecvData(it.getRank())[i++]; + else + lagrangeMap[feSpace].insertNonRankDof(it.getDofIndex()); } @@ -692,7 +683,6 @@ namespace AMDiS { localDofMap.getMatIndex(k, it->first) + rStartInterior; double value = (W[i] == mpiRank ? 1.0 : -1.0); - MSG("SET VALUE: %f\n", value); MatSetValue(mat_lagrange, index, colIndex, value, INSERT_VALUES); } index++; @@ -1135,12 +1125,6 @@ namespace AMDiS { VecRestoreArray(vec_sol_b, &localSolB); VecRestoreArray(local_sol_primal, &localSolPrimal); VecDestroy(&local_sol_primal); - - - TEST_EXIT_DBG(meshLevel <= 1)("Rework for higher multilevel methods!\n"); - if (meshLevel == 1) { - // meshDistributor->synchVector(vec, meshLevel); - } } @@ -1534,7 +1518,7 @@ namespace AMDiS { else solveReducedFetiMatrix(vec); - MeshDistributor::globalMeshDistributor->synchVector(vec); + // MeshDistributor::globalMeshDistributor->synchVector(vec); } } diff --git a/AMDiS/src/parallel/StdMpi.h b/AMDiS/src/parallel/StdMpi.h index 4b5bceb87efd0108005e07904adb7e37d4ba408d..e7cadce63f077fb8f82f44b1c3687de9c2ee028d 100644 --- a/AMDiS/src/parallel/StdMpi.h +++ b/AMDiS/src/parallel/StdMpi.h @@ -228,6 +228,7 @@ namespace AMDiS { }; + /** \brief * This class is used to easily send and receive STL containers using MPI. */ @@ -376,6 +377,8 @@ namespace AMDiS { /// Returns received data from a specific rank, see \ref recvData. RecvT& getRecvData(int rank) { + FUNCNAME("StdMpi::getRecvData()"); + TEST_EXIT_DBG(recvData.count(rank))("No recv data from rank %d\n", rank); return recvData[rank]; } @@ -395,7 +398,6 @@ namespace AMDiS { for (map<int, int>::iterator sendIt = sendDataSize.begin(); sendIt != sendDataSize.end(); ++sendIt) { sendBuffers[requestCounter] = sendIt->second; - request[requestCounter] = mpiComm.Isend(&(sendBuffers[requestCounter]), 1, MPI_INT, sendIt->first, 0); @@ -403,9 +405,10 @@ namespace AMDiS { } for (map<int, int>::iterator recvIt = recvDataSize.begin(); - recvIt != recvDataSize.end(); ++recvIt) + recvIt != recvDataSize.end(); ++recvIt) { request[requestCounter++] = mpiComm.Irecv(&(recvIt->second), 1, MPI_INT, recvIt->first, 0); + } MPI::Request::Waitall(requestCounter, request); } @@ -425,7 +428,6 @@ namespace AMDiS { if (exchangeDataSize) commDataSize(); - // === Remove empty data communication. === { @@ -531,6 +533,8 @@ namespace AMDiS { bool commPrepared; bool exchangeDataSize; + + static int ccc; }; }