42 auto const block_dim = stop - start;
43 auto const size =
static_cast<std::size_t
>(
Utils::product(block_dim));
46 std::vector<typename Container::value_type> out_array(size);
51 auto const plane_src = dimensions[2] * dimensions[1];
52 auto const lane_src = dimensions[2];
53 auto const lane_dst = block_dim[2];
54 auto src = in_array.
data();
55 auto dst = out_array.begin();
56 for (
int x = start[0]; x < stop[0]; ++x) {
57 for (
int y = start[1]; y < stop[1]; ++y) {
58 auto const offset_src = x * plane_src + y * lane_src + start[2];
59 std::copy_n(src + offset_src, lane_dst, dst);
60 std::advance(dst, lane_dst);
64 for_each_3d_lin<output_memory_order>(
68 Utils::get_linear_index<memory_order>(indices, dimensions);
69 assert(out_index == Utils::get_linear_index<output_memory_order>(
70 indices - start, block_dim));
72 out_array[out_index] = in_array[in_index];
87 using value_type =
decltype(std::real(std::declval<T>()));
88 auto constexpr get_real = [](
auto const &v) {
return std::real(v); };
90 auto const padded_dim = cropped_dim + pad_left + pad_right;
97 auto const plane_dst = padded_dim[2] * padded_dim[1];
98 auto const lane_dst = padded_dim[2];
99 auto const lane_src = cropped_dim[2];
100 auto const base_offset_dst =
101 pad_left[0] * plane_dst + pad_left[1] * lane_dst + pad_left[2];
102 auto dst = padded_array.
data();
103 auto src = cropped_array.begin();
104 for (
int x = 0; x < cropped_dim[0]; ++x) {
105 for (
int y = 0; y < cropped_dim[1]; ++y) {
106 auto const offset_dst = base_offset_dst + x * plane_dst + y * lane_dst;
107 if constexpr (std::is_floating_point_v<T>) {
108 std::copy_n(src, lane_src, dst + offset_dst);
110 std::transform(src, src + lane_src, dst + offset_dst, get_real);
112 std::advance(src, lane_src);
116 for_each_3d_lin<memory_order>(
120 auto const out_index = Utils::get_linear_index<output_memory_order>(
121 indices + pad_left, padded_dim);
123 padded_array[out_index] = std::real(cropped_array[in_index]);
auto pad_with_zeros_discard_imag(std::span< T > cropped_array, Utils::Vector3i const &cropped_dim, Utils::Vector3i const &pad_left, Utils::Vector3i const &pad_right)
Pad a 3D matrix with zeros to restore halo regions.