[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
artificial_dissipation.h
1 #ifndef _ARTIFICIALDISSIPATION_
2 #define _ARTIFICIALDISSIPATION_
3 
4 #include "physics/physics.h"
5 #include "physics/convection_diffusion.h"
6 #include "physics/navier_stokes.h"
7 #include "parameters/all_parameters.h"
8 #include "parameters/parameters_manufactured_solution.h"
9 #include "ADTypes.hpp"
10 
11 namespace PHiLiP{
12 
14 
15 template <int dim, int nstate>
17 {
18  public:
20  dealii::Tensor<2,3,double> diffusion_tensor;
21 
23  virtual std::array<dealii::Tensor<1,dim,double>,nstate> calc_artificial_dissipation_flux(
24  const std::array<double,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,double>,nstate> &solution_gradient, double artificial_viscosity)=0;
25 
27  virtual std::array<dealii::Tensor<1,dim,FadType>,nstate> calc_artificial_dissipation_flux(
28  const std::array<FadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadType>,nstate> &solution_gradient, FadType artificial_viscosity)=0;
29 
31  virtual std::array<dealii::Tensor<1,dim,RadType>,nstate> calc_artificial_dissipation_flux(
32  const std::array<RadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadType>,nstate> &solution_gradient, RadType artificial_viscosity)=0;
33 
35  virtual std::array<dealii::Tensor<1,dim,FadFadType>,nstate> calc_artificial_dissipation_flux(
36  const std::array<FadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &solution_gradient, FadFadType artificial_viscosity)=0;
37 
39  virtual std::array<dealii::Tensor<1,dim,RadFadType>,nstate> calc_artificial_dissipation_flux(
40  const std::array<RadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadFadType>,nstate> &solution_gradient, RadFadType artificial_viscosity)=0;
41 
44  {
45  for(int i=0; i<3; i++)
46  {
47  diffusion_tensor[i][i] = 1.0;
48  }
49  }
50 
52  virtual ~ArtificialDissipationBase() = default;
53 
54 };
55 
56 
57 
59 template <int dim, int nstate>
61 {
64 
67 
70 
73 
76 
77 
78  template <typename real2>
80  std::array<dealii::Tensor<1,dim,real2>,nstate> calc_artificial_dissipation_flux_laplacian(
81  const std::array<real2,nstate> &conservative_soln,
82  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
83  const real2 artificial_viscosity,
84  const Physics::ConvectionDiffusion<dim,nstate,real2> &convection_diffusion);
85 
86  public:
88  explicit LaplacianArtificialDissipation(const Parameters::AllParameters *const parameters_input):
89  convection_diffusion_double(parameters_input,false,true,this->diffusion_tensor,Parameters::ManufacturedSolutionParam::get_default_advection_vector(),1.0),
90  convection_diffusion_FadType(parameters_input,false,true,this->diffusion_tensor,Parameters::ManufacturedSolutionParam::get_default_advection_vector(),1.0),
91  convection_diffusion_RadType(parameters_input,false,true,this->diffusion_tensor,Parameters::ManufacturedSolutionParam::get_default_advection_vector(),1.0),
92  convection_diffusion_FadFadType(parameters_input,false,true,this->diffusion_tensor,Parameters::ManufacturedSolutionParam::get_default_advection_vector(),1.0),
93  convection_diffusion_RadFadType(parameters_input,false,true,this->diffusion_tensor,Parameters::ManufacturedSolutionParam::get_default_advection_vector(),1.0)
94  {}
95 
97  std::array<dealii::Tensor<1,dim,double>,nstate> calc_artificial_dissipation_flux(
98  const std::array<double,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,double>,nstate> &solution_gradient, double artificial_viscosity) override;
99 
101  std::array<dealii::Tensor<1,dim,FadType>,nstate> calc_artificial_dissipation_flux(
102  const std::array<FadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadType>,nstate> &solution_gradient, FadType artificial_viscosity) override;
103 
105  std::array<dealii::Tensor<1,dim,RadType>,nstate> calc_artificial_dissipation_flux(
106  const std::array<RadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadType>,nstate> &solution_gradient, RadType artificial_viscosity) override;
107 
109  std::array<dealii::Tensor<1,dim,FadFadType>,nstate> calc_artificial_dissipation_flux(
110  const std::array<FadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &solution_gradient, FadFadType artificial_viscosity) override;
111 
113  std::array<dealii::Tensor<1,dim,RadFadType>,nstate> calc_artificial_dissipation_flux(
114  const std::array<RadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadFadType>,nstate> &solution_gradient, RadFadType artificial_viscosity) override;
115 
116 };
117 
118 
120 template <int dim, int nstate>
122 {
123 
126 
129 
132 
135 
138 
139  template <typename real2>
141  std::array<dealii::Tensor<1,dim,real2>,nstate> calc_artificial_dissipation_flux_physical(
142  const std::array<real2,nstate> &conservative_soln,
143  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
144  const real2 artificial_viscosity,
145  const Physics::NavierStokes<dim,nstate,real2> &navier_stokes);
146 
147  public:
149  explicit PhysicalArtificialDissipation(const Parameters::AllParameters *const parameters_input): //input_parameters(parameters_input) {}
150  navier_stokes_double(
151  parameters_input,
152  parameters_input->euler_param.ref_length,
153  parameters_input->euler_param.gamma_gas,
154  parameters_input->euler_param.mach_inf,
155  parameters_input->euler_param.angle_of_attack,
156  parameters_input->euler_param.side_slip_angle,
157  0.75,
158  1.0,
159  parameters_input->navier_stokes_param.use_constant_viscosity,
160  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
161  parameters_input->navier_stokes_param.temperature_inf),
162  navier_stokes_FadType(
163  parameters_input,
164  parameters_input->euler_param.ref_length,
165  parameters_input->euler_param.gamma_gas,
166  parameters_input->euler_param.mach_inf,
167  parameters_input->euler_param.angle_of_attack,
168  parameters_input->euler_param.side_slip_angle,
169  0.75,
170  1.0,
171  parameters_input->navier_stokes_param.use_constant_viscosity,
172  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
173  parameters_input->navier_stokes_param.temperature_inf),
174  navier_stokes_RadType(
175  parameters_input,
176  parameters_input->euler_param.ref_length,
177  parameters_input->euler_param.gamma_gas,
178  parameters_input->euler_param.mach_inf,
179  parameters_input->euler_param.angle_of_attack,
180  parameters_input->euler_param.side_slip_angle,
181  0.75,
182  1.0,
183  parameters_input->navier_stokes_param.use_constant_viscosity,
184  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
185  parameters_input->navier_stokes_param.temperature_inf),
186  navier_stokes_FadFadType(
187  parameters_input,
188  parameters_input->euler_param.ref_length,
189  parameters_input->euler_param.gamma_gas,
190  parameters_input->euler_param.mach_inf,
191  parameters_input->euler_param.angle_of_attack,
192  parameters_input->euler_param.side_slip_angle,
193  0.75,
194  1.0,
195  parameters_input->navier_stokes_param.use_constant_viscosity,
196  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
197  parameters_input->navier_stokes_param.temperature_inf),
198  navier_stokes_RadFadType(
199  parameters_input,
200  parameters_input->euler_param.ref_length,
201  parameters_input->euler_param.gamma_gas,
202  parameters_input->euler_param.mach_inf,
203  parameters_input->euler_param.angle_of_attack,
204  parameters_input->euler_param.side_slip_angle,
205  0.75,
206  1.0,
207  parameters_input->navier_stokes_param.use_constant_viscosity,
208  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
209  parameters_input->navier_stokes_param.temperature_inf)
210  {}
211 
213  std::array<dealii::Tensor<1,dim,double>,nstate> calc_artificial_dissipation_flux(
214  const std::array<double,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,double>,nstate> &solution_gradient, double artificial_viscosity) override;
215 
217  std::array<dealii::Tensor<1,dim,FadType>,nstate> calc_artificial_dissipation_flux(
218  const std::array<FadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadType>,nstate> &solution_gradient, FadType artificial_viscosity) override;
219 
221  std::array<dealii::Tensor<1,dim,RadType>,nstate> calc_artificial_dissipation_flux(
222  const std::array<RadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadType>,nstate> &solution_gradient, RadType artificial_viscosity) override;
223 
225  std::array<dealii::Tensor<1,dim,FadFadType>,nstate> calc_artificial_dissipation_flux(
226  const std::array<FadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &solution_gradient, FadFadType artificial_viscosity) override;
227 
229  std::array<dealii::Tensor<1,dim,RadFadType>,nstate> calc_artificial_dissipation_flux(
230  const std::array<RadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadFadType>,nstate> &solution_gradient, RadFadType artificial_viscosity) override;
231 
232 
233 };
234 
235 
236 
238 template <int dim, int nstate>
240 {
241 
244 
247 
250 
253 
256 
257  template <typename real2>
259  std::array<dealii::Tensor<1,dim,real2>,nstate> calc_artificial_dissipation_flux_enthalpy_conserving_laplacian(
260  const std::array<real2,nstate> &conservative_soln,
261  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
262  real2 artificial_viscosity,
263  const Physics::NavierStokes<dim,nstate,real2> &navier_stokes);
264 
265  public:
267  explicit EnthalpyConservingArtificialDissipation(const Parameters::AllParameters *const parameters_input): //input_parameters(parameters_input) {}
268  navier_stokes_double(
269  parameters_input,
270  parameters_input->euler_param.ref_length,
271  parameters_input->euler_param.gamma_gas,
272  parameters_input->euler_param.mach_inf,
273  parameters_input->euler_param.angle_of_attack,
274  parameters_input->euler_param.side_slip_angle,
275  0.75,
276  1.0,
277  parameters_input->navier_stokes_param.use_constant_viscosity,
278  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
279  parameters_input->navier_stokes_param.temperature_inf),
280  navier_stokes_FadType(
281  parameters_input,
282  parameters_input->euler_param.ref_length,
283  parameters_input->euler_param.gamma_gas,
284  parameters_input->euler_param.mach_inf,
285  parameters_input->euler_param.angle_of_attack,
286  parameters_input->euler_param.side_slip_angle,
287  0.75,
288  1.0,
289  parameters_input->navier_stokes_param.use_constant_viscosity,
290  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
291  parameters_input->navier_stokes_param.temperature_inf),
292  navier_stokes_RadType(
293  parameters_input,
294  parameters_input->euler_param.ref_length,
295  parameters_input->euler_param.gamma_gas,
296  parameters_input->euler_param.mach_inf,
297  parameters_input->euler_param.angle_of_attack,
298  parameters_input->euler_param.side_slip_angle,
299  0.75,
300  1.0,
301  parameters_input->navier_stokes_param.use_constant_viscosity,
302  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
303  parameters_input->navier_stokes_param.temperature_inf),
304  navier_stokes_FadFadType(
305  parameters_input,
306  parameters_input->euler_param.ref_length,
307  parameters_input->euler_param.gamma_gas,
308  parameters_input->euler_param.mach_inf,
309  parameters_input->euler_param.angle_of_attack,
310  parameters_input->euler_param.side_slip_angle,
311  0.75,
312  1.0,
313  parameters_input->navier_stokes_param.use_constant_viscosity,
314  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
315  parameters_input->navier_stokes_param.temperature_inf),
316  navier_stokes_RadFadType(
317  parameters_input,
318  parameters_input->euler_param.ref_length,
319  parameters_input->euler_param.gamma_gas,
320  parameters_input->euler_param.mach_inf,
321  parameters_input->euler_param.angle_of_attack,
322  parameters_input->euler_param.side_slip_angle,
323  0.75,
324  1.0,
325  parameters_input->navier_stokes_param.use_constant_viscosity,
326  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
327  parameters_input->navier_stokes_param.temperature_inf)
328  {}
329 
331  std::array<dealii::Tensor<1,dim,double>,nstate> calc_artificial_dissipation_flux(
332  const std::array<double,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,double>,nstate> &solution_gradient, double artificial_viscosity) override;
333 
335  std::array<dealii::Tensor<1,dim,FadType>,nstate> calc_artificial_dissipation_flux(
336  const std::array<FadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadType>,nstate> &solution_gradient, FadType artificial_viscosity) override;
337 
339  std::array<dealii::Tensor<1,dim,RadType>,nstate> calc_artificial_dissipation_flux(
340  const std::array<RadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadType>,nstate> &solution_gradient, RadType artificial_viscosity) override;
341 
343  std::array<dealii::Tensor<1,dim,FadFadType>,nstate> calc_artificial_dissipation_flux(
344  const std::array<FadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &solution_gradient, FadFadType artificial_viscosity) override;
345 
347  std::array<dealii::Tensor<1,dim,RadFadType>,nstate> calc_artificial_dissipation_flux(
348  const std::array<RadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadFadType>,nstate> &solution_gradient, RadFadType artificial_viscosity) override;
349 
350 };
351 } // namespace PHILIP
352 
353 #endif
Physics::NavierStokes< dim, nstate, FadType > navier_stokes_FadType
NavierStokes object of type FadType.
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Definition: ADTypes.hpp:12
PhysicalArtificialDissipation(const Parameters::AllParameters *const parameters_input)
Constructor of PhysicalArtificialDissipation.
ArtificialDissipationBase()
Constructor of ArtificialDissipationBase.
Sacado::Fad::DFad< double > FadType
Sacado AD type for first derivatives.
Definition: ADTypes.hpp:11
codi_JacobianComputationType RadType
CoDiPaco reverse-AD type for first derivatives.
Definition: ADTypes.hpp:27
Physics::NavierStokes< dim, nstate, double > navier_stokes_double
NavierStokes object of type double.
Files for the baseline physics.
Definition: ADTypes.hpp:10
Physics::NavierStokes< dim, nstate, RadFadType > navier_stokes_RadFadType
NavierStokes object of type RadFadType.
Physics::NavierStokes< dim, nstate, FadFadType > navier_stokes_FadFadType
NavierStokes object of type FadFadType.
virtual ~ArtificialDissipationBase()=default
Virtual destructor of ArtificialDissipationBase.
Physics::NavierStokes< dim, nstate, FadFadType > navier_stokes_FadFadType
NavierStokes object of type FadFadType.
Main parameter class that contains the various other sub-parameter classes.
Physics::ConvectionDiffusion< dim, nstate, RadType > convection_diffusion_RadType
ConvectionDiffusion object of type RadType.
LaplacianArtificialDissipation(const Parameters::AllParameters *const parameters_input)
Constructor of LaplacianArtificialDissipation.
Physics::ConvectionDiffusion< dim, nstate, FadFadType > convection_diffusion_FadFadType
ConvectionDiffusion object of type FadFadType.
Physics::ConvectionDiffusion< dim, nstate, RadFadType > convection_diffusion_RadFadType
ConvectionDiffusion object of type RadFadType.
Physics::ConvectionDiffusion< dim, nstate, FadType > convection_diffusion_FadType
ConvectionDiffusion object of type FadType.
Physics::NavierStokes< dim, nstate, RadType > navier_stokes_RadType
NavierStokes object of type RadType.
Adds enthalpy laplacian artificial dissipation (from G.E. Barter and D.L. Darmofal, 2009).
virtual std::array< dealii::Tensor< 1, dim, double >, nstate > calc_artificial_dissipation_flux(const std::array< double, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, double >, nstate > &solution_gradient, double artificial_viscosity)=0
Virtual fuction overloaded with type double.
Adds Laplacian artificial dissipation (from Persson and Peraire, 2008).
Class to add artificial dissipation with an option to add one of the 3 dissipation types: 1...
EnthalpyConservingArtificialDissipation(const Parameters::AllParameters *const parameters_input)
Constructor of EnthalpyConservingArtificialDissipation.
Physics::NavierStokes< dim, nstate, double > navier_stokes_double
NavierStokes object of type double.
codi_HessianComputationType RadFadType
Nested reverse-forward mode type for Jacobian and Hessian computation using TapeHelper.
Definition: ADTypes.hpp:28
Physics::NavierStokes< dim, nstate, FadType > navier_stokes_FadType
NavierStokes object of type FadType.
Adds Physical artificial dissipation (from Persson and Peraire, 2008).
Physics::NavierStokes< dim, nstate, RadFadType > navier_stokes_RadFadType
NavierStokes object of type RadFadType.
Physics::NavierStokes< dim, nstate, RadType > navier_stokes_RadType
NavierStokes object of type RadType.
Physics::ConvectionDiffusion< dim, nstate, double > convection_diffusion_double
ConvectionDiffusion object of type double.
dealii::Tensor< 2, 3, double > diffusion_tensor
Identity diffusion tensor for Laplace artificial dissipation.