[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
physics.h
1 #ifndef __PHYSICS__
2 #define __PHYSICS__
3 
4 #include <deal.II/base/tensor.h>
5 #include <deal.II/numerics/data_component_interpretation.h>
6 #include <deal.II/fe/fe_update_flags.h>
7 #include <deal.II/base/types.h>
8 #include <deal.II/base/conditional_ostream.h>
9 
10 #include "parameters/all_parameters.h"
11 #include "parameters/parameters_manufactured_solution.h"
12 #include "physics/manufactured_solution.h"
13 
14 
15 namespace PHiLiP {
16 namespace Physics {
17 
19 
33 template <int dim, int nspecies, int nstate, typename real>
35 {
36 public:
37 
39 
42  const Parameters::AllParameters *const parameters_input,
43  const bool has_nonzero_diffusion_input,
44  const bool has_nonzero_physical_source_input,
45  const dealii::Tensor<2,3,double> input_diffusion_tensor = Parameters::ManufacturedSolutionParam::get_default_diffusion_tensor(),
46  std::shared_ptr< ManufacturedSolutionFunction<dim,nspecies,real> > manufactured_solution_function_input = nullptr);
47 
50  const Parameters::AllParameters *const parameters_input,
51  const bool has_nonzero_diffusion_input,
52  const bool has_nonzero_physical_source_input,
53  std::shared_ptr< ManufacturedSolutionFunction<dim,nspecies,real> > manufactured_solution_function_input = nullptr);
54 
56  virtual ~PhysicsBase() = default;
57 
60 
63 
66 
68  const NonPhysicalBehaviorEnum non_physical_behavior_type;
69 
71  std::shared_ptr< ManufacturedSolutionFunction<dim,nspecies,real> > manufactured_solution_function;
72 
74  virtual std::array<real,nstate> convert_conservative_to_primitive ( const std::array<real,nstate> &conservative_soln ) const = 0;
75 
77  virtual std::array<real,nstate> convert_primitive_to_conservative ( const std::array<real,nstate> &primitive_soln ) const = 0;
78 
80  virtual real compute_pressure ( const std::array<real,nstate> &conservative_soln ) const;
81 
83  virtual real compute_entropy ( const std::array<real,nstate> &conservative_soln ) const;
84 
86  virtual real compute_gamma ( const std::array<real,nstate> &conservative_soln ) const;
87 
89  virtual std::array<real,nstate> compute_kinetic_energy_variables ( const std::array<real,nstate> &conservative_soln ) const;
90 
92  virtual std::array<dealii::Tensor<1,dim,real>,nstate>
94  const std::array<real,nstate> &conservative_soln,
95  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const = 0;
96 
98  virtual std::array<dealii::Tensor<1,dim,real>,nstate>
100  const std::array<real,nstate> &primitive_soln,
101  const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient) const = 0;
102 
104  virtual std::array<dealii::Tensor<1,dim,real>,nstate> convective_flux (
105  const std::array<real,nstate> &solution) const = 0;
106 
108  virtual std::array<dealii::Tensor<1,dim,real>,nstate> convective_numerical_split_flux (
109  const std::array<real,nstate> &conservative_soln1,
110  const std::array<real,nstate> &conservative_soln2) const;
111 
113  virtual std::array<real,nstate> compute_entropy_variables (
114  const std::array<real,nstate> &conservative_soln) const = 0;
115 
117  virtual std::array<real,nstate> compute_conservative_variables_from_entropy_variables (
118  const std::array<real,nstate> &entropy_var) const = 0;
119 
121 
123  virtual std::array<real,nstate> convective_eigenvalues (
124  const std::array<real,nstate> &/*solution*/,
125  const dealii::Tensor<1,dim,real> &/*normal*/) const = 0;
126 
128  virtual real max_convective_eigenvalue (const std::array<real,nstate> &soln) const = 0;
129 
131  virtual real max_convective_normal_eigenvalue (
132  const std::array<real,nstate> &soln,
133  const dealii::Tensor<1,dim,real> &normal) const;
134 
136  virtual real max_viscous_eigenvalue (const std::array<real,nstate> &soln) const = 0;
137 
138  // /// Evaluate the diffusion matrix \f$ A \f$ such that \f$F_v = A \nabla u\f$.
139  // virtual std::array<dealii::Tensor<1,dim,real>,nstate> apply_diffusion_matrix (
140  // const std::array<real,nstate> &solution,
141  // const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_grad) const = 0;
142 
144  virtual std::array<real,nstate> dissipative_flux_dot_normal (
145  const std::array<real,nstate> &solution,
146  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
147  const std::array<real,nstate> &filtered_solution,
148  const std::array<dealii::Tensor<1,dim,real>,nstate> &filtered_solution_gradient,
149  const bool on_boundary,
150  const dealii::types::global_dof_index cell_index,
151  const dealii::Tensor<1,dim,real> &normal,
152  const int boundary_type);
153 
155  virtual std::array<dealii::Tensor<1,dim,real>,nstate> dissipative_flux (
156  const std::array<real,nstate> &solution,
157  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
158  const std::array<real,nstate> &filtered_solution,
159  const std::array<dealii::Tensor<1,dim,real>,nstate> &filtered_solution_gradient,
160  const dealii::types::global_dof_index cell_index);
161 
163  virtual std::array<dealii::Tensor<1,dim,real>,nstate> dissipative_flux (
164  const std::array<real,nstate> &solution,
165  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
166  const dealii::types::global_dof_index cell_index) const = 0;
167 
169 
170 /* virtual std::array<dealii::Tensor<1,dim,real>,nstate> artificial_dissipative_flux (
171  const real viscosity_coefficient,
172  const std::array<real,nstate> &solution,
173  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient) const;
174 */
176  virtual std::array<real,nstate> source_term (
177  const dealii::Point<dim,real> &pos,
178  const std::array<real,nstate> &solution,
179  const real current_time,
180  const dealii::types::global_dof_index cell_index) const = 0;
181 
183  virtual std::array<real,nstate> physical_source_term (
184  const dealii::Point<dim,real> &pos,
185  const std::array<real,nstate> &solution,
186  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
187  const dealii::types::global_dof_index cell_index) const;
188 
190  virtual std::array<real,nstate> artificial_source_term (
191  const real viscosity_coefficient,
192  const dealii::Point<dim,real> &pos,
193  const std::array<real,nstate> &solution) const;
194 
196  virtual void boundary_face_values (
197  const int /*boundary_type*/,
198  const dealii::Point<dim, real> &/*pos*/,
199  const dealii::Tensor<1,dim,real> &/*normal*/,
200  const std::array<real,nstate> &/*soln_int*/,
201  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_int*/,
202  const std::array<real,nstate> &/*filtered_soln_int*/,
203  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*filtered_soln_grad_int*/,
204  std::array<real,nstate> &/*soln_bc*/,
205  std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_bc*/) const;
206 
208  virtual void boundary_face_values_viscous_flux (
209  const int /*boundary_type*/,
210  const dealii::Point<dim, real> &/*pos*/,
211  const dealii::Tensor<1,dim,real> &/*normal*/,
212  const std::array<real,nstate> &/*soln_int*/,
213  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_int*/,
214  const std::array<real,nstate> &/*filtered_soln_int*/,
215  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*filtered_soln_grad_int*/,
216  std::array<real,nstate> &/*soln_bc*/,
217  std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_bc*/) const;
218 
220  virtual void boundary_face_values (
221  const int /*boundary_type*/,
222  const dealii::Point<dim, real> &/*pos*/,
223  const dealii::Tensor<1,dim,real> &/*normal*/,
224  const std::array<real,nstate> &/*soln_int*/,
225  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_int*/,
226  std::array<real,nstate> &/*soln_bc*/,
227  std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_bc*/) const = 0;
228 
230 
232  virtual dealii::Vector<double> post_compute_derived_quantities_vector (
233  const dealii::Vector<double> &uh,
234  const std::vector<dealii::Tensor<1,dim> > &/*duh*/,
235  const std::vector<dealii::Tensor<2,dim> > &/*dduh*/,
236  const dealii::Tensor<1,dim> &/*normals*/,
237  const dealii::Point<dim> &/*evaluation_points*/) const;
238 
240 
242  virtual dealii::Vector<double> post_compute_derived_quantities_scalar (
243  const double &uh,
244  const dealii::Tensor<1,dim> &/*duh*/,
245  const dealii::Tensor<2,dim> &/*dduh*/,
246  const dealii::Tensor<1,dim> &/*normals*/,
247  const dealii::Point<dim> &/*evaluation_points*/) const;
248 
250 
252  virtual std::vector<std::string> post_get_names () const;
253 
255 
257  virtual std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation> post_get_data_component_interpretation () const;
258 
260 
262  virtual dealii::UpdateFlags post_get_needed_update_flags () const;
263 
265 
272  template<typename real2>
273  real2 handle_non_physical_result (const std::string message = "") const;
274 
275 public:
276 
278 
279  const double BIG_NUMBER = 1e100;
280 
281 protected:
283 
285  dealii::ConditionalOStream pcout;
286 
288 
291  dealii::Tensor<2,dim,double> diffusion_tensor;
292 };
293 } // Physics namespace
294 } // PHiLiP namespace
295 
296 #endif
const Parameters::AllParameters *const all_parameters
Pointer to parameters object.
Definition: physics.h:65
virtual std::array< real, nstate > physical_source_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &solution, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const dealii::types::global_dof_index cell_index) const
Physical source term that does require differentiation.
Definition: physics.cpp:252
real2 handle_non_physical_result(const std::string message="") const
Function to handle nonphysical results.
Definition: physics.cpp:329
const bool has_nonzero_diffusion
Flag to signal that diffusion term is non-zero.
Definition: physics.h:59
virtual dealii::Vector< double > post_compute_derived_quantities_scalar(const double &uh, const dealii::Tensor< 1, dim > &, const dealii::Tensor< 2, dim > &, const dealii::Tensor< 1, dim > &, const dealii::Point< dim > &) const
Returns current scalar solution to be used by PhysicsPostprocessor to output current solution...
Definition: physics.cpp:281
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)
Dissipative fluxes dot normal vector.
Definition: physics.cpp:105
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.
virtual std::array< dealii::Tensor< 1, dim, real >, nstate > convective_flux(const std::array< real, nstate > &solution) const =0
Convective fluxes that will be differentiated once in space.
virtual real compute_pressure(const std::array< real, nstate > &conservative_soln) const
Compute pressure from conservative solution.
Definition: physics.cpp:168
virtual dealii::Vector< double > post_compute_derived_quantities_vector(const dealii::Vector< double > &uh, const std::vector< dealii::Tensor< 1, dim > > &, const std::vector< dealii::Tensor< 2, dim > > &, const dealii::Tensor< 1, dim > &, const dealii::Point< dim > &) const
Returns current vector solution to be used by PhysicsPostprocessor to output current solution...
Definition: physics.cpp:266
PhysicsBase(const Parameters::AllParameters *const parameters_input, const bool has_nonzero_diffusion_input, const bool has_nonzero_physical_source_input, const dealii::Tensor< 2, 3, double > input_diffusion_tensor=Parameters::ManufacturedSolutionParam::get_default_diffusion_tensor(), std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function_input=nullptr)
Default constructor that will set the constants.
Definition: physics.cpp:17
Files for the baseline physics.
Definition: ADTypes.hpp:10
virtual std::array< real, nstate > convective_eigenvalues(const std::array< real, nstate > &, const dealii::Tensor< 1, dim, real > &) const =0
Spectral radius of convective term Jacobian.
const bool has_nonzero_physical_source
Flag to signal that physical source term is non-zero.
Definition: physics.h:62
virtual std::array< real, nstate > compute_kinetic_energy_variables(const std::array< real, nstate > &conservative_soln) const
Compute kinetic energy variables from conservative solution.
Definition: physics.cpp:195
virtual real compute_entropy(const std::array< real, nstate > &conservative_soln) const
Compute entropy from conservative solution.
Definition: physics.cpp:177
virtual 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 =0
Artificial dissipative fluxes that will be differentiated ONCE in space.
std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function
Manufactured solution function.
Definition: physics.h:71
Main parameter class that contains the various other sub-parameter classes.
virtual 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 =0
const double BIG_NUMBER
BIG_NUMBER which is returned in place of NaN according to handle_non_physical_result() ...
Definition: physics.h:279
NonPhysicalBehaviorEnum
Enum of nonphysical behavior.
virtual std::array< real, nstate > convert_conservative_to_primitive(const std::array< real, nstate > &conservative_soln) const =0
Convert conservative variables to primitive variables.
virtual std::array< real, nstate > compute_entropy_variables(const std::array< real, nstate > &conservative_soln) const =0
Computes the entropy variables.
static dealii::Tensor< 2, 3, double > get_default_diffusion_tensor()
gets the default diffusion tensor
virtual void boundary_face_values_viscous_flux(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 > &, 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 for the viscous flux...
Definition: physics.cpp:230
virtual real compute_gamma(const std::array< real, nstate > &conservative_soln) const
Compute gamma from conservative solution.
Definition: physics.cpp:186
virtual real max_convective_eigenvalue(const std::array< real, nstate > &soln) const =0
Maximum convective eigenvalue.
const NonPhysicalBehaviorEnum non_physical_behavior_type
Determines type of nonphysical behavior.
Definition: physics.h:68
virtual dealii::UpdateFlags post_get_needed_update_flags() const
Returns required update flags of the solution to be used by PhysicsPostprocessor to output current so...
Definition: physics.cpp:321
virtual std::array< real, nstate > compute_conservative_variables_from_entropy_variables(const std::array< real, nstate > &entropy_var) const =0
Computes the conservative variables from the entropy variables.
virtual 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 =0
virtual 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 > &, 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 for the convective flux...
Definition: physics.cpp:208
virtual std::array< real, nstate > artificial_source_term(const real viscosity_coefficient, const dealii::Point< dim, real > &pos, const std::array< real, nstate > &solution) const
Artificial source term that does not require differentiation stemming from artificial dissipation...
Definition: physics.cpp:140
dealii::ConditionalOStream pcout
ConditionalOStream.
Definition: physics.h:285
virtual std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > post_get_data_component_interpretation() const
Returns DataComponentInterpretation of the solution to be used by PhysicsPostprocessor to output curr...
Definition: physics.cpp:309
virtual std::array< real, nstate > convert_primitive_to_conservative(const std::array< real, nstate > &primitive_soln) const =0
Convert primitive solution to conservative solution.
virtual 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)
Definition: physics.cpp:78
virtual ~PhysicsBase()=default
Virtual destructor required for abstract classes.
virtual std::vector< std::string > post_get_names() const
Returns names of the solution to be used by PhysicsPostprocessor to output current solution...
Definition: physics.cpp:297
dealii::Tensor< 2, dim, double > diffusion_tensor
Anisotropic diffusion matrix.
Definition: physics.h:291
virtual 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.
Definition: physics.cpp:66
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)
Dissipative fluxes that will be differentiated ONCE in space.
Definition: physics.cpp:128
virtual real max_viscous_eigenvalue(const std::array< real, nstate > &soln) const =0
Maximum viscous eigenvalue.