OpenLB 1.8.1
Loading...
Searching...
No Matches
interpolation3d.h
Go to the documentation of this file.
1/* This file is part of the OpenLB library
2 *
3 * Copyright (C) 2023-24 Julius Jessberger
4 * E-mail contact: info@openlb.net
5 * The most recent release of OpenLB can be downloaded at
6 * <http://www.openlb.net/>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
22*/
23
24#ifndef INTERPOLATION_3D_H
25#define INTERPOLATION_3D_H
26
27#include "core/vector.h"
28
29namespace olb {
30
36// Caution: Developer has to guarantee that the data are accessible.
37template <unsigned DataDim, typename CELL, typename RESULT, typename F, typename V = typename CELL::value_t>
38void interpolate3d(CELL& cell, RESULT& result, const Vector<V,3> distance, F f) any_platform
39{
40 const Vector<int,3> floorV (util::floor(distance[0]),
41 util::floor(distance[1]), util::floor(distance[2]));
42 Vector<Vector<int,3>,8> surroundingPoints (floorV);
43 surroundingPoints[1][0] += 1;
44 surroundingPoints[2][1] += 1;
45 surroundingPoints[3][2] += 1;
46 surroundingPoints[4][0] += 1; surroundingPoints[4][1] += 1;
47 surroundingPoints[5][0] += 1; surroundingPoints[5][2] += 1;
48 surroundingPoints[6][1] += 1; surroundingPoints[6][2] += 1;
49 surroundingPoints[7][0] += 1; surroundingPoints[7][1] += 1; surroundingPoints[7][2] += 1;
50
51 V resNeighbor[DataDim];
52 for (unsigned i=0; i<DataDim; ++i) {
53 result[i] = V();
54 }
55 for (auto point : surroundingPoints) {
56 const Vector<V,3> dist = distance - point;
57 const V weight = (V(1) - util::abs(dist[0])) * (V(1) - util::abs(dist[1]))
58 * (V(1) - util::abs(dist[2]));
59 f(cell.neighbor(point), resNeighbor);
60 for (unsigned i = 0; i < DataDim; ++i) {
61 result[i] += weight * resNeighbor[i];
62 }
63 }
64}
65
67template <unsigned DataDim, typename CELL, typename RESULT, typename F, typename V = typename CELL::value_t>
68void interpolate3d_help_li(CELL& cell, RESULT& result, const Vector<V,3> distance, F f,
70{
71 const Vector<Vector<V,3>,3> v {pointB - pointA,
72 pointC - pointA,
73 pointD - pointA};
74 const V det = util::determinant(v[0], v[1], v[2]);
75 OLB_PRECONDITION (det != 0);
76
77 // linear interpolation
78 const auto lc = util::solveLinearSystem_help(v[0], v[1], v[2],
79 distance - pointA, det);
80 // evaluate linear function
81 for (unsigned i=0; i<DataDim; ++i) {
82 result[i] = V();
83 }
84 V resNeighbor[DataDim];
85 f(cell.neighbor(pointA), resNeighbor);
86 for (unsigned i = 0; i < DataDim; ++i) {
87 result[i] += (1 - lc[0] - lc[1] - lc[2]) * resNeighbor[i];
88 }
89 f(cell.neighbor(pointB), resNeighbor);
90 for (unsigned i = 0; i < DataDim; ++i) {
91 result[i] += lc[0] * resNeighbor[i];
92 }
93 f(cell.neighbor(pointC), resNeighbor);
94 for (unsigned i = 0; i < DataDim; ++i) {
95 result[i] += lc[1] * resNeighbor[i];
96 }
97 f(cell.neighbor(pointD), resNeighbor);
98 for (unsigned i = 0; i < DataDim; ++i) {
99 result[i] += lc[2] * resNeighbor[i];
100 }
101}
102
104// it is expected that point C lies diagonally opposite to pointA
105template <unsigned DataDim, typename CELL, typename RESULT, typename F, typename V = typename CELL::value_t>
106void interpolate3d_help_plane(CELL& cell, RESULT& result, const Vector<V,3> distance, F f,
108{
109 const Vector<Vector<V,3>,3> v {pointB - pointA,
110 pointC - pointA,
111 pointD - pointA};
112 // bilinear interpolation in plane (constant in other direction)
113 const auto normal = crossProduct3D(v[0], v[1]);
114 const auto nLenSq = norm_squared(normal);
115 const auto projBase = distance - pointA
116 - (((distance - pointA)*normal)/nLenSq)*normal;
117
118 const V w0 = projBase* v[0] / norm_squared(v[0]);
119 const V w1 = projBase* v[2] / norm_squared(v[2]);
120
121 // evaluate bilinear function
122 for (unsigned i=0; i<DataDim; ++i) {
123 result[i] = V();
124 }
125 V resNeighbor[DataDim];
126 f(cell.neighbor(pointA), resNeighbor);
127 for (unsigned i = 0; i < DataDim; ++i) {
128 result[i] += (1-w0) * (1-w1) * resNeighbor[i];
129 }
130 f(cell.neighbor(pointC), resNeighbor);
131 for (unsigned i = 0; i < DataDim; ++i) {
132 result[i] += w0 * w1 * resNeighbor[i];
133 }
134 f(cell.neighbor(pointB), resNeighbor);
135 for (unsigned i = 0; i < DataDim; ++i) {
136 result[i] += w0 * (1-w1) * resNeighbor[i];
137 }
138 f(cell.neighbor(pointD), resNeighbor);
139 for (unsigned i = 0; i < DataDim; ++i) {
140 result[i] += (1-w0) * w1 * resNeighbor[i];
141 }
142}
143
145template <unsigned DataDim, typename CELL, typename RESULT, typename F, typename V = typename CELL::value_t>
146void interpolate3d_help(CELL& cell, RESULT& result, const Vector<V,3> distance, F f,
148{
149 const Vector<V,3> v1 = pointB - pointA;
150 const Vector<V,3> v2 = pointC - pointA;
151 const Vector<V,3> v = distance - pointA;
152 const auto normal = crossProduct3D(v1, v2);
153 const auto nLenSq = norm_squared(normal);
154 const auto lc = util::solveLinearSystem(v1, v2, normal,
155 v - ((v*normal)/nLenSq)*normal); // v projected to plane
156 // evaluate linear function
157 for (unsigned i=0; i<DataDim; ++i) {
158 result[i] = V();
159 }
160 V resNeighbor[DataDim];
161 f(cell.neighbor(pointA), resNeighbor);
162 for (unsigned i = 0; i < DataDim; ++i) {
163 result[i] += (1 - lc[0] - lc[1]) * resNeighbor[i];
164 }
165 f(cell.neighbor(pointB), resNeighbor);
166 for (unsigned i = 0; i < DataDim; ++i) {
167 result[i] += lc[0] * resNeighbor[i];
168 }
169 f(cell.neighbor(pointC), resNeighbor);
170 for (unsigned i = 0; i < DataDim; ++i) {
171 result[i] += lc[1] * resNeighbor[i];
172 }
173}
174
176// Cf. https://en.wikipedia.org/wiki/Vector_projection
177template <unsigned DataDim, typename CELL, typename RESULT, typename F, typename V = typename CELL::value_t>
178void interpolate3d_help(CELL& cell, RESULT& result, const Vector<V,3> distance, F f,
180{
181 const V refDistanceSq = norm_squared(Vector<V,3>(pointA - pointB));
182 const V alpha = ((distance - pointB) * (pointA - pointB)) / refDistanceSq;
183 for (unsigned i=0; i<DataDim; ++i) {
184 result[i] = V();
185 }
186 V resNeighbor[DataDim];
187 f(cell.neighbor(pointA), resNeighbor);
188 for (unsigned i = 0; i < DataDim; ++i) {
189 result[i] += alpha * resNeighbor[i];
190 }
191 f(cell.neighbor(pointB), resNeighbor);
192 for (unsigned i = 0; i < DataDim; ++i) {
193 result[i] += (1 - alpha) * resNeighbor[i];
194 }
195}
196
208// Caution: Developer has to guarantee that function is evaluable for all other
209// neighbor points on the lattice.
210template <unsigned NEIGHBORS, unsigned DataDim, typename CELL, typename RESULT, typename F, typename V = typename CELL::value_t>
211void interpolate3d(CELL& cell, RESULT& result, const Vector<V,3> distance, F f) any_platform
212{
213 // eight neighbors: trilinear interpolation
214 if constexpr (NEIGHBORS == 11111111) {
215 interpolate3d<DataDim,CELL,RESULT,F,V>(cell, result, distance, f);
216 }
217
218 // four neighbors (coplanar)
219 else if constexpr (NEIGHBORS == 1111) {
220 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
221 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
222 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
223 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
224 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
225 } else if constexpr (NEIGHBORS == 11110000) {
226 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
227 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
228 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
229 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
230 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
231 } else if constexpr (NEIGHBORS == 1010101) {
232 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
233 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
234 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
235 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
236 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
237 } else if constexpr (NEIGHBORS == 10101010) {
238 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
239 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
240 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
241 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
242 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
243 } else if constexpr (NEIGHBORS == 110011) {
244 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
245 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
246 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
247 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
248 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
249 } else if constexpr (NEIGHBORS == 11001100) {
250 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
251 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
252 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
253 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
254 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
255 } else if constexpr (NEIGHBORS == 10011001) {
256 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
257 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
258 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
259 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
260 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
261 } else if constexpr (NEIGHBORS == 1100110) {
262 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
263 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
264 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
265 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
266 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
267 } else if constexpr (NEIGHBORS == 10100101) {
268 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
269 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
270 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
271 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
272 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
273 } else if constexpr ((NEIGHBORS == 1011010) || (NEIGHBORS == 11011010)) {
274 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
275 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
276 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
277 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
278 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
279 } else if constexpr (NEIGHBORS == 11000011) {
280 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
281 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
282 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
283 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
284 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
285 } else if constexpr (NEIGHBORS == 111100) {
286 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
287 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
288 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
289 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
290 interpolate3d_help_plane<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
291 }
292
293 // three neighbors
294 else if constexpr (NEIGHBORS == 111) {
295 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
296 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
297 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
298 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
299 } else if constexpr (NEIGHBORS == 1011) {
300 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
301 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
302 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
303 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
304 } else if constexpr (NEIGHBORS == 1101) {
305 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
306 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
307 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
308 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
309 } else if constexpr (NEIGHBORS == 10011) {
310 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
311 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
312 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
313 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
314 } else if constexpr (NEIGHBORS == 10101) {
315 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
316 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
317 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
318 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
319 } else if constexpr (NEIGHBORS == 11001) {
320 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
321 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
322 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
323 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
324 } else if constexpr (NEIGHBORS == 100011) {
325 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
326 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
327 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
328 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
329 } else if constexpr (NEIGHBORS == 100101) {
330 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
331 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
332 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
333 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
334 } else if constexpr (NEIGHBORS == 101001) {
335 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
336 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
337 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
338 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
339 } else if constexpr (NEIGHBORS == 110001) {
340 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
341 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
342 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
343 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
344 } else if constexpr (NEIGHBORS == 1000011) {
345 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
346 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
347 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
348 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
349 } else if constexpr (NEIGHBORS == 1000101) {
350 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
351 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
352 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
353 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
354 } else if constexpr (NEIGHBORS == 1001001) {
355 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
356 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
357 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
358 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
359 } else if constexpr (NEIGHBORS == 1010001) {
360 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
361 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
362 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
363 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
364 } else if constexpr (NEIGHBORS == 1100001) {
365 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
366 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
367 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
368 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
369 } else if constexpr (NEIGHBORS == 10000011) {
370 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
371 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
372 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
373 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
374 } else if constexpr (NEIGHBORS == 10000101) {
375 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
376 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
377 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
378 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
379 } else if constexpr (NEIGHBORS == 10001001) {
380 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
381 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
382 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
383 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
384 } else if constexpr (NEIGHBORS == 10010001) {
385 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
386 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
387 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
388 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
389 } else if constexpr (NEIGHBORS == 10010001) {
390 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
391 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
392 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
393 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
394 } else if constexpr (NEIGHBORS == 10100001) {
395 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
396 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
397 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
398 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
399 } else if constexpr (NEIGHBORS == 11000001) {
400 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
401 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
402 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
403 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
404 } else if constexpr (NEIGHBORS == 1110) {
405 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
406 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
407 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
408 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
409 } else if constexpr (NEIGHBORS == 10110) {
410 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
411 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
412 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
413 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
414 } else if constexpr (NEIGHBORS == 11010) {
415 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
416 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
417 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
418 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
419 } else if constexpr (NEIGHBORS == 100110) {
420 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
421 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
422 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
423 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
424 } else if constexpr (NEIGHBORS == 101010) {
425 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
426 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
427 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
428 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
429 } else if constexpr (NEIGHBORS == 110010) {
430 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
431 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
432 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
433 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
434 } else if constexpr (NEIGHBORS == 1000110) {
435 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
436 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
437 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
438 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
439 } else if constexpr (NEIGHBORS == 1001010) {
440 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
441 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
442 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
443 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
444 } else if constexpr (NEIGHBORS == 1010010) {
445 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
446 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
447 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
448 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
449 } else if constexpr (NEIGHBORS == 1100010) {
450 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
451 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
452 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
453 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
454 } else if constexpr (NEIGHBORS == 10000110) {
455 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
456 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
457 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
458 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
459 } else if constexpr (NEIGHBORS == 10001010) {
460 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
461 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
462 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
463 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
464 } else if constexpr (NEIGHBORS == 10010010) {
465 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
466 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
467 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
468 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
469 } else if constexpr (NEIGHBORS == 10100010) {
470 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
471 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
472 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
473 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
474 } else if constexpr (NEIGHBORS == 11000010) {
475 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
476 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
477 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
478 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
479 } else if constexpr (NEIGHBORS == 11100) {
480 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
481 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
482 const Vector<int,3> pointC (util::floor(distance[0]+1), util::floor(distance[1]+1), util::floor(distance[2]));
483 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
484 } else if constexpr (NEIGHBORS == 101100) {
485 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
486 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
487 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]+1), util::floor(distance[2]));
488 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
489 } else if constexpr (NEIGHBORS == 110100) {
490 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
491 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
492 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]+1), util::floor(distance[2]));
493 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
494 } else if constexpr (NEIGHBORS == 1001100) {
495 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
496 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
497 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
498 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
499 } else if constexpr (NEIGHBORS == 1010100) {
500 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
501 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
502 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
503 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
504 } else if constexpr (NEIGHBORS == 1100100) {
505 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
506 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
507 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
508 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
509 } else if constexpr (NEIGHBORS == 10001100) {
510 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
511 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
512 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
513 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
514 } else if constexpr (NEIGHBORS == 10010100) {
515 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
516 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
517 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
518 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
519 } else if constexpr (NEIGHBORS == 10100100) {
520 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
521 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
522 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
523 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
524 } else if constexpr (NEIGHBORS == 11000100) {
525 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
526 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
527 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
528 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
529 } else if constexpr (NEIGHBORS == 111000) {
530 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
531 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
532 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
533 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
534 } else if constexpr (NEIGHBORS == 1011000) {
535 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
536 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
537 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
538 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
539 } else if constexpr (NEIGHBORS == 1101000) {
540 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
541 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
542 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
543 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
544 } else if constexpr (NEIGHBORS == 10011000) {
545 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
546 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
547 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
548 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
549 } else if constexpr (NEIGHBORS == 10101000) {
550 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
551 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
552 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
553 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
554 } else if constexpr (NEIGHBORS == 11001000) {
555 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
556 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
557 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
558 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
559 } else if constexpr (NEIGHBORS == 1110000) {
560 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
561 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
562 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
563 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
564 } else if constexpr (NEIGHBORS == 10110000) {
565 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
566 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
567 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
568 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
569 } else if constexpr (NEIGHBORS == 11010000) {
570 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
571 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
572 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
573 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
574 } else if constexpr (NEIGHBORS == 11100000) {
575 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
576 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
577 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
578 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC);
579 }
580
581 // two neighbors
582 else if constexpr (NEIGHBORS == 11) {
583 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
584 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
585 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
586 } else if constexpr (NEIGHBORS == 101) {
587 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
588 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
589 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
590 } else if constexpr (NEIGHBORS == 1001) {
591 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
592 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
593 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
594 } else if constexpr (NEIGHBORS == 10001) {
595 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
596 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
597 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
598 } else if constexpr (NEIGHBORS == 100001) {
599 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
600 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
601 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
602 } else if constexpr (NEIGHBORS == 1000001) {
603 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
604 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
605 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
606 } else if constexpr (NEIGHBORS == 10000001) {
607 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
608 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
609 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
610 } else if constexpr (NEIGHBORS == 110) {
611 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
612 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
613 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
614 } else if constexpr (NEIGHBORS == 1010) {
615 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
616 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
617 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
618 } else if constexpr (NEIGHBORS == 10010) {
619 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
620 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
621 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
622 } else if constexpr (NEIGHBORS == 100010) {
623 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
624 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
625 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
626 } else if constexpr (NEIGHBORS == 1000010) {
627 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
628 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
629 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
630 } else if constexpr (NEIGHBORS == 10000010) {
631 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
632 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
633 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
634 } else if constexpr (NEIGHBORS == 1100) {
635 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
636 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
637 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
638 } else if constexpr (NEIGHBORS == 10100) {
639 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
640 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
641 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
642 } else if constexpr (NEIGHBORS == 100100) {
643 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
644 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
645 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
646 } else if constexpr (NEIGHBORS == 1000100) {
647 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
648 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
649 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
650 } else if constexpr (NEIGHBORS == 10000100) {
651 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
652 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
653 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
654 } else if constexpr (NEIGHBORS == 11000) {
655 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
656 const Vector<int,3> pointB (util::floor(distance[0]+1), util::floor(distance[1]+1), util::floor(distance[2]));
657 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
658 } else if constexpr (NEIGHBORS == 101000) {
659 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
660 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]+1), util::floor(distance[2]));
661 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
662 } else if constexpr (NEIGHBORS == 1001000) {
663 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
664 const Vector<int,3> pointB (util::floor(distance[0]+1), util::floor(distance[1]), util::floor(distance[2]));
665 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
666 } else if constexpr (NEIGHBORS == 10001000) {
667 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
668 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
669 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
670 } else if constexpr (NEIGHBORS == 110000) {
671 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
672 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]+1), util::floor(distance[2]));
673 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
674 } else if constexpr (NEIGHBORS == 1010000) {
675 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
676 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
677 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
678 } else if constexpr (NEIGHBORS == 10010000) {
679 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
680 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
681 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
682 } else if constexpr (NEIGHBORS == 1100000) {
683 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
684 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
685 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
686 } else if constexpr (NEIGHBORS == 10100000) {
687 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
688 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
689 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
690 } else if constexpr (NEIGHBORS == 11000000) {
691 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
692 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
693 interpolate3d_help<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB);
694 }
695 // one neighbor: constant extrapolation
696 else if constexpr (NEIGHBORS == 1) {
697 const Vector<int,3> point (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
698 f(cell.neighbor(point), result);
699 } else if constexpr (NEIGHBORS == 10) {
700 const Vector<int,3> point (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
701 f(cell.neighbor(point), result);
702 } else if constexpr (NEIGHBORS == 100) {
703 const Vector<int,3> point (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
704 f(cell.neighbor(point), result);
705 } else if constexpr (NEIGHBORS == 1000) {
706 const Vector<int,3> point (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
707 f(cell.neighbor(point), result);
708 } else if constexpr (NEIGHBORS == 10000) {
709 const Vector<int,3> point (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
710 f(cell.neighbor(point), result);
711 } else if constexpr (NEIGHBORS == 100000) {
712 const Vector<int,3> point (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
713 f(cell.neighbor(point), result);
714 } else if constexpr (NEIGHBORS == 1000000) {
715 const Vector<int,3> point (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
716 f(cell.neighbor(point), result);
717 } else if constexpr (NEIGHBORS == 10000000) {
718 const Vector<int,3> point (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
719 f(cell.neighbor(point), result);
720 }
721
722 // four or more linearly independent neighbors: linear interpolation (use at most four points)
723 else if constexpr ((NEIGHBORS % 100000 == 10111) || (NEIGHBORS % 100000 == 11111)) {
724 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
725 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
726 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
727 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
728 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
729 } else if constexpr ((NEIGHBORS % 1000000 == 100111) || (NEIGHBORS % 1000000 == 101111)) {
730 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
731 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
732 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
733 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
734 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
735 } else if constexpr ((NEIGHBORS == 1000111) || (NEIGHBORS == 11000111) || (NEIGHBORS == 11001111) || (NEIGHBORS == 1001111)) {
736 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
737 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
738 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
739 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
740 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
741 } else if constexpr ((NEIGHBORS == 10000111) || (NEIGHBORS == 10001111)) {
742 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
743 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
744 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
745 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
746 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
747 }
748 else if constexpr (NEIGHBORS % 100000 == 11011) {
749 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
750 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
751 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
752 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
753 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
754 } else if constexpr (NEIGHBORS % 1000000 == 101011) {
755 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
756 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
757 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
758 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
759 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
760 } else if constexpr ((NEIGHBORS == 1001011) || (NEIGHBORS == 11001011)) {
761 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
762 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
763 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
764 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
765 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
766 } else if constexpr (NEIGHBORS == 10001011) {
767 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
768 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
769 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
770 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
771 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
772 }
773 else if constexpr (NEIGHBORS % 100000 == 11101) {
774 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
775 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
776 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
777 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
778 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
779 } else if constexpr (NEIGHBORS % 1000000 == 101101) {
780 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
781 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
782 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
783 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
784 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
785 } else if constexpr ((NEIGHBORS == 1001101) || (NEIGHBORS == 11001101)) {
786 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
787 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
788 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
789 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
790 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
791 } else if constexpr (NEIGHBORS == 10001101) {
792 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
793 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
794 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
795 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
796 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
797 }
798 else if constexpr (NEIGHBORS % 100000 == 11110) {
799 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
800 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
801 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
802 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
803 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
804 } else if constexpr (NEIGHBORS % 1000000 == 101110) {
805 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
806 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
807 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
808 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
809 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
810 } else if constexpr ((NEIGHBORS == 1001110) || (NEIGHBORS == 11001110)) {
811 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
812 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
813 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
814 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
815 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
816 } else if constexpr (NEIGHBORS == 10001110) {
817 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
818 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
819 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
820 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
821 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
822 }
823 else if constexpr (NEIGHBORS == 11101000) {
824 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
825 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
826 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
827 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
828 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
829 } else if constexpr (NEIGHBORS == 11100100) {
830 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
831 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
832 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
833 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
834 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
835 } else if constexpr (NEIGHBORS == 11100010) {
836 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
837 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
838 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
839 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
840 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
841 } else if constexpr (NEIGHBORS == 11100001) {
842 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
843 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
844 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
845 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
846 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
847 }
848 else if constexpr (NEIGHBORS == 11011000) {
849 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
850 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
851 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
852 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
853 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
854 } else if constexpr (NEIGHBORS == 11010100) {
855 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
856 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
857 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
858 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
859 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
860 } else if constexpr ((NEIGHBORS == 11010010) || (NEIGHBORS == 11110010)) {
861 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
862 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
863 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
864 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
865 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
866 } else if constexpr (NEIGHBORS == 11010001) {
867 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
868 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
869 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
870 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
871 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
872 }
873 else if constexpr (NEIGHBORS == 10111000) {
874 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
875 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
876 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
877 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
878 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
879 } else if constexpr (NEIGHBORS == 10110100) {
880 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
881 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
882 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
883 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
884 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
885 } else if constexpr (NEIGHBORS == 10110010) {
886 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
887 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
888 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
889 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
890 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
891 } else if constexpr (NEIGHBORS == 10110001) {
892 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
893 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
894 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
895 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
896 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
897 }
898 else if constexpr ((NEIGHBORS == 1111000) || (NEIGHBORS == 11111000)) {
899 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
900 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
901 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
902 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
903 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
904 } else if constexpr ((NEIGHBORS == 1110100) || (NEIGHBORS == 11110100)) {
905 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
906 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
907 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
908 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
909 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
910 } else if constexpr (NEIGHBORS == 1110010) {
911 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
912 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
913 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
914 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
915 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
916 } else if constexpr ((NEIGHBORS == 1110001) || (NEIGHBORS == 11110001)) {
917 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
918 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
919 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
920 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
921 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
922 }
923 else if constexpr (NEIGHBORS == 10101100) {
924 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
925 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
926 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
927 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
928 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
929 } else if constexpr (NEIGHBORS == 10101001) {
930 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
931 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
932 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
933 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
934 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
935 }
936 else if constexpr ((NEIGHBORS == 10100110) || (NEIGHBORS == 11100110)) {
937 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
938 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
939 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
940 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
941 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
942 } else if constexpr (NEIGHBORS == 10100011) {
943 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
944 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
945 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
946 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
947 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
948 }
949 else if constexpr (NEIGHBORS == 11001010) {
950 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
951 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
952 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
953 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
954 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
955 } else if constexpr (NEIGHBORS == 10011010) {
956 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
957 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
958 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
959 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
960 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
961 }
962 else if constexpr ((NEIGHBORS == 1101010) || (NEIGHBORS == 11101010)) {
963 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
964 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
965 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
966 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
967 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
968 } else if constexpr (NEIGHBORS % 1000000 == 111010) {
969 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
970 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
971 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
972 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
973 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
974 }
975 else if constexpr ((NEIGHBORS == 1011100) || (NEIGHBORS == 1111100) || (NEIGHBORS == 11111100) || (NEIGHBORS == 11011100)) {
976 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
977 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
978 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
979 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
980 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
981 } else if constexpr ((NEIGHBORS == 1010110) || (NEIGHBORS == 11010110)) {
982 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
983 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
984 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
985 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
986 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
987 }
988 else if constexpr ((NEIGHBORS == 1011001) || (NEIGHBORS == 11011001)) {
989 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
990 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
991 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
992 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
993 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
994 } else if constexpr ((NEIGHBORS == 1010011) || (NEIGHBORS == 1110011) || (NEIGHBORS == 11110011) || (NEIGHBORS == 11010011)) {
995 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
996 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
997 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
998 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
999 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1000 }
1001 else if constexpr (NEIGHBORS == 11000101) {
1002 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
1003 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
1004 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
1005 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
1006 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1007 } else if constexpr ((NEIGHBORS == 1100101) || (NEIGHBORS == 11100101)) {
1008 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
1009 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
1010 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
1011 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
1012 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1013 }
1014 else if constexpr ((NEIGHBORS == 10010101) || (NEIGHBORS == 11010101)) {
1015 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
1016 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
1017 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
1018 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
1019 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1020 } else if constexpr (NEIGHBORS % 1000000 == 110101) {
1021 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
1022 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
1023 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
1024 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
1025 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1026 }
1027 else if constexpr (NEIGHBORS == 11001001) {
1028 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
1029 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
1030 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
1031 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
1032 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1033 } else if constexpr (NEIGHBORS == 11000110) {
1034 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
1035 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
1036 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
1037 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
1038 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1039 } else if constexpr ((NEIGHBORS == 10011100) || (NEIGHBORS == 10111100)) {
1040 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
1041 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
1042 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
1043 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
1044 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1045 } else if constexpr ((NEIGHBORS == 1101100) || (NEIGHBORS == 11101100)) {
1046 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
1047 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
1048 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
1049 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
1050 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1051 } else if constexpr (NEIGHBORS % 1000000 == 110110) {
1052 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
1053 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
1054 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
1055 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
1056 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1057 } else if constexpr (NEIGHBORS % 1000000 == 111001) {
1058 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
1059 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
1060 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
1061 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
1062 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1063 } else if constexpr ((NEIGHBORS == 1100011) || (NEIGHBORS == 11100011)) {
1064 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
1065 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
1066 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
1067 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
1068 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1069 } else if constexpr ((NEIGHBORS == 10010011) || (NEIGHBORS == 10110011)) {
1070 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
1071 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
1072 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
1073 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
1074 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1075 }
1076 else if constexpr (NEIGHBORS == 10010110) {
1077 const Vector<int,3> pointA (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2]));
1078 const Vector<int,3> pointB (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2]));
1079 const Vector<int,3> pointC (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2])+1);
1080 const Vector<int,3> pointD (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2])+1);
1081 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1082 } else if constexpr ((NEIGHBORS == 1101001) || (NEIGHBORS == 11101001)) {
1083 const Vector<int,3> pointA (util::floor(distance[0])+1, util::floor(distance[1]), util::floor(distance[2]));
1084 const Vector<int,3> pointB (util::floor(distance[0]), util::floor(distance[1])+1, util::floor(distance[2]));
1085 const Vector<int,3> pointC (util::floor(distance[0]), util::floor(distance[1]), util::floor(distance[2])+1);
1086 const Vector<int,3> pointD (util::floor(distance[0])+1, util::floor(distance[1])+1, util::floor(distance[2])+1);
1087 interpolate3d_help_li<DataDim,CELL,RESULT,F,V>(cell, result, distance, f, pointA, pointB, pointC, pointD);
1088 }
1089
1090 else {
1091 std::string s = "Invalid NEIGHBORS" + std::to_string(NEIGHBORS);
1092 throw std::invalid_argument(s);
1093 }
1094}
1095
1098template <unsigned NEIGHBORS, typename FIELD, typename CELL, typename RESULT, typename V = typename CELL::value_t>
1099void interpolate3d(CELL& cell, RESULT& result, const Vector<V,3> distance) any_platform
1100{
1102 constexpr unsigned DataDim = CELL::descriptor_t::template size<FIELD>();
1103 auto f = [DataDim](const auto& c, RESULT& res) -> void {
1104 for (unsigned i = 0; i < DataDim; ++i) {
1105 res[i] = c.template getFieldComponent<FIELD>(i);
1106 }
1107 };
1109}
1110
1112template <typename FIELD, typename CELL, typename RESULT, typename V = typename CELL::value_t>
1113void interpolate3d(CELL& cell, RESULT& result, const Vector<V,3> distance) any_platform
1114{
1115 interpolate3d<11111111,FIELD,CELL,RESULT,V>(cell, result, distance);
1116}
1117
1118}
1119
1120#endif
Plain old scalar vector.
Vector< T, 3 > solveLinearSystem_help(const Vector< T, 3 > &a0, const Vector< T, 3 > &a1, const Vector< T, 3 > &a2, const Vector< T, 3 > &rhs, T det)
ADf< T, DIM > abs(const ADf< T, DIM > &a)
Definition aDiff.h:1019
ADf< T, DIM > floor(const ADf< T, DIM > &a)
Definition aDiff.h:869
auto solveLinearSystem(const Matrix< T, 2, 2 > &a, const Vector< T, 2 > &rhs)
Solve a * x = rhs.
Definition matrix.h:158
constexpr auto determinant(const Matrix< T, 2, 2 > &m)
Definition matrix.h:143
Top level namespace for all of OpenLB.
constexpr T norm_squared(const ScalarVector< T, D, IMPL > &a) any_platform
Squared euclidean vector norm.
void interpolate3d(CELL &cell, RESULT &result, const Vector< V, 3 > distance, F f) any_platform
trilinear interpolation of function f
void interpolate3d_help_plane(CELL &cell, RESULT &result, const Vector< V, 3 > distance, F f, Vector< int, 3 > pointA, Vector< int, 3 > pointB, Vector< int, 3 > pointC, Vector< int, 3 > pointD) any_platform
Interpolation between four points (coplanar case)
void interpolate3d_help(CELL &cell, RESULT &result, const Vector< V, 3 > distance, F f, Vector< int, 3 > pointA, Vector< int, 3 > pointB, Vector< int, 3 > pointC) any_platform
Linear interpolation between three points (constant in the orthogonal direction)
void interpolate3d_help_li(CELL &cell, RESULT &result, const Vector< V, 3 > distance, F f, Vector< int, 3 > pointA, Vector< int, 3 > pointB, Vector< int, 3 > pointC, Vector< int, 3 > pointD) any_platform
Interpolation between four points (linear independent case)
constexpr Vector< T, 3 > crossProduct3D(const ScalarVector< T, 3, IMPL > &a, const ScalarVector< T, 3, IMPL_ > &b) any_platform
Definition vector.h:263
#define OLB_PRECONDITION(COND)
Definition olbDebug.h:46
#define any_platform
Define preprocessor macros for device-side functions, constant storage.
Definition platform.h:77
efficient implementation of a vector class