180 x -= spline->x_grid.start;
181 y -= spline->y_grid.start;
182 float ux = x*spline->x_grid.delta_inv;
183 float uy = y*spline->y_grid.delta_inv;
184 float ipartx, iparty, tx, ty;
185 tx = modff (ux, &ipartx);
186 ty = modff (uy, &iparty);
187 int ix = (int) ipartx;
188 int iy = (int) iparty;
190 float tpx[4], tpy[4], a[4], b[4], da[4], db[4];
191 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
192 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
193 float*
restrict coefs = spline->coefs;
195 a[0] = (
Af[ 0]*tpx[0] +
Af[ 1]*tpx[1] +
Af[ 2]*tpx[2] +
Af[ 3]*tpx[3]);
196 a[1] = (
Af[ 4]*tpx[0] +
Af[ 5]*tpx[1] +
Af[ 6]*tpx[2] +
Af[ 7]*tpx[3]);
197 a[2] = (
Af[ 8]*tpx[0] +
Af[ 9]*tpx[1] +
Af[10]*tpx[2] +
Af[11]*tpx[3]);
198 a[3] = (
Af[12]*tpx[0] +
Af[13]*tpx[1] +
Af[14]*tpx[2] +
Af[15]*tpx[3]);
199 da[0] = (
dAf[ 1]*tpx[1] +
dAf[ 2]*tpx[2] +
dAf[ 3]*tpx[3]);
200 da[1] = (
dAf[ 5]*tpx[1] +
dAf[ 6]*tpx[2] +
dAf[ 7]*tpx[3]);
201 da[2] = (
dAf[ 9]*tpx[1] +
dAf[10]*tpx[2] +
dAf[11]*tpx[3]);
202 da[3] = (
dAf[13]*tpx[1] +
dAf[14]*tpx[2] +
dAf[15]*tpx[3]);
204 b[0] = (
Af[ 0]*tpy[0] +
Af[ 1]*tpy[1] +
Af[ 2]*tpy[2] +
Af[ 3]*tpy[3]);
205 b[1] = (
Af[ 4]*tpy[0] +
Af[ 5]*tpy[1] +
Af[ 6]*tpy[2] +
Af[ 7]*tpy[3]);
206 b[2] = (
Af[ 8]*tpy[0] +
Af[ 9]*tpy[1] +
Af[10]*tpy[2] +
Af[11]*tpy[3]);
207 b[3] = (
Af[12]*tpy[0] +
Af[13]*tpy[1] +
Af[14]*tpy[2] +
Af[15]*tpy[3]);
208 db[0] = (
dAf[ 1]*tpy[1] +
dAf[ 2]*tpy[2] +
dAf[ 3]*tpy[3]);
209 db[1] = (
dAf[ 5]*tpy[1] +
dAf[ 6]*tpy[2] +
dAf[ 7]*tpy[3]);
210 db[2] = (
dAf[ 9]*tpy[1] +
dAf[10]*tpy[2] +
dAf[11]*tpy[3]);
211 db[3] = (
dAf[13]*tpy[1] +
dAf[14]*tpy[2] +
dAf[15]*tpy[3]);
213 int xs = spline->x_stride;
214#define C(i,j) coefs[(ix+(i))*xs+iy+(j)]
216 (a[0]*(
C(0,0)*b[0]+
C(0,1)*b[1]+
C(0,2)*b[2]+
C(0,3)*b[3])+
217 a[1]*(
C(1,0)*b[0]+
C(1,1)*b[1]+
C(1,2)*b[2]+
C(1,3)*b[3])+
218 a[2]*(
C(2,0)*b[0]+
C(2,1)*b[1]+
C(2,2)*b[2]+
C(2,3)*b[3])+
219 a[3]*(
C(3,0)*b[0]+
C(3,1)*b[1]+
C(3,2)*b[2]+
C(3,3)*b[3]));
220 grad[0] = spline->x_grid.delta_inv *
221 (da[0]*(
C(0,0)*b[0]+
C(0,1)*b[1]+
C(0,2)*b[2]+
C(0,3)*b[3])+
222 da[1]*(
C(1,0)*b[0]+
C(1,1)*b[1]+
C(1,2)*b[2]+
C(1,3)*b[3])+
223 da[2]*(
C(2,0)*b[0]+
C(2,1)*b[1]+
C(2,2)*b[2]+
C(2,3)*b[3])+
224 da[3]*(
C(3,0)*b[0]+
C(3,1)*b[1]+
C(3,2)*b[2]+
C(3,3)*b[3]));
225 grad[1] = spline->y_grid.delta_inv *
226 (a[0]*(
C(0,0)*db[0]+
C(0,1)*db[1]+
C(0,2)*db[2]+
C(0,3)*db[3])+
227 a[1]*(
C(1,0)*db[0]+
C(1,1)*db[1]+
C(1,2)*db[2]+
C(1,3)*db[3])+
228 a[2]*(
C(2,0)*db[0]+
C(2,1)*db[1]+
C(2,2)*db[2]+
C(2,3)*db[3])+
229 a[3]*(
C(3,0)*db[0]+
C(3,1)*db[1]+
C(3,2)*db[2]+
C(3,3)*db[3]));
237 double x,
double y,
float*
restrict val,
240 x -= spline->x_grid.start;
241 y -= spline->y_grid.start;
242 float ux = x*spline->x_grid.delta_inv;
243 float uy = y*spline->y_grid.delta_inv;
244 float ipartx, iparty, tx, ty;
245 tx = modff (ux, &ipartx);
246 ty = modff (uy, &iparty);
247 int ix = (int) ipartx;
248 int iy = (int) iparty;
250 float tpx[4], tpy[4], a[4], b[4], da[4], db[4], d2a[4], d2b[4];
251 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
252 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
253 float*
restrict coefs = spline->coefs;
255 a[0] = (
Af[ 0]*tpx[0] +
Af[ 1]*tpx[1] +
Af[ 2]*tpx[2] +
Af[ 3]*tpx[3]);
256 a[1] = (
Af[ 4]*tpx[0] +
Af[ 5]*tpx[1] +
Af[ 6]*tpx[2] +
Af[ 7]*tpx[3]);
257 a[2] = (
Af[ 8]*tpx[0] +
Af[ 9]*tpx[1] +
Af[10]*tpx[2] +
Af[11]*tpx[3]);
258 a[3] = (
Af[12]*tpx[0] +
Af[13]*tpx[1] +
Af[14]*tpx[2] +
Af[15]*tpx[3]);
259 da[0] = (
dAf[ 1]*tpx[1] +
dAf[ 2]*tpx[2] +
dAf[ 3]*tpx[3]);
260 da[1] = (
dAf[ 5]*tpx[1] +
dAf[ 6]*tpx[2] +
dAf[ 7]*tpx[3]);
261 da[2] = (
dAf[ 9]*tpx[1] +
dAf[10]*tpx[2] +
dAf[11]*tpx[3]);
262 da[3] = (
dAf[13]*tpx[1] +
dAf[14]*tpx[2] +
dAf[15]*tpx[3]);
263 d2a[0] = (
d2Af[ 2]*tpx[2] +
d2Af[ 3]*tpx[3]);
264 d2a[1] = (
d2Af[ 6]*tpx[2] +
d2Af[ 7]*tpx[3]);
265 d2a[2] = (
d2Af[10]*tpx[2] +
d2Af[11]*tpx[3]);
266 d2a[3] = (
d2Af[14]*tpx[2] +
d2Af[15]*tpx[3]);
268 b[0] = (
Af[ 0]*tpy[0] +
Af[ 1]*tpy[1] +
Af[ 2]*tpy[2] +
Af[ 3]*tpy[3]);
269 b[1] = (
Af[ 4]*tpy[0] +
Af[ 5]*tpy[1] +
Af[ 6]*tpy[2] +
Af[ 7]*tpy[3]);
270 b[2] = (
Af[ 8]*tpy[0] +
Af[ 9]*tpy[1] +
Af[10]*tpy[2] +
Af[11]*tpy[3]);
271 b[3] = (
Af[12]*tpy[0] +
Af[13]*tpy[1] +
Af[14]*tpy[2] +
Af[15]*tpy[3]);
272 db[0] = (
dAf[ 1]*tpy[1] +
dAf[ 2]*tpy[2] +
dAf[ 3]*tpy[3]);
273 db[1] = (
dAf[ 5]*tpy[1] +
dAf[ 6]*tpy[2] +
dAf[ 7]*tpy[3]);
274 db[2] = (
dAf[ 9]*tpy[1] +
dAf[10]*tpy[2] +
dAf[11]*tpy[3]);
275 db[3] = (
dAf[13]*tpy[1] +
dAf[14]*tpy[2] +
dAf[15]*tpy[3]);
276 d2b[0] = (
d2Af[ 2]*tpy[2] +
d2Af[ 3]*tpy[3]);
277 d2b[1] = (
d2Af[ 6]*tpy[2] +
d2Af[ 7]*tpy[3]);
278 d2b[2] = (
d2Af[10]*tpy[2] +
d2Af[11]*tpy[3]);
279 d2b[3] = (
d2Af[14]*tpy[2] +
d2Af[15]*tpy[3]);
281 int xs = spline->x_stride;
282#define C(i,j) coefs[(ix+(i))*xs+iy+(j)]
284 (a[0]*(
C(0,0)*b[0]+
C(0,1)*b[1]+
C(0,2)*b[2]+
C(0,3)*b[3])+
285 a[1]*(
C(1,0)*b[0]+
C(1,1)*b[1]+
C(1,2)*b[2]+
C(1,3)*b[3])+
286 a[2]*(
C(2,0)*b[0]+
C(2,1)*b[1]+
C(2,2)*b[2]+
C(2,3)*b[3])+
287 a[3]*(
C(3,0)*b[0]+
C(3,1)*b[1]+
C(3,2)*b[2]+
C(3,3)*b[3]));
288 grad[0] = spline->x_grid.delta_inv *
289 (da[0]*(
C(0,0)*b[0]+
C(0,1)*b[1]+
C(0,2)*b[2]+
C(0,3)*b[3])+
290 da[1]*(
C(1,0)*b[0]+
C(1,1)*b[1]+
C(1,2)*b[2]+
C(1,3)*b[3])+
291 da[2]*(
C(2,0)*b[0]+
C(2,1)*b[1]+
C(2,2)*b[2]+
C(2,3)*b[3])+
292 da[3]*(
C(3,0)*b[0]+
C(3,1)*b[1]+
C(3,2)*b[2]+
C(3,3)*b[3]));
293 grad[1] = spline->y_grid.delta_inv *
294 (a[0]*(
C(0,0)*db[0]+
C(0,1)*db[1]+
C(0,2)*db[2]+
C(0,3)*db[3])+
295 a[1]*(
C(1,0)*db[0]+
C(1,1)*db[1]+
C(1,2)*db[2]+
C(1,3)*db[3])+
296 a[2]*(
C(2,0)*db[0]+
C(2,1)*db[1]+
C(2,2)*db[2]+
C(2,3)*db[3])+
297 a[3]*(
C(3,0)*db[0]+
C(3,1)*db[1]+
C(3,2)*db[2]+
C(3,3)*db[3]));
299 spline->y_grid.delta_inv * spline->y_grid.delta_inv *
300 (a[0]*(
C(0,0)*d2b[0]+
C(0,1)*d2b[1]+
C(0,2)*d2b[2]+
C(0,3)*d2b[3])+
301 a[1]*(
C(1,0)*d2b[0]+
C(1,1)*d2b[1]+
C(1,2)*d2b[2]+
C(1,3)*d2b[3])+
302 a[2]*(
C(2,0)*d2b[0]+
C(2,1)*d2b[1]+
C(2,2)*d2b[2]+
C(2,3)*d2b[3])+
303 a[3]*(
C(3,0)*d2b[0]+
C(3,1)*d2b[1]+
C(3,2)*d2b[2]+
C(3,3)*d2b[3])) +
304 spline->x_grid.delta_inv * spline->x_grid.delta_inv *
305 (d2a[0]*(
C(0,0)*b[0]+
C(0,1)*b[1]+
C(0,2)*b[2]+
C(0,3)*b[3])+
306 d2a[1]*(
C(1,0)*b[0]+
C(1,1)*b[1]+
C(1,2)*b[2]+
C(1,3)*b[3])+
307 d2a[2]*(
C(2,0)*b[0]+
C(2,1)*b[1]+
C(2,2)*b[2]+
C(2,3)*b[3])+
308 d2a[3]*(
C(3,0)*b[0]+
C(3,1)*b[1]+
C(3,2)*b[2]+
C(3,3)*b[3]));
317 double x,
double y,
float*
restrict val,
320 x -= spline->x_grid.start;
321 y -= spline->y_grid.start;
322 float ux = x*spline->x_grid.delta_inv;
323 float uy = y*spline->y_grid.delta_inv;
324 float ipartx, iparty, tx, ty;
325 tx = modff (ux, &ipartx);
326 ty = modff (uy, &iparty);
327 int ix = (int) ipartx;
328 int iy = (int) iparty;
330 float tpx[4], tpy[4], a[4], b[4], da[4], db[4], d2a[4], d2b[4];
331 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
332 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
333 float*
restrict coefs = spline->coefs;
335 a[0] = (
Af[ 0]*tpx[0] +
Af[ 1]*tpx[1] +
Af[ 2]*tpx[2] +
Af[ 3]*tpx[3]);
336 a[1] = (
Af[ 4]*tpx[0] +
Af[ 5]*tpx[1] +
Af[ 6]*tpx[2] +
Af[ 7]*tpx[3]);
337 a[2] = (
Af[ 8]*tpx[0] +
Af[ 9]*tpx[1] +
Af[10]*tpx[2] +
Af[11]*tpx[3]);
338 a[3] = (
Af[12]*tpx[0] +
Af[13]*tpx[1] +
Af[14]*tpx[2] +
Af[15]*tpx[3]);
339 da[0] = (
dAf[ 1]*tpx[1] +
dAf[ 2]*tpx[2] +
dAf[ 3]*tpx[3]);
340 da[1] = (
dAf[ 5]*tpx[1] +
dAf[ 6]*tpx[2] +
dAf[ 7]*tpx[3]);
341 da[2] = (
dAf[ 9]*tpx[1] +
dAf[10]*tpx[2] +
dAf[11]*tpx[3]);
342 da[3] = (
dAf[13]*tpx[1] +
dAf[14]*tpx[2] +
dAf[15]*tpx[3]);
343 d2a[0] = (
d2Af[ 2]*tpx[2] +
d2Af[ 3]*tpx[3]);
344 d2a[1] = (
d2Af[ 6]*tpx[2] +
d2Af[ 7]*tpx[3]);
345 d2a[2] = (
d2Af[10]*tpx[2] +
d2Af[11]*tpx[3]);
346 d2a[3] = (
d2Af[14]*tpx[2] +
d2Af[15]*tpx[3]);
348 b[0] = (
Af[ 0]*tpy[0] +
Af[ 1]*tpy[1] +
Af[ 2]*tpy[2] +
Af[ 3]*tpy[3]);
349 b[1] = (
Af[ 4]*tpy[0] +
Af[ 5]*tpy[1] +
Af[ 6]*tpy[2] +
Af[ 7]*tpy[3]);
350 b[2] = (
Af[ 8]*tpy[0] +
Af[ 9]*tpy[1] +
Af[10]*tpy[2] +
Af[11]*tpy[3]);
351 b[3] = (
Af[12]*tpy[0] +
Af[13]*tpy[1] +
Af[14]*tpy[2] +
Af[15]*tpy[3]);
352 db[0] = (
dAf[ 1]*tpy[1] +
dAf[ 2]*tpy[2] +
dAf[ 3]*tpy[3]);
353 db[1] = (
dAf[ 5]*tpy[1] +
dAf[ 6]*tpy[2] +
dAf[ 7]*tpy[3]);
354 db[2] = (
dAf[ 9]*tpy[1] +
dAf[10]*tpy[2] +
dAf[11]*tpy[3]);
355 db[3] = (
dAf[13]*tpy[1] +
dAf[14]*tpy[2] +
dAf[15]*tpy[3]);
356 d2b[0] = (
d2Af[ 2]*tpy[2] +
d2Af[ 3]*tpy[3]);
357 d2b[1] = (
d2Af[ 6]*tpy[2] +
d2Af[ 7]*tpy[3]);
358 d2b[2] = (
d2Af[10]*tpy[2] +
d2Af[11]*tpy[3]);
359 d2b[3] = (
d2Af[14]*tpy[2] +
d2Af[15]*tpy[3]);
361 int xs = spline->x_stride;
362#define C(i,j) coefs[(ix+(i))*xs+iy+(j)]
364 ( a[0]*(
C(0,0)* b[0]+
C(0,1)* b[1]+
C(0,2)* b[2]+
C(0,3)* b[3])+
365 a[1]*(
C(1,0)* b[0]+
C(1,1)* b[1]+
C(1,2)* b[2]+
C(1,3)* b[3])+
366 a[2]*(
C(2,0)* b[0]+
C(2,1)* b[1]+
C(2,2)* b[2]+
C(2,3)* b[3])+
367 a[3]*(
C(3,0)* b[0]+
C(3,1)* b[1]+
C(3,2)* b[2]+
C(3,3)* b[3]));
368 grad[0] = spline->x_grid.delta_inv *
369 ( da[0]*(
C(0,0)* b[0]+
C(0,1)* b[1]+
C(0,2)* b[2]+
C(0,3)* b[3])+
370 da[1]*(
C(1,0)* b[0]+
C(1,1)* b[1]+
C(1,2)* b[2]+
C(1,3)* b[3])+
371 da[2]*(
C(2,0)* b[0]+
C(2,1)* b[1]+
C(2,2)* b[2]+
C(2,3)* b[3])+
372 da[3]*(
C(3,0)* b[0]+
C(3,1)* b[1]+
C(3,2)* b[2]+
C(3,3)* b[3]));
373 grad[1] = spline->y_grid.delta_inv *
374 ( a[0]*(
C(0,0)* db[0]+
C(0,1)* db[1]+
C(0,2)* db[2]+
C(0,3)* db[3])+
375 a[1]*(
C(1,0)* db[0]+
C(1,1)* db[1]+
C(1,2)* db[2]+
C(1,3)* db[3])+
376 a[2]*(
C(2,0)* db[0]+
C(2,1)* db[1]+
C(2,2)* db[2]+
C(2,3)* db[3])+
377 a[3]*(
C(3,0)* db[0]+
C(3,1)* db[1]+
C(3,2)* db[2]+
C(3,3)* db[3]));
378 hess[0] = spline->x_grid.delta_inv * spline->x_grid.delta_inv *
379 (d2a[0]*(
C(0,0)* b[0]+
C(0,1)* b[1]+
C(0,2)* b[2]+
C(0,3)* b[3])+
380 d2a[1]*(
C(1,0)* b[0]+
C(1,1)* b[1]+
C(1,2)* b[2]+
C(1,3)* b[3])+
381 d2a[2]*(
C(2,0)* b[0]+
C(2,1)* b[1]+
C(2,2)* b[2]+
C(2,3)* b[3])+
382 d2a[3]*(
C(3,0)* b[0]+
C(3,1)* b[1]+
C(3,2)* b[2]+
C(3,3)* b[3]));
383 hess[1] = spline->x_grid.delta_inv * spline->y_grid.delta_inv *
384 ( da[0]*(
C(0,0)* db[0]+
C(0,1)* db[1]+
C(0,2)* db[2]+
C(0,3)* db[3])+
385 da[1]*(
C(1,0)* db[0]+
C(1,1)* db[1]+
C(1,2)* db[2]+
C(1,3)* db[3])+
386 da[2]*(
C(2,0)* db[0]+
C(2,1)* db[1]+
C(2,2)* db[2]+
C(2,3)* db[3])+
387 da[3]*(
C(3,0)* db[0]+
C(3,1)* db[1]+
C(3,2)* db[2]+
C(3,3)* db[3]));
388 hess[3] = spline->y_grid.delta_inv * spline->y_grid.delta_inv *
389 ( a[0]*(
C(0,0)*d2b[0]+
C(0,1)*d2b[1]+
C(0,2)*d2b[2]+
C(0,3)*d2b[3])+
390 a[1]*(
C(1,0)*d2b[0]+
C(1,1)*d2b[1]+
C(1,2)*d2b[2]+
C(1,3)*d2b[3])+
391 a[2]*(
C(2,0)*d2b[0]+
C(2,1)*d2b[1]+
C(2,2)*d2b[2]+
C(2,3)*d2b[3])+
392 a[3]*(
C(3,0)*d2b[0]+
C(3,1)*d2b[1]+
C(3,2)*d2b[2]+
C(3,3)*d2b[3]));
407 double x,
double y,
double z,
410 x -= spline->x_grid.start;
411 y -= spline->y_grid.start;
412 z -= spline->z_grid.start;
413 float ux = x*spline->x_grid.delta_inv;
414 float uy = y*spline->y_grid.delta_inv;
415 float uz = z*spline->z_grid.delta_inv;
416 float ipartx, iparty, ipartz, tx, ty, tz;
417 tx = modff (ux, &ipartx);
int ix = (int) ipartx;
418 ty = modff (uy, &iparty);
int iy = (int) iparty;
419 tz = modff (uz, &ipartz);
int iz = (int) ipartz;
424 float tpx[4], tpy[4], tpz[4], a[4], b[4], c[4];
425 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
426 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
427 tpz[0] = tz*tz*tz; tpz[1] = tz*tz; tpz[2] = tz; tpz[3] = 1.0;
428 float*
restrict coefs = spline->coefs;
430 a[0] = (
Af[ 0]*tpx[0] +
Af[ 1]*tpx[1] +
Af[ 2]*tpx[2] +
Af[ 3]*tpx[3]);
431 a[1] = (
Af[ 4]*tpx[0] +
Af[ 5]*tpx[1] +
Af[ 6]*tpx[2] +
Af[ 7]*tpx[3]);
432 a[2] = (
Af[ 8]*tpx[0] +
Af[ 9]*tpx[1] +
Af[10]*tpx[2] +
Af[11]*tpx[3]);
433 a[3] = (
Af[12]*tpx[0] +
Af[13]*tpx[1] +
Af[14]*tpx[2] +
Af[15]*tpx[3]);
435 b[0] = (
Af[ 0]*tpy[0] +
Af[ 1]*tpy[1] +
Af[ 2]*tpy[2] +
Af[ 3]*tpy[3]);
436 b[1] = (
Af[ 4]*tpy[0] +
Af[ 5]*tpy[1] +
Af[ 6]*tpy[2] +
Af[ 7]*tpy[3]);
437 b[2] = (
Af[ 8]*tpy[0] +
Af[ 9]*tpy[1] +
Af[10]*tpy[2] +
Af[11]*tpy[3]);
438 b[3] = (
Af[12]*tpy[0] +
Af[13]*tpy[1] +
Af[14]*tpy[2] +
Af[15]*tpy[3]);
440 c[0] = (
Af[ 0]*tpz[0] +
Af[ 1]*tpz[1] +
Af[ 2]*tpz[2] +
Af[ 3]*tpz[3]);
441 c[1] = (
Af[ 4]*tpz[0] +
Af[ 5]*tpz[1] +
Af[ 6]*tpz[2] +
Af[ 7]*tpz[3]);
442 c[2] = (
Af[ 8]*tpz[0] +
Af[ 9]*tpz[1] +
Af[10]*tpz[2] +
Af[11]*tpz[3]);
443 c[3] = (
Af[12]*tpz[0] +
Af[13]*tpz[1] +
Af[14]*tpz[2] +
Af[15]*tpz[3]);
445 int xs = spline->x_stride;
446 int ys = spline->y_stride;
447#define P(i,j,k) coefs[(ix+(i))*xs+(iy+(j))*ys+(iz+(k))]
448 *val = (a[0]*(b[0]*(
P(0,0,0)*c[0]+
P(0,0,1)*c[1]+
P(0,0,2)*c[2]+
P(0,0,3)*c[3])+
449 b[1]*(
P(0,1,0)*c[0]+
P(0,1,1)*c[1]+
P(0,1,2)*c[2]+
P(0,1,3)*c[3])+
450 b[2]*(
P(0,2,0)*c[0]+
P(0,2,1)*c[1]+
P(0,2,2)*c[2]+
P(0,2,3)*c[3])+
451 b[3]*(
P(0,3,0)*c[0]+
P(0,3,1)*c[1]+
P(0,3,2)*c[2]+
P(0,3,3)*c[3]))+
452 a[1]*(b[0]*(
P(1,0,0)*c[0]+
P(1,0,1)*c[1]+
P(1,0,2)*c[2]+
P(1,0,3)*c[3])+
453 b[1]*(
P(1,1,0)*c[0]+
P(1,1,1)*c[1]+
P(1,1,2)*c[2]+
P(1,1,3)*c[3])+
454 b[2]*(
P(1,2,0)*c[0]+
P(1,2,1)*c[1]+
P(1,2,2)*c[2]+
P(1,2,3)*c[3])+
455 b[3]*(
P(1,3,0)*c[0]+
P(1,3,1)*c[1]+
P(1,3,2)*c[2]+
P(1,3,3)*c[3]))+
456 a[2]*(b[0]*(
P(2,0,0)*c[0]+
P(2,0,1)*c[1]+
P(2,0,2)*c[2]+
P(2,0,3)*c[3])+
457 b[1]*(
P(2,1,0)*c[0]+
P(2,1,1)*c[1]+
P(2,1,2)*c[2]+
P(2,1,3)*c[3])+
458 b[2]*(
P(2,2,0)*c[0]+
P(2,2,1)*c[1]+
P(2,2,2)*c[2]+
P(2,2,3)*c[3])+
459 b[3]*(
P(2,3,0)*c[0]+
P(2,3,1)*c[1]+
P(2,3,2)*c[2]+
P(2,3,3)*c[3]))+
460 a[3]*(b[0]*(
P(3,0,0)*c[0]+
P(3,0,1)*c[1]+
P(3,0,2)*c[2]+
P(3,0,3)*c[3])+
461 b[1]*(
P(3,1,0)*c[0]+
P(3,1,1)*c[1]+
P(3,1,2)*c[2]+
P(3,1,3)*c[3])+
462 b[2]*(
P(3,2,0)*c[0]+
P(3,2,1)*c[1]+
P(3,2,2)*c[2]+
P(3,2,3)*c[3])+
463 b[3]*(
P(3,3,0)*c[0]+
P(3,3,1)*c[1]+
P(3,3,2)*c[2]+
P(3,3,3)*c[3])));
471 double x,
double y,
double z,
474 x -= spline->x_grid.start;
475 y -= spline->y_grid.start;
476 z -= spline->z_grid.start;
477 float ux = x*spline->x_grid.delta_inv;
478 float uy = y*spline->y_grid.delta_inv;
479 float uz = z*spline->z_grid.delta_inv;
480 float ipartx, iparty, ipartz, tx, ty, tz;
481 tx = modff (ux, &ipartx);
int ix = (int) ipartx;
482 ty = modff (uy, &iparty);
int iy = (int) iparty;
483 tz = modff (uz, &ipartz);
int iz = (int) ipartz;
485 float tpx[4], tpy[4], tpz[4], a[4], b[4], c[4], da[4], db[4], dc[4],
486 cP[16], bcP[4], dbcP[4];
487 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
488 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
489 tpz[0] = tz*tz*tz; tpz[1] = tz*tz; tpz[2] = tz; tpz[3] = 1.0;
490 float*
restrict coefs = spline->coefs;
492 a[0] = (
Af[ 0]*tpx[0] +
Af[ 1]*tpx[1] +
Af[ 2]*tpx[2] +
Af[ 3]*tpx[3]);
493 a[1] = (
Af[ 4]*tpx[0] +
Af[ 5]*tpx[1] +
Af[ 6]*tpx[2] +
Af[ 7]*tpx[3]);
494 a[2] = (
Af[ 8]*tpx[0] +
Af[ 9]*tpx[1] +
Af[10]*tpx[2] +
Af[11]*tpx[3]);
495 a[3] = (
Af[12]*tpx[0] +
Af[13]*tpx[1] +
Af[14]*tpx[2] +
Af[15]*tpx[3]);
496 da[0] = (
dAf[ 1]*tpx[1] +
dAf[ 2]*tpx[2] +
dAf[ 3]*tpx[3]);
497 da[1] = (
dAf[ 5]*tpx[1] +
dAf[ 6]*tpx[2] +
dAf[ 7]*tpx[3]);
498 da[2] = (
dAf[ 9]*tpx[1] +
dAf[10]*tpx[2] +
dAf[11]*tpx[3]);
499 da[3] = (
dAf[13]*tpx[1] +
dAf[14]*tpx[2] +
dAf[15]*tpx[3]);
501 b[0] = (
Af[ 0]*tpy[0] +
Af[ 1]*tpy[1] +
Af[ 2]*tpy[2] +
Af[ 3]*tpy[3]);
502 b[1] = (
Af[ 4]*tpy[0] +
Af[ 5]*tpy[1] +
Af[ 6]*tpy[2] +
Af[ 7]*tpy[3]);
503 b[2] = (
Af[ 8]*tpy[0] +
Af[ 9]*tpy[1] +
Af[10]*tpy[2] +
Af[11]*tpy[3]);
504 b[3] = (
Af[12]*tpy[0] +
Af[13]*tpy[1] +
Af[14]*tpy[2] +
Af[15]*tpy[3]);
505 db[0] = (
dAf[ 1]*tpy[1] +
dAf[ 2]*tpy[2] +
dAf[ 3]*tpy[3]);
506 db[1] = (
dAf[ 5]*tpy[1] +
dAf[ 6]*tpy[2] +
dAf[ 7]*tpy[3]);
507 db[2] = (
dAf[ 9]*tpy[1] +
dAf[10]*tpy[2] +
dAf[11]*tpy[3]);
508 db[3] = (
dAf[13]*tpy[1] +
dAf[14]*tpy[2] +
dAf[15]*tpy[3]);
510 c[0] = (
Af[ 0]*tpz[0] +
Af[ 1]*tpz[1] +
Af[ 2]*tpz[2] +
Af[ 3]*tpz[3]);
511 c[1] = (
Af[ 4]*tpz[0] +
Af[ 5]*tpz[1] +
Af[ 6]*tpz[2] +
Af[ 7]*tpz[3]);
512 c[2] = (
Af[ 8]*tpz[0] +
Af[ 9]*tpz[1] +
Af[10]*tpz[2] +
Af[11]*tpz[3]);
513 c[3] = (
Af[12]*tpz[0] +
Af[13]*tpz[1] +
Af[14]*tpz[2] +
Af[15]*tpz[3]);
514 dc[0] = (
dAf[ 1]*tpz[1] +
dAf[ 2]*tpz[2] +
dAf[ 3]*tpz[3]);
515 dc[1] = (
dAf[ 5]*tpz[1] +
dAf[ 6]*tpz[2] +
dAf[ 7]*tpz[3]);
516 dc[2] = (
dAf[ 9]*tpz[1] +
dAf[10]*tpz[2] +
dAf[11]*tpz[3]);
517 dc[3] = (
dAf[13]*tpz[1] +
dAf[14]*tpz[2] +
dAf[15]*tpz[3]);
519 int xs = spline->x_stride;
520 int ys = spline->y_stride;
521#define P(i,j,k) coefs[(ix+(i))*xs+(iy+(j))*ys+(iz+(k))]
522 cP[ 0] = (
P(0,0,0)*c[0]+
P(0,0,1)*c[1]+
P(0,0,2)*c[2]+
P(0,0,3)*c[3]);
523 cP[ 1] = (
P(0,1,0)*c[0]+
P(0,1,1)*c[1]+
P(0,1,2)*c[2]+
P(0,1,3)*c[3]);
524 cP[ 2] = (
P(0,2,0)*c[0]+
P(0,2,1)*c[1]+
P(0,2,2)*c[2]+
P(0,2,3)*c[3]);
525 cP[ 3] = (
P(0,3,0)*c[0]+
P(0,3,1)*c[1]+
P(0,3,2)*c[2]+
P(0,3,3)*c[3]);
526 cP[ 4] = (
P(1,0,0)*c[0]+
P(1,0,1)*c[1]+
P(1,0,2)*c[2]+
P(1,0,3)*c[3]);
527 cP[ 5] = (
P(1,1,0)*c[0]+
P(1,1,1)*c[1]+
P(1,1,2)*c[2]+
P(1,1,3)*c[3]);
528 cP[ 6] = (
P(1,2,0)*c[0]+
P(1,2,1)*c[1]+
P(1,2,2)*c[2]+
P(1,2,3)*c[3]);
529 cP[ 7] = (
P(1,3,0)*c[0]+
P(1,3,1)*c[1]+
P(1,3,2)*c[2]+
P(1,3,3)*c[3]);
530 cP[ 8] = (
P(2,0,0)*c[0]+
P(2,0,1)*c[1]+
P(2,0,2)*c[2]+
P(2,0,3)*c[3]);
531 cP[ 9] = (
P(2,1,0)*c[0]+
P(2,1,1)*c[1]+
P(2,1,2)*c[2]+
P(2,1,3)*c[3]);
532 cP[10] = (
P(2,2,0)*c[0]+
P(2,2,1)*c[1]+
P(2,2,2)*c[2]+
P(2,2,3)*c[3]);
533 cP[11] = (
P(2,3,0)*c[0]+
P(2,3,1)*c[1]+
P(2,3,2)*c[2]+
P(2,3,3)*c[3]);
534 cP[12] = (
P(3,0,0)*c[0]+
P(3,0,1)*c[1]+
P(3,0,2)*c[2]+
P(3,0,3)*c[3]);
535 cP[13] = (
P(3,1,0)*c[0]+
P(3,1,1)*c[1]+
P(3,1,2)*c[2]+
P(3,1,3)*c[3]);
536 cP[14] = (
P(3,2,0)*c[0]+
P(3,2,1)*c[1]+
P(3,2,2)*c[2]+
P(3,2,3)*c[3]);
537 cP[15] = (
P(3,3,0)*c[0]+
P(3,3,1)*c[1]+
P(3,3,2)*c[2]+
P(3,3,3)*c[3]);
539 bcP[0] = ( b[0]*cP[ 0] + b[1]*cP[ 1] + b[2]*cP[ 2] + b[3]*cP[ 3]);
540 bcP[1] = ( b[0]*cP[ 4] + b[1]*cP[ 5] + b[2]*cP[ 6] + b[3]*cP[ 7]);
541 bcP[2] = ( b[0]*cP[ 8] + b[1]*cP[ 9] + b[2]*cP[10] + b[3]*cP[11]);
542 bcP[3] = ( b[0]*cP[12] + b[1]*cP[13] + b[2]*cP[14] + b[3]*cP[15]);
544 dbcP[0] = ( db[0]*cP[ 0] + db[1]*cP[ 1] + db[2]*cP[ 2] + db[3]*cP[ 3]);
545 dbcP[1] = ( db[0]*cP[ 4] + db[1]*cP[ 5] + db[2]*cP[ 6] + db[3]*cP[ 7]);
546 dbcP[2] = ( db[0]*cP[ 8] + db[1]*cP[ 9] + db[2]*cP[10] + db[3]*cP[11]);
547 dbcP[3] = ( db[0]*cP[12] + db[1]*cP[13] + db[2]*cP[14] + db[3]*cP[15]);
549 *val = ( a[0]*bcP[0] + a[1]*bcP[1] + a[2]*bcP[2] + a[3]*bcP[3]);
550 grad[0] = spline->x_grid.delta_inv *
551 (da[0]*bcP[0] + da[1]*bcP[1] + da[2]*bcP[2] + da[3]*bcP[3]);
552 grad[1] = spline->y_grid.delta_inv *
553 (a[0]*dbcP[0] + a[1]*dbcP[1] + a[2]*dbcP[2] + a[3]*dbcP[3]);
554 grad[2] = spline->z_grid.delta_inv *
555 (a[0]*(b[0]*(
P(0,0,0)*dc[0]+
P(0,0,1)*dc[1]+
P(0,0,2)*dc[2]+
P(0,0,3)*dc[3])+
556 b[1]*(
P(0,1,0)*dc[0]+
P(0,1,1)*dc[1]+
P(0,1,2)*dc[2]+
P(0,1,3)*dc[3])+
557 b[2]*(
P(0,2,0)*dc[0]+
P(0,2,1)*dc[1]+
P(0,2,2)*dc[2]+
P(0,2,3)*dc[3])+
558 b[3]*(
P(0,3,0)*dc[0]+
P(0,3,1)*dc[1]+
P(0,3,2)*dc[2]+
P(0,3,3)*dc[3]))+
559 a[1]*(b[0]*(
P(1,0,0)*dc[0]+
P(1,0,1)*dc[1]+
P(1,0,2)*dc[2]+
P(1,0,3)*dc[3])+
560 b[1]*(
P(1,1,0)*dc[0]+
P(1,1,1)*dc[1]+
P(1,1,2)*dc[2]+
P(1,1,3)*dc[3])+
561 b[2]*(
P(1,2,0)*dc[0]+
P(1,2,1)*dc[1]+
P(1,2,2)*dc[2]+
P(1,2,3)*dc[3])+
562 b[3]*(
P(1,3,0)*dc[0]+
P(1,3,1)*dc[1]+
P(1,3,2)*dc[2]+
P(1,3,3)*dc[3]))+
563 a[2]*(b[0]*(
P(2,0,0)*dc[0]+
P(2,0,1)*dc[1]+
P(2,0,2)*dc[2]+
P(2,0,3)*dc[3])+
564 b[1]*(
P(2,1,0)*dc[0]+
P(2,1,1)*dc[1]+
P(2,1,2)*dc[2]+
P(2,1,3)*dc[3])+
565 b[2]*(
P(2,2,0)*dc[0]+
P(2,2,1)*dc[1]+
P(2,2,2)*dc[2]+
P(2,2,3)*dc[3])+
566 b[3]*(
P(2,3,0)*dc[0]+
P(2,3,1)*dc[1]+
P(2,3,2)*dc[2]+
P(2,3,3)*dc[3]))+
567 a[3]*(b[0]*(
P(3,0,0)*dc[0]+
P(3,0,1)*dc[1]+
P(3,0,2)*dc[2]+
P(3,0,3)*dc[3])+
568 b[1]*(
P(3,1,0)*dc[0]+
P(3,1,1)*dc[1]+
P(3,1,2)*dc[2]+
P(3,1,3)*dc[3])+
569 b[2]*(
P(3,2,0)*dc[0]+
P(3,2,1)*dc[1]+
P(3,2,2)*dc[2]+
P(3,2,3)*dc[3])+
570 b[3]*(
P(3,3,0)*dc[0]+
P(3,3,1)*dc[1]+
P(3,3,2)*dc[2]+
P(3,3,3)*dc[3])));
580 double x,
double y,
double z,
583 x -= spline->x_grid.start;
584 y -= spline->y_grid.start;
585 z -= spline->z_grid.start;
586 float ux = x*spline->x_grid.delta_inv;
587 float uy = y*spline->y_grid.delta_inv;
588 float uz = z*spline->z_grid.delta_inv;
589 float ipartx, iparty, ipartz, tx, ty, tz;
590 tx = modff (ux, &ipartx);
int ix = (int) ipartx;
591 ty = modff (uy, &iparty);
int iy = (int) iparty;
592 tz = modff (uz, &ipartz);
int iz = (int) ipartz;
594 float tpx[4], tpy[4], tpz[4], a[4], b[4], c[4], da[4], db[4], dc[4],
595 d2a[4], d2b[4], d2c[4], cP[16], dcP[16], bcP[4], dbcP[4], d2bcP[4], bdcP[4];
596 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
597 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
598 tpz[0] = tz*tz*tz; tpz[1] = tz*tz; tpz[2] = tz; tpz[3] = 1.0;
599 float*
restrict coefs = spline->coefs;
601 a[0] = (
Af[ 0]*tpx[0] +
Af[ 1]*tpx[1] +
Af[ 2]*tpx[2] +
Af[ 3]*tpx[3]);
602 a[1] = (
Af[ 4]*tpx[0] +
Af[ 5]*tpx[1] +
Af[ 6]*tpx[2] +
Af[ 7]*tpx[3]);
603 a[2] = (
Af[ 8]*tpx[0] +
Af[ 9]*tpx[1] +
Af[10]*tpx[2] +
Af[11]*tpx[3]);
604 a[3] = (
Af[12]*tpx[0] +
Af[13]*tpx[1] +
Af[14]*tpx[2] +
Af[15]*tpx[3]);
605 da[0] = (
dAf[ 1]*tpx[1] +
dAf[ 2]*tpx[2] +
dAf[ 3]*tpx[3]);
606 da[1] = (
dAf[ 5]*tpx[1] +
dAf[ 6]*tpx[2] +
dAf[ 7]*tpx[3]);
607 da[2] = (
dAf[ 9]*tpx[1] +
dAf[10]*tpx[2] +
dAf[11]*tpx[3]);
608 da[3] = (
dAf[13]*tpx[1] +
dAf[14]*tpx[2] +
dAf[15]*tpx[3]);
609 d2a[0] = (
d2Af[ 2]*tpx[2] +
d2Af[ 3]*tpx[3]);
610 d2a[1] = (
d2Af[ 6]*tpx[2] +
d2Af[ 7]*tpx[3]);
611 d2a[2] = (
d2Af[10]*tpx[2] +
d2Af[11]*tpx[3]);
612 d2a[3] = (
d2Af[14]*tpx[2] +
d2Af[15]*tpx[3]);
614 b[0] = (
Af[ 0]*tpy[0] +
Af[ 1]*tpy[1] +
Af[ 2]*tpy[2] +
Af[ 3]*tpy[3]);
615 b[1] = (
Af[ 4]*tpy[0] +
Af[ 5]*tpy[1] +
Af[ 6]*tpy[2] +
Af[ 7]*tpy[3]);
616 b[2] = (
Af[ 8]*tpy[0] +
Af[ 9]*tpy[1] +
Af[10]*tpy[2] +
Af[11]*tpy[3]);
617 b[3] = (
Af[12]*tpy[0] +
Af[13]*tpy[1] +
Af[14]*tpy[2] +
Af[15]*tpy[3]);
618 db[0] = (
dAf[ 1]*tpy[1] +
dAf[ 2]*tpy[2] +
dAf[ 3]*tpy[3]);
619 db[1] = (
dAf[ 5]*tpy[1] +
dAf[ 6]*tpy[2] +
dAf[ 7]*tpy[3]);
620 db[2] = (
dAf[ 9]*tpy[1] +
dAf[10]*tpy[2] +
dAf[11]*tpy[3]);
621 db[3] = (
dAf[13]*tpy[1] +
dAf[14]*tpy[2] +
dAf[15]*tpy[3]);
622 d2b[0] = (
d2Af[ 2]*tpy[2] +
d2Af[ 3]*tpy[3]);
623 d2b[1] = (
d2Af[ 6]*tpy[2] +
d2Af[ 7]*tpy[3]);
624 d2b[2] = (
d2Af[10]*tpy[2] +
d2Af[11]*tpy[3]);
625 d2b[3] = (
d2Af[14]*tpy[2] +
d2Af[15]*tpy[3]);
627 c[0] = (
Af[ 0]*tpz[0] +
Af[ 1]*tpz[1] +
Af[ 2]*tpz[2] +
Af[ 3]*tpz[3]);
628 c[1] = (
Af[ 4]*tpz[0] +
Af[ 5]*tpz[1] +
Af[ 6]*tpz[2] +
Af[ 7]*tpz[3]);
629 c[2] = (
Af[ 8]*tpz[0] +
Af[ 9]*tpz[1] +
Af[10]*tpz[2] +
Af[11]*tpz[3]);
630 c[3] = (
Af[12]*tpz[0] +
Af[13]*tpz[1] +
Af[14]*tpz[2] +
Af[15]*tpz[3]);
631 dc[0] = (
dAf[ 1]*tpz[1] +
dAf[ 2]*tpz[2] +
dAf[ 3]*tpz[3]);
632 dc[1] = (
dAf[ 5]*tpz[1] +
dAf[ 6]*tpz[2] +
dAf[ 7]*tpz[3]);
633 dc[2] = (
dAf[ 9]*tpz[1] +
dAf[10]*tpz[2] +
dAf[11]*tpz[3]);
634 dc[3] = (
dAf[13]*tpz[1] +
dAf[14]*tpz[2] +
dAf[15]*tpz[3]);
635 d2c[0] = (
d2Af[ 2]*tpz[2] +
d2Af[ 3]*tpz[3]);
636 d2c[1] = (
d2Af[ 6]*tpz[2] +
d2Af[ 7]*tpz[3]);
637 d2c[2] = (
d2Af[10]*tpz[2] +
d2Af[11]*tpz[3]);
638 d2c[3] = (
d2Af[14]*tpz[2] +
d2Af[15]*tpz[3]);
640 int xs = spline->x_stride;
641 int ys = spline->y_stride;
642#define P(i,j,k) coefs[(ix+(i))*xs+(iy+(j))*ys+(iz+(k))]
643 cP[ 0] = (
P(0,0,0)*c[0]+
P(0,0,1)*c[1]+
P(0,0,2)*c[2]+
P(0,0,3)*c[3]);
644 cP[ 1] = (
P(0,1,0)*c[0]+
P(0,1,1)*c[1]+
P(0,1,2)*c[2]+
P(0,1,3)*c[3]);
645 cP[ 2] = (
P(0,2,0)*c[0]+
P(0,2,1)*c[1]+
P(0,2,2)*c[2]+
P(0,2,3)*c[3]);
646 cP[ 3] = (
P(0,3,0)*c[0]+
P(0,3,1)*c[1]+
P(0,3,2)*c[2]+
P(0,3,3)*c[3]);
647 cP[ 4] = (
P(1,0,0)*c[0]+
P(1,0,1)*c[1]+
P(1,0,2)*c[2]+
P(1,0,3)*c[3]);
648 cP[ 5] = (
P(1,1,0)*c[0]+
P(1,1,1)*c[1]+
P(1,1,2)*c[2]+
P(1,1,3)*c[3]);
649 cP[ 6] = (
P(1,2,0)*c[0]+
P(1,2,1)*c[1]+
P(1,2,2)*c[2]+
P(1,2,3)*c[3]);
650 cP[ 7] = (
P(1,3,0)*c[0]+
P(1,3,1)*c[1]+
P(1,3,2)*c[2]+
P(1,3,3)*c[3]);
651 cP[ 8] = (
P(2,0,0)*c[0]+
P(2,0,1)*c[1]+
P(2,0,2)*c[2]+
P(2,0,3)*c[3]);
652 cP[ 9] = (
P(2,1,0)*c[0]+
P(2,1,1)*c[1]+
P(2,1,2)*c[2]+
P(2,1,3)*c[3]);
653 cP[10] = (
P(2,2,0)*c[0]+
P(2,2,1)*c[1]+
P(2,2,2)*c[2]+
P(2,2,3)*c[3]);
654 cP[11] = (
P(2,3,0)*c[0]+
P(2,3,1)*c[1]+
P(2,3,2)*c[2]+
P(2,3,3)*c[3]);
655 cP[12] = (
P(3,0,0)*c[0]+
P(3,0,1)*c[1]+
P(3,0,2)*c[2]+
P(3,0,3)*c[3]);
656 cP[13] = (
P(3,1,0)*c[0]+
P(3,1,1)*c[1]+
P(3,1,2)*c[2]+
P(3,1,3)*c[3]);
657 cP[14] = (
P(3,2,0)*c[0]+
P(3,2,1)*c[1]+
P(3,2,2)*c[2]+
P(3,2,3)*c[3]);
658 cP[15] = (
P(3,3,0)*c[0]+
P(3,3,1)*c[1]+
P(3,3,2)*c[2]+
P(3,3,3)*c[3]);
660 dcP[ 0] = (
P(0,0,0)*dc[0]+
P(0,0,1)*dc[1]+
P(0,0,2)*dc[2]+
P(0,0,3)*dc[3]);
661 dcP[ 1] = (
P(0,1,0)*dc[0]+
P(0,1,1)*dc[1]+
P(0,1,2)*dc[2]+
P(0,1,3)*dc[3]);
662 dcP[ 2] = (
P(0,2,0)*dc[0]+
P(0,2,1)*dc[1]+
P(0,2,2)*dc[2]+
P(0,2,3)*dc[3]);
663 dcP[ 3] = (
P(0,3,0)*dc[0]+
P(0,3,1)*dc[1]+
P(0,3,2)*dc[2]+
P(0,3,3)*dc[3]);
664 dcP[ 4] = (
P(1,0,0)*dc[0]+
P(1,0,1)*dc[1]+
P(1,0,2)*dc[2]+
P(1,0,3)*dc[3]);
665 dcP[ 5] = (
P(1,1,0)*dc[0]+
P(1,1,1)*dc[1]+
P(1,1,2)*dc[2]+
P(1,1,3)*dc[3]);
666 dcP[ 6] = (
P(1,2,0)*dc[0]+
P(1,2,1)*dc[1]+
P(1,2,2)*dc[2]+
P(1,2,3)*dc[3]);
667 dcP[ 7] = (
P(1,3,0)*dc[0]+
P(1,3,1)*dc[1]+
P(1,3,2)*dc[2]+
P(1,3,3)*dc[3]);
668 dcP[ 8] = (
P(2,0,0)*dc[0]+
P(2,0,1)*dc[1]+
P(2,0,2)*dc[2]+
P(2,0,3)*dc[3]);
669 dcP[ 9] = (
P(2,1,0)*dc[0]+
P(2,1,1)*dc[1]+
P(2,1,2)*dc[2]+
P(2,1,3)*dc[3]);
670 dcP[10] = (
P(2,2,0)*dc[0]+
P(2,2,1)*dc[1]+
P(2,2,2)*dc[2]+
P(2,2,3)*dc[3]);
671 dcP[11] = (
P(2,3,0)*dc[0]+
P(2,3,1)*dc[1]+
P(2,3,2)*dc[2]+
P(2,3,3)*dc[3]);
672 dcP[12] = (
P(3,0,0)*dc[0]+
P(3,0,1)*dc[1]+
P(3,0,2)*dc[2]+
P(3,0,3)*dc[3]);
673 dcP[13] = (
P(3,1,0)*dc[0]+
P(3,1,1)*dc[1]+
P(3,1,2)*dc[2]+
P(3,1,3)*dc[3]);
674 dcP[14] = (
P(3,2,0)*dc[0]+
P(3,2,1)*dc[1]+
P(3,2,2)*dc[2]+
P(3,2,3)*dc[3]);
675 dcP[15] = (
P(3,3,0)*dc[0]+
P(3,3,1)*dc[1]+
P(3,3,2)*dc[2]+
P(3,3,3)*dc[3]);
677 bcP[0] = ( b[0]*cP[ 0] + b[1]*cP[ 1] + b[2]*cP[ 2] + b[3]*cP[ 3]);
678 bcP[1] = ( b[0]*cP[ 4] + b[1]*cP[ 5] + b[2]*cP[ 6] + b[3]*cP[ 7]);
679 bcP[2] = ( b[0]*cP[ 8] + b[1]*cP[ 9] + b[2]*cP[10] + b[3]*cP[11]);
680 bcP[3] = ( b[0]*cP[12] + b[1]*cP[13] + b[2]*cP[14] + b[3]*cP[15]);
682 dbcP[0] = ( db[0]*cP[ 0] + db[1]*cP[ 1] + db[2]*cP[ 2] + db[3]*cP[ 3]);
683 dbcP[1] = ( db[0]*cP[ 4] + db[1]*cP[ 5] + db[2]*cP[ 6] + db[3]*cP[ 7]);
684 dbcP[2] = ( db[0]*cP[ 8] + db[1]*cP[ 9] + db[2]*cP[10] + db[3]*cP[11]);
685 dbcP[3] = ( db[0]*cP[12] + db[1]*cP[13] + db[2]*cP[14] + db[3]*cP[15]);
687 bdcP[0] = ( b[0]*dcP[ 0] + b[1]*dcP[ 1] + b[2]*dcP[ 2] + b[3]*dcP[ 3]);
688 bdcP[1] = ( b[0]*dcP[ 4] + b[1]*dcP[ 5] + b[2]*dcP[ 6] + b[3]*dcP[ 7]);
689 bdcP[2] = ( b[0]*dcP[ 8] + b[1]*dcP[ 9] + b[2]*dcP[10] + b[3]*dcP[11]);
690 bdcP[3] = ( b[0]*dcP[12] + b[1]*dcP[13] + b[2]*dcP[14] + b[3]*dcP[15]);
692 d2bcP[0] = ( d2b[0]*cP[ 0] + d2b[1]*cP[ 1] + d2b[2]*cP[ 2] + d2b[3]*cP[ 3]);
693 d2bcP[1] = ( d2b[0]*cP[ 4] + d2b[1]*cP[ 5] + d2b[2]*cP[ 6] + d2b[3]*cP[ 7]);
694 d2bcP[2] = ( d2b[0]*cP[ 8] + d2b[1]*cP[ 9] + d2b[2]*cP[10] + d2b[3]*cP[11]);
695 d2bcP[3] = ( d2b[0]*cP[12] + d2b[1]*cP[13] + d2b[2]*cP[14] + d2b[3]*cP[15]);
699 ( a[0]*bcP[0] + a[1]*bcP[1] + a[2]*bcP[2] + a[3]*bcP[3]);
701 grad[0] = spline->x_grid.delta_inv *
702 (da[0]*bcP[0] + da[1]*bcP[1] + da[2]*bcP[2] + da[3]*bcP[3]);
703 grad[1] = spline->y_grid.delta_inv *
704 (a[0]*dbcP[0] + a[1]*dbcP[1] + a[2]*dbcP[2] + a[3]*dbcP[3]);
705 grad[2] = spline->z_grid.delta_inv *
706 (a[0]*bdcP[0] + a[1]*bdcP[1] + a[2]*bdcP[2] + a[3]*bdcP[3]);
709 spline->x_grid.delta_inv * spline->x_grid.delta_inv *
710 (d2a[0]*bcP[0] + d2a[1]*bcP[1] + d2a[2]*bcP[2] + d2a[3]*bcP[3])
712 + spline->y_grid.delta_inv * spline->y_grid.delta_inv *
713 (a[0]*d2bcP[0] + a[1]*d2bcP[1] + a[2]*d2bcP[2] + a[3]*d2bcP[3]) +
715 + spline->z_grid.delta_inv * spline->z_grid.delta_inv *
716 (a[0]*(b[0]*(
P(0,0,0)*d2c[0]+
P(0,0,1)*d2c[1]+
P(0,0,2)*d2c[2]+
P(0,0,3)*d2c[3])+
717 b[1]*(
P(0,1,0)*d2c[0]+
P(0,1,1)*d2c[1]+
P(0,1,2)*d2c[2]+
P(0,1,3)*d2c[3])+
718 b[2]*(
P(0,2,0)*d2c[0]+
P(0,2,1)*d2c[1]+
P(0,2,2)*d2c[2]+
P(0,2,3)*d2c[3])+
719 b[3]*(
P(0,3,0)*d2c[0]+
P(0,3,1)*d2c[1]+
P(0,3,2)*d2c[2]+
P(0,3,3)*d2c[3]))+
720 a[1]*(b[0]*(
P(1,0,0)*d2c[0]+
P(1,0,1)*d2c[1]+
P(1,0,2)*d2c[2]+
P(1,0,3)*d2c[3])+
721 b[1]*(
P(1,1,0)*d2c[0]+
P(1,1,1)*d2c[1]+
P(1,1,2)*d2c[2]+
P(1,1,3)*d2c[3])+
722 b[2]*(
P(1,2,0)*d2c[0]+
P(1,2,1)*d2c[1]+
P(1,2,2)*d2c[2]+
P(1,2,3)*d2c[3])+
723 b[3]*(
P(1,3,0)*d2c[0]+
P(1,3,1)*d2c[1]+
P(1,3,2)*d2c[2]+
P(1,3,3)*d2c[3]))+
724 a[2]*(b[0]*(
P(2,0,0)*d2c[0]+
P(2,0,1)*d2c[1]+
P(2,0,2)*d2c[2]+
P(2,0,3)*d2c[3])+
725 b[1]*(
P(2,1,0)*d2c[0]+
P(2,1,1)*d2c[1]+
P(2,1,2)*d2c[2]+
P(2,1,3)*d2c[3])+
726 b[2]*(
P(2,2,0)*d2c[0]+
P(2,2,1)*d2c[1]+
P(2,2,2)*d2c[2]+
P(2,2,3)*d2c[3])+
727 b[3]*(
P(2,3,0)*d2c[0]+
P(2,3,1)*d2c[1]+
P(2,3,2)*d2c[2]+
P(2,3,3)*d2c[3]))+
728 a[3]*(b[0]*(
P(3,0,0)*d2c[0]+
P(3,0,1)*d2c[1]+
P(3,0,2)*d2c[2]+
P(3,0,3)*d2c[3])+
729 b[1]*(
P(3,1,0)*d2c[0]+
P(3,1,1)*d2c[1]+
P(3,1,2)*d2c[2]+
P(3,1,3)*d2c[3])+
730 b[2]*(
P(3,2,0)*d2c[0]+
P(3,2,1)*d2c[1]+
P(3,2,2)*d2c[2]+
P(3,2,3)*d2c[3])+
731 b[3]*(
P(3,3,0)*d2c[0]+
P(3,3,1)*d2c[1]+
P(3,3,2)*d2c[2]+
P(3,3,3)*d2c[3])));
743 double x,
double y,
double z,
746 x -= spline->x_grid.start;
747 y -= spline->y_grid.start;
748 z -= spline->z_grid.start;
749 float ux = x*spline->x_grid.delta_inv;
750 float uy = y*spline->y_grid.delta_inv;
751 float uz = z*spline->z_grid.delta_inv;
752 ux =
fmin (ux, (
float)((spline->x_grid.num)-1.0e-5));
753 uy =
fmin (uy, (
float)((spline->y_grid.num)-1.0e-5));
754 uz =
fmin (uz, (
float)((spline->z_grid.num)-1.0e-5));
755 float ipartx, iparty, ipartz, tx, ty, tz;
756 tx = modff (ux, &ipartx);
int ix = (int) ipartx;
757 ty = modff (uy, &iparty);
int iy = (int) iparty;
758 tz = modff (uz, &ipartz);
int iz = (int) ipartz;
767 float tpx[4], tpy[4], tpz[4], a[4], b[4], c[4], da[4], db[4], dc[4],
768 d2a[4], d2b[4], d2c[4], cP[16], dcP[16], d2cP[16], bcP[4], dbcP[4],
769 d2bcP[4], dbdcP[4], bd2cP[4], bdcP[4];
770 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
771 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
772 tpz[0] = tz*tz*tz; tpz[1] = tz*tz; tpz[2] = tz; tpz[3] = 1.0;
773 float*
restrict coefs = spline->coefs;
775 a[0] = (
Af[ 0]*tpx[0] +
Af[ 1]*tpx[1] +
Af[ 2]*tpx[2] +
Af[ 3]*tpx[3]);
776 a[1] = (
Af[ 4]*tpx[0] +
Af[ 5]*tpx[1] +
Af[ 6]*tpx[2] +
Af[ 7]*tpx[3]);
777 a[2] = (
Af[ 8]*tpx[0] +
Af[ 9]*tpx[1] +
Af[10]*tpx[2] +
Af[11]*tpx[3]);
778 a[3] = (
Af[12]*tpx[0] +
Af[13]*tpx[1] +
Af[14]*tpx[2] +
Af[15]*tpx[3]);
779 da[0] = (
dAf[ 1]*tpx[1] +
dAf[ 2]*tpx[2] +
dAf[ 3]*tpx[3]);
780 da[1] = (
dAf[ 5]*tpx[1] +
dAf[ 6]*tpx[2] +
dAf[ 7]*tpx[3]);
781 da[2] = (
dAf[ 9]*tpx[1] +
dAf[10]*tpx[2] +
dAf[11]*tpx[3]);
782 da[3] = (
dAf[13]*tpx[1] +
dAf[14]*tpx[2] +
dAf[15]*tpx[3]);
783 d2a[0] = (
d2Af[ 2]*tpx[2] +
d2Af[ 3]*tpx[3]);
784 d2a[1] = (
d2Af[ 6]*tpx[2] +
d2Af[ 7]*tpx[3]);
785 d2a[2] = (
d2Af[10]*tpx[2] +
d2Af[11]*tpx[3]);
786 d2a[3] = (
d2Af[14]*tpx[2] +
d2Af[15]*tpx[3]);
788 b[0] = (
Af[ 0]*tpy[0] +
Af[ 1]*tpy[1] +
Af[ 2]*tpy[2] +
Af[ 3]*tpy[3]);
789 b[1] = (
Af[ 4]*tpy[0] +
Af[ 5]*tpy[1] +
Af[ 6]*tpy[2] +
Af[ 7]*tpy[3]);
790 b[2] = (
Af[ 8]*tpy[0] +
Af[ 9]*tpy[1] +
Af[10]*tpy[2] +
Af[11]*tpy[3]);
791 b[3] = (
Af[12]*tpy[0] +
Af[13]*tpy[1] +
Af[14]*tpy[2] +
Af[15]*tpy[3]);
792 db[0] = (
dAf[ 1]*tpy[1] +
dAf[ 2]*tpy[2] +
dAf[ 3]*tpy[3]);
793 db[1] = (
dAf[ 5]*tpy[1] +
dAf[ 6]*tpy[2] +
dAf[ 7]*tpy[3]);
794 db[2] = (
dAf[ 9]*tpy[1] +
dAf[10]*tpy[2] +
dAf[11]*tpy[3]);
795 db[3] = (
dAf[13]*tpy[1] +
dAf[14]*tpy[2] +
dAf[15]*tpy[3]);
796 d2b[0] = (
d2Af[ 2]*tpy[2] +
d2Af[ 3]*tpy[3]);
797 d2b[1] = (
d2Af[ 6]*tpy[2] +
d2Af[ 7]*tpy[3]);
798 d2b[2] = (
d2Af[10]*tpy[2] +
d2Af[11]*tpy[3]);
799 d2b[3] = (
d2Af[14]*tpy[2] +
d2Af[15]*tpy[3]);
801 c[0] = (
Af[ 0]*tpz[0] +
Af[ 1]*tpz[1] +
Af[ 2]*tpz[2] +
Af[ 3]*tpz[3]);
802 c[1] = (
Af[ 4]*tpz[0] +
Af[ 5]*tpz[1] +
Af[ 6]*tpz[2] +
Af[ 7]*tpz[3]);
803 c[2] = (
Af[ 8]*tpz[0] +
Af[ 9]*tpz[1] +
Af[10]*tpz[2] +
Af[11]*tpz[3]);
804 c[3] = (
Af[12]*tpz[0] +
Af[13]*tpz[1] +
Af[14]*tpz[2] +
Af[15]*tpz[3]);
805 dc[0] = (
dAf[ 1]*tpz[1] +
dAf[ 2]*tpz[2] +
dAf[ 3]*tpz[3]);
806 dc[1] = (
dAf[ 5]*tpz[1] +
dAf[ 6]*tpz[2] +
dAf[ 7]*tpz[3]);
807 dc[2] = (
dAf[ 9]*tpz[1] +
dAf[10]*tpz[2] +
dAf[11]*tpz[3]);
808 dc[3] = (
dAf[13]*tpz[1] +
dAf[14]*tpz[2] +
dAf[15]*tpz[3]);
809 d2c[0] = (
d2Af[ 2]*tpz[2] +
d2Af[ 3]*tpz[3]);
810 d2c[1] = (
d2Af[ 6]*tpz[2] +
d2Af[ 7]*tpz[3]);
811 d2c[2] = (
d2Af[10]*tpz[2] +
d2Af[11]*tpz[3]);
812 d2c[3] = (
d2Af[14]*tpz[2] +
d2Af[15]*tpz[3]);
814 int xs = spline->x_stride;
815 int ys = spline->y_stride;
822#define P(i,j,k) coefs[(ix+(i))*xs+(iy+(j))*ys+(iz+(k))]
823 cP[ 0] = (
P(0,0,0)*c[0]+
P(0,0,1)*c[1]+
P(0,0,2)*c[2]+
P(0,0,3)*c[3]);
824 cP[ 1] = (
P(0,1,0)*c[0]+
P(0,1,1)*c[1]+
P(0,1,2)*c[2]+
P(0,1,3)*c[3]);
825 cP[ 2] = (
P(0,2,0)*c[0]+
P(0,2,1)*c[1]+
P(0,2,2)*c[2]+
P(0,2,3)*c[3]);
826 cP[ 3] = (
P(0,3,0)*c[0]+
P(0,3,1)*c[1]+
P(0,3,2)*c[2]+
P(0,3,3)*c[3]);
827 cP[ 4] = (
P(1,0,0)*c[0]+
P(1,0,1)*c[1]+
P(1,0,2)*c[2]+
P(1,0,3)*c[3]);
828 cP[ 5] = (
P(1,1,0)*c[0]+
P(1,1,1)*c[1]+
P(1,1,2)*c[2]+
P(1,1,3)*c[3]);
829 cP[ 6] = (
P(1,2,0)*c[0]+
P(1,2,1)*c[1]+
P(1,2,2)*c[2]+
P(1,2,3)*c[3]);
830 cP[ 7] = (
P(1,3,0)*c[0]+
P(1,3,1)*c[1]+
P(1,3,2)*c[2]+
P(1,3,3)*c[3]);
831 cP[ 8] = (
P(2,0,0)*c[0]+
P(2,0,1)*c[1]+
P(2,0,2)*c[2]+
P(2,0,3)*c[3]);
832 cP[ 9] = (
P(2,1,0)*c[0]+
P(2,1,1)*c[1]+
P(2,1,2)*c[2]+
P(2,1,3)*c[3]);
833 cP[10] = (
P(2,2,0)*c[0]+
P(2,2,1)*c[1]+
P(2,2,2)*c[2]+
P(2,2,3)*c[3]);
834 cP[11] = (
P(2,3,0)*c[0]+
P(2,3,1)*c[1]+
P(2,3,2)*c[2]+
P(2,3,3)*c[3]);
835 cP[12] = (
P(3,0,0)*c[0]+
P(3,0,1)*c[1]+
P(3,0,2)*c[2]+
P(3,0,3)*c[3]);
836 cP[13] = (
P(3,1,0)*c[0]+
P(3,1,1)*c[1]+
P(3,1,2)*c[2]+
P(3,1,3)*c[3]);
837 cP[14] = (
P(3,2,0)*c[0]+
P(3,2,1)*c[1]+
P(3,2,2)*c[2]+
P(3,2,3)*c[3]);
838 cP[15] = (
P(3,3,0)*c[0]+
P(3,3,1)*c[1]+
P(3,3,2)*c[2]+
P(3,3,3)*c[3]);
840 dcP[ 0] = (
P(0,0,0)*dc[0]+
P(0,0,1)*dc[1]+
P(0,0,2)*dc[2]+
P(0,0,3)*dc[3]);
841 dcP[ 1] = (
P(0,1,0)*dc[0]+
P(0,1,1)*dc[1]+
P(0,1,2)*dc[2]+
P(0,1,3)*dc[3]);
842 dcP[ 2] = (
P(0,2,0)*dc[0]+
P(0,2,1)*dc[1]+
P(0,2,2)*dc[2]+
P(0,2,3)*dc[3]);
843 dcP[ 3] = (
P(0,3,0)*dc[0]+
P(0,3,1)*dc[1]+
P(0,3,2)*dc[2]+
P(0,3,3)*dc[3]);
844 dcP[ 4] = (
P(1,0,0)*dc[0]+
P(1,0,1)*dc[1]+
P(1,0,2)*dc[2]+
P(1,0,3)*dc[3]);
845 dcP[ 5] = (
P(1,1,0)*dc[0]+
P(1,1,1)*dc[1]+
P(1,1,2)*dc[2]+
P(1,1,3)*dc[3]);
846 dcP[ 6] = (
P(1,2,0)*dc[0]+
P(1,2,1)*dc[1]+
P(1,2,2)*dc[2]+
P(1,2,3)*dc[3]);
847 dcP[ 7] = (
P(1,3,0)*dc[0]+
P(1,3,1)*dc[1]+
P(1,3,2)*dc[2]+
P(1,3,3)*dc[3]);
848 dcP[ 8] = (
P(2,0,0)*dc[0]+
P(2,0,1)*dc[1]+
P(2,0,2)*dc[2]+
P(2,0,3)*dc[3]);
849 dcP[ 9] = (
P(2,1,0)*dc[0]+
P(2,1,1)*dc[1]+
P(2,1,2)*dc[2]+
P(2,1,3)*dc[3]);
850 dcP[10] = (
P(2,2,0)*dc[0]+
P(2,2,1)*dc[1]+
P(2,2,2)*dc[2]+
P(2,2,3)*dc[3]);
851 dcP[11] = (
P(2,3,0)*dc[0]+
P(2,3,1)*dc[1]+
P(2,3,2)*dc[2]+
P(2,3,3)*dc[3]);
852 dcP[12] = (
P(3,0,0)*dc[0]+
P(3,0,1)*dc[1]+
P(3,0,2)*dc[2]+
P(3,0,3)*dc[3]);
853 dcP[13] = (
P(3,1,0)*dc[0]+
P(3,1,1)*dc[1]+
P(3,1,2)*dc[2]+
P(3,1,3)*dc[3]);
854 dcP[14] = (
P(3,2,0)*dc[0]+
P(3,2,1)*dc[1]+
P(3,2,2)*dc[2]+
P(3,2,3)*dc[3]);
855 dcP[15] = (
P(3,3,0)*dc[0]+
P(3,3,1)*dc[1]+
P(3,3,2)*dc[2]+
P(3,3,3)*dc[3]);
857 d2cP[ 0] = (
P(0,0,0)*d2c[0]+
P(0,0,1)*d2c[1]+
P(0,0,2)*d2c[2]+
P(0,0,3)*d2c[3]);
858 d2cP[ 1] = (
P(0,1,0)*d2c[0]+
P(0,1,1)*d2c[1]+
P(0,1,2)*d2c[2]+
P(0,1,3)*d2c[3]);
859 d2cP[ 2] = (
P(0,2,0)*d2c[0]+
P(0,2,1)*d2c[1]+
P(0,2,2)*d2c[2]+
P(0,2,3)*d2c[3]);
860 d2cP[ 3] = (
P(0,3,0)*d2c[0]+
P(0,3,1)*d2c[1]+
P(0,3,2)*d2c[2]+
P(0,3,3)*d2c[3]);
861 d2cP[ 4] = (
P(1,0,0)*d2c[0]+
P(1,0,1)*d2c[1]+
P(1,0,2)*d2c[2]+
P(1,0,3)*d2c[3]);
862 d2cP[ 5] = (
P(1,1,0)*d2c[0]+
P(1,1,1)*d2c[1]+
P(1,1,2)*d2c[2]+
P(1,1,3)*d2c[3]);
863 d2cP[ 6] = (
P(1,2,0)*d2c[0]+
P(1,2,1)*d2c[1]+
P(1,2,2)*d2c[2]+
P(1,2,3)*d2c[3]);
864 d2cP[ 7] = (
P(1,3,0)*d2c[0]+
P(1,3,1)*d2c[1]+
P(1,3,2)*d2c[2]+
P(1,3,3)*d2c[3]);
865 d2cP[ 8] = (
P(2,0,0)*d2c[0]+
P(2,0,1)*d2c[1]+
P(2,0,2)*d2c[2]+
P(2,0,3)*d2c[3]);
866 d2cP[ 9] = (
P(2,1,0)*d2c[0]+
P(2,1,1)*d2c[1]+
P(2,1,2)*d2c[2]+
P(2,1,3)*d2c[3]);
867 d2cP[10] = (
P(2,2,0)*d2c[0]+
P(2,2,1)*d2c[1]+
P(2,2,2)*d2c[2]+
P(2,2,3)*d2c[3]);
868 d2cP[11] = (
P(2,3,0)*d2c[0]+
P(2,3,1)*d2c[1]+
P(2,3,2)*d2c[2]+
P(2,3,3)*d2c[3]);
869 d2cP[12] = (
P(3,0,0)*d2c[0]+
P(3,0,1)*d2c[1]+
P(3,0,2)*d2c[2]+
P(3,0,3)*d2c[3]);
870 d2cP[13] = (
P(3,1,0)*d2c[0]+
P(3,1,1)*d2c[1]+
P(3,1,2)*d2c[2]+
P(3,1,3)*d2c[3]);
871 d2cP[14] = (
P(3,2,0)*d2c[0]+
P(3,2,1)*d2c[1]+
P(3,2,2)*d2c[2]+
P(3,2,3)*d2c[3]);
872 d2cP[15] = (
P(3,3,0)*d2c[0]+
P(3,3,1)*d2c[1]+
P(3,3,2)*d2c[2]+
P(3,3,3)*d2c[3]);
874 bcP[0] = ( b[0]*cP[ 0] + b[1]*cP[ 1] + b[2]*cP[ 2] + b[3]*cP[ 3]);
875 bcP[1] = ( b[0]*cP[ 4] + b[1]*cP[ 5] + b[2]*cP[ 6] + b[3]*cP[ 7]);
876 bcP[2] = ( b[0]*cP[ 8] + b[1]*cP[ 9] + b[2]*cP[10] + b[3]*cP[11]);
877 bcP[3] = ( b[0]*cP[12] + b[1]*cP[13] + b[2]*cP[14] + b[3]*cP[15]);
879 dbcP[0] = ( db[0]*cP[ 0] + db[1]*cP[ 1] + db[2]*cP[ 2] + db[3]*cP[ 3]);
880 dbcP[1] = ( db[0]*cP[ 4] + db[1]*cP[ 5] + db[2]*cP[ 6] + db[3]*cP[ 7]);
881 dbcP[2] = ( db[0]*cP[ 8] + db[1]*cP[ 9] + db[2]*cP[10] + db[3]*cP[11]);
882 dbcP[3] = ( db[0]*cP[12] + db[1]*cP[13] + db[2]*cP[14] + db[3]*cP[15]);
884 bdcP[0] = ( b[0]*dcP[ 0] + b[1]*dcP[ 1] + b[2]*dcP[ 2] + b[3]*dcP[ 3]);
885 bdcP[1] = ( b[0]*dcP[ 4] + b[1]*dcP[ 5] + b[2]*dcP[ 6] + b[3]*dcP[ 7]);
886 bdcP[2] = ( b[0]*dcP[ 8] + b[1]*dcP[ 9] + b[2]*dcP[10] + b[3]*dcP[11]);
887 bdcP[3] = ( b[0]*dcP[12] + b[1]*dcP[13] + b[2]*dcP[14] + b[3]*dcP[15]);
889 bd2cP[0] = ( b[0]*d2cP[ 0] + b[1]*d2cP[ 1] + b[2]*d2cP[ 2] + b[3]*d2cP[ 3]);
890 bd2cP[1] = ( b[0]*d2cP[ 4] + b[1]*d2cP[ 5] + b[2]*d2cP[ 6] + b[3]*d2cP[ 7]);
891 bd2cP[2] = ( b[0]*d2cP[ 8] + b[1]*d2cP[ 9] + b[2]*d2cP[10] + b[3]*d2cP[11]);
892 bd2cP[3] = ( b[0]*d2cP[12] + b[1]*d2cP[13] + b[2]*d2cP[14] + b[3]*d2cP[15]);
894 d2bcP[0] = ( d2b[0]*cP[ 0] + d2b[1]*cP[ 1] + d2b[2]*cP[ 2] + d2b[3]*cP[ 3]);
895 d2bcP[1] = ( d2b[0]*cP[ 4] + d2b[1]*cP[ 5] + d2b[2]*cP[ 6] + d2b[3]*cP[ 7]);
896 d2bcP[2] = ( d2b[0]*cP[ 8] + d2b[1]*cP[ 9] + d2b[2]*cP[10] + d2b[3]*cP[11]);
897 d2bcP[3] = ( d2b[0]*cP[12] + d2b[1]*cP[13] + d2b[2]*cP[14] + d2b[3]*cP[15]);
899 dbdcP[0] = ( db[0]*dcP[ 0] + db[1]*dcP[ 1] + db[2]*dcP[ 2] + db[3]*dcP[ 3]);
900 dbdcP[1] = ( db[0]*dcP[ 4] + db[1]*dcP[ 5] + db[2]*dcP[ 6] + db[3]*dcP[ 7]);
901 dbdcP[2] = ( db[0]*dcP[ 8] + db[1]*dcP[ 9] + db[2]*dcP[10] + db[3]*dcP[11]);
902 dbdcP[3] = ( db[0]*dcP[12] + db[1]*dcP[13] + db[2]*dcP[14] + db[3]*dcP[15]);
904 *val = a[0]*bcP[0] + a[1]*bcP[1] + a[2]*bcP[2] + a[3]*bcP[3];
905 grad[0] = spline->x_grid.delta_inv *
906 (da[0] *bcP[0] + da[1]*bcP[1] + da[2]*bcP[2] + da[3]*bcP[3]);
907 grad[1] = spline->y_grid.delta_inv *
908 (a[0]*dbcP[0] + a[1]*dbcP[1] + a[2]*dbcP[2] + a[3]*dbcP[3]);
909 grad[2] = spline->z_grid.delta_inv *
910 (a[0]*bdcP[0] + a[1]*bdcP[1] + a[2]*bdcP[2] + a[3]*bdcP[3]);
912 hess[0] = spline->x_grid.delta_inv * spline->x_grid.delta_inv *
913 (d2a[0]*bcP[0] + d2a[1]*bcP[1] + d2a[2]*bcP[2] + d2a[3]*bcP[3]);
915 hess[1] = spline->x_grid.delta_inv * spline->y_grid.delta_inv *
916 (da[0]*dbcP[0] + da[1]*dbcP[1] + da[2]*dbcP[2] + da[3]*dbcP[3]);
919 hess[2] = spline->x_grid.delta_inv * spline->z_grid.delta_inv *
920 (da[0]*bdcP[0] + da[1]*bdcP[1] + da[2]*bdcP[2] + da[3]*bdcP[3]);
923 hess[4] = spline->y_grid.delta_inv * spline->y_grid.delta_inv *
924 (a[0]*d2bcP[0] + a[1]*d2bcP[1] + a[2]*d2bcP[2] + a[3]*d2bcP[3]);
926 hess[5] = spline->y_grid.delta_inv * spline->z_grid.delta_inv *
927 (a[0]*dbdcP[0] + a[1]*dbdcP[1] + a[2]*dbdcP[2] + a[3]*dbdcP[3]);
930 hess[8] = spline->z_grid.delta_inv * spline->z_grid.delta_inv *
931 (a[0]*bd2cP[0] + a[1]*bd2cP[1] + a[2]*bd2cP[2] + a[3]*bd2cP[3]);