[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
real_gas.h
1 #ifndef __REALGAS__
2 #define __REALGAS__
3 
4 #include <deal.II/base/tensor.h>
5 #include "physics.h"
6 #include "parameters/all_parameters.h"
7 #include "parameters/parameters_manufactured_solution.h"
8 // #include "navier_stokes.h"
9 
10 namespace PHiLiP {
11 namespace Physics {
12 
14 /* Functions designated with "// Algorithm # (f_M#)" are detailed in Matsuyama's M.Sc. thesis (2025)
15  Algorithms that have "Modified by Shruthi" appended to it do not strictly follow the implementation in the thesis*/
16 
17 template <int dim, int nspecies, int nstate, typename real>
18 class RealGas : public PhysicsBase <dim, nspecies, nstate, real>
19 {
20 protected:
21  // For overloading the virtual functions defined in PhysicsBase
30 public:
33  RealGas (
34  const Parameters::AllParameters *const parameters_input,
36  const bool has_nonzero_diffusion = false,
37  const bool has_nonzero_physical_source = false);
38 
40  ~RealGas() {};
41 
42  const double gam_ref;
43  const double mach_ref;
44  const double mach_ref_sqr;
46 
47 public:
48  const double Ru;
49  const double MW_Air;
50  const double R_ref;
51  const double temperature_ref;
52  const double u_ref;
53  const double u_ref_sqr;
54  const double tol;
55  const double density_ref;
56 
57 public:
58 
60  void readspeciesdata(std::string reactionFilename);
61 
63  std::array<int,nspecies>GetNASACAP_TemperatureIndex ( const real temperature ) const;
64 
66  std::array<real,nstate> compute_entropy_variables (
67  const std::array<real,nstate> &conservative_soln) const;
68 
71  const std::array<real,nstate> &entropy_var) const;
72 
74  virtual std::array<real,nstate> compute_kinetic_energy_variables (
75  const std::array<real,nstate> &conservative_soln) const;
76 
78  std::array<real,nstate> convective_eigenvalues (
79  const std::array<real,nstate> &/*conservative_soln*/,
80  const dealii::Tensor<1,dim,real> &/*normal*/) const;
81 
83  real max_convective_eigenvalue (const std::array<real,nstate> &soln) const;
84 
86 
88  const std::array<real,nstate> &soln,
89  const dealii::Tensor<1,dim,real> &normal) const override;
90 
91 
93  real max_viscous_eigenvalue (const std::array<real,nstate> &soln) const;
94 
96  std::array<dealii::Tensor<1,dim,real>,nstate> dissipative_flux (
97  const std::array<real,nstate> &conservative_soln,
98  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
99  const dealii::types::global_dof_index cell_index) const;
100 
102  std::array<real,nstate> source_term (
103  const dealii::Point<dim,real> &pos,
104  const std::array<real,nstate> &conservative_soln,
105  const real current_time,
106  const dealii::types::global_dof_index cell_index) const;
107 
108 protected:
115  void boundary_slip_wall (
116  const dealii::Tensor<1,dim,real> &normal_int,
117  const std::array<real,nstate> &soln_int,
118  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
119  std::array<real,nstate> &soln_bc,
120  std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc) const;
121 
123  virtual void boundary_wall (
124  const dealii::Tensor<1,dim,real> &normal_int,
125  const std::array<real,nstate> &soln_int,
126  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
127  std::array<real,nstate> &soln_bc,
128  std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc) const;
129 
131  void boundary_face_values (
132  const int /*boundary_type*/,
133  const dealii::Point<dim, real> &/*pos*/,
134  const dealii::Tensor<1,dim,real> &/*normal*/,
135  const std::array<real,nstate> &/*soln_int*/,
136  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_int*/,
137  std::array<real,nstate> &/*soln_bc*/,
138  std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_bc*/) const;
139 
140 protected:
142  std::array<real,dim+2> get_mixture_solution_vector ( const std::array<real,nstate> &full_soln ) const;
144  std::array<dealii::Tensor<1,dim,real>,dim+2> get_mixture_solution_gradient (
145  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const;
146 
147 public:
148  // Algorithm 20 (f_S20): Convert primitive to conservative
149  virtual std::array<real,nstate> convert_primitive_to_conservative ( const std::array<real,nstate> &primitive_soln ) const;
150 
151  // Algorithm 20b : Convert conservative to primitive
152  // Added by Shruthi
153  virtual std::array<real,nstate> convert_conservative_to_primitive ( const std::array<real,nstate> &conservative_soln ) const;
154 
156  std::array<dealii::Tensor<1,dim,real>,nstate>
158  const std::array<real,nstate> &conservative_soln,
159  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const;
160 
162  std::array<dealii::Tensor<1,dim,real>,nstate>
164  const std::array<real,nstate> &primitive_soln,
165  const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient) const;
166 
167 /* MAIN FUNCTIONS */
168 protected:
169  // Algorithm 1 (f_M1): Compute mixture density from conservative_soln
170  template<typename real2>
171  real2 compute_mixture_density ( const std::array<real2,nstate> &conservative_soln ) const;
172 
173  // Algorithm 2 (f_M2): Compute velocities from conservative_soln
174  dealii::Tensor<1,dim,real> compute_velocities ( const std::array<real,nstate> &conservative_soln ) const;
175 
176  // Algorithm 3 (f_M3): Compute squared velocities from conservative_soln
177  real compute_velocity_squared_from_conservative_solution ( const std::array<real,nstate> &conservative_soln ) const;
178 
179  // Algorithm 3b: Compute velocity squared when provided with velocities
180  real compute_velocity_squared ( const dealii::Tensor<1,dim,real> &velocities ) const;
181 
183  dealii::Tensor<1,dim,real> extract_velocities_from_primitive ( const std::array<real,nstate> &primitive_soln ) const;
184 
185  // Algorithm 4 (f_M4): Compute specific kinetic energy from conservative_soln
186  real compute_specific_kinetic_energy ( const std::array<real,nstate> &conservative_soln ) const;
187 
188  // Algorithm 5 (f_M5): Compute mixture specific total energy from conservative_soln
189  real compute_mixture_specific_total_energy ( const std::array<real,nstate> &conservative_soln ) const;
190 
191 public:
192  // Algorithm 6 (f_M6): Compute species densities from conservative_soln
193  std::array<real,nspecies> compute_species_densities ( const std::array<real,nstate> &conservative_soln ) const;
194 
195  // Algorithm 7 (f_M7): Compute mass fractions from conservative_soln
196  std::array<real,nspecies> compute_mass_fractions ( const std::array<real,nstate> &conservative_soln ) const;
197 
198 protected:
199  // Algorithm 8 (f_M8): Compute mixture property from mass fractions and species properties
200  real compute_mixture_from_species( const std::array<real,nspecies> &mass_fractions, const std::array<real,nspecies> &species ) const;
201 
202  // Algorithm 9 (f_M9): Compute dimensional temperature from (non-dimensional) temperature
203  real compute_dimensional_temperature ( const real temperature ) const;
204 
205 public:
206  // Algorithm 10 (f_M10): Compute species gas constants from Ru (universal gas constant)
207  std::array<real,nspecies> compute_Rs ( const real Ru ) const;
208 
209 protected:
210  // Algorithm 11 (f_M11): Compute species specific heat at constant pressure from temperature
211  // These are computed using the NASA 9-Coefficient Polynomial Parameterization (see McBride et. al, 2002)
212  // Modified by Shruthi
213  std::array<real,nspecies> compute_species_specific_Cp ( const real temperature ) const;
214 
215  // Algorithm 12 (f_M12): Compute species specific heat at constant volume from temperature
216  std::array<real,nspecies>compute_species_specific_Cv ( const real temperature ) const;
217 
218  // Algorithm 13 (f_M13): Compute species specific enthalpy from temperature
219  // These are computed using the NASA 9-Coefficient Polynomial Parameterization (see McBride et. al, 2002)
220  // Modified by Shruthi
221  std::array<real,nspecies> compute_species_specific_enthalpy ( const real temperature ) const;
222 
223  // Algorithm 14 (f_M14): Compute species specific internal energy from temperature
224  std::array<real,nspecies> compute_species_specific_internal_energy ( const real temperature ) const;
225 
226  // Compute Cv integral component of the species entropy equation
227  // These are computed using the NASA 9-Coefficient Polynomial Parameterization (see McBride et. al, 2002)
228  std::array<real,nspecies> compute_species_entropy_cv_integral ( const real temperature ) const;
229 
230  // Compute species entropy from temperature and species density
231  std::array<real,nspecies> compute_species_entropy ( const std::array<real,nstate> &conservative_soln ) const;
232 
233  // Compute species Gibbs' energy using species entropy and species Cp
234  std::array<real,nspecies> compute_species_gibbs_energy ( const std::array<real,nstate> &conservative_soln ) const;
235 public:
236  // Compute mixture entropy
237  real compute_entropy ( const std::array<real,nstate> &conservative_soln ) const;
238 
239  // Algorithm 15 (f_M15): Compute temperature from conservative_soln
240  virtual real compute_temperature ( const std::array<real,nstate> &conservative_soln ) const;
241 
242 protected:
243  // Algorithm 16 (f_M16): Compute mixture gas constant from conservative_soln
244  real compute_mixture_gas_constant ( const std::array<real,nstate> &conservative_soln ) const;
245 
246 public:
247  // Algorithm 17 (f_M17): Compute mixture pressure from conservative_soln
248  virtual real compute_mixture_pressure ( const std::array<real,nstate> &conservative_soln ) const;
249 
250  // Algorithm 17b: Calls compute_mixture_pressure (required for limiter)
251  virtual real compute_pressure ( const std::array<real,nstate> &conservative_soln ) const;
252 
254  real compute_pressure_from_density_temperature ( const real density, const real temperature, const std::array<real,nstate> &conservative_soln ) const;
255 
256  // Algorithm 18 (f_M18): Compute mixture specific total enthalpy from conservative_soln
257  real compute_mixture_specific_total_enthalpy ( const std::array<real,nstate> &conservative_soln ) const;
258 
259  // Algorithm 19 (f_M19): Compute convective flux from conservative_soln
260  std::array<dealii::Tensor<1,dim,real>,nstate> convective_flux (
261  const std::array<real,nstate> &conservative_soln) const;
262 
264  dealii::Tensor<2,nstate,real> convective_flux_directional_jacobian (
265  const std::array<real,nstate> &conservative_soln,
266  const dealii::Tensor<1,dim,real> &normal) const;
267 
269  std::array<dealii::Tensor<1,dim,real>,nstate> convective_numerical_split_flux (
270  const std::array<real,nstate> &conservative_soln1,
271  const std::array<real,nstate> &conservative_soln2) const override;
272 
275  std::array<dealii::Tensor<1,dim,real>,nstate> convective_numerical_split_flux_kennedy_gruber (
276  const std::array<real,nstate> &conservative_soln1,
277  const std::array<real,nstate> &conservative_soln2) const;
278 
279 protected:
280  // Algorithm 21 (f_S21): Compute species specific heat ratio from conservative_soln
281  virtual std::array<real,nspecies> compute_species_specific_heat_ratio ( const std::array<real,nstate> &conservative_soln ) const;
282 
283  // Compute gamma from conservative_soln
284  virtual real compute_gamma ( const std::array<real,nstate> &conservative_soln ) const;
285 
286  // Algorithm 22 (f_S22): Compute species speed of sound from conservative_soln
287  std::array<real,nspecies> compute_species_speed_of_sound ( const std::array<real,nstate> &conservative_soln ) const;
288 
289 
290 public:
292  real compute_sound ( const std::array<real,nstate> &conservative_soln ) const;
293 
294 protected:
296  virtual dealii::Vector<double> post_compute_derived_quantities_vector (
297  const dealii::Vector<double> &uh,
298  const std::vector<dealii::Tensor<1,dim> > &duh,
299  const std::vector<dealii::Tensor<2,dim> > &dduh,
300  const dealii::Tensor<1,dim> &normals,
301  const dealii::Point<dim> &evaluation_points) const;
302 
304  virtual std::vector<std::string> post_get_names () const;
305 
307  virtual std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation> post_get_data_component_interpretation () const;
308 
310  virtual dealii::UpdateFlags post_get_needed_update_flags () const;
311 
312 protected:
314  std::array<std::array<std::array<double,3>,9>,nspecies> NASACAPCoeffs;
315  std::array<std::array<double,4>,nspecies> NASACAPTemperatureLimits;
316  std::array<std::string,nspecies> species_name; // Species name
317  std::array<double,nspecies> species_weight; // Species molecular weight [kg/mol]
318  std::array<double,nspecies> species_enthalpy_offset; // Species enthalpy offset - reads in [J/mol], stores nondimesnional
319  std::array<real,nspecies> Rs; // Species gas constant
320 };
321 
322 } // Physics namespace
323 } // PHiLiP namespace
324 
325 #endif
RealGas(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function=nullptr, const bool has_nonzero_diffusion=false, const bool has_nonzero_physical_source=false)
Constructor.
Definition: real_gas.cpp:15
~RealGas()
Destructor.
Definition: real_gas.h:40
std::array< std::array< std::array< double, 3 >, 9 >, nspecies > NASACAPCoeffs
Variables to store NASA Coefficients.
Definition: real_gas.h:314
RealGas equations. Derived from PhysicsBase.
Definition: real_gas.h:18
const double u_ref
reference velocity [m/s]
Definition: real_gas.h:52
real max_viscous_eigenvalue(const std::array< real, nstate > &soln) const
Maximum viscous eigenvalue.
Definition: real_gas.cpp:212
const bool has_nonzero_diffusion
Flag to signal that diffusion term is non-zero.
Definition: physics.h:59
std::array< real, nstate > compute_entropy_variables(const std::array< real, nstate > &conservative_soln) const
Computes the entropy variables.
Definition: real_gas.cpp:744
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Definition: physics.h:34
virtual std::array< real, nstate > compute_kinetic_energy_variables(const std::array< real, nstate > &conservative_soln) const
Computes the kinetic energy variables.
Definition: real_gas.cpp:844
Manufactured solution used for grid studies to check convergence orders.
std::array< dealii::Tensor< 1, dim, real >, nstate > dissipative_flux(const std::array< real, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const dealii::types::global_dof_index cell_index) const
Dissipative flux: 0.
Definition: real_gas.cpp:221
real compute_entropy(const std::array< real, nstate > &conservative_soln) const
Compute entropy from conservative solution.
Definition: real_gas.cpp:707
Files for the baseline physics.
Definition: ADTypes.hpp:10
const bool has_nonzero_physical_source
Flag to signal that physical source term is non-zero.
Definition: physics.h:62
void readspeciesdata(std::string reactionFilename)
Reads in data from chemistry file.
Definition: real_gas.cpp:45
virtual real compute_temperature(const std::array< real, nstate > &conservative_soln) const
Definition: real_gas.cpp:867
virtual real compute_pressure(const std::array< real, nstate > &conservative_soln) const
Compute pressure from conservative solution.
Definition: real_gas.cpp:969
real compute_sound(const std::array< real, nstate > &conservative_soln) const
Evaluate speed of sound from conservative variables.
Definition: real_gas.cpp:1331
virtual dealii::Vector< double > post_compute_derived_quantities_vector(const dealii::Vector< double > &uh, const std::vector< dealii::Tensor< 1, dim > > &duh, const std::vector< dealii::Tensor< 2, dim > > &dduh, const dealii::Tensor< 1, dim > &normals, const dealii::Point< dim > &evaluation_points) const
For post processing purposes (update comment later)
Definition: real_gas.cpp:1379
virtual std::array< real, nstate > convert_conservative_to_primitive(const std::array< real, nstate > &conservative_soln) const
Convert conservative variables to primitive variables.
Definition: real_gas.cpp:1232
std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function
Manufactured solution function.
Definition: physics.h:71
virtual std::array< real, nstate > convert_primitive_to_conservative(const std::array< real, nstate > &primitive_soln) const
Convert primitive solution to conservative solution.
Definition: real_gas.cpp:1164
const double tol
tolerance for NRM (Newton-raphson Method) [m/s]
Definition: real_gas.h:54
const two_point_num_flux_enum two_point_num_flux_type
Two point numerical flux type (for split form)
Definition: real_gas.h:45
const double R_ref
reference gas constant: [J/(kg·K)]
Definition: real_gas.h:50
Main parameter class that contains the various other sub-parameter classes.
std::array< dealii::Tensor< 1, dim, real >, nstate > convert_primitive_gradient_to_conservative_gradient(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient) const
Definition: real_gas.cpp:1255
const double density_ref
reference mixture density: [kg/m^3]
Definition: real_gas.h:55
const double Ru
universal gas constant: [J/(mol·K)]
Definition: real_gas.h:48
std::array< real, nstate > convective_eigenvalues(const std::array< real, nstate > &, const dealii::Tensor< 1, dim, real > &) const
Spectral radius of convective term Jacobian is &#39;c&#39;.
Definition: real_gas.cpp:166
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_flux(const std::array< real, nstate > &conservative_soln) const
Convective fluxes that will be differentiated once in space.
Definition: real_gas.cpp:998
TwoPointNumericalFlux
Two point numerical flux type for split form.
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_numerical_split_flux(const std::array< real, nstate > &conservative_soln1, const std::array< real, nstate > &conservative_soln2) const override
Evaluates convective flux based on the chosen split form.
Definition: real_gas.cpp:1084
std::array< real, nstate > source_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &conservative_soln, const real current_time, const dealii::types::global_dof_index cell_index) const
Source term is zero or depends on manufactured solution.
Definition: real_gas.cpp:236
const double gam_ref
reference gamma
Definition: real_gas.h:40
std::array< dealii::Tensor< 1, dim, real >, dim+2 > get_mixture_solution_gradient(const std::array< dealii::Tensor< 1, dim, real >, nstate > &conservative_soln_gradient) const
returns the solution gradient vector without the species conservation states (only mixture) ...
Definition: real_gas.cpp:1364
std::array< real, nstate > compute_conservative_variables_from_entropy_variables(const std::array< real, nstate > &entropy_var) const
Computes the conservative variables from the entropy variables.
Definition: real_gas.cpp:774
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_numerical_split_flux_kennedy_gruber(const std::array< real, nstate > &conservative_soln1, const std::array< real, nstate > &conservative_soln2) const
Definition: real_gas.cpp:1106
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const
Maximum convective eigenvalue.
Definition: real_gas.cpp:183
void boundary_face_values(const int, const dealii::Point< dim, real > &, const dealii::Tensor< 1, dim, real > &, const std::array< real, nstate > &, const std::array< dealii::Tensor< 1, dim, real >, nstate > &, std::array< real, nstate > &, std::array< dealii::Tensor< 1, dim, real >, nstate > &) const
Boundary condition handler.
Definition: real_gas.cpp:316
std::array< real, nspecies > compute_species_entropy_cv_integral(const real temperature) const
Definition: real_gas.cpp:629
dealii::Tensor< 1, dim, real > extract_velocities_from_primitive(const std::array< real, nstate > &primitive_soln) const
Given primitive variables, returns velocities.
Definition: real_gas.cpp:390
virtual std::vector< std::string > post_get_names() const
For post processing purposes, sets the base names (with no prefix or suffix) of the computed quantiti...
Definition: real_gas.cpp:1482
std::array< dealii::Tensor< 1, dim, real >, nstate > convert_conservative_gradient_to_primitive_gradient(const std::array< real, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &conservative_soln_gradient) const
Definition: real_gas.cpp:1267
const double u_ref_sqr
reference velocity squared[m/s]^2
Definition: real_gas.h:53
real max_convective_normal_eigenvalue(const std::array< real, nstate > &soln, const dealii::Tensor< 1, dim, real > &normal) const override
Maximum convective normal eigenvalue (used in Lax-Friedrichs)
Definition: real_gas.cpp:195
void boundary_slip_wall(const dealii::Tensor< 1, dim, real > &normal_int, const std::array< real, nstate > &soln_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_int, std::array< real, nstate > &soln_bc, std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_bc) const
Definition: real_gas.cpp:264
const double mach_ref_sqr
reference mach number (Farfield Mach number squared)
Definition: real_gas.h:44
const double temperature_ref
reference temperature [K]
Definition: real_gas.h:51
virtual std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > post_get_data_component_interpretation() const
For post processing purposes, sets the interpretation of each computed quantity as either scalar or v...
Definition: real_gas.cpp:1450
virtual real compute_gamma(const std::array< real, nstate > &conservative_soln) const
Compute gamma from conservative solution.
Definition: real_gas.cpp:1297
virtual void boundary_wall(const dealii::Tensor< 1, dim, real > &normal_int, const std::array< real, nstate > &soln_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_int, std::array< real, nstate > &soln_bc, std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_bc) const
Wall boundary condition.
Definition: real_gas.cpp:251
const double MW_Air
molar weight of Air: [kg/mol]
Definition: real_gas.h:49
const double mach_ref
reference mach number (Farfield Mach number)
Definition: real_gas.h:43
std::array< int, nspecies > GetNASACAP_TemperatureIndex(const real temperature) const
Determine the.
Definition: real_gas.cpp:122
dealii::Tensor< 2, nstate, real > convective_flux_directional_jacobian(const std::array< real, nstate > &conservative_soln, const dealii::Tensor< 1, dim, real > &normal) const
Convective flux Jacobian: .
Definition: real_gas.cpp:1036
virtual dealii::UpdateFlags post_get_needed_update_flags() const
For post processing purposes (update comment later)
Definition: real_gas.cpp:1515
std::array< real, nspecies > compute_species_specific_enthalpy(const real temperature) const
Definition: real_gas.cpp:552
real compute_pressure_from_density_temperature(const real density, const real temperature, const std::array< real, nstate > &conservative_soln) const
Given density and temperature, returns NON-DIMENSIONALIZED pressure using free-stream non-dimensional...
Definition: real_gas.cpp:975
std::array< real, dim+2 > get_mixture_solution_vector(const std::array< real, nstate > &full_soln) const
returns the solution vector without the species conservation states (only mixture) ...
Definition: real_gas.cpp:1350