21 #ifndef FUB_EQUATIONS_PERFECT_GAS_MIX_HPP
22 #define FUB_EQUATIONS_PERFECT_GAS_MIX_HPP
37 template <
int Rank>
struct PerfectGasMix;
63 static constexpr
auto names =
64 std::make_tuple(
"Density",
"Momentum",
"Energy",
"Species");
66 static constexpr
auto pointers_to_member =
96 static constexpr
auto names =
97 std::make_tuple(
"Density",
"Velocity",
"Pressure",
"Species");
99 static constexpr
auto pointers_to_member =
110 template <
typename Density,
typename Temperature,
typename MoleFractions>
125 static constexpr
auto names =
126 std::make_tuple(
"Density",
"Temperature",
"MoleFractions");
128 static constexpr
auto pointers_to_member =
138 template <
typename Minus,
typename Zero,
typename Plus,
typename Species>
155 template <
typename... Xs>
157 static constexpr
auto names =
158 std::make_tuple(
"Minus",
"Zero",
"Plus",
"Species");
160 static constexpr
auto pointers_to_member =
193 static constexpr
auto names = std::make_tuple(
194 "Density",
"Momentum",
"Energy",
"Species",
"Pressure",
"SpeedOfSound");
195 static constexpr
auto pointers_to_member =
221 static constexpr
int Rank() noexcept {
return N; }
227 [[maybe_unused]]
Direction dir)
const noexcept;
230 [[maybe_unused]]
Direction dir)
const noexcept;
276 template <
typename State>
279 using Depths =
typename State::Traits::template Depths<N>;
281 if constexpr (std::is_same_v<Depths, PerfectGasMixKineticStateShape>) {
282 depths.mole_fractions = eq.n_species + 1;
284 depths.species = eq.n_species;
295 if constexpr (std::is_same_v<double, Density>) {
298 return Array1d::Constant(eq.
gamma);
320 template <
typename Density,
typename Temperature,
typename MoleFractions>
331 const double cv = eq.Rspec * eq.gamma_minus_1_inv;
332 return cv * q.temperature;
339 q.density = kin.density;
340 q.momentum = q.density * u;
342 q.energy = q.density * (e + 0.5 * u.matrix().squaredNorm());
343 const double RT = eq.Rspec * kin.temperature;
344 q.pressure = RT * q.density;
345 q.speed_of_sound = std::sqrt(eq.gamma * RT);
346 const double sum = kin.mole_fractions.sum();
347 for (
int i = 0; i < eq.n_species; i++) {
348 q.species[i] = q.density * kin.mole_fractions[i] / sum;
355 kin.density = q.density;
358 for (
int i = 0; i < eq.n_species; ++i) {
359 kin.mole_fractions[i] = q.species[i] / q.density;
360 sum += kin.mole_fractions[i];
362 kin.mole_fractions[eq.n_species] = std::max(0.0, 1.0 - sum);
380 if constexpr (std::is_same_v<double, Density>) {
381 return q.momentum[d];
393 if constexpr (std::is_same_v<double, Density>) {
394 return q.momentum / q.density;
397 for (
int i = 0; i < N; ++i) {
398 v.row(i) = q.momentum.row(i) / q.density;
410 if constexpr (std::is_same_v<double, Density>) {
412 q.momentum = q.density * v;
414 q.energy += rhoE_kin_new - rhoE_kin_old;
424 if constexpr (std::is_same_v<double, Density>) {
425 return q.momentum[d] / q.density;
427 return q.row(d) / q.density;
464 if constexpr (std::is_same_v<double, Density>) {
467 return q.species.row(d);
477 return (q.energy + q.pressure) / q.density;
491 return eq.Rspec * q.temperature * q.density;
500 return q.speed_of_sound;
505 const Complete& q0,
double p_new) noexcept {
511 const double c2 = c*c;
512 const double Ma2 = u_old.matrix().squaredNorm() / c2;
514 const double alpha = 1.0 + 0.5 * Ma2 / eq.gamma_minus_1_inv;
515 const double rho_0 = rho_old * std::pow(alpha, eq.gamma_minus_1_inv);
516 const double p_0 = p_old * std::pow(alpha, eq.gamma * eq.gamma_minus_1_inv);
517 const double T_0 = T_old * alpha;
519 const double rho_new = rho_0 * std::pow(p_new / p_0, 1 / eq.gamma);
520 const double T_new = p_new / rho_new / eq.Rspec;
525 const double u2_new = 2.0 * eq.gamma_minus_1_inv * eq.gamma * eq.Rspec * (T_0 - T_new);
528 u_new[0] = ((u2_new > 0.0) - (u2_new < 0.0)) * std::sqrt(std::abs(u2_new));
539 const double rhoE_new =
543 q.momentum = rhou_new;
545 q.species = q0.species;
547 q.speed_of_sound = std::sqrt(eq.gamma * p_new / rho_new);
553 extern template struct PerfectGasMix<1>;
554 extern template struct PerfectGasMix<2>;
555 extern template struct PerfectGasMix<3>;
562 prim.pressure, prim.species);
569 complete.density = prim.density;
570 for (
int i = 0; i < Rank; ++i) {
571 complete.momentum.row(i) = complete.density * prim.velocity.row(i);
573 complete.pressure = prim.pressure;
574 for (
int s = 0; s < equation.
n_species; ++s) {
575 complete.species.row(s) = prim.density * prim.species.row(s);
580 complete.speed_of_sound =
581 (equation.
gamma * complete.pressure / complete.density).sqrt();
588 prim.density = complete.density;
589 prim.pressure = complete.pressure;
590 prim.velocity = complete.momentum / complete.density;
591 for (
int i = 0; i < equation.
n_species; ++i) {
592 prim.species[i] = complete.species[i] / complete.density;
600 prim.density = complete.density;
601 prim.pressure = complete.pressure;
602 for (
int i = 0; i < Rank; ++i) {
603 prim.velocity.row(i) = complete.momentum.row(i) / complete.density;
605 for (
int i = 0; i < equation.
n_species; ++i) {
606 prim.species.row(i) = complete.species.row(i) / complete.density;
616 q.density = kin.density;
617 for (
int i = 0; i < Rank; ++i) {
618 q.momentum.row(i) = q.density * u.row(i);
622 q.energy = q.density * e + rhoE_kin;
623 const Array1d RT = eq.Rspec * kin.temperature;
624 q.pressure = RT * q.density;
625 q.speed_of_sound = Eigen::sqrt(eq.gamma * RT);
626 const Array1d sum = kin.mole_fractions.colwise().sum();
627 for (
int i = 0; i < eq.n_species; i++) {
628 q.species.row(i) = q.density * kin.mole_fractions.row(i) / sum;
645 kin.density = q.density;
647 kin.mole_fractions.setZero();
648 for (
int i = 0; i < eq.n_species; ++i) {
649 kin.mole_fractions.row(i) = (q.species.row(i) / q.density).max(0.0);
651 Array1d sum = kin.mole_fractions.colwise().sum();
652 kin.mole_fractions.row(eq.n_species) = (1.0 - sum).max(0.0);
653 sum = kin.mole_fractions.colwise().sum();
654 for (
int i = 0; i < eq.n_species + 1; ++i) {
655 kin.mole_fractions.row(i) /= sum;
657 FUB_ASSERT(kin.mole_fractions.colwise().sum().isApproxToConstant(1.0));
663 return eq.Temperature(q);
669 return eq.Temperature(q);
679 const Eigen::Matrix<double, 2, 2>& rotation,
684 const Eigen::Matrix<double, 2, 2>& rotation,
689 const Eigen::Matrix<double, 3, 3>& rotation,
694 const Eigen::Matrix<double, 3, 3>& rotation,
700 const Eigen::Matrix<double, 1, 1>& normal,
713 const Eigen::Matrix<double, 1, 1>& normal,
#define FUB_ASSERT(x)
Definition: assert.hpp:39
constexpr struct fub::euler::InternalEnergyFn InternalEnergy
constexpr struct fub::euler::SpeedOfSoundFn SpeedOfSound
constexpr struct fub::euler::EnergyFn Energy
double KineticEnergy(double density, const Eigen::Array< double, Dim, 1 > &momentum) noexcept
Definition: EulerEquation.hpp:28
constexpr struct fub::euler::SpeciesFn Species
constexpr struct fub::euler::PressureFn Pressure
constexpr struct fub::euler::MoleFractionsFn MoleFractions
constexpr struct fub::euler::MomentumFn Momentum
constexpr struct fub::euler::CompleteFromKineticStateFn CompleteFromKineticState
constexpr struct fub::euler::DensityFn Density
constexpr struct fub::euler::VelocityFn Velocity
constexpr struct fub::euler::TemperatureFn Temperature
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
PerfectGasMixKineticState< ScalarDepth, ScalarDepth, VectorDepth<-1 > > PerfectGasMixKineticStateShape
Definition: PerfectGasMix.hpp:118
Array< double, 1 > Array1d
Definition: Eigen.hpp:53
typename nodeduce< T >::type nodeduce_t
Definition: type_traits.hpp:47
constexpr struct fub::DepthsFn Depths
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
void tag_invoke(tag_t< euler::CompleteFromKineticState >, const PerfectGasMix< Rank > &eq, CompleteArray< PerfectGasMix< Rank >> &q, const KineticStateArray< PerfectGasMix< Rank >> &kin, const Array< double, Rank > &u) noexcept
Definition: PerfectGasMix.hpp:611
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
boost::mp11::mp_transform< ToConcreteDepth, Depths > ToConcreteDepths
Definition: State.hpp:122
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: StateArray.hpp:108
Definition: State.hpp:301
Definition: PerfectGasMix.hpp:139
Zero zero
Definition: PerfectGasMix.hpp:141
Species species
Definition: PerfectGasMix.hpp:143
Minus minus
Definition: PerfectGasMix.hpp:140
Plus plus
Definition: PerfectGasMix.hpp:142
Definition: PerfectGasMix.hpp:174
SpeedOfSound speed_of_sound
Definition: PerfectGasMix.hpp:176
Pressure pressure
Definition: PerfectGasMix.hpp:175
This is a template class for constructing conservative states for the perfect gas equations.
Definition: PerfectGasMix.hpp:43
Momentum momentum
Definition: PerfectGasMix.hpp:45
Density density
Definition: PerfectGasMix.hpp:44
Species species
Definition: PerfectGasMix.hpp:47
Energy energy
Definition: PerfectGasMix.hpp:46
Definition: PerfectGasMix.hpp:111
MoleFractions mole_fractions
Definition: PerfectGasMix.hpp:114
Temperature temperature
Definition: PerfectGasMix.hpp:113
Density density
Definition: PerfectGasMix.hpp:112
Definition: PerfectGasMix.hpp:79
Pressure pressure
Definition: PerfectGasMix.hpp:82
Velocity velocity
Definition: PerfectGasMix.hpp:81
Species species
Definition: PerfectGasMix.hpp:83
Density density
Definition: PerfectGasMix.hpp:80
Definition: PerfectGasMix.hpp:208
Array< double, N, 1 > Velocity(const Complete &q) const noexcept
Array1d gamma_minus_1_inv_array_
Definition: PerfectGasMix.hpp:273
friend auto tag_invoke(tag_t< euler::InternalEnergy >, const PerfectGasMix &eq, const PerfectGasMixKineticState< Density, Temperature, MoleFractions > &q) noexcept
Definition: PerfectGasMix.hpp:322
double Rspec
Definition: PerfectGasMix.hpp:268
static constexpr int Rank() noexcept
Definition: PerfectGasMix.hpp:221
Array1d gamma_array_
Definition: PerfectGasMix.hpp:272
friend const Species & tag_invoke(tag_t< euler::Species >, const PerfectGasMix &, const PerfectGasMixPrimitive< Density, Velocity, Pressure, Species > &q) noexcept
Definition: PerfectGasMix.hpp:452
friend const Energy & tag_invoke(tag_t< euler::Energy >, const PerfectGasMix &, const PerfectGasMixConservative< Density, Momentum, Energy, Species > &q) noexcept
Definition: PerfectGasMix.hpp:434
void Flux(Conservative &flux, const Complete &state, [[maybe_unused]] Direction dir=Direction::X) const noexcept
friend const Momentum & tag_invoke(tag_t< euler::Momentum >, const PerfectGasMix &, const PerfectGasMixConservative< Density, Momentum, Energy, Species > &q) noexcept
Definition: PerfectGasMix.hpp:368
void CompleteFromCons(CompleteArray &complete, const ConservativeArrayBase< PerfectGasMix > &cons) const noexcept
Complete CompleteFromPrim(double density, const Array< double, N, 1 > &u, double pressure, const Array< double, -1, 1 > &species) const noexcept
friend Density tag_invoke(tag_t< euler::TotalEnthalpy >, const PerfectGasMix &, const PerfectGasMixComplete< Density, Momentum, Energy, Species, Pressure, SpeedOfSound > &q) noexcept
Definition: PerfectGasMix.hpp:474
friend const SpeedOfSound & tag_invoke(tag_t< euler::SpeedOfSound >, const PerfectGasMix &, const PerfectGasMixComplete< Density, Momentum, Energy, Species, Pressure, SpeedOfSound > &q) noexcept
Definition: PerfectGasMix.hpp:497
void CompleteFromCons(Complete &complete, const ConservativeBase< PerfectGasMix > &cons) const noexcept
double Temperature(const Complete &q) const noexcept
void Flux(ConservativeArray &flux, const CompleteArray &state, MaskArray mask, [[maybe_unused]] Direction dir) const noexcept
int n_species
Definition: PerfectGasMix.hpp:260
Array1d Temperature(const CompleteArray &q) const noexcept
friend auto tag_invoke(tag_t< euler::Gamma >, const PerfectGasMix &eq, const PerfectGasMixConservative< Density, Momentum, Energy, Species > &) noexcept
Definition: PerfectGasMix.hpp:292
void Flux(ConservativeArray &flux, const CompleteArray &state, [[maybe_unused]] Direction dir) const noexcept
friend void tag_invoke(tag_t< euler::CompleteFromKineticState >, const PerfectGasMix &eq, Complete &q, const KineticState &kin, const Array< double, N, 1 > &u) noexcept
Definition: PerfectGasMix.hpp:335
friend const Species & tag_invoke(tag_t< euler::Species >, const PerfectGasMix &, const PerfectGasMixConservative< Density, Momentum, Energy, Species > &q) noexcept
Definition: PerfectGasMix.hpp:443
constexpr friend auto tag_invoke(tag_t< Depths >, const PerfectGasMix &eq, Type< State >) noexcept
Definition: PerfectGasMix.hpp:277
void CompleteFromCons(CompleteArray &complete, const ConservativeArrayBase< PerfectGasMix > &cons, MaskArray mask) const noexcept
friend auto tag_invoke(tag_t< euler::InternalEnergy >, const PerfectGasMix &eq, const PerfectGasMixConservative< Density, Momentum, Energy, Species > &q) noexcept
Definition: PerfectGasMix.hpp:314
double gamma
Definition: PerfectGasMix.hpp:269
friend void tag_invoke(tag_t< euler::SetVelocity >, const PerfectGasMix &, PerfectGasMixConservative< Density, Momentum, Energy, Species > &q, nodeduce_t< const Momentum & > v) noexcept
Definition: PerfectGasMix.hpp:407
friend void tag_invoke(tag_t< euler::KineticStateFromComplete >, const PerfectGasMix &eq, KineticState &kin, const Complete &q) noexcept
Definition: PerfectGasMix.hpp:352
friend auto tag_invoke(tag_t< euler::SetIsentropicPressure >, const PerfectGasMix &eq, Complete &q, const Complete &q0, double p_new) noexcept
Definition: PerfectGasMix.hpp:503
friend auto tag_invoke(tag_t< euler::Velocity >, const PerfectGasMix &, const PerfectGasMixConservative< Density, Momentum, Energy, Species > &q, int d) noexcept
Definition: PerfectGasMix.hpp:420
double gamma_minus_1_inv
Definition: PerfectGasMix.hpp:270
double Machnumber(const Complete &q) const noexcept
friend const Pressure & tag_invoke(tag_t< euler::Pressure >, const PerfectGasMix &, const PerfectGasMixComplete< Density, Momentum, Energy, Species, Pressure, SpeedOfSound > &q) noexcept
Definition: PerfectGasMix.hpp:483
friend Momentum tag_invoke(tag_t< euler::Velocity >, const PerfectGasMix &, const PerfectGasMixConservative< Density, Momentum, Energy, Species > &q) noexcept
Definition: PerfectGasMix.hpp:390
friend const Density & tag_invoke(tag_t< euler::Density >, const PerfectGasMix &, const PerfectGasMixConservative< Density, Momentum, Energy, Species > &q) noexcept
Definition: PerfectGasMix.hpp:305
Array< double, N > Velocity(const CompleteArray &q) const noexcept
friend double tag_invoke(tag_t< euler::Pressure >, const PerfectGasMix &eq, const KineticState &q) noexcept
Definition: PerfectGasMix.hpp:489
Definition: StateArray.hpp:89
Definition: State.hpp:290
This type is used to tag scalar quantities.
Definition: State.hpp:109
Definition: State.hpp:162
This type is used to tag quantities with a depth known at compile time.
Definition: State.hpp:112