diff --git a/AMDiS/src/ElInfo2d.cc b/AMDiS/src/ElInfo2d.cc index 95985f1dcb80d1d56c47c1ad9f1ceb38e9c4d583..993cb4541db1f38c609762ec6b6c8bcf63df9240 100644 --- a/AMDiS/src/ElInfo2d.cc +++ b/AMDiS/src/ElInfo2d.cc @@ -245,7 +245,7 @@ namespace AMDiS { break; case 1: - // The commonedge is the edge 1 of this element. + // The common edge is the edge 1 of this element. switch (edgeNo) { case 0: neighbourCoord[i][0] = macroNeighbour->coord[1]; diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc index f3751fbf9fa650531402227bea4a15edbf4ab511..04bd93dc1b8c2737bf8a038763ea03d55c9009e4 100644 --- a/AMDiS/src/parallel/PetscSolverFeti.cc +++ b/AMDiS/src/parallel/PetscSolverFeti.cc @@ -786,37 +786,39 @@ namespace AMDiS { if (it->rankObj.subObj == FACE) allFaces[it.getRank()].insert(it->rankObj); + + std::set<BoundaryObject> allMyEdges; + TraverseStack stack; + ElInfo *elInfo = stack.traverseFirst(meshDistributor->getMesh(), 0, Mesh::CALL_EL_LEVEL | Mesh::FILL_BOUND); + while (elInfo) { + Element *el = elInfo->getElement(); + for (int i = 0; i < el->getGeo(EDGE); i++) { + BoundaryObject bobj(el, elInfo->getType(), EDGE, i); + if (intBound.getDegreeOwn(bobj) == 1 && elInfo->getBoundary(EDGE, i) == INTERIOR) { + allMyEdges.insert(bobj); + } + } + elInfo = stack.traverseNext(elInfo); + } + + + for (map<int, std::set<BoundaryObject> >::iterator it = allFaces.begin(); it != allFaces.end(); ++it) { - MSG("SIZE = %d\n", it->second.size()); if (it->second.size() == 2) { vector<AtomicBoundary> &bs = intBound.getOwn()[it->first]; for (int i = 0; i < static_cast<int>(bs.size()); i++) { if (bs[i].rankObj.subObj == EDGE && - intBound.getDegreeOwn(bs[i].rankObj) == 3) { + intBound.getDegreeOwn(bs[i].rankObj) == 1 && + allMyEdges.count(bs[i].rankObj)) { MSG("FOUND AN EDGE: %d %d %d\n", bs[i].rankObj.elIndex, bs[i].rankObj.subObj, bs[i].rankObj.ithObj); + it->second.insert(bs[i].rankObj); } } } } - int nBound = 0; - int nInterior = 0; - TraverseStack stack; - ElInfo *elInfo = stack.traverseFirst(meshDistributor->getMesh(), 0, Mesh::CALL_EL_LEVEL | Mesh::FILL_BOUND); - while (elInfo) { - MSG("INSIDE!\n"); - Element *el = elInfo->getElement(); - for (int i = 0; i < el->getGeo(EDGE); i++) { - BoundaryObject bobj(el, elInfo->getType(), EDGE, i); - MSG("CHECK FOR %d/%d/%d (%d)\n", el->getIndex(), EDGE, i, intBound.getDegreeOwn(bobj)); - if (intBound.getDegreeOwn(bobj) == 1) - MSG("B = %d (%d)\n", elInfo->getBoundary(EDGE, i), INTERIOR); - } - elInfo = stack.traverseNext(elInfo); - } - int nEmptyFaces = 0; vector<vector<BoundaryObject> > data;