51 auto const block_dim = stop - start;
56 auto const plane_src = dimensions[2] * dimensions[1];
57 auto const lane_src = dimensions[2];
58 auto const lane_dst = block_dim[2];
59 auto const *
const src = in_array.
data();
60 auto *
const dst = out;
61 auto const n_y = stop[1] - start[1];
65 _Pragma(
"omp parallel for")
for (
int x = start[0]; x < stop[0]; ++x) {
66 for (
int y = start[1]; y < stop[1]; ++y) {
67 auto const offset_src = x * plane_src + y * lane_src + start[2];
68 auto const offset_dst =
69 (
static_cast<std::size_t
>(x - start[0]) * n_y + (y - start[1])) *
71 std::copy_n(src + offset_src, lane_dst, dst + offset_dst);
75 for_each_3d_lin<output_memory_order>(
79 Utils::get_linear_index<memory_order>(indices, dimensions);
80 assert(out_index == Utils::get_linear_index<output_memory_order>(
81 indices - start, block_dim));
83 out[out_index] = in_array[in_index];
102 auto constexpr get_real = [](
auto const &v) {
return std::real(v); };
104 auto const padded_dim = cropped_dim + pad_left + pad_right;
108 auto const plane_dst = padded_dim[2] * padded_dim[1];
109 auto const lane_dst = padded_dim[2];
110 auto const lane_src = cropped_dim[2];
111 auto *
const dst = out;
112 auto const *
const src = cropped_array.
data();
116 _Pragma(
"omp parallel for")
for (
int x = 0; x < padded_dim[0]; ++x) {
117 auto *
const plane = dst +
static_cast<std::size_t
>(x) * plane_dst;
118 if (x < pad_left[0] or x >= pad_left[0] + cropped_dim[0]) {
119 std::fill_n(plane, plane_dst, OutValue{});
122 auto const src_x = x - pad_left[0];
123 for (
int y = 0; y < padded_dim[1]; ++y) {
124 auto *
const lane = plane +
static_cast<std::size_t
>(y) * lane_dst;
125 if (y < pad_left[1] or y >= pad_left[1] + cropped_dim[1]) {
126 std::fill_n(lane, lane_dst, OutValue{});
129 auto const src_y = y - pad_left[1];
130 auto const offset_src =
131 (
static_cast<std::size_t
>(src_x) * cropped_dim[1] + src_y) *
133 std::fill_n(lane, pad_left[2], OutValue{});
134 if constexpr (std::is_floating_point_v<T>) {
135 std::copy_n(src + offset_src, lane_src, lane + pad_left[2]);
137 std::transform(src + offset_src, src + offset_src + lane_src,
138 lane + pad_left[2], get_real);
140 std::fill_n(lane + pad_left[2] + lane_src, pad_right[2], OutValue{});
145 for_each_3d_lin<memory_order>(
149 auto const out_index = Utils::get_linear_index<output_memory_order>(
150 indices + pad_left, padded_dim);
152 out[out_index] = std::real(cropped_array[in_index]);
void extract_block_into(OutValue *out, Container const &in_array, Utils::Vector3i const &dimensions, Utils::Vector3i const &start, Utils::Vector3i const &stop)
Extract a 3D block from the halo field into a caller-provided buffer.
void pad_with_zeros_discard_imag_into(OutValue *out, 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, writing into a caller-provided buffer of product(...