23template<
class Tvec,
class Tgr
idVec>
27 using namespace shamrock::patch;
42 utility.make_compute_field<sycl::vec<Tscal, 8>>(
"Q", Block::block_size, [&](
u64 id) {
43 return storage.merged_patchdata_ghost.get().get(id).total_elements;
53 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
65 bool cons_transp = solver_config.use_consistent_transport;
72 auto vel = buf_vel.get_read_access(depends_list);
73 auto eint = buf_eint.get_read_access(depends_list);
75 auto vel_xp = buf_vel_xp.get_read_access(depends_list);
81 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
82 Block::for_each_cells(
83 cgh, mpdat.total_elements,
"compite Pis", [=](
u32 ,
u32 cell_gid) {
84 Tscal r = rho[cell_gid];
85 Tscal e = eint[cell_gid];
86 Tvec vm = vel[cell_gid];
87 Tvec vxp = vel_xp[cell_gid];
88 Tvec vyp = vel_yp[cell_gid];
89 Tvec vzp = vel_zp[cell_gid];
95 Tscal tmp_x = vxp.x() * r;
96 Tscal tmp_y = vyp.y() * r;
97 Tscal tmp_z = vzp.z() * r;
99 Q[cell_gid] = {r, tmp_m.x(), tmp_m.y(), tmp_m.z(), tmp_x, tmp_y, tmp_z, e};
104 Tscal tmp_x = vxp.x();
105 Tscal tmp_y = vyp.y();
106 Tscal tmp_z = vzp.z();
109 = {r, tmp_m.x(), tmp_m.y(), tmp_m.z(), tmp_x, tmp_y, tmp_z, e / r};
114 buf_rho.complete_event_state(e);
115 buf_vel.complete_event_state(e);
116 buf_eint.complete_event_state(e);
118 buf_vel_xp.complete_event_state(e);
119 buf_vel_yp.complete_event_state(e);
120 buf_vel_zp.complete_event_state(e);
122 buf_Q.complete_event_state(e);
126template<
class Tvec,
class Tgr
idVec>
130 using namespace shamrock::patch;
135 using Block =
typename Config::AMRBlock;
137 using Tscal8 = sycl::vec<Tscal, 8>;
140 modules::ValueLoader<Tvec, TgridVec, Tscal8> val_load_vec8(context, solver_config, storage);
142 storage.Q_xm.set(val_load_vec8.load_value_with_gz(Q, {-1, 0, 0},
"Q_xm"));
143 storage.Q_ym.set(val_load_vec8.load_value_with_gz(Q, {0, -1, 0},
"Q_ym"));
144 storage.Q_zm.set(val_load_vec8.load_value_with_gz(Q, {0, 0, -1},
"Q_zm"));
156 storage.a_x.set(utility.make_compute_field<Tscal8>(
"a_x", Block::block_size, [&](
u64 id) {
157 return storage.merged_patchdata_ghost.get().get(id).total_elements;
160 storage.a_y.set(utility.make_compute_field<Tscal8>(
"a_y", Block::block_size, [&](
u64 id) {
161 return storage.merged_patchdata_ghost.get().get(id).total_elements;
164 storage.a_z.set(utility.make_compute_field<Tscal8>(
"a_z", Block::block_size, [&](
u64 id) {
165 return storage.merged_patchdata_ghost.get().get(id).total_elements;
173 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
195 auto cell_max = buf_cell_max.get_read_access(depends_list);
197 auto Q = buf_Q.get_read_access(depends_list);
202 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
203 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
205 Block::for_each_cells(
206 cgh, mpdat.total_elements,
"compite a_x", [=](
u32 block_id,
u32 cell_gid) {
207 Tscal d_cell = (cell_max[block_id] - cell_min[block_id])
208 .template convert<Tscal>()
212 Tscal8 Qi = Q[cell_gid];
213 Tscal8 Qim = Q_xm[cell_gid];
214 Tscal8 Qip = Q_xp[cell_gid];
216 Tscal8 dqm = (Qi - Qim) / d_cell;
217 Tscal8 dqp = (Qip - Qi) / d_cell;
219 a_x[cell_gid] = Tscal8{
220 shammath::van_leer_slope(dqm.s0(), dqp.s0()),
221 shammath::van_leer_slope(dqm.s1(), dqp.s1()),
222 shammath::van_leer_slope(dqm.s2(), dqp.s2()),
223 shammath::van_leer_slope(dqm.s3(), dqp.s3()),
224 shammath::van_leer_slope(dqm.s4(), dqp.s4()),
225 shammath::van_leer_slope(dqm.s5(), dqp.s5()),
226 shammath::van_leer_slope(dqm.s6(), dqp.s6()),
227 shammath::van_leer_slope(dqm.s7(), dqp.s7())};
231 buf_cell_max.complete_event_state(e);
232 buf_Q.complete_event_state(e);
241 auto cell_max = buf_cell_max.get_read_access(depends_list);
243 auto Q = buf_Q.get_read_access(depends_list);
248 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
249 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
251 Block::for_each_cells(
252 cgh, mpdat.total_elements,
"compite a_y", [=](
u32 block_id,
u32 cell_gid) {
253 Tscal d_cell = (cell_max[block_id] - cell_min[block_id])
254 .template convert<Tscal>()
258 Tscal8 Qi = Q[cell_gid];
259 Tscal8 Qim = Q_ym[cell_gid];
260 Tscal8 Qip = Q_yp[cell_gid];
262 Tscal8 dqm = (Qi - Qim) / d_cell;
263 Tscal8 dqp = (Qip - Qi) / d_cell;
265 a_y[cell_gid] = Tscal8{
266 shammath::van_leer_slope(dqm.s0(), dqp.s0()),
267 shammath::van_leer_slope(dqm.s1(), dqp.s1()),
268 shammath::van_leer_slope(dqm.s2(), dqp.s2()),
269 shammath::van_leer_slope(dqm.s3(), dqp.s3()),
270 shammath::van_leer_slope(dqm.s4(), dqp.s4()),
271 shammath::van_leer_slope(dqm.s5(), dqp.s5()),
272 shammath::van_leer_slope(dqm.s6(), dqp.s6()),
273 shammath::van_leer_slope(dqm.s7(), dqp.s7())};
277 buf_cell_max.complete_event_state(e);
278 buf_Q.complete_event_state(e);
287 auto cell_max = buf_cell_max.get_read_access(depends_list);
289 auto Q = buf_Q.get_read_access(depends_list);
294 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
295 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
297 Block::for_each_cells(
298 cgh, mpdat.total_elements,
"compite a_z", [=](
u32 block_id,
u32 cell_gid) {
299 Tscal d_cell = (cell_max[block_id] - cell_min[block_id])
300 .template convert<Tscal>()
304 Tscal8 Qi = Q[cell_gid];
305 Tscal8 Qim = Q_zm[cell_gid];
306 Tscal8 Qip = Q_zp[cell_gid];
308 Tscal8 dqm = (Qi - Qim) / d_cell;
309 Tscal8 dqp = (Qip - Qi) / d_cell;
311 a_z[cell_gid] = Tscal8{
312 shammath::van_leer_slope(dqm.s0(), dqp.s0()),
313 shammath::van_leer_slope(dqm.s1(), dqp.s1()),
314 shammath::van_leer_slope(dqm.s2(), dqp.s2()),
315 shammath::van_leer_slope(dqm.s3(), dqp.s3()),
316 shammath::van_leer_slope(dqm.s4(), dqp.s4()),
317 shammath::van_leer_slope(dqm.s5(), dqp.s5()),
318 shammath::van_leer_slope(dqm.s6(), dqp.s6()),
319 shammath::van_leer_slope(dqm.s7(), dqp.s7())};
323 buf_cell_max.complete_event_state(e);
324 buf_Q.complete_event_state(e);
330 if (a_x.get_field(p.id_patch).has_nan()) {
331 logger::err_ln(
"[Zeus]",
"nan detected in a_x");
335 if (a_y.get_field(p.id_patch).has_nan()) {
336 logger::err_ln(
"[Zeus]",
"nan detected in a_y");
340 if (a_z.get_field(p.id_patch).has_nan()) {
341 logger::err_ln(
"[Zeus]",
"nan detected in a_z");
347template<
class Tvec,
class Tgr
idVec>
353 using namespace shamrock::patch;
358 using Block =
typename Config::AMRBlock;
360 using Tscal8 = sycl::vec<Tscal, 8>;
362 modules::ValueLoader<Tvec, TgridVec, Tscal8> val_load_vec8(context, solver_config, storage);
378 utility.make_compute_field<Tscal8>(
"Qstar_x", Block::block_size, [&](
u64 id) {
379 return storage.merged_patchdata_ghost.get().get(id).total_elements;
383 utility.make_compute_field<Tscal8>(
"Qstar_y", Block::block_size, [&](
u64 id) {
384 return storage.merged_patchdata_ghost.get().get(id).total_elements;
388 utility.make_compute_field<Tscal8>(
"Qstar_z", Block::block_size, [&](
u64 id) {
389 return storage.merged_patchdata_ghost.get().get(id).total_elements;
405 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
432 auto cell_max = buf_cell_max.get_read_access(depends_list);
434 auto Q = buf_Q.get_read_access(depends_list);
442 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
443 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
445 bool enable_vanleer = solver_config.use_van_leer;
446 Block::for_each_cells(
447 cgh, mpdat.total_elements,
"compite a_z", [=](
u32 block_id,
u32 cell_gid) {
448 Tscal d_cell = (cell_max[block_id] - cell_min[block_id])
449 .template convert<Tscal>()
453 Tscal8 Qi = Q[cell_gid];
454 Tscal8 Qim = Q_xm[cell_gid];
455 Tscal8 ai = a_x[cell_gid];
456 Tscal8 aim = a_xm[cell_gid];
457 Tscal vx = vel[cell_gid].x();
461 if (enable_vanleer) {
463 res = Qim + 0.5 * (d_cell - vx * dt) * aim;
465 res = Qi - 0.5 * (d_cell + vx * dt) * ai;
475 Qstar_x[cell_gid] = res;
479 buf_cell_max.complete_event_state(e);
480 buf_Q.complete_event_state(e);
491 auto cell_max = buf_cell_max.get_read_access(depends_list);
493 auto Q = buf_Q.get_read_access(depends_list);
501 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
502 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
504 bool enable_vanleer = solver_config.use_van_leer;
505 Block::for_each_cells(
506 cgh, mpdat.total_elements,
"compite a_z", [=](
u32 block_id,
u32 cell_gid) {
507 Tscal d_cell = (cell_max[block_id] - cell_min[block_id])
508 .template convert<Tscal>()
512 Tscal8 Qi = Q[cell_gid];
513 Tscal8 Qim = Q_ym[cell_gid];
514 Tscal8 ai = a_y[cell_gid];
515 Tscal8 aim = a_ym[cell_gid];
516 Tscal vy = vel[cell_gid].y();
519 if (enable_vanleer) {
521 res = Qim + aim * (d_cell - vy * dt) * 0.5;
523 res = Qi - ai * (d_cell + vy * dt) * 0.5;
533 Qstar_y[cell_gid] = res;
537 buf_cell_max.complete_event_state(e);
538 buf_Q.complete_event_state(e);
549 auto cell_max = buf_cell_max.get_read_access(depends_list);
551 auto Q = buf_Q.get_read_access(depends_list);
559 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
560 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
562 bool enable_vanleer = solver_config.use_van_leer;
563 Block::for_each_cells(
564 cgh, mpdat.total_elements,
"compite a_z", [=](
u32 block_id,
u32 cell_gid) {
565 Tscal d_cell = (cell_max[block_id] - cell_min[block_id])
566 .template convert<Tscal>()
570 Tscal8 Qi = Q[cell_gid];
571 Tscal8 Qim = Q_zm[cell_gid];
572 Tscal8 ai = a_z[cell_gid];
573 Tscal8 aim = a_zm[cell_gid];
574 Tscal vz = vel[cell_gid].z();
578 if (enable_vanleer) {
580 res = Qim + aim * (d_cell - vz * dt) * 0.5;
582 res = Qi - ai * (d_cell + vz * dt) * 0.5;
592 Qstar_z[cell_gid] = res;
597 buf_cell_max.complete_event_state(e);
598 buf_Q.complete_event_state(e);
608template<
class Tvec,
class Tgr
idVec>
614 using Tscal8 = sycl::vec<Tscal, 8>;
620 modules::GhostZones gz(context, solver_config, storage);
622 auto Qstar_x_out = gz.exchange_compute_field(Qstar_x_in);
623 auto Qstar_y_out = gz.exchange_compute_field(Qstar_y_in);
624 auto Qstar_z_out = gz.exchange_compute_field(Qstar_z_in);
626 storage.Qstar_x.reset();
627 storage.Qstar_y.reset();
628 storage.Qstar_z.reset();
630 storage.Qstar_x.set(std::move(Qstar_x_out));
631 storage.Qstar_y.set(std::move(Qstar_y_out));
632 storage.Qstar_z.set(std::move(Qstar_z_out));
635template<
class Tvec,
class Tgr
idVec>
640 using namespace shamrock::patch;
645 using Block =
typename Config::AMRBlock;
647 using Tscal8 = sycl::vec<Tscal, 8>;
650 storage.Flux_x.set(utility.make_compute_field<Tscal8>(
"Flux_x", Block::block_size, [&](
u64 id) {
651 return storage.merged_patchdata_ghost.get().get(id).total_elements;
654 storage.Flux_y.set(utility.make_compute_field<Tscal8>(
"Flux_y", Block::block_size, [&](
u64 id) {
655 return storage.merged_patchdata_ghost.get().get(id).total_elements;
658 storage.Flux_z.set(utility.make_compute_field<Tscal8>(
"Flux_z", Block::block_size, [&](
u64 id) {
659 return storage.merged_patchdata_ghost.get().get(id).total_elements;
679 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
696 auto cell_max = buf_cell_max.get_read_access(depends_list);
698 auto Qstar_x = buf_Qstar_x.get_read_access(depends_list);
703 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
704 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
706 bool const_transp = solver_config.use_consistent_transport;
707 Block::for_each_cells(
708 cgh, mpdat.total_elements,
"compite a_z", [=](
u32 block_id,
u32 cell_gid) {
710 = (cell_max[block_id] - cell_min[block_id]).template convert<Tscal>()
713 Tscal8 Qstari = Qstar_x[cell_gid];
714 Tscal vx = vel[cell_gid].x();
718 Qstari.s1() *= Qstari.s0();
719 Qstari.s2() *= Qstari.s0();
720 Qstari.s3() *= Qstari.s0();
721 Qstari.s4() *= Qstari.s0();
722 Qstari.s5() *= Qstari.s0();
723 Qstari.s6() *= Qstari.s0();
724 Qstari.s7() *= Qstari.s0();
727 Flux_x[cell_gid] = Qstari * (vx * d_cell.y() * d_cell.z());
731 buf_cell_max.complete_event_state(e);
732 buf_Qstar_x.complete_event_state(e);
740 auto cell_max = buf_cell_max.get_read_access(depends_list);
747 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
748 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
750 bool const_transp = solver_config.use_consistent_transport;
751 Block::for_each_cells(
752 cgh, mpdat.total_elements,
"compite a_z", [=](
u32 block_id,
u32 cell_gid) {
754 = (cell_max[block_id] - cell_min[block_id]).template convert<Tscal>()
757 Tscal8 Qstari = Qstar_y[cell_gid];
758 Tscal vy = vel[cell_gid].y();
761 Qstari.s1() *= Qstari.s0();
762 Qstari.s2() *= Qstari.s0();
763 Qstari.s3() *= Qstari.s0();
764 Qstari.s4() *= Qstari.s0();
765 Qstari.s5() *= Qstari.s0();
766 Qstari.s6() *= Qstari.s0();
767 Qstari.s7() *= Qstari.s0();
769 Flux_y[cell_gid] = Qstari * (vy * d_cell.x() * d_cell.z());
773 buf_cell_max.complete_event_state(e);
782 auto cell_max = buf_cell_max.get_read_access(depends_list);
789 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
790 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
792 bool const_transp = solver_config.use_consistent_transport;
793 Block::for_each_cells(
794 cgh, mpdat.total_elements,
"compite a_z", [=](
u32 block_id,
u32 cell_gid) {
796 = (cell_max[block_id] - cell_min[block_id]).template convert<Tscal>()
799 Tscal8 Qstari = Qstar_z[cell_gid];
800 Tscal vz = vel[cell_gid].z();
803 Qstari.s1() *= Qstari.s0();
804 Qstari.s2() *= Qstari.s0();
805 Qstari.s3() *= Qstari.s0();
806 Qstari.s4() *= Qstari.s0();
807 Qstari.s5() *= Qstari.s0();
808 Qstari.s6() *= Qstari.s0();
809 Qstari.s7() *= Qstari.s0();
811 Flux_z[cell_gid] = Qstari * (vz * d_cell.x() * d_cell.y());
815 buf_cell_max.complete_event_state(e);
822 storage.Qstar_x.reset();
823 storage.Qstar_y.reset();
824 storage.Qstar_z.reset();
827template<
class Tvec,
class Tgr
idVec>
832 using namespace shamrock::patch;
837 using Block =
typename Config::AMRBlock;
839 using Tscal8 = sycl::vec<Tscal, 8>;
845 modules::ValueLoader<Tvec, TgridVec, Tscal8> val_load_vec8(context, solver_config, storage);
846 storage.Flux_xp.set(val_load_vec8.load_value_with_gz(Flux_x, {1, 0, 0},
"Flux_xp"));
847 storage.Flux_yp.set(val_load_vec8.load_value_with_gz(Flux_y, {0, 1, 0},
"Flux_yp"));
848 storage.Flux_zp.set(val_load_vec8.load_value_with_gz(Flux_z, {0, 0, 1},
"Flux_zp"));
851template<
class Tvec,
class Tgr
idVec>
856 using namespace shamrock::patch;
861 using Block =
typename Config::AMRBlock;
863 using Tscal8 = sycl::vec<Tscal, 8>;
874 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
890 auto cell_max = buf_cell_max.get_read_access(depends_list);
892 auto Q = buf_Q.get_write_access(depends_list);
900 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
903 Tscal coord_conv_fact = solver_config.grid_coord_to_pos_fact / Block::Nside;
905 bool const_transp = solver_config.use_consistent_transport;
906 Block::for_each_cells(
907 cgh, mpdat.total_elements,
"compite a_z", [=](
u32 block_id,
u32 cell_gid) {
909 = (cell_max[block_id] - cell_min[block_id]).template convert<Tscal>()
912 Tscal V = d_cell.x() * d_cell.y() * d_cell.z();
916 fsum -= Flux_xp[cell_gid];
917 fsum -= Flux_yp[cell_gid];
918 fsum -= Flux_zp[cell_gid];
919 fsum += Flux_x[cell_gid];
920 fsum += Flux_y[cell_gid];
921 fsum += Flux_z[cell_gid];
926 Tscal8 Qtmp = Q[cell_gid];
930 Qtmp.s1() *= Qtmp.s0();
931 Qtmp.s2() *= Qtmp.s0();
932 Qtmp.s3() *= Qtmp.s0();
933 Qtmp.s4() *= Qtmp.s0();
934 Qtmp.s5() *= Qtmp.s0();
935 Qtmp.s6() *= Qtmp.s0();
936 Qtmp.s7() *= Qtmp.s0();
945 buf_cell_max.complete_event_state(e);
946 buf_Q.complete_event_state(e);
955 storage.Flux_x.reset();
956 storage.Flux_y.reset();
957 storage.Flux_z.reset();
958 storage.Flux_xp.reset();
959 storage.Flux_yp.reset();
960 storage.Flux_zp.reset();
963template<
class Tvec,
class Tgr
idVec>
968 using namespace shamrock::patch;
973 using Block =
typename Config::AMRBlock;
975 using Tscal8 = sycl::vec<Tscal, 8>;
979 modules::ValueLoader<Tvec, TgridVec, Tscal8> val_load_vec8(context, solver_config, storage);
980 storage.Q_xm.set(val_load_vec8.load_value_with_gz(Q, {-1, 0, 0},
"Q_xm"));
981 storage.Q_ym.set(val_load_vec8.load_value_with_gz(Q, {0, -1, 0},
"Q_ym"));
982 storage.Q_zm.set(val_load_vec8.load_value_with_gz(Q, {0, 0, -1},
"Q_zm"));
995 MergedPDat &mpdat = storage.merged_patchdata_ghost.get().get(p.id_patch);
1009 auto Q = buf_Q.get_read_access(depends_list);
1015 auto reint = buf_eint.get_write_access(depends_list);
1016 auto rvel = buf_vel.get_write_access(depends_list);
1018 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
1019 Block::for_each_cells(
1020 cgh, mpdat.total_elements,
"compite a_z", [=](
u32 block_id,
u32 cell_gid) {
1021 Tscal8 Q_i_j_k = Q[cell_gid];
1022 Tscal8 Q_im1_j_k = Q_xm[cell_gid];
1023 Tscal8 Q_i_jm1_k = Q_ym[cell_gid];
1024 Tscal8 Q_i_j_km1 = Q_zm[cell_gid];
1026 Tscal rho = Q_i_j_k.s0();
1028 Tscal vx = (Q_i_j_k.s1() + Q_im1_j_k.s4()) / (Q_i_j_k.s0() + Q_im1_j_k.s0());
1029 Tscal vy = (Q_i_j_k.s2() + Q_i_jm1_k.s5()) / (Q_i_j_k.s0() + Q_i_jm1_k.s0());
1030 Tscal vz = (Q_i_j_k.s3() + Q_i_j_km1.s6()) / (Q_i_j_k.s0() + Q_i_j_km1.s0());
1032 Tscal e = Q_i_j_k.s7();
1034 rrho[cell_gid] = rho;
1035 reint[cell_gid] = e;
1036 rvel[cell_gid] = {vx, vy, vz};
1040 buf_Q.complete_event_state(e);
1046 buf_eint.complete_event_state(e);
1047 buf_vel.complete_event_state(e);
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
A buffer allocated in USM (Unified Shared Memory)
void complete_event_state(sycl::event e) const
Complete the event state of the buffer.
T * get_write_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{})
Get a read-write pointer to the buffer's data.
const T * get_read_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{}) const
Get a read-only pointer to the buffer's data.
A SYCL queue associated with a device and a context.
sycl::event submit(Fct &&fct)
Submits a kernel to the SYCL queue.
DeviceQueue & get_queue(u32 id=0)
Get a reference to a DeviceQueue.
Class to manage a list of SYCL events.
void compute_cell_centered_momentas()
Compute face momentas ( eq 48 49)
u32 get_field_idx(const std::string &field_name) const
Get the field id if matching name & type.
PatchDataLayer container class, the layout is described in patchdata_layout.
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.
T & get_check_ref(const std::unique_ptr< T > &ptr, SourceLocation loc=SourceLocation())
Takes a std::unique_ptr and returns a reference to the object it holds. It throws a std::runtime_erro...
namespace for math utility
namespace for the main framework
Math header to compute slope limiters.
utility class to handle AMR blocks
Patch object that contain generic patch information.