summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ell_grid_solve.c2
-rw-r--r--mg2d.c5
2 files changed, 5 insertions, 2 deletions
diff --git a/ell_grid_solve.c b/ell_grid_solve.c
index 13d9072..f8512f6 100644
--- a/ell_grid_solve.c
+++ b/ell_grid_solve.c
@@ -403,7 +403,7 @@ static int exact_arrays_alloc(EGSContext *ctx)
goto fail;
}
- ret = mg2di_bicgstab_context_alloc(&e->bicgstab, e->N, 64);
+ ret = mg2di_bicgstab_context_alloc(&e->bicgstab, e->N, 4);
if (ret < 0)
goto fail;
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);