diff options
author | Anton Khirnov <anton@khirnov.net> | 2018-04-09 10:13:44 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2018-04-09 10:13:44 +0200 |
commit | 975abbee31abe7f8299c3cc4583f76214f699671 (patch) | |
tree | 82888c4e615803ef1ff6da8f1590274c79998078 /nlsolve.c | |
parent | 90381f1d94c437e58d233edeb43d0a1bb5c923f8 (diff) |
nlsolve: faster abort on divergence
Diffstat (limited to 'nlsolve.c')
-rw-r--r-- | nlsolve.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -100,7 +100,7 @@ struct NLSolvePriv { }; int tdi_nlsolve_solve(NLSolveContext *ctx, NLEqCallback eq_eval, - NLEqJacobianCallback eq_jac_eval, void *opaque, double *coeffs) + NLEqJacobianCallback eq_jac_eval, void *opaque, double *coeffs, int fast_abort) { NLSolvePriv *s = ctx->priv; int64_t start, totaltime_start; @@ -209,6 +209,10 @@ int tdi_nlsolve_solve(NLSolveContext *ctx, NLEqCallback eq_eval, it, s->delta[max_idx], ctx->atol); ret = 0; goto finish; + } else if ((fast_abort && fabs(s->delta[max_idx]) > 1e6) || + s->delta[max_idx] > 1e18) { + tdi_log(&ctx->logger, 2, "max(delta) %g, aborting\n", s->delta[max_idx]); + return -EDOM; } cblas_daxpy(s->solve_order, 1.0, s->delta, 1, coeffs, 1); |