diff --git a/dune/fufem/geometry/polyhedrondistance.hh b/dune/fufem/geometry/polyhedrondistance.hh index 299c02d00557a26b8b5a3c3228f1480d8febe8cb..5241d264b4341ad55eeb9a0a7773840f8a77a937 100644 --- a/dune/fufem/geometry/polyhedrondistance.hh +++ b/dune/fufem/geometry/polyhedrondistance.hh @@ -95,7 +95,8 @@ void approximate(Coordinate const &target, Dune::DynamicMatrix<double> const &A, template <class Coordinate> double distance(const Coordinate &target, const ConvexPolyhedron<Coordinate> &segment, - double correctionTolerance) { + double correctionTolerance, + size_t maxIterations = 1000) { size_t nCorners = segment.vertices.size(); if (nCorners == 0) return std::numeric_limits<double>::infinity(); @@ -116,9 +117,7 @@ double distance(const Coordinate &target, Coordinate oldCoordinates = segment.barycentricToGlobal(sol); Coordinate newCoordinates; - size_t maxIterations = 1000; - size_t iterations; - for (iterations = 0; iterations < maxIterations; ++iterations) { + for (size_t iterations = 0; iterations < maxIterations; ++iterations) { approximate(target, A, l, segment, sol); newCoordinates = segment.barycentricToGlobal(sol); @@ -127,8 +126,6 @@ double distance(const Coordinate &target, oldCoordinates = newCoordinates; } - assert(iterations < maxIterations); - segment.sanityCheck(sol, barycentricTolerance); return (target - newCoordinates).two_norm(); } @@ -137,7 +134,8 @@ double distance(const Coordinate &target, template <class Coordinate> double distance(const ConvexPolyhedron<Coordinate> &s1, const ConvexPolyhedron<Coordinate> &s2, - double valueCorrectionTolerance) { + double valueCorrectionTolerance, + size_t maxIterations = 1000) { size_t nCorners1 = s1.vertices.size(); size_t nCorners2 = s2.vertices.size(); if (nCorners1 == 0 or nCorners2 == 0) @@ -163,9 +161,7 @@ double distance(const ConvexPolyhedron<Coordinate> &s1, Dune::DynamicMatrix<double> A2(nCorners2, nCorners2); populateMatrix(s2, A2); - size_t maxIterations = 1000; - size_t iterations; - for (iterations = 0; iterations < maxIterations; ++iterations) { + for (size_t iterations = 0; iterations < maxIterations; ++iterations) { Dune::DynamicVector<double> l2(nCorners2); for (size_t i = 0; i < nCorners2; i++) l2[i] = c1 * s2.vertices[i]; @@ -180,7 +176,6 @@ double distance(const ConvexPolyhedron<Coordinate> &s1, c1 = s1.barycentricToGlobal(sol1); double const newDistance = (c2 - c1).two_norm(); - assert(newDistance - oldDistance <= 1e-12); // debugging if (oldDistance - newDistance <= valueCorrectionTolerance) { s1.sanityCheck(sol1, barycentricTolerance); s2.sanityCheck(sol2, barycentricTolerance); @@ -189,7 +184,7 @@ double distance(const ConvexPolyhedron<Coordinate> &s1, oldDistance = newDistance; } - assert(false); + return oldDistance; } // Point-to-Geometry convenience method @@ -209,7 +204,8 @@ double distance(typename Geometry::GlobalCoordinate const &point, // Polyhedron-to-Geometry convenience method template <class Geometry> double distance(ConvexPolyhedron<typename Geometry::GlobalCoordinate> const &p1, - Geometry const &geo, double valueCorrectionTolerance) { + Geometry const &geo, double valueCorrectionTolerance, + size_t maxIterations = 1000) { using Coordinate = typename Geometry::GlobalCoordinate; ConvexPolyhedron<Coordinate> p2; @@ -217,7 +213,7 @@ double distance(ConvexPolyhedron<typename Geometry::GlobalCoordinate> const &p1, for (size_t i = 0; i < p2.vertices.size(); ++i) p2.vertices[i] = geo.corner(i); - return distance(p2, p1, valueCorrectionTolerance); + return distance(p2, p1, valueCorrectionTolerance, maxIterations); } #endif