summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-05-16 14:30:42 +0200
committerAnton Khirnov <anton@khirnov.net>2019-05-16 14:30:42 +0200
commitdf712e719734d70a04828c317881942e74e97bf3 (patch)
tree88aa62e83df763240fcbfa7c80dc2e37cbf10030
parent00ea9b57dbb25a0fef058a828dbfd3d3cf45788e (diff)
-rw-r--r--transfer.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/transfer.c b/transfer.c
index 6db1ad2..aa1fd89 100644
--- a/transfer.c
+++ b/transfer.c
@@ -122,23 +122,36 @@ static int transfer_factors_lagrange(GridTransferContext *ctx, unsigned int dim)
return -ENOMEM;
for (ptrdiff_t idx_dst = 0; idx_dst < ctx->dst.size[dim]; idx_dst++) {
- const ptrdiff_t idx_src = (ptrdiff_t)(scale * (idx_dst + ctx->dst.start[dim])) - ctx->src.start[dim] - (priv->stencil / 2 - 1);
+ double *fact = priv->fact[dim] + priv->stencil * idx_dst;
const double coord_dst = (idx_dst + ctx->dst.start[dim]) * step_dst;
- double *fact = priv->fact[dim] + priv->stencil * idx_dst;
+ unsigned int stencil;
+ ptrdiff_t idx_src;
+
+ stencil = priv->stencil;
+ idx_src = (ptrdiff_t)(scale * (idx_dst + ctx->dst.start[dim])) - ctx->src.start[dim] - (stencil / 2 - 1);
+ //while (idx_src < 0 && stencil >= 4) {
+ // stencil -= 2;
+ // idx_src = (ptrdiff_t)(scale * idx_dst) - (stencil / 2 - 1);
+ //}
+ //if (idx_src < 0) {
+ // mg2di_assert(stencil == 2);
+ //}
- for (int i = 0; i < priv->stencil; i++)
+ for (int i = 0; i < stencil; i++)
coord_src[i] = (idx_src + ctx->src.start[dim] + i) * step_src;
- for (int i = 0; i < priv->stencil; i++) {
+ for (int i = 0; i < stencil; i++) {
fact[i] = 1.0;
- for (int j = 0; j < priv->stencil; j++) {
+ for (int j = 0; j < stencil; j++) {
if (i == j)
continue;
fact[i] *= (coord_dst - coord_src[j]) / (coord_src[i] - coord_src[j]);
}
}
+ for (int i = stencil; i < priv->stencil; i++)
+ fact[i] = 0.0;
priv->idx[dim][idx_dst] = idx_src;
}