diff options
author | Anton Khirnov <anton@khirnov.net> | 2019-05-16 14:30:42 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2019-05-16 14:30:42 +0200 |
commit | df712e719734d70a04828c317881942e74e97bf3 (patch) | |
tree | 88aa62e83df763240fcbfa7c80dc2e37cbf10030 | |
parent | 00ea9b57dbb25a0fef058a828dbfd3d3cf45788e (diff) |
tmpinterp_wip
-rw-r--r-- | transfer.c | 23 |
1 files changed, 18 insertions, 5 deletions
@@ -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; } |