[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 "artificial_dissipation.h"
2 
3 namespace PHiLiP
4 {
5 
6 //=====================================================
7 // LAPLACIAN DISSIPATION FUNCTIONS
8 //=====================================================
9 
10 template <int dim, int nstate>
11 template <typename real2>
13  const std::array<real2,nstate> &conservative_soln,
14  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
15  const real2 artificial_viscosity,
16  const Physics::ConvectionDiffusion<dim,nstate,real2> &convection_diffusion)
17 {
18 
19  std::array<dealii::Tensor<1,dim,real2>,nstate> flux_laplacian = convection_diffusion.dissipative_flux(conservative_soln, solution_gradient);
20 
21  for(int i=0;i<nstate;i++)
22  {
23  for(int j=0;j<dim;j++)
24  {
25  flux_laplacian[i][j]*=artificial_viscosity;
26  }
27  }
28  return flux_laplacian;
29 }
30 
31 template <int dim, int nstate> // double
33 const std::array<double,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,double>,nstate> &solution_gradient, double artificial_viscosity)
34 {
35  return calc_artificial_dissipation_flux_laplacian<double>(conservative_soln, solution_gradient, artificial_viscosity, convection_diffusion_double);
36 }
37 
38 template <int dim, int nstate> // FadType
40 const std::array<FadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadType>,nstate> &solution_gradient, FadType artificial_viscosity)
41 {
42  return calc_artificial_dissipation_flux_laplacian<FadType>(conservative_soln, solution_gradient, artificial_viscosity, convection_diffusion_FadType);
43 }
44 
45 template <int dim, int nstate> // RadType
47 const std::array<RadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadType>,nstate> &solution_gradient, RadType artificial_viscosity)
48 {
49  return calc_artificial_dissipation_flux_laplacian<RadType>(conservative_soln, solution_gradient, artificial_viscosity, convection_diffusion_RadType);
50 }
51 
52 template <int dim, int nstate> // FadFadType
53 std::array<dealii::Tensor<1,dim,FadFadType>,nstate> LaplacianArtificialDissipation<dim,nstate>::calc_artificial_dissipation_flux(
54 const std::array<FadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &solution_gradient, FadFadType artificial_viscosity)
55 {
56  return calc_artificial_dissipation_flux_laplacian<FadFadType>(conservative_soln, solution_gradient, artificial_viscosity, convection_diffusion_FadFadType);
57 }
58 
59 template <int dim, int nstate> // RadFadType
60 std::array<dealii::Tensor<1,dim,RadFadType>,nstate> LaplacianArtificialDissipation<dim,nstate>::calc_artificial_dissipation_flux(
61 const std::array<RadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadFadType>,nstate> &solution_gradient, RadFadType artificial_viscosity)
62 {
63  return calc_artificial_dissipation_flux_laplacian<RadFadType>(conservative_soln, solution_gradient, artificial_viscosity, convection_diffusion_RadFadType);
64 }
65 
66 
67 
68 //===========================================
69 // PHYSICAL DISSIPATION FUNCTIONS
70 //===========================================
71 
72 template <int dim, int nstate>
73 template <typename real2>
75  const std::array<real2,nstate> &conservative_soln,
76  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
77  const real2 artificial_viscosity,
78  const Physics::NavierStokes<dim,nstate,real2> &navier_stokes)
79 {
80  std::array<dealii::Tensor<1,dim,real2>,nstate> flux_navier_stokes = navier_stokes.dissipative_flux(conservative_soln, solution_gradient);
81 
82  for(int i=0;i<nstate;i++)
83  {
84  for(int j=0;j<dim;j++)
85  {
86  flux_navier_stokes[i][j]*=artificial_viscosity;
87  }
88  }
89  return flux_navier_stokes;
90 }
91 
92 
93 template <int dim, int nstate> // Double
95 const std::array<double,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,double>,nstate> &solution_gradient, double artificial_viscosity)
96 {
97  return calc_artificial_dissipation_flux_physical<double>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_double);
98 }
99 
100 template <int dim, int nstate> // FadType
102 const std::array<FadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadType>,nstate> &solution_gradient, FadType artificial_viscosity)
103 {
104  return calc_artificial_dissipation_flux_physical<FadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_FadType);
105 }
106 
107 template <int dim, int nstate> // RadType
109 const std::array<RadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadType>,nstate> &solution_gradient, RadType artificial_viscosity)
110 {
111  return calc_artificial_dissipation_flux_physical<RadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_RadType);
112 }
113 
114 template <int dim, int nstate> // FadFadType
115 std::array<dealii::Tensor<1,dim,FadFadType>,nstate> PhysicalArtificialDissipation<dim,nstate>::calc_artificial_dissipation_flux(
116 const std::array<FadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &solution_gradient, FadFadType artificial_viscosity)
117 {
118  return calc_artificial_dissipation_flux_physical<FadFadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_FadFadType);
119 }
120 
121 template <int dim, int nstate> // RadFadType
122 std::array<dealii::Tensor<1,dim,RadFadType>,nstate> PhysicalArtificialDissipation<dim,nstate>::calc_artificial_dissipation_flux(
123 const std::array<RadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadFadType>,nstate> &solution_gradient, RadFadType artificial_viscosity)
124 {
125  return calc_artificial_dissipation_flux_physical<RadFadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_RadFadType);
126 }
127 
128 //===========================================
129 // ENTHALPY CONSERVING DISSIPATION FUNCTIONS
130 //===========================================
131 
132 template <int dim, int nstate>
133 template <typename real2>
135  const std::array<real2,nstate> &conservative_soln,
136  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
137  real2 artificial_viscosity,
138  const Physics::NavierStokes<dim,nstate,real2> &navier_stokes)
139 {
140  std::array<dealii::Tensor<1,dim,real2>,nstate> conservative_soln_gradient = solution_gradient;
141  std::array<dealii::Tensor<1,dim,real2>,nstate> primitive_soln_gradient = navier_stokes.convert_conservative_gradient_to_primitive_gradient(conservative_soln,conservative_soln_gradient);
142  std::array<dealii::Tensor<1,dim,real2>,nstate> enthalpy_diss_flux;
143 
144  artificial_viscosity*= navier_stokes.max_convective_eigenvalue(conservative_soln);
145 
146  for (int i=0; i<nstate; i++)
147  {
148  for (int d=0; d<dim; d++)
149  {
150  if(i==nstate-1)
151  {
152  enthalpy_diss_flux[i][d] = -artificial_viscosity*(conservative_soln_gradient[i][d] + primitive_soln_gradient[i][d]);
153  }
154  else
155  {
156  enthalpy_diss_flux[i][d] = -artificial_viscosity*(conservative_soln_gradient[i][d]);
157  }
158  }
159  }
160  return enthalpy_diss_flux;
161 }
162 
163 
164 template <int dim, int nstate> // Double
166 const std::array<double,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,double>,nstate> &solution_gradient, double artificial_viscosity)
167 {
168  return calc_artificial_dissipation_flux_enthalpy_conserving_laplacian<double>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_double);
169 }
170 
171 template <int dim, int nstate> // FadType
173 const std::array<FadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadType>,nstate> &solution_gradient, FadType artificial_viscosity)
174 {
175  return calc_artificial_dissipation_flux_enthalpy_conserving_laplacian<FadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_FadType);
176 }
177 
178 template <int dim, int nstate> // RadType
180 const std::array<RadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadType>,nstate> &solution_gradient, RadType artificial_viscosity)
181 {
182  return calc_artificial_dissipation_flux_enthalpy_conserving_laplacian<RadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_RadType);
183 }
184 
185 template <int dim, int nstate> // FadFadType
187 const std::array<FadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &solution_gradient, FadFadType artificial_viscosity)
188 {
189  return calc_artificial_dissipation_flux_enthalpy_conserving_laplacian<FadFadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_FadFadType);
190 }
191 
192 template <int dim, int nstate> // RadFadType
194 const std::array<RadFadType,nstate> &conservative_soln, const std::array<dealii::Tensor<1,dim,RadFadType>,nstate> &solution_gradient, RadFadType artificial_viscosity)
195 {
196  return calc_artificial_dissipation_flux_enthalpy_conserving_laplacian<RadFadType>(conservative_soln, solution_gradient, artificial_viscosity, navier_stokes_RadFadType);
197 }
198 
199 
200 
207 
209 
211 
212 }// PHiLiP namespace
std::array< dealii::Tensor< 1, dim, real2 >, nstate > convert_conservative_gradient_to_primitive_gradient(const std::array< real2, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &conservative_soln_gradient) const
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Definition: ADTypes.hpp:12
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, nstate, real2 > &navier_stokes)
Calculates enthalpy laplacian artificial dissipation flux.
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
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.
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, 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.
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, nstate, real2 > &navier_stokes)
Calculates navier stokes artificial dissipation flux.
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, nstate, real2 > &convection_diffusion)
Calculates laplacian flux.
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const override
Maximum convective eigenvalue.
Definition: euler.cpp:906
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.
Adds enthalpy laplacian artificial dissipation (from G.E. Barter and D.L. Darmofal, 2009).
Adds Laplacian artificial dissipation (from Persson and Peraire, 2008).
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
Class to add artificial dissipation with an option to add one of the 3 dissipation types: 1...
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.
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).