From c2ead14543d11a532a8ac564119a7a10160fdc41 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 22 Mar 2019 18:50:55 +0100 Subject: ell_grid_solve: switch to ndarray in its external API --- mg2d.c | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) (limited to 'mg2d.c') diff --git a/mg2d.c b/mg2d.c index 9949eee..a9b98a3 100644 --- a/mg2d.c +++ b/mg2d.c @@ -33,6 +33,7 @@ #include "mg2d_boundary.h" #include "mg2d_boundary_internal.h" #include "mg2d_constants.h" +#include "ndarray.h" typedef struct MG2DLevel { unsigned int depth; @@ -342,9 +343,9 @@ static int coarse_correct_task(void *arg, unsigned int job_idx, unsigned int thr MG2DLevel *level = arg; for (size_t idx0 = 0; idx0 < level->solver->domain_size[0]; idx0++) { - const ptrdiff_t idx_dst = job_idx * level->solver->u_stride + idx0; + const ptrdiff_t idx_dst = job_idx * level->solver->u->stride[0] + idx0; const ptrdiff_t idx_src = job_idx * level->prolong_tmp_stride + idx0; - level->solver->u[idx_dst] -= level->prolong_tmp[idx_src]; + level->solver->u->data[idx_dst] -= level->prolong_tmp[idx_src]; } return 0; } @@ -354,17 +355,17 @@ static void restrict_residual(MG2DContext *ctx, MG2DLevel *dst, MG2DLevel *src) EGSContext *s_src = src->solver; EGSContext *s_dst = dst->solver; if (s_src->domain_size[0] == 2 * (s_dst->domain_size[0] - 1) + 1) { - mg_restrict_fw(s_dst, s_dst->rhs, s_dst->rhs_stride, - s_src, s_src->residual, s_src->residual_stride); + mg_restrict_fw(s_dst, s_dst->rhs->data, s_dst->rhs->stride[0], + s_src, s_src->residual->data, s_src->residual->stride[0]); } else { if (ctx->fd_stencil == 1) mg_interp_bilinear(ctx->priv->tp, - s_dst, s_dst->rhs, s_dst->rhs_stride, - s_src, s_src->residual, s_src->residual_stride); + s_dst, s_dst->rhs->data, s_dst->rhs->stride[0], + s_src, s_src->residual->data, s_src->residual->stride[0]); else mg_interp_bicubic(ctx->priv->tp, - s_dst, s_dst->rhs, s_dst->rhs_stride, - s_src, s_src->residual, s_src->residual_stride); + s_dst, s_dst->rhs->data, s_dst->rhs->stride[0], + s_src, s_src->residual->data, s_src->residual->stride[0]); } } @@ -375,19 +376,19 @@ static void prolong_solution(MG2DContext *ctx, MG2DLevel *dst, MG2DLevel *src) if (s_dst->domain_size[0] == 2 * (s_src->domain_size[0] - 1) + 1) { if (ctx->fd_stencil == 1) mg_prolongate(s_dst, dst->prolong_tmp, dst->prolong_tmp_stride, - s_src, s_src->u, s_src->u_stride); + s_src, s_src->u->data, s_src->u->stride[0]); else mg_prolongate_bicubic(s_dst, dst->prolong_tmp, dst->prolong_tmp_stride, - s_src, s_src->u, s_src->u_stride); + s_src, s_src->u->data, s_src->u->stride[0]); } else { if (ctx->fd_stencil == 1) mg_interp_bilinear(ctx->priv->tp, s_dst, dst->prolong_tmp, dst->prolong_tmp_stride, - s_src, s_src->u, s_src->u_stride); + s_src, s_src->u->data, s_src->u->stride[0]); else mg_interp_bicubic(ctx->priv->tp, s_dst, dst->prolong_tmp, dst->prolong_tmp_stride, - s_src, s_src->u, s_src->u_stride); + s_src, s_src->u->data, s_src->u->stride[0]); } } @@ -421,7 +422,7 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) /* on the refined levels, use zero as the initial guess for the * solution (correction for the upper level) */ if (level->depth > 0) { - memset(level->solver->u, 0, sizeof(*level->solver->u) * level->solver->u_stride * + memset(level->solver->u->data, 0, sizeof(*level->solver->u->data) * level->solver->u->stride[0] * level->solver->domain_size[1]); /* re-init the current-level solver (re-calc the residual) */ @@ -539,14 +540,14 @@ static void restrict_diff_coeffs(MG2DContext *ctx, MG2DLevel *dst, MG2DLevel *sr EGSContext *s_dst = dst->solver; if (s_src->domain_size[0] == 2 * (s_dst->domain_size[0] - 1) + 1) { for (int i = 0; i < ARRAY_ELEMS(s_src->diff_coeffs); i++) { - mg_restrict_inject(s_dst, s_dst->diff_coeffs[i], s_dst->diff_coeffs_stride, - s_src, s_src->diff_coeffs[i], s_src->diff_coeffs_stride); + mg_restrict_inject(s_dst, s_dst->diff_coeffs[i]->data, s_dst->diff_coeffs[i]->stride[0], + s_src, s_src->diff_coeffs[i]->data, s_src->diff_coeffs[i]->stride[0]); } } else { for (int i = 0; i < ARRAY_ELEMS(s_src->diff_coeffs); i++) { mg_interp_bilinear(ctx->priv->tp, - s_dst, s_dst->diff_coeffs[i], s_dst->diff_coeffs_stride, - s_src, s_src->diff_coeffs[i], s_src->diff_coeffs_stride); + s_dst, s_dst->diff_coeffs[i]->data, s_dst->diff_coeffs[i]->stride[0], + s_src, s_src->diff_coeffs[i]->data, s_src->diff_coeffs[i]->stride[0]); } } } @@ -580,10 +581,10 @@ static int mg_levels_init(MG2DContext *ctx) cur = priv->root; prev = NULL; - array_copy(cur->solver->u, cur->solver->u_stride, ctx->u, ctx->u_stride, ctx->domain_size, ctx->domain_size); - array_copy(cur->solver->rhs, cur->solver->rhs_stride, ctx->rhs, ctx->rhs_stride, ctx->domain_size, ctx->domain_size); + array_copy(cur->solver->u->data, cur->solver->u->stride[0], ctx->u, ctx->u_stride, ctx->domain_size, ctx->domain_size); + array_copy(cur->solver->rhs->data, cur->solver->rhs->stride[0], ctx->rhs, ctx->rhs_stride, ctx->domain_size, ctx->domain_size); for (int i = 0; i < ARRAY_ELEMS(ctx->diff_coeffs); i++) { - array_copy(cur->solver->diff_coeffs[i], cur->solver->diff_coeffs_stride, + array_copy(cur->solver->diff_coeffs[i]->data, cur->solver->diff_coeffs[i]->stride[0], ctx->diff_coeffs[i], ctx->diff_coeffs_stride, ctx->domain_size, ctx->domain_size); } @@ -709,7 +710,7 @@ int mg2d_solve(MG2DContext *ctx) mg2di_log(&priv->logger, MG2D_LOG_INFO, "converged on iteration %d, residual %g\n", i, res_cur); - array_copy(ctx->u, ctx->u_stride, s_root->u, s_root->u_stride, ctx->domain_size, ctx->domain_size); + array_copy(ctx->u, ctx->u_stride, s_root->u->data, s_root->u->stride[0], ctx->domain_size, ctx->domain_size); priv->time_solve += gettime() - time_start; priv->count_solve++; -- cgit v1.2.3