233 double x,
double y,
double*
restrict val,
236 x -= spline->x_grid.start;
237 y -= spline->y_grid.start;
238 double ux = x*spline->x_grid.delta_inv;
239 double uy = y*spline->y_grid.delta_inv;
240 double ipartx, iparty, tx, ty;
241 tx = modf (ux, &ipartx);
242 ty = modf (uy, &iparty);
243 int ix = (int) ipartx;
244 int iy = (int) iparty;
246 double tpx[4], tpy[4], a[4], b[4], da[4], db[4], d2a[4], d2b[4];
247 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
248 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
249 double*
restrict coefs = spline->coefs;
251 a[0] = (
Ad[ 0]*tpx[0] +
Ad[ 1]*tpx[1] +
Ad[ 2]*tpx[2] +
Ad[ 3]*tpx[3]);
252 a[1] = (
Ad[ 4]*tpx[0] +
Ad[ 5]*tpx[1] +
Ad[ 6]*tpx[2] +
Ad[ 7]*tpx[3]);
253 a[2] = (
Ad[ 8]*tpx[0] +
Ad[ 9]*tpx[1] +
Ad[10]*tpx[2] +
Ad[11]*tpx[3]);
254 a[3] = (
Ad[12]*tpx[0] +
Ad[13]*tpx[1] +
Ad[14]*tpx[2] +
Ad[15]*tpx[3]);
255 da[0] = (
dAd[ 1]*tpx[1] +
dAd[ 2]*tpx[2] +
dAd[ 3]*tpx[3]);
256 da[1] = (
dAd[ 5]*tpx[1] +
dAd[ 6]*tpx[2] +
dAd[ 7]*tpx[3]);
257 da[2] = (
dAd[ 9]*tpx[1] +
dAd[10]*tpx[2] +
dAd[11]*tpx[3]);
258 da[3] = (
dAd[13]*tpx[1] +
dAd[14]*tpx[2] +
dAd[15]*tpx[3]);
259 d2a[0] = (
d2Ad[ 2]*tpx[2] +
d2Ad[ 3]*tpx[3]);
260 d2a[1] = (
d2Ad[ 6]*tpx[2] +
d2Ad[ 7]*tpx[3]);
261 d2a[2] = (
d2Ad[10]*tpx[2] +
d2Ad[11]*tpx[3]);
262 d2a[3] = (
d2Ad[14]*tpx[2] +
d2Ad[15]*tpx[3]);
264 b[0] = (
Ad[ 0]*tpy[0] +
Ad[ 1]*tpy[1] +
Ad[ 2]*tpy[2] +
Ad[ 3]*tpy[3]);
265 b[1] = (
Ad[ 4]*tpy[0] +
Ad[ 5]*tpy[1] +
Ad[ 6]*tpy[2] +
Ad[ 7]*tpy[3]);
266 b[2] = (
Ad[ 8]*tpy[0] +
Ad[ 9]*tpy[1] +
Ad[10]*tpy[2] +
Ad[11]*tpy[3]);
267 b[3] = (
Ad[12]*tpy[0] +
Ad[13]*tpy[1] +
Ad[14]*tpy[2] +
Ad[15]*tpy[3]);
268 db[0] = (
dAd[ 1]*tpy[1] +
dAd[ 2]*tpy[2] +
dAd[ 3]*tpy[3]);
269 db[1] = (
dAd[ 5]*tpy[1] +
dAd[ 6]*tpy[2] +
dAd[ 7]*tpy[3]);
270 db[2] = (
dAd[ 9]*tpy[1] +
dAd[10]*tpy[2] +
dAd[11]*tpy[3]);
271 db[3] = (
dAd[13]*tpy[1] +
dAd[14]*tpy[2] +
dAd[15]*tpy[3]);
272 d2b[0] = (
d2Ad[ 2]*tpy[2] +
d2Ad[ 3]*tpy[3]);
273 d2b[1] = (
d2Ad[ 6]*tpy[2] +
d2Ad[ 7]*tpy[3]);
274 d2b[2] = (
d2Ad[10]*tpy[2] +
d2Ad[11]*tpy[3]);
275 d2b[3] = (
d2Ad[14]*tpy[2] +
d2Ad[15]*tpy[3]);
277 int xs = spline->x_stride;
278#define C(i,j) coefs[(ix+(i))*xs+iy+(j)]
280 (a[0]*(
C(0,0)*b[0]+
C(0,1)*b[1]+
C(0,2)*b[2]+
C(0,3)*b[3])+
281 a[1]*(
C(1,0)*b[0]+
C(1,1)*b[1]+
C(1,2)*b[2]+
C(1,3)*b[3])+
282 a[2]*(
C(2,0)*b[0]+
C(2,1)*b[1]+
C(2,2)*b[2]+
C(2,3)*b[3])+
283 a[3]*(
C(3,0)*b[0]+
C(3,1)*b[1]+
C(3,2)*b[2]+
C(3,3)*b[3]));
284 grad[0] = spline->x_grid.delta_inv *
285 (da[0]*(
C(0,0)*b[0]+
C(0,1)*b[1]+
C(0,2)*b[2]+
C(0,3)*b[3])+
286 da[1]*(
C(1,0)*b[0]+
C(1,1)*b[1]+
C(1,2)*b[2]+
C(1,3)*b[3])+
287 da[2]*(
C(2,0)*b[0]+
C(2,1)*b[1]+
C(2,2)*b[2]+
C(2,3)*b[3])+
288 da[3]*(
C(3,0)*b[0]+
C(3,1)*b[1]+
C(3,2)*b[2]+
C(3,3)*b[3]));
289 grad[1] = spline->y_grid.delta_inv *
290 (a[0]*(
C(0,0)*db[0]+
C(0,1)*db[1]+
C(0,2)*db[2]+
C(0,3)*db[3])+
291 a[1]*(
C(1,0)*db[0]+
C(1,1)*db[1]+
C(1,2)*db[2]+
C(1,3)*db[3])+
292 a[2]*(
C(2,0)*db[0]+
C(2,1)*db[1]+
C(2,2)*db[2]+
C(2,3)*db[3])+
293 a[3]*(
C(3,0)*db[0]+
C(3,1)*db[1]+
C(3,2)*db[2]+
C(3,3)*db[3]));
295 spline->y_grid.delta_inv * spline->y_grid.delta_inv *
296 (a[0]*(
C(0,0)*d2b[0]+
C(0,1)*d2b[1]+
C(0,2)*d2b[2]+
C(0,3)*d2b[3])+
297 a[1]*(
C(1,0)*d2b[0]+
C(1,1)*d2b[1]+
C(1,2)*d2b[2]+
C(1,3)*d2b[3])+
298 a[2]*(
C(2,0)*d2b[0]+
C(2,1)*d2b[1]+
C(2,2)*d2b[2]+
C(2,3)*d2b[3])+
299 a[3]*(
C(3,0)*d2b[0]+
C(3,1)*d2b[1]+
C(3,2)*d2b[2]+
C(3,3)*d2b[3])) +
300 spline->x_grid.delta_inv * spline->x_grid.delta_inv *
301 (d2a[0]*(
C(0,0)*b[0]+
C(0,1)*b[1]+
C(0,2)*b[2]+
C(0,3)*b[3])+
302 d2a[1]*(
C(1,0)*b[0]+
C(1,1)*b[1]+
C(1,2)*b[2]+
C(1,3)*b[3])+
303 d2a[2]*(
C(2,0)*b[0]+
C(2,1)*b[1]+
C(2,2)*b[2]+
C(2,3)*b[3])+
304 d2a[3]*(
C(3,0)*b[0]+
C(3,1)*b[1]+
C(3,2)*b[2]+
C(3,3)*b[3]));
313 double x,
double y,
double*
restrict val,
316 x -= spline->x_grid.start;
317 y -= spline->y_grid.start;
318 double ux = x*spline->x_grid.delta_inv;
319 double uy = y*spline->y_grid.delta_inv;
320 double ipartx, iparty, tx, ty;
321 tx = modf (ux, &ipartx);
322 ty = modf (uy, &iparty);
323 int ix = (int) ipartx;
324 int iy = (int) iparty;
326 double tpx[4], tpy[4], a[4], b[4], da[4], db[4], d2a[4], d2b[4];
327 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
328 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
329 double*
restrict coefs = spline->coefs;
331 a[0] = (
Ad[ 0]*tpx[0] +
Ad[ 1]*tpx[1] +
Ad[ 2]*tpx[2] +
Ad[ 3]*tpx[3]);
332 a[1] = (
Ad[ 4]*tpx[0] +
Ad[ 5]*tpx[1] +
Ad[ 6]*tpx[2] +
Ad[ 7]*tpx[3]);
333 a[2] = (
Ad[ 8]*tpx[0] +
Ad[ 9]*tpx[1] +
Ad[10]*tpx[2] +
Ad[11]*tpx[3]);
334 a[3] = (
Ad[12]*tpx[0] +
Ad[13]*tpx[1] +
Ad[14]*tpx[2] +
Ad[15]*tpx[3]);
335 da[0] = (
dAd[ 1]*tpx[1] +
dAd[ 2]*tpx[2] +
dAd[ 3]*tpx[3]);
336 da[1] = (
dAd[ 5]*tpx[1] +
dAd[ 6]*tpx[2] +
dAd[ 7]*tpx[3]);
337 da[2] = (
dAd[ 9]*tpx[1] +
dAd[10]*tpx[2] +
dAd[11]*tpx[3]);
338 da[3] = (
dAd[13]*tpx[1] +
dAd[14]*tpx[2] +
dAd[15]*tpx[3]);
339 d2a[0] = (
d2Ad[ 2]*tpx[2] +
d2Ad[ 3]*tpx[3]);
340 d2a[1] = (
d2Ad[ 6]*tpx[2] +
d2Ad[ 7]*tpx[3]);
341 d2a[2] = (
d2Ad[10]*tpx[2] +
d2Ad[11]*tpx[3]);
342 d2a[3] = (
d2Ad[14]*tpx[2] +
d2Ad[15]*tpx[3]);
344 b[0] = (
Ad[ 0]*tpy[0] +
Ad[ 1]*tpy[1] +
Ad[ 2]*tpy[2] +
Ad[ 3]*tpy[3]);
345 b[1] = (
Ad[ 4]*tpy[0] +
Ad[ 5]*tpy[1] +
Ad[ 6]*tpy[2] +
Ad[ 7]*tpy[3]);
346 b[2] = (
Ad[ 8]*tpy[0] +
Ad[ 9]*tpy[1] +
Ad[10]*tpy[2] +
Ad[11]*tpy[3]);
347 b[3] = (
Ad[12]*tpy[0] +
Ad[13]*tpy[1] +
Ad[14]*tpy[2] +
Ad[15]*tpy[3]);
348 db[0] = (
dAd[ 1]*tpy[1] +
dAd[ 2]*tpy[2] +
dAd[ 3]*tpy[3]);
349 db[1] = (
dAd[ 5]*tpy[1] +
dAd[ 6]*tpy[2] +
dAd[ 7]*tpy[3]);
350 db[2] = (
dAd[ 9]*tpy[1] +
dAd[10]*tpy[2] +
dAd[11]*tpy[3]);
351 db[3] = (
dAd[13]*tpy[1] +
dAd[14]*tpy[2] +
dAd[15]*tpy[3]);
352 d2b[0] = (
d2Ad[ 2]*tpy[2] +
d2Ad[ 3]*tpy[3]);
353 d2b[1] = (
d2Ad[ 6]*tpy[2] +
d2Ad[ 7]*tpy[3]);
354 d2b[2] = (
d2Ad[10]*tpy[2] +
d2Ad[11]*tpy[3]);
355 d2b[3] = (
d2Ad[14]*tpy[2] +
d2Ad[15]*tpy[3]);
357 int xs = spline->x_stride;
358#define C(i,j) coefs[(ix+(i))*xs+iy+(j)]
360 ( a[0]*(
C(0,0)* b[0]+
C(0,1)* b[1]+
C(0,2)* b[2]+
C(0,3)* b[3])+
361 a[1]*(
C(1,0)* b[0]+
C(1,1)* b[1]+
C(1,2)* b[2]+
C(1,3)* b[3])+
362 a[2]*(
C(2,0)* b[0]+
C(2,1)* b[1]+
C(2,2)* b[2]+
C(2,3)* b[3])+
363 a[3]*(
C(3,0)* b[0]+
C(3,1)* b[1]+
C(3,2)* b[2]+
C(3,3)* b[3]));
364 grad[0] = spline->x_grid.delta_inv *
365 ( da[0]*(
C(0,0)* b[0]+
C(0,1)* b[1]+
C(0,2)* b[2]+
C(0,3)* b[3])+
366 da[1]*(
C(1,0)* b[0]+
C(1,1)* b[1]+
C(1,2)* b[2]+
C(1,3)* b[3])+
367 da[2]*(
C(2,0)* b[0]+
C(2,1)* b[1]+
C(2,2)* b[2]+
C(2,3)* b[3])+
368 da[3]*(
C(3,0)* b[0]+
C(3,1)* b[1]+
C(3,2)* b[2]+
C(3,3)* b[3]));
369 grad[1] = spline->y_grid.delta_inv *
370 ( a[0]*(
C(0,0)* db[0]+
C(0,1)* db[1]+
C(0,2)* db[2]+
C(0,3)* db[3])+
371 a[1]*(
C(1,0)* db[0]+
C(1,1)* db[1]+
C(1,2)* db[2]+
C(1,3)* db[3])+
372 a[2]*(
C(2,0)* db[0]+
C(2,1)* db[1]+
C(2,2)* db[2]+
C(2,3)* db[3])+
373 a[3]*(
C(3,0)* db[0]+
C(3,1)* db[1]+
C(3,2)* db[2]+
C(3,3)* db[3]));
374 hess[0] = spline->x_grid.delta_inv * spline->x_grid.delta_inv *
375 (d2a[0]*(
C(0,0)* b[0]+
C(0,1)* b[1]+
C(0,2)* b[2]+
C(0,3)* b[3])+
376 d2a[1]*(
C(1,0)* b[0]+
C(1,1)* b[1]+
C(1,2)* b[2]+
C(1,3)* b[3])+
377 d2a[2]*(
C(2,0)* b[0]+
C(2,1)* b[1]+
C(2,2)* b[2]+
C(2,3)* b[3])+
378 d2a[3]*(
C(3,0)* b[0]+
C(3,1)* b[1]+
C(3,2)* b[2]+
C(3,3)* b[3]));
379 hess[1] = spline->x_grid.delta_inv * spline->y_grid.delta_inv *
380 ( da[0]*(
C(0,0)* db[0]+
C(0,1)* db[1]+
C(0,2)* db[2]+
C(0,3)* db[3])+
381 da[1]*(
C(1,0)* db[0]+
C(1,1)* db[1]+
C(1,2)* db[2]+
C(1,3)* db[3])+
382 da[2]*(
C(2,0)* db[0]+
C(2,1)* db[1]+
C(2,2)* db[2]+
C(2,3)* db[3])+
383 da[3]*(
C(3,0)* db[0]+
C(3,1)* db[1]+
C(3,2)* db[2]+
C(3,3)* db[3]));
384 hess[3] = spline->y_grid.delta_inv * spline->y_grid.delta_inv *
385 ( a[0]*(
C(0,0)*d2b[0]+
C(0,1)*d2b[1]+
C(0,2)*d2b[2]+
C(0,3)*d2b[3])+
386 a[1]*(
C(1,0)*d2b[0]+
C(1,1)*d2b[1]+
C(1,2)*d2b[2]+
C(1,3)*d2b[3])+
387 a[2]*(
C(2,0)*d2b[0]+
C(2,1)*d2b[1]+
C(2,2)*d2b[2]+
C(2,3)*d2b[3])+
388 a[3]*(
C(3,0)*d2b[0]+
C(3,1)*d2b[1]+
C(3,2)*d2b[2]+
C(3,3)*d2b[3]));
403 double x,
double y,
double z,
406 x -= spline->x_grid.start;
407 y -= spline->y_grid.start;
408 z -= spline->z_grid.start;
409 double ux = x*spline->x_grid.delta_inv;
410 double uy = y*spline->y_grid.delta_inv;
411 double uz = z*spline->z_grid.delta_inv;
412 double ipartx, iparty, ipartz, tx, ty, tz;
413 tx = modf (ux, &ipartx);
int ix = (int) ipartx;
414 ty = modf (uy, &iparty);
int iy = (int) iparty;
415 tz = modf (uz, &ipartz);
int iz = (int) ipartz;
420 double tpx[4], tpy[4], tpz[4], a[4], b[4], c[4];
421 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
422 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
423 tpz[0] = tz*tz*tz; tpz[1] = tz*tz; tpz[2] = tz; tpz[3] = 1.0;
424 double*
restrict coefs = spline->coefs;
426 a[0] = (
Ad[ 0]*tpx[0] +
Ad[ 1]*tpx[1] +
Ad[ 2]*tpx[2] +
Ad[ 3]*tpx[3]);
427 a[1] = (
Ad[ 4]*tpx[0] +
Ad[ 5]*tpx[1] +
Ad[ 6]*tpx[2] +
Ad[ 7]*tpx[3]);
428 a[2] = (
Ad[ 8]*tpx[0] +
Ad[ 9]*tpx[1] +
Ad[10]*tpx[2] +
Ad[11]*tpx[3]);
429 a[3] = (
Ad[12]*tpx[0] +
Ad[13]*tpx[1] +
Ad[14]*tpx[2] +
Ad[15]*tpx[3]);
431 b[0] = (
Ad[ 0]*tpy[0] +
Ad[ 1]*tpy[1] +
Ad[ 2]*tpy[2] +
Ad[ 3]*tpy[3]);
432 b[1] = (
Ad[ 4]*tpy[0] +
Ad[ 5]*tpy[1] +
Ad[ 6]*tpy[2] +
Ad[ 7]*tpy[3]);
433 b[2] = (
Ad[ 8]*tpy[0] +
Ad[ 9]*tpy[1] +
Ad[10]*tpy[2] +
Ad[11]*tpy[3]);
434 b[3] = (
Ad[12]*tpy[0] +
Ad[13]*tpy[1] +
Ad[14]*tpy[2] +
Ad[15]*tpy[3]);
436 c[0] = (
Ad[ 0]*tpz[0] +
Ad[ 1]*tpz[1] +
Ad[ 2]*tpz[2] +
Ad[ 3]*tpz[3]);
437 c[1] = (
Ad[ 4]*tpz[0] +
Ad[ 5]*tpz[1] +
Ad[ 6]*tpz[2] +
Ad[ 7]*tpz[3]);
438 c[2] = (
Ad[ 8]*tpz[0] +
Ad[ 9]*tpz[1] +
Ad[10]*tpz[2] +
Ad[11]*tpz[3]);
439 c[3] = (
Ad[12]*tpz[0] +
Ad[13]*tpz[1] +
Ad[14]*tpz[2] +
Ad[15]*tpz[3]);
441 int xs = spline->x_stride;
442 int ys = spline->y_stride;
443#define P(i,j,k) coefs[(ix+(i))*xs+(iy+(j))*ys+(iz+(k))]
444 *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])+
445 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])+
446 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])+
447 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]))+
448 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])+
449 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])+
450 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])+
451 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]))+
452 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])+
453 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])+
454 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])+
455 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]))+
456 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])+
457 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])+
458 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])+
459 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])));
467 double x,
double y,
double z,
470 x -= spline->x_grid.start;
471 y -= spline->y_grid.start;
472 z -= spline->z_grid.start;
473 double ux = x*spline->x_grid.delta_inv;
474 double uy = y*spline->y_grid.delta_inv;
475 double uz = z*spline->z_grid.delta_inv;
476 double ipartx, iparty, ipartz, tx, ty, tz;
477 tx = modf (ux, &ipartx);
int ix = (int) ipartx;
478 ty = modf (uy, &iparty);
int iy = (int) iparty;
479 tz = modf (uz, &ipartz);
int iz = (int) ipartz;
481 double tpx[4], tpy[4], tpz[4], a[4], b[4], c[4], da[4], db[4], dc[4],
482 cP[16], bcP[4], dbcP[4];
483 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
484 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
485 tpz[0] = tz*tz*tz; tpz[1] = tz*tz; tpz[2] = tz; tpz[3] = 1.0;
486 double*
restrict coefs = spline->coefs;
488 a[0] = (
Ad[ 0]*tpx[0] +
Ad[ 1]*tpx[1] +
Ad[ 2]*tpx[2] +
Ad[ 3]*tpx[3]);
489 a[1] = (
Ad[ 4]*tpx[0] +
Ad[ 5]*tpx[1] +
Ad[ 6]*tpx[2] +
Ad[ 7]*tpx[3]);
490 a[2] = (
Ad[ 8]*tpx[0] +
Ad[ 9]*tpx[1] +
Ad[10]*tpx[2] +
Ad[11]*tpx[3]);
491 a[3] = (
Ad[12]*tpx[0] +
Ad[13]*tpx[1] +
Ad[14]*tpx[2] +
Ad[15]*tpx[3]);
492 da[0] = (
dAd[ 1]*tpx[1] +
dAd[ 2]*tpx[2] +
dAd[ 3]*tpx[3]);
493 da[1] = (
dAd[ 5]*tpx[1] +
dAd[ 6]*tpx[2] +
dAd[ 7]*tpx[3]);
494 da[2] = (
dAd[ 9]*tpx[1] +
dAd[10]*tpx[2] +
dAd[11]*tpx[3]);
495 da[3] = (
dAd[13]*tpx[1] +
dAd[14]*tpx[2] +
dAd[15]*tpx[3]);
497 b[0] = (
Ad[ 0]*tpy[0] +
Ad[ 1]*tpy[1] +
Ad[ 2]*tpy[2] +
Ad[ 3]*tpy[3]);
498 b[1] = (
Ad[ 4]*tpy[0] +
Ad[ 5]*tpy[1] +
Ad[ 6]*tpy[2] +
Ad[ 7]*tpy[3]);
499 b[2] = (
Ad[ 8]*tpy[0] +
Ad[ 9]*tpy[1] +
Ad[10]*tpy[2] +
Ad[11]*tpy[3]);
500 b[3] = (
Ad[12]*tpy[0] +
Ad[13]*tpy[1] +
Ad[14]*tpy[2] +
Ad[15]*tpy[3]);
501 db[0] = (
dAd[ 1]*tpy[1] +
dAd[ 2]*tpy[2] +
dAd[ 3]*tpy[3]);
502 db[1] = (
dAd[ 5]*tpy[1] +
dAd[ 6]*tpy[2] +
dAd[ 7]*tpy[3]);
503 db[2] = (
dAd[ 9]*tpy[1] +
dAd[10]*tpy[2] +
dAd[11]*tpy[3]);
504 db[3] = (
dAd[13]*tpy[1] +
dAd[14]*tpy[2] +
dAd[15]*tpy[3]);
506 c[0] = (
Ad[ 0]*tpz[0] +
Ad[ 1]*tpz[1] +
Ad[ 2]*tpz[2] +
Ad[ 3]*tpz[3]);
507 c[1] = (
Ad[ 4]*tpz[0] +
Ad[ 5]*tpz[1] +
Ad[ 6]*tpz[2] +
Ad[ 7]*tpz[3]);
508 c[2] = (
Ad[ 8]*tpz[0] +
Ad[ 9]*tpz[1] +
Ad[10]*tpz[2] +
Ad[11]*tpz[3]);
509 c[3] = (
Ad[12]*tpz[0] +
Ad[13]*tpz[1] +
Ad[14]*tpz[2] +
Ad[15]*tpz[3]);
510 dc[0] = (
dAd[ 1]*tpz[1] +
dAd[ 2]*tpz[2] +
dAd[ 3]*tpz[3]);
511 dc[1] = (
dAd[ 5]*tpz[1] +
dAd[ 6]*tpz[2] +
dAd[ 7]*tpz[3]);
512 dc[2] = (
dAd[ 9]*tpz[1] +
dAd[10]*tpz[2] +
dAd[11]*tpz[3]);
513 dc[3] = (
dAd[13]*tpz[1] +
dAd[14]*tpz[2] +
dAd[15]*tpz[3]);
515 int xs = spline->x_stride;
516 int ys = spline->y_stride;
517#define P(i,j,k) coefs[(ix+(i))*xs+(iy+(j))*ys+(iz+(k))]
518 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]);
519 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]);
520 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]);
521 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]);
522 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]);
523 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]);
524 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]);
525 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]);
526 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]);
527 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]);
528 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]);
529 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]);
530 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]);
531 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]);
532 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]);
533 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]);
535 bcP[0] = ( b[0]*cP[ 0] + b[1]*cP[ 1] + b[2]*cP[ 2] + b[3]*cP[ 3]);
536 bcP[1] = ( b[0]*cP[ 4] + b[1]*cP[ 5] + b[2]*cP[ 6] + b[3]*cP[ 7]);
537 bcP[2] = ( b[0]*cP[ 8] + b[1]*cP[ 9] + b[2]*cP[10] + b[3]*cP[11]);
538 bcP[3] = ( b[0]*cP[12] + b[1]*cP[13] + b[2]*cP[14] + b[3]*cP[15]);
540 dbcP[0] = ( db[0]*cP[ 0] + db[1]*cP[ 1] + db[2]*cP[ 2] + db[3]*cP[ 3]);
541 dbcP[1] = ( db[0]*cP[ 4] + db[1]*cP[ 5] + db[2]*cP[ 6] + db[3]*cP[ 7]);
542 dbcP[2] = ( db[0]*cP[ 8] + db[1]*cP[ 9] + db[2]*cP[10] + db[3]*cP[11]);
543 dbcP[3] = ( db[0]*cP[12] + db[1]*cP[13] + db[2]*cP[14] + db[3]*cP[15]);
545 *val = ( a[0]*bcP[0] + a[1]*bcP[1] + a[2]*bcP[2] + a[3]*bcP[3]);
546 grad[0] = spline->x_grid.delta_inv *
547 (da[0]*bcP[0] + da[1]*bcP[1] + da[2]*bcP[2] + da[3]*bcP[3]);
548 grad[1] = spline->y_grid.delta_inv *
549 (a[0]*dbcP[0] + a[1]*dbcP[1] + a[2]*dbcP[2] + a[3]*dbcP[3]);
550 grad[2] = spline->z_grid.delta_inv *
551 (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])+
552 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])+
553 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])+
554 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]))+
555 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])+
556 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])+
557 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])+
558 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]))+
559 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])+
560 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])+
561 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])+
562 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]))+
563 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])+
564 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])+
565 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])+
566 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])));
576 double x,
double y,
double z,
579 x -= spline->x_grid.start;
580 y -= spline->y_grid.start;
581 z -= spline->z_grid.start;
582 double ux = x*spline->x_grid.delta_inv;
583 double uy = y*spline->y_grid.delta_inv;
584 double uz = z*spline->z_grid.delta_inv;
585 double ipartx, iparty, ipartz, tx, ty, tz;
586 tx = modf (ux, &ipartx);
int ix = (int) ipartx;
587 ty = modf (uy, &iparty);
int iy = (int) iparty;
588 tz = modf (uz, &ipartz);
int iz = (int) ipartz;
590 double tpx[4], tpy[4], tpz[4], a[4], b[4], c[4], da[4], db[4], dc[4],
591 d2a[4], d2b[4], d2c[4], cP[16], dcP[16], bcP[4], dbcP[4], d2bcP[4], bdcP[4];
592 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
593 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
594 tpz[0] = tz*tz*tz; tpz[1] = tz*tz; tpz[2] = tz; tpz[3] = 1.0;
595 double*
restrict coefs = spline->coefs;
597 a[0] = (
Ad[ 0]*tpx[0] +
Ad[ 1]*tpx[1] +
Ad[ 2]*tpx[2] +
Ad[ 3]*tpx[3]);
598 a[1] = (
Ad[ 4]*tpx[0] +
Ad[ 5]*tpx[1] +
Ad[ 6]*tpx[2] +
Ad[ 7]*tpx[3]);
599 a[2] = (
Ad[ 8]*tpx[0] +
Ad[ 9]*tpx[1] +
Ad[10]*tpx[2] +
Ad[11]*tpx[3]);
600 a[3] = (
Ad[12]*tpx[0] +
Ad[13]*tpx[1] +
Ad[14]*tpx[2] +
Ad[15]*tpx[3]);
601 da[0] = (
dAd[ 1]*tpx[1] +
dAd[ 2]*tpx[2] +
dAd[ 3]*tpx[3]);
602 da[1] = (
dAd[ 5]*tpx[1] +
dAd[ 6]*tpx[2] +
dAd[ 7]*tpx[3]);
603 da[2] = (
dAd[ 9]*tpx[1] +
dAd[10]*tpx[2] +
dAd[11]*tpx[3]);
604 da[3] = (
dAd[13]*tpx[1] +
dAd[14]*tpx[2] +
dAd[15]*tpx[3]);
605 d2a[0] = (
d2Ad[ 2]*tpx[2] +
d2Ad[ 3]*tpx[3]);
606 d2a[1] = (
d2Ad[ 6]*tpx[2] +
d2Ad[ 7]*tpx[3]);
607 d2a[2] = (
d2Ad[10]*tpx[2] +
d2Ad[11]*tpx[3]);
608 d2a[3] = (
d2Ad[14]*tpx[2] +
d2Ad[15]*tpx[3]);
610 b[0] = (
Ad[ 0]*tpy[0] +
Ad[ 1]*tpy[1] +
Ad[ 2]*tpy[2] +
Ad[ 3]*tpy[3]);
611 b[1] = (
Ad[ 4]*tpy[0] +
Ad[ 5]*tpy[1] +
Ad[ 6]*tpy[2] +
Ad[ 7]*tpy[3]);
612 b[2] = (
Ad[ 8]*tpy[0] +
Ad[ 9]*tpy[1] +
Ad[10]*tpy[2] +
Ad[11]*tpy[3]);
613 b[3] = (
Ad[12]*tpy[0] +
Ad[13]*tpy[1] +
Ad[14]*tpy[2] +
Ad[15]*tpy[3]);
614 db[0] = (
dAd[ 1]*tpy[1] +
dAd[ 2]*tpy[2] +
dAd[ 3]*tpy[3]);
615 db[1] = (
dAd[ 5]*tpy[1] +
dAd[ 6]*tpy[2] +
dAd[ 7]*tpy[3]);
616 db[2] = (
dAd[ 9]*tpy[1] +
dAd[10]*tpy[2] +
dAd[11]*tpy[3]);
617 db[3] = (
dAd[13]*tpy[1] +
dAd[14]*tpy[2] +
dAd[15]*tpy[3]);
618 d2b[0] = (
d2Ad[ 2]*tpy[2] +
d2Ad[ 3]*tpy[3]);
619 d2b[1] = (
d2Ad[ 6]*tpy[2] +
d2Ad[ 7]*tpy[3]);
620 d2b[2] = (
d2Ad[10]*tpy[2] +
d2Ad[11]*tpy[3]);
621 d2b[3] = (
d2Ad[14]*tpy[2] +
d2Ad[15]*tpy[3]);
623 c[0] = (
Ad[ 0]*tpz[0] +
Ad[ 1]*tpz[1] +
Ad[ 2]*tpz[2] +
Ad[ 3]*tpz[3]);
624 c[1] = (
Ad[ 4]*tpz[0] +
Ad[ 5]*tpz[1] +
Ad[ 6]*tpz[2] +
Ad[ 7]*tpz[3]);
625 c[2] = (
Ad[ 8]*tpz[0] +
Ad[ 9]*tpz[1] +
Ad[10]*tpz[2] +
Ad[11]*tpz[3]);
626 c[3] = (
Ad[12]*tpz[0] +
Ad[13]*tpz[1] +
Ad[14]*tpz[2] +
Ad[15]*tpz[3]);
627 dc[0] = (
dAd[ 1]*tpz[1] +
dAd[ 2]*tpz[2] +
dAd[ 3]*tpz[3]);
628 dc[1] = (
dAd[ 5]*tpz[1] +
dAd[ 6]*tpz[2] +
dAd[ 7]*tpz[3]);
629 dc[2] = (
dAd[ 9]*tpz[1] +
dAd[10]*tpz[2] +
dAd[11]*tpz[3]);
630 dc[3] = (
dAd[13]*tpz[1] +
dAd[14]*tpz[2] +
dAd[15]*tpz[3]);
631 d2c[0] = (
d2Ad[ 2]*tpz[2] +
d2Ad[ 3]*tpz[3]);
632 d2c[1] = (
d2Ad[ 6]*tpz[2] +
d2Ad[ 7]*tpz[3]);
633 d2c[2] = (
d2Ad[10]*tpz[2] +
d2Ad[11]*tpz[3]);
634 d2c[3] = (
d2Ad[14]*tpz[2] +
d2Ad[15]*tpz[3]);
636 int xs = spline->x_stride;
637 int ys = spline->y_stride;
638#define P(i,j,k) coefs[(ix+(i))*xs+(iy+(j))*ys+(iz+(k))]
639 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]);
640 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]);
641 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]);
642 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]);
643 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]);
644 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]);
645 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]);
646 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]);
647 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]);
648 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]);
649 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]);
650 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]);
651 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]);
652 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]);
653 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]);
654 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]);
656 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]);
657 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]);
658 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]);
659 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]);
660 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]);
661 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]);
662 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]);
663 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]);
664 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]);
665 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]);
666 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]);
667 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]);
668 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]);
669 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]);
670 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]);
671 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]);
673 bcP[0] = ( b[0]*cP[ 0] + b[1]*cP[ 1] + b[2]*cP[ 2] + b[3]*cP[ 3]);
674 bcP[1] = ( b[0]*cP[ 4] + b[1]*cP[ 5] + b[2]*cP[ 6] + b[3]*cP[ 7]);
675 bcP[2] = ( b[0]*cP[ 8] + b[1]*cP[ 9] + b[2]*cP[10] + b[3]*cP[11]);
676 bcP[3] = ( b[0]*cP[12] + b[1]*cP[13] + b[2]*cP[14] + b[3]*cP[15]);
678 dbcP[0] = ( db[0]*cP[ 0] + db[1]*cP[ 1] + db[2]*cP[ 2] + db[3]*cP[ 3]);
679 dbcP[1] = ( db[0]*cP[ 4] + db[1]*cP[ 5] + db[2]*cP[ 6] + db[3]*cP[ 7]);
680 dbcP[2] = ( db[0]*cP[ 8] + db[1]*cP[ 9] + db[2]*cP[10] + db[3]*cP[11]);
681 dbcP[3] = ( db[0]*cP[12] + db[1]*cP[13] + db[2]*cP[14] + db[3]*cP[15]);
683 bdcP[0] = ( b[0]*dcP[ 0] + b[1]*dcP[ 1] + b[2]*dcP[ 2] + b[3]*dcP[ 3]);
684 bdcP[1] = ( b[0]*dcP[ 4] + b[1]*dcP[ 5] + b[2]*dcP[ 6] + b[3]*dcP[ 7]);
685 bdcP[2] = ( b[0]*dcP[ 8] + b[1]*dcP[ 9] + b[2]*dcP[10] + b[3]*dcP[11]);
686 bdcP[3] = ( b[0]*dcP[12] + b[1]*dcP[13] + b[2]*dcP[14] + b[3]*dcP[15]);
688 d2bcP[0] = ( d2b[0]*cP[ 0] + d2b[1]*cP[ 1] + d2b[2]*cP[ 2] + d2b[3]*cP[ 3]);
689 d2bcP[1] = ( d2b[0]*cP[ 4] + d2b[1]*cP[ 5] + d2b[2]*cP[ 6] + d2b[3]*cP[ 7]);
690 d2bcP[2] = ( d2b[0]*cP[ 8] + d2b[1]*cP[ 9] + d2b[2]*cP[10] + d2b[3]*cP[11]);
691 d2bcP[3] = ( d2b[0]*cP[12] + d2b[1]*cP[13] + d2b[2]*cP[14] + d2b[3]*cP[15]);
695 ( a[0]*bcP[0] + a[1]*bcP[1] + a[2]*bcP[2] + a[3]*bcP[3]);
697 grad[0] = spline->x_grid.delta_inv *
698 (da[0]*bcP[0] + da[1]*bcP[1] + da[2]*bcP[2] + da[3]*bcP[3]);
699 grad[1] = spline->y_grid.delta_inv *
700 (a[0]*dbcP[0] + a[1]*dbcP[1] + a[2]*dbcP[2] + a[3]*dbcP[3]);
701 grad[2] = spline->z_grid.delta_inv *
702 (a[0]*bdcP[0] + a[1]*bdcP[1] + a[2]*bdcP[2] + a[3]*bdcP[3]);
705 spline->x_grid.delta_inv * spline->x_grid.delta_inv *
706 (d2a[0]*bcP[0] + d2a[1]*bcP[1] + d2a[2]*bcP[2] + d2a[3]*bcP[3])
708 + spline->y_grid.delta_inv * spline->y_grid.delta_inv *
709 (a[0]*d2bcP[0] + a[1]*d2bcP[1] + a[2]*d2bcP[2] + a[3]*d2bcP[3]) +
711 + spline->z_grid.delta_inv * spline->z_grid.delta_inv *
712 (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])+
713 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])+
714 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])+
715 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]))+
716 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])+
717 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])+
718 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])+
719 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]))+
720 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])+
721 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])+
722 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])+
723 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]))+
724 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])+
725 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])+
726 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])+
727 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])));
739 double x,
double y,
double z,
742 x -= spline->x_grid.start;
743 y -= spline->y_grid.start;
744 z -= spline->z_grid.start;
745 double ux = x*spline->x_grid.delta_inv;
746 double uy = y*spline->y_grid.delta_inv;
747 double uz = z*spline->z_grid.delta_inv;
748 ux =
fmin (ux, (
double)(spline->x_grid.num)-1.0e-5);
749 uy =
fmin (uy, (
double)(spline->y_grid.num)-1.0e-5);
750 uz =
fmin (uz, (
double)(spline->z_grid.num)-1.0e-5);
751 double ipartx, iparty, ipartz, tx, ty, tz;
752 tx = modf (ux, &ipartx);
int ix = (int) ipartx;
753 ty = modf (uy, &iparty);
int iy = (int) iparty;
754 tz = modf (uz, &ipartz);
int iz = (int) ipartz;
763 double tpx[4], tpy[4], tpz[4], a[4], b[4], c[4], da[4], db[4], dc[4],
764 d2a[4], d2b[4], d2c[4], cP[16], dcP[16], d2cP[16], bcP[4], dbcP[4],
765 d2bcP[4], dbdcP[4], bd2cP[4], bdcP[4];
766 tpx[0] = tx*tx*tx; tpx[1] = tx*tx; tpx[2] = tx; tpx[3] = 1.0;
767 tpy[0] = ty*ty*ty; tpy[1] = ty*ty; tpy[2] = ty; tpy[3] = 1.0;
768 tpz[0] = tz*tz*tz; tpz[1] = tz*tz; tpz[2] = tz; tpz[3] = 1.0;
769 double*
restrict coefs = spline->coefs;
771 a[0] = (
Ad[ 0]*tpx[0] +
Ad[ 1]*tpx[1] +
Ad[ 2]*tpx[2] +
Ad[ 3]*tpx[3]);
772 a[1] = (
Ad[ 4]*tpx[0] +
Ad[ 5]*tpx[1] +
Ad[ 6]*tpx[2] +
Ad[ 7]*tpx[3]);
773 a[2] = (
Ad[ 8]*tpx[0] +
Ad[ 9]*tpx[1] +
Ad[10]*tpx[2] +
Ad[11]*tpx[3]);
774 a[3] = (
Ad[12]*tpx[0] +
Ad[13]*tpx[1] +
Ad[14]*tpx[2] +
Ad[15]*tpx[3]);
775 da[0] = (
dAd[ 1]*tpx[1] +
dAd[ 2]*tpx[2] +
dAd[ 3]*tpx[3]);
776 da[1] = (
dAd[ 5]*tpx[1] +
dAd[ 6]*tpx[2] +
dAd[ 7]*tpx[3]);
777 da[2] = (
dAd[ 9]*tpx[1] +
dAd[10]*tpx[2] +
dAd[11]*tpx[3]);
778 da[3] = (
dAd[13]*tpx[1] +
dAd[14]*tpx[2] +
dAd[15]*tpx[3]);
779 d2a[0] = (
d2Ad[ 2]*tpx[2] +
d2Ad[ 3]*tpx[3]);
780 d2a[1] = (
d2Ad[ 6]*tpx[2] +
d2Ad[ 7]*tpx[3]);
781 d2a[2] = (
d2Ad[10]*tpx[2] +
d2Ad[11]*tpx[3]);
782 d2a[3] = (
d2Ad[14]*tpx[2] +
d2Ad[15]*tpx[3]);
784 b[0] = (
Ad[ 0]*tpy[0] +
Ad[ 1]*tpy[1] +
Ad[ 2]*tpy[2] +
Ad[ 3]*tpy[3]);
785 b[1] = (
Ad[ 4]*tpy[0] +
Ad[ 5]*tpy[1] +
Ad[ 6]*tpy[2] +
Ad[ 7]*tpy[3]);
786 b[2] = (
Ad[ 8]*tpy[0] +
Ad[ 9]*tpy[1] +
Ad[10]*tpy[2] +
Ad[11]*tpy[3]);
787 b[3] = (
Ad[12]*tpy[0] +
Ad[13]*tpy[1] +
Ad[14]*tpy[2] +
Ad[15]*tpy[3]);
788 db[0] = (
dAd[ 1]*tpy[1] +
dAd[ 2]*tpy[2] +
dAd[ 3]*tpy[3]);
789 db[1] = (
dAd[ 5]*tpy[1] +
dAd[ 6]*tpy[2] +
dAd[ 7]*tpy[3]);
790 db[2] = (
dAd[ 9]*tpy[1] +
dAd[10]*tpy[2] +
dAd[11]*tpy[3]);
791 db[3] = (
dAd[13]*tpy[1] +
dAd[14]*tpy[2] +
dAd[15]*tpy[3]);
792 d2b[0] = (
d2Ad[ 2]*tpy[2] +
d2Ad[ 3]*tpy[3]);
793 d2b[1] = (
d2Ad[ 6]*tpy[2] +
d2Ad[ 7]*tpy[3]);
794 d2b[2] = (
d2Ad[10]*tpy[2] +
d2Ad[11]*tpy[3]);
795 d2b[3] = (
d2Ad[14]*tpy[2] +
d2Ad[15]*tpy[3]);
797 c[0] = (
Ad[ 0]*tpz[0] +
Ad[ 1]*tpz[1] +
Ad[ 2]*tpz[2] +
Ad[ 3]*tpz[3]);
798 c[1] = (
Ad[ 4]*tpz[0] +
Ad[ 5]*tpz[1] +
Ad[ 6]*tpz[2] +
Ad[ 7]*tpz[3]);
799 c[2] = (
Ad[ 8]*tpz[0] +
Ad[ 9]*tpz[1] +
Ad[10]*tpz[2] +
Ad[11]*tpz[3]);
800 c[3] = (
Ad[12]*tpz[0] +
Ad[13]*tpz[1] +
Ad[14]*tpz[2] +
Ad[15]*tpz[3]);
801 dc[0] = (
dAd[ 1]*tpz[1] +
dAd[ 2]*tpz[2] +
dAd[ 3]*tpz[3]);
802 dc[1] = (
dAd[ 5]*tpz[1] +
dAd[ 6]*tpz[2] +
dAd[ 7]*tpz[3]);
803 dc[2] = (
dAd[ 9]*tpz[1] +
dAd[10]*tpz[2] +
dAd[11]*tpz[3]);
804 dc[3] = (
dAd[13]*tpz[1] +
dAd[14]*tpz[2] +
dAd[15]*tpz[3]);
805 d2c[0] = (
d2Ad[ 2]*tpz[2] +
d2Ad[ 3]*tpz[3]);
806 d2c[1] = (
d2Ad[ 6]*tpz[2] +
d2Ad[ 7]*tpz[3]);
807 d2c[2] = (
d2Ad[10]*tpz[2] +
d2Ad[11]*tpz[3]);
808 d2c[3] = (
d2Ad[14]*tpz[2] +
d2Ad[15]*tpz[3]);
810 int xs = spline->x_stride;
811 int ys = spline->y_stride;
812 int offmax = (ix+3)*xs + (iy+3)*ys + iz+3;
818#define P(i,j,k) coefs[(ix+(i))*xs+(iy+(j))*ys+(iz+(k))]
819 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]);
820 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]);
821 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]);
822 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]);
823 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]);
824 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]);
825 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]);
826 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]);
827 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]);
828 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]);
829 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]);
830 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]);
831 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]);
832 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]);
833 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]);
834 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]);
836 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]);
837 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]);
838 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]);
839 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]);
840 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]);
841 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]);
842 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]);
843 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]);
844 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]);
845 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]);
846 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]);
847 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]);
848 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]);
849 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]);
850 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]);
851 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]);
853 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]);
854 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]);
855 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]);
856 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]);
857 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]);
858 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]);
859 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]);
860 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]);
861 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]);
862 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]);
863 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]);
864 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]);
865 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]);
866 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]);
867 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]);
868 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]);
870 bcP[0] = ( b[0]*cP[ 0] + b[1]*cP[ 1] + b[2]*cP[ 2] + b[3]*cP[ 3]);
871 bcP[1] = ( b[0]*cP[ 4] + b[1]*cP[ 5] + b[2]*cP[ 6] + b[3]*cP[ 7]);
872 bcP[2] = ( b[0]*cP[ 8] + b[1]*cP[ 9] + b[2]*cP[10] + b[3]*cP[11]);
873 bcP[3] = ( b[0]*cP[12] + b[1]*cP[13] + b[2]*cP[14] + b[3]*cP[15]);
875 dbcP[0] = ( db[0]*cP[ 0] + db[1]*cP[ 1] + db[2]*cP[ 2] + db[3]*cP[ 3]);
876 dbcP[1] = ( db[0]*cP[ 4] + db[1]*cP[ 5] + db[2]*cP[ 6] + db[3]*cP[ 7]);
877 dbcP[2] = ( db[0]*cP[ 8] + db[1]*cP[ 9] + db[2]*cP[10] + db[3]*cP[11]);
878 dbcP[3] = ( db[0]*cP[12] + db[1]*cP[13] + db[2]*cP[14] + db[3]*cP[15]);
880 bdcP[0] = ( b[0]*dcP[ 0] + b[1]*dcP[ 1] + b[2]*dcP[ 2] + b[3]*dcP[ 3]);
881 bdcP[1] = ( b[0]*dcP[ 4] + b[1]*dcP[ 5] + b[2]*dcP[ 6] + b[3]*dcP[ 7]);
882 bdcP[2] = ( b[0]*dcP[ 8] + b[1]*dcP[ 9] + b[2]*dcP[10] + b[3]*dcP[11]);
883 bdcP[3] = ( b[0]*dcP[12] + b[1]*dcP[13] + b[2]*dcP[14] + b[3]*dcP[15]);
885 bd2cP[0] = ( b[0]*d2cP[ 0] + b[1]*d2cP[ 1] + b[2]*d2cP[ 2] + b[3]*d2cP[ 3]);
886 bd2cP[1] = ( b[0]*d2cP[ 4] + b[1]*d2cP[ 5] + b[2]*d2cP[ 6] + b[3]*d2cP[ 7]);
887 bd2cP[2] = ( b[0]*d2cP[ 8] + b[1]*d2cP[ 9] + b[2]*d2cP[10] + b[3]*d2cP[11]);
888 bd2cP[3] = ( b[0]*d2cP[12] + b[1]*d2cP[13] + b[2]*d2cP[14] + b[3]*d2cP[15]);
890 d2bcP[0] = ( d2b[0]*cP[ 0] + d2b[1]*cP[ 1] + d2b[2]*cP[ 2] + d2b[3]*cP[ 3]);
891 d2bcP[1] = ( d2b[0]*cP[ 4] + d2b[1]*cP[ 5] + d2b[2]*cP[ 6] + d2b[3]*cP[ 7]);
892 d2bcP[2] = ( d2b[0]*cP[ 8] + d2b[1]*cP[ 9] + d2b[2]*cP[10] + d2b[3]*cP[11]);
893 d2bcP[3] = ( d2b[0]*cP[12] + d2b[1]*cP[13] + d2b[2]*cP[14] + d2b[3]*cP[15]);
895 dbdcP[0] = ( db[0]*dcP[ 0] + db[1]*dcP[ 1] + db[2]*dcP[ 2] + db[3]*dcP[ 3]);
896 dbdcP[1] = ( db[0]*dcP[ 4] + db[1]*dcP[ 5] + db[2]*dcP[ 6] + db[3]*dcP[ 7]);
897 dbdcP[2] = ( db[0]*dcP[ 8] + db[1]*dcP[ 9] + db[2]*dcP[10] + db[3]*dcP[11]);
898 dbdcP[3] = ( db[0]*dcP[12] + db[1]*dcP[13] + db[2]*dcP[14] + db[3]*dcP[15]);
900 *val = a[0]*bcP[0] + a[1]*bcP[1] + a[2]*bcP[2] + a[3]*bcP[3];
901 grad[0] = spline->x_grid.delta_inv *
902 (da[0] *bcP[0] + da[1]*bcP[1] + da[2]*bcP[2] + da[3]*bcP[3]);
903 grad[1] = spline->y_grid.delta_inv *
904 (a[0]*dbcP[0] + a[1]*dbcP[1] + a[2]*dbcP[2] + a[3]*dbcP[3]);
905 grad[2] = spline->z_grid.delta_inv *
906 (a[0]*bdcP[0] + a[1]*bdcP[1] + a[2]*bdcP[2] + a[3]*bdcP[3]);
908 hess[0] = spline->x_grid.delta_inv * spline->x_grid.delta_inv *
909 (d2a[0]*bcP[0] + d2a[1]*bcP[1] + d2a[2]*bcP[2] + d2a[3]*bcP[3]);
911 hess[1] = spline->x_grid.delta_inv * spline->y_grid.delta_inv *
912 (da[0]*dbcP[0] + da[1]*dbcP[1] + da[2]*dbcP[2] + da[3]*dbcP[3]);
915 hess[2] = spline->x_grid.delta_inv * spline->z_grid.delta_inv *
916 (da[0]*bdcP[0] + da[1]*bdcP[1] + da[2]*bdcP[2] + da[3]*bdcP[3]);
919 hess[4] = spline->y_grid.delta_inv * spline->y_grid.delta_inv *
920 (a[0]*d2bcP[0] + a[1]*d2bcP[1] + a[2]*d2bcP[2] + a[3]*d2bcP[3]);
922 hess[5] = spline->y_grid.delta_inv * spline->z_grid.delta_inv *
923 (a[0]*dbdcP[0] + a[1]*dbdcP[1] + a[2]*dbdcP[2] + a[3]*dbdcP[3]);
926 hess[8] = spline->z_grid.delta_inv * spline->z_grid.delta_inv *
927 (a[0]*bd2cP[0] + a[1]*bd2cP[1] + a[2]*bd2cP[2] + a[3]*bd2cP[3]);