diff --git a/AMDiS/src/parallel/FeSpaceMapping.h b/AMDiS/src/parallel/FeSpaceMapping.h index ae172deed057808eaed7955d9c4cc223a1b91b66..b387fbd957a78ecc9fb2010e574359506b62b094 100644 --- a/AMDiS/src/parallel/FeSpaceMapping.h +++ b/AMDiS/src/parallel/FeSpaceMapping.h @@ -55,6 +55,7 @@ namespace AMDiS { recvDofs(NULL), needGlobalMapping(false), nRankDofs(0), + nLocalDofs(0), nOverallDofs(0), rStartDofs(0), overlap(false) @@ -76,7 +77,7 @@ namespace AMDiS { TEST_EXIT_DBG(dofMap.count(dof0) == 0)("Should not happen!\n"); dofMap[dof0].local = dof1; - + nLocalDofs++; if (dof1 != -1) nRankDofs++; } @@ -88,7 +89,7 @@ namespace AMDiS { TEST_EXIT_DBG(dofMap.count(dof0) == 0)("Should not happen!\n"); dofMap[dof0].local = dof1; - + nLocalDofs++; nonRankDofs.insert(dof0); } @@ -155,7 +156,7 @@ namespace AMDiS { bool needGlobalMapping; public: /// - int nRankDofs, nOverallDofs, rStartDofs; + int nRankDofs, nLocalDofs, nOverallDofs, rStartDofs; bool overlap; }; @@ -214,6 +215,26 @@ namespace AMDiS { return nRankDofs; } + int getLocalDofs(vector<const FiniteElemSpace*> &fe) + { + FUNCNAME("FeSpaceData::getLocalDofs()"); + + int result = 0; + for (unsigned int i = 0; i < fe.size(); i++) { + TEST_EXIT_DBG(data.count(fe[i]))("Cannot find FE space: %p\n", fe[i]); + result += data[fe[i]].nLocalDofs; + } + + return result; + } + + inline int getLocalDofs() + { + TEST_EXIT_DBG(nLocalDofs >= 0)("Should not happen!\n"); + + return nLocalDofs; + } + int getOverallDofs(vector<const FiniteElemSpace*> &feSpaces) { int result = 0; @@ -257,6 +278,8 @@ namespace AMDiS { mpiComm = m; feSpaces = fe; for (unsigned int i = 0; i < feSpaces.size(); i++) { + feSpacesUnique.insert(feSpaces[i]); + addFeSpace(feSpaces[i]); data[feSpaces[i]].setNeedGlobalMapping(needGlobalMapping); } @@ -264,10 +287,12 @@ namespace AMDiS { void update() { -// for (unsigned int i = 0; i < feSpaces.size(); i++) -// data[feSpaces[i]].update(); + for (std::set<const FiniteElemSpace*>::iterator it = feSpacesUnique.begin(); + it != feSpacesUnique.end(); ++it) + data[*it].update(); nRankDofs = getRankDofs(feSpaces); + nLocalDofs = getLocalDofs(feSpaces); nOverallDofs = getOverallDofs(feSpaces); rStartDofs = getStartDofs(feSpaces); } @@ -317,7 +342,9 @@ namespace AMDiS { vector<const FiniteElemSpace*> feSpaces; - int nRankDofs, nOverallDofs, rStartDofs; + std::set<const FiniteElemSpace*> feSpacesUnique; + + int nRankDofs, nLocalDofs, nOverallDofs, rStartDofs; }; } diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc index edc5167fc30b9b82bb8635861a6f4178961e513e..9c12212ba55f83388ade825e66b016c6e32a061a 100644 --- a/AMDiS/src/parallel/PetscSolverFeti.cc +++ b/AMDiS/src/parallel/PetscSolverFeti.cc @@ -218,7 +218,6 @@ namespace AMDiS { for (unsigned int i = 0; i < meshDistributor->getFeSpaces().size(); i++) { const FiniteElemSpace *feSpace = meshDistributor->getFeSpace(i); - createPrimals(feSpace); createDuals(feSpace); createLagrange(feSpace); @@ -244,56 +243,11 @@ namespace AMDiS { lagrangeMap[feSpace].nRankDofs, lagrangeMap[feSpace].nOverallDofs); } - - // === Communicate lagrangeMap to all other ranks. === - - for (unsigned int i = 0; i < meshDistributor->getFeSpaces().size(); i++) { - const FiniteElemSpace *feSpace = meshDistributor->getFeSpace(i); - - StdMpi<vector<int> > stdMpi(meshDistributor->getMpiComm()); - - for (DofComm::Iterator it(meshDistributor->getSendDofs(), feSpace); - !it.end(); it.nextRank()) { - for (; !it.endDofIter(); it.nextDof()) - if (!isPrimal(feSpace, it.getDofIndex())) { - DegreeOfFreedom d = lagrangeMap[feSpace][it.getDofIndex()].local; - stdMpi.getSendData(it.getRank()).push_back(d); - } - } - - stdMpi.updateSendDataSize(); - - for (DofComm::Iterator it(meshDistributor->getRecvDofs(), feSpace); - !it.end(); it.nextRank()) { - bool recvData = false; - for (; !it.endDofIter(); it.nextDof()) - if (!isPrimal(feSpace, it.getDofIndex())) { - recvData = true; - break; - } - - if (recvData) - stdMpi.recv(it.getRank()); - } - - stdMpi.startCommunication(); - - for (DofComm::Iterator it(meshDistributor->getRecvDofs(), feSpace); - !it.end(); it.nextRank()) { - int counter = 0; - for (; !it.endDofIter(); it.nextDof()) { - if (!isPrimal(feSpace, it.getDofIndex())) { - DegreeOfFreedom d = stdMpi.getRecvData(it.getRank())[counter++]; - lagrangeMap[feSpace].insert(it.getDofIndex(), d); - } - } - } - } } void PetscSolverFeti::createPrimals(const FiniteElemSpace *feSpace) - { + { FUNCNAME("PetscSolverFeti::createPrimals()"); // === Define all vertices on the interior boundaries of the macro mesh === @@ -322,8 +276,6 @@ namespace AMDiS { primalDofMap[feSpace].setOverlap(true); primalDofMap[feSpace].setDofComm(meshDistributor->getSendDofs(), meshDistributor->getRecvDofs()); - - primalDofMap[feSpace].update(); } @@ -393,8 +345,6 @@ namespace AMDiS { it != allBoundaryDofs.end(); ++it) if (!isPrimal(feSpace, **it)) dualDofMap[feSpace].insertRankDof(**it); - - dualDofMap[feSpace].update(); } @@ -409,13 +359,17 @@ namespace AMDiS { map<DegreeOfFreedom, MultiIndex>& dualMap = dualDofMap[feSpace].getMap(); for (map<DegreeOfFreedom, MultiIndex>::iterator it = dualMap.begin(); it != dualMap.end(); ++it) { if (meshDistributor->getIsRankDof(feSpace, it->first)) { - lagrangeMap[feSpace].insert(it->first, nRankLagrange); + lagrangeMap[feSpace].insertRankDof(it->first, nRankLagrange); int degree = boundaryDofRanks[it->first].size(); nRankLagrange += (degree * (degree - 1)) / 2; + } else { + lagrangeMap[feSpace].insert(it->first); } } lagrangeMap[feSpace].nRankDofs = nRankLagrange; - lagrangeMap[feSpace].update(); + lagrangeMap[feSpace].setOverlap(true); + lagrangeMap[feSpace].setDofComm(meshDistributor->getSendDofs(), + meshDistributor->getRecvDofs()); } @@ -449,8 +403,6 @@ namespace AMDiS { for (map<DegreeOfFreedom, MultiIndex>::iterator it = dualDofMap[feSpace].getMap().begin(); it != dualDofMap[feSpace].getMap().end(); ++it) localDofMap[feSpace].insertRankDof(it->first); - - localDofMap[feSpace].update(); } @@ -586,8 +538,7 @@ namespace AMDiS { int maxLocalPrimal = mat_b_primal_cols.size(); mpi::globalMax(maxLocalPrimal); - TEST_EXIT(mat_b_primal_cols.size() == - primalDofMap[feSpace].size() * nComponents) + TEST_EXIT(mat_b_primal_cols.size() == primalDofMap.getLocalDofs()) ("Should not happen!\n"); for (map<int, vector<pair<int, double> > >::iterator it = mat_b_primal_cols.begin(); it != mat_b_primal_cols.end(); ++it) { @@ -831,8 +782,8 @@ namespace AMDiS { // === contained in rank's domain. === vector<PetscInt> globalIsIndex, localIsIndex; - globalIsIndex.reserve(primalDofMap[feSpace].size() * nComponents); - localIsIndex.reserve(primalDofMap[feSpace].size() * nComponents); + globalIsIndex.reserve(primalDofMap.getLocalDofs()); + localIsIndex.reserve(primalDofMap.getLocalDofs()); { int counter = 0;