[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
navier_stokes.cpp
1 #include <cmath>
2 #include <vector>
3 #include <complex> // for the jacobian
4 
5 #include "ADTypes.hpp"
6 
7 #include "physics.h"
8 #include "euler.h"
9 #include "navier_stokes.h"
10 
11 namespace PHiLiP {
12 namespace Physics {
13 
14 template <int dim, int nstate, typename real>
16  const Parameters::AllParameters *const parameters_input,
17  const double ref_length,
18  const double gamma_gas,
19  const double mach_inf,
20  const double angle_of_attack,
21  const double side_slip_angle,
22  const double prandtl_number,
23  const double reynolds_number_inf,
24  const bool use_constant_viscosity,
25  const double constant_viscosity,
26  const double temperature_inf,
27  const double isothermal_wall_temperature,
28  const thermal_boundary_condition_enum thermal_boundary_condition_type,
29  std::shared_ptr< ManufacturedSolutionFunction<dim,real> > manufactured_solution_function,
30  const two_point_num_flux_enum two_point_num_flux_type)
31  : Euler<dim,nstate,real>(parameters_input,
32  ref_length,
33  gamma_gas,
34  mach_inf,
35  angle_of_attack,
36  side_slip_angle,
37  manufactured_solution_function,
38  two_point_num_flux_type,
39  true, //has_nonzero_diffusion = true
40  false) //has_nonzero_physical_source = false
41  , viscosity_coefficient_inf(1.0) // Nondimensional - Free stream values
42  , use_constant_viscosity(use_constant_viscosity)
43  , constant_viscosity(constant_viscosity) // Nondimensional - Free stream values
44  , prandtl_number(prandtl_number)
45  , reynolds_number_inf(reynolds_number_inf)
46  , isothermal_wall_temperature(isothermal_wall_temperature) // Nondimensional - Free stream values
47  , thermal_boundary_condition_type(thermal_boundary_condition_type)
48  , sutherlands_temperature(110.4) // Sutherland's temperature. Units: [K]
49  , freestream_temperature(temperature_inf) // Freestream temperature. Units: [K]
50  , temperature_ratio(sutherlands_temperature/freestream_temperature)
51 {
52  static_assert(nstate==dim+2, "Physics::NavierStokes() should be created with nstate=dim+2");
53  // Nothing to do here so far
54 }
55 
56 template <int dim, int nstate, typename real>
57 template<typename real2>
58 std::array<dealii::Tensor<1,dim,real2>,nstate> NavierStokes<dim,nstate,real>
60  const std::array<real2,nstate> &conservative_soln,
61  const std::array<dealii::Tensor<1,dim,real2>,nstate> &conservative_soln_gradient) const
62 {
63  // conservative_soln_gradient is solution_gradient
64  std::array<dealii::Tensor<1,dim,real2>,nstate> primitive_soln_gradient;
65 
66  // get primitive solution
67  const std::array<real2,nstate> primitive_soln = this->template convert_conservative_to_primitive<real2>(conservative_soln); // from Euler
68  // extract from primitive solution
69  const real2 density = primitive_soln[0];
70  const dealii::Tensor<1,dim,real2> vel = this->template extract_velocities_from_primitive<real2>(primitive_soln); // from Euler
71 
72  // density gradient
73  for (int d=0; d<dim; d++) {
74  primitive_soln_gradient[0][d] = conservative_soln_gradient[0][d];
75  }
76  // velocities gradient
77  for (int d1=0; d1<dim; d1++) {
78  for (int d2=0; d2<dim; d2++) {
79  primitive_soln_gradient[1+d1][d2] = (conservative_soln_gradient[1+d1][d2] - vel[d1]*conservative_soln_gradient[0][d2])/density;
80  }
81  }
82  // pressure gradient
83  // -- formulation 1:
84  // const real2 vel2 = this->template compute_velocity_squared<real2>(vel); // from Euler
85  // for (int d1=0; d1<dim; d1++) {
86  // primitive_soln_gradient[nstate-1][d1] = conservative_soln_gradient[nstate-1][d1] - 0.5*vel2*conservative_soln_gradient[0][d1];
87  // for (int d2=0; d2<dim; d2++) {
88  // primitive_soln_gradient[nstate-1][d1] -= conservative_soln[1+d2]*primitive_soln_gradient[1+d2][d1];
89  // }
90  // primitive_soln_gradient[nstate-1][d1] *= this->gamm1;
91  // }
92  // -- formulation 2 (equivalent to formulation 1):
93  for (int d1=0; d1<dim; d1++) {
94  primitive_soln_gradient[nstate-1][d1] = conservative_soln_gradient[nstate-1][d1];
95  for (int d2=0; d2<dim; d2++) {
96  primitive_soln_gradient[nstate-1][d1] -= 0.5*(primitive_soln[1+d2]*conservative_soln_gradient[1+d2][d1]
97  + conservative_soln[1+d2]*primitive_soln_gradient[1+d2][d1]);
98  }
99  primitive_soln_gradient[nstate-1][d1] *= this->gamm1;
100  }
101  return primitive_soln_gradient;
102 }
103 
104 template <int dim, int nstate, typename real>
105 template<typename real2>
106 dealii::Tensor<1,dim,real2> NavierStokes<dim,nstate,real>
108  const std::array<real2,nstate> &primitive_soln,
109  const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient) const
110 {
111  const real2 density = primitive_soln[0];
112  const real2 temperature = this->template compute_temperature<real2>(primitive_soln); // from Euler
113 
114  dealii::Tensor<1,dim,real2> temperature_gradient;
115  for (int d=0; d<dim; d++) {
116  temperature_gradient[d] = (this->gam*this->mach_inf_sqr*primitive_soln_gradient[nstate-1][d] - temperature*primitive_soln_gradient[0][d])/density;
117  }
118  return temperature_gradient;
119 }
120 
121 template <int dim, int nstate, typename real>
122 template<typename real2>
124 ::compute_viscosity_coefficient (const std::array<real2,nstate> &primitive_soln) const
125 {
126  // Use either Sutherland's law or constant viscosity
127  real2 viscosity_coefficient;
128  if(use_constant_viscosity){
129  viscosity_coefficient = 1.0*constant_viscosity;
130  } else {
131  viscosity_coefficient = compute_viscosity_coefficient_sutherlands_law<real2>(primitive_soln);
132  }
133 
134  return viscosity_coefficient;
135 }
136 
137 template <int dim, int nstate, typename real>
138 template<typename real2>
140 ::compute_viscosity_coefficient_sutherlands_law (const std::array<real2,nstate> &primitive_soln) const
141 {
142  /* Nondimensionalized viscosity coefficient, \mu^{*}
143  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.14.16)
144  *
145  * Based on Sutherland's law for viscosity
146  * * Reference: Sutherland, W. (1893), "The viscosity of gases and molecular force", Philosophical Magazine, S. 5, 36, pp. 507-531 (1893)
147  * * Values: https://www.cfd-online.com/Wiki/Sutherland%27s_law
148  */
149  const real2 temperature = this->template compute_temperature<real2>(primitive_soln); // from Euler
150 
151  const real2 viscosity_coefficient = ((1.0 + temperature_ratio)/(temperature + temperature_ratio))*pow(temperature,1.5);
152 
153  return viscosity_coefficient;
154 }
155 
156 template <int dim, int nstate, typename real>
157 template<typename real2>
159 ::scale_viscosity_coefficient (const real2 viscosity_coefficient) const
160 {
161  /* Scaled nondimensionalized viscosity coefficient, $\hat{\mu}^{*}$
162  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.14.14)
163  */
164  const real2 scaled_viscosity_coefficient = viscosity_coefficient/reynolds_number_inf;
165 
166  return scaled_viscosity_coefficient;
167 }
168 
169 template <int dim, int nstate, typename real>
170 template<typename real2>
172 ::compute_scaled_viscosity_coefficient (const std::array<real2,nstate> &primitive_soln) const
173 {
174  /* Scaled nondimensionalized viscosity coefficient, $\hat{\mu}^{*}$
175  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.14.14)
176  */
177  const real2 viscosity_coefficient = compute_viscosity_coefficient<real2>(primitive_soln);
178  const real2 scaled_viscosity_coefficient = scale_viscosity_coefficient(viscosity_coefficient);
179 
180  return scaled_viscosity_coefficient;
181 }
182 
183 template <int dim, int nstate, typename real>
184 template<typename real2>
186 ::compute_scaled_heat_conductivity_given_scaled_viscosity_coefficient_and_prandtl_number (const real2 scaled_viscosity_coefficient, const double prandtl_number_input) const
187 {
188  /* Scaled nondimensionalized heat conductivity, $\hat{\kappa}^{*}$, given the scaled viscosity coefficient
189  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.14.13)
190  */
191  const real2 scaled_heat_conductivity = scaled_viscosity_coefficient/(this->gamm1*this->mach_inf_sqr*prandtl_number_input);
192 
193  return scaled_heat_conductivity;
194 }
195 
196 template <int dim, int nstate, typename real>
197 template<typename real2>
199 ::compute_scaled_heat_conductivity (const std::array<real2,nstate> &primitive_soln) const
200 {
201  /* Scaled nondimensionalized heat conductivity, $\hat{\kappa}^{*}$
202  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.14.13)
203  */
204  const real2 scaled_viscosity_coefficient = compute_scaled_viscosity_coefficient<real2>(primitive_soln);
205 
206  const real2 scaled_heat_conductivity = compute_scaled_heat_conductivity_given_scaled_viscosity_coefficient_and_prandtl_number(scaled_viscosity_coefficient,prandtl_number);
207 
208  return scaled_heat_conductivity;
209 }
210 
211 template <int dim, int nstate, typename real>
212 template<typename real2>
213 dealii::Tensor<1,dim,real2> NavierStokes<dim,nstate,real>
215  const std::array<real2,nstate> &primitive_soln,
216  const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient) const
217 {
218  /* Nondimensionalized heat flux, $\bm{q}^{*}$
219  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.14.13)
220  */
221  const real2 scaled_heat_conductivity = compute_scaled_heat_conductivity<real2>(primitive_soln);
222  const dealii::Tensor<1,dim,real2> temperature_gradient = compute_temperature_gradient<real2>(primitive_soln, primitive_soln_gradient);
223  // Compute the heat flux
224  const dealii::Tensor<1,dim,real2> heat_flux = compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<real2>(scaled_heat_conductivity,temperature_gradient);
225  return heat_flux;
226 }
227 
228 template <int dim, int nstate, typename real>
229 template<typename real2>
230 dealii::Tensor<1,dim,real2> NavierStokes<dim,nstate,real>
232  const real2 scaled_heat_conductivity,
233  const dealii::Tensor<1,dim,real2> &temperature_gradient) const
234 {
235  /* Nondimensionalized heat flux, $\bm{q}^{*}$
236  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.14.13)
237  */
238  dealii::Tensor<1,dim,real2> heat_flux;
239  for (int d=0; d<dim; d++) {
240  heat_flux[d] = -scaled_heat_conductivity*temperature_gradient[d];
241  }
242  return heat_flux;
243 }
244 
245 template <int dim, int nstate, typename real>
246 template<typename real2>
247 dealii::Tensor<1,3,real2> NavierStokes<dim,nstate,real>
249  const std::array<real2,nstate> &conservative_soln,
250  const std::array<dealii::Tensor<1,dim,real2>,nstate> &conservative_soln_gradient) const
251 {
252  // Compute the vorticity
253  dealii::Tensor<1,3,real2> vorticity;
254  for(int d=0; d<3; ++d) {
255  vorticity[d] = 0.0;
256  }
257  if constexpr(dim>1) {
258  // Get velocity gradient
259  const std::array<dealii::Tensor<1,dim,real2>,nstate> primitive_soln_gradient = convert_conservative_gradient_to_primitive_gradient<real2>(conservative_soln, conservative_soln_gradient);
260  const dealii::Tensor<2,dim,real2> velocities_gradient = extract_velocities_gradient_from_primitive_solution_gradient<real2>(primitive_soln_gradient);
261  if constexpr(dim==2) {
262  // vorticity exists only in z-component
263  vorticity[2] = velocities_gradient[1][0] - velocities_gradient[0][1]; // z-component
264  }
265  if constexpr(dim==3) {
266  vorticity[0] = velocities_gradient[2][1] - velocities_gradient[1][2]; // x-component
267  vorticity[1] = velocities_gradient[0][2] - velocities_gradient[2][0]; // y-component
268  vorticity[2] = velocities_gradient[1][0] - velocities_gradient[0][1]; // z-component
269  }
270  }
271  return vorticity;
272 }
273 
274 template <int dim, int nstate, typename real>
277  const std::array<real,nstate> &conservative_soln,
278  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const
279 {
280  // Compute the vorticity
281  dealii::Tensor<1,3,real> vorticity = compute_vorticity(conservative_soln, conservative_soln_gradient);
282  // Compute vorticity magnitude squared
283  real vorticity_magnitude_sqr = 0.0;
284  for(int d=0; d<3; ++d) {
285  vorticity_magnitude_sqr += vorticity[d]*vorticity[d];
286  }
287  return vorticity_magnitude_sqr;
288 }
289 
290 template <int dim, int nstate, typename real>
293  const std::array<real,nstate> &conservative_soln,
294  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const
295 {
296  real vorticity_magnitude_sqr = compute_vorticity_magnitude_sqr(conservative_soln, conservative_soln_gradient);
297  real vorticity_magnitude = sqrt(vorticity_magnitude_sqr);
298  return vorticity_magnitude;
299 }
300 
301 template <int dim, int nstate, typename real>
304  const std::array<real,nstate> &conservative_soln,
305  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const
306 {
307  // Compute enstrophy
308  const real density = conservative_soln[0];
309  real enstrophy = 0.5*density*compute_vorticity_magnitude_sqr(conservative_soln, conservative_soln_gradient);
310  return enstrophy;
311 }
312 
313 template <int dim, int nstate, typename real>
316  const real integrated_enstrophy) const
317 {
318  real dissipation_rate = 2.0*integrated_enstrophy/(this->reynolds_number_inf);
319  return dissipation_rate;
320 }
321 
322 template <int dim, int nstate, typename real>
325  const std::array<real,nstate> &conservative_soln,
326  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const
327 {
328  // Get pressure
329  const real pressure = this->template compute_pressure<real>(conservative_soln);
330 
331  // Get velocity gradient
332  const std::array<dealii::Tensor<1,dim,real>,nstate> primitive_soln_gradient = convert_conservative_gradient_to_primitive_gradient<real>(conservative_soln, conservative_soln_gradient);
333  const dealii::Tensor<2,dim,real> velocities_gradient = extract_velocities_gradient_from_primitive_solution_gradient<real>(primitive_soln_gradient);
334 
335  // Compute the pressure dilatation
336  real pressure_dilatation = 0.0;
337  for(int d=0; d<dim; ++d) {
338  pressure_dilatation += velocities_gradient[d][d]; // divergence
339  }
340  pressure_dilatation *= pressure;
341 
342  return pressure_dilatation;
343 }
344 
345 template <int dim, int nstate, typename real>
346 dealii::Tensor<2,dim,real> NavierStokes<dim,nstate,real>
348  const std::array<real,nstate> &conservative_soln,
349  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const
350 {
351  // Get velocity gradient
352  const std::array<dealii::Tensor<1,dim,real>,nstate> primitive_soln_gradient = convert_conservative_gradient_to_primitive_gradient<real>(conservative_soln, conservative_soln_gradient);
353  const dealii::Tensor<2,dim,real> velocities_gradient = extract_velocities_gradient_from_primitive_solution_gradient<real>(primitive_soln_gradient);
354 
355  // Strain rate tensor, S_{i,j}
356  const dealii::Tensor<2,dim,real> strain_rate_tensor = compute_strain_rate_tensor<real>(velocities_gradient);
357 
358  // Compute divergence of velocity
359  real vel_divergence = 0.0;
360  for(int d1=0; d1<dim; ++d1) {
361  vel_divergence += velocities_gradient[d1][d1];
362  }
363 
364  // Compute the deviatoric strain rate tensor
365  dealii::Tensor<2,dim,real> deviatoric_strain_rate_tensor;
366  for(int d1=0; d1<dim; ++d1) {
367  for(int d2=0; d2<dim; ++d2) {
368  deviatoric_strain_rate_tensor[d1][d2] = strain_rate_tensor[d1][d2] - (1.0/3.0)*vel_divergence;
369  }
370  }
371  return deviatoric_strain_rate_tensor;
372 }
373 
374 template <int dim, int nstate, typename real>
377  const dealii::Tensor<2,dim,real> &tensor) const
378 {
379  real tensor_magnitude_sqr = 0.0;
380  for (int i=0; i<dim; ++i) {
381  for (int j=0; j<dim; ++j) {
382  tensor_magnitude_sqr += tensor[i][j]*tensor[i][j];
383  }
384  }
385  return tensor_magnitude_sqr;
386 }
387 
388 template <int dim, int nstate, typename real>
391  const std::array<real,nstate> &conservative_soln,
392  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const
393 {
394  // Compute the deviatoric strain rate tensor
395  const dealii::Tensor<2,dim,real> deviatoric_strain_rate_tensor = compute_deviatoric_strain_rate_tensor(conservative_soln,conservative_soln_gradient);
396  // Get magnitude squared
397  real deviatoric_strain_rate_tensor_magnitude_sqr = get_tensor_magnitude_sqr(deviatoric_strain_rate_tensor);
398 
399  return deviatoric_strain_rate_tensor_magnitude_sqr;
400 }
401 
402 template <int dim, int nstate, typename real>
405  const real integrated_deviatoric_strain_rate_tensor_magnitude_sqr) const
406 {
407  real dissipation_rate = 2.0*integrated_deviatoric_strain_rate_tensor_magnitude_sqr/(this->reynolds_number_inf);
408  return dissipation_rate;
409 }
410 
411 template <int dim, int nstate, typename real>
412 template<typename real2>
413 dealii::Tensor<2,dim,real2> NavierStokes<dim,nstate,real>
415  const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient) const
416 {
417  dealii::Tensor<2,dim,real2> velocities_gradient;
418  for (int d1=0; d1<dim; d1++) {
419  for (int d2=0; d2<dim; d2++) {
420  velocities_gradient[d1][d2] = primitive_soln_gradient[1+d1][d2];
421  }
422  }
423  return velocities_gradient;
424 }
425 
426 template <int dim, int nstate, typename real>
427 template<typename real2>
428 dealii::Tensor<2,dim,real2> NavierStokes<dim,nstate,real>
430  const dealii::Tensor<2,dim,real2> &vel_gradient) const
431 {
432  // Strain rate tensor, S_{i,j}
433  dealii::Tensor<2,dim,real2> strain_rate_tensor;
434  for (int d1=0; d1<dim; d1++) {
435  for (int d2=0; d2<dim; d2++) {
436  // rate of strain (deformation) tensor:
437  strain_rate_tensor[d1][d2] = 0.5*(vel_gradient[d1][d2] + vel_gradient[d2][d1]);
438  }
439  }
440  return strain_rate_tensor;
441 }
442 
443 template <int dim, int nstate, typename real>
446  const std::array<real,nstate> &conservative_soln,
447  const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient) const
448 {
449  // Get velocity gradient
450  const std::array<dealii::Tensor<1,dim,real>,nstate> primitive_soln_gradient = convert_conservative_gradient_to_primitive_gradient<real>(conservative_soln, conservative_soln_gradient);
451  const dealii::Tensor<2,dim,real> velocities_gradient = extract_velocities_gradient_from_primitive_solution_gradient<real>(primitive_soln_gradient);
452 
453  // Compute the strain rate tensor
454  const dealii::Tensor<2,dim,real> strain_rate_tensor = compute_strain_rate_tensor(velocities_gradient);
455  // Get magnitude squared
456  real strain_rate_tensor_magnitude_sqr = get_tensor_magnitude_sqr(strain_rate_tensor);
457 
458  return strain_rate_tensor_magnitude_sqr;
459 }
460 
461 template <int dim, int nstate, typename real>
464  const real integrated_strain_rate_tensor_magnitude_sqr) const
465 {
466  real dissipation_rate = 2.0*integrated_strain_rate_tensor_magnitude_sqr/(this->reynolds_number_inf);
467  return dissipation_rate;
468 }
469 
470 template <int dim, int nstate, typename real>
471 template<typename real2>
472 dealii::Tensor<2,dim,real2> NavierStokes<dim,nstate,real>
474  const real2 scaled_viscosity_coefficient,
475  const dealii::Tensor<2,dim,real2> &strain_rate_tensor) const
476 {
477  /* Nondimensionalized viscous stress tensor, $\bm{\tau}^{*}$
478  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.14.12)
479  */
480 
481  // Divergence of velocity
482  // -- Initialize
483  real2 vel_divergence; // complex initializes it as 0+0i
484  if(std::is_same<real2,real>::value){
485  vel_divergence = 0.0;
486  }
487  // -- Obtain from trace of strain rate tensor
488  for (int d=0; d<dim; d++) {
489  vel_divergence += strain_rate_tensor[d][d];
490  }
491 
492  // Viscous stress tensor, \tau_{i,j}
493  dealii::Tensor<2,dim,real2> viscous_stress_tensor;
494  const real2 scaled_2nd_viscosity_coefficient = (-2.0/3.0)*scaled_viscosity_coefficient; // Stokes' hypothesis
495  for (int d1=0; d1<dim; d1++) {
496  for (int d2=0; d2<dim; d2++) {
497  viscous_stress_tensor[d1][d2] = 2.0*scaled_viscosity_coefficient*strain_rate_tensor[d1][d2];
498  }
499  viscous_stress_tensor[d1][d1] += scaled_2nd_viscosity_coefficient*vel_divergence;
500  }
501  return viscous_stress_tensor;
502 }
503 
504 template <int dim, int nstate, typename real>
505 template<typename real2>
506 dealii::Tensor<2,dim,real2> NavierStokes<dim,nstate,real>
508  const std::array<real2,nstate> &primitive_soln,
509  const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient) const
510 {
511  /* Nondimensionalized viscous stress tensor, $\bm{\tau}^{*}$
512  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.14.12)
513  */
514  const dealii::Tensor<2,dim,real2> vel_gradient = extract_velocities_gradient_from_primitive_solution_gradient<real2>(primitive_soln_gradient);
515  const dealii::Tensor<2,dim,real2> strain_rate_tensor = compute_strain_rate_tensor<real2>(vel_gradient);
516  const real2 scaled_viscosity_coefficient = compute_scaled_viscosity_coefficient<real2>(primitive_soln);
517 
518  // Viscous stress tensor, \tau_{i,j}
519  const dealii::Tensor<2,dim,real2> viscous_stress_tensor
520  = compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<real2>(scaled_viscosity_coefficient,strain_rate_tensor);
521 
522  return viscous_stress_tensor;
523 }
524 
525 template <int dim, int nstate, typename real>
526 std::array<dealii::Tensor<1,dim,real>,nstate> NavierStokes<dim,nstate,real>
528  const std::array<real,nstate> &conservative_soln,
529  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient) const
530 {
531  /* Nondimensionalized viscous flux (i.e. dissipative flux)
532  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.12.1-4.12.4)
533  */
534  std::array<dealii::Tensor<1,dim,real>,nstate> viscous_flux = dissipative_flux_templated<real>(conservative_soln, solution_gradient);
535  return viscous_flux;
536 }
537 
538 template <int dim, int nstate, typename real>
539 dealii::Tensor<1,dim,real> NavierStokes<dim,nstate,real>
541  const std::array<real,nstate> &primitive_soln,
542  const dealii::Tensor<1,dim,real> &temperature_gradient) const
543 {
544  /* Gradient of the scaled nondimensionalized viscosity coefficient
545  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.14.14 and 4.14.17)
546  */
547  const real temperature = this->compute_temperature(primitive_soln); // from Euler
548  const real scaled_viscosity_coefficient = compute_scaled_viscosity_coefficient(primitive_soln);
549 
550  // Eq.(4.14.17)
551  real dmudT = 0.5*(scaled_viscosity_coefficient/(temperature + temperature_ratio))*(1.0 + 3.0*temperature_ratio/temperature);
552 
553  // Gradient (dmudX) from dmudT and dTdX
554  dealii::Tensor<1,dim,real> scaled_viscosity_coefficient_gradient;
555  for (int d=0; d<dim; d++) {
556  scaled_viscosity_coefficient_gradient[d] = dmudT*temperature_gradient[d];
557  }
558 
559  return scaled_viscosity_coefficient_gradient;
560 }
561 
562 // Returns the value from a CoDiPack or Sacado variable.
563 template<typename real>
564 double getValue(const real &x) {
565  if constexpr(std::is_same<real,double>::value) {
566  return x;
567  }
568  else if constexpr(std::is_same<real,FadType>::value) {
569  return x.val(); // sacado
570  }
571  else if constexpr(std::is_same<real,FadFadType>::value) {
572  return x.val().val(); // sacado
573  }
574  else if constexpr(std::is_same<real,RadType>::value) {
575  return x.value(); // CoDiPack
576  }
577  else if(std::is_same<real,RadFadType>::value) {
578  return x.value().value(); // CoDiPack
579  }
580 }
581 
582 template <int dim, int nstate, typename real>
583 dealii::Tensor<2,nstate,real> NavierStokes<dim,nstate,real>
585  const std::array<real,nstate> &conservative_soln,
586  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
587  const dealii::Tensor<1,dim,real> &normal) const
588 {
589  using adtype = FadType;
590 
591  // Initialize AD objects
592  std::array<adtype,nstate> AD_conservative_soln;
593  std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_solution_gradient;
594  for (int s=0; s<nstate; s++) {
595  adtype ADvar(nstate, s, getValue<real>(conservative_soln[s])); // create AD variable
596  AD_conservative_soln[s] = ADvar;
597  for (int d=0;d<dim;d++) {
598  AD_solution_gradient[s][d] = getValue<real>(solution_gradient[s][d]);
599  }
600  }
601 
602  // Compute AD dissipative flux
603  std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_dissipative_flux = dissipative_flux_templated<adtype>(AD_conservative_soln, AD_solution_gradient);
604 
605  // Assemble the directional Jacobian
606  dealii::Tensor<2,nstate,real> jacobian;
607  for (int sp=0; sp<nstate; sp++) {
608  // for each perturbed state (sp) variable
609  for (int s=0; s<nstate; s++) {
610  jacobian[s][sp] = 0.0;
611  for (int d=0;d<dim;d++) {
612  // Compute directional jacobian
613  jacobian[s][sp] += AD_dissipative_flux[s][d].dx(sp)*normal[d];
614  }
615  }
616  }
617  return jacobian;
618 }
619 
620 template <int dim, int nstate, typename real>
621 dealii::Tensor<2,nstate,real> NavierStokes<dim,nstate,real>
623  const std::array<real,nstate> &conservative_soln,
624  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
625  const dealii::Tensor<1,dim,real> &normal,
626  const int d_gradient) const
627 {
628  using adtype = FadType;
629 
630  // Initialize AD objects
631  std::array<adtype,nstate> AD_conservative_soln;
632  std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_solution_gradient;
633  for (int s=0; s<nstate; s++) {
634  AD_conservative_soln[s] = getValue<real>(conservative_soln[s]);
635  for (int d=0;d<dim;d++) {
636  if(d == d_gradient){
637  adtype ADvar(nstate, s, getValue<real>(solution_gradient[s][d])); // create AD variable
638  AD_solution_gradient[s][d] = ADvar;
639  }
640  else {
641  AD_solution_gradient[s][d] = getValue<real>(solution_gradient[s][d]);
642  }
643  }
644  }
645 
646  // Compute AD dissipative flux
647  std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_dissipative_flux = dissipative_flux_templated<adtype>(AD_conservative_soln, AD_solution_gradient);
648 
649  // Assemble the directional Jacobian
650  dealii::Tensor<2,nstate,real> jacobian;
651  for (int sp=0; sp<nstate; sp++) {
652  // for each perturbed state (sp) variable
653  for (int s=0; s<nstate; s++) {
654  jacobian[s][sp] = 0.0;
655  for (int d=0;d<dim;d++) {
656  // Compute directional jacobian
657  jacobian[s][sp] += AD_dissipative_flux[s][d].dx(sp)*normal[d];
658  }
659  }
660  }
661  return jacobian;
662 }
663 
664 template <int dim, int nstate, typename real>
665 std::array<real,nstate> NavierStokes<dim,nstate,real>
667  const dealii::Point<dim,real> &pos) const
668 {
669  // Get Manufactured Solution values
670  const std::array<real,nstate> manufactured_solution = this->get_manufactured_solution_value(pos); // from Euler
671 
672  // Get Manufactured Solution gradient
673  const std::array<dealii::Tensor<1,dim,real>,nstate> manufactured_solution_gradient = this->get_manufactured_solution_gradient(pos); // from Euler
674 
675  // Get Manufactured Solution hessian
676  std::array<dealii::SymmetricTensor<2,dim,real>,nstate> manufactured_solution_hessian;
677  for (int s=0; s<nstate; s++) {
678  dealii::SymmetricTensor<2,dim,real> hessian = this->manufactured_solution_function->hessian(pos,s);
679  for (int dr=0;dr<dim;dr++) {
680  for (int dc=0;dc<dim;dc++) {
681  manufactured_solution_hessian[s][dr][dc] = hessian[dr][dc];
682  }
683  }
684  }
685 
686  // First term -- wrt to the conservative variables
687  // This is similar, should simply provide this function a flux_directional_jacobian() -- could restructure later
688  dealii::Tensor<1,nstate,real> dissipative_flux_divergence;
689  for (int d=0;d<dim;d++) {
690  dealii::Tensor<1,dim,real> normal;
691  normal[d] = 1.0;
692  const dealii::Tensor<2,nstate,real> jacobian = dissipative_flux_directional_jacobian(manufactured_solution, manufactured_solution_gradient, normal);
693 
694  // get the directional jacobian wrt gradient
695  std::array<dealii::Tensor<2,nstate,real>,dim> jacobian_wrt_gradient;
696  for (int d_gradient=0;d_gradient<dim;d_gradient++) {
697 
698  // get the directional jacobian wrt gradient component (x,y,z)
699  const dealii::Tensor<2,nstate,real> jacobian_wrt_gradient_component = dissipative_flux_directional_jacobian_wrt_gradient_component(manufactured_solution, manufactured_solution_gradient, normal, d_gradient);
700 
701  // store each component in jacobian_wrt_gradient -- could do this in the function used above
702  for (int sr = 0; sr < nstate; ++sr) {
703  for (int sc = 0; sc < nstate; ++sc) {
704  jacobian_wrt_gradient[d_gradient][sr][sc] = jacobian_wrt_gradient_component[sr][sc];
705  }
706  }
707  }
708  for (int sr = 0; sr < nstate; ++sr) {
709  real jac_grad_row = 0.0;
710  for (int sc = 0; sc < nstate; ++sc) {
711  jac_grad_row += jacobian[sr][sc]*manufactured_solution_gradient[sc][d];
712  // Second term -- wrt to the gradient of conservative variables
713  // -- add the contribution of each gradient component (e.g. x,y,z for dim==3)
714  for (int d_gradient=0;d_gradient<dim;d_gradient++) {
715  jac_grad_row += jacobian_wrt_gradient[d_gradient][sr][sc]*manufactured_solution_hessian[sc][d_gradient][d]; // symmetric so d indexing works both ways
716  }
717  }
718  dissipative_flux_divergence[sr] += jac_grad_row;
719  }
720  }
721  std::array<real,nstate> dissipative_source_term;
722  for (int s=0; s<nstate; s++) {
723  dissipative_source_term[s] = dissipative_flux_divergence[s];
724  }
725 
726  return dissipative_source_term;
727 }
728 
729 template <int dim, int nstate, typename real>
730 std::array<real,nstate> NavierStokes<dim,nstate,real>
732  const dealii::Point<dim,real> &pos,
733  const std::array<real,nstate> &/*conservative_soln*/,
734  const real /*current_time*/) const
735 {
736  // will probably have to change this line: -- modify so we only need to provide a jacobian
737  const std::array<real,nstate> conv_source_term = this->convective_source_term(pos);
738  const std::array<real,nstate> diss_source_term = dissipative_source_term(pos);
739  std::array<real,nstate> source_term;
740  for (int s=0; s<nstate; s++)
741  {
742  source_term[s] = conv_source_term[s] + diss_source_term[s];
743  }
744  return source_term;
745 }
746 
747 template <int dim, int nstate, typename real>
748 dealii::Tensor<2,nstate,real> NavierStokes<dim,nstate,real>
750  std::array<real,nstate> &conservative_soln,
751  const dealii::Tensor<1,dim,real> &normal) const
752 {
753  using adtype = FadType;
754 
755  // Initialize AD objects
756  std::array<adtype,nstate> AD_conservative_soln;
757  for (int s=0; s<nstate; s++) {
758  adtype ADvar(nstate, s, getValue<real>(conservative_soln[s])); // create AD variable
759  AD_conservative_soln[s] = ADvar;
760  }
761 
762  // Compute AD convective flux
763  // -- taken exactly from euler.cpp:
764  std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_conv_flux;
765  const adtype density = AD_conservative_soln[0];
766  const adtype pressure = this->template compute_pressure<adtype>(AD_conservative_soln);
767  const dealii::Tensor<1,dim,adtype> vel = this->template compute_velocities<adtype>(AD_conservative_soln);
768  const adtype specific_total_energy = AD_conservative_soln[nstate-1]/AD_conservative_soln[0];
769  const adtype specific_total_enthalpy = specific_total_energy + pressure/density;
770  for (int flux_dim=0; flux_dim<dim; ++flux_dim) {
771  // Density equation
772  AD_conv_flux[0][flux_dim] = AD_conservative_soln[1+flux_dim];
773  // Momentum equation
774  for (int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
775  AD_conv_flux[1+velocity_dim][flux_dim] = density*vel[flux_dim]*vel[velocity_dim];
776  }
777  AD_conv_flux[1+flux_dim][flux_dim] += pressure; // Add diagonal of pressure
778  // Energy equation
779  AD_conv_flux[nstate-1][flux_dim] = density*vel[flux_dim]*specific_total_enthalpy;
780  }
781  // -- end of computing the AD convective flux
782 
783  // Assemble the directional Jacobian
784  dealii::Tensor<2,nstate,real> jacobian;
785  for (int sp=0; sp<nstate; sp++) {
786  // for each perturbed state (sp) variable
787  for (int s=0; s<nstate; s++) {
788  jacobian[s][sp] = 0.0;
789  for (int d=0;d<dim;d++) {
790  // Compute directional jacobian
791  jacobian[s][sp] += AD_conv_flux[s][d].dx(sp)*normal[d];
792  }
793  }
794  }
795  return jacobian;
796 }
797 
798 template <int dim, int nstate, typename real>
801  std::array<real,nstate> &conservative_soln) const
802 {
803  using adtype = FadType;
804 
805  // Step 1: Primitive solution
806  const std::array<real,nstate> primitive_soln = this->template convert_conservative_to_primitive<real>(conservative_soln); // from Euler
807 
808  // Step 2: Compute temperature
809  real temperature = this->template compute_temperature<real>(primitive_soln); // from Euler
810 
811  // Initialize AD objects
812  adtype AD_temperature(1, 0, getValue<real>(temperature));
813 
814  // Compute the AD scaled viscosity coefficient
815  adtype viscosity_coefficient = ((1.0 + temperature_ratio)/(AD_temperature + temperature_ratio))*pow(AD_temperature,1.5);
816  adtype scaled_viscosity_coefficient = viscosity_coefficient/reynolds_number_inf;
817 
818  // Get the derivative from AD
819  real dmudT = scaled_viscosity_coefficient.dx(0);
820 
821  return dmudT;
822 }
823 
824 template <int dim, int nstate, typename real>
825 template<typename real2>
826 std::array<dealii::Tensor<1,dim,real2>,nstate> NavierStokes<dim,nstate,real>
828  const std::array<real2,nstate> &conservative_soln,
829  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient) const
830 {
831  /* Nondimensionalized viscous flux (i.e. dissipative flux)
832  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.12.1-4.12.4)
833  */
834 
835  // Step 1: Primitive solution
836  const std::array<real2,nstate> primitive_soln = this->template convert_conservative_to_primitive<real2>(conservative_soln); // from Euler
837 
838  // Step 2: Gradient of primitive solution
839  const std::array<dealii::Tensor<1,dim,real2>,nstate> primitive_soln_gradient = convert_conservative_gradient_to_primitive_gradient<real2>(conservative_soln, solution_gradient);
840 
841  // Step 3: Viscous stress tensor, Velocities, Heat flux
842  const dealii::Tensor<2,dim,real2> viscous_stress_tensor = compute_viscous_stress_tensor<real2>(primitive_soln, primitive_soln_gradient);
843  const dealii::Tensor<1,dim,real2> vel = this->template extract_velocities_from_primitive<real2>(primitive_soln); // from Euler
844  const dealii::Tensor<1,dim,real2> heat_flux = compute_heat_flux<real2>(primitive_soln, primitive_soln_gradient);
845 
846  // Step 4: Construct viscous flux; Note: sign corresponds to LHS
847  const std::array<dealii::Tensor<1,dim,real2>,nstate> viscous_flux = dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<real2>(vel,viscous_stress_tensor,heat_flux);
848  return viscous_flux;
849 }
850 
851 template <int dim, int nstate, typename real>
852 template<typename real2>
853 std::array<dealii::Tensor<1,dim,real2>,nstate> NavierStokes<dim,nstate,real>
855  const dealii::Tensor<1,dim,real2> &vel,
856  const dealii::Tensor<2,dim,real2> &viscous_stress_tensor,
857  const dealii::Tensor<1,dim,real2> &heat_flux) const
858 {
859  /* Nondimensionalized viscous flux (i.e. dissipative flux)
860  * Reference: Masatsuka 2018 "I do like CFD", p.148, eq.(4.12.1-4.12.4)
861  */
862 
863  /* Construct viscous flux given velocities, viscous stress tensor,
864  * and heat flux; Note: sign corresponds to LHS
865  */
866  std::array<dealii::Tensor<1,dim,real2>,nstate> viscous_flux;
867  for (int flux_dim=0; flux_dim<dim; ++flux_dim) {
868  // Density equation
869  viscous_flux[0][flux_dim] = 0.0;
870  // Momentum equation
871  for (int stress_dim=0; stress_dim<dim; ++stress_dim){
872  viscous_flux[1+stress_dim][flux_dim] = -viscous_stress_tensor[stress_dim][flux_dim];
873  }
874  // Energy equation
875  viscous_flux[nstate-1][flux_dim] = 0.0;
876  for (int stress_dim=0; stress_dim<dim; ++stress_dim){
877  viscous_flux[nstate-1][flux_dim] -= vel[stress_dim]*viscous_stress_tensor[flux_dim][stress_dim];
878  }
879  viscous_flux[nstate-1][flux_dim] += heat_flux[flux_dim];
880  }
881  return viscous_flux;
882 }
883 
884 template <int dim, int nstate, typename real>
887  const dealii::Tensor<1,dim,real> &/*normal_int*/,
888  const std::array<real,nstate> &soln_int,
889  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
890  std::array<real,nstate> &soln_bc,
891  std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc) const
892 {
894 
895  // No-slip wall boundary conditions
896  // Given by equations 460-461 of the following paper
897  // Hartmann, Ralf. "Numerical analysis of higher order discontinuous Galerkin finite element methods." (2008): 1-107.
898  const std::array<real,nstate> primitive_interior_values = this->template convert_conservative_to_primitive<real>(soln_int);
899 
900  // Copy density
901  std::array<real,nstate> primitive_boundary_values;
902  primitive_boundary_values[0] = primitive_interior_values[0];
903 
904  // Associated thermal boundary condition
905  if(thermal_boundary_condition_type == thermal_boundary_condition_enum::isothermal) {
906  // isothermal boundary
907  primitive_boundary_values[nstate-1] = this->compute_pressure_from_density_temperature(primitive_boundary_values[0], isothermal_wall_temperature);
908  } else if(thermal_boundary_condition_type == thermal_boundary_condition_enum::adiabatic) {
909  // adiabatic boundary
910  primitive_boundary_values[nstate-1] = primitive_interior_values[nstate-1];
911  }
912 
913  // No-slip boundary condition on velocity
914  dealii::Tensor<1,dim,real> velocities_bc;
915  for (int d=0; d<dim; d++) {
916  velocities_bc[d] = 0.0;
917  }
918  for (int d=0; d<dim; ++d) {
919  primitive_boundary_values[1+d] = velocities_bc[d];
920  }
921 
922  // Apply boundary conditions:
923  // -- solution at boundary
924  const std::array<real,nstate> modified_conservative_boundary_values = this->convert_primitive_to_conservative(primitive_boundary_values);
925  for (int istate=0; istate<nstate; ++istate) {
926  soln_bc[istate] = modified_conservative_boundary_values[istate];
927  }
928  // -- gradient of solution at boundary
929  for (int istate=0; istate<nstate; ++istate) {
930  soln_grad_bc[istate] = soln_grad_int[istate];
931  }
932 }
933 
934 template <int dim, int nstate, typename real>
937  const dealii::Point<dim, real> &pos,
938  const dealii::Tensor<1,dim,real> &/*normal_int*/,
939  const std::array<real,nstate> &/*soln_int*/,
940  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_int*/,
941  std::array<real,nstate> &soln_bc,
942  std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc) const
943 {
944  // Manufactured solution boundary condition
945  // Note: This is consistent with Navah & Nadarajah (2018)
946  std::array<real,nstate> boundary_values;
947  std::array<dealii::Tensor<1,dim,real>,nstate> boundary_gradients;
948  for (int i=0; i<nstate; i++) {
949  boundary_values[i] = this->manufactured_solution_function->value (pos, i);
950  boundary_gradients[i] = this->manufactured_solution_function->gradient (pos, i);
951  }
952  for (int istate=0; istate<nstate; istate++) {
953  soln_bc[istate] = boundary_values[istate];
954  // soln_grad_bc[istate] = soln_grad_int[istate]; // done in convection_diffusion.cpp
955  soln_grad_bc[istate] = boundary_gradients[istate];
956  }
957 }
958 
959 // Instantiate explicitly
965 
966 //==============================================================================
967 // -> Templated member functions:
968 //------------------------------------------------------------------------------
969 // -->Required templated member functions by unit tests
970 //------------------------------------------------------------------------------
971 // -- compute_scaled_viscosity_coefficient()
972 template double NavierStokes < PHILIP_DIM, PHILIP_DIM+2, double >::compute_scaled_viscosity_coefficient< double >(const std::array<double ,PHILIP_DIM+2> &primitive_soln) const;
973 template FadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, FadType >::compute_scaled_viscosity_coefficient< FadType >(const std::array<FadType ,PHILIP_DIM+2> &primitive_soln) const;
974 template RadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, RadType >::compute_scaled_viscosity_coefficient< RadType >(const std::array<RadType ,PHILIP_DIM+2> &primitive_soln) const;
975 template FadFadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, FadFadType>::compute_scaled_viscosity_coefficient< FadFadType >(const std::array<FadFadType,PHILIP_DIM+2> &primitive_soln) const;
976 template RadFadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, RadFadType>::compute_scaled_viscosity_coefficient< RadFadType >(const std::array<RadFadType,PHILIP_DIM+2> &primitive_soln) const;
977 //------------------------------------------------------------------------------
978 // -->Required templated member functions by classes derived from ModelBase
979 //------------------------------------------------------------------------------
980 // -- convert_conservative_gradient_to_primitive_gradient()
981 template std::array<dealii::Tensor<1,PHILIP_DIM,double >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::convert_conservative_gradient_to_primitive_gradient<double >(const std::array<double ,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,double >,PHILIP_DIM+2> &conservative_soln_gradient) const;
982 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadType >::convert_conservative_gradient_to_primitive_gradient<FadType >(const std::array<FadType ,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &conservative_soln_gradient) const;
983 template std::array<dealii::Tensor<1,PHILIP_DIM,RadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::convert_conservative_gradient_to_primitive_gradient<RadType >(const std::array<RadType ,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,RadType >,PHILIP_DIM+2> &conservative_soln_gradient) const;
984 template std::array<dealii::Tensor<1,PHILIP_DIM,FadFadType>,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::convert_conservative_gradient_to_primitive_gradient<FadFadType>(const std::array<FadFadType,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadFadType>,PHILIP_DIM+2> &conservative_soln_gradient) const;
985 template std::array<dealii::Tensor<1,PHILIP_DIM,RadFadType>,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::convert_conservative_gradient_to_primitive_gradient<RadFadType>(const std::array<RadFadType,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,RadFadType>,PHILIP_DIM+2> &conservative_soln_gradient) const;
986 // -- extract_velocities_gradient_from_primitive_solution_gradient()
987 template dealii::Tensor<2,PHILIP_DIM,double > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::extract_velocities_gradient_from_primitive_solution_gradient<double > (const std::array<dealii::Tensor<1,PHILIP_DIM,double >,PHILIP_DIM+2> &primitive_soln_gradient) const;
988 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadType >::extract_velocities_gradient_from_primitive_solution_gradient<FadType > (const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
989 template dealii::Tensor<2,PHILIP_DIM,RadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::extract_velocities_gradient_from_primitive_solution_gradient<RadType > (const std::array<dealii::Tensor<1,PHILIP_DIM,RadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
990 template dealii::Tensor<2,PHILIP_DIM,FadFadType> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::extract_velocities_gradient_from_primitive_solution_gradient<FadFadType> (const std::array<dealii::Tensor<1,PHILIP_DIM,FadFadType>,PHILIP_DIM+2> &primitive_soln_gradient) const;
991 template dealii::Tensor<2,PHILIP_DIM,RadFadType> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::extract_velocities_gradient_from_primitive_solution_gradient<RadFadType> (const std::array<dealii::Tensor<1,PHILIP_DIM,RadFadType>,PHILIP_DIM+2> &primitive_soln_gradient) const;
992 // -- dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux()
993 template std::array<dealii::Tensor<1,PHILIP_DIM,double >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<double >(const dealii::Tensor<1,PHILIP_DIM,double > &vel, const dealii::Tensor<2,PHILIP_DIM,double > &viscous_stress_tensor, const dealii::Tensor<1,PHILIP_DIM,double > &heat_flux) const;
994 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadType >::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<FadType >(const dealii::Tensor<1,PHILIP_DIM,FadType > &vel, const dealii::Tensor<2,PHILIP_DIM,FadType > &viscous_stress_tensor, const dealii::Tensor<1,PHILIP_DIM,FadType > &heat_flux) const;
995 template std::array<dealii::Tensor<1,PHILIP_DIM,RadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<RadType >(const dealii::Tensor<1,PHILIP_DIM,RadType > &vel, const dealii::Tensor<2,PHILIP_DIM,RadType > &viscous_stress_tensor, const dealii::Tensor<1,PHILIP_DIM,RadType > &heat_flux) const;
996 template std::array<dealii::Tensor<1,PHILIP_DIM,FadFadType>,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<FadFadType>(const dealii::Tensor<1,PHILIP_DIM,FadFadType> &vel, const dealii::Tensor<2,PHILIP_DIM,FadFadType> &viscous_stress_tensor, const dealii::Tensor<1,PHILIP_DIM,FadFadType> &heat_flux) const;
997 template std::array<dealii::Tensor<1,PHILIP_DIM,RadFadType>,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<RadFadType>(const dealii::Tensor<1,PHILIP_DIM,RadFadType> &vel, const dealii::Tensor<2,PHILIP_DIM,RadFadType> &viscous_stress_tensor, const dealii::Tensor<1,PHILIP_DIM,RadFadType> &heat_flux) const;
998 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in classes derived from LargeEddySimulationBase
999 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<FadType >(const dealii::Tensor<1,PHILIP_DIM,FadType > &vel, const dealii::Tensor<2,PHILIP_DIM,FadType > &viscous_stress_tensor, const dealii::Tensor<1,PHILIP_DIM,FadType > &heat_flux) const;
1000 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<FadType >(const dealii::Tensor<1,PHILIP_DIM,FadType > &vel, const dealii::Tensor<2,PHILIP_DIM,FadType > &viscous_stress_tensor, const dealii::Tensor<1,PHILIP_DIM,FadType > &heat_flux) const;
1001 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<FadType >(const dealii::Tensor<1,PHILIP_DIM,FadType > &vel, const dealii::Tensor<2,PHILIP_DIM,FadType > &viscous_stress_tensor, const dealii::Tensor<1,PHILIP_DIM,FadType > &heat_flux) const;
1002 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<FadType >(const dealii::Tensor<1,PHILIP_DIM,FadType > &vel, const dealii::Tensor<2,PHILIP_DIM,FadType > &viscous_stress_tensor, const dealii::Tensor<1,PHILIP_DIM,FadType > &heat_flux) const;
1003 // -- compute_strain_rate_tensor()
1004 template dealii::Tensor<2,PHILIP_DIM,double > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::compute_strain_rate_tensor<double > (const dealii::Tensor<2,PHILIP_DIM,double > &vel_gradient) const;
1005 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadType >::compute_strain_rate_tensor<FadType > (const dealii::Tensor<2,PHILIP_DIM,FadType > &vel_gradient) const;
1006 template dealii::Tensor<2,PHILIP_DIM,RadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::compute_strain_rate_tensor<RadType > (const dealii::Tensor<2,PHILIP_DIM,RadType > &vel_gradient) const;
1007 template dealii::Tensor<2,PHILIP_DIM,FadFadType> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::compute_strain_rate_tensor<FadFadType> (const dealii::Tensor<2,PHILIP_DIM,FadFadType> &vel_gradient) const;
1008 template dealii::Tensor<2,PHILIP_DIM,RadFadType> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::compute_strain_rate_tensor<RadFadType> (const dealii::Tensor<2,PHILIP_DIM,RadFadType> &vel_gradient) const;
1009 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in classes derived from LargeEddySimulationBase
1010 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::compute_strain_rate_tensor<FadType > (const dealii::Tensor<2,PHILIP_DIM,FadType > &vel_gradient) const;
1011 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::compute_strain_rate_tensor<FadType > (const dealii::Tensor<2,PHILIP_DIM,FadType > &vel_gradient) const;
1012 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::compute_strain_rate_tensor<FadType > (const dealii::Tensor<2,PHILIP_DIM,FadType > &vel_gradient) const;
1013 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::compute_strain_rate_tensor<FadType > (const dealii::Tensor<2,PHILIP_DIM,FadType > &vel_gradient) const;
1014 // -- extract_velocities_gradient_from_primitive_solution_gradient()
1015 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in classes derived from LargeEddySimulationBase
1016 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::extract_velocities_gradient_from_primitive_solution_gradient<FadType > (const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1017 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::extract_velocities_gradient_from_primitive_solution_gradient<FadType > (const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1018 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::extract_velocities_gradient_from_primitive_solution_gradient<FadType > (const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1019 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::extract_velocities_gradient_from_primitive_solution_gradient<FadType > (const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1020 // -- compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor()
1021 template dealii::Tensor<2,PHILIP_DIM,double > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<double > (const double scaled_viscosity_coefficient, const dealii::Tensor<2,PHILIP_DIM,double > &strain_rate_tensor) const;
1022 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadType >::compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<FadType > (const FadType scaled_viscosity_coefficient, const dealii::Tensor<2,PHILIP_DIM,FadType > &strain_rate_tensor) const;
1023 template dealii::Tensor<2,PHILIP_DIM,RadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<RadType > (const RadType scaled_viscosity_coefficient, const dealii::Tensor<2,PHILIP_DIM,RadType > &strain_rate_tensor) const;
1024 template dealii::Tensor<2,PHILIP_DIM,FadFadType> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<FadFadType> (const FadFadType scaled_viscosity_coefficient, const dealii::Tensor<2,PHILIP_DIM,FadFadType> &strain_rate_tensor) const;
1025 template dealii::Tensor<2,PHILIP_DIM,RadFadType> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<RadFadType> (const RadFadType scaled_viscosity_coefficient, const dealii::Tensor<2,PHILIP_DIM,RadFadType> &strain_rate_tensor) const;
1026 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in classes derived from LargeEddySimulationBase
1027 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<FadType > (const FadType scaled_viscosity_coefficient, const dealii::Tensor<2,PHILIP_DIM,FadType > &strain_rate_tensor) const;
1028 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<FadType > (const FadType scaled_viscosity_coefficient, const dealii::Tensor<2,PHILIP_DIM,FadType > &strain_rate_tensor) const;
1029 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<FadType > (const FadType scaled_viscosity_coefficient, const dealii::Tensor<2,PHILIP_DIM,FadType > &strain_rate_tensor) const;
1030 template dealii::Tensor<2,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<FadType > (const FadType scaled_viscosity_coefficient, const dealii::Tensor<2,PHILIP_DIM,FadType > &strain_rate_tensor) const;
1031 // -- convert_conservative_gradient_to_primitive_gradient()
1032 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in classes derived from LargeEddySimulationBase
1033 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::convert_conservative_gradient_to_primitive_gradient<FadType >(const std::array<FadType ,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &conservative_soln_gradient) const;
1034 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::convert_conservative_gradient_to_primitive_gradient<FadType >(const std::array<FadType ,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &conservative_soln_gradient) const;
1035 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::convert_conservative_gradient_to_primitive_gradient<FadType >(const std::array<FadType ,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &conservative_soln_gradient) const;
1036 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::convert_conservative_gradient_to_primitive_gradient<FadType >(const std::array<FadType ,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &conservative_soln_gradient) const;
1037 // -- compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient()
1038 template dealii::Tensor<1,PHILIP_DIM,double > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<double > (const double scaled_heat_conductivity, const dealii::Tensor<1,PHILIP_DIM,double > &temperature_gradient) const;
1039 template dealii::Tensor<1,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadType >::compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<FadType > (const FadType scaled_heat_conductivity, const dealii::Tensor<1,PHILIP_DIM,FadType > &temperature_gradient) const;
1040 template dealii::Tensor<1,PHILIP_DIM,RadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<RadType > (const RadType scaled_heat_conductivity, const dealii::Tensor<1,PHILIP_DIM,RadType > &temperature_gradient) const;
1041 template dealii::Tensor<1,PHILIP_DIM,FadFadType> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<FadFadType> (const FadFadType scaled_heat_conductivity, const dealii::Tensor<1,PHILIP_DIM,FadFadType> &temperature_gradient) const;
1042 template dealii::Tensor<1,PHILIP_DIM,RadFadType> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<RadFadType> (const RadFadType scaled_heat_conductivity, const dealii::Tensor<1,PHILIP_DIM,RadFadType> &temperature_gradient) const;
1043 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in classes derived from LargeEddySimulationBase
1044 template dealii::Tensor<1,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<FadType > (const FadType scaled_heat_conductivity, const dealii::Tensor<1,PHILIP_DIM,FadType > &temperature_gradient) const;
1045 template dealii::Tensor<1,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<FadType > (const FadType scaled_heat_conductivity, const dealii::Tensor<1,PHILIP_DIM,FadType > &temperature_gradient) const;
1046 template dealii::Tensor<1,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<FadType > (const FadType scaled_heat_conductivity, const dealii::Tensor<1,PHILIP_DIM,FadType > &temperature_gradient) const;
1047 template dealii::Tensor<1,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<FadType > (const FadType scaled_heat_conductivity, const dealii::Tensor<1,PHILIP_DIM,FadType > &temperature_gradient) const;
1048 // -- compute_scaled_heat_conductivity_given_scaled_viscosity_coefficient_and_prandtl_number()
1049 template double NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::compute_scaled_heat_conductivity_given_scaled_viscosity_coefficient_and_prandtl_number<double > (const double scaled_viscosity_coefficient, const double prandtl_number_input) const;
1054 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in classes derived from LargeEddySimulationBase
1059 // -- compute_temperature_gradient()
1060 template dealii::Tensor<1,PHILIP_DIM,double > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::compute_temperature_gradient<double >(const std::array<double ,PHILIP_DIM+2> &primitive_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,double >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1061 template dealii::Tensor<1,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadType >::compute_temperature_gradient<FadType >(const std::array<FadType ,PHILIP_DIM+2> &primitive_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1062 template dealii::Tensor<1,PHILIP_DIM,RadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::compute_temperature_gradient<RadType >(const std::array<RadType ,PHILIP_DIM+2> &primitive_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,RadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1063 template dealii::Tensor<1,PHILIP_DIM,FadFadType> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::compute_temperature_gradient<FadFadType>(const std::array<FadFadType,PHILIP_DIM+2> &primitive_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadFadType>,PHILIP_DIM+2> &primitive_soln_gradient) const;
1064 template dealii::Tensor<1,PHILIP_DIM,RadFadType> NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::compute_temperature_gradient<RadFadType>(const std::array<RadFadType,PHILIP_DIM+2> &primitive_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,RadFadType>,PHILIP_DIM+2> &primitive_soln_gradient) const;
1065 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in classes derived from LargeEddySimulationBase
1066 template dealii::Tensor<1,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double >::compute_temperature_gradient<FadType >(const std::array<FadType ,PHILIP_DIM+2> &primitive_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1067 template dealii::Tensor<1,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType >::compute_temperature_gradient<FadType >(const std::array<FadType ,PHILIP_DIM+2> &primitive_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1068 template dealii::Tensor<1,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::compute_temperature_gradient<FadType >(const std::array<FadType ,PHILIP_DIM+2> &primitive_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1069 template dealii::Tensor<1,PHILIP_DIM,FadType > NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::compute_temperature_gradient<FadType >(const std::array<FadType ,PHILIP_DIM+2> &primitive_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &primitive_soln_gradient) const;
1070 // -- compute_viscosity_coefficient()
1071 template double NavierStokes < PHILIP_DIM, PHILIP_DIM+2, double >::compute_viscosity_coefficient< double >(const std::array<double ,PHILIP_DIM+2> &primitive_soln) const;
1072 template FadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, FadType >::compute_viscosity_coefficient< FadType >(const std::array<FadType ,PHILIP_DIM+2> &primitive_soln) const;
1073 template RadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, RadType >::compute_viscosity_coefficient< RadType >(const std::array<RadType ,PHILIP_DIM+2> &primitive_soln) const;
1074 template FadFadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, FadFadType>::compute_viscosity_coefficient< FadFadType >(const std::array<FadFadType,PHILIP_DIM+2> &primitive_soln) const;
1075 template RadFadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, RadFadType>::compute_viscosity_coefficient< RadFadType >(const std::array<RadFadType,PHILIP_DIM+2> &primitive_soln) const;
1076 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in classes derived from ModelBase
1077 template FadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, double >::compute_viscosity_coefficient< FadType >(const std::array<FadType,PHILIP_DIM+2> &primitive_soln) const;
1078 template FadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, RadType >::compute_viscosity_coefficient< FadType >(const std::array<FadType,PHILIP_DIM+2> &primitive_soln) const;
1079 template FadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, FadFadType>::compute_viscosity_coefficient< FadType >(const std::array<FadType,PHILIP_DIM+2> &primitive_soln) const;
1080 template FadType NavierStokes < PHILIP_DIM, PHILIP_DIM+2, RadFadType>::compute_viscosity_coefficient< FadType >(const std::array<FadType,PHILIP_DIM+2> &primitive_soln) const;
1081 // -- compute_vorticity()
1082 template dealii::Tensor<1,3,double > NavierStokes < PHILIP_DIM, PHILIP_DIM+2, double >::compute_vorticity< double >(const std::array<double ,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,double >,PHILIP_DIM+2> &conservative_soln_gradient) const;
1083 template dealii::Tensor<1,3,FadType > NavierStokes < PHILIP_DIM, PHILIP_DIM+2, FadType >::compute_vorticity< FadType >(const std::array<FadType ,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType >,PHILIP_DIM+2> &conservative_soln_gradient) const;
1084 template dealii::Tensor<1,3,RadType > NavierStokes < PHILIP_DIM, PHILIP_DIM+2, RadType >::compute_vorticity< RadType >(const std::array<RadType ,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,RadType >,PHILIP_DIM+2> &conservative_soln_gradient) const;
1085 template dealii::Tensor<1,3,FadFadType> NavierStokes < PHILIP_DIM, PHILIP_DIM+2, FadFadType>::compute_vorticity< FadFadType >(const std::array<FadFadType,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadFadType>,PHILIP_DIM+2> &conservative_soln_gradient) const;
1086 template dealii::Tensor<1,3,RadFadType> NavierStokes < PHILIP_DIM, PHILIP_DIM+2, RadFadType>::compute_vorticity< RadFadType >(const std::array<RadFadType,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,RadFadType>,PHILIP_DIM+2> &conservative_soln_gradient) const;
1087 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in classes derived from ModelBase
1088 template dealii::Tensor<1,3,FadType> NavierStokes < PHILIP_DIM, PHILIP_DIM+2, double >::compute_vorticity< FadType >(const std::array<FadType,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType>,PHILIP_DIM+2> &conservative_soln_gradient) const;
1089 template dealii::Tensor<1,3,FadType> NavierStokes < PHILIP_DIM, PHILIP_DIM+2, RadType >::compute_vorticity< FadType >(const std::array<FadType,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType>,PHILIP_DIM+2> &conservative_soln_gradient) const;
1090 template dealii::Tensor<1,3,FadType> NavierStokes < PHILIP_DIM, PHILIP_DIM+2, FadFadType>::compute_vorticity< FadType >(const std::array<FadType,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType>,PHILIP_DIM+2> &conservative_soln_gradient) const;
1091 template dealii::Tensor<1,3,FadType> NavierStokes < PHILIP_DIM, PHILIP_DIM+2, RadFadType>::compute_vorticity< FadType >(const std::array<FadType,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,FadType>,PHILIP_DIM+2> &conservative_soln_gradient) const;
1092 
1093 
1094 } // Physics namespace
1095 } // PHiLiP namespace
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Definition: ADTypes.hpp:12
NavierStokes(const Parameters::AllParameters *const parameters_input, const double ref_length, const double gamma_gas, const double mach_inf, const double angle_of_attack, const double side_slip_angle, const double prandtl_number, const double reynolds_number_inf, const bool use_constant_viscosity, const double constant_viscosity, const double temperature_inf=273.15, const double isothermal_wall_temperature=1.0, const thermal_boundary_condition_enum thermal_boundary_condition_type=thermal_boundary_condition_enum::adiabatic, std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function=nullptr, const two_point_num_flux_enum two_point_num_flux_type=two_point_num_flux_enum::KG)
Constructor.
Sacado::Fad::DFad< double > FadType
Sacado AD type for first derivatives.
Definition: ADTypes.hpp:11
Manufactured solution used for grid studies to check convergence orders.
codi_JacobianComputationType RadType
CoDiPaco reverse-AD type for first derivatives.
Definition: ADTypes.hpp:27
Files for the baseline physics.
Definition: ADTypes.hpp:10
Main parameter class that contains the various other sub-parameter classes.
TwoPointNumericalFlux
Two point numerical flux type for split form.
Euler equations. Derived from PhysicsBase.
Definition: euler.h:78
ThermalBoundaryCondition
Types of thermal boundary conditions available.
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