75 const TgridVec *acc_block_min;
76 const TgridVec *acc_block_max;
80 template<
class IndexFunctor>
81 void for_each_other_index_safe(
u32 id_a, IndexFunctor &&fct)
const {
83 const u32 cell_global_id = (
u32) id_a;
85 const u32 block_id = cell_global_id / AMRBlock::block_size;
86 const u32 cell_loc_id = cell_global_id % AMRBlock::block_size;
89 const TgridVec cblock_min = acc_block_min[block_id];
90 const TgridVec cblock_max = acc_block_max[block_id];
91 const TgridVec delta_cell = (cblock_max - cblock_min) / AMRBlock::Nside;
94 auto get_cell_local_coord = [&]() -> TgridVec {
95 std::array<u32, 3> lcoord_arr = AMRBlock::get_coord(cell_loc_id);
96 return {lcoord_arr[0], lcoord_arr[1], lcoord_arr[2]};
99 TgridVec lcoord = get_cell_local_coord();
102 = {cblock_min + lcoord * delta_cell,
103 cblock_min + (lcoord + TgridVec{1, 1, 1}) * delta_cell};
106 = {current_cell_aabb.
lower + dir_offset, current_cell_aabb.
upper + dir_offset};
108 auto for_each_possible_blocks = [&](
auto &&functor) {
110 graph_iter.for_each_object_link(block_id, [&](
u32 block_b) {
115 for_each_possible_blocks([&](
u32 block_b) {
116 TgridVec block_b_min = acc_block_min[block_b];
117 TgridVec block_b_max = acc_block_max[block_b];
119 const TgridVec delta_cell_b = (block_b_max - block_b_min) / AMRBlock::Nside;
121 for (
u32 lx = 0; lx < AMRBlock::Nside; lx++) {
122 for (
u32 ly = 0; ly < AMRBlock::Nside; ly++) {
123 for (
u32 lz = 0; lz < AMRBlock::Nside; lz++) {
126 = {TgridVec{block_b_min + TgridVec{lx, ly, lz} * delta_cell_b},
129 + TgridVec{lx + 1, ly + 1, lz + 1} * delta_cell_b}};
131 u32 idx = block_b * AMRBlock::block_size
132 + AMRBlock::get_index({lx, ly, lz});
134 bool overlap = found_cell.
get_intersect(current_cell_aabb_shifted)
147 template<
class IndexFunctor>
148 void for_each_other_index_full(
u32 id_a, IndexFunctor &&fct)
const {
150 const u32 cell_global_id = (
u32) id_a;
152 const u32 block_id = cell_global_id / AMRBlock::block_size;
153 const u32 cell_loc_id = cell_global_id % AMRBlock::block_size;
156 const TgridVec cblock_min = acc_block_min[block_id];
157 const TgridVec cblock_max = acc_block_max[block_id];
158 const TgridVec delta_cell = (cblock_max - cblock_min) / AMRBlock::Nside;
161 auto get_cell_local_coord = [&]() -> TgridVec {
162 std::array<u32, 3> lcoord_arr = AMRBlock::get_coord(cell_loc_id);
163 return {lcoord_arr[0], lcoord_arr[1], lcoord_arr[2]};
166 const TgridVec lcoord = get_cell_local_coord();
169 = {cblock_min + lcoord * delta_cell,
170 cblock_min + (lcoord + TgridVec{1, 1, 1}) * delta_cell};
173 = {current_cell_aabb.
lower + dir_offset * delta_cell,
174 current_cell_aabb.
upper + dir_offset * delta_cell};
178 TgridVec wanted_block_min = cblock_min;
179 TgridVec wanted_block_max = cblock_max;
180 u32 wanted_block = block_id;
182 graph_iter.for_each_object_link(block_id, [&](
u32 block_b) {
183 TgridVec int_wanted_block_min = acc_block_min[block_b];
184 TgridVec int_wanted_block_max = acc_block_max[block_b];
192 wanted_block_min = int_wanted_block_min;
193 wanted_block_max = int_wanted_block_max;
194 wanted_block = block_b;
206 const TgridVec wanted_block_delta_cell
207 = (wanted_block_max - wanted_block_min) / AMRBlock::Nside;
213 TgridVec wanted_block_current_cell_shifted
214 = current_cell_aabb_shifted.
lower - wanted_block_min;
216 std::array<u32, 3> wanted_block_index_range_min
217 = {
u32(wanted_block_current_cell_shifted.x() / wanted_block_delta_cell.x()),
218 u32(wanted_block_current_cell_shifted.y() / wanted_block_delta_cell.y()),
219 u32(wanted_block_current_cell_shifted.z() / wanted_block_delta_cell.z())};
221 std::array<u32, 3> wanted_block_index_range_max
222 = {
u32((wanted_block_current_cell_shifted.x() + delta_cell.x())
223 / wanted_block_delta_cell.x()),
224 u32((wanted_block_current_cell_shifted.y() + delta_cell.y())
225 / wanted_block_delta_cell.y()),
226 u32((wanted_block_current_cell_shifted.z() + delta_cell.z())
227 / wanted_block_delta_cell.z())};
230 if (wanted_block_index_range_max[0] - wanted_block_index_range_min[0] < 1)
231 wanted_block_index_range_max[0] = wanted_block_index_range_min[0] + 1;
232 if (wanted_block_index_range_max[1] - wanted_block_index_range_min[1] < 1)
233 wanted_block_index_range_max[1] = wanted_block_index_range_min[1] + 1;
234 if (wanted_block_index_range_max[2] - wanted_block_index_range_min[2] < 1)
235 wanted_block_index_range_max[2] = wanted_block_index_range_min[2] + 1;
237 for (
u32 x = wanted_block_index_range_min[0]; x < wanted_block_index_range_max[0];
239 for (
u32 y = wanted_block_index_range_min[1];
240 y < wanted_block_index_range_max[1];
242 for (
u32 z = wanted_block_index_range_min[2];
243 z < wanted_block_index_range_max[2];
247 TgridVec{wanted_block_min + TgridVec{x, y, z} * delta_cell},
249 wanted_block_min + TgridVec{x + 1, y + 1, z + 1} * delta_cell}};
251 bool overlap = found_cell.
get_intersect(current_cell_aabb_shifted)
255 u32 idx = wanted_block * AMRBlock::block_size
256 + AMRBlock::get_index({x, y, z});
265 template<
class IndexFunctor>
266 void for_each_other_index(
u32 id_a, IndexFunctor &&fct)
const {
271 for_each_other_index_safe(id_a, fct);
279 auto edges = get_edges();
281 edges.spans_block_min.check_sizes(edges.sizes.indexes);
282 edges.spans_block_max.check_sizes(edges.sizes.indexes);
286 if (block_nside_pow != 1) {
293 const OrientedAMRGraph &oriented_block_graph) {
294 OrientedAMRGraph result;
302 for (
u32 dir = 0; dir < 6; dir++) {
304 TgridVec dir_offset = result.offset_check[dir];
309 u32 cell_count = (edges.sizes.indexes.get(
id)) * AMRBlock::block_size;
311 AMRGraph rslt = details::compute_neigh_graph<AMRLowering<AMRBlock>>(
312 shamsys::instance::get_compute_scheduler_ptr(),
320 "AMR Cell Graph",
"Patch",
id,
"direction", dir,
"link cnt", rslt.link_count);
322 std::unique_ptr<AMRGraph> tmp_graph = std::make_unique<AMRGraph>(std::move(rslt));
324 result.graph_links[dir] = std::move(tmp_graph);
327 cell_graph_links.
add_obj(
id, std::move(result));
330 shamlog_debug_ln(
"[AMR cell graph]",
"compute antecedent map");
331 cell_graph_links.
for_each([&](
u64 id, OrientedAMRGraph &oriented_block_graph) {
332 auto ptr = shamsys::instance::get_compute_scheduler_ptr();
333 u32 cell_count = (edges.sizes.indexes.get(
id)) * AMRBlock::block_size;
334 for (
u32 dir = 0; dir < 6; dir++) {
335 oriented_block_graph.graph_links[dir]->compute_antecedent(ptr);
339 edges.cell_neigh_graph.graph = std::move(cell_graph_links);