21 #ifndef FUB_IDEAL_GAS_FLUX_HLL_METHOD_HPP
22 #define FUB_IDEAL_GAS_FLUX_HLL_METHOD_HPP
35 template <
typename Eq,
typename SignalSpeeds>
class HllBase {
87 template <
typename Eq,
typename SignalSpeeds,
bool Simdify>
class HllArrayBase;
89 template <
typename Equation,
typename SignalSpeeds>
91 :
public HllBase<Equation, SignalSpeeds> {
99 using Base::GetEquation;
100 using Base::GetSignalSpeeds;
102 using Base::SolveRiemannProblem;
106 using Base::ComputeNumericFlux;
117 using Base::ComputeStableDt;
131 template <
typename Equation,
typename SignalSpeeds>
133 :
public HllBase<Equation, SignalSpeeds> {
137 template <
typename Equation,
typename SignalSpeeds>
139 HasVectorizedFlux<Equation>::value> {
145 template <
typename Equation,
typename Signals>
149 template <
typename Equation,
typename Signals>
154 template <
typename Equation,
typename Signals>
161 template <
typename Equation,
typename SignalSpeeds>
166 const auto signals = signal_speeds_(equation_, left, right, dir);
167 Flux(GetEquation(), flux_left_, left, dir);
168 Flux(GetEquation(), flux_right_, right, dir);
169 const double sL = signals[0];
170 const double sR = signals[1];
171 const double ds = sL != sR ? sR - sL : 1.0;
174 }
else if (sR < 0.0) {
178 [&](
double& sol,
double fL,
double fR,
double qL,
double qR) {
179 sol = (sR * qR - sL * qL + fL - fR) / ds;
186 template <
typename Equation,
typename SignalSpeeds>
193 const auto signals = signal_speeds_(GetEquation(), left, right, dir);
195 Flux(GetEquation(), flux_left_, left, dir);
196 Flux(GetEquation(), flux_right_, right, dir);
198 const double sL = std::min(0.0, signals[0]);
199 const double sR = std::max(0.0, signals[1]);
200 const double sLsR = sL * sR;
201 const double ds = sR - sL;
205 [&](
double& nf,
double fL,
double fR,
double qL,
double qR) {
206 nf = (sR * fL - sL * fR + sLsR * (qR - qL)) / ds;
208 numeric_flux, flux_left_, flux_right_, states[0], states[1]);
211 template <
typename Equation,
typename SignalSpeeds>
215 const auto signals = signal_speeds_(GetEquation(), states[0], states[1], dir);
216 const double max = std::accumulate(
217 signals.begin(), signals.end(), 0.0,
218 [](
double x,
double y) { return std::max(x, std::abs(y)); });
226 template <
typename Equation,
typename SignalSpeeds>
230 const auto signals = GetSignalSpeeds()(GetEquation(), left, right, dir);
231 Flux(GetEquation(), flux_left_array_, left, dir);
232 Flux(GetEquation(), flux_right_array_, right, dir);
236 ds = (ds > 0.0).select(ds, Array1d::Constant(1.0));
239 sol = (sR * qR - sL * qL + fL - fR) / ds;
240 sol = (0.0 < sL).select(qL, (sR < 0.0).select(qR, sol));
242 AsCons(solution), flux_left_array_, flux_right_array_,
AsCons(left),
247 template <
typename Equation,
typename SignalSpeeds>
254 const auto signals = GetSignalSpeeds()(GetEquation(), left, right, dir);
256 Flux(GetEquation(), flux_left_array_, left, dir);
257 Flux(GetEquation(), flux_right_array_, right, dir);
259 const Array1d zero = Array1d::Zero();
260 const Array1d sL = signals[0].min(zero);
261 const Array1d sR = signals[1].max(zero);
264 ds = (ds > 0.0).select(ds, Array1d::Constant(1.0));
268 nf = (sR * fL - sL * fR + sLsR * (qR - qL)) / ds;
270 numeric_flux, flux_left_array_, flux_right_array_,
AsCons(left),
274 template <
typename Equation,
typename SignalSpeeds>
285 const auto signals = GetSignalSpeeds()(GetEquation(), left, right, mask, dir);
287 Flux(GetEquation(), flux_left_array_, left, mask, dir);
288 Flux(GetEquation(), flux_right_array_, right, mask, dir);
290 const Array1d zero = Array1d::Zero();
291 const Array1d sL = signals[0].min(zero);
292 const Array1d sR = signals[1].max(zero);
296 const Array1d safe_ds = mask.select(ds, 1.0);
300 Array1d qL_s = mask.select(qL, 0.0);
301 Array1d qR_s = mask.select(qR, 0.0);
302 nf = (sR * fL - sL * fR + sLsR * (qR_s - qL_s)) / safe_ds;
304 numeric_flux, flux_left_array_, flux_right_array_,
AsCons(left),
308 template <
typename Equation,
typename SignalSpeeds>
312 GetSignalSpeeds()(GetEquation(), states[0], states[1], dir);
313 Array1d zero = Array1d::Zero();
315 std::accumulate(signals.begin(), signals.end(), zero,
320 template <
typename Equation,
typename SignalSpeeds>
327 GetSignalSpeeds()(GetEquation(), states[0], states[1], mask, dir);
328 Array1d zero = Array1d::Zero();
330 std::accumulate(signals.begin(), signals.end(), zero,
332 const Array1d safe_max = mask.select(max, 1.0);
333 Array1d infs = Array1d::Constant(std::numeric_limits<double>::max());
335 Array1d valid_stable_dts = mask.select(stable_dts, infs);
336 return valid_stable_dts;
#define FUB_ASSERT(x)
Definition: assert.hpp:39
This class applies a base flux nethod on a view of states.
Definition: flux_method/FluxMethod.hpp:57
Definition: HllMethod.hpp:87
Definition: HllMethod.hpp:35
SignalSpeeds signal_speeds_
Definition: HllMethod.hpp:82
typename Equation::Complete Complete
Definition: HllMethod.hpp:38
HllBase(const Equation &eq, const SignalSpeeds &signals=SignalSpeeds())
Definition: HllMethod.hpp:41
Conservative flux_left_
Definition: HllMethod.hpp:83
SignalSpeeds & GetSignalSpeeds() noexcept
Returns the strategy object which computes the signal speeds for this method.
Definition: HllMethod.hpp:53
typename Equation::Conservative Conservative
Definition: HllMethod.hpp:39
Equation equation_
Definition: HllMethod.hpp:81
Eq Equation
Definition: HllMethod.hpp:37
void SolveRiemannProblem(Complete &solution, const Complete &left, const Complete &right, Direction dir)
Computes an approximate solution to the rieman problem defined by left and right states.
Definition: HllMethod.hpp:162
const SignalSpeeds & GetSignalSpeeds() const noexcept
Returns the strategy object which computes the signal speeds for this method.
Definition: HllMethod.hpp:50
Conservative flux_right_
Definition: HllMethod.hpp:84
Equation & GetEquation() noexcept
Returns the underlying equations object.
Definition: HllMethod.hpp:59
double ComputeStableDt(span< const Complete, 2 > states, double dx, Direction dir)
Definition: HllMethod.hpp:213
static constexpr int GetStencilWidth() noexcept
Returns the stencil width of this method.
Definition: HllMethod.hpp:45
const Equation & GetEquation() const noexcept
Returns the underlying equations object.
Definition: HllMethod.hpp:58
void ComputeNumericFlux(Conservative &numeric_flux, span< const Complete, 2 > states, Duration dt, double dx, Direction dir)
Definition: HllMethod.hpp:187
Definition: HllMethod.hpp:139
A span is a view over a contiguous sequence of objects, the storage of which is owned by some other o...
Definition: span.hpp:81
void CompleteFromCons(Equation &&equation, Complete< std::decay_t< Equation >> &complete, const Conservative< std::decay_t< Equation >> &cons)
Definition: CompleteFromCons.hpp:42
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
void Flux(Eq &&equation, Conservative< Equation > &flux, const Complete< Equation > &state, Direction dir, [[maybe_unused]] double x=0.0)
Definition: Equation.hpp:108
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
Array< double, 1 > Array1d
Definition: Eigen.hpp:53
Hll(const Equation &eq, const Signals &signals) -> Hll< Equation, Signals >
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
HllMethod(const Equation &eq, const Signals &signals) -> HllMethod< Equation, Signals >
const Conservative< Eq > & AsCons(const Conservative< Eq > &x)
Definition: State.hpp:438
void ForEachComponent(F function, Ts &&... states)
Definition: State.hpp:624
Array< bool, 1 > MaskArray
Definition: Eigen.hpp:59
static constexpr all_type all
Definition: mdspan.hpp:741
Definition: HllMethod.hpp:150