fix: use previous iteration dxNorm in convergence check

isConvergedToNumericalLimit() compared dxNorms->at(iterNo) to itself
instead of comparing current vs previous iteration. This prevented
the solver from detecting convergence improvement, causing it to
exhaust its iteration limit on assemblies with many constraints.

Fix: read dxNorms->at(iterNo - 1) for the previous iteration's norm.
This commit is contained in:
forbes
2026-02-01 21:10:12 -06:00
parent 30e9b64e8b
commit e32c9cd793

View File

@@ -112,7 +112,7 @@ bool NewtonRaphson::isConvergedToNumericalLimit()
size_t nDivergenceMax = 3;
auto dxNormIterNo = dxNorms->at(iterNo);
if (iterNo > 0) {
auto dxNormIterNoOld = dxNorms->at(iterNo);
auto dxNormIterNoOld = dxNorms->at(iterNo - 1);
auto farTooLargeError = dxNormIterNo > tooLargeTol;
auto worthIterating = dxNormIterNo > (smallEnoughTol * pow(10.0, (iterNo / iterMax) * nDecade));
bool stillConverging;