[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.cpp
1 #include <boost/preprocessor/seq/for_each.hpp>
2 #include "artificial_dissipation.h"
3 
4 namespace PHiLiP
5 {
6 
7 //=====================================================
8 // LAPLACIAN DISSIPATION FUNCTIONS
9 //=====================================================
10 
11 template <int dim, int nspecies, int nstate>
12 template <typename real2>
14  const std::array<real2,nstate> &conservative_soln,
15  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
16  const real2 artificial_viscosity,
18 {
19 
20  std::array<dealii::Tensor<1,dim,real2>,nstate> flux_laplacian = convection_diffusion.dissipative_flux(conservative_soln, solution_gradient);
21 
22  for(int i=0;i<nstate;i++)
23  {
24  for(int j=0;j<dim;j++)
25  {
26  flux_laplacian[i][j]*=artificial_viscosity;
27  }
28  }
29  return flux_laplacian;
30 }
31 
32 template <int dim, int nspecies, int nstate> // double
34 const std::array<double,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,double>,nstate> &solution_gradient, double artificial_viscosity)
35 {
36  return calc_artificial_dissipation_flux_laplacian<double>(conservative_soln, solution_gradient, artificial_viscosity, convection_diffusion_double);
37 }
38 
39 template <int dim, int nspecies, int nstate> // FadType
41 const std::array<FadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadType>,nstate> &solution_gradient, FadType artificial_viscosity)
42 {
43  return calc_artificial_dissipation_flux_laplacian<FadType>(conservative_soln, solution_gradient, artificial_viscosity, convection_diffusion_FadType);
44 }
45 
46 template <int dim, int nspecies, int nstate> // RadType
48 const std::array<RadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadType>,nstate> &solution_gradient, RadType artificial_viscosity)
49 {
50  return calc_artificial_dissipation_flux_laplacian<RadType>(conservative_soln, solution_gradient, artificial_viscosity, convection_diffusion_RadType);
51 }
52 
53 template <int dim, int nspecies, int nstate> // FadFadType
55 const std::array<FadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &solution_gradient, FadFadType artificial_viscosity)
56 {
57  return calc_artificial_dissipation_flux_laplacian<FadFadType>(conservative_soln, solution_gradient, artificial_viscosity, convection_diffusion_FadFadType);
58 }
59 
60 template <int dim, int nspecies, int nstate> // RadFadType
62 const std::array<RadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadFadType>,nstate> &solution_gradient, RadFadType artificial_viscosity)
63 {
64  return calc_artificial_dissipation_flux_laplacian<RadFadType>(conservative_soln, solution_gradient, artificial_viscosity, convection_diffusion_RadFadType);
65 }
66 
67 
68 
69 //===========================================
70 // PHYSICAL DISSIPATION FUNCTIONS
71 //===========================================
72 
73 template <int dim, int nspecies, int nstate>
74 template <typename real2>
76  const std::array<real2,nstate> &conservative_soln,
77  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
78  const real2 artificial_viscosity,
80 {
81  std::array<dealii::Tensor<1,dim,real2>,nstate> flux_navier_stokes = navier_stokes.dissipative_flux(conservative_soln, solution_gradient);
82 
83  for(int i=0;i<nstate;i++)
84  {
85  for(int j=0;j<dim;j++)
86  {
87  flux_navier_stokes[i][j]*=artificial_viscosity;
88  }
89  }
90  return flux_navier_stokes;
91 }
92 
93 
94 template <int dim, int nspecies, int nstate> // Double
96 const std::array<double,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,double>,nstate> &solution_gradient, double artificial_viscosity)
97 {
98  return calc_artificial_dissipation_flux_physical<double>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_double);
99 }
100 
101 template <int dim, int nspecies, int nstate> // FadType
103 const std::array<FadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadType>,nstate> &solution_gradient, FadType artificial_viscosity)
104 {
105  return calc_artificial_dissipation_flux_physical<FadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_FadType);
106 }
107 
108 template <int dim, int nspecies, int nstate> // RadType
110 const std::array<RadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadType>,nstate> &solution_gradient, RadType artificial_viscosity)
111 {
112  return calc_artificial_dissipation_flux_physical<RadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_RadType);
113 }
114 
115 template <int dim, int nspecies, int nstate> // FadFadType
117 const std::array<FadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &solution_gradient, FadFadType artificial_viscosity)
118 {
119  return calc_artificial_dissipation_flux_physical<FadFadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_FadFadType);
120 }
121 
122 template <int dim, int nspecies, int nstate> // RadFadType
124 const std::array<RadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadFadType>,nstate> &solution_gradient, RadFadType artificial_viscosity)
125 {
126  return calc_artificial_dissipation_flux_physical<RadFadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_RadFadType);
127 }
128 
129 //===========================================
130 // ENTHALPY CONSERVING DISSIPATION FUNCTIONS
131 //===========================================
132 
133 template <int dim, int nspecies, int nstate>
134 template <typename real2>
136  const std::array<real2,nstate> &conservative_soln,
137  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
138  real2 artificial_viscosity,
140 {
141  std::array<dealii::Tensor<1,dim,real2>,nstate> conservative_soln_gradient = solution_gradient;
142  std::array<dealii::Tensor<1,dim,real2>,nstate> primitive_soln_gradient = navier_stokes.convert_conservative_gradient_to_primitive_gradient_templated(conservative_soln,conservative_soln_gradient);
143  std::array<dealii::Tensor<1,dim,real2>,nstate> enthalpy_diss_flux;
144 
145  artificial_viscosity*= navier_stokes.max_convective_eigenvalue(conservative_soln);
146 
147  for (int i=0; i<nstate; i++)
148  {
149  for (int d=0; d<dim; d++)
150  {
151  if(i==nstate-1)
152  {
153  enthalpy_diss_flux[i][d] = -artificial_viscosity*(conservative_soln_gradient[i][d] + primitive_soln_gradient[i][d]);
154  }
155  else
156  {
157  enthalpy_diss_flux[i][d] = -artificial_viscosity*(conservative_soln_gradient[i][d]);
158  }
159  }
160  }
161  return enthalpy_diss_flux;
162 }
163 
164 
165 template <int dim, int nspecies, int nstate> // Double
167 const std::array<double,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,double>,nstate> &solution_gradient, double artificial_viscosity)
168 {
169  return calc_artificial_dissipation_flux_enthalpy_conserving_laplacian<double>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_double);
170 }
171 
172 template <int dim, int nspecies, int nstate> // FadType
174 const std::array<FadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadType>,nstate> &solution_gradient, FadType artificial_viscosity)
175 {
176  return calc_artificial_dissipation_flux_enthalpy_conserving_laplacian<FadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_FadType);
177 }
178 
179 template <int dim, int nspecies, int nstate> // RadType
181 const std::array<RadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadType>,nstate> &solution_gradient, RadType artificial_viscosity)
182 {
183  return calc_artificial_dissipation_flux_enthalpy_conserving_laplacian<RadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_RadType);
184 }
185 
186 template <int dim, int nspecies, int nstate> // FadFadType
188 const std::array<FadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &solution_gradient, FadFadType artificial_viscosity)
189 {
190  return calc_artificial_dissipation_flux_enthalpy_conserving_laplacian<FadFadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_FadFadType);
191 }
192 
193 template <int dim, int nspecies, int nstate> // RadFadType
195 const std::array<RadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadFadType>,nstate> &solution_gradient, RadFadType artificial_viscosity)
196 {
197  return calc_artificial_dissipation_flux_enthalpy_conserving_laplacian<RadFadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_RadFadType);
198 }
199 
200 #if PHILIP_SPECIES==1
201  // Define a sequence of possible nstate in the range [1, 6]
202  #define POSSIBLE_NSTATE (1)(2)(3)(4)(5)(6)
203 
204  // Define a macro to instantiate ArtificialDissipation functions for a specific nstate
205  #define INSTANTIATE_ADFunctions(r, data, nstate) \
206  template class ArtificialDissipationBase <PHILIP_DIM, PHILIP_SPECIES, nstate>; \
207  template class LaplacianArtificialDissipation < PHILIP_DIM, PHILIP_SPECIES, nstate>;
208  BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_ADFunctions, _, POSSIBLE_NSTATE)
209 
211 
213 #endif
214 }// PHiLiP namespace
std::array< dealii::Tensor< 1, dim, real2 >, nstate > calc_artificial_dissipation_flux_laplacian(const std::array< real2, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &solution_gradient, const real2 artificial_viscosity, const Physics::ConvectionDiffusion< dim, nspecies, nstate, real2 > &convection_diffusion)
Calculates laplacian flux.
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Definition: ADTypes.hpp:12
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) override
Enthalpy laplacian flux function overloaded with type double.
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const override
Maximum convective eigenvalue.
Definition: euler.cpp:1047
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
Convection-diffusion with linear advective and diffusive term. Derived from PhysicsBase.
Files for the baseline physics.
Definition: ADTypes.hpp:10
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 override
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) override
Physical flux function overloaded with type double.
std::array< dealii::Tensor< 1, dim, real2 >, nstate > calc_artificial_dissipation_flux_physical(const std::array< real2, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &solution_gradient, const real2 artificial_viscosity, const Physics::NavierStokes< dim, nspecies, nstate, real2 > &navier_stokes)
Calculates navier stokes artificial dissipation flux.
std::array< dealii::Tensor< 1, dim, real2 >, nstate > calc_artificial_dissipation_flux_enthalpy_conserving_laplacian(const std::array< real2, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &solution_gradient, real2 artificial_viscosity, const Physics::NavierStokes< dim, nspecies, nstate, real2 > &navier_stokes)
Calculates enthalpy laplacian artificial dissipation flux.
Adds enthalpy laplacian artificial dissipation (from G.E. Barter and D.L. Darmofal, 2009).
std::array< dealii::Tensor< 1, dim, real2 >, nstate > convert_conservative_gradient_to_primitive_gradient_templated(const std::array< real2, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &conservative_soln_gradient) const
Definition: euler.cpp:261
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 dealii::types::global_dof_index cell_index) const
Dissipative flux: u.
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) override
Laplacian flux function overloaded with type double.
codi_HessianComputationType RadFadType
Nested reverse-forward mode type for Jacobian and Hessian computation using TapeHelper.
Definition: ADTypes.hpp:28
Navier-Stokes equations. Derived from Euler for the convective terms, which is derived from PhysicsBa...
Definition: navier_stokes.h:12
Adds Physical artificial dissipation (from Persson and Peraire, 2008).