Liebe Gitlab-Nutzer, lieber Gitlab-Nutzer, es ist nun möglich sich mittels des ZIH-Logins/LDAP an unserem Dienst anzumelden. Ein Anmelden über dieses erzeugt ein neues Konto. Das alte Konto ist über den Reiter "Standard" erreichbar. Die Administratoren

Dear Gitlab user, it is now possible to log in to our service using the ZIH login/LDAP. Logging in via this will create a new account. The old account can be accessed via the "Standard" tab. The administrators

Commit ecb93cc3 authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

Fixed FETI-DP for Stokes problem.

parent e8e207b4
......@@ -16,23 +16,4 @@
namespace AMDiS {
vector<const FiniteElemSpace*> getComponentFeSpaces(Matrix<DOFMatrix*> &mat)
{
FUNCNAME("getComponentFeSpaces()");
int nComponents = mat.getNumRows();
vector<const FiniteElemSpace*> 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<const FiniteElemSpace*> getComponentFeSpaces(Matrix<DOFMatrix*> &mat);
}
#endif // AMDIS_MATRIXVECTOR_H
......@@ -334,7 +334,7 @@ namespace AMDiS {
}
/// Returns \ref componentSpaces;
inline vector<const FiniteElemSpace*> getComponentFeSpaces()
inline vector<const FiniteElemSpace*> getComponentSpaces()
{
return componentSpaces;
}
......
......@@ -35,14 +35,4 @@ namespace AMDiS {
vectors[i]->deserialize(in);
}
vector<const FiniteElemSpace*> SystemVector::getComponentFeSpaces() const
{
vector<const FiniteElemSpace*> 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<const FiniteElemSpace*> 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<double> 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<string>(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<const FiniteElemSpace*, map<int, const DegreeOfFreedom*> > 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<const FiniteElemSpace*>& 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<const FiniteElemSpace*>& getComponentFeSpaces()
inline vector<const FiniteElemSpace*>& getComponentSpaces()
{
return componentSpaces;
}
......@@ -504,7 +504,8 @@ namespace AMDiS {
/// Finite element spaces of the problem.
vector<const FiniteElemSpace*> componentSpaces;
vector<const FiniteElemSpace*> uniqueFeSpaces;
/// Set of all different FE spaces.
vector<const FiniteElemSpace*> feSpaces;
/// Mesh of the problem.
......
......@@ -115,7 +115,8 @@ namespace AMDiS {
if (checkMeshChange()) {
// Mesh has been changed, recompute interior DOF mapping.
vector<const FiniteElemSpace*> feSpaces = getComponentFeSpaces(seqMat);
vector<const FiniteElemSpace*> 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<double> 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<WorldVector<double> > 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<double> 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<double> 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<double> 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<const FiniteElemSpace*> feSpaces = vec.getComponentFeSpaces();
vector<const FiniteElemSpace*> feSpaces = meshDistributor->getComponentSpaces();
int cnt = 0;
for (int component = 0; component < nComponents; component++) {
DOFVector<double>& dofVec = *(vec.getDOFVector(component));
......@@ -1716,10 +1720,8 @@ namespace AMDiS {
globalIsIndex.reserve(interfaceDofMap.getLocalDofs());
localIsIndex.reserve(interfaceDofMap.getLocalDofs());
const FiniteElemSpace *pressureFeSpace =
vec.getDOFVector(pressureComponent)->getFeSpace();