From fb90dd5289b93bf36e9fee14e7e8a0c28a03354d Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 22 Jan 2019 13:15:32 +0100 Subject: mg2d: log the convergence factors after relax/correct --- mg2d.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) (limited to 'mg2d.c') diff --git a/mg2d.c b/mg2d.c index 2fef7f9..81b1b46 100644 --- a/mg2d.c +++ b/mg2d.c @@ -73,6 +73,18 @@ static void log_callback(MG2DLogger *log, int level, const char *fmt, va_list vl ctx->log_callback(ctx, level, fmt, vl); } +static void log_relax_step(MG2DContext *ctx, MG2DLevel *level, const char *step_desc, + double res_old, double res_new) +{ + char prefix[32] = { 0 }; + + for (int i = 0; i < MIN(sizeof(prefix) - 1, level->depth); i++) + prefix[i] = ' '; + + mg2di_log(&ctx->priv->logger, MG2D_LOG_DEBUG, "%s[%d]%s %g->%g (%g)\n", + prefix, level->depth, step_desc, res_old, res_new, res_old / res_new); +} + static void mg_restrict_inject(EllRelaxContext *coarse, double *dst, ptrdiff_t dst_stride, EllRelaxContext *fine, const double *src, ptrdiff_t src_stride) { @@ -241,18 +253,26 @@ static void prolong_solution(MG2DContext *ctx, MG2DLevel *dst, MG2DLevel *src) } } -static int mg_relax_step(MG2DLevel *level) +static int mg_relax_step(MG2DContext *ctx, MG2DLevel *level, const char *step_desc) { + double res_old; int64_t start; int ret; + res_old = level->solver->residual_max; + start = gettime(); ret = mg2di_ell_relax_step(level->solver); level->time_relax += gettime() - start; - return ret; + if (ret < 0) + return ret; + + log_relax_step(ctx, level, step_desc, res_old, level->solver->residual_max); + + return 0; } static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) @@ -278,7 +298,7 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) if (!level->child) { for (int j = 0; j < 16; j++) { - ret = mg_relax_step(level); + ret = mg_relax_step(ctx, level, "coarse-step"); if (ret < 0) return ret; } @@ -288,11 +308,12 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) } for (int i = 0; i < ctx->nb_cycles; i++) { + double res_prev; int64_t start; /* pre-restrict relaxation */ for (int j = 0; j < ctx->nb_relax_pre; j++) { - ret = mg_relax_step(level); + ret = mg_relax_step(ctx, level, "pre-relax"); if (ret < 0) return ret; } @@ -320,15 +341,18 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) level->time_correct += gettime() - start; /* re-init the current-level solver (re-calc the residual) */ + res_prev = level->solver->residual_max; start = gettime(); ret = mg2di_ell_relax_init(level->solver); if (ret < 0) return ret; level->time_reinit += gettime() - start; + log_relax_step(ctx, level, "correct", res_prev, level->solver->residual_max); + /* post-correct relaxation */ for (int j = 0; j < ctx->nb_relax_post; j++) { - ret = mg_relax_step(level); + ret = mg_relax_step(ctx, level, "post-relax"); if (ret < 0) return ret; } -- cgit v1.2.3