Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
ComputeFluxUtilities.hpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
10#pragma once
11
20#include "shambackends/sycl.hpp"
21#include "shammath/riemann.hpp"
24#include <array>
25#include <string>
26
28
29 using RiemannSolverMode = shammodels::basegodunov::RiemannSolverMode;
31 using Direction = shammodels::basegodunov::modules::Direction;
32
33 template<class Tvec, RiemannSolverMode mode, Direction dir>
35 public:
38 using Tscal = typename Tcons::Tscal;
39
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);
43
44 if constexpr (mode == RiemannSolverMode::Rusanov) {
45 if constexpr (dir == Direction::xp) {
46 return shammath::rusanov_flux_x(cL, cR, gamma);
47 }
48 if constexpr (dir == Direction::yp) {
49 return shammath::rusanov_flux_y(cL, cR, gamma);
50 }
51 if constexpr (dir == Direction::zp) {
52 return shammath::rusanov_flux_z(cL, cR, gamma);
53 }
54 if constexpr (dir == Direction::xm) {
55 return shammath::rusanov_flux_mx(cL, cR, gamma);
56 }
57 if constexpr (dir == Direction::ym) {
58 return shammath::rusanov_flux_my(cL, cR, gamma);
59 }
60 if constexpr (dir == Direction::zm) {
61 return shammath::rusanov_flux_mz(cL, cR, gamma);
62 }
63 }
64 if constexpr (mode == RiemannSolverMode::HLL) {
65 if constexpr (dir == Direction::xp) {
66 return shammath::hll_flux_x(cL, cR, gamma);
67 }
68 if constexpr (dir == Direction::yp) {
69 return shammath::hll_flux_y(cL, cR, gamma);
70 }
71 if constexpr (dir == Direction::zp) {
72 return shammath::hll_flux_z(cL, cR, gamma);
73 }
74 if constexpr (dir == Direction::xm) {
75 return shammath::hll_flux_mx(cL, cR, gamma);
76 }
77 if constexpr (dir == Direction::ym) {
78 return shammath::hll_flux_my(cL, cR, gamma);
79 }
80 if constexpr (dir == Direction::zm) {
81 return shammath::hll_flux_mz(cL, cR, gamma);
82 }
83 }
84
85 if constexpr (mode == RiemannSolverMode::HLLC) {
86 if constexpr (dir == Direction::xp) {
87 return shammath::hllc_flux_x(cL, cR, gamma);
88 }
89 if constexpr (dir == Direction::yp) {
90 return shammath::hllc_flux_y(cL, cR, gamma);
91 }
92 if constexpr (dir == Direction::zp) {
93 return shammath::hllc_flux_z(cL, cR, gamma);
94 }
95 if constexpr (dir == Direction::xm) {
96 return shammath::hllc_flux_mx(cL, cR, gamma);
97 }
98 if constexpr (dir == Direction::ym) {
99 return shammath::hllc_flux_my(cL, cR, gamma);
100 }
101 if constexpr (dir == Direction::zm) {
102 return shammath::hllc_flux_mz(cL, cR, gamma);
103 }
104 }
105 }
106 };
107
108 template<class Tvec, DustRiemannSolverMode mode, Direction dir>
110 public:
113 using Tscal = typename Tcons::Tscal;
114
115 inline static constexpr Tcons dustflux(Tprim pL, Tprim pR) {
116
117 Tcons cL = shammath::d_prim_to_cons(pL);
118 Tcons cR = shammath::d_prim_to_cons(pR);
119
120 if constexpr (mode == DustRiemannSolverMode::HB) {
121 if constexpr (dir == Direction::xp) {
122 return shammath::huang_bai_flux_x(cL, cR);
123 }
124 if constexpr (dir == Direction::yp) {
125 return shammath::huang_bai_flux_y(cL, cR);
126 }
127 if constexpr (dir == Direction::zp) {
128 return shammath::huang_bai_flux_z(cL, cR);
129 }
130
131 if constexpr (dir == Direction::xm) {
132 return shammath::huang_bai_flux_mx(cL, cR);
133 }
134 if constexpr (dir == Direction::ym) {
135 return shammath::huang_bai_flux_my(cL, cR);
136 }
137 if constexpr (dir == Direction::zm) {
138 return shammath::huang_bai_flux_mz(cL, cR);
139 }
140 }
141 if constexpr (mode == DustRiemannSolverMode::DHLL) {
142 if constexpr (dir == Direction::xp) {
143 return shammath::d_hll_flux_x(cL, cR);
144 }
145 if constexpr (dir == Direction::yp) {
146 return shammath::d_hll_flux_y(cL, cR);
147 }
148 if constexpr (dir == Direction::zp) {
149 return shammath::d_hll_flux_z(cL, cR);
150 }
151
152 if constexpr (dir == Direction::xm) {
153 return shammath::d_hll_flux_mx(cL, cR);
154 }
155 if constexpr (dir == Direction::ym) {
156 return shammath::d_hll_flux_my(cL, cR);
157 }
158 if constexpr (dir == Direction::zm) {
159 return shammath::d_hll_flux_mz(cL, cR);
160 }
161 }
162 }
163 };
164
165 template<RiemannSolverMode mode, class Tvec, class Tscal, Direction dir>
166 void compute_fluxes_dir(
168 u32 link_count,
169 sham::DeviceBuffer<std::array<Tscal, 2>> &rho_face_dir,
170 sham::DeviceBuffer<std::array<Tvec, 2>> &vel_face_dir,
171 sham::DeviceBuffer<std::array<Tscal, 2>> &press_face_dir,
172 sham::DeviceBuffer<Tscal> &flux_rho_face_dir,
173 sham::DeviceBuffer<Tvec> &flux_rhov_face_dir,
174 sham::DeviceBuffer<Tscal> &flux_rhoe_face_dir,
175 Tscal gamma) {
176
177 using Flux = FluxCompute<Tvec, mode, 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) {
187 return "xp";
188 } else if constexpr (dir == Direction::xm) {
189 return "xm";
190 } else if constexpr (dir == Direction::yp) {
191 return "yp";
192 } else if constexpr (dir == Direction::ym) {
193 return "ym";
194 } else if constexpr (dir == Direction::zp) {
195 return "zp";
196 } else if constexpr (dir == Direction::zm) {
197 return "zm";
198 } else {
199 static_assert(shambase::always_false_v<decltype(dir)>, "non-exhaustive visitor!");
200 }
201 return "";
202 };
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();
206
207 sham::EventList depends_list;
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);
211
212 auto flux_rho = flux_rho_face_dir.get_write_access(depends_list);
213 auto flux_rhov = flux_rhov_face_dir.get_write_access(depends_list);
214 auto flux_rhoe = flux_rhoe_face_dir.get_write_access(depends_list);
215
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];
221
222 using Tprim = shammath::PrimState<Tvec>;
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]},
226 gamma);
227
228 flux_rho[id_a] = flux_dir.rho;
229 flux_rhov[id_a] = flux_dir.rhovel;
230 flux_rhoe[id_a] = flux_dir.rhoe;
231 });
232 });
233
234 rho_face_dir.complete_event_state(e);
235 vel_face_dir.complete_event_state(e);
236 press_face_dir.complete_event_state(e);
237
238 flux_rho_face_dir.complete_event_state(e);
239 flux_rhov_face_dir.complete_event_state(e);
240 flux_rhoe_face_dir.complete_event_state(e);
241 }
242
243 template<DustRiemannSolverMode mode, class Tvec, class Tscal, Direction dir>
244 void dust_compute_fluxes_dir(
246 u32 link_count,
247 sham::DeviceBuffer<std::array<Tscal, 2>> &rho_dust_dir,
248 sham::DeviceBuffer<std::array<Tvec, 2>> &vel_dust_dir,
249 sham::DeviceBuffer<Tscal> &flux_rho_dust_dir,
250 sham::DeviceBuffer<Tvec> &flux_rhov_dust_dir,
251 u32 nvar) {
252
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) {
258 return "xp";
259 } else if constexpr (dir == Direction::xm) {
260 return "xm";
261 } else if constexpr (dir == Direction::yp) {
262 return "yp";
263 } else if constexpr (dir == Direction::ym) {
264 return "ym";
265 } else if constexpr (dir == Direction::zp) {
266 return "zp";
267 } else if constexpr (dir == Direction::zm) {
268 return "zm";
269 } else {
270 static_assert(shambase::always_false_v<decltype(dir)>, "non-exhaustive visitor!");
271 }
272 return "";
273 };
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();
277
278 sham::EventList depends_list;
279
280 auto rho_dust = rho_dust_dir.get_read_access(depends_list);
281 auto vel_dust = vel_dust_dir.get_read_access(depends_list);
282
283 auto flux_rho_dust = flux_rho_dust_dir.get_write_access(depends_list);
284 auto flux_rhov_dust = flux_rhov_dust_dir.get_write_access(depends_list);
285
286 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
287 u32 ndust = nvar;
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];
291
292 using Tprim = shammath::DustPrimState<Tvec>;
293 auto flux_dust_dir
294 = d_Flux::dustflux(Tprim{rho_ij[0], vel_ij[0]}, Tprim{rho_ij[1], vel_ij[1]});
295
296 flux_rho_dust[id_var_a] = flux_dust_dir.rho;
297 flux_rhov_dust[id_var_a] = flux_dust_dir.rhovel;
298 });
299 });
300
301 rho_dust_dir.complete_event_state(e);
302 vel_dust_dir.complete_event_state(e);
303
304 flux_rho_dust_dir.complete_event_state(e);
305 flux_rhov_dust_dir.complete_event_state(e);
306 }
307
308} // namespace shammodels::basegodunov::modules
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.
Definition EventList.hpp:31
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.
Definition riemann.hpp:486
constexpr Tcons hllc_flux_z(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the +z direction.
Definition riemann.hpp:494
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...
Definition riemann.hpp:370
constexpr Tcons hllc_flux_my(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the -y direction.
Definition riemann.hpp:510
constexpr Tcons hllc_flux_mz(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the -z direction.
Definition riemann.hpp:518
constexpr Tcons hllc_flux_mx(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the -x direction.
Definition riemann.hpp:502
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.