aboutsummaryrefslogtreecommitdiff
path: root/mg2d.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-03-22 18:50:55 +0100
committerAnton Khirnov <anton@khirnov.net>2019-03-22 20:12:10 +0100
commitc2ead14543d11a532a8ac564119a7a10160fdc41 (patch)
treec6c6da6d323f47896b85acc4cb75e01dc516c9a1 /mg2d.c
parentaa0b903240d5c0ea5b0af8f5dc5aeb0845fd69b7 (diff)
ell_grid_solve: switch to ndarray in its external API
Diffstat (limited to 'mg2d.c')
-rw-r--r--mg2d.c43
1 files changed, 22 insertions, 21 deletions
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++;