21 #ifndef FUB_IDEAL_GAS_FLUX_GODUNOV_METHOD_HPP
22 #define FUB_IDEAL_GAS_FLUX_GODUNOV_METHOD_HPP
36 template <
typename EquationT,
37 typename RiemannSolverT = ExactRiemannSolver<EquationT>>
92 template <
typename Equation,
typename RPSolver = ExactRiemannSolver<Equation>>
97 template <
typename Equation>
103 template <
typename Equation,
typename RiemannSolver>
108 template <
typename Equation,
typename RiemannSolver>
113 template <
typename Equation,
typename RiemannSolver>
118 template <
typename Equation,
typename RiemannSolver>
121 return riemann_solver_;
124 template <
typename Equation,
typename RiemannSolver>
126 return riemann_solver_;
129 template <
typename Equation,
typename RiemannSolver>
133 riemann_solver_.SolveRiemannProblem(riemann_solution_, states[0], states[1],
135 Flux(equation_, numeric_flux, riemann_solution_, dir);
138 template <
typename Equation,
typename RiemannSolver>
142 riemann_solver_.SolveRiemannProblem(riemann_solution_arr_, states[0],
144 Flux(equation_, numeric_flux, riemann_solution_arr_, dir);
147 template <
typename Equation,
typename RiemannSolver>
154 riemann_solver_.SolveRiemannProblem(riemann_solution_arr_, states[0],
155 states[1], mask, dir);
156 Flux(equation_, numeric_flux, riemann_solution_arr_, dir);
157 const Array1d zero = Array1d::Zero();
159 numeric_flux, numeric_flux);
162 template <
typename Equation,
typename RiemannSolver>
165 auto signals = riemann_solver_.ComputeSignals(states[0], states[1], dir);
166 const double s_max = std::accumulate(
167 signals.begin(), signals.end(), 0.0,
168 [](
double x,
double y) { return std::max(x, std::abs(y)); });
172 template <
typename Equation,
typename RiemannSolver>
175 auto signals = riemann_solver_.ComputeSignals(states[0], states[1], dir);
176 Array1d zero = Array1d::Zero();
178 std::accumulate(signals.begin(), signals.end(), zero,
180 return x.max(y.abs());
185 template <
typename Equation,
typename RiemannSolver>
189 std::array<Complete, 2> state{};
190 Array1d dts = Array1d::Constant(std::numeric_limits<double>::infinity());
191 for (
int i = 0; i < face_fraction.size(); ++i) {
192 if (face_fraction[i] > 0.0) {
193 Load(state[0], states[0], i);
194 Load(state[1], states[1], i);
195 dts[i] = ComputeStableDt(state, dx, dir);
This class applies a base flux nethod on a view of states.
Definition: flux_method/FluxMethod.hpp:57
Definition: flux_method/GodunovMethod.hpp:38
EquationT Equation
Definition: flux_method/GodunovMethod.hpp:40
const RiemannSolver & GetRiemannSolver() const noexcept
Definition: flux_method/GodunovMethod.hpp:119
static constexpr int GetStencilWidth() noexcept
Definition: flux_method/GodunovMethod.hpp:104
Complete riemann_solution_
Definition: flux_method/GodunovMethod.hpp:87
void ComputeNumericFlux(Conservative &numeric_flux, span< const Complete, 2 > states, Duration, double, Direction dir)
Definition: flux_method/GodunovMethod.hpp:130
Godunov(const Equation &equation, const RiemannSolver &solver)
Definition: flux_method/GodunovMethod.hpp:48
RiemannSolverT RiemannSolver
Definition: flux_method/GodunovMethod.hpp:41
CompleteArray riemann_solution_arr_
Definition: flux_method/GodunovMethod.hpp:88
Godunov(const Equation &equation)
Definition: flux_method/GodunovMethod.hpp:47
double ComputeStableDt(span< const Complete, 2 > states, double dx, Direction dir)
Definition: flux_method/GodunovMethod.hpp:163
Equation equation_
Definition: flux_method/GodunovMethod.hpp:85
typename Equation::Complete Complete
Definition: flux_method/GodunovMethod.hpp:42
const Equation & GetEquation() const noexcept
Definition: flux_method/GodunovMethod.hpp:109
RiemannSolver riemann_solver_
Definition: flux_method/GodunovMethod.hpp:86
typename Equation::Conservative Conservative
Definition: flux_method/GodunovMethod.hpp:43
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
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
void Load(State &state, const BasicView< const State, Layout, Rank > &view, const std::array< std::ptrdiff_t, State::Equation::Rank()> &index)
Definition: State.hpp:640
GodunovMethod(const Equation &eq) -> GodunovMethod< Equation >
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
void ForEachComponent(F function, Ts &&... states)
Definition: State.hpp:624
Array< bool, 1 > MaskArray
Definition: Eigen.hpp:59
This type has a constructor which takes an equation and might allocate any dynamically sized member v...
Definition: State.hpp:335
This type has a constructor which takes an equation and might allocate any dynamically sized member v...
Definition: State.hpp:251
Definition: flux_method/GodunovMethod.hpp:93