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