35 auto edges = get_edges();
38 auto &sim_box = edges.sim_box.value;
39 auto &ghost_layers_candidates = edges.ghost_layers_candidates;
42 auto &ghost_layer = edges.ghost_layer;
44 auto dev_sched = shamsys::instance::get_compute_scheduler_ptr();
47 auto paving_function = get_paving(mode, sim_box);
50 u32 iblock_min = ghost_layer_layout->get_field_idx<TgridVec>(
"cell_min");
51 u32 iblock_max = ghost_layer_layout->get_field_idx<TgridVec>(
"cell_max");
54 auto ghost_layer_it = ghost_layer.patchdatas.begin();
55 auto ghost_layer_info_it = ghost_layers_candidates.values.begin();
57 if (ghost_layer.patchdatas.get_element_count()
58 != ghost_layers_candidates.values.get_element_count()) {
60 "ghost_layer.patchdatas.get_element_count() != "
61 "ghost_layers_candidates.values.get_element_count()\n "
62 "ghost_layer.patchdatas.get_element_count(): {}\n"
63 "ghost_layers_candidates.values.get_element_count(): {}",
64 ghost_layer.patchdatas.get_element_count(),
65 ghost_layers_candidates.values.get_element_count()));
69 for (; ghost_layer_it != ghost_layer.patchdatas.end();
70 ++ghost_layer_it, ++ghost_layer_info_it) {
72 auto [sender, receiver] = ghost_layer_it->first;
75 auto &sender_ghost_layer_info = ghost_layer_info_it->second;
77 auto &block_min_buf = ghost_layer_element.get_field<TgridVec>(iblock_min).get_buf();
78 auto &block_max_buf = ghost_layer_element.get_field<TgridVec>(iblock_max).get_buf();
79 auto xoff = sender_ghost_layer_info.xoff;
80 auto yoff = sender_ghost_layer_info.yoff;
81 auto zoff = sender_ghost_layer_info.zoff;
87 ghost_layer_element.get_obj_cnt(),
88 [paving_function, xoff, yoff, zoff](
89 u32 i, TgridVec *__restrict block_min, TgridVec *__restrict block_max) {
92 block_box = paving_function.f_aabb(block_box, xoff, yoff, zoff);
94 block_min[i] = block_box.
lower;
95 block_max[i] = block_box.
upper;
103 static constexpr u32 block_size = AMRBlock::block_size;
104 static constexpr u32 expected_nvar = AMRBlock::block_size;
107 auto compute_field_var_permut = [&paving_function, xoff, yoff, zoff]() -> std::vector<u32> {
109 std::array<std::array<u32, dim>, block_size> coord_list = {};
110 for (
u32 i = 0; i < block_size; i++) {
111 coord_list[i] = AMRBlock::get_coord(i);
115 std::array<TgridVec, block_size> coord_list_transformed = {};
116 for (
u32 i = 0; i < block_size; i++) {
117 TgridVec coord = {coord_list[i][0], coord_list[i][1], coord_list[i][2]};
118 coord_list_transformed[i] = paving_function.f(coord, xoff, yoff, zoff);
122 TgridVec min_coord = coord_list_transformed[0];
123 TgridVec max_coord = coord_list_transformed[0];
124 for (
u32 i = 1; i < block_size; i++) {
125 min_coord = sham::min(min_coord, coord_list_transformed[i]);
126 max_coord = sham::max(max_coord, coord_list_transformed[i]);
130 std::vector<u32> permut(block_size);
131 for (
u32 i = 0; i < block_size; i++) {
132 TgridVec new_coord = coord_list_transformed[i] - min_coord;
133 std::array<u32, dim> new_coord_arr
134 = {
static_cast<u32>(new_coord[0]),
135 static_cast<u32>(new_coord[1]),
136 static_cast<u32>(new_coord[2])};
137 permut[i] = AMRBlock::get_index(new_coord_arr);
143 std::vector<u32> permut = compute_field_var_permut();
146 auto apply_permut = [&](
auto &field) {
147 u32 nvar = field.get_nvar();
149 if (nvar == expected_nvar) {
150 field.permut_vars(permut);
151 }
else if (nvar % expected_nvar == 0) {
153 u32 fact_expand = nvar / expected_nvar;
155 std::vector<u32> new_permut(nvar);
156 for (
u32 i = 0; i < expected_nvar; i++) {
157 for (
u32 j = 0; j < fact_expand; j++) {
158 new_permut[i * fact_expand + j] = permut[i] * fact_expand + j;
161 field.permut_vars(new_permut);
162 }
else if (nvar == 1) {
166 "the number of variables is not equal to the expected number of variables: {} "
167 "!= {}, field name: {}, layout: {}",
171 ghost_layer_element.get_layout_ptr()->get_description_str()));
175 ghost_layer_element.for_each_field_any(apply_permut);
187 auto get_termwise_mul_vec = [&]() {
188 TgridVec p0 = {0, 0, 0};
189 TgridVec p1 = {1, 1, 1};
191 TgridVec p0_transformed = paving_function.f(p0, xoff, yoff, zoff);
192 TgridVec p1_transformed = paving_function.f(p1, xoff, yoff, zoff);
194 TgridVec mul_compo_vec = p1_transformed - p0_transformed;
196 return mul_compo_vec;
199 using Tscal =
typename shambase::VectorProperties<Tvec>::component_type;
201 auto mul_compo_vec = get_termwise_mul_vec().template convert<Tscal>();
203 auto transform_vecs = [&](
auto &field) {
204 using T =
typename std::decay_t<
decltype(field)>::Field_type;
205 if constexpr (std::is_same_v<T, Tvec>) {
206 auto &buf = field.get_buf();
211 field.get_obj_cnt() * field.get_nvar(),
212 [mul_compo_vec](
u32 i, Tvec *__restrict vec) {
213 vec[i] = vec[i] * mul_compo_vec;
215 }
else if constexpr (std::is_same_v<T, TgridVec>) {
216 }
else if constexpr (std::is_same_v<T, Tscal>) {
222 if ((xoff != 0 && transform_vec_x) || (yoff != 0 && transform_vec_y)
223 || (zoff != 0 && transform_vec_z)) {
224 ghost_layer_element.for_each_field_any(transform_vecs);