aboutsummaryrefslogtreecommitdiff
path: root/transfer_interp_template.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-06-29 10:23:40 +0200
committerAnton Khirnov <anton@khirnov.net>2019-06-29 11:21:56 +0200
commit60d1383db4d9f646ce5504edc9b2c437836696db (patch)
tree12fc2d690c6add4fa849e97e614bde60ca60372b /transfer_interp_template.c
parent6d9c352ff599201dacff330004a7c6cd54705aaa (diff)
transfer: implement and use 1D interpolation
Stop abusing "2D of y size 1" for this.
Diffstat (limited to 'transfer_interp_template.c')
-rw-r--r--transfer_interp_template.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/transfer_interp_template.c b/transfer_interp_template.c
index e7ff14a..7bfc89e 100644
--- a/transfer_interp_template.c
+++ b/transfer_interp_template.c
@@ -27,9 +27,9 @@
#define FUNC(name) FUNC2(name, CONT, STENCIL)
static void
-FUNC(interp_transfer_line)(double *dst, ptrdiff_t dst_len,
- const double *src, ptrdiff_t src_stride,
- const ptrdiff_t *idx_x, const double *fact_x, const double *fact_y
+FUNC(interp2d_transfer_line)(double *dst, ptrdiff_t dst_len,
+ const double *src, ptrdiff_t src_stride,
+ const ptrdiff_t *idx_x, const double *fact_x, const double *fact_y
#if !CONTIGUOUS
, ptrdiff_t dst_stride0, ptrdiff_t src_stride0
# define SSTRIDE1 src_stride0
@@ -56,6 +56,26 @@ FUNC(interp_transfer_line)(double *dst, ptrdiff_t dst_len,
}
}
+static void
+FUNC(interp1d_transfer_line)(double *dst, ptrdiff_t dst_len,
+ const double *src, const ptrdiff_t *idx_x, const double *fact_x
+#if !CONTIGUOUS
+ , ptrdiff_t dst_stride0, ptrdiff_t src_stride0
+#endif
+ )
+{
+ for (size_t x = 0; x < dst_len; x++) {
+ const double *src_data = src + SSTRIDE1 * idx_x[x];
+
+ double val = 0.0;
+
+ for (ptrdiff_t idx = 0; idx < STENCIL; idx++)
+ val += src_data[idx * SSTRIDE1] * fact_x[STENCIL * x + idx];
+
+ dst[x * DSTRIDE1] = val;
+ }
+}
+
#undef SSTRIDE1
#undef DSTRIDE1
#undef CONT