Commit ecb93cc3 by Thomas Witkowski

Fixed FETI-DP for Stokes problem.

parent e8e207b4
 ... ... @@ -16,23 +16,4 @@ namespace AMDiS { vector getComponentFeSpaces(Matrix &mat) { FUNCNAME("getComponentFeSpaces()"); int nComponents = mat.getNumRows(); vector result(nComponents); for (int i = 0; i < nComponents; i++) { for (int j = 0; j < nComponents; j++) { if (mat[i][j]) { result[i] = mat[i][j]->getRowFeSpace(); break; } } } return result; } }
 ... ... @@ -518,11 +518,6 @@ namespace AMDiS { z[1] = x[2] * y[0] - x[0] * y[2]; z[2] = x[0] * y[1] - x[1] * y[0]; } /// Returns a vector with the FE spaces of each row in the matrix. Thus, the /// resulting vector may contain the same FE space multiple times. vector getComponentFeSpaces(Matrix &mat); } #endif // AMDIS_MATRIXVECTOR_H
 ... ... @@ -334,7 +334,7 @@ namespace AMDiS { } /// Returns \ref componentSpaces; inline vector getComponentFeSpaces() inline vector getComponentSpaces() { return componentSpaces; } ... ...
 ... ... @@ -35,14 +35,4 @@ namespace AMDiS { vectors[i]->deserialize(in); } vector SystemVector::getComponentFeSpaces() const { vector result(vectors.size()); for (unsigned int i = 0; i < vectors.size(); i++) result[i] = vectors[i]->getFeSpace(); return result; } }
 ... ... @@ -120,8 +120,6 @@ namespace AMDiS { return feSpace; } vector getComponentFeSpaces() const; /// Here the system vector is interpreted as one large vector. The given /// is used as a global index which indicates a local vector number and /// a local index on this vector. The operator returns this local vector ... ...
 ... ... @@ -160,18 +160,18 @@ namespace AMDiS { bool doNext = false; do { doNext = false; for (unsigned int i = 0; i < uniqueFeSpaces.size() - 1; i++) { if (uniqueFeSpaces[i]->getBasisFcts()->getDegree() > uniqueFeSpaces[i + 1]->getBasisFcts()->getDegree()) { const FiniteElemSpace *tmp = uniqueFeSpaces[i + 1]; uniqueFeSpaces[i + 1] = uniqueFeSpaces[i]; uniqueFeSpaces[i] = tmp; for (unsigned int i = 0; i < feSpaces.size() - 1; i++) { if (feSpaces[i]->getBasisFcts()->getDegree() > feSpaces[i + 1]->getBasisFcts()->getDegree()) { const FiniteElemSpace *tmp = feSpaces[i + 1]; feSpaces[i + 1] = feSpaces[i]; feSpaces[i] = tmp; doNext = true; } } } while (doNext); elObjDb.setFeSpace(uniqueFeSpaces[0]); elObjDb.setFeSpace(feSpaces[0]); // If required, create hierarchical mesh level structure. createMeshLevelStructure(); ... ... @@ -193,7 +193,7 @@ namespace AMDiS { elObjDb.setData(partitionMap, levelData); #if (DEBUG != 0) ParallelDebug::writeDebugFile(uniqueFeSpaces[uniqueFeSpaces.size() - 1], ParallelDebug::writeDebugFile(feSpaces[feSpaces.size() - 1], dofMap, debugOutputDir + "mpi-dbg", "dat"); #endif ... ... @@ -318,7 +318,7 @@ namespace AMDiS { ParallelDebug::testInteriorBoundary(*this); ParallelDebug::followBoundary(*this); debug::writeMesh(uniqueFeSpaces[0], -1, debugOutputDir + "macro_mesh"); debug::writeMesh(feSpaces[0], -1, debugOutputDir + "macro_mesh"); MSG("Debug mode tests finished!\n"); #endif ... ... @@ -369,9 +369,9 @@ namespace AMDiS { TEST_EXIT(componentSpaces.size() == 0) ("Parallelization of coupled problems is deactived at the moment!\n"); componentSpaces = probStat->getComponentFeSpaces(); uniqueFeSpaces = probStat->getFeSpaces(); mesh = uniqueFeSpaces[0]->getMesh(); componentSpaces = probStat->getComponentSpaces(); feSpaces = probStat->getFeSpaces(); mesh = feSpaces[0]->getMesh(); info = probStat->getInfo(); switch (mesh->getDim()) { ... ... @@ -668,8 +668,8 @@ namespace AMDiS { DofEdge dofEdge1 = edge1.first->getEdge(edge1.second); WorldVector c0, c1; mesh->getDofIndexCoords(dofEdge0.first, uniqueFeSpaces[0], c0); mesh->getDofIndexCoords(dofEdge0.second, uniqueFeSpaces[0], c1); mesh->getDofIndexCoords(dofEdge0.first, feSpaces[0], c0); mesh->getDofIndexCoords(dofEdge0.second, feSpaces[0], c1); MSG("FOUND EDGE %d/%d <-> %d/%d\n", edge0.first->getIndex(), edge0.second, ... ... @@ -966,7 +966,7 @@ namespace AMDiS { MPI::Wtime() - first); #if (DEBUG != 0) debug::writeMesh(uniqueFeSpaces[0], -1, debugOutputDir + "mesh"); debug::writeMesh(feSpaces[0], -1, debugOutputDir + "mesh"); #endif // Because the mesh has been changed, update the DOF numbering and mappings. ... ... @@ -1267,7 +1267,7 @@ namespace AMDiS { if (writePartMesh > 0 && repartitioningCounter == 0) ParallelDebug::writePartitioningFile(debugOutputDir + "partitioning", repartitioningCounter, uniqueFeSpaces[0]); feSpaces[0]); repartitioningCounter++; ... ... @@ -1298,7 +1298,7 @@ namespace AMDiS { // === Run mesh partitioner to calculate a new mesh partitioning. === partitioner->setLocalGlobalDofMap(&(dofMap[uniqueFeSpaces[0]].getMap())); partitioner->setLocalGlobalDofMap(&(dofMap[feSpaces[0]].getMap())); bool partitioningSucceed = partitioner->partition(elemWeights, ADAPTIVE_REPART); if (!partitioningSucceed) { ... ... @@ -1475,11 +1475,11 @@ namespace AMDiS { // Note that also if there are no macros to be deleted, this function will // update the number of elements, vertices, etc. of the mesh. mesh->removeMacroElements(deleteMacroElements, uniqueFeSpaces); mesh->removeMacroElements(deleteMacroElements, feSpaces); // === Remove double DOFs. === MeshManipulation meshManipulation(mesh); meshManipulation.deleteDoubleDofs(uniqueFeSpaces, newMacroEl, elObjDb); meshManipulation.deleteDoubleDofs(feSpaces, newMacroEl, elObjDb); mesh->dofCompress(); partitioner->createPartitionMap(partitionMap); ... ... @@ -1515,7 +1515,7 @@ namespace AMDiS { ParallelDebug::writePartitioningFile(debugOutputDir + "partitioning", repartitioningCounter, uniqueFeSpaces[0]); feSpaces[0]); ParallelDebug::testAllElements(*this); ParallelDebug::testDoubleDofs(mesh); ParallelDebug::testInteriorBoundary(*this); ... ... @@ -1561,11 +1561,11 @@ namespace AMDiS { // === Create DOF communicator. === dofComm.init(0, levelData, uniqueFeSpaces); dofComm.init(0, levelData, feSpaces); dofComm.create(intBoundary); if (levelData.getLevelNumber() > 1) { dofCommSd.init(0, levelData, uniqueFeSpaces); dofCommSd.init(0, levelData, feSpaces); dofCommSd.create(intBoundarySd); } ... ... @@ -1577,8 +1577,8 @@ namespace AMDiS { int nLevels = levelData.getLevelNumber(); boundaryDofInfo.resize(nLevels); for (unsigned int i = 0; i < uniqueFeSpaces.size(); i++) { const FiniteElemSpace *feSpace = uniqueFeSpaces[i]; for (unsigned int i = 0; i < feSpaces.size(); i++) { const FiniteElemSpace *feSpace = feSpaces[i]; for (int level = 0; level < nLevels; level++) { ... ... @@ -1630,7 +1630,7 @@ namespace AMDiS { if (partitioner->getElementInRank()[(*it)->getIndex()] == false) macrosToRemove.insert(*it); mesh->removeMacroElements(macrosToRemove, uniqueFeSpaces); mesh->removeMacroElements(macrosToRemove, feSpaces); } ... ... @@ -1651,13 +1651,13 @@ namespace AMDiS { int nLevels = levelData.getLevelNumber(); TEST_EXIT_DBG(nLevels >= 1)("Should not happen!\n"); dofMap.init(levelData, componentSpaces, uniqueFeSpaces); dofMap.init(levelData, componentSpaces, feSpaces); dofMap.setMpiComm(levelData.getMpiComm(0), 0); dofMap.setDofComm(dofComm); dofMap.clear(); if (nLevels > 1) { dofMapSd.init(levelData, componentSpaces, uniqueFeSpaces); dofMapSd.init(levelData, componentSpaces, feSpaces); dofMapSd.setMpiComm(levelData.getMpiComm(1), 1); dofMapSd.setDofComm(dofCommSd); dofMapSd.clear(); ... ... @@ -1665,13 +1665,13 @@ namespace AMDiS { createBoundaryDofs(); for (unsigned int i = 0; i < uniqueFeSpaces.size(); i++) updateLocalGlobalNumbering(dofMap, dofComm, uniqueFeSpaces[i]); for (unsigned int i = 0; i < feSpaces.size(); i++) updateLocalGlobalNumbering(dofMap, dofComm, feSpaces[i]); dofMap.update(); if (nLevels > 1) { for (unsigned int i = 0; i < uniqueFeSpaces.size(); i++) updateLocalGlobalNumbering(dofMapSd, dofCommSd, uniqueFeSpaces[i]); for (unsigned int i = 0; i < feSpaces.size(); i++) updateLocalGlobalNumbering(dofMapSd, dofCommSd, feSpaces[i]); dofMapSd.update(); } ... ... @@ -1685,28 +1685,28 @@ namespace AMDiS { MSG("------------- Debug information -------------\n"); MSG("| number of levels: %d\n", nLevels); MSG("| number of FE spaces: %d\n", uniqueFeSpaces.size()); MSG("| number of FE spaces: %d\n", feSpaces.size()); for (unsigned int i = 0; i < uniqueFeSpaces.size(); i++) { MSG("| FE space = %d (pointer adr %p):\n", i, uniqueFeSpaces[i]); MSG("| nRankDofs = %d\n", dofMap[uniqueFeSpaces[i]].nRankDofs); MSG("| nOverallDofs = %d\n", dofMap[uniqueFeSpaces[i]].nOverallDofs); MSG("| rStartDofs = %d\n", dofMap[uniqueFeSpaces[i]].rStartDofs); for (unsigned int i = 0; i < feSpaces.size(); i++) { MSG("| FE space = %d (pointer adr %p):\n", i, feSpaces[i]); MSG("| nRankDofs = %d\n", dofMap[feSpaces[i]].nRankDofs); MSG("| nOverallDofs = %d\n", dofMap[feSpaces[i]].nOverallDofs); MSG("| rStartDofs = %d\n", dofMap[feSpaces[i]].rStartDofs); } if (nLevels > 1) { for (unsigned int i = 0; i < uniqueFeSpaces.size(); i++) { for (unsigned int i = 0; i < feSpaces.size(); i++) { MSG("| FE space = %d:\n", i); MSG("| nRankDofs = %d\n", dofMapSd[uniqueFeSpaces[i]].nRankDofs); MSG("| nOverallDofs = %d\n", dofMapSd[uniqueFeSpaces[i]].nOverallDofs); MSG("| rStartDofs = %d\n", dofMapSd[uniqueFeSpaces[i]].rStartDofs); MSG("| nRankDofs = %d\n", dofMapSd[feSpaces[i]].nRankDofs); MSG("| nOverallDofs = %d\n", dofMapSd[feSpaces[i]].nOverallDofs); MSG("| rStartDofs = %d\n", dofMapSd[feSpaces[i]].rStartDofs); } } // debug::writeElementIndexMesh(mesh, debugOutputDir + "elementIndex-" + // lexical_cast(mpiRank) + ".vtu"); ParallelDebug::writeDebugFile(uniqueFeSpaces[uniqueFeSpaces.size() - 1], ParallelDebug::writeDebugFile(feSpaces[feSpaces.size() - 1], dofMap, debugOutputDir + "mpi-dbg", "dat"); debug::testSortedDofs(mesh, elMap); ... ... @@ -1718,15 +1718,15 @@ namespace AMDiS { ParallelDebug::testGlobalIndexByCoords(*this); } #else for (unsigned int i = 0; i < uniqueFeSpaces.size(); i++) for (unsigned int i = 0; i < feSpaces.size(); i++) MSG("FE space %d: nRankDofs = %d nOverallDofs = %d\n", i, dofMap[uniqueFeSpaces[i]].nRankDofs, dofMap[uniqueFeSpaces[i]].nOverallDofs); i, dofMap[feSpaces[i]].nRankDofs, dofMap[feSpaces[i]].nOverallDofs); int tmp = 0; Parameters::get(name + "->write parallel debug file", tmp); if (tmp) ParallelDebug::writeDebugFile(uniqueFeSpaces[uniqueFeSpaces.size() - 1], ParallelDebug::writeDebugFile(feSpaces[feSpaces.size() - 1], dofMap, debugOutputDir + "mpi-dbg", "dat"); #endif ... ... @@ -1784,8 +1784,8 @@ namespace AMDiS { // MPI::COMM_WORLD.Barrier(); [TODO: CHANGE BECAUSE NOT ALL RANKS HAVE PERIODIC MAP!!!] double first = MPI::Wtime(); for (unsigned int i = 0; i < uniqueFeSpaces.size(); i++) createPeriodicMap(uniqueFeSpaces[i]); for (unsigned int i = 0; i < feSpaces.size(); i++) createPeriodicMap(feSpaces[i]); // MPI::COMM_WORLD.Barrier(); INFO(info, 8)("Creation of periodic mapping needed %.5f seconds\n", ... ... @@ -2022,14 +2022,14 @@ namespace AMDiS { // Create a map from DOF indices to the corresponding DOF pointers. map > dofIndexMap; for (unsigned int i = 0; i < uniqueFeSpaces.size(); i++) { ElementDofIterator elDofIter(uniqueFeSpaces[i]); for (unsigned int i = 0; i < feSpaces.size(); i++) { ElementDofIterator elDofIter(feSpaces[i]); TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL); while (elInfo) { elDofIter.reset(elInfo->getElement()); do { dofIndexMap[uniqueFeSpaces[i]][elDofIter.getDof()] = elDofIter.getDofPtr(); dofIndexMap[feSpaces[i]][elDofIter.getDof()] = elDofIter.getDofPtr(); } while (elDofIter.next()); elInfo = stack.traverseNext(elInfo); ... ...
 ... ... @@ -137,20 +137,20 @@ namespace AMDiS { { FUNCNAME("MeshDistributor::getFeSpace()"); TEST_EXIT_DBG(i < uniqueFeSpaces.size()) TEST_EXIT_DBG(i < feSpaces.size()) ("Try to access FE space %d, but have only %d FE spaces!\n", i, uniqueFeSpaces.size()); i, feSpaces.size()); return uniqueFeSpaces[i]; return feSpaces[i]; } /// Returns all FE spaces, thus \ref feSpaces. inline vector& getFeSpaces() { return uniqueFeSpaces; return feSpaces; } inline const FiniteElemSpace* getComponentFeSpace(unsigned int i = 0) inline const FiniteElemSpace* getComponentSpace(unsigned int i = 0) { FUNCNAME("MeshDistributor::getFeSpace()"); ... ... @@ -159,7 +159,7 @@ namespace AMDiS { return componentSpaces[i]; } inline vector& getComponentFeSpaces() inline vector& getComponentSpaces() { return componentSpaces; } ... ... @@ -504,7 +504,8 @@ namespace AMDiS { /// Finite element spaces of the problem. vector componentSpaces; vector uniqueFeSpaces; /// Set of all different FE spaces. vector feSpaces; /// Mesh of the problem. ... ...
 ... ... @@ -115,7 +115,8 @@ namespace AMDiS { if (checkMeshChange()) { // Mesh has been changed, recompute interior DOF mapping. vector feSpaces = getComponentFeSpaces(seqMat); vector feSpaces = meshDistributor->getComponentSpaces(); interiorMap->setComputeMatIndex(!localMatrix); interiorMap->update(); ... ...
 ... ... @@ -164,7 +164,7 @@ namespace AMDiS { perMap.periodicDofAssociations[feSpace].begin(); it != perMap.periodicDofAssociations[feSpace].end(); ++it) { WorldVector c; pdb.mesh->getDofIndexCoords(it->first, pdb.uniqueFeSpaces[0], c); pdb.mesh->getDofIndexCoords(it->first, pdb.feSpaces[0], c); int nAssoc = it->second.size(); } ... ... @@ -329,7 +329,7 @@ namespace AMDiS { clock_t first = clock(); // Get FE space with basis functions of the highest degree const FiniteElemSpace *feSpace = pdb.uniqueFeSpaces[pdb.uniqueFeSpaces.size() - 1]; const FiniteElemSpace *feSpace = pdb.feSpaces[pdb.feSpaces.size() - 1]; int testCommonDofs = 1; Parameters::get("dbg->test common dofs", testCommonDofs); ... ... @@ -471,7 +471,7 @@ namespace AMDiS { FUNCNAME("ParallelDebug::testGlobalIndexByCoords()"); // Get FE space with basis functions of the highest degree const FiniteElemSpace *feSpace = pdb.uniqueFeSpaces[pdb.uniqueFeSpaces.size() - 1]; const FiniteElemSpace *feSpace = pdb.feSpaces[pdb.feSpaces.size() - 1]; DOFVector > coords(feSpace, "tmp"); pdb.mesh->getDofIndexCoords(feSpace, coords); ... ... @@ -649,7 +649,7 @@ namespace AMDiS { #if 0 if (rank == -1 || pdb.mpiRank == rank) { const FiniteElemSpace *feSpace = pdb.uniqueFeSpaces[0]; const FiniteElemSpace *feSpace = pdb.feSpaces[0]; cout << "====== DOF MAP LOCAL -> GLOBAL ====== " << endl; ... ... @@ -700,7 +700,7 @@ namespace AMDiS { dofit != rankDofs.end(); ++dofit) { cout << " " << **dofit << endl; WorldVector coords; pdb.mesh->getDofIndexCoords(*dofit, pdb.uniqueFeSpaces[0], coords); pdb.mesh->getDofIndexCoords(*dofit, pdb.feSpaces[0], coords); coords.print(); } ... ... @@ -709,7 +709,7 @@ namespace AMDiS { dofit != rankAllDofs.end(); ++dofit) { cout << " " << **dofit << endl; WorldVector coords; pdb.mesh->getDofIndexCoords(*dofit, pdb.uniqueFeSpaces[0], coords); pdb.mesh->getDofIndexCoords(*dofit, pdb.feSpaces[0], coords); coords.print(); } } ... ... @@ -886,13 +886,13 @@ namespace AMDiS { if (followThisBound(it->rankObj.elIndex, it->neighObj.elIndex)) debug::writeLocalElementDofs(pdb.mpiRank, it->rankObj.elIndex, pdb.uniqueFeSpaces[0]); pdb.feSpaces[0]); for (InteriorBoundary::iterator it(pdb.intBoundary.other); !it.end(); ++it) if (followThisBound(it->rankObj.elIndex, it->neighObj.elIndex)) debug::writeLocalElementDofs(pdb.mpiRank, it->rankObj.elIndex, pdb.uniqueFeSpaces[0]); pdb.feSpaces[0]); } ... ...
 ... ... @@ -366,7 +366,7 @@ namespace AMDiS { /// FE space. ComponentDofMap& operator[](const FiniteElemSpace *feSpace) { ERROR_EXIT("FE Space acces is not possible for component wise defined DOF mappings\n"); ERROR_EXIT("FE Space access is not possible for component wise defined DOF mappings\n"); } /// Return data iterator. ... ...
 ... ... @@ -100,8 +100,6 @@ namespace AMDiS { Parameters::get("parallel->feti->pressure component", pressureComponent); TEST_EXIT(pressureComponent >= 0) ("FETI-DP in Stokes mode, no pressure component defined!\n"); pressureFeSpace = feSpaces[pressureComponent]; } if (subdomain == NULL) { ... ... @@ -192,8 +190,8 @@ namespace AMDiS { interfaceDofMap.setMpiComm(levelData.getMpiComm(0), 0); } for (unsigned int i = 0; i < meshDistributor->getComponentFeSpaces().size(); i++) { const FiniteElemSpace *feSpace = meshDistributor->getComponentFeSpace(i); for (unsigned int i = 0; i < meshDistributor->getComponentSpaces().size(); i++) { const FiniteElemSpace *feSpace = meshDistributor->getComponentSpace(i); createPrimals(i, feSpace); ... ... @@ -213,8 +211,8 @@ namespace AMDiS { if (stokesMode) interfaceDofMap.update(); for (unsigned int i = 0; i < meshDistributor->getComponentFeSpaces().size(); i++) { const FiniteElemSpace *feSpace = meshDistributor->getComponentFeSpace(i); for (unsigned int i = 0; i < meshDistributor->getComponentSpaces().size(); i++) { const FiniteElemSpace *feSpace = meshDistributor->getComponentSpace(i); createLagrange(i, feSpace); createAugmentedLagrange(i, feSpace); } ... ... @@ -245,12 +243,12 @@ namespace AMDiS { } MSG("FETI-DP data created on mesh level %d\n", meshLevel); for (unsigned int i = 0; i < meshDistributor->getComponentFeSpaces().size(); i++) { const FiniteElemSpace *feSpace = meshDistributor->getComponentFeSpace(i); for (unsigned int i = 0; i < meshDistributor->getComponentSpaces().size(); i++) { const FiniteElemSpace *feSpace = meshDistributor->getComponentSpace(i); MSG("FETI-DP data for %d-ith component (FE space %p):\n", i, feSpace); if (feSpace == pressureFeSpace) { if (i == pressureComponent) { MSG(" nRankInterface = %d nOverallInterface = %d\n", interfaceDofMap[i].nRankDofs, interfaceDofMap[i].nOverallDofs); ... ... @@ -289,7 +287,7 @@ namespace AMDiS { { FUNCNAME("PetscSolverFeti::createPrimals()"); if (feSpace == pressureFeSpace) if (component == pressureComponent) return; // === Define all vertices on the interior boundaries of the macro mesh === ... ... @@ -339,7 +337,7 @@ namespace AMDiS { { FUNCNAME("PetscSolverFeti::createDuals()"); if (feSpace == pressureFeSpace) if (component == pressureComponent) return; // === Create global index of the dual nodes on each rank. === ... ... @@ -370,7 +368,7 @@ namespace AMDiS { { FUNCNAME("PetscSolverFeti::createInterfaceNodes()"); if (feSpace != pressureFeSpace) if (component != pressureComponent) return; DofContainer allBoundaryDofs; ... ... @@ -394,7 +392,7 @@ namespace AMDiS { { FUNCNAME("PetscSolverFeti::createLagrange()"); if (feSpace == pressureFeSpace) if (component == pressureComponent) return; boundaryDofRanks[feSpace].clear(); ... ... @@ -1270,11 +1268,14 @@ namespace AMDiS { if (stokesMode) { // === Create H2 vec === const FiniteElemSpace *pressureFeSpace = meshDistributor->getComponentSpace(pressureComponent); DOFVector tmpvec(pressureFeSpace, "tmpvec"); createH2vec(tmpvec); interfaceDofMap.createVec(fetiInterfaceLumpedPreconData.h2vec); DofMap& m = interfaceDofMap[pressureFeSpace].getMap(); DofMap& m = interfaceDofMap[pressureComponent].getMap(); for (DofMap::iterator it = m.begin(); it != m.end(); ++it) { if (meshDistributor->getDofMap()[pressureFeSpace].isRankDof(it->first)) { int index = interfaceDofMap.getMatIndex(pressureComponent, it->first); ... ... @@ -1419,10 +1420,13 @@ namespace AMDiS { if (!stokesMode) return; const FiniteElemSpace *pressureFeSpace = meshDistributor->getComponentSpace(pressureComponent); Vec ktest0, ktest1; localDofMap.createLocalVec(ktest0); localDofMap.createLocalVec(ktest1); DofMap& m = localDofMap[pressureFeSpace].getMap(); DofMap& m = localDofMap[pressureComponent].getMap(); for (DofMap::iterator it = m.begin(); it != m.end(); ++it) { if (meshDistributor->getDofMap()[pressureFeSpace].isRankDof(it->first)) { int index = localDofMap.getLocalMatIndex(pressureComponent, it->first); ... ... @@ -1675,7 +1679,7 @@ namespace AMDiS { // === And copy from PETSc local vectors to the DOF vectors. === vector feSpaces = vec.getComponentFeSpaces(); vector feSpaces = meshDistributor->getComponentSpaces(); int cnt = 0; for (int component = 0; component < nComponents; component++) { DOFVector& dofVec = *(vec.getDOFVector(component)); ... ... @@ -1716,10 +1720,8 @@ namespace AMDiS { globalIsIndex.reserve(interfaceDofMap.getLocalDofs()); localIsIndex.reserve(interfaceDofMap.getLocalDofs()); const FiniteElemSpace *pressureFeSpace =