[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
large_eddy_simulation.h
1 #ifndef __LARGE_EDDY_SIMULATION__
2 #define __LARGE_EDDY_SIMULATION__
3 
4 #include "model.h"
5 #include "navier_stokes.h"
6 #include "euler.h"
7 
8 namespace PHiLiP {
9 namespace Physics {
10 
12 template <int dim, int nstate, typename real>
13 class LargeEddySimulationBase : public ModelBase <dim, nstate, real>
14 {
15 public:
20  const Parameters::AllParameters *const parameters_input,
21  const double ref_length,
22  const double gamma_gas,
23  const double mach_inf,
24  const double angle_of_attack,
25  const double side_slip_angle,
26  const double prandtl_number,
27  const double reynolds_number_inf,
28  const bool use_constant_viscosity,
29  const double constant_viscosity,
30  const double temperature_inf,
31  const double turbulent_prandtl_number,
33  const double isothermal_wall_temperature = 1.0,
34  const thermal_boundary_condition_enum thermal_boundary_condition_type = thermal_boundary_condition_enum::adiabatic,
36  const two_point_num_flux_enum two_point_num_flux_type = two_point_num_flux_enum::KG);
37 
40 
43 
45  std::unique_ptr< NavierStokes<dim,nstate,real> > navier_stokes_physics;
46 
48  std::array<dealii::Tensor<1,dim,real>,nstate> convective_flux (
49  const std::array<real,nstate> &conservative_soln) const;
50 
52  std::array<dealii::Tensor<1,dim,real>,nstate> dissipative_flux (
53  const std::array<real,nstate> &conservative_soln,
54  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
55  const dealii::types::global_dof_index cell_index) const;
56 
58 
59  std::array<real,nstate> convective_eigenvalues (
60  const std::array<real,nstate> &/*conservative_soln*/,
61  const dealii::Tensor<1,dim,real> &/*normal*/) const override;
62 
64 
65  real max_convective_eigenvalue (const std::array<real,nstate> &soln) const;
66 
68 
70  const std::array<real,nstate> &soln,
71  const dealii::Tensor<1,dim,real> &normal) const;
72 
74  std::array<real,nstate> source_term (
75  const dealii::Point<dim,real> &pos,
76  const std::array<real,nstate> &solution,
77  const real current_time,
78  const dealii::types::global_dof_index cell_index) const;
79 
81  double get_filter_width (const dealii::types::global_dof_index cell_index) const;
82 
84  virtual dealii::Tensor<2,dim,real> compute_SGS_stress_tensor (
85  const std::array<real,nstate> &primitive_soln,
86  const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
87  const dealii::types::global_dof_index cell_index) const = 0;
88 
90  virtual dealii::Tensor<1,dim,real> compute_SGS_heat_flux (
91  const std::array<real,nstate> &primitive_soln,
92  const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
93  const dealii::types::global_dof_index cell_index) const = 0;
94 
96  virtual dealii::Tensor<2,dim,FadType> compute_SGS_stress_tensor_fad (
97  const std::array<FadType,nstate> &primitive_soln,
98  const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
99  const dealii::types::global_dof_index cell_index) const = 0;
100 
102  virtual dealii::Tensor<1,dim,FadType> compute_SGS_heat_flux_fad (
103  const std::array<FadType,nstate> &primitive_soln,
104  const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
105  const dealii::types::global_dof_index cell_index) const = 0;
106 
107 protected:
109  template<typename real2>
110  real2 get_tensor_magnitude_sqr (const dealii::Tensor<2,dim,real2> &tensor) const;
111 
113  template<typename real2>
114  std::array<dealii::Tensor<1,dim,real2>,nstate> dissipative_flux_templated (
115  const std::array<real2,nstate> &conservative_soln,
116  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
117  const dealii::types::global_dof_index cell_index) const;
118 
123  dealii::Tensor<2,nstate,real> dissipative_flux_directional_jacobian (
124  const std::array<real,nstate> &conservative_soln,
125  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
126  const dealii::Tensor<1,dim,real> &normal,
127  const dealii::types::global_dof_index cell_index) const;
128 
134  const std::array<real,nstate> &conservative_soln,
135  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
136  const dealii::Tensor<1,dim,real> &normal,
137  const int d_gradient,
138  const dealii::types::global_dof_index cell_index) const;
139 
141  std::array<real,nstate> get_manufactured_solution_value (
142  const dealii::Point<dim,real> &pos) const;
143 
145  std::array<dealii::Tensor<1,dim,real>,nstate> get_manufactured_solution_gradient (
146  const dealii::Point<dim,real> &pos) const;
147 
149  std::array<real,nstate> dissipative_source_term (
150  const dealii::Point<dim,real> &pos,
151  const dealii::types::global_dof_index cell_index) const;
152 };
153 
155 template <int dim, int nstate, typename real>
157 {
158 public:
165  const Parameters::AllParameters *const parameters_input,
166  const double ref_length,
167  const double gamma_gas,
168  const double mach_inf,
169  const double angle_of_attack,
170  const double side_slip_angle,
171  const double prandtl_number,
172  const double reynolds_number_inf,
173  const bool use_constant_viscosity,
174  const double constant_viscosity,
175  const double temperature_inf,
176  const double turbulent_prandtl_number,
178  const double model_constant,
179  const double isothermal_wall_temperature = 1.0,
180  const thermal_boundary_condition_enum thermal_boundary_condition_type = thermal_boundary_condition_enum::adiabatic,
182  const two_point_num_flux_enum two_point_num_flux_type = two_point_num_flux_enum::KG);
183 
185  const double model_constant;
186 
188  double get_model_constant_times_filter_width (const dealii::types::global_dof_index cell_index) const;
189 
191  dealii::Tensor<2,dim,real> compute_SGS_stress_tensor (
192  const std::array<real,nstate> &primitive_soln,
193  const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
194  const dealii::types::global_dof_index cell_index) const;
195 
197  dealii::Tensor<1,dim,real> compute_SGS_heat_flux (
198  const std::array<real,nstate> &primitive_soln,
199  const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
200  const dealii::types::global_dof_index cell_index) const;
201 
203  dealii::Tensor<2,dim,FadType> compute_SGS_stress_tensor_fad (
204  const std::array<FadType,nstate> &primitive_soln,
205  const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
206  const dealii::types::global_dof_index cell_index) const;
207 
209  dealii::Tensor<1,dim,FadType> compute_SGS_heat_flux_fad (
210  const std::array<FadType,nstate> &primitive_soln,
211  const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
212  const dealii::types::global_dof_index cell_index) const;
213 
215  virtual real compute_eddy_viscosity(
216  const std::array<real,nstate> &primitive_soln,
217  const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
218  const dealii::types::global_dof_index cell_index) const;
219 
221  virtual FadType compute_eddy_viscosity_fad(
222  const std::array<FadType,nstate> &primitive_soln,
223  const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
224  const dealii::types::global_dof_index cell_index) const;
225 
226 protected:
228  template<typename real2> dealii::Tensor<2,dim,real2> compute_SGS_stress_tensor_templated (
229  const std::array<real2,nstate> &primitive_soln,
230  const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient,
231  const dealii::types::global_dof_index cell_index) const;
232 
234  template<typename real2>
235  dealii::Tensor<1,dim,real2> compute_SGS_heat_flux_templated (
236  const std::array<real2,nstate> &primitive_soln,
237  const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient,
238  const dealii::types::global_dof_index cell_index) const;
239 
241  template<typename real2> real2 scale_eddy_viscosity_templated(
242  const std::array<real2,nstate> &primitive_soln,
243  const real2 eddy_viscosity) const;
244 
245 private:
247  template<typename real2> real2 compute_eddy_viscosity_templated(
248  const std::array<real2,nstate> &primitive_soln,
249  const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient,
250  const dealii::types::global_dof_index cell_index) const;
251 };
252 
254 template <int dim, int nstate, typename real>
256 {
257 public:
265  const Parameters::AllParameters *const parameters_input,
266  const double ref_length,
267  const double gamma_gas,
268  const double mach_inf,
269  const double angle_of_attack,
270  const double side_slip_angle,
271  const double prandtl_number,
272  const double reynolds_number_inf,
273  const bool use_constant_viscosity,
274  const double constant_viscosity,
275  const double temperature_inf,
276  const double turbulent_prandtl_number,
278  const double model_constant,
279  const double isothermal_wall_temperature = 1.0,
280  const thermal_boundary_condition_enum thermal_boundary_condition_type = thermal_boundary_condition_enum::adiabatic,
282  const two_point_num_flux_enum two_point_num_flux_type = two_point_num_flux_enum::KG);
283 
287  real compute_eddy_viscosity(
288  const std::array<real,nstate> &primitive_soln,
289  const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
290  const dealii::types::global_dof_index cell_index) const override;
291 
295  FadType compute_eddy_viscosity_fad(
296  const std::array<FadType,nstate> &primitive_soln,
297  const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
298  const dealii::types::global_dof_index cell_index) const override;
299 
300 private:
304  template<typename real2> real2 compute_eddy_viscosity_templated(
305  const std::array<real2,nstate> &primitive_soln,
306  const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient,
307  const dealii::types::global_dof_index cell_index) const;
308 };
309 
311 template <int dim, int nstate, typename real>
313 {
314 public:
321  const Parameters::AllParameters *const parameters_input,
322  const double ref_length,
323  const double gamma_gas,
324  const double mach_inf,
325  const double angle_of_attack,
326  const double side_slip_angle,
327  const double prandtl_number,
328  const double reynolds_number_inf,
329  const bool use_constant_viscosity,
330  const double constant_viscosity,
331  const double temperature_inf,
332  const double turbulent_prandtl_number,
334  const double model_constant,
335  const double isothermal_wall_temperature = 1.0,
336  const thermal_boundary_condition_enum thermal_boundary_condition_type = thermal_boundary_condition_enum::adiabatic,
338  const two_point_num_flux_enum two_point_num_flux_type = two_point_num_flux_enum::KG);
339 
343  real compute_eddy_viscosity(
344  const std::array<real,nstate> &primitive_soln,
345  const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
346  const dealii::types::global_dof_index cell_index) const override;
347 
351  FadType compute_eddy_viscosity_fad(
352  const std::array<FadType,nstate> &primitive_soln,
353  const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
354  const dealii::types::global_dof_index cell_index) const override;
355 
356 private:
360  template<typename real2> real2 compute_eddy_viscosity_templated(
361  const std::array<real2,nstate> &primitive_soln,
362  const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient,
363  const dealii::types::global_dof_index cell_index) const;
364 };
365 
366 } // Physics namespace
367 } // PHiLiP namespace
368 
369 #endif
virtual dealii::Tensor< 2, dim, real > compute_SGS_stress_tensor(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const =0
Nondimensionalized sub-grid scale (SGS) stress tensor, (tau^sgs)*.
std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function
Manufactured solution function.
Definition: model.h:29
real2 get_tensor_magnitude_sqr(const dealii::Tensor< 2, dim, real2 > &tensor) const
Returns the square of the magnitude of the tensor (i.e. the double dot product of a tensor with itsel...
const double turbulent_prandtl_number
Turbulent Prandtl number.
virtual dealii::Tensor< 2, dim, FadType > compute_SGS_stress_tensor_fad(const std::array< FadType, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, FadType >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const =0
Nondimensionalized sub-grid scale (SGS) stress tensor, (tau^sgs)* (Automatic Differentiation Type: Fa...
virtual dealii::Tensor< 1, dim, real > compute_SGS_heat_flux(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const =0
Nondimensionalized sub-grid scale (SGS) heat flux, (q^sgs)*.
Smagorinsky eddy viscosity model. Derived from Large Eddy Simulation.
dealii::Tensor< 2, nstate, real > dissipative_flux_directional_jacobian_wrt_gradient_component(const std::array< real, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const dealii::Tensor< 1, dim, real > &normal, const int d_gradient, const dealii::types::global_dof_index cell_index) const
Sacado::Fad::DFad< double > FadType
Sacado AD type for first derivatives.
Definition: ADTypes.hpp:11
std::array< real, nstate > get_manufactured_solution_value(const dealii::Point< dim, real > &pos) const
Get manufactured solution value (repeated from Euler)
Manufactured solution used for grid studies to check convergence orders.
WALE (Wall-Adapting Local Eddy-viscosity) eddy viscosity model. Derived from LargeEddySimulation_Smag...
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const
Maximum convective eigenvalue of the additional models&#39; PDEs.
dealii::Tensor< 2, nstate, real > dissipative_flux_directional_jacobian(const std::array< real, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const dealii::Tensor< 1, dim, real > &normal, const dealii::types::global_dof_index cell_index) const
std::array< real, nstate > convective_eigenvalues(const std::array< real, nstate > &, const dealii::Tensor< 1, dim, real > &) const override
Convective eigenvalues of the additional models&#39; PDEs.
std::array< real, nstate > source_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &solution, const real current_time, const dealii::types::global_dof_index cell_index) const
Source term for manufactured solution functions.
Files for the baseline physics.
Definition: ADTypes.hpp:10
Physics model additional terms and equations to the baseline physics.
Definition: model.h:18
Main parameter class that contains the various other sub-parameter classes.
std::array< real, nstate > dissipative_source_term(const dealii::Point< dim, real > &pos, const dealii::types::global_dof_index cell_index) const
Dissipative flux contribution to the source term (repeated from NavierStokes)
std::unique_ptr< NavierStokes< dim, nstate, real > > navier_stokes_physics
Pointer to Navier-Stokes physics object.
TwoPointNumericalFlux
Two point numerical flux type for split form.
LargeEddySimulationBase(const Parameters::AllParameters *const parameters_input, const double ref_length, const double gamma_gas, const double mach_inf, const double angle_of_attack, const double side_slip_angle, const double prandtl_number, const double reynolds_number_inf, const bool use_constant_viscosity, const double constant_viscosity, const double temperature_inf, const double turbulent_prandtl_number, const double ratio_of_filter_width_to_cell_size, const double isothermal_wall_temperature=1.0, const thermal_boundary_condition_enum thermal_boundary_condition_type=thermal_boundary_condition_enum::adiabatic, std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function=nullptr, const two_point_num_flux_enum two_point_num_flux_type=two_point_num_flux_enum::KG)
Constructor.
real max_convective_normal_eigenvalue(const std::array< real, nstate > &soln, const dealii::Tensor< 1, dim, real > &normal) const
Maximum convective normal eigenvalue (used in Lax-Friedrichs) of the additional models&#39; PDEs...
Large Eddy Simulation equations. Derived from Navier-Stokes for modifying the stress tensor and heat ...
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_flux(const std::array< real, nstate > &conservative_soln) const
Convective flux: .
Vreman eddy viscosity model. Derived from LargeEddySimulation_Smagorinsky for only modifying compute_...
virtual dealii::Tensor< 1, dim, FadType > compute_SGS_heat_flux_fad(const std::array< FadType, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, FadType >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const =0
Nondimensionalized sub-grid scale (SGS) heat flux, (q^sgs)* (Automatic Differentiation Type: FadType)...
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 (i.e. viscous) flux: .
ThermalBoundaryCondition
Types of thermal boundary conditions available.
double get_filter_width(const dealii::types::global_dof_index cell_index) const
Compute the nondimensionalized filter width used by the SGS model given a cell index.
std::array< dealii::Tensor< 1, dim, real >, nstate > get_manufactured_solution_gradient(const dealii::Point< dim, real > &pos) const
Get manufactured solution value (repeated from Euler)
const double ratio_of_filter_width_to_cell_size
Ratio of filter width to cell size.
std::array< dealii::Tensor< 1, dim, real2 >, nstate > dissipative_flux_templated(const std::array< real2, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &solution_gradient, const dealii::types::global_dof_index cell_index) const
Templated dissipative (i.e. viscous) flux: .