+ 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
This commit is contained in:
logari81 2011-10-21 10:52:11 +00:00
parent e1326a9760
commit 9741f86a2b

View File

@ -529,11 +529,14 @@ int System::solve(SubSystem *subsys, bool isFine)
double convergence = isFine ? XconvergenceFine : XconvergenceRough; double convergence = isFine ? XconvergenceFine : XconvergenceRough;
int maxIterNumber = MaxIterations * xsize; int maxIterNumber = MaxIterations * xsize;
double diverging_lim = 1e6*err + 1e12;
for (int iter=1; iter < maxIterNumber; iter++) { for (int iter=1; iter < maxIterNumber; iter++) {
if (h.norm() <= convergence || err <= smallF) if (h.norm() <= convergence || err <= smallF)
break; break;
if (err > diverging_lim || err != err) // check for diverging and NaN
break;
y = grad; y = grad;
subsys->calcGrad(grad); subsys->calcGrad(grad);
@ -620,6 +623,7 @@ int System::solve(SubSystem *subsysA, SubSystem *subsysB, bool isFine)
double convergence = isFine ? XconvergenceFine : XconvergenceRough; double convergence = isFine ? XconvergenceFine : XconvergenceRough;
int maxIterNumber = MaxIterations * xsize; int maxIterNumber = MaxIterations * xsize;
double diverging_lim = 1e6*subsysA->error() + 1e12;
double mu = 0; double mu = 0;
lambda.setZero(); lambda.setZero();
@ -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; break;
} }