From f2c086ccaf78f4df274ac5784771c942a477926f Mon Sep 17 00:00:00 2001 From: regislebrun Date: Sun, 10 Dec 2023 16:30:18 +0100 Subject: [PATCH] Cosmetic Slightly simplified LevelSetMesher logic --- lib/src/Base/Geom/LevelSetMesher.cxx | 37 ++++++++-------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/lib/src/Base/Geom/LevelSetMesher.cxx b/lib/src/Base/Geom/LevelSetMesher.cxx index 35af9a96f9..2767dd41a3 100644 --- a/lib/src/Base/Geom/LevelSetMesher.cxx +++ b/lib/src/Base/Geom/LevelSetMesher.cxx @@ -242,47 +242,30 @@ Mesh LevelSetMesher::build(const LevelSet & levelSet, OptimizationAlgorithm solver(solver_); solver.setStartingPoint(delta); solver.setProblem(problem); - OptimizationResult result; - // Here we have to catch exceptions raised by the gradient + // Here we have to catch exceptions raised by the algorithm (may be due to e.g the gradient) try { solver.run(); - result = solver.getResult(); + movedVertices.add(currentVertex + solver.getResult().getOptimalPoint()); } catch(...) { - LOGDEBUG(OSS() << "Problem to project point=" << currentVertex << " with solver=" << solver_ << ", using finite differences for gradient"); - // Here we may have to fix the gradient eg in the case of analytical functions, when Ev3 does not handle the expression. - const Scalar epsilon = ResourceMap::GetAsScalar("CenteredFiniteDifferenceGradient-DefaultEpsilon"); - levelFunction.setGradient(CenteredFiniteDifferenceGradient((localVertices.getMin() - localVertices.getMax()) * epsilon + Point(dimension, epsilon), levelFunction.getEvaluation()).clone()); - problem.setLevelFunction(levelFunction); - solver.setProblem(problem); - // Try with the new gradients + // There is a problem with this vertex. Try a gradient-free solver + Cobyla cobyla(solver.getProblem()); + cobyla.setStartingPoint(delta); + LOGDEBUG(OSS() << "Problem to project point=" << currentVertex << " with solver=" << solver << " and finite differences for gradient, switching to solver=" << cobyla); try - { - solver.run(); - result = solver.getResult(); - movedVertices.add(currentVertex + result.getOptimalPoint()); - } - catch(...) - { - // There is definitely a problem with this vertex. Try a gradient-free solver - Cobyla cobyla(solver.getProblem()); - cobyla.setStartingPoint(solver.getStartingPoint()); - LOGDEBUG(OSS() << "Problem to project point=" << currentVertex << " with solver=" << solver << " and finite differences for gradient, switching to solver=" << cobyla); - try { cobyla.run(); - result = cobyla.getResult(); - movedVertices.add(currentVertex + result.getOptimalPoint()); + movedVertices.add(currentVertex + cobyla.getResult().getOptimalPoint()); } - catch(...) + catch(...) { LOGDEBUG(OSS() << "Problem to project point=" << currentVertex << " with solver=" << cobyla << ", use basic linear interpolation"); movedVertices.add(currentVertex + delta); } - } // Even finite differences gradient failed? - } // Gradient failed ? + } // User-defined solver failed ? + // Restore the use of solve-the-equation if we used minimization due to a difficult vertex minimizeDistance = !solveEquation; } // minimizeDistance } // project