21 #ifndef FUB_EQUATIONS_PERFECT_GAS_HPP
22 #define FUB_EQUATIONS_PERFECT_GAS_HPP
36 template <
int Rank>
struct PerfectGas;
40 template <
typename Density,
typename Momentum,
typename Energy>
60 static constexpr
auto names =
61 std::make_tuple(
"Density",
"Momentum",
"Energy");
63 static constexpr
auto pointers_to_member =
73 template <
typename Density,
typename Velocity,
typename Pressure>
90 static constexpr
auto names =
91 std::make_tuple(
"Density",
"Velocity",
"Pressure");
93 static constexpr
auto pointers_to_member =
103 template <
typename Minus,
typename Zero,
typename Plus>
120 static constexpr
auto names = std::make_tuple(
"Minus",
"Zero",
"Plus");
122 static constexpr
auto pointers_to_member =
153 static constexpr
auto names = std::make_tuple(
"Density",
"Momentum",
"Energy",
154 "Pressure",
"SpeedOfSound");
155 static constexpr
auto pointers_to_member = std::make_tuple(
175 static constexpr
int Rank() noexcept {
return N; }
181 [[maybe_unused]]
Direction dir)
const noexcept;
184 [[maybe_unused]]
Direction dir)
const noexcept;
199 double pressure)
const noexcept;
202 Array1d pressure)
const noexcept;
225 template <
typename Density,
typename Momentum,
typename Energy>
229 if constexpr (std::is_same_v<double, Density>) {
232 return Array1d::Constant(eq.gamma);
236 template <
typename Density,
typename Momentum,
typename Energy>
243 template <
typename Density,
typename Momentum,
typename Energy>
250 template <
typename Density,
typename Momentum,
typename Energy>
251 friend decltype(
auto)
255 if constexpr (std::is_same_v<double, Density>) {
256 return q.momentum[d];
262 template <
typename Density,
typename Momentum,
typename Energy>
266 return q.momentum / q.density;
269 template <
typename Density,
typename Momentum,
typename Energy>
274 if constexpr (std::is_same_v<double, Density>) {
275 return q.momentum[d] / q.density;
277 return q.row(d) / q.density;
281 template <
typename Density,
typename Momentum,
typename Energy>
303 return q.speed_of_sound;
309 extern template struct PerfectGas<1>;
310 extern template struct PerfectGas<2>;
311 extern template struct PerfectGas<3>;
325 prim.density = complete.density;
326 prim.pressure = complete.pressure;
327 prim.velocity = complete.momentum / complete.density;
342 prim.density = complete.density;
343 prim.pressure = complete.pressure;
344 for (
int i = 0; i < Rank; ++i) {
345 prim.velocity.row(i) = complete.momentum.row(i) / complete.density;
356 const Eigen::Matrix<double, 2, 2>& rotation,
const PerfectGas<2>&);
360 const Eigen::Matrix<double, 2, 2>& rotation,
const PerfectGas<2>&);
364 const Eigen::Matrix<double, 3, 3>& rotation,
const PerfectGas<3>&);
368 const Eigen::Matrix<double, 3, 3>& rotation,
const PerfectGas<3>&);
373 const Eigen::Matrix<double, 1, 1>& normal,
386 const Eigen::Matrix<double, 1, 1>& normal,
constexpr struct fub::euler::SpeedOfSoundFn SpeedOfSound
constexpr struct fub::euler::EnergyFn Energy
constexpr struct fub::euler::PressureFn Pressure
constexpr struct fub::euler::MomentumFn Momentum
constexpr struct fub::euler::DensityFn Density
constexpr struct fub::euler::VelocityFn Velocity
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
std::conditional_t< N==1||M==1, Eigen::Array< T, N, M >, Eigen::Array< T, N, M, Eigen::RowMajor > > Array
Definition: Eigen.hpp:50
Array< double, 1 > Array1d
Definition: Eigen.hpp:53
std::decay_t< decltype(T)> tag_t
Definition: type_traits.hpp:350
void Rotate(Conservative< IdealGasMix< 2 >> &rotated, const Conservative< IdealGasMix< 2 >> &state, const Eigen::Matrix< double, 2, 2 > &rotation, const IdealGasMix< 2 > &)
Defines how to rotate a given state of the euler equations.
void PrimFromComplete(const PerfectGas< Rank > &, Primitive< PerfectGas< Rank >> &prim, const Complete< PerfectGas< Rank >> &complete)
Definition: PerfectGas.hpp:322
void CompleteFromPrim(const PerfectGas< Rank > &equation, Complete< PerfectGas< Rank >> &complete, const Primitive< PerfectGas< Rank >> &prim)
Definition: PerfectGas.hpp:314
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
void Reflect(Complete< IdealGasMix< 1 >> &reflected, const Complete< IdealGasMix< 1 >> &state, const Eigen::Matrix< double, 1, 1 > &normal, const IdealGasMix< 1 > &gas)
Array< bool, 1 > MaskArray
Definition: Eigen.hpp:59
std::integral_constant< int, I > int_constant
Definition: type_traits.hpp:183
typename detail::ConservativeArrayBaseImpl< Eq, Width >::type ConservativeArrayBase
Definition: StateArray.hpp:132
boost::mp11::mp_transform< detail::DepthToStateValueType, typename Equation::ConservativeDepths > ConservativeBase
This type alias transforms state depths into a conservative state associated with a specified equatio...
Definition: State.hpp:247
Definition: StateArray.hpp:178
This type has a constructor which takes an equation and might allocate any dynamically sized member v...
Definition: State.hpp:335
Definition: StateArray.hpp:135
This type has a constructor which takes an equation and might allocate any dynamically sized member v...
Definition: State.hpp:251
Definition: PerfectGas.hpp:104
Minus minus
Definition: PerfectGas.hpp:105
Zero zero
Definition: PerfectGas.hpp:106
Plus plus
Definition: PerfectGas.hpp:107
Definition: PerfectGas.hpp:134
SpeedOfSound speed_of_sound
Definition: PerfectGas.hpp:136
Pressure pressure
Definition: PerfectGas.hpp:135
This is a template class for constructing conservative states for the perfect gas equations.
Definition: PerfectGas.hpp:41
Energy energy
Definition: PerfectGas.hpp:44
Momentum momentum
Definition: PerfectGas.hpp:43
Density density
Definition: PerfectGas.hpp:42
Definition: PerfectGas.hpp:74
Pressure pressure
Definition: PerfectGas.hpp:77
Velocity velocity
Definition: PerfectGas.hpp:76
Density density
Definition: PerfectGas.hpp:75
Array< double, N, 1 > Velocity(const Complete &q) const noexcept
Array1d gamma_array_
Definition: PerfectGas.hpp:221
double Machnumber(const Complete &q) const noexcept
CompleteArray CompleteFromPrim(Array1d density, const Array< double, N > &u, Array1d pressure) const noexcept
double Rspec
Definition: PerfectGas.hpp:216
friend auto tag_invoke(tag_t< euler::Velocity >, const PerfectGas &, const PerfectGasConservative< Density, Momentum, Energy > &q, int d) noexcept
Definition: PerfectGas.hpp:271
void Flux(ConservativeArray &flux, const CompleteArray &state, [[maybe_unused]] Direction dir) const noexcept
friend const Density & tag_invoke(tag_t< euler::Density >, const PerfectGas &, const PerfectGasConservative< Density, Momentum, Energy > &q) noexcept
Definition: PerfectGas.hpp:237
static constexpr int Rank() noexcept
Definition: PerfectGas.hpp:175
friend auto tag_invoke(tag_t< euler::Gamma >, const PerfectGas &eq, const PerfectGasConservative< Density, Momentum, Energy > &) noexcept
Definition: PerfectGas.hpp:226
void Flux(ConservativeArray &flux, const CompleteArray &state, MaskArray mask, [[maybe_unused]] Direction dir) const noexcept
friend const Pressure & tag_invoke(tag_t< euler::Pressure >, const PerfectGas &, const PerfectGasComplete< Density, Momentum, Energy, Pressure, SpeedOfSound > &q) noexcept
Definition: PerfectGas.hpp:291
void CompleteFromCons(Complete &complete, const ConservativeBase< PerfectGas > &cons) const noexcept
double gamma_minus_1_inv
Definition: PerfectGas.hpp:219
void Flux(Conservative &flux, const Complete &state, [[maybe_unused]] Direction dir=Direction::X) const noexcept
void CompleteFromCons(CompleteArray &complete, const ConservativeArrayBase< PerfectGas > &cons, MaskArray mask) const noexcept
void CompleteFromCons(CompleteArray &complete, const ConservativeArrayBase< PerfectGas > &cons) const noexcept
Complete CompleteFromPrim(double density, const Array< double, N, 1 > &u, double pressure) const noexcept
friend const SpeedOfSound & tag_invoke(tag_t< euler::SpeedOfSound >, const PerfectGas &, const PerfectGasComplete< Density, Momentum, Energy, Pressure, SpeedOfSound > &q) noexcept
Definition: PerfectGas.hpp:300
friend const Energy & tag_invoke(tag_t< euler::Energy >, const PerfectGas &, const PerfectGasConservative< Density, Momentum, Energy > &q) noexcept
Definition: PerfectGas.hpp:282
Array1d gamma_minus_1_inv_array_
Definition: PerfectGas.hpp:222
double Temperature(const Complete &q) const noexcept
double gamma
Definition: PerfectGas.hpp:218
Array< double, N > Velocity(const CompleteArray &q) const noexcept
friend const Momentum & tag_invoke(tag_t< euler::Momentum >, const PerfectGas &, const PerfectGasConservative< Density, Momentum, Energy > &q) noexcept
Definition: PerfectGas.hpp:244
CompleteArray CompleteFromPrim(Array1d density, const Array< double, N > &u, Array1d pressure, const MaskArray &mask) const noexcept
Array1d Temperature(const CompleteArray &q) const noexcept
friend Momentum tag_invoke(tag_t< euler::Velocity >, const PerfectGas &, const PerfectGasConservative< Density, Momentum, Energy > &q) noexcept
Definition: PerfectGas.hpp:263
Definition: StateArray.hpp:89
Definition: State.hpp:290
This type is used to tag scalar quantities.
Definition: State.hpp:109