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} {}
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 {
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>;
92 GetShift<Tvec, TgridVec, AMRBlock> shift_get;
94 const Tscal *acc_rho_cell;
95 const Tvec *acc_grad_rho_cell;
98 const Tvec *acc_vel_cell;
99 const Tvec *acc_dx_v_cell;
100 const Tvec *acc_dy_v_cell;
101 const Tvec *acc_dz_v_cell;
105 acc(
const Tvec *aabb_block_lower,
106 const Tscal *aabb_cell_size,
107 const Tscal *rho_cell,
108 const Tvec *grad_rho_cell,
111 const Tvec *vel_cell,
112 const Tvec *dx_v_cell,
113 const Tvec *dy_v_cell,
114 const Tvec *dz_v_cell)
115 : shift_get(aabb_block_lower, aabb_cell_size), acc_rho_cell{rho_cell},
116 acc_grad_rho_cell{grad_rho_cell}, dt_interp(dt_interp), acc_vel_cell{vel_cell},
117 acc_dx_v_cell{dx_v_cell}, acc_dy_v_cell{dy_v_cell}, acc_dz_v_cell{dz_v_cell} {}
120 Tscal rho, Tvec v, Tvec grad_rho, Tvec dx_v, Tvec dy_v, Tvec dz_v)
const {
121 return -(sham::dot(v, grad_rho) + rho * (dx_v[0] + dy_v[1] + dz_v[2]));
124 std::array<Tscal, 2> get_link_field_val(
u32 id_a,
u32 id_b)
const {
126 auto [shift_a, shift_b] = shift_get.get_shifts(id_a, id_b);
128 Tscal rho_a = acc_rho_cell[id_a];
129 Tvec grad_rho_a = acc_grad_rho_cell[id_a];
130 Tscal rho_b = acc_rho_cell[id_b];
131 Tvec grad_rho_b = acc_grad_rho_cell[id_b];
133 Tvec vel_a = acc_vel_cell[id_a];
134 Tvec dx_v_a = acc_dx_v_cell[id_a];
135 Tvec dy_v_a = acc_dy_v_cell[id_a];
136 Tvec dz_v_a = acc_dz_v_cell[id_a];
137 Tvec vel_b = acc_vel_cell[id_b];
138 Tvec dx_v_b = acc_dx_v_cell[id_b];
139 Tvec dy_v_b = acc_dy_v_cell[id_b];
140 Tvec dz_v_b = acc_dz_v_cell[id_b];
143 Tscal rho_face_a = rho_a + sycl::dot(grad_rho_a, shift_a);
144 Tscal rho_face_b = rho_b + sycl::dot(grad_rho_b, shift_b);
148 += get_dt_rho(rho_a, vel_a, grad_rho_a, dx_v_a, dy_v_a, dz_v_a) * dt_interp;
150 += get_dt_rho(rho_b, vel_b, grad_rho_b, dx_v_b, dy_v_b, dz_v_b) * dt_interp;
152 return {rho_face_a, rho_face_b};
170 inline void complete_event_state(sycl::event e) {
182 template<
class Tvec,
class Tgr
idVec,
class AMRBlock>
183 class VelInterpolate {
184 using Tscal = shambase::VecComponent<Tvec>;
201 GetShift<Tvec, TgridVec, AMRBlock> shift_get;
203 const Tvec *acc_vel_cell;
204 const Tvec *acc_dx_v_cell;
205 const Tvec *acc_dy_v_cell;
206 const Tvec *acc_dz_v_cell;
209 const Tscal *acc_rho_cell;
210 const Tvec *acc_grad_P_cell;
214 acc(
const Tvec *aabb_block_lower,
215 const Tscal *aabb_cell_size,
216 const Tvec *vel_cell,
217 const Tvec *dx_v_cell,
218 const Tvec *dy_v_cell,
219 const Tvec *dz_v_cell,
222 const Tscal *rho_cell,
223 const Tvec *grad_P_cell)
224 : shift_get(aabb_block_lower, aabb_cell_size), acc_vel_cell{vel_cell},
225 acc_dx_v_cell{dx_v_cell}, acc_dy_v_cell{dy_v_cell}, acc_dz_v_cell{dz_v_cell},
226 dt_interp(dt_interp), acc_rho_cell{rho_cell}, acc_grad_P_cell{grad_P_cell} {}
228 Tvec get_dt_v(Tvec v, Tvec dx_v, Tvec dy_v, Tvec dz_v, Tscal rho, Tvec grad_P)
const {
229 return -(v[0] * dx_v + v[1] * dy_v + v[2] * dz_v + grad_P / rho);
232 std::array<Tvec, 2> get_link_field_val(
u32 id_a,
u32 id_b)
const {
234 auto [shift_a, shift_b] = shift_get.get_shifts(id_a, id_b);
236 Tvec v_a = acc_vel_cell[id_a];
237 Tvec dx_vel_a = acc_dx_v_cell[id_a];
238 Tvec dy_vel_a = acc_dy_v_cell[id_a];
239 Tvec dz_vel_a = acc_dz_v_cell[id_a];
241 Tvec v_b = acc_vel_cell[id_b];
242 Tvec dx_vel_b = acc_dx_v_cell[id_b];
243 Tvec dy_vel_b = acc_dy_v_cell[id_b];
244 Tvec dz_vel_b = acc_dz_v_cell[id_b];
246 Tscal rho_a = acc_rho_cell[id_a];
247 Tvec grad_P_a = acc_grad_P_cell[id_a];
248 Tscal rho_b = acc_rho_cell[id_b];
249 Tvec grad_P_b = acc_grad_P_cell[id_b];
251 Tvec dx_v_a_dot_shift
252 = shift_a.x() * dx_vel_a + shift_a.y() * dy_vel_a + shift_a.z() * dz_vel_a;
253 Tvec dx_v_b_dot_shift
254 = shift_b.x() * dx_vel_b + shift_b.y() * dy_vel_b + shift_b.z() * dz_vel_b;
256 Tvec dt_v_a = get_dt_v(v_a, dx_vel_a, dy_vel_a, dz_vel_a, rho_a, grad_P_a);
257 Tvec dt_v_b = get_dt_v(v_b, dx_vel_b, dy_vel_b, dz_vel_b, rho_b, grad_P_b);
259 Tvec vel_face_a = v_a + dx_v_a_dot_shift + dt_v_a * dt_interp;
260 Tvec vel_face_b = v_b + dx_v_b_dot_shift + dt_v_b * dt_interp;
262 return {vel_face_a, vel_face_b};
280 inline void complete_event_state(sycl::event e) {
292 template<
class Tvec,
class Tgr
idVec,
class AMRBlock>
293 class PressInterpolate {
294 using Tscal = shambase::VecComponent<Tvec>;
311 GetShift<Tvec, TgridVec, AMRBlock> shift_get;
313 const Tscal *acc_P_cell;
314 const Tvec *acc_grad_P_cell;
317 const Tvec *acc_vel_cell;
318 const Tvec *acc_dx_v_cell;
319 const Tvec *acc_dy_v_cell;
320 const Tvec *acc_dz_v_cell;
325 acc(
const Tvec *aabb_block_lower,
326 const Tscal *aabb_cell_size,
328 const Tvec *grad_P_cell,
332 const Tvec *vel_cell,
333 const Tvec *dx_v_cell,
334 const Tvec *dy_v_cell,
335 const Tvec *dz_v_cell)
336 : shift_get(aabb_block_lower, aabb_cell_size), acc_P_cell{P_cell},
337 acc_grad_P_cell{grad_P_cell}, dt_interp(dt_interp), gamma(gamma),
338 acc_vel_cell{vel_cell}, acc_dx_v_cell{dx_v_cell}, acc_dy_v_cell{dy_v_cell},
339 acc_dz_v_cell{dz_v_cell} {}
342 Tscal P, Tvec grad_P, Tvec v, Tvec dx_v, Tvec dy_v, Tvec dz_v, Tscal gamma)
const {
343 return -(gamma * P * (dx_v[0] + dy_v[1] + dz_v[2]) + sham::dot(v, grad_P));
346 std::array<Tscal, 2> get_link_field_val(
u32 id_a,
u32 id_b)
const {
348 auto [shift_a, shift_b] = shift_get.get_shifts(id_a, id_b);
350 Tscal P_a = acc_P_cell[id_a];
351 Tvec grad_P_a = acc_grad_P_cell[id_a];
352 Tscal P_b = acc_P_cell[id_b];
353 Tvec grad_P_b = acc_grad_P_cell[id_b];
355 Tvec v_a = acc_vel_cell[id_a];
356 Tvec dx_v_a = acc_dx_v_cell[id_a];
357 Tvec dy_v_a = acc_dy_v_cell[id_a];
358 Tvec dz_v_a = acc_dz_v_cell[id_a];
359 Tvec v_b = acc_vel_cell[id_b];
360 Tvec dx_v_b = acc_dx_v_cell[id_b];
361 Tvec dy_v_b = acc_dy_v_cell[id_b];
362 Tvec dz_v_b = acc_dz_v_cell[id_b];
364 Tscal dtP_cell_a = get_dt_P(P_a, grad_P_a, v_a, dx_v_a, dy_v_a, dz_v_a, gamma);
365 Tscal dtP_cell_b = get_dt_P(P_b, grad_P_b, v_b, dx_v_b, dy_v_b, dz_v_b, gamma);
367 Tscal P_face_a = P_a + sycl::dot(grad_P_a, shift_a) + dtP_cell_a * dt_interp;
368 Tscal P_face_b = P_b + sycl::dot(grad_P_b, shift_b) + dtP_cell_b * dt_interp;
373 return {P_face_a, P_face_b};
391 inline void complete_event_state(sycl::event e) {
403 template<
class Tvec,
class Tgr
idVec,
class AMRBlock>
404 class RhoDustInterpolate {
405 using Tscal = shambase::VecComponent<Tvec>;
422 GetShift<Tvec, TgridVec, AMRBlock> shift_get;
425 const Tscal *acc_rho_dust_cell;
426 const Tvec *acc_grad_rho_dust_cell;
429 const Tvec *acc_vel_dust_cell;
430 const Tvec *acc_dx_v_dust_cell;
431 const Tvec *acc_dy_v_dust_cell;
432 const Tvec *acc_dz_v_dust_cell;
437 const Tvec *aabb_block_lower,
438 const Tscal *aabb_cell_size,
439 const Tscal *rho_dust_cell,
440 const Tvec *grad_rho_dust_cell,
443 const Tvec *vel_dust_cell,
444 const Tvec *dx_v_dust_cell,
445 const Tvec *dy_v_dust_cell,
446 const Tvec *dz_v_dust_cell)
447 : shift_get(aabb_block_lower, aabb_cell_size), nvar(nvar),
448 acc_rho_dust_cell{rho_dust_cell}, acc_grad_rho_dust_cell{grad_rho_dust_cell},
449 dt_interp(dt_interp), acc_vel_dust_cell{vel_dust_cell},
450 acc_dx_v_dust_cell{dx_v_dust_cell}, acc_dy_v_dust_cell{dy_v_dust_cell},
451 acc_dz_v_dust_cell{dz_v_dust_cell} {}
453 Tscal get_dt_rho_dust(
459 Tvec dz_v_dust)
const {
461 sham::dot(v_dust, grad_rho_dust)
462 + rho_dust * (dx_v_dust[0] + dy_v_dust[1] + dz_v_dust[2]));
465 std::array<Tscal, 2> get_link_field_val(
u32 id_a,
u32 id_b)
const {
466 const u32 icell_a = id_a / nvar;
467 const u32 icell_b = id_b / nvar;
469 auto [shift_a, shift_b] = shift_get.get_shifts(icell_a, icell_b);
471 Tscal rho_dust_a = acc_rho_dust_cell[id_a];
472 Tvec grad_rho_dust_a = acc_grad_rho_dust_cell[id_a];
473 Tscal rho_dust_b = acc_rho_dust_cell[id_b];
474 Tvec grad_rho_dust_b = acc_grad_rho_dust_cell[id_b];
476 Tvec vel_dust_a = acc_vel_dust_cell[id_a];
477 Tvec dx_v_dust_a = acc_dx_v_dust_cell[id_a];
478 Tvec dy_v_dust_a = acc_dy_v_dust_cell[id_a];
479 Tvec dz_v_dust_a = acc_dz_v_dust_cell[id_a];
480 Tvec vel_dust_b = acc_vel_dust_cell[id_b];
481 Tvec dx_v_dust_b = acc_dx_v_dust_cell[id_b];
482 Tvec dy_v_dust_b = acc_dy_v_dust_cell[id_b];
483 Tvec dz_v_dust_b = acc_dz_v_dust_cell[id_b];
485 Tscal rho_dust_face_a = rho_dust_a + sycl::dot(grad_rho_dust_a, shift_a);
486 Tscal rho_dust_face_b = rho_dust_b + sycl::dot(grad_rho_dust_b, shift_b);
488 rho_dust_face_a += get_dt_rho_dust(
496 rho_dust_face_b += get_dt_rho_dust(
505 return {rho_dust_face_a, rho_dust_face_b};
524 inline void complete_event_state(sycl::event e) {
536 template<
class Tvec,
class Tgr
idVec,
class AMRBlock>
537 class VelDustInterpolate {
538 using Tscal = shambase::VecComponent<Tvec>;
554 GetShift<Tvec, TgridVec, AMRBlock> shift_get;
557 const Tvec *acc_vel_dust_cell;
558 const Tvec *acc_dx_v_dust_cell;
559 const Tvec *acc_dy_v_dust_cell;
560 const Tvec *acc_dz_v_dust_cell;
563 const Tscal *acc_rho_dust_cell;
568 const Tvec *aabb_block_lower,
569 const Tscal *aabb_cell_size,
570 const Tvec *vel_dust_cell,
571 const Tvec *dx_v_dust_cell,
572 const Tvec *dy_v_dust_cell,
573 const Tvec *dz_v_dust_cell,
576 const Tscal *rho_dust_cell)
577 : shift_get(aabb_block_lower, aabb_cell_size), nvar(nvar),
578 acc_vel_dust_cell{vel_dust_cell}, acc_dx_v_dust_cell{dx_v_dust_cell},
579 acc_dy_v_dust_cell{dy_v_dust_cell}, acc_dz_v_dust_cell{dz_v_dust_cell},
580 dt_interp(dt_interp), acc_rho_dust_cell{rho_dust_cell} {}
582 Tvec get_dt_v_dust(Tvec v, Tvec dx_v, Tvec dy_v, Tvec dz_v, Tscal rho)
const {
583 return -(v[0] * dx_v + v[1] * dy_v + v[2] * dz_v);
586 std::array<Tvec, 2> get_link_field_val(
u32 id_a,
u32 id_b)
const {
587 const u32 icell_a = id_a / nvar;
588 const u32 icell_b = id_b / nvar;
590 auto [shift_a, shift_b] = shift_get.get_shifts(icell_a, icell_b);
592 Tvec v_dust_a = acc_vel_dust_cell[id_a];
593 Tvec dx_vel_dust_a = acc_dx_v_dust_cell[id_a];
594 Tvec dy_vel_dust_a = acc_dy_v_dust_cell[id_a];
595 Tvec dz_vel_dust_a = acc_dz_v_dust_cell[id_a];
597 Tvec v_dust_b = acc_vel_dust_cell[id_b];
598 Tvec dx_vel_dust_b = acc_dx_v_dust_cell[id_b];
599 Tvec dy_vel_dust_b = acc_dy_v_dust_cell[id_b];
600 Tvec dz_vel_dust_b = acc_dz_v_dust_cell[id_b];
602 Tscal rho_dust_a = acc_rho_dust_cell[id_a];
603 Tscal rho_dust_b = acc_rho_dust_cell[id_b];
605 Tvec dx_v_dust_a_dot_shift = shift_a.x() * dx_vel_dust_a
606 + shift_a.y() * dy_vel_dust_a
607 + shift_a.z() * dz_vel_dust_a;
608 Tvec dx_v_dust_b_dot_shift = shift_b.x() * dx_vel_dust_b
609 + shift_b.y() * dy_vel_dust_b
610 + shift_b.z() * dz_vel_dust_b;
612 Tvec dt_v_dust_a = get_dt_v_dust(
613 v_dust_a, dx_vel_dust_a, dy_vel_dust_a, dz_vel_dust_a, rho_dust_a);
614 Tvec dt_v_dust_b = get_dt_v_dust(
615 v_dust_b, dx_vel_dust_b, dy_vel_dust_b, dz_vel_dust_b, rho_dust_b);
617 Tvec vel_dust_face_a = v_dust_a + dx_v_dust_a_dot_shift + dt_v_dust_a * dt_interp;
618 Tvec vel_dust_face_b = v_dust_b + dx_v_dust_b_dot_shift + dt_v_dust_b * dt_interp;
620 return {vel_dust_face_a, vel_dust_face_b};
638 inline void complete_event_state(sycl::event e) {
651template<
class Tvec,
class Tgr
idVec>
658 static constexpr u32 NsideBlockPow = 1;
663 auto edges = get_edges();
665 auto dt_interp = edges.dt_interp.value;
674 rho_face_xp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xp));
675 rho_face_xm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xm));
676 rho_face_yp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::yp));
677 rho_face_ym.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::ym));
678 rho_face_zp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zp));
679 rho_face_zm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zm));
681 auto spans_block_cell_sizes = edges.spans_block_cell_sizes.get_spans();
682 auto spans_cell0block_aabb_lower = edges.spans_cell0block_aabb_lower.get_spans();
683 auto spans_rhos = edges.spans_rhos.get_spans();
684 auto spans_grad_rho = edges.spans_grad_rho.get_spans();
685 auto spans_vel = edges.spans_vel.get_spans();
686 auto spans_dx_vel = edges.spans_dx_vel.get_spans();
687 auto spans_dy_vel = edges.spans_dy_vel.get_spans();
688 auto spans_dz_vel = edges.spans_dz_vel.get_spans();
690 using Interp = RhoInterpolate<Tvec, TgridVec, AMRBlock>;
692 = spans_block_cell_sizes.template map<Interp>([&](
u64 id,
auto &csize) -> Interp {
694 spans_cell0block_aabb_lower.get(
id),
695 spans_block_cell_sizes.get(
id),
697 spans_grad_rho.get(
id),
700 spans_dx_vel.get(
id),
701 spans_dy_vel.get(
id),
702 spans_dz_vel.get(
id)};
705 auto graphs_xp = edges.cell_neigh_graph.get_refs_dir(Direction::xp);
706 auto graphs_xm = edges.cell_neigh_graph.get_refs_dir(Direction::xm);
707 auto graphs_yp = edges.cell_neigh_graph.get_refs_dir(Direction::yp);
708 auto graphs_ym = edges.cell_neigh_graph.get_refs_dir(Direction::ym);
709 auto graphs_zp = edges.cell_neigh_graph.get_refs_dir(Direction::zp);
710 auto graphs_zm = edges.cell_neigh_graph.get_refs_dir(Direction::zm);
713 = graphs_xp.template map<u32>([&](
u64 id,
auto &graph) {
714 return graph.get().obj_cnt;
717 = graphs_xm.template map<u32>([&](
u64 id,
auto &graph) {
718 return graph.get().obj_cnt;
721 = graphs_yp.template map<u32>([&](
u64 id,
auto &graph) {
722 return graph.get().obj_cnt;
725 = graphs_ym.template map<u32>([&](
u64 id,
auto &graph) {
726 return graph.get().obj_cnt;
729 = graphs_zp.template map<u32>([&](
u64 id,
auto &graph) {
730 return graph.get().obj_cnt;
733 = graphs_zm.template map<u32>([&](
u64 id,
auto &graph) {
734 return graph.get().obj_cnt;
738 shamsys::instance::get_compute_scheduler_ptr(),
742 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
743 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
744 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
748 shamsys::instance::get_compute_scheduler_ptr(),
752 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
753 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
754 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
758 shamsys::instance::get_compute_scheduler_ptr(),
762 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
763 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
764 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
768 shamsys::instance::get_compute_scheduler_ptr(),
772 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
773 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
774 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
778 shamsys::instance::get_compute_scheduler_ptr(),
782 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
783 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
784 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
788 shamsys::instance::get_compute_scheduler_ptr(),
792 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
793 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
794 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
799template<
class Tvec,
class Tgr
idVec>
807template<
class Tvec,
class Tgr
idVec>
814 static constexpr u32 NsideBlockPow = 1;
819 auto edges = get_edges();
821 auto dt_interp = edges.dt_interp.value;
830 vel_face_xp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xp));
831 vel_face_xm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xm));
832 vel_face_yp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::yp));
833 vel_face_ym.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::ym));
834 vel_face_zp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zp));
835 vel_face_zm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zm));
837 auto spans_block_cell_sizes = edges.spans_block_cell_sizes.get_spans();
838 auto spans_cell0block_aabb_lower = edges.spans_cell0block_aabb_lower.get_spans();
839 auto spans_rhos = edges.spans_rhos.get_spans();
840 auto spans_grad_P = edges.spans_grad_P.get_spans();
841 auto spans_vel = edges.spans_vel.get_spans();
842 auto spans_dx_vel = edges.spans_dx_vel.get_spans();
843 auto spans_dy_vel = edges.spans_dy_vel.get_spans();
844 auto spans_dz_vel = edges.spans_dz_vel.get_spans();
846 using Interp = VelInterpolate<Tvec, TgridVec, AMRBlock>;
848 = spans_block_cell_sizes.template map<Interp>([&](
u64 id,
auto &csize) -> Interp {
850 spans_cell0block_aabb_lower.get(
id),
851 spans_block_cell_sizes.get(
id),
853 spans_dx_vel.get(
id),
854 spans_dy_vel.get(
id),
855 spans_dz_vel.get(
id),
858 spans_grad_P.get(
id)};
861 auto graphs_xp = edges.cell_neigh_graph.get_refs_dir(Direction::xp);
862 auto graphs_xm = edges.cell_neigh_graph.get_refs_dir(Direction::xm);
863 auto graphs_yp = edges.cell_neigh_graph.get_refs_dir(Direction::yp);
864 auto graphs_ym = edges.cell_neigh_graph.get_refs_dir(Direction::ym);
865 auto graphs_zp = edges.cell_neigh_graph.get_refs_dir(Direction::zp);
866 auto graphs_zm = edges.cell_neigh_graph.get_refs_dir(Direction::zm);
869 = graphs_xp.template map<u32>([&](
u64 id,
auto &graph) {
870 return graph.get().obj_cnt;
873 = graphs_xm.template map<u32>([&](
u64 id,
auto &graph) {
874 return graph.get().obj_cnt;
877 = graphs_yp.template map<u32>([&](
u64 id,
auto &graph) {
878 return graph.get().obj_cnt;
881 = graphs_ym.template map<u32>([&](
u64 id,
auto &graph) {
882 return graph.get().obj_cnt;
885 = graphs_zp.template map<u32>([&](
u64 id,
auto &graph) {
886 return graph.get().obj_cnt;
889 = graphs_zm.template map<u32>([&](
u64 id,
auto &graph) {
890 return graph.get().obj_cnt;
894 shamsys::instance::get_compute_scheduler_ptr(),
898 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
899 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
900 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
904 shamsys::instance::get_compute_scheduler_ptr(),
908 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
909 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
910 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
914 shamsys::instance::get_compute_scheduler_ptr(),
918 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
919 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
920 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
924 shamsys::instance::get_compute_scheduler_ptr(),
928 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
929 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
930 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
934 shamsys::instance::get_compute_scheduler_ptr(),
938 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
939 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
940 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
944 shamsys::instance::get_compute_scheduler_ptr(),
948 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
949 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
950 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
955template<
class Tvec,
class Tgr
idVec>
963template<
class Tvec,
class Tgr
idVec>
970 static constexpr u32 NsideBlockPow = 1;
975 auto edges = get_edges();
977 auto dt_interp = edges.dt_interp.value;
986 press_face_xp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xp));
987 press_face_xm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xm));
988 press_face_yp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::yp));
989 press_face_ym.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::ym));
990 press_face_zp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zp));
991 press_face_zm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zm));
993 auto spans_block_cell_sizes = edges.spans_block_cell_sizes.get_spans();
994 auto spans_cell0block_aabb_lower = edges.spans_cell0block_aabb_lower.get_spans();
995 auto spans_press = edges.spans_press.get_spans();
996 auto spans_grad_P = edges.spans_grad_P.get_spans();
997 auto spans_vel = edges.spans_vel.get_spans();
998 auto spans_dx_vel = edges.spans_dx_vel.get_spans();
999 auto spans_dy_vel = edges.spans_dy_vel.get_spans();
1000 auto spans_dz_vel = edges.spans_dz_vel.get_spans();
1002 using Interp = PressInterpolate<Tvec, TgridVec, AMRBlock>;
1004 = spans_block_cell_sizes.template map<Interp>([&](
u64 id,
auto &csize) -> Interp {
1006 spans_cell0block_aabb_lower.get(
id),
1007 spans_block_cell_sizes.get(
id),
1008 spans_press.get(
id),
1009 spans_grad_P.get(
id),
1013 spans_dx_vel.get(
id),
1014 spans_dy_vel.get(
id),
1015 spans_dz_vel.get(
id)};
1018 auto graphs_xp = edges.cell_neigh_graph.get_refs_dir(Direction::xp);
1019 auto graphs_xm = edges.cell_neigh_graph.get_refs_dir(Direction::xm);
1020 auto graphs_yp = edges.cell_neigh_graph.get_refs_dir(Direction::yp);
1021 auto graphs_ym = edges.cell_neigh_graph.get_refs_dir(Direction::ym);
1022 auto graphs_zp = edges.cell_neigh_graph.get_refs_dir(Direction::zp);
1023 auto graphs_zm = edges.cell_neigh_graph.get_refs_dir(Direction::zm);
1026 = graphs_xp.template map<u32>([&](
u64 id,
auto &graph) {
1027 return graph.get().obj_cnt;
1030 = graphs_xm.template map<u32>([&](
u64 id,
auto &graph) {
1031 return graph.get().obj_cnt;
1034 = graphs_yp.template map<u32>([&](
u64 id,
auto &graph) {
1035 return graph.get().obj_cnt;
1038 = graphs_ym.template map<u32>([&](
u64 id,
auto &graph) {
1039 return graph.get().obj_cnt;
1042 = graphs_zp.template map<u32>([&](
u64 id,
auto &graph) {
1043 return graph.get().obj_cnt;
1046 = graphs_zm.template map<u32>([&](
u64 id,
auto &graph) {
1047 return graph.get().obj_cnt;
1051 shamsys::instance::get_compute_scheduler_ptr(),
1055 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1056 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
1057 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
1061 shamsys::instance::get_compute_scheduler_ptr(),
1065 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1066 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
1067 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
1071 shamsys::instance::get_compute_scheduler_ptr(),
1075 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1076 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
1077 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
1081 shamsys::instance::get_compute_scheduler_ptr(),
1085 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1086 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
1087 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
1091 shamsys::instance::get_compute_scheduler_ptr(),
1095 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1096 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
1097 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
1101 shamsys::instance::get_compute_scheduler_ptr(),
1105 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1106 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
1107 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
1112template<
class Tvec,
class Tgr
idVec>
1120template<
class Tvec,
class Tgr
idVec>
1127 static constexpr u32 NsideBlockPow = 1;
1132 auto edges = get_edges();
1134 auto dt_interp = edges.dt_interp.value;
1135 auto ndust = this->ndust;
1138 = edges.rho_dust_face_xp;
1140 = edges.rho_dust_face_xm;
1142 = edges.rho_dust_face_yp;
1144 = edges.rho_dust_face_ym;
1146 = edges.rho_dust_face_zp;
1148 = edges.rho_dust_face_zm;
1150 rho_dust_face_xp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xp));
1151 rho_dust_face_xm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xm));
1152 rho_dust_face_yp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::yp));
1153 rho_dust_face_ym.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::ym));
1154 rho_dust_face_zp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zp));
1155 rho_dust_face_zm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zm));
1157 auto spans_block_cell_sizes = edges.spans_block_cell_sizes.get_spans();
1158 auto spans_cell0block_aabb_lower = edges.spans_cell0block_aabb_lower.get_spans();
1159 auto spans_rhos_dust = edges.spans_rhos_dust.get_spans();
1160 auto spans_grad_rho_dust = edges.spans_grad_rho_dust.get_spans();
1161 auto spans_vel_dust = edges.spans_vel_dust.get_spans();
1162 auto spans_dx_vel_dust = edges.spans_dx_vel_dust.get_spans();
1163 auto spans_dy_vel_dust = edges.spans_dy_vel_dust.get_spans();
1164 auto spans_dz_vel_dust = edges.spans_dz_vel_dust.get_spans();
1166 using Interp = RhoDustInterpolate<Tvec, TgridVec, AMRBlock>;
1168 = spans_block_cell_sizes.template map<Interp>([&](
u64 id,
auto &csize) -> Interp {
1171 spans_cell0block_aabb_lower.get(
id),
1172 spans_block_cell_sizes.get(
id),
1173 spans_rhos_dust.get(
id),
1174 spans_grad_rho_dust.get(
id),
1176 spans_vel_dust.get(
id),
1177 spans_dx_vel_dust.get(
id),
1178 spans_dy_vel_dust.get(
id),
1179 spans_dz_vel_dust.get(
id)};
1182 auto graphs_xp = edges.cell_neigh_graph.get_refs_dir(Direction::xp);
1183 auto graphs_xm = edges.cell_neigh_graph.get_refs_dir(Direction::xm);
1184 auto graphs_yp = edges.cell_neigh_graph.get_refs_dir(Direction::yp);
1185 auto graphs_ym = edges.cell_neigh_graph.get_refs_dir(Direction::ym);
1186 auto graphs_zp = edges.cell_neigh_graph.get_refs_dir(Direction::zp);
1187 auto graphs_zm = edges.cell_neigh_graph.get_refs_dir(Direction::zm);
1190 = graphs_xp.template map<u32>([&](
u64 id,
auto &graph) {
1191 return graph.get().obj_cnt * ndust;
1194 = graphs_xm.template map<u32>([&](
u64 id,
auto &graph) {
1195 return graph.get().obj_cnt * ndust;
1198 = graphs_yp.template map<u32>([&](
u64 id,
auto &graph) {
1199 return graph.get().obj_cnt * ndust;
1202 = graphs_ym.template map<u32>([&](
u64 id,
auto &graph) {
1203 return graph.get().obj_cnt * ndust;
1206 = graphs_zp.template map<u32>([&](
u64 id,
auto &graph) {
1207 return graph.get().obj_cnt * ndust;
1210 = graphs_zm.template map<u32>([&](
u64 id,
auto &graph) {
1211 return graph.get().obj_cnt * ndust;
1215 shamsys::instance::get_compute_scheduler_ptr(),
1219 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1220 const u32 id_cell_a = idvar_a / ndust;
1221 const u32 nvar_loc = idvar_a % ndust;
1222 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1223 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1224 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1228 shamsys::instance::get_compute_scheduler_ptr(),
1232 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1233 const u32 id_cell_a = idvar_a / ndust;
1234 const u32 nvar_loc = idvar_a % ndust;
1235 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1236 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1237 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1241 shamsys::instance::get_compute_scheduler_ptr(),
1245 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1246 const u32 id_cell_a = idvar_a / ndust;
1247 const u32 nvar_loc = idvar_a % ndust;
1248 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1249 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1250 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1254 shamsys::instance::get_compute_scheduler_ptr(),
1258 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1259 const u32 id_cell_a = idvar_a / ndust;
1260 const u32 nvar_loc = idvar_a % ndust;
1261 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1262 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1263 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1267 shamsys::instance::get_compute_scheduler_ptr(),
1271 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1272 const u32 id_cell_a = idvar_a / ndust;
1273 const u32 nvar_loc = idvar_a % ndust;
1274 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1275 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1276 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1280 shamsys::instance::get_compute_scheduler_ptr(),
1284 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1285 const u32 id_cell_a = idvar_a / ndust;
1286 const u32 nvar_loc = idvar_a % ndust;
1287 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1288 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1289 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1294template<
class Tvec,
class Tgr
idVec>
1302template<
class Tvec,
class Tgr
idVec>
1309 static constexpr u32 NsideBlockPow = 1;
1314 auto edges = get_edges();
1316 auto dt_interp = edges.dt_interp.value;
1317 auto ndust = this->ndust;
1320 = edges.vel_dust_face_xp;
1322 = edges.vel_dust_face_xm;
1324 = edges.vel_dust_face_yp;
1326 = edges.vel_dust_face_ym;
1328 = edges.vel_dust_face_zp;
1330 = edges.vel_dust_face_zm;
1332 vel_dust_face_xp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xp));
1333 vel_dust_face_xm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::xm));
1334 vel_dust_face_yp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::yp));
1335 vel_dust_face_ym.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::ym));
1336 vel_dust_face_zp.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zp));
1337 vel_dust_face_zm.resize_according_to(edges.cell_neigh_graph.get_refs_dir(Direction::zm));
1339 auto spans_block_cell_sizes = edges.spans_block_cell_sizes.get_spans();
1340 auto spans_cell0block_aabb_lower = edges.spans_cell0block_aabb_lower.get_spans();
1341 auto spans_rhos_dust = edges.spans_rhos_dust.get_spans();
1342 auto spans_vel_dust = edges.spans_vel_dust.get_spans();
1343 auto spans_dx_vel_dust = edges.spans_dx_vel_dust.get_spans();
1344 auto spans_dy_vel_dust = edges.spans_dy_vel_dust.get_spans();
1345 auto spans_dz_vel_dust = edges.spans_dz_vel_dust.get_spans();
1347 using Interp = VelDustInterpolate<Tvec, TgridVec, AMRBlock>;
1349 = spans_block_cell_sizes.template map<Interp>([&](
u64 id,
auto &csize) -> Interp {
1352 spans_cell0block_aabb_lower.get(
id),
1353 spans_block_cell_sizes.get(
id),
1354 spans_vel_dust.get(
id),
1355 spans_dx_vel_dust.get(
id),
1356 spans_dy_vel_dust.get(
id),
1357 spans_dz_vel_dust.get(
id),
1359 spans_rhos_dust.get(
id)};
1362 auto graphs_xp = edges.cell_neigh_graph.get_refs_dir(Direction::xp);
1363 auto graphs_xm = edges.cell_neigh_graph.get_refs_dir(Direction::xm);
1364 auto graphs_yp = edges.cell_neigh_graph.get_refs_dir(Direction::yp);
1365 auto graphs_ym = edges.cell_neigh_graph.get_refs_dir(Direction::ym);
1366 auto graphs_zp = edges.cell_neigh_graph.get_refs_dir(Direction::zp);
1367 auto graphs_zm = edges.cell_neigh_graph.get_refs_dir(Direction::zm);
1370 = graphs_xp.template map<u32>([&](
u64 id,
auto &graph) {
1371 return graph.get().obj_cnt * ndust;
1374 = graphs_xm.template map<u32>([&](
u64 id,
auto &graph) {
1375 return graph.get().obj_cnt * ndust;
1378 = graphs_yp.template map<u32>([&](
u64 id,
auto &graph) {
1379 return graph.get().obj_cnt * ndust;
1382 = graphs_ym.template map<u32>([&](
u64 id,
auto &graph) {
1383 return graph.get().obj_cnt * ndust;
1386 = graphs_zp.template map<u32>([&](
u64 id,
auto &graph) {
1387 return graph.get().obj_cnt * ndust;
1390 = graphs_zm.template map<u32>([&](
u64 id,
auto &graph) {
1391 return graph.get().obj_cnt * ndust;
1395 shamsys::instance::get_compute_scheduler_ptr(),
1399 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1400 const u32 id_cell_a = idvar_a / ndust;
1401 const u32 nvar_loc = idvar_a % ndust;
1402 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1403 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1404 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1408 shamsys::instance::get_compute_scheduler_ptr(),
1412 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1413 const u32 id_cell_a = idvar_a / ndust;
1414 const u32 nvar_loc = idvar_a % ndust;
1415 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1416 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1417 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1421 shamsys::instance::get_compute_scheduler_ptr(),
1425 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1426 const u32 id_cell_a = idvar_a / ndust;
1427 const u32 nvar_loc = idvar_a % ndust;
1428 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1429 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1430 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1434 shamsys::instance::get_compute_scheduler_ptr(),
1438 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1439 const u32 id_cell_a = idvar_a / ndust;
1440 const u32 nvar_loc = idvar_a % ndust;
1441 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1442 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1443 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1447 shamsys::instance::get_compute_scheduler_ptr(),
1451 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1452 const u32 id_cell_a = idvar_a / ndust;
1453 const u32 nvar_loc = idvar_a % ndust;
1454 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1455 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1456 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1460 shamsys::instance::get_compute_scheduler_ptr(),
1464 [ndust](
u32 idvar_a,
auto link_iter,
auto compute,
auto acc_link_field) {
1465 const u32 id_cell_a = idvar_a / ndust;
1466 const u32 nvar_loc = idvar_a % ndust;
1467 link_iter.for_each_object_link_id(id_cell_a, [&](
u32 id_cell_b,
u32 link_id) {
1468 acc_link_field[link_id * ndust + nvar_loc] = compute.get_link_field_val(
1469 id_cell_a * ndust + nvar_loc, id_cell_b * ndust + nvar_loc);
1474template<
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.
Class to manage a list of SYCL events.
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
Represents a span of data within a PatchDataField.
auto get_read_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{}) const -> details::PatchDataFieldSpan_access_ro_dyn_nvar< T >
Returns a read-only accessor to the data in the span.
void complete_event_state(sycl::event e) const
Completes the event state of the underlying buffer.
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.
A variant of sham::MultiRef for distributed data.
Axis-Aligned bounding box.
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