From 9741f86a2bdba9460945a0b64360a61c6b7a7d22 Mon Sep 17 00:00:00 2001 From: logari81 Date: Fri, 21 Oct 2011 10:52:11 +0000 Subject: [PATCH] + try to early detect and stop divergent solutions in freegcs (needs testing) git-svn-id: https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk@5045 e8eeb9e2-ec13-0410-a4a9-efa5cf37419d --- src/Mod/Sketcher/App/freegcs/GCS.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Mod/Sketcher/App/freegcs/GCS.cpp b/src/Mod/Sketcher/App/freegcs/GCS.cpp index a2af83bfa..2c387de78 100644 --- a/src/Mod/Sketcher/App/freegcs/GCS.cpp +++ b/src/Mod/Sketcher/App/freegcs/GCS.cpp @@ -442,7 +442,7 @@ void System::initSolution(VEC_pD ¶ms) if (params[i] != reduced_params[i]) reductionmap[params[i]] = reduced_params[i]; } - + int i=0; std::vector clist0, clist1; for (std::vector::const_iterator constr=clist.begin(); @@ -529,12 +529,15 @@ int System::solve(SubSystem *subsys, bool isFine) double convergence = isFine ? XconvergenceFine : XconvergenceRough; int maxIterNumber = MaxIterations * xsize; - + double diverging_lim = 1e6*err + 1e12; + for (int iter=1; iter < maxIterNumber; iter++) { if (h.norm() <= convergence || err <= smallF) break; - + if (err > diverging_lim || err != err) // check for diverging and NaN + break; + y = grad; subsys->calcGrad(grad); y = grad - y; // = grad - gradold @@ -620,6 +623,7 @@ int System::solve(SubSystem *subsysA, SubSystem *subsysB, bool isFine) double convergence = isFine ? XconvergenceFine : XconvergenceRough; int maxIterNumber = MaxIterations * xsize; + double diverging_lim = 1e6*subsysA->error() + 1e12; double mu = 0; lambda.setZero(); @@ -685,7 +689,7 @@ int System::solve(SubSystem *subsysA, SubSystem *subsysB, bool isFine) f = subsysB->error() + mu * resA.lpNorm<1>(); } lambda = lambda0 + alpha * lambdadir; - + } h = x - x0; @@ -707,7 +711,10 @@ int System::solve(SubSystem *subsysA, SubSystem *subsysB, bool isFine) } } - if (h.norm() <= convergence && subsysA->error() <= smallF) + double err = subsysA->error(); + if (h.norm() <= convergence && err <= smallF) + break; + if (err > diverging_lim || err != err) // check for diverging and NaN break; }