diff options
Diffstat (limited to 'mg2d.c')
-rw-r--r-- | mg2d.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -169,10 +169,13 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level, int allow_exact) /* pre-restrict relaxation */ for (int j = 0; j < ctx->nb_relax_pre; j++) { + res_prev = level->solver->residual_max; ret = mg_solve(ctx, level, solve_type, "pre-relax", j == ctx->nb_relax_pre - 1 && level->child); if (ret < 0) return ret; + if (res_prev / level->solver->residual_max > 1.1) + j--; } if (level->child) { @@ -228,7 +231,7 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level, int allow_exact) finish: res_new = level->solver->residual_max; if (!isfinite(res_new) || - (res_new > 1e2 * DBL_EPSILON && res_old / res_new <= 1e-1)) { + (res_new > 1e2 * DBL_EPSILON && res_old / res_new <= 1e-2)) { mg2di_log(&ctx->priv->logger, MG2D_LOG_ERROR, "The relaxation step at level %d has diverged: %g -> %g\n", level->depth, res_old, res_new); |