From 86ad823b9ade211bfa9361b61571933aff1c9d24 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 23 Apr 2019 15:36:34 +0200 Subject: egs: merge residual calc and correct when possible Also, merge the reflect boundary condition into residual calc+add. Improves performance due to better locality. --- mg2d.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'mg2d.c') diff --git a/mg2d.c b/mg2d.c index 6639879..59df5c1 100644 --- a/mg2d.c +++ b/mg2d.c @@ -109,7 +109,8 @@ static int coarse_correct_task(void *arg, unsigned int job_idx, unsigned int thr return 0; } -static int mg_relax_step(MG2DContext *ctx, MG2DLevel *level, const char *step_desc) +static int mg_relax_step(MG2DContext *ctx, MG2DLevel *level, const char *step_desc, + int export_res) { double res_old; int ret; @@ -117,7 +118,7 @@ static int mg_relax_step(MG2DContext *ctx, MG2DLevel *level, const char *step_de res_old = level->solver->residual_max; mg2di_timer_start(&level->timer_solve); - ret = mg2di_egs_solve(level->solver); + ret = mg2di_egs_solve(level->solver, export_res); mg2di_timer_stop(&level->timer_solve); if (ret < 0) @@ -153,7 +154,7 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) /* handle coarsest grid */ if (!level->child) { - ret = mg_relax_step(ctx, level, "coarse-step"); + ret = mg_relax_step(ctx, level, "coarse-step", 1); if (ret < 0) return ret; level->count_cycles++; @@ -166,7 +167,7 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) /* pre-restrict relaxation */ for (int j = 0; j < ctx->nb_relax_pre; j++) { - ret = mg_relax_step(ctx, level, "pre-relax"); + ret = mg_relax_step(ctx, level, "pre-relax", j == ctx->nb_relax_pre - 1); if (ret < 0) return ret; } @@ -209,7 +210,7 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) /* post-correct relaxation */ for (int j = 0; j < ctx->nb_relax_post; j++) { - ret = mg_relax_step(ctx, level, "post-relax"); + ret = mg_relax_step(ctx, level, "post-relax", 0); if (ret < 0) return ret; } -- cgit v1.2.3