summaryrefslogtreecommitdiff
path: root/mg2d.c
diff options
context:
space:
mode:
Diffstat (limited to 'mg2d.c')
-rw-r--r--mg2d.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/mg2d.c b/mg2d.c
index 5f2ce22..7cdf7bc 100644
--- a/mg2d.c
+++ b/mg2d.c
@@ -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);