[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
physics_model.h
1 #ifndef __PHYSICS_MODEL__
2 #define __PHYSICS_MODEL__
3 
5 #include "physics.h"
6 #include "navier_stokes.h"
7 #include "model.h"
8 
9 namespace PHiLiP {
10 namespace Physics {
11 
13 template <int dim, int nspecies, int nstate, typename real, int nstate_baseline_physics>
14 class PhysicsModel : public PhysicsBase <dim, nspecies, nstate, real>
15 {
16 protected:
17  // For overloading the virtual functions defined in PhysicsBase
24  using PhysicsBase<dim,nspecies,nstate,real>::dissipative_flux; // can delete if the arguments of this function are updated to match PhysicsBase with filtered solution being passed
25  using PhysicsBase<dim,nspecies,nstate,real>::boundary_face_values; // can delete if the arguments of this function are updated to match PhysicsBase with filtered solution being passed
26 public:
29  const Parameters::AllParameters *const parameters_input,
31  std::shared_ptr< ModelBase<dim,nspecies,nstate,real> > model_input,
33  const bool has_nonzero_diffusion,
34  const bool has_nonzero_physical_source);
35 
37  const int n_model_equations;
38 
40  std::shared_ptr< PhysicsBase<dim,nspecies,nstate_baseline_physics,real> > physics_baseline;
41 
43  std::shared_ptr< ModelBase<dim,nspecies,nstate,real> > model;
44 
46  std::array<real,nstate> convert_conservative_to_primitive ( const std::array<real,nstate> &conservative_soln ) const;
47 
49  std::array<real,nstate> convert_primitive_to_conservative ( const std::array<real,nstate> &primitive_soln ) const;
50 
52  std::array<dealii::Tensor<1,dim,real>,nstate>
54  const std::array<real,nstate> &conservative_soln,
55  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const;
56 
58  std::array<dealii::Tensor<1,dim,real>,nstate>
60  const std::array<real,nstate> &primitive_soln,
61  const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient) const;
62 
64  std::array<dealii::Tensor<1,dim,real>,nstate> convective_flux (
65  const std::array<real,nstate> &conservative_soln) const;
66 
68  virtual std::array<dealii::Tensor<1,dim,real>,nstate> dissipative_flux (
69  const std::array<real,nstate> &solution,
70  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
71  const std::array<real,nstate> &filtered_solution,
72  const std::array<dealii::Tensor<1,dim,real>,nstate> &filtered_solution_gradient,
73  const dealii::types::global_dof_index cell_index) override;
74 
76  std::array<dealii::Tensor<1,dim,real>,nstate> dissipative_flux (
77  const std::array<real,nstate> &conservative_soln,
78  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
79  const dealii::types::global_dof_index cell_index) const;
80 
82  virtual std::array<real,nstate> dissipative_flux_dot_normal (
83  const std::array<real,nstate> &solution,
84  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
85  const std::array<real,nstate> &filtered_solution,
86  const std::array<dealii::Tensor<1,dim,real>,nstate> &filtered_solution_gradient,
87  const bool on_boundary,
88  const dealii::types::global_dof_index cell_index,
89  const dealii::Tensor<1,dim,real> &normal,
90  const int boundary_type) override;
91 
93  std::array<real,nstate> physical_source_term (
94  const dealii::Point<dim,real> &pos,
95  const std::array<real,nstate> &conservative_soln,
96  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
97  const dealii::types::global_dof_index cell_index) const;
98 
100  std::array<real,nstate> source_term (
101  const dealii::Point<dim,real> &pos,
102  const std::array<real,nstate> &conservative_soln,
103  const real current_time,
104  const dealii::types::global_dof_index cell_index) const;
105 
106  //===========================================================================================
107  // All other functions required by PhysicsBase:
108  //===========================================================================================
110  std::array<dealii::Tensor<1,dim,real>,nstate> convective_numerical_split_flux (
111  const std::array<real,nstate> &conservative_soln1,
112  const std::array<real,nstate> &conservative_soln2) const;
113 
115  std::array<real,nstate> compute_entropy_variables (
116  const std::array<real,nstate> &conservative_soln) const;
117 
120  const std::array<real,nstate> &entropy_var) const;
121 
125  std::array<real,nstate> convective_eigenvalues (
126  const std::array<real,nstate> &/*solution*/,
127  const dealii::Tensor<1,dim,real> &/*normal*/) const;
128 
130  real max_convective_eigenvalue (const std::array<real,nstate> &soln) const;
131 
134  const std::array<real,nstate> &soln,
135  const dealii::Tensor<1,dim,real> &normal) const override;
136 
138  real max_viscous_eigenvalue (const std::array<real,nstate> &soln) const;
139 
141  void boundary_face_values (
142  const int /*boundary_type*/,
143  const dealii::Point<dim, real> &/*pos*/,
144  const dealii::Tensor<1,dim,real> &/*normal*/,
145  const std::array<real,nstate> &/*soln_int*/,
146  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_int*/,
147  std::array<real,nstate> &/*soln_bc*/,
148  std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_bc*/) const;
149 
152  const int boundary_type,
153  const dealii::Point<dim, real> &pos,
154  const dealii::Tensor<1,dim,real> &normal,
155  const std::array<real,nstate> &soln_int,
156  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
157  const std::array<real,nstate> &/*filtered_soln_int*/,
158  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*filtered_soln_grad_int*/,
159  std::array<real,nstate> &soln_bc,
160  std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc) const override;
161 
163 
165  dealii::Vector<double> post_compute_derived_quantities_vector (
166  const dealii::Vector<double> &uh,
167  const std::vector<dealii::Tensor<1,dim> > &duh,
168  const std::vector<dealii::Tensor<2,dim> > &dduh,
169  const dealii::Tensor<1,dim> &normals,
170  const dealii::Point<dim> &evaluation_points) const;
171 
173 
175  std::vector<std::string> post_get_names () const;
176 
178 
180  std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation> post_get_data_component_interpretation () const;
181 
183 
185  dealii::UpdateFlags post_get_needed_update_flags () const;
186 
187 protected:
188  const MPI_Comm mpi_communicator;
189  const int mpi_rank;
190  const int n_mpi;
191 
194  dealii::ConditionalOStream pcout;
195 };
196 
200 template <int dim, int nspecies, int nstate, typename real, int nstate_baseline_physics>
201 class PhysicsModelFiltered : public PhysicsModel <dim, nspecies, nstate, real, nstate_baseline_physics>
202 {
203 protected:
204  // For overloading the virtual functions defined in PhysicsBase
211  // using PhysicsBase<dim,nstate,real>::dissipative_flux; // can delete if the arguments of this function are updated to match PhysicsBase with filtered solution being passed
212  using PhysicsBase<dim,nspecies,nstate,real>::boundary_face_values; // can delete if the arguments of this function are updated to match PhysicsBase with filtered solution being passed
214 public:
217  const Parameters::AllParameters *const parameters_input,
219  std::shared_ptr< ModelBase<dim,nspecies,nstate,real> > model_input,
221  const bool has_nonzero_diffusion,
222  const bool has_nonzero_physical_source);
223 
226 
228  std::array<dealii::Tensor<1,dim,real>,nstate> dissipative_flux (
229  const std::array<real,nstate> &solution,
230  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
231  const std::array<real,nstate> &filtered_solution,
232  const std::array<dealii::Tensor<1,dim,real>,nstate> &filtered_solution_gradient,
233  const dealii::types::global_dof_index cell_index) override;
234 
236  std::array<real,nstate> dissipative_flux_dot_normal (
237  const std::array<real,nstate> &solution,
238  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
239  const std::array<real,nstate> &filtered_solution,
240  const std::array<dealii::Tensor<1,dim,real>,nstate> &filtered_solution_gradient,
241  const bool on_boundary,
242  const dealii::types::global_dof_index cell_index,
243  const dealii::Tensor<1,dim,real> &normal,
244  const int boundary_type) override;
245 };
246 
247 } // Physics namespace
248 } // PHiLiP namespace
249 
250 #endif
std::array< real, nstate > convert_primitive_to_conservative(const std::array< real, nstate > &primitive_soln) const
Convert primitive solution to conservative solution.
std::array< real, nstate > physical_source_term(const dealii::Point< dim, real > &pos, 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
Physical source term.
dealii::ConditionalOStream pcout
ConditionalOStream.
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.
const bool has_nonzero_diffusion
Flag to signal that diffusion term is non-zero.
Definition: physics.h:59
virtual std::array< real, nstate > dissipative_flux_dot_normal(const std::array< real, nstate > &solution, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const std::array< real, nstate > &filtered_solution, const std::array< dealii::Tensor< 1, dim, real >, nstate > &filtered_solution_gradient, const bool on_boundary, const dealii::types::global_dof_index cell_index, const dealii::Tensor< 1, dim, real > &normal, const int boundary_type) override
Dissipative (i.e. viscous) flux: dot normal vector.
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Definition: physics.h:34
Manufactured solution used for grid studies to check convergence orders.
Physics Model equations. Derived from PhysicsBase, holds a baseline physics and model terms and equat...
Definition: physics_model.h:14
std::shared_ptr< PhysicsBase< dim, nspecies, nstate_baseline_physics, real > > physics_baseline
Baseline physics object with nstate==nstate_baseline_physics.
Definition: physics_model.h:40
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const
Maximum convective eigenvalue.
PartialDifferentialEquation
Possible Partial Differential Equations to solve.
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)
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
std::array< real, nstate > convective_eigenvalues(const std::array< real, nstate > &, const dealii::Tensor< 1, dim, real > &) const
std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function
Manufactured solution function.
Definition: physics.h:71
Physics model additional terms and equations to the baseline physics.
Definition: model.h:18
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_flux(const std::array< real, nstate > &conservative_soln) const
Convective flux: .
Main parameter class that contains the various other sub-parameter classes.
real max_viscous_eigenvalue(const std::array< real, nstate > &soln) const
Maximum viscous eigenvalue.
void boundary_face_values_viscous_flux(const int boundary_type, const dealii::Point< dim, real > &pos, const dealii::Tensor< 1, dim, real > &normal, const std::array< real, nstate > &soln_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_int, const std::array< real, nstate > &, const std::array< dealii::Tensor< 1, dim, real >, nstate > &, std::array< real, nstate > &soln_bc, std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_bc) const override
Boundary face values for viscous fluxes.
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
Convective Numerical Split Flux for split form.
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
std::array< real, nstate > compute_entropy_variables(const std::array< real, nstate > &conservative_soln) const
Computes the entropy variables.
std::vector< std::string > post_get_names() const
Returns names of the solution to be used by PhysicsPostprocessor to output current solution...
const int mpi_rank
MPI rank.
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 that does not require differentiation.
std::shared_ptr< ModelBase< dim, nspecies, nstate, real > > model
Model object.
Definition: physics_model.h:43
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
Returns current vector solution to be used by PhysicsPostprocessor to output current solution...
dealii::UpdateFlags post_get_needed_update_flags() const
Returns required update flags of the solution to be used by PhysicsPostprocessor to output current so...
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
Evaluates boundary values and gradients on the other side of the face.
virtual std::array< dealii::Tensor< 1, dim, real >, nstate > dissipative_flux(const std::array< real, nstate > &solution, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const std::array< real, nstate > &filtered_solution, const std::array< dealii::Tensor< 1, dim, real >, nstate > &filtered_solution_gradient, const dealii::types::global_dof_index cell_index) override
Dissipative (i.e. viscous) flux: .
std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > post_get_data_component_interpretation() const
Returns DataComponentInterpretation of the solution to be used by PhysicsPostprocessor to output curr...
const MPI_Comm mpi_communicator
MPI communicator.
const int n_model_equations
Number of model equations (i.e. those additional to the baseline physics)
Definition: physics_model.h:37
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
PhysicsModel(const Parameters::AllParameters *const parameters_input, Parameters::AllParameters::PartialDifferentialEquation baseline_physics_type, std::shared_ptr< ModelBase< dim, nspecies, nstate, real > > model_input, std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function, const bool has_nonzero_diffusion, const bool has_nonzero_physical_source)
Constructor.
std::array< real, nstate > convert_conservative_to_primitive(const std::array< real, nstate > &conservative_soln) const
Convert conservative variables to primitive variables.