aboutsummaryrefslogtreecommitdiff
path: root/ell_grid_solve.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-01-30 12:51:18 +0100
committerAnton Khirnov <anton@khirnov.net>2019-02-02 11:52:00 +0100
commit7dcabe1f8d406b62df4141883e503cabb39b8d45 (patch)
tree0946902915d319caa69ba2e771bcb760a29495cc /ell_grid_solve.c
parentb584bfe20168ac6208154b1eef395b3805b35e77 (diff)
mg2d: print stats properly for exact solves
Diffstat (limited to 'ell_grid_solve.c')
-rw-r--r--ell_grid_solve.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/ell_grid_solve.c b/ell_grid_solve.c
index 1893214..13d1854 100644
--- a/ell_grid_solve.c
+++ b/ell_grid_solve.c
@@ -387,9 +387,13 @@ static void fill_mat_s2(double *mat_row, double **diff_coeffs, double *fd_factor
static int solve_exact(EGSContext *ctx)
{
EGSInternal *priv = ctx->priv;
+ EGSExactContext *ec = ctx->solver_data;
EGSExactInternal *e = &priv->e;
+ int64_t start;
int ret;
+ start = gettime();
+
memset(e->mat, 0, SQR(e->N) * sizeof(*e->mat));
for (ptrdiff_t idx1 = 0; idx1 < ctx->domain_size[1]; idx1++) {
@@ -532,6 +536,10 @@ static int solve_exact(EGSContext *ctx)
}
}
+ ec->time_mat_construct += gettime() - start;
+ ec->count_mat_construct++;
+
+ start = gettime();
ret = LAPACKE_dgesv(LAPACK_ROW_MAJOR, e->N, 1, e->mat, e->N, e->ipiv, e->rhs, 1);
if (ret != 0) {
mg2di_log(&ctx->logger, MG2D_LOG_ERROR,
@@ -539,6 +547,9 @@ static int solve_exact(EGSContext *ctx)
return -EDOM;
}
+ ec->time_lin_solve += gettime() - start;
+ ec->count_lin_solve++;
+
for (size_t idx1 = 0; idx1 < ctx->domain_size[1]; idx1++)
memcpy(ctx->u + idx1 * ctx->u_stride, e->rhs + idx1 * ctx->domain_size[0], ctx->domain_size[0] * sizeof(*e->rhs));
@@ -550,19 +561,30 @@ static int solve_exact(EGSContext *ctx)
int mg2di_egs_solve(EGSContext *ctx)
{
+ int64_t start;
+ int ret;
+
+ start = gettime();
+
switch (ctx->solver_type) {
- case EGS_SOLVER_RELAXATION: return solve_relax_step(ctx);
- case EGS_SOLVER_EXACT: return solve_exact(ctx);
+ case EGS_SOLVER_RELAXATION: ret = solve_relax_step(ctx); break;
+ case EGS_SOLVER_EXACT: ret = solve_exact(ctx); break;
+ default: ret = -EINVAL;
}
- return -EINVAL;
+ ctx->time_total += gettime() - start;
+
+ return ret;
}
int mg2di_egs_init(EGSContext *ctx)
{
EGSInternal *priv = ctx->priv;
+ int64_t start;
int ret;
+ start = gettime();
+
if (ctx->solver_type == EGS_SOLVER_EXACT) {
switch (ctx->fd_stencil) {
case 1: priv->e.fill_mat = fill_mat_s1; break;
@@ -637,6 +659,8 @@ int mg2di_egs_init(EGSContext *ctx)
boundaries_apply(ctx);
residual_calc(ctx);
+ ctx->time_total += gettime() - start;
+
return 0;
}
@@ -727,6 +751,9 @@ EGSContext *mg2di_egs_alloc(enum EGSType type, size_t domain_size[2])
goto fail;
break;
case EGS_SOLVER_EXACT:
+ ctx->solver_data = calloc(1, sizeof(EGSExactContext));
+ if (!ctx->solver_data)
+ goto fail;
break;
default: goto fail;
}