229 const unsigned int n_components)
231 Assert(n_components == 1 || n_components == dim,
233 "Number of components for interpolation must be 1 (scalar) or dim (vector)"));
236 dealii::Vector<number> value(n_components);
242 std::array<number, dim> spacing;
243 for (
unsigned int d : std::views::iota(0U, dim))
246 static_cast<number
>(this->
ic_file.n_data_points[d]);
250 std::array<dealii::types::global_dof_index, dim> lower_indices;
251 for (
unsigned int d : std::views::iota(0U, dim))
254 static_cast<dealii::types::global_dof_index
>(std::floor(point[d] / spacing[d]));
256 if (lower_indices[d] >= this->
ic_file.n_data_points[d] - 1)
258 lower_indices[d] = this->
ic_file.n_data_points[d] - 2;
263 std::array<number, dim> weights;
264 for (
unsigned int d : std::views::iota(0U, dim))
266 weights[d] = (point[d] - lower_indices[d] * spacing[d]) / spacing[d];
270 if constexpr (dim == 1)
277 auto lower_index = lower_indices[0];
281 auto node_index_0 = lower_index;
282 auto node_index_1 = lower_index + 1;
285 auto value_0 =
get_value(node_index_0, n_components);
286 auto value_1 =
get_value(node_index_1, n_components);
289 for (
unsigned int c : std::views::iota(0U, n_components))
292 value[c] = (1.0 - weights[0]) * value_0[c] + weights[0] * value_1[c];
296 else if constexpr (dim == 2)
304 auto row_length_0 = this->
ic_file.n_data_points[0];
308 auto lower_index = lower_indices[0] + (lower_indices[1] * row_length_0);
312 auto node_index_00 = lower_index;
313 auto node_index_10 = lower_index + 1;
315 auto node_index_01 = lower_index + row_length_0;
316 auto node_index_11 = lower_index + row_length_0 + 1;
319 auto value_00 =
get_value(node_index_00, n_components);
320 auto value_10 =
get_value(node_index_10, n_components);
322 auto value_01 =
get_value(node_index_01, n_components);
323 auto value_11 =
get_value(node_index_11, n_components);
326 for (
unsigned int c : std::views::iota(0U, n_components))
329 value[c] = (1.0 - weights[0]) * (1.0 - weights[1]) * value_00[c] +
330 weights[0] * (1.0 - weights[1]) * value_10[c] +
331 (1.0 - weights[0]) * weights[1] * value_01[c] +
332 weights[0] * weights[1] * value_11[c];
336 else if constexpr (dim == 3)
349 auto row_length_0 = this->
ic_file.n_data_points[0];
351 auto row_length_1 = this->
ic_file.n_data_points[1];
355 auto lower_index = lower_indices[0] + (lower_indices[1] * row_length_0) +
356 (lower_indices[2] * row_length_0 * row_length_1);
360 auto node_index_000 = lower_index;
361 auto node_index_100 = lower_index + 1;
363 auto node_index_010 = lower_index + row_length_0;
364 auto node_index_110 = lower_index + row_length_0 + 1;
366 auto node_index_001 = lower_index + (row_length_0 * row_length_1);
367 auto node_index_101 = lower_index + (row_length_0 * row_length_1) + 1;
369 auto node_index_011 = lower_index + (row_length_0 * row_length_1) + row_length_0;
370 auto node_index_111 =
371 lower_index + (row_length_0 * row_length_1) + row_length_0 + 1;
374 auto value_000 =
get_value(node_index_000, n_components);
375 auto value_100 =
get_value(node_index_100, n_components);
377 auto value_010 =
get_value(node_index_010, n_components);
378 auto value_110 =
get_value(node_index_110, n_components);
380 auto value_001 =
get_value(node_index_001, n_components);
381 auto value_101 =
get_value(node_index_101, n_components);
383 auto value_011 =
get_value(node_index_011, n_components);
384 auto value_111 =
get_value(node_index_111, n_components);
387 for (
unsigned int c : std::views::iota(0U, n_components))
391 (1.0 - weights[0]) * (1.0 - weights[1]) * (1.0 - weights[2]) * value_000[c] +
392 weights[0] * (1.0 - weights[1]) * (1.0 - weights[2]) * value_100[c] +
393 (1.0 - weights[0]) * weights[1] * (1.0 - weights[2]) * value_010[c] +
394 weights[0] * weights[1] * (1.0 - weights[2]) * value_110[c] +
395 (1.0 - weights[0]) * (1.0 - weights[1]) * weights[2] * value_001[c] +
396 weights[0] * (1.0 - weights[1]) * weights[2] * value_101[c] +
397 (1.0 - weights[0]) * weights[1] * weights[2] * value_011[c] +
398 weights[0] * weights[1] * weights[2] * value_111[c];