228 const unsigned int n_components)
230 Assert(n_components == 1 || n_components == dim,
232 "Number of components for interpolation must be 1 (scalar) or dim (vector)"));
235 dealii::Vector<number> value(n_components);
240 "Only rectangular domains are supported for binary input files"));
244 std::array<number, dim> spacing;
245 for (
unsigned int d : std::views::iota(0U, dim))
248 (mesh.
size[d]) /
static_cast<number
>(this->
ic_file.n_data_points[d] - 1);
252 std::array<dealii::types::global_dof_index, dim> lower_indices;
253 for (
unsigned int d : std::views::iota(0U, dim))
256 static_cast<dealii::types::global_dof_index
>(std::floor(point[d] / spacing[d]));
258 if (lower_indices[d] >= this->
ic_file.n_data_points[d] - 1)
260 lower_indices[d] = this->
ic_file.n_data_points[d] - 2;
265 std::array<number, dim> weights;
266 for (
unsigned int d : std::views::iota(0U, dim))
268 weights[d] = (point[d] - lower_indices[d] * spacing[d]) / spacing[d];
272 if constexpr (dim == 1)
279 auto lower_index = lower_indices[0];
283 auto node_index_0 = lower_index;
284 auto node_index_1 = lower_index + 1;
287 auto value_0 =
get_value(node_index_0, n_components);
288 auto value_1 =
get_value(node_index_1, n_components);
291 for (
unsigned int c : std::views::iota(0U, n_components))
294 value[c] = (1.0 - weights[0]) * value_0[c] + weights[0] * value_1[c];
298 else if constexpr (dim == 2)
306 auto row_length_0 = this->
ic_file.n_data_points[0];
310 auto lower_index = lower_indices[0] + (lower_indices[1] * row_length_0);
314 auto node_index_00 = lower_index;
315 auto node_index_10 = lower_index + 1;
317 auto node_index_01 = lower_index + row_length_0;
318 auto node_index_11 = lower_index + row_length_0 + 1;
321 auto value_00 =
get_value(node_index_00, n_components);
322 auto value_10 =
get_value(node_index_10, n_components);
324 auto value_01 =
get_value(node_index_01, n_components);
325 auto value_11 =
get_value(node_index_11, n_components);
328 for (
unsigned int c : std::views::iota(0U, n_components))
331 value[c] = (1.0 - weights[0]) * (1.0 - weights[1]) * value_00[c] +
332 weights[0] * (1.0 - weights[1]) * value_10[c] +
333 (1.0 - weights[0]) * weights[1] * value_01[c] +
334 weights[0] * weights[1] * value_11[c];
338 else if constexpr (dim == 3)
351 auto row_length_0 = this->
ic_file.n_data_points[0];
353 auto row_length_1 = this->
ic_file.n_data_points[1];
357 auto lower_index = lower_indices[0] + (lower_indices[1] * row_length_0) +
358 (lower_indices[2] * row_length_0 * row_length_1);
362 auto node_index_000 = lower_index;
363 auto node_index_100 = lower_index + 1;
365 auto node_index_010 = lower_index + row_length_0;
366 auto node_index_110 = lower_index + row_length_0 + 1;
368 auto node_index_001 = lower_index + (row_length_0 * row_length_1);
369 auto node_index_101 = lower_index + (row_length_0 * row_length_1) + 1;
371 auto node_index_011 = lower_index + (row_length_0 * row_length_1) + row_length_0;
372 auto node_index_111 =
373 lower_index + (row_length_0 * row_length_1) + row_length_0 + 1;
376 auto value_000 =
get_value(node_index_000, n_components);
377 auto value_100 =
get_value(node_index_100, n_components);
379 auto value_010 =
get_value(node_index_010, n_components);
380 auto value_110 =
get_value(node_index_110, n_components);
382 auto value_001 =
get_value(node_index_001, n_components);
383 auto value_101 =
get_value(node_index_101, n_components);
385 auto value_011 =
get_value(node_index_011, n_components);
386 auto value_111 =
get_value(node_index_111, n_components);
389 for (
unsigned int c : std::views::iota(0U, n_components))
393 (1.0 - weights[0]) * (1.0 - weights[1]) * (1.0 - weights[2]) * value_000[c] +
394 weights[0] * (1.0 - weights[1]) * (1.0 - weights[2]) * value_100[c] +
395 (1.0 - weights[0]) * weights[1] * (1.0 - weights[2]) * value_010[c] +
396 weights[0] * weights[1] * (1.0 - weights[2]) * value_110[c] +
397 (1.0 - weights[0]) * (1.0 - weights[1]) * weights[2] * value_001[c] +
398 weights[0] * (1.0 - weights[1]) * weights[2] * value_101[c] +
399 (1.0 - weights[0]) * weights[1] * weights[2] * value_011[c] +
400 weights[0] * weights[1] * weights[2] * value_111[c];