25 template<
class Tvec,
class Tgr
idVec,
class AMRBlock>
29 using Tscal = shambase::VecComponent<Tvec>;
30 using Tgridscal = shambase::VecComponent<TgridVec>;
32 const Tvec *acc_aabb_block_lower;
33 const Tscal *acc_aabb_cell_size;
35 GetShift(
const Tvec *aabb_block_lower,
const Tscal *aabb_cell_size)
36 : acc_aabb_block_lower{aabb_block_lower}, acc_aabb_cell_size{aabb_cell_size} {}
38 shammath::AABB<Tvec> get_cell_aabb(
u32 id)
const {
40 const u32 cell_global_id = (
u32)
id;
42 const u32 block_id = cell_global_id / AMRBlock::block_size;
43 const u32 cell_loc_id = cell_global_id % AMRBlock::block_size;
46 const Tvec cblock_min = acc_aabb_block_lower[block_id];
47 const Tscal delta_cell = acc_aabb_cell_size[block_id];
49 std::array<u32, 3> lcoord_arr = AMRBlock::get_coord(cell_loc_id);
50 Tvec offset = Tvec{lcoord_arr[0], lcoord_arr[1], lcoord_arr[2]} * delta_cell;
52 Tvec aabb_min = cblock_min + offset;
53 Tvec aabb_max = aabb_min + delta_cell;
55 return {aabb_min, aabb_max};
58 std::pair<Tvec, Tvec> get_shifts(
u32 id_a,
u32 id_b)
const {
60 shammath::AABB<Tvec> aabb_cell_a = get_cell_aabb(id_a);
61 shammath::AABB<Tvec> aabb_cell_b = get_cell_aabb(id_b);
63 shammath::AABB<Tvec> face_aabb = aabb_cell_a.
get_intersect(aabb_cell_b);
67 Tvec shift_a = face_center - aabb_cell_a.
get_center();
68 Tvec shift_b = face_center - aabb_cell_b.
get_center();
70 return {shift_a, shift_b};
74 template<
class Tvec,
class Tgr
idVec,
class AMRBlock>
75 class RhoInterpolate {
76 using Tscal = shambase::VecComponent<Tvec>;
79 shamrock::PatchDataFieldSpanPointer<Tvec> aabb_block_lower;
80 shamrock::PatchDataFieldSpanPointer<Tscal> aabb_cell_size;
81 shamrock::PatchDataFieldSpanPointer<Tscal> rho_cell;
82 shamrock::PatchDataFieldSpanPointer<Tvec> grad_rho_cell;
85 shamrock::PatchDataFieldSpanPointer<Tscal> dt_rho_cell;
89 GetShift<Tvec, TgridVec, AMRBlock> shift_get;
91 const Tscal *acc_rho_cell;
92 const Tvec *acc_grad_rho_cell;
95 const Tscal *acc_dt_rho_cell;
99 acc(
const Tvec *aabb_block_lower,
100 const Tscal *aabb_cell_size,
101 const Tscal *rho_cell,
102 const Tvec *grad_rho_cell,
105 const Tscal *dt_rho_cell)
106 : shift_get(aabb_block_lower, aabb_cell_size), acc_rho_cell{rho_cell},
107 acc_grad_rho_cell{grad_rho_cell}, acc_dt_rho_cell{dt_rho_cell},
108 dt_interp(dt_interp) {}
110 std::array<Tscal, 2> get_link_field_val(
u32 id_a,
u32 id_b)
const {
112 auto [shift_a, shift_b] = shift_get.get_shifts(id_a, id_b);
114 Tscal rho_a = acc_rho_cell[id_a];
115 Tvec grad_rho_a = acc_grad_rho_cell[id_a];
116 Tscal rho_b = acc_rho_cell[id_b];
117 Tvec grad_rho_b = acc_grad_rho_cell[id_b];
120 Tscal rho_face_a = rho_a + sycl::dot(grad_rho_a, shift_a);
121 Tscal rho_face_b = rho_b + sycl::dot(grad_rho_b, shift_b);
124 rho_face_a += acc_dt_rho_cell[id_a] * dt_interp;
125 rho_face_b += acc_dt_rho_cell[id_b] * dt_interp;
127 return {rho_face_a, rho_face_b};
131 inline acc get_read_access(sham::EventList &deps) {
133 aabb_block_lower.get_read_access(deps),
134 aabb_cell_size.get_read_access(deps),
135 rho_cell.get_read_access(deps),
136 grad_rho_cell.get_read_access(deps),
139 dt_rho_cell.get_read_access(deps));
142 inline void complete_event_state(sycl::event e) {
143 aabb_block_lower.complete_event_state(e);
144 aabb_cell_size.complete_event_state(e);
145 rho_cell.complete_event_state(e);
146 grad_rho_cell.complete_event_state(e);
147 dt_rho_cell.complete_event_state(e);
151 template<
class Tvec,
class Tgr
idVec,
class AMRBlock>
152 class VelInterpolate {
153 using Tscal = shambase::VecComponent<Tvec>;
156 shamrock::PatchDataFieldSpanPointer<Tvec> aabb_block_lower;
157 shamrock::PatchDataFieldSpanPointer<Tscal> aabb_cell_size;
159 shamrock::PatchDataFieldSpanPointer<Tvec> vel_cell;
160 shamrock::PatchDataFieldSpanPointer<Tvec> dx_v_cell;
161 shamrock::PatchDataFieldSpanPointer<Tvec> dy_v_cell;
162 shamrock::PatchDataFieldSpanPointer<Tvec> dz_v_cell;
165 shamrock::PatchDataFieldSpanPointer<Tvec> dt_vel_cell;
169 GetShift<Tvec, TgridVec, AMRBlock> shift_get;
171 const Tvec *acc_vel_cell;
172 const Tvec *acc_dx_v_cell;
173 const Tvec *acc_dy_v_cell;
174 const Tvec *acc_dz_v_cell;
177 const Tvec *acc_dt_vel_cell;
181 acc(
const Tvec *aabb_block_lower,
182 const Tscal *aabb_cell_size,
183 const Tvec *vel_cell,
184 const Tvec *dx_v_cell,
185 const Tvec *dy_v_cell,
186 const Tvec *dz_v_cell,
189 const Tvec *dt_vel_cell)
190 : shift_get(aabb_block_lower, aabb_cell_size), acc_vel_cell{vel_cell},
191 acc_dx_v_cell{dx_v_cell}, acc_dy_v_cell{dy_v_cell}, acc_dz_v_cell{dz_v_cell},
192 acc_dt_vel_cell{dt_vel_cell}, dt_interp(dt_interp) {}
194 std::array<Tvec, 2> get_link_field_val(
u32 id_a,
u32 id_b)
const {
196 auto [shift_a, shift_b] = shift_get.get_shifts(id_a, id_b);
198 Tvec v_a = acc_vel_cell[id_a];
199 Tvec dx_vel_a = acc_dx_v_cell[id_a];
200 Tvec dy_vel_a = acc_dy_v_cell[id_a];
201 Tvec dz_vel_a = acc_dz_v_cell[id_a];
203 Tvec v_b = acc_vel_cell[id_b];
204 Tvec dx_vel_b = acc_dx_v_cell[id_b];
205 Tvec dy_vel_b = acc_dy_v_cell[id_b];
206 Tvec dz_vel_b = acc_dz_v_cell[id_b];
208 Tvec dx_v_a_dot_shift
209 = shift_a.x() * dx_vel_a + shift_a.y() * dy_vel_a + shift_a.z() * dz_vel_a;
210 Tvec dx_v_b_dot_shift
211 = shift_b.x() * dx_vel_b + shift_b.y() * dy_vel_b + shift_b.z() * dz_vel_b;
213 Tvec dt_v_a = acc_dt_vel_cell[id_a];
214 Tvec dt_v_b = acc_dt_vel_cell[id_b];
216 Tvec vel_face_a = v_a + dx_v_a_dot_shift + dt_v_a * dt_interp;
217 Tvec vel_face_b = v_b + dx_v_b_dot_shift + dt_v_b * dt_interp;
219 return {vel_face_a, vel_face_b};
223 inline acc get_read_access(sham::EventList &deps) {
225 aabb_block_lower.get_read_access(deps),
226 aabb_cell_size.get_read_access(deps),
227 vel_cell.get_read_access(deps),
228 dx_v_cell.get_read_access(deps),
229 dy_v_cell.get_read_access(deps),
230 dz_v_cell.get_read_access(deps),
233 dt_vel_cell.get_read_access(deps));
236 inline void complete_event_state(sycl::event e) {
237 aabb_block_lower.complete_event_state(e);
238 aabb_cell_size.complete_event_state(e);
239 vel_cell.complete_event_state(e);
240 dx_v_cell.complete_event_state(e);
241 dy_v_cell.complete_event_state(e);
242 dz_v_cell.complete_event_state(e);
243 dt_vel_cell.complete_event_state(e);
247 template<
class Tvec,
class Tgr
idVec,
class AMRBlock>
248 class PressInterpolate {
249 using Tscal = shambase::VecComponent<Tvec>;
252 shamrock::PatchDataFieldSpanPointer<Tvec> aabb_block_lower;
253 shamrock::PatchDataFieldSpanPointer<Tscal> aabb_cell_size;
254 shamrock::PatchDataFieldSpanPointer<Tscal> P_cell;
255 shamrock::PatchDataFieldSpanPointer<Tvec> grad_P_cell;
258 shamrock::PatchDataFieldSpanPointer<Tscal> dt_P_cell;
262 GetShift<Tvec, TgridVec, AMRBlock> shift_get;
264 const Tscal *acc_P_cell;
265 const Tvec *acc_grad_P_cell;
268 const Tscal *acc_dt_P_cell;
272 acc(
const Tvec *aabb_block_lower,
273 const Tscal *aabb_cell_size,
275 const Tvec *grad_P_cell,
278 const Tscal *dt_P_cell)
279 : shift_get(aabb_block_lower, aabb_cell_size), acc_P_cell{P_cell},
280 acc_grad_P_cell{grad_P_cell}, acc_dt_P_cell{dt_P_cell}, dt_interp(dt_interp) {}
282 std::array<Tscal, 2> get_link_field_val(
u32 id_a,
u32 id_b)
const {
284 auto [shift_a, shift_b] = shift_get.get_shifts(id_a, id_b);
286 Tscal P_a = acc_P_cell[id_a];
287 Tvec grad_P_a = acc_grad_P_cell[id_a];
288 Tscal P_b = acc_P_cell[id_b];
289 Tvec grad_P_b = acc_grad_P_cell[id_b];
291 Tscal dtP_cell_a = acc_dt_P_cell[id_a];
292 Tscal dtP_cell_b = acc_dt_P_cell[id_b];
294 Tscal P_face_a = P_a + sycl::dot(grad_P_a, shift_a) + dtP_cell_a * dt_interp;
295 Tscal P_face_b = P_b + sycl::dot(grad_P_b, shift_b) + dtP_cell_b * dt_interp;
300 return {P_face_a, P_face_b};
304 inline acc get_read_access(sham::EventList &deps) {
306 aabb_block_lower.get_read_access(deps),
307 aabb_cell_size.get_read_access(deps),
308 P_cell.get_read_access(deps),
309 grad_P_cell.get_read_access(deps),
311 dt_P_cell.get_read_access(deps));
314 inline void complete_event_state(sycl::event e) {
315 aabb_block_lower.complete_event_state(e);
316 aabb_cell_size.complete_event_state(e);
317 P_cell.complete_event_state(e);
318 grad_P_cell.complete_event_state(e);
319 dt_P_cell.complete_event_state(e);
323 template<
class Tvec,
class Tgr
idVec,
class AMRBlock>
324 class RhoDustInterpolate {
325 using Tscal = shambase::VecComponent<Tvec>;
329 shamrock::PatchDataFieldSpanPointer<Tvec> aabb_block_lower;
330 shamrock::PatchDataFieldSpanPointer<Tscal> aabb_cell_size;
331 shamrock::PatchDataFieldSpanPointer<Tscal> rho_dust_cell;
332 shamrock::PatchDataFieldSpanPointer<Tvec> grad_rho_dust_cell;
335 shamrock::PatchDataFieldSpanPointer<Tscal> dt_rho_dust_cell;
339 GetShift<Tvec, TgridVec, AMRBlock> shift_get;
342 const Tscal *acc_rho_dust_cell;
343 const Tvec *acc_grad_rho_dust_cell;
346 const Tscal *acc_dt_rho_dust_cell;
351 const Tvec *aabb_block_lower,
352 const Tscal *aabb_cell_size,
353 const Tscal *rho_dust_cell,
354 const Tvec *grad_rho_dust_cell,
357 const Tscal *dt_rho_dust_cell)
358 : shift_get(aabb_block_lower, aabb_cell_size), nvar(nvar),
359 acc_rho_dust_cell{rho_dust_cell}, acc_grad_rho_dust_cell{grad_rho_dust_cell},
360 acc_dt_rho_dust_cell{dt_rho_dust_cell}, dt_interp(dt_interp) {}
362 std::array<Tscal, 2> get_link_field_val(
u32 id_a,
u32 id_b)
const {
363 const u32 icell_a = id_a / nvar;
364 const u32 icell_b = id_b / nvar;
366 auto [shift_a, shift_b] = shift_get.get_shifts(icell_a, icell_b);
368 Tscal rho_dust_a = acc_rho_dust_cell[id_a];
369 Tvec grad_rho_dust_a = acc_grad_rho_dust_cell[id_a];
370 Tscal rho_dust_b = acc_rho_dust_cell[id_b];
371 Tvec grad_rho_dust_b = acc_grad_rho_dust_cell[id_b];
373 Tscal rho_dust_face_a = rho_dust_a + sycl::dot(grad_rho_dust_a, shift_a);
374 Tscal rho_dust_face_b = rho_dust_b + sycl::dot(grad_rho_dust_b, shift_b);
376 rho_dust_face_a += acc_dt_rho_dust_cell[id_a] * dt_interp;
377 rho_dust_face_b += acc_dt_rho_dust_cell[id_b] * dt_interp;
379 return {rho_dust_face_a, rho_dust_face_b};
383 inline acc get_read_access(sham::EventList &deps) {
386 aabb_block_lower.get_read_access(deps),
387 aabb_cell_size.get_read_access(deps),
388 rho_dust_cell.get_read_access(deps),
389 grad_rho_dust_cell.get_read_access(deps),
392 dt_rho_dust_cell.get_read_access(deps));
395 inline void complete_event_state(sycl::event e) {
396 aabb_block_lower.complete_event_state(e);
397 aabb_cell_size.complete_event_state(e);
398 rho_dust_cell.complete_event_state(e);
399 grad_rho_dust_cell.complete_event_state(e);
400 dt_rho_dust_cell.complete_event_state(e);
404 template<
class Tvec,
class Tgr
idVec,
class AMRBlock>
405 class VelDustInterpolate {
406 using Tscal = shambase::VecComponent<Tvec>;
410 shamrock::PatchDataFieldSpanPointer<Tvec> aabb_block_lower;
411 shamrock::PatchDataFieldSpanPointer<Tscal> aabb_cell_size;
412 shamrock::PatchDataFieldSpanPointer<Tvec> vel_dust_cell;
413 shamrock::PatchDataFieldSpanPointer<Tvec> dx_v_dust_cell;
414 shamrock::PatchDataFieldSpanPointer<Tvec> dy_v_dust_cell;
415 shamrock::PatchDataFieldSpanPointer<Tvec> dz_v_dust_cell;
418 shamrock::PatchDataFieldSpanPointer<Tvec> dt_vel_dust_cell;
422 GetShift<Tvec, TgridVec, AMRBlock> shift_get;
425 const Tvec *acc_vel_dust_cell;
426 const Tvec *acc_dx_v_dust_cell;
427 const Tvec *acc_dy_v_dust_cell;
428 const Tvec *acc_dz_v_dust_cell;
431 const Tvec *acc_dt_vel_dust_cell;
436 const Tvec *aabb_block_lower,
437 const Tscal *aabb_cell_size,
438 const Tvec *vel_dust_cell,
439 const Tvec *dx_v_dust_cell,
440 const Tvec *dy_v_dust_cell,
441 const Tvec *dz_v_dust_cell,
444 const Tvec *dt_vel_dust_cell)
445 : shift_get(aabb_block_lower, aabb_cell_size), nvar(nvar),
446 acc_vel_dust_cell{vel_dust_cell}, acc_dx_v_dust_cell{dx_v_dust_cell},
447 acc_dy_v_dust_cell{dy_v_dust_cell}, acc_dz_v_dust_cell{dz_v_dust_cell},
448 acc_dt_vel_dust_cell{dt_vel_dust_cell}, dt_interp(dt_interp) {}
450 std::array<Tvec, 2> get_link_field_val(
u32 id_a,
u32 id_b)
const {
451 const u32 icell_a = id_a / nvar;
452 const u32 icell_b = id_b / nvar;
454 auto [shift_a, shift_b] = shift_get.get_shifts(icell_a, icell_b);
456 Tvec v_dust_a = acc_vel_dust_cell[id_a];
457 Tvec dx_vel_dust_a = acc_dx_v_dust_cell[id_a];
458 Tvec dy_vel_dust_a = acc_dy_v_dust_cell[id_a];
459 Tvec dz_vel_dust_a = acc_dz_v_dust_cell[id_a];
461 Tvec v_dust_b = acc_vel_dust_cell[id_b];
462 Tvec dx_vel_dust_b = acc_dx_v_dust_cell[id_b];
463 Tvec dy_vel_dust_b = acc_dy_v_dust_cell[id_b];
464 Tvec dz_vel_dust_b = acc_dz_v_dust_cell[id_b];
466 Tvec dx_v_dust_a_dot_shift = shift_a.x() * dx_vel_dust_a
467 + shift_a.y() * dy_vel_dust_a
468 + shift_a.z() * dz_vel_dust_a;
469 Tvec dx_v_dust_b_dot_shift = shift_b.x() * dx_vel_dust_b
470 + shift_b.y() * dy_vel_dust_b
471 + shift_b.z() * dz_vel_dust_b;
473 Tvec dt_v_dust_a = acc_dt_vel_dust_cell[id_a];
474 Tvec dt_v_dust_b = acc_dt_vel_dust_cell[id_b];
476 Tvec vel_dust_face_a = v_dust_a + dx_v_dust_a_dot_shift + dt_v_dust_a * dt_interp;
477 Tvec vel_dust_face_b = v_dust_b + dx_v_dust_b_dot_shift + dt_v_dust_b * dt_interp;
479 return {vel_dust_face_a, vel_dust_face_b};
483 inline acc get_read_access(sham::EventList &deps) {
486 aabb_block_lower.get_read_access(deps),
487 aabb_cell_size.get_read_access(deps),
488 vel_dust_cell.get_read_access(deps),
489 dx_v_dust_cell.get_read_access(deps),
490 dy_v_dust_cell.get_read_access(deps),
491 dz_v_dust_cell.get_read_access(deps),
494 dt_vel_dust_cell.get_read_access(deps));
497 inline void complete_event_state(sycl::event e) {
498 aabb_block_lower.complete_event_state(e);
499 aabb_cell_size.complete_event_state(e);
500 vel_dust_cell.complete_event_state(e);
501 dx_v_dust_cell.complete_event_state(e);
502 dy_v_dust_cell.complete_event_state(e);
503 dz_v_dust_cell.complete_event_state(e);
504 dt_vel_dust_cell.complete_event_state(e);
510template<
class Tvec,
class Tgr
idVec>
517 static constexpr u32 NsideBlockPow = 1;
522 auto edges = get_edges();
524 auto dt_interp = edges.dt_interp.value;
533 rho_face_xp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xp));
534 rho_face_xm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xm));
535 rho_face_yp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::yp));
536 rho_face_ym.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::ym));
537 rho_face_zp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zp));
538 rho_face_zm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zm));
540 auto spans_block_cell_sizes = edges.spans_block_cell_sizes.get_spans();
541 auto spans_cell0block_aabb_lower = edges.spans_cell0block_aabb_lower.get_spans();
542 auto spans_rhos = edges.spans_rhos.get_spans();
543 auto spans_grad_rho = edges.spans_grad_rho.get_spans();
544 auto spans_dt_rho = edges.spans_dt_rho.get_spans();
546 using Interp = RhoInterpolate<Tvec, TgridVec, AMRBlock>;
548 = spans_block_cell_sizes.template map<Interp>([&](
u64 id,
auto &csize) -> Interp {
550 spans_cell0block_aabb_lower.get(
id),
551 spans_block_cell_sizes.get(
id),
553 spans_grad_rho.get(
id),
555 spans_dt_rho.get(
id)};
558 auto graphs_xp = edges.cell_neigh_graph.get_refs_dir(Direction::xp);
559 auto graphs_xm = edges.cell_neigh_graph.get_refs_dir(Direction::xm);
560 auto graphs_yp = edges.cell_neigh_graph.get_refs_dir(Direction::yp);
561 auto graphs_ym = edges.cell_neigh_graph.get_refs_dir(Direction::ym);
562 auto graphs_zp = edges.cell_neigh_graph.get_refs_dir(Direction::zp);
563 auto graphs_zm = edges.cell_neigh_graph.get_refs_dir(Direction::zm);
566 = graphs_xp.template map<u32>([&](
u64 id,
auto &graph) {
567 return graph.get().obj_cnt;
570 = graphs_xm.template map<u32>([&](
u64 id,
auto &graph) {
571 return graph.get().obj_cnt;
574 = graphs_yp.template map<u32>([&](
u64 id,
auto &graph) {
575 return graph.get().obj_cnt;
578 = graphs_ym.template map<u32>([&](
u64 id,
auto &graph) {
579 return graph.get().obj_cnt;
582 = graphs_zp.template map<u32>([&](
u64 id,
auto &graph) {
583 return graph.get().obj_cnt;
586 = graphs_zm.template map<u32>([&](
u64 id,
auto &graph) {
587 return graph.get().obj_cnt;
591 shamsys::instance::get_compute_scheduler_ptr(),
595 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
596 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
597 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
601 shamsys::instance::get_compute_scheduler_ptr(),
605 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
606 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
607 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
611 shamsys::instance::get_compute_scheduler_ptr(),
615 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
616 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
617 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
621 shamsys::instance::get_compute_scheduler_ptr(),
625 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
626 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
627 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
631 shamsys::instance::get_compute_scheduler_ptr(),
635 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
636 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
637 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
641 shamsys::instance::get_compute_scheduler_ptr(),
645 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
646 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
647 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
652template<
class Tvec,
class Tgr
idVec>
660template<
class Tvec,
class Tgr
idVec>
667 static constexpr u32 NsideBlockPow = 1;
672 auto edges = get_edges();
674 auto dt_interp = edges.dt_interp.value;
683 vel_face_xp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xp));
684 vel_face_xm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xm));
685 vel_face_yp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::yp));
686 vel_face_ym.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::ym));
687 vel_face_zp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zp));
688 vel_face_zm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zm));
690 auto spans_block_cell_sizes = edges.spans_block_cell_sizes.get_spans();
691 auto spans_cell0block_aabb_lower = edges.spans_cell0block_aabb_lower.get_spans();
692 auto spans_vel = edges.spans_vel.get_spans();
693 auto spans_dx_vel = edges.spans_dx_vel.get_spans();
694 auto spans_dy_vel = edges.spans_dy_vel.get_spans();
695 auto spans_dz_vel = edges.spans_dz_vel.get_spans();
696 auto spans_dt_vel = edges.spans_dt_vel.get_spans();
698 using Interp = VelInterpolate<Tvec, TgridVec, AMRBlock>;
700 = spans_block_cell_sizes.template map<Interp>([&](
u64 id,
auto &csize) -> Interp {
702 spans_cell0block_aabb_lower.get(
id),
703 spans_block_cell_sizes.get(
id),
705 spans_dx_vel.get(
id),
706 spans_dy_vel.get(
id),
707 spans_dz_vel.get(
id),
709 spans_dt_vel.get(
id)};
712 auto graphs_xp = edges.cell_neigh_graph.get_refs_dir(Direction::xp);
713 auto graphs_xm = edges.cell_neigh_graph.get_refs_dir(Direction::xm);
714 auto graphs_yp = edges.cell_neigh_graph.get_refs_dir(Direction::yp);
715 auto graphs_ym = edges.cell_neigh_graph.get_refs_dir(Direction::ym);
716 auto graphs_zp = edges.cell_neigh_graph.get_refs_dir(Direction::zp);
717 auto graphs_zm = edges.cell_neigh_graph.get_refs_dir(Direction::zm);
720 = graphs_xp.template map<u32>([&](
u64 id,
auto &graph) {
721 return graph.get().obj_cnt;
724 = graphs_xm.template map<u32>([&](
u64 id,
auto &graph) {
725 return graph.get().obj_cnt;
728 = graphs_yp.template map<u32>([&](
u64 id,
auto &graph) {
729 return graph.get().obj_cnt;
732 = graphs_ym.template map<u32>([&](
u64 id,
auto &graph) {
733 return graph.get().obj_cnt;
736 = graphs_zp.template map<u32>([&](
u64 id,
auto &graph) {
737 return graph.get().obj_cnt;
740 = graphs_zm.template map<u32>([&](
u64 id,
auto &graph) {
741 return graph.get().obj_cnt;
745 shamsys::instance::get_compute_scheduler_ptr(),
749 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
750 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
751 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
755 shamsys::instance::get_compute_scheduler_ptr(),
759 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
760 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
761 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
765 shamsys::instance::get_compute_scheduler_ptr(),
769 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
770 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
771 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
775 shamsys::instance::get_compute_scheduler_ptr(),
779 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
780 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
781 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
785 shamsys::instance::get_compute_scheduler_ptr(),
789 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
790 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
791 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
795 shamsys::instance::get_compute_scheduler_ptr(),
799 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
800 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
801 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
806template<
class Tvec,
class Tgr
idVec>
814template<
class Tvec,
class Tgr
idVec>
821 static constexpr u32 NsideBlockPow = 1;
826 auto edges = get_edges();
828 auto dt_interp = edges.dt_interp.value;
837 press_face_xp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xp));
838 press_face_xm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xm));
839 press_face_yp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::yp));
840 press_face_ym.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::ym));
841 press_face_zp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zp));
842 press_face_zm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zm));
844 auto spans_block_cell_sizes = edges.spans_block_cell_sizes.get_spans();
845 auto spans_cell0block_aabb_lower = edges.spans_cell0block_aabb_lower.get_spans();
846 auto spans_press = edges.spans_press.get_spans();
847 auto spans_grad_P = edges.spans_grad_P.get_spans();
848 auto spans_dt_press = edges.spans_dt_press.get_spans();
850 using Interp = PressInterpolate<Tvec, TgridVec, AMRBlock>;
852 = spans_block_cell_sizes.template map<Interp>([&](
u64 id,
auto &csize) -> Interp {
854 spans_cell0block_aabb_lower.get(
id),
855 spans_block_cell_sizes.get(
id),
857 spans_grad_P.get(
id),
859 spans_dt_press.get(
id)};
862 auto graphs_xp = edges.cell_neigh_graph.get_refs_dir(Direction::xp);
863 auto graphs_xm = edges.cell_neigh_graph.get_refs_dir(Direction::xm);
864 auto graphs_yp = edges.cell_neigh_graph.get_refs_dir(Direction::yp);
865 auto graphs_ym = edges.cell_neigh_graph.get_refs_dir(Direction::ym);
866 auto graphs_zp = edges.cell_neigh_graph.get_refs_dir(Direction::zp);
867 auto graphs_zm = edges.cell_neigh_graph.get_refs_dir(Direction::zm);
870 = graphs_xp.template map<u32>([&](
u64 id,
auto &graph) {
871 return graph.get().obj_cnt;
874 = graphs_xm.template map<u32>([&](
u64 id,
auto &graph) {
875 return graph.get().obj_cnt;
878 = graphs_yp.template map<u32>([&](
u64 id,
auto &graph) {
879 return graph.get().obj_cnt;
882 = graphs_ym.template map<u32>([&](
u64 id,
auto &graph) {
883 return graph.get().obj_cnt;
886 = graphs_zp.template map<u32>([&](
u64 id,
auto &graph) {
887 return graph.get().obj_cnt;
890 = graphs_zm.template map<u32>([&](
u64 id,
auto &graph) {
891 return graph.get().obj_cnt;
895 shamsys::instance::get_compute_scheduler_ptr(),
899 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
900 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
901 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
905 shamsys::instance::get_compute_scheduler_ptr(),
909 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
910 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
911 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
915 shamsys::instance::get_compute_scheduler_ptr(),
919 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
920 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
921 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
925 shamsys::instance::get_compute_scheduler_ptr(),
929 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
930 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
931 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
935 shamsys::instance::get_compute_scheduler_ptr(),
939 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
940 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
941 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
945 shamsys::instance::get_compute_scheduler_ptr(),
949 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
950 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
951 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
956template<
class Tvec,
class Tgr
idVec>
964template<
class Tvec,
class Tgr
idVec>
971 static constexpr u32 NsideBlockPow = 1;
976 auto edges = get_edges();
978 auto dt_interp = edges.dt_interp.value;
979 auto ndust = this->ndust;
982 = edges.rho_dust_face_xp;
984 = edges.rho_dust_face_xm;
986 = edges.rho_dust_face_yp;
988 = edges.rho_dust_face_ym;
990 = edges.rho_dust_face_zp;
992 = edges.rho_dust_face_zm;
994 rho_dust_face_xp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xp));
995 rho_dust_face_xm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xm));
996 rho_dust_face_yp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::yp));
997 rho_dust_face_ym.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::ym));
998 rho_dust_face_zp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zp));
999 rho_dust_face_zm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zm));
1001 auto spans_block_cell_sizes = edges.spans_block_cell_sizes.get_spans();
1002 auto spans_cell0block_aabb_lower = edges.spans_cell0block_aabb_lower.get_spans();
1003 auto spans_rhos_dust = edges.spans_rhos_dust.get_spans();
1004 auto spans_grad_rho_dust = edges.spans_grad_rho_dust.get_spans();
1005 auto spans_dt_rho_dust = edges.spans_dt_rho_dust.get_spans();
1007 using Interp = RhoDustInterpolate<Tvec, TgridVec, AMRBlock>;
1009 = spans_block_cell_sizes.template map<Interp>([&](
u64 id,
auto &csize) -> Interp {
1012 spans_cell0block_aabb_lower.get(
id),
1013 spans_block_cell_sizes.get(
id),
1014 spans_rhos_dust.get(
id),
1015 spans_grad_rho_dust.get(
id),
1017 spans_dt_rho_dust.get(
id)};
1020 auto graphs_xp = edges.cell_neigh_graph.get_refs_dir(Direction::xp);
1021 auto graphs_xm = edges.cell_neigh_graph.get_refs_dir(Direction::xm);
1022 auto graphs_yp = edges.cell_neigh_graph.get_refs_dir(Direction::yp);
1023 auto graphs_ym = edges.cell_neigh_graph.get_refs_dir(Direction::ym);
1024 auto graphs_zp = edges.cell_neigh_graph.get_refs_dir(Direction::zp);
1025 auto graphs_zm = edges.cell_neigh_graph.get_refs_dir(Direction::zm);
1028 = graphs_xp.template map<u32>([&](
u64 id,
auto &graph) {
1029 return graph.get().obj_cnt * ndust;
1032 = graphs_xm.template map<u32>([&](
u64 id,
auto &graph) {
1033 return graph.get().obj_cnt * ndust;
1036 = graphs_yp.template map<u32>([&](
u64 id,
auto &graph) {
1037 return graph.get().obj_cnt * ndust;
1040 = graphs_ym.template map<u32>([&](
u64 id,
auto &graph) {
1041 return graph.get().obj_cnt * ndust;
1044 = graphs_zp.template map<u32>([&](
u64 id,
auto &graph) {
1045 return graph.get().obj_cnt * ndust;
1048 = graphs_zm.template map<u32>([&](
u64 id,
auto &graph) {
1049 return graph.get().obj_cnt * ndust;
1053 shamsys::instance::get_compute_scheduler_ptr(),
1057 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1058 const u32 id_cell_a = idvar_a / ndust;
1059 const u32 nvar_loc = idvar_a % ndust;
1060 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1061 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1062 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1066 shamsys::instance::get_compute_scheduler_ptr(),
1070 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1071 const u32 id_cell_a = idvar_a / ndust;
1072 const u32 nvar_loc = idvar_a % ndust;
1073 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1074 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1075 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1079 shamsys::instance::get_compute_scheduler_ptr(),
1083 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1084 const u32 id_cell_a = idvar_a / ndust;
1085 const u32 nvar_loc = idvar_a % ndust;
1086 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1087 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1088 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1092 shamsys::instance::get_compute_scheduler_ptr(),
1096 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1097 const u32 id_cell_a = idvar_a / ndust;
1098 const u32 nvar_loc = idvar_a % ndust;
1099 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1100 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1101 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1105 shamsys::instance::get_compute_scheduler_ptr(),
1109 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1110 const u32 id_cell_a = idvar_a / ndust;
1111 const u32 nvar_loc = idvar_a % ndust;
1112 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1113 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1114 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1118 shamsys::instance::get_compute_scheduler_ptr(),
1122 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1123 const u32 id_cell_a = idvar_a / ndust;
1124 const u32 nvar_loc = idvar_a % ndust;
1125 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1126 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1127 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1132template<
class Tvec,
class Tgr
idVec>
1140template<
class Tvec,
class Tgr
idVec>
1147 static constexpr u32 NsideBlockPow = 1;
1152 auto edges = get_edges();
1154 auto dt_interp = edges.dt_interp.value;
1155 auto ndust = this->ndust;
1158 = edges.vel_dust_face_xp;
1160 = edges.vel_dust_face_xm;
1162 = edges.vel_dust_face_yp;
1164 = edges.vel_dust_face_ym;
1166 = edges.vel_dust_face_zp;
1168 = edges.vel_dust_face_zm;
1170 vel_dust_face_xp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xp));
1171 vel_dust_face_xm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xm));
1172 vel_dust_face_yp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::yp));
1173 vel_dust_face_ym.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::ym));
1174 vel_dust_face_zp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zp));
1175 vel_dust_face_zm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zm));
1177 auto spans_block_cell_sizes = edges.spans_block_cell_sizes.get_spans();
1178 auto spans_cell0block_aabb_lower = edges.spans_cell0block_aabb_lower.get_spans();
1179 auto spans_vel_dust = edges.spans_vel_dust.get_spans();
1180 auto spans_dx_vel_dust = edges.spans_dx_vel_dust.get_spans();
1181 auto spans_dy_vel_dust = edges.spans_dy_vel_dust.get_spans();
1182 auto spans_dz_vel_dust = edges.spans_dz_vel_dust.get_spans();
1183 auto spans_dt_vel_dust = edges.spans_dt_vel_dust.get_spans();
1185 using Interp = VelDustInterpolate<Tvec, TgridVec, AMRBlock>;
1187 = spans_block_cell_sizes.template map<Interp>([&](
u64 id,
auto &csize) -> Interp {
1190 spans_cell0block_aabb_lower.get(
id),
1191 spans_block_cell_sizes.get(
id),
1192 spans_vel_dust.get(
id),
1193 spans_dx_vel_dust.get(
id),
1194 spans_dy_vel_dust.get(
id),
1195 spans_dz_vel_dust.get(
id),
1197 spans_dt_vel_dust.get(
id)};
1200 auto graphs_xp = edges.cell_neigh_graph.get_refs_dir(Direction::xp);
1201 auto graphs_xm = edges.cell_neigh_graph.get_refs_dir(Direction::xm);
1202 auto graphs_yp = edges.cell_neigh_graph.get_refs_dir(Direction::yp);
1203 auto graphs_ym = edges.cell_neigh_graph.get_refs_dir(Direction::ym);
1204 auto graphs_zp = edges.cell_neigh_graph.get_refs_dir(Direction::zp);
1205 auto graphs_zm = edges.cell_neigh_graph.get_refs_dir(Direction::zm);
1208 = graphs_xp.template map<u32>([&](
u64 id,
auto &graph) {
1209 return graph.get().obj_cnt * ndust;
1212 = graphs_xm.template map<u32>([&](
u64 id,
auto &graph) {
1213 return graph.get().obj_cnt * ndust;
1216 = graphs_yp.template map<u32>([&](
u64 id,
auto &graph) {
1217 return graph.get().obj_cnt * ndust;
1220 = graphs_ym.template map<u32>([&](
u64 id,
auto &graph) {
1221 return graph.get().obj_cnt * ndust;
1224 = graphs_zp.template map<u32>([&](
u64 id,
auto &graph) {
1225 return graph.get().obj_cnt * ndust;
1228 = graphs_zm.template map<u32>([&](
u64 id,
auto &graph) {
1229 return graph.get().obj_cnt * ndust;
1233 shamsys::instance::get_compute_scheduler_ptr(),
1237 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1238 const u32 id_cell_a = idvar_a / ndust;
1239 const u32 nvar_loc = idvar_a % ndust;
1240 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1241 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1242 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1246 shamsys::instance::get_compute_scheduler_ptr(),
1250 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1251 const u32 id_cell_a = idvar_a / ndust;
1252 const u32 nvar_loc = idvar_a % ndust;
1253 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1254 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1255 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1259 shamsys::instance::get_compute_scheduler_ptr(),
1263 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1264 const u32 id_cell_a = idvar_a / ndust;
1265 const u32 nvar_loc = idvar_a % ndust;
1266 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1267 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1268 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1272 shamsys::instance::get_compute_scheduler_ptr(),
1276 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1277 const u32 id_cell_a = idvar_a / ndust;
1278 const u32 nvar_loc = idvar_a % ndust;
1279 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1280 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1281 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1285 shamsys::instance::get_compute_scheduler_ptr(),
1289 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1290 const u32 id_cell_a = idvar_a / ndust;
1291 const u32 nvar_loc = idvar_a % ndust;
1292 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1293 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1294 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1298 shamsys::instance::get_compute_scheduler_ptr(),
1302 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1303 const u32 id_cell_a = idvar_a / ndust;
1304 const u32 nvar_loc = idvar_a % ndust;
1305 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1306 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1307 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1312template<
class Tvec,
class Tgr
idVec>
utility to manipulate AMR blocks
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
Shamrock assertion utility.
#define SHAM_ASSERT(x)
Shorthand for SHAM_ASSERT_NAMED without a message.
Represents a collection of objects distributed across patches identified by a u64 id.
void _impl_evaluate_internal()
evaluate the node
virtual std::string _impl_get_tex() const
get the tex of the node
virtual std::string _impl_get_tex() const
get the tex of the node
void _impl_evaluate_internal()
evaluate the node
void _impl_evaluate_internal()
evaluate the node
virtual std::string _impl_get_tex() const
get the tex of the node
virtual std::string _impl_get_tex() const
get the tex of the node
void _impl_evaluate_internal()
evaluate the node
void _impl_evaluate_internal()
evaluate the node
virtual std::string _impl_get_tex() const
get the tex of the node
void distributed_data_kernel_call(sham::DeviceScheduler_ptr dev_sched, RefIn in, RefOut in_out, const shambase::DistributedData< index_t > &thread_counts, Functor &&func)
A variant of sham::kernel_call for distributed data.
#define __shamrock_stack_entry()
Macro to create a stack entry.
shambase::details::BasicStackEntry StackEntry
Alias for shambase::details::BasicStackEntry.
A variant of sham::MultiRef for distributed data.
T get_center() const noexcept
Returns the center of the AABB.
AABB get_intersect(AABB other) const noexcept
Compute the intersection of two AABB.
utility class to handle AMR blocks