29 using RiemannSolverMode = shammodels::basegodunov::RiemannSolverMode;
31 using Direction = shammodels::basegodunov::modules::Direction;
33 template<
class Tvec, RiemannSolverMode mode, Direction dir>
38 using Tscal =
typename Tcons::Tscal;
40 inline static constexpr Tcons flux(
Tprim pL,
Tprim pR,
typename Tcons::Tscal gamma) {
41 Tcons cL = shammath::prim_to_cons(pL, gamma);
42 Tcons cR = shammath::prim_to_cons(pR, gamma);
44 if constexpr (mode == RiemannSolverMode::Rusanov) {
45 if constexpr (dir == Direction::xp) {
46 return shammath::rusanov_flux_x(cL, cR, gamma);
48 if constexpr (dir == Direction::yp) {
49 return shammath::rusanov_flux_y(cL, cR, gamma);
51 if constexpr (dir == Direction::zp) {
52 return shammath::rusanov_flux_z(cL, cR, gamma);
54 if constexpr (dir == Direction::xm) {
55 return shammath::rusanov_flux_mx(cL, cR, gamma);
57 if constexpr (dir == Direction::ym) {
58 return shammath::rusanov_flux_my(cL, cR, gamma);
60 if constexpr (dir == Direction::zm) {
61 return shammath::rusanov_flux_mz(cL, cR, gamma);
64 if constexpr (mode == RiemannSolverMode::HLL) {
65 if constexpr (dir == Direction::xp) {
66 return shammath::hll_flux_x(cL, cR, gamma);
68 if constexpr (dir == Direction::yp) {
69 return shammath::hll_flux_y(cL, cR, gamma);
71 if constexpr (dir == Direction::zp) {
72 return shammath::hll_flux_z(cL, cR, gamma);
74 if constexpr (dir == Direction::xm) {
75 return shammath::hll_flux_mx(cL, cR, gamma);
77 if constexpr (dir == Direction::ym) {
78 return shammath::hll_flux_my(cL, cR, gamma);
80 if constexpr (dir == Direction::zm) {
81 return shammath::hll_flux_mz(cL, cR, gamma);
85 if constexpr (mode == RiemannSolverMode::HLLC) {
86 if constexpr (dir == Direction::xp) {
89 if constexpr (dir == Direction::yp) {
92 if constexpr (dir == Direction::zp) {
95 if constexpr (dir == Direction::xm) {
98 if constexpr (dir == Direction::ym) {
101 if constexpr (dir == Direction::zm) {
108 template<
class Tvec, DustRiemannSolverMode mode, Direction dir>
113 using Tscal =
typename Tcons::Tscal;
117 Tcons cL = shammath::d_prim_to_cons(pL);
118 Tcons cR = shammath::d_prim_to_cons(pR);
120 if constexpr (mode == DustRiemannSolverMode::HB) {
121 if constexpr (dir == Direction::xp) {
122 return shammath::huang_bai_flux_x(cL, cR);
124 if constexpr (dir == Direction::yp) {
125 return shammath::huang_bai_flux_y(cL, cR);
127 if constexpr (dir == Direction::zp) {
128 return shammath::huang_bai_flux_z(cL, cR);
131 if constexpr (dir == Direction::xm) {
132 return shammath::huang_bai_flux_mx(cL, cR);
134 if constexpr (dir == Direction::ym) {
135 return shammath::huang_bai_flux_my(cL, cR);
137 if constexpr (dir == Direction::zm) {
138 return shammath::huang_bai_flux_mz(cL, cR);
141 if constexpr (mode == DustRiemannSolverMode::DHLL) {
142 if constexpr (dir == Direction::xp) {
143 return shammath::d_hll_flux_x(cL, cR);
145 if constexpr (dir == Direction::yp) {
146 return shammath::d_hll_flux_y(cL, cR);
148 if constexpr (dir == Direction::zp) {
149 return shammath::d_hll_flux_z(cL, cR);
152 if constexpr (dir == Direction::xm) {
153 return shammath::d_hll_flux_mx(cL, cR);
155 if constexpr (dir == Direction::ym) {
156 return shammath::d_hll_flux_my(cL, cR);
158 if constexpr (dir == Direction::zm) {
159 return shammath::d_hll_flux_mz(cL, cR);
165 template<RiemannSolverMode mode,
class Tvec,
class Tscal, Direction dir>
166 void compute_fluxes_dir(
178 std::string flux_name =
" ";
179 if (mode == RiemannSolverMode::HLL)
180 flux_name =
"hll flux";
181 else if (mode == RiemannSolverMode::HLLC)
182 flux_name =
"hllc flux ";
183 else if (mode == RiemannSolverMode::Rusanov)
184 flux_name =
"rusanov flux ";
185 auto get_dir_name = [&]() {
186 if constexpr (dir == Direction::xp) {
188 }
else if constexpr (dir == Direction::xm) {
190 }
else if constexpr (dir == Direction::yp) {
192 }
else if constexpr (dir == Direction::ym) {
194 }
else if constexpr (dir == Direction::zp) {
196 }
else if constexpr (dir == Direction::zm) {
203 std::string cur_direction = get_dir_name();
204 std::string kernel_name = (std::string)
"compute " + flux_name + cur_direction;
205 const char *_kernel_name = kernel_name.c_str();
208 auto rho = rho_face_dir.get_read_access(depends_list);
209 auto vel = vel_face_dir.get_read_access(depends_list);
210 auto press = press_face_dir.get_read_access(depends_list);
216 auto e = q.
submit(depends_list, [&, gamma](sycl::handler &cgh) {
217 shambase::parallel_for(cgh, link_count, _kernel_name, [=](
u32 id_a) {
218 auto rho_ij = rho[id_a];
219 auto vel_ij = vel[id_a];
220 auto press_ij = press[id_a];
223 auto flux_dir = Flux::flux(
224 Tprim{rho_ij[0], press_ij[0], vel_ij[0]},
225 Tprim{rho_ij[1], press_ij[1], vel_ij[1]},
228 flux_rho[id_a] = flux_dir.rho;
229 flux_rhov[id_a] = flux_dir.rhovel;
230 flux_rhoe[id_a] = flux_dir.rhoe;
234 rho_face_dir.complete_event_state(e);
235 vel_face_dir.complete_event_state(e);
236 press_face_dir.complete_event_state(e);
243 template<DustRiemannSolverMode mode,
class Tvec,
class Tscal, Direction dir>
244 void dust_compute_fluxes_dir(
253 using d_Flux = DustFluxCompute<Tvec, mode, dir>;
254 std::string flux_name
255 = (mode == DustRiemannSolverMode::DHLL) ?
"dust hll flux " :
"dust huang-bai flux ";
256 auto get_dir_name = [&]() {
257 if constexpr (dir == Direction::xp) {
259 }
else if constexpr (dir == Direction::xm) {
261 }
else if constexpr (dir == Direction::yp) {
263 }
else if constexpr (dir == Direction::ym) {
265 }
else if constexpr (dir == Direction::zp) {
267 }
else if constexpr (dir == Direction::zm) {
274 std::string cur_direction = get_dir_name();
275 std::string kernel_name = (std::string)
"compute " + flux_name + cur_direction;
276 const char *_kernel_name = kernel_name.c_str();
280 auto rho_dust = rho_dust_dir.get_read_access(depends_list);
281 auto vel_dust = vel_dust_dir.get_read_access(depends_list);
286 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
288 shambase::parallel_for(cgh, link_count * nvar, _kernel_name, [=](
u32 id_var_a) {
289 auto rho_ij = rho_dust[id_var_a];
290 auto vel_ij = vel_dust[id_var_a];
294 = d_Flux::dustflux(Tprim{rho_ij[0], vel_ij[0]}, Tprim{rho_ij[1], vel_ij[1]});
296 flux_rho_dust[id_var_a] = flux_dust_dir.rho;
297 flux_rhov_dust[id_var_a] = flux_dust_dir.rhovel;
301 rho_dust_dir.complete_event_state(e);
302 vel_dust_dir.complete_event_state(e);
std::uint32_t u32
32 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.
A SYCL queue associated with a device and a context.
sycl::event submit(Fct &&fct)
Submits a kernel to the SYCL queue.
Class to manage a list of SYCL events.
constexpr bool always_false_v
Helper variable template that is always false. Especially useful to perform static asserts based on t...
constexpr Tcons hllc_flux_y(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the +y direction.
constexpr Tcons hllc_flux_z(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the +z direction.
constexpr Tcons hllc_flux_x(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC solver based on section 10.4 from Toro 3rd Edition , Springer 2009. The wave speeds estimates ar...
constexpr Tcons hllc_flux_my(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the -y direction.
constexpr Tcons hllc_flux_mz(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the -z direction.
constexpr Tcons hllc_flux_mx(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the -x direction.
namespace for the basegodunov model modules
DustRiemannSolverMode
Dust Riemann solver mode enum.
From original version by Thomas Guillet (T.A.Guillet@exeter.ac.uk)
This file contain states and Riemann solvers for dust.