+ 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:
parent
e1326a9760
commit
9741f86a2b
|
@ -442,7 +442,7 @@ void System::initSolution(VEC_pD ¶ms)
|
||||||
if (params[i] != reduced_params[i])
|
if (params[i] != reduced_params[i])
|
||||||
reductionmap[params[i]] = reduced_params[i];
|
reductionmap[params[i]] = reduced_params[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
int i=0;
|
int i=0;
|
||||||
std::vector<Constraint *> clist0, clist1;
|
std::vector<Constraint *> clist0, clist1;
|
||||||
for (std::vector<Constraint *>::const_iterator constr=clist.begin();
|
for (std::vector<Constraint *>::const_iterator constr=clist.begin();
|
||||||
|
@ -529,12 +529,15 @@ 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);
|
||||||
y = grad - y; // = grad - gradold
|
y = grad - y; // = grad - gradold
|
||||||
|
@ -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();
|
||||||
|
@ -685,7 +689,7 @@ int System::solve(SubSystem *subsysA, SubSystem *subsysB, bool isFine)
|
||||||
f = subsysB->error() + mu * resA.lpNorm<1>();
|
f = subsysB->error() + mu * resA.lpNorm<1>();
|
||||||
}
|
}
|
||||||
lambda = lambda0 + alpha * lambdadir;
|
lambda = lambda0 + alpha * lambdadir;
|
||||||
|
|
||||||
}
|
}
|
||||||
h = x - x0;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user