      for (SizeT j = 0; j < n; ++j) { //nb output points
        vres = &(res[ncontiguous * j ]);
        x = xx[j];
        if (x < 0) {
          for (SizeT i = 0; i < ncontiguous; ++i) vres[i] = missing;
        } else if (x <= n1 - 1) {
          y = yy[j];
          if (y < 0) {
            for (SizeT i = 0; i < ncontiguous; ++i) vres[i] = missing;
          } else if (y <= n2 - 1) {
            z = zz[j];
            if (z < 0) {
              for (SizeT i = 0; i < ncontiguous; ++i) vres[i] = missing;
            } else if (z <= n3 - 1) {
              ix = floor(x);
              xi[0] = ix;
              xi[1] = ix + 1;
              //make in range
              if (xi[1] < 0) xi[1] = 0; else if (xi[1] > n1 - 1) xi[1] = n1 - 1;
              dx = (x - xi[0]); umdx=1-dx;
              
              iy = floor(y);
              yi[0] = iy;
              yi[1] = iy + 1;
              //make in range
              if (yi[1] < 0) yi[1] = 0; else if (yi[1] > n2 - 1) yi[1] = n2 - 1;
              dy = (y - yi[0]); umdy=1-dy;
                
              iz = floor(z);
              zi[0] = iz;
              zi[1] = iz + 1;
              //make in range
              if (zi[1] < 0) zi[1] = 0; else if (zi[1] > n3 - 1) zi[1] = n3 - 1;
              dz = (z - zi[0]); umdz=1-dz;

              vx0y0z0 = &( array[ncontiguous * ( zi[0] * n1n2 + yi[0] * n1 + xi[0])] );
              vx1y0z0 = &( array[ncontiguous * ( zi[0] * n1n2 + yi[0] * n1 + xi[1])] );
              vx0y1z0 = &( array[ncontiguous * ( zi[0] * n1n2 + yi[1] * n1 + xi[0])] );
              vx1y1z0 = &( array[ncontiguous * ( zi[0] * n1n2 + yi[1] * n1 + xi[1])] );
              vx0y0z1 = &( array[ncontiguous * ( zi[1] * n1n2 + yi[0] * n1 + xi[0])] );
              vx1y0z1 = &( array[ncontiguous * ( zi[1] * n1n2 + yi[0] * n1 + xi[1])] );
              vx0y1z1 = &( array[ncontiguous * ( zi[1] * n1n2 + yi[1] * n1 + xi[0])] );
              vx1y1z1 = &( array[ncontiguous * ( zi[1] * n1n2 + yi[1] * n1 + xi[1])] );
              for (SizeT i = 0; i < ncontiguous; ++i) {
                double y0z0=umdx*vx0y0z0[i]+dx*vx1y0z0[i];
                double y1z0=umdx*vx0y1z0[i]+dx*vx1y1z0[i];
                double y0z1=umdx*vx0y0z1[i]+dx*vx1y0z1[i];
                double y1z1=umdx*vx0y1z1[i]+dx*vx1y1z1[i];
                double   z0=umdy*y0z0+dy*y1z0;
                double   z1=umdy*y0z1+dy*y1z1;
                vres[i] = umdz*z0+dz*z1; 
              }
            } else {
              for (SizeT i = 0; i < ncontiguous; ++i) vres[i] = missing;
            }
          } else {
            for (SizeT i = 0; i < ncontiguous; ++i) vres[i] = missing;
          }
        } else {
          for (SizeT i = 0; i < ncontiguous; ++i) vres[i] = missing;
        }
      }