aboutsummaryrefslogtreecommitdiff
path: root/mg2d.c
diff options
context:
space:
mode:
Diffstat (limited to 'mg2d.c')
-rw-r--r--mg2d.c54
1 files changed, 35 insertions, 19 deletions
diff --git a/mg2d.c b/mg2d.c
index 95bd1ee..3255ce7 100644
--- a/mg2d.c
+++ b/mg2d.c
@@ -79,6 +79,10 @@ typedef struct MG2DLevel {
struct MG2DLevel *child;
+ MG2DLogger logger;
+ char log_prefix[32];
+ MG2DInternal *priv;
+
/* timings */
int64_t count_cycles;
Timer timer_solve;
@@ -132,16 +136,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_egs_step(MG2DContext *ctx, MG2DLevel *level, const char *step_desc,
- double res_old, double res_new)
+static void log_callback_level(MG2DLogger *log, int level, const char *fmt, va_list vl)
{
- char prefix[32] = { 0 };
-
- for (int i = 0; i < MIN(sizeof(prefix) - 1, level->depth); i++)
- prefix[i] = ' ';
+ MG2DLevel *l = log->opaque;
+ mg2di_log(&l->priv->logger, level, l->log_prefix);
+ mg2di_vlog(&l->priv->logger, level, fmt, vl);
+}
- 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 log_egs_step(MG2DLevel *level, const char *step_desc,
+ double res_old, double res_new)
+{
+ mg2di_log(&level->logger, MG2D_LOG_DEBUG, "%s %g->%g (%g)\n",
+ step_desc, res_old, res_new, res_old / res_new);
}
static int coarse_correct_task(void *arg, unsigned int job_idx, unsigned int thread_idx)
@@ -171,7 +177,7 @@ static int mg_solve(MG2DContext *ctx, MG2DLevel *level, enum EGSType solve_type,
if (ret < 0)
return ret;
- log_egs_step(ctx, level, step_desc, res_old, level->solver->residual_max);
+ log_egs_step(level, step_desc, res_old, level->solver->residual_max);
return 0;
}
@@ -308,7 +314,7 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level, int allow_exact)
level->egs_init_flags |= EGS_INIT_FLAG_SAME_DIFF_COEFFS;
- log_egs_step(ctx, level, "correct", res_prev, level->solver->residual_max);
+ log_egs_step(level, "correct", res_prev, level->solver->residual_max);
}
/* post-correct relaxation */
@@ -325,9 +331,9 @@ finish:
res_new = level->solver->residual_max;
if (!isfinite(res_new) ||
(res_new > 1e2 * ctx->tol && res_old / res_new <= 1e-1)) {
- 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);
+ mg2di_log(&level->logger, MG2D_LOG_ERROR,
+ "The relaxation step has diverged: %g -> %g\n",
+ res_old, res_new);
return MG2D_ERR_DIVERGE;
}
@@ -833,7 +839,7 @@ static int mg_levels_init(MG2DContext *ctx)
}
}
- cur->solver->logger = priv->logger;
+ cur->solver->logger = cur->logger;
cur->solver->cpuflags = priv->cpuflags;
cur->solver->tp = priv->tp;
@@ -1479,7 +1485,7 @@ static int mg_levels_alloc(MG2DContext *ctx)
MG2DInternal *priv = ctx->priv;
MPI_Comm comm_parent;
- MG2DLevel **dst;
+ MG2DLevel **dst, *level;
int ret = 0;
@@ -1519,12 +1525,22 @@ static int mg_levels_alloc(MG2DContext *ctx)
if (priv->local_component >= dg->nb_components)
break;
- *dst = mg_level_alloc(dg, priv->local_component, comm_cur);
- if (!*dst)
+ level = mg_level_alloc(dg, priv->local_component, comm_cur);
+ if (!level)
return -ENOMEM;
- (*dst)->depth = depth;
- dst = &((*dst)->child);
+ level->depth = depth;
+ level->priv = priv;
+ level->logger.opaque = level;
+ level->logger.log = log_callback_level;
+
+ for (int i = 0; i < MIN(level->depth, sizeof(level->log_prefix) - 1); i++)
+ level->log_prefix[i] = ' ';
+ snprintf(level->log_prefix + level->depth, MAX(0, sizeof(level->log_prefix) - level->depth),
+ "[%d]", depth);
+
+ *dst = level;
+ dst = &level->child;
comm_parent = comm_cur;
}