12 for(d = 0 ; d < Ndim; d ++) {
19 +
sizeof(
double) * Ndim * 3
20 +
sizeof(ptrdiff_t) * Ndim
21 +
sizeof(
int) * Ndim);
31 for(d = Ndim - 1 ; d >= 0; d --) {
32 obj->
dims[d] = dims[d];
39 for(d = 0; d < obj->
Ndim; d++) {
53 obj->
Step[d] = (Max - Min) / (obj->
dims[d] - 1);
57 static ptrdiff_t
linearindex(ptrdiff_t * strides,
int * xi,
int Ndim) {
60 for(d = 0; d < Ndim; d++) {
61 rt += strides[d] * xi[d] ;
75 status = (
int *) alloca(
sizeof(
int) * obj->
Ndim);
77 int * xi = (
int *) alloca(
sizeof(
int) * obj->
Ndim);
78 double * f = (
double *) alloca(
sizeof(
double) * obj->
Ndim);
80 for(d = 0; d < obj->
Ndim; d++) {
81 double xd = (x[d] - obj->
Min[d]) / obj->
Step[d];
82 if (x[d] < obj->
Min[d]) {
87 if (x[d] > obj->
Max[d]) {
89 xi[d] = obj->
dims[d] - 1;
104 for(i = 0; i < obj->
fsize; i ++) {
108 for(d = 0; d < obj->
Ndim; d++ ) {
109 int foffset = (i & (1 << d))?1:0;
110 if(f[d] == 0 && foffset == 1) {
123 filter *= foffset?f[d] : (1 - f[d]);
124 l += foffset * obj->
strides[d];
127 ret += ydata[l] * filter;
135 int * xi = (
int *) alloca(
sizeof(
int) * obj->
Ndim);
136 int * xi1 = (
int *) alloca(
sizeof(
int) * obj->
Ndim);
137 double * f = (
double *) alloca(
sizeof(
double) * obj->
Ndim);
140 for(d = 0; d < obj->
Ndim; d++) {
141 double xd = (x[d] - obj->
Min[d]) / obj->
Step[d];
151 for(i = 0; i < obj->
fsize; i ++) {
153 for(d = 0; d < obj->
Ndim; d++ ) {
154 int foffset = (i & (1 << d))?1:0;
155 xi1[d] = xi[d] + foffset;
156 while(xi1[d] >= obj->
dims[d]) xi1[d] -= obj->
dims[d];
157 while(xi1[d] < 0 ) xi1[d] += obj->
dims[d];
164 filter *= foffset?f[d] : (1 - f[d]);
167 ret += ydata[l] * filter;
double interp_eval(Interp *obj, double *x, double *ydata, int *status)
void interp_init(Interp *obj, int Ndim, int64_t *dims)
void interp_destroy(Interp *obj)
static ptrdiff_t linearindex(ptrdiff_t *strides, int *xi, int Ndim)
void interp_init_dim(Interp *obj, int d, double Min, double Max)
double interp_eval_periodic(Interp *obj, double *x, double *ydata)
#define mymalloc(name, size)