31 using Tscal = shambase::VecComponent<Tvec>;
44 using Tscal = shambase::VecComponent<Tvec>;
52 rhovel += d_cst.rhovel;
57 const DustConsState<Tvec> operator+(
58 const DustConsState<Tvec> &lhs,
const DustConsState<Tvec> &rhs) {
59 return DustConsState<Tvec>(lhs) += rhs;
63 const DustConsState<Tvec> &DustConsState<Tvec>::operator-=(
const DustConsState<Tvec> &d_cst) {
65 rhovel -= d_cst.rhovel;
70 const DustConsState<Tvec> operator-(
71 const DustConsState<Tvec> &lhs,
const DustConsState<Tvec> &rhs) {
72 return DustConsState<Tvec>(lhs) -= rhs;
76 const DustConsState<Tvec> &DustConsState<Tvec>::operator*=(
77 const typename DustConsState<Tvec>::Tscal factor) {
84 const DustConsState<Tvec> operator*(
85 const DustConsState<Tvec> &lhs,
const typename DustConsState<Tvec>::Tscal factor) {
86 return DustConsState<Tvec>(lhs) *= factor;
90 const DustConsState<Tvec> operator*(
91 const typename DustConsState<Tvec>::Tscal factor,
const DustConsState<Tvec> &rhs) {
92 return DustConsState<Tvec>(rhs) *= factor;
98 using Tscal = shambase::VecComponent<Tvec>;
99 std::array<DustConsState<Tvec>, 3> F;
105 d_cons.rho = d_prim.rho;
106 d_cons.rhovel = (d_prim.vel * d_prim.rho);
111 inline constexpr DustPrimState<Tvec> d_cons_to_prim(
const DustConsState<Tvec> d_cons) {
112 DustPrimState<Tvec> d_prim;
113 d_prim.rho = d_cons.rho;
114 d_prim.vel = (d_cons.rhovel * (1 / d_cons.rho));
119 inline constexpr DustConsState<Tvec> d_hydro_flux_x(
const DustConsState<Tvec> d_cons) {
120 DustConsState<Tvec> d_flux;
121 const DustPrimState<Tvec> d_prim = d_cons_to_prim<Tvec>(d_cons);
122 const typename DustConsState<Tvec>::Tscal x_vel{d_prim.vel[0]};
123 d_flux.rho = d_cons.rhovel[0];
124 d_flux.rhovel = d_prim.vel * (d_cons.rho * x_vel);
128 template<
class Tcons>
129 inline constexpr Tcons d_x_to_y(
const Tcons c) {
132 d_cst.rhovel[0] = -c.rhovel[1];
133 d_cst.rhovel[1] = c.rhovel[0];
134 d_cst.rhovel[2] = c.rhovel[2];
139 template<
class Tcons>
140 inline constexpr Tcons d_y_to_x(
const Tcons c) {
143 d_cst.rhovel[0] = c.rhovel[1];
144 d_cst.rhovel[1] = -c.rhovel[0];
145 d_cst.rhovel[2] = c.rhovel[2];
149 template<
class Tcons>
150 inline constexpr Tcons d_x_to_z(
const Tcons c) {
153 d_cst.rhovel[0] = -c.rhovel[2];
154 d_cst.rhovel[1] = c.rhovel[1];
155 d_cst.rhovel[2] = c.rhovel[0];
159 template<
class Tcons>
160 inline constexpr Tcons d_z_to_x(
const Tcons c) {
163 d_cst.rhovel[0] = c.rhovel[2];
164 d_cst.rhovel[1] = c.rhovel[1];
165 d_cst.rhovel[2] = -c.rhovel[0];
169 template<
class Tcons>
170 inline constexpr Tcons d_invert_axis(
const Tcons c) {
173 d_cst.rhovel = -(c.rhovel);
179 template<
class Tcons>
180 inline constexpr auto d_hll_flux_x(Tcons cL, Tcons cR) {
182 const auto d_primL = d_cons_to_prim(cL);
183 const auto d_primR = d_cons_to_prim(cR);
185 const auto S = sham::max(sham::abs(d_primL.vel[0]), sham::abs(d_primR.vel[0]));
187 const auto fL = d_hydro_flux_x(cL);
188 const auto fR = d_hydro_flux_x(cR);
190 return 0.5 * ((fL + fR) - S * (cR - cL));
195 template<
class Tcons>
196 inline constexpr auto huang_bai_flux_x(Tcons cL, Tcons cR) {
198 const auto d_primL = d_cons_to_prim(cL);
199 const auto d_primR = d_cons_to_prim(cR);
201 const auto fL = d_hydro_flux_x(cL);
202 const auto fR = d_hydro_flux_x(cR);
204 if (d_primL.vel[0] > 0 && d_primR.vel[0] > 0)
206 else if (d_primL.vel[0] < 0 && d_primR.vel[0] < 0)
208 else if (d_primL.vel[0] < 0 && d_primR.vel[0] > 0)
210 else if (d_primL.vel[0] > 0 && d_primR.vel[0] < 0)
216 template<
class Tcons>
217 inline constexpr Tcons d_hll_flux_y(Tcons cL, Tcons cR) {
218 return d_x_to_y(d_hll_flux_x(d_y_to_x(cL), d_y_to_x(cR)));
221 template<
class Tcons>
222 inline constexpr Tcons d_hll_flux_z(Tcons cL, Tcons cR) {
223 return d_x_to_z(d_hll_flux_x(d_z_to_x(cL), d_z_to_x(cR)));
226 template<
class Tcons>
227 inline constexpr Tcons d_hll_flux_mx(Tcons cL, Tcons cR) {
228 return d_invert_axis(d_hll_flux_x(d_invert_axis(cL), d_invert_axis(cR)));
231 template<
class Tcons>
232 inline constexpr Tcons d_hll_flux_my(Tcons cL, Tcons cR) {
233 return d_invert_axis(d_hll_flux_y(d_invert_axis(cL), d_invert_axis(cR)));
236 template<
class Tcons>
237 inline constexpr Tcons d_hll_flux_mz(Tcons cL, Tcons cR) {
238 return d_invert_axis(d_hll_flux_z(d_invert_axis(cL), d_invert_axis(cR)));
241 template<
class Tcons>
242 inline constexpr Tcons huang_bai_flux_y(Tcons cL, Tcons cR) {
243 return d_x_to_y(huang_bai_flux_x(d_y_to_x(cL), d_y_to_x(cR)));
246 template<
class Tcons>
247 inline constexpr Tcons huang_bai_flux_z(Tcons cL, Tcons cR) {
248 return d_x_to_z(huang_bai_flux_x(d_z_to_x(cL), d_z_to_x(cR)));
251 template<
class Tcons>
252 inline constexpr Tcons huang_bai_flux_mx(Tcons cL, Tcons cR) {
253 return d_invert_axis(huang_bai_flux_x(d_invert_axis(cL), d_invert_axis(cR)));
256 template<
class Tcons>
257 inline constexpr Tcons huang_bai_flux_my(Tcons cL, Tcons cR) {
258 return d_invert_axis(huang_bai_flux_y(d_invert_axis(cL), d_invert_axis(cR)));
261 template<
class Tcons>
262 inline constexpr Tcons huang_bai_flux_mz(Tcons cL, Tcons cR) {
263 return d_invert_axis(huang_bai_flux_z(d_invert_axis(cL), d_invert_axis(cR)));
namespace for math utility