summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-01-22 13:15:32 +0100
committerAnton Khirnov <anton@khirnov.net>2019-01-22 13:15:32 +0100
commitfb90dd5289b93bf36e9fee14e7e8a0c28a03354d (patch)
treef95b9ac728c3ac5199fe6ebd031aa2e33ccb8cac
parentbe276b488a1dc9c703471382799b16acdba07442 (diff)
mg2d: log the convergence factors after relax/correct
-rw-r--r--mg2d.c34
1 files changed, 29 insertions, 5 deletions
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;
}