diff --git a/Geo/gmshLevelset.cpp b/Geo/gmshLevelset.cpp index 76864c3c47f003366ed5f901a097c73e10a132e7..4acb7f06be165d7397ff9ac8aafcbe943b23e0bc 100644 --- a/Geo/gmshLevelset.cpp +++ b/Geo/gmshLevelset.cpp @@ -955,6 +955,7 @@ double gLevelsetDistMesh::operator()(double x, double y, double z) const _v2e.lower_bound(v); itm != _v2e.upper_bound(v); ++itm) elements.insert(itm->second); } + int dimE = elements[0]->getDim(); double minDistance = 1.e22; SPoint3 closestPoint; std::vector<MElement*> closestElements; @@ -966,24 +967,26 @@ double gLevelsetDistMesh::operator()(double x, double y, double z) const SPoint3 p1(v1->x(), v1->y(), v1->z()); SPoint3 p2(v2->x(), v2->y(), v2->z()); SPoint3 closePt; - if((*it)->getDim() == 1){ + if(dimE == 1){ signedDistancePointLine(p1, p2, pt, distance, closePt); // !! > 0 } - else if((*it)->getDim() == 2){ + else if(dimE == 2){ MVertex *v3 = (*it)->getVertex(2); SPoint3 p3(v3->x(), v3->y(), v3->z()); if(p1 == p2 || p1 == p3 || p2 == p3) distance = 1.e22; else signedDistancePointTriangle(p1, p2, p3, pt, distance, closePt); } else{ - Msg::Error("Cannot compute a distance to an entity of dimension %d\n", - (*it)->getDim()); + Msg::Error("Cannot compute a distance to an entity of dimension %d\n", dimE); } - if ((*it)->getDim() == 2) { - if(fabs(distance) == fabs(minDistance)){ + if(dimE == 1 && fabs(distance) < fabs(minDistance)){ + minDistance = distance; + } + else if(dimE == 2){ + if(fabs(distance) - fabs(minDistance) < 1.e-9){ closestElements.push_back(*it); } - if(fabs(distance) < fabs(minDistance)){ + else if(fabs(distance) < fabs(minDistance)){ closestPoint = closePt; minDistance = distance; closestElements.clear();