11 int32_t
int_3d(
float *sxax[3], int32_t snax[3], int64_t n_block,
float x[3],
12 int64_t ar_off[9],
float ar_wt[9],
float orig_wt[3] )
44 int32_t ndim = 3, base_ix[3];
45 int32_t idim, idim0, idim1, idim2;
46 int32_t int_off0, int_off1, int_off2;
47 int64_t base_off, ixoff;
48 float int_wt0, int_wt1, int_wt2;
51 for( idim = 0; idim < ndim; idim++ )
54 if( sxax[idim][0] < sxax[idim][snax[idim]-1] )
57 bounds[1] = sxax[idim][snax[idim]-1];
61 bounds[0] = sxax[idim][snax[idim]-1];
66 printf(
"%s - %d: E: a point is outside table bounds\n", __FILE__,
71 delta[idim] = sxax[idim][1] - sxax[idim][0];
72 base = (
x[idim] - sxax[idim][0] ) /
delta[idim];
76 delta[idim] = sxax[idim][2] - sxax[idim][1];
79 base_ix[idim] = (int32_t)
base;
80 frac_ix[idim] = fmod( (
double)
base, 1. );
81 orig_wt[idim] = frac_ix[idim];
84 base_off = base_ix[0] + snax[0] * ( base_ix[1] + snax[1] * base_ix[2] );
89 for( idim0 = 0; idim0 < 2; idim0++ )
91 int_wt0 = ( idim0 == 0 ) ? 1 - frac_ix[0] : frac_ix[0];
92 int_off0 = ( idim0 == 0 ) ? 0 : 1;
93 for( idim1 = 0; idim1 < 2; idim1++ )
95 int_wt1 = ( idim1 == 0 ) ? 1 - frac_ix[1] : frac_ix[1];
96 int_off1 = int_off0 + ( ( idim1 == 0 ) ? 0 : snax[0] );
97 for( idim2 = 0; idim2 < 2; idim2++ )
99 int_wt2 = ( idim2 == 0 ) ? 1 - frac_ix[2] : frac_ix[2];
100 int_off2 = int_off1 + ( ( idim2 == 0 ) ? 0 : snax[0] * snax[1] );
101 ar_off[ixoff] = n_block * ( base_off + int_off2 );
102 ar_wt[ixoff++] = int_wt2 * int_wt1 * int_wt0;