[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
reynolds_averaged_navier_stokes.cpp
1 #include <cmath>
2 #include <vector>
3 #include <complex> // for the jacobian
4 #include <boost/preprocessor/seq/for_each.hpp>
5 
6 #include "ADTypes.hpp"
7 
8 #include "model.h"
9 #include "reynolds_averaged_navier_stokes.h"
10 
11 namespace PHiLiP {
12 namespace Physics {
13 
14 //================================================================
15 // Reynolds Averaged Navier Stokes (RANS) Base Class
16 //================================================================
17 template <int dim, int nspecies, int nstate, typename real>
19  const Parameters::AllParameters *const parameters_input,
20  const double ref_length,
21  const double gamma_gas,
22  const double mach_inf,
23  const double angle_of_attack,
24  const double side_slip_angle,
25  const double prandtl_number,
26  const double reynolds_number_inf,
27  const bool use_constant_viscosity,
28  const double constant_viscosity,
29  const double turbulent_prandtl_number,
30  const double temperature_inf,
31  const double isothermal_wall_temperature,
32  const thermal_boundary_condition_enum thermal_boundary_condition_type,
33  std::shared_ptr< ManufacturedSolutionFunction<dim,nspecies,real> > manufactured_solution_function,
34  const two_point_num_flux_enum two_point_num_flux_type)
35  : ModelBase<dim,nspecies,nstate,real>(manufactured_solution_function)
36  , turbulent_prandtl_number(turbulent_prandtl_number)
37  , navier_stokes_physics(std::make_unique < NavierStokes<dim,nspecies,nstate_navier_stokes,real> > (
38  parameters_input,
39  ref_length,
40  gamma_gas,
41  mach_inf,
42  angle_of_attack,
43  side_slip_angle,
44  prandtl_number,
45  reynolds_number_inf,
46  use_constant_viscosity,
47  constant_viscosity,
48  temperature_inf,
49  isothermal_wall_temperature,
50  thermal_boundary_condition_type,
51  manufactured_solution_function,
52  two_point_num_flux_type))
53 {
54  static_assert(nstate>=dim+3, "ModelBase::ReynoldsAveragedNavierStokesBase() should be created with nstate>=dim+3");
55 }
56 //----------------------------------------------------------------
57 template <int dim, int nspecies, int nstate, typename real>
58 template<typename real2>
61  const dealii::Tensor<1,3,real2> &vector) const
62 {
63  real2 vector_magnitude_sqr; // complex initializes it as 0+0i
64  if(std::is_same<real2,real>::value){
65  vector_magnitude_sqr = 0.0;
66  }
67  for (int i=0; i<3; ++i) {
68  vector_magnitude_sqr += vector[i]*vector[i];
69  }
70  return vector_magnitude_sqr;
71 }
72 //----------------------------------------------------------------
73 template <int dim, int nspecies, int nstate, typename real>
74 template<typename real2>
77  const dealii::Tensor<2,dim,real2> &tensor) const
78 {
79  real2 tensor_magnitude_sqr; // complex initializes it as 0+0i
80  if(std::is_same<real2,real>::value){
81  tensor_magnitude_sqr = 0.0;
82  }
83  for (int i=0; i<dim; ++i) {
84  for (int j=0; j<dim; ++j) {
85  tensor_magnitude_sqr += tensor[i][j]*tensor[i][j];
86  }
87  }
88  return tensor_magnitude_sqr;
89 }
90 //----------------------------------------------------------------
91 template <int dim, int nspecies, int nstate, typename real>
92 std::array<dealii::Tensor<1,dim,real>,nstate> ReynoldsAveragedNavierStokesBase<dim,nspecies,nstate,real>
94  const std::array<real,nstate> &conservative_soln) const
95 {
96  return convective_flux_templated<real>(conservative_soln);
97 }
98 //----------------------------------------------------------------
99 template <int dim, int nspecies, int nstate, typename real>
100 template <typename real2>
101 std::array<dealii::Tensor<1,dim,real2>,nstate> ReynoldsAveragedNavierStokesBase<dim,nspecies,nstate,real>
103  const std::array<real2,nstate> &conservative_soln) const
104 {
105  const std::array<real2,nstate_navier_stokes> conservative_soln_rans = extract_rans_conservative_solution(conservative_soln);
106  const dealii::Tensor<1,dim,real2> vel = this->navier_stokes_physics->template compute_velocities<real2>(conservative_soln_rans); // from Euler
107  std::array<dealii::Tensor<1,dim,real2>,nstate> conv_flux;
108 
109  for (int flux_dim=0; flux_dim<nstate_navier_stokes; ++flux_dim) {
110  conv_flux[flux_dim] = 0.0; // No additional convective terms for RANS
111  }
112  // convective flux of additional RANS turbulence model
113  for (int flux_dim=nstate_navier_stokes; flux_dim<nstate; ++flux_dim) {
114  for (int velocity_dim=0; velocity_dim<dim; ++velocity_dim) {
115  conv_flux[flux_dim][velocity_dim] = conservative_soln[flux_dim]*vel[velocity_dim]; // Convective terms for turbulence model
116  }
117  }
118  return conv_flux;
119 }
120 //----------------------------------------------------------------
121 template <int dim, int nspecies, int nstate, typename real>
122 std::array<dealii::Tensor<1,dim,real>,nstate> ReynoldsAveragedNavierStokesBase<dim,nspecies,nstate,real>
124  const std::array<real,nstate> &conservative_soln,
125  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
126  const dealii::types::global_dof_index cell_index) const
127 {
128  return dissipative_flux_templated<real>(conservative_soln,solution_gradient,cell_index);
129 }
130 //----------------------------------------------------------------
131 template <int dim, int nspecies, int nstate, typename real>
132 template <typename real2>
133 std::array<dealii::Tensor<1,dim,real2>,nstate> ReynoldsAveragedNavierStokesBase<dim,nspecies,nstate,real>
135  const std::array<real2,nstate> &conservative_soln,
136  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
137  const dealii::types::global_dof_index /*cell_index*/) const
138 {
139 
140  const std::array<real2,nstate_navier_stokes> conservative_soln_rans = extract_rans_conservative_solution(conservative_soln);
141  const std::array<dealii::Tensor<1,dim,real2>,nstate_navier_stokes> solution_gradient_rans = extract_rans_solution_gradient(solution_gradient);
142 
143  // Step 1,2: Primitive solution and Gradient of primitive solution
144  const std::array<real2,nstate_navier_stokes> primitive_soln_rans = this->navier_stokes_physics->convert_conservative_to_primitive_templated(conservative_soln_rans); // from Euler
145  const std::array<dealii::Tensor<1,dim,real2>,nstate_navier_stokes> primitive_soln_gradient_rans = this->navier_stokes_physics->convert_conservative_gradient_to_primitive_gradient_templated(conservative_soln_rans, solution_gradient_rans);
146  const std::array<real2,nstate_turbulence_model> primitive_soln_turbulence_model = this->convert_conservative_to_primitive_turbulence_model(conservative_soln);
147  const std::array<dealii::Tensor<1,dim,real2>,nstate_turbulence_model> primitive_soln_gradient_turbulence_model = this->convert_conservative_gradient_to_primitive_gradient_turbulence_model(conservative_soln, solution_gradient);
148 
149  // Step 3: Viscous stress tensor, Velocities, Heat flux
150  const dealii::Tensor<1,dim,real2> vel = this->navier_stokes_physics->extract_velocities_from_primitive(primitive_soln_rans); // from Euler
151  // Templated virtual member functions
152  dealii::Tensor<2,dim,real2> viscous_stress_tensor;
153  dealii::Tensor<1,dim,real2> heat_flux;
154  if constexpr(std::is_same<real2,real>::value){
155  viscous_stress_tensor = compute_Reynolds_stress_tensor(primitive_soln_rans, primitive_soln_gradient_rans,primitive_soln_turbulence_model);
156  heat_flux = compute_Reynolds_heat_flux(primitive_soln_rans, primitive_soln_gradient_rans,primitive_soln_turbulence_model);
157  }
158  else if constexpr(std::is_same<real2,FadType>::value){
159  viscous_stress_tensor = compute_Reynolds_stress_tensor_fad(primitive_soln_rans, primitive_soln_gradient_rans,primitive_soln_turbulence_model);
160  heat_flux = compute_Reynolds_heat_flux_fad(primitive_soln_rans, primitive_soln_gradient_rans,primitive_soln_turbulence_model);
161  }
162  else{
163  std::cout << "ERROR in physics/reynolds_averaged_navier_stokes.cpp --> dissipative_flux_templated(): real2!=real || real2!=FadType)" << std::endl;
164  std::abort();
165  }
166 
167  // Step 4: Construct viscous flux; Note: sign corresponds to LHS
168  std::array<dealii::Tensor<1,dim,real2>,nstate_navier_stokes> viscous_flux_rans
169  = this->navier_stokes_physics->dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux(vel,viscous_stress_tensor,heat_flux);
170 
171  std::array<dealii::Tensor<1,dim,real2>,nstate_turbulence_model> viscous_flux_turbulence_model
172  = this->dissipative_flux_turbulence_model(primitive_soln_rans,primitive_soln_turbulence_model,primitive_soln_gradient_turbulence_model);
173 
174  std::array<dealii::Tensor<1,dim,real2>,nstate> viscous_flux;
175  for(int flux_dim=0; flux_dim<nstate_navier_stokes; ++flux_dim)
176  {
177  viscous_flux[flux_dim] = viscous_flux_rans[flux_dim];
178  }
179  for(int flux_dim=nstate_navier_stokes; flux_dim<nstate; ++flux_dim)
180  {
181  viscous_flux[flux_dim] = viscous_flux_turbulence_model[flux_dim-(nstate_navier_stokes)];
182  }
183 
184  return viscous_flux;
185 }
186 //----------------------------------------------------------------
187 template <int dim, int nspecies, int nstate, typename real>
190  const std::array<real,nstate> &solution,
191  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
192  const std::array<real,nstate> &/*filtered_solution*/,
193  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*filtered_solution_gradient*/,
194  const bool /*on_boundary*/,
195  const dealii::types::global_dof_index cell_index,
196  const dealii::Tensor<1,dim,real> &normal,
197  const int /*boundary_type*/) const
198 {
199  const std::array<dealii::Tensor<1,dim,real>,nstate> dissipative_flux = dissipative_flux_templated<real>(solution,solution_gradient,cell_index);
200 
201  std::array<real,nstate> dissipative_flux_dot_normal;
202  dissipative_flux_dot_normal.fill(0.0); // initialize
203  // compute the dot product with the normal vector
204  for (int s=0; s<nstate; s++) {
205  for (int d=0; d<dim; ++d) {
206  dissipative_flux_dot_normal[s] += dissipative_flux[s][d] * normal[d];//compute dot product
207  }
208  }
209 
211 }
212 //----------------------------------------------------------------
213 template <int dim, int nspecies, int nstate, typename real>
214 template <typename real2>
217  const std::array<real2,nstate> &conservative_soln) const
218 {
219  std::array<real2,nstate_navier_stokes> conservative_soln_rans;
220  for(int i=0; i<nstate_navier_stokes; ++i){
221  conservative_soln_rans[i] = conservative_soln[i];
222  }
223 
224  return conservative_soln_rans;
225 }
226 //----------------------------------------------------------------
227 template <int dim, int nspecies, int nstate, typename real>
228 template <typename real2>
229 std::array<dealii::Tensor<1,dim,real2>,dim+2> ReynoldsAveragedNavierStokesBase<dim,nspecies,nstate,real>
231  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient) const
232 {
233  std::array<dealii::Tensor<1,dim,real2>,nstate_navier_stokes> solution_gradient_rans;
234  for(int i=0; i<nstate_navier_stokes; ++i){
235  solution_gradient_rans[i] = solution_gradient[i];
236  }
237 
238  return solution_gradient_rans;
239 }
240 //----------------------------------------------------------------
241 template <int dim, int nspecies, int nstate, typename real>
242 template <typename real2>
243 std::array<dealii::Tensor<1,dim,real2>,nstate-(dim+2)> ReynoldsAveragedNavierStokesBase<dim,nspecies,nstate,real>
245  const std::array<real2,nstate_navier_stokes> &primitive_soln_rans,
246  const std::array<real2,nstate_turbulence_model> &primitive_soln_turbulence_model,
247  const std::array<dealii::Tensor<1,dim,real2>,nstate_turbulence_model> &primitive_solution_gradient_turbulence_model) const
248 {
249  std::array<real2,nstate_turbulence_model> effective_viscosity_turbulence_model;
250 
251  if constexpr(std::is_same<real2,real>::value){
252  effective_viscosity_turbulence_model = compute_effective_viscosity_turbulence_model(primitive_soln_rans, primitive_soln_turbulence_model);
253  }
254  else if constexpr(std::is_same<real2,FadType>::value){
255  effective_viscosity_turbulence_model = compute_effective_viscosity_turbulence_model_fad(primitive_soln_rans, primitive_soln_turbulence_model);
256  }
257  else{
258  std::cout << "ERROR in physics/reynolds_averaged_navier_stokes.cpp --> dissipative_flux_turbulence_model(): real2!=real || real2!=FadType)" << std::endl;
259  std::abort();
260  }
261 
262  std::array<dealii::Tensor<1,dim,real2>,nstate_turbulence_model> viscous_flux_turbulence_model;
263 
264  for(int i=0; i<nstate_turbulence_model; ++i){
265  for(int j=0; j<dim; ++j){
266  viscous_flux_turbulence_model[i][j] = -effective_viscosity_turbulence_model[i]*primitive_solution_gradient_turbulence_model[i][j];
267  }
268  }
269 
270  return viscous_flux_turbulence_model;
271 }
272 //----------------------------------------------------------------
273 template <int dim, int nspecies, int nstate, typename real>
274 template <typename real2>
275 std::array<real2,nstate-(dim+2)> ReynoldsAveragedNavierStokesBase<dim,nspecies,nstate,real>
277  const std::array<real2,nstate> &conservative_soln) const
278 {
279  std::array<real2,nstate_turbulence_model> primitive_soln_turbulence_model;
280  for(int i=0; i<nstate_turbulence_model; ++i){
281  primitive_soln_turbulence_model[i] = conservative_soln[nstate_navier_stokes+i]/conservative_soln[0];
282  }
283 
284  return primitive_soln_turbulence_model;
285 }
286 //----------------------------------------------------------------
287 template <int dim, int nspecies, int nstate, typename real>
288 template <typename real2>
289 std::array<dealii::Tensor<1,dim,real2>,nstate-(dim+2)> ReynoldsAveragedNavierStokesBase<dim,nspecies,nstate,real>
291  const std::array<real2,nstate> &conservative_soln,
292  const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient) const
293 {
294  const std::array<real2,nstate_turbulence_model> primitive_soln_turbulence_model = this->convert_conservative_to_primitive_turbulence_model(conservative_soln);
295  std::array<dealii::Tensor<1,dim,real2>,nstate_turbulence_model> primitive_soln_gradient_turbulence_model;
296 
297  for(int i=0; i<nstate_turbulence_model; ++i){
298  for(int j=0; j<dim; ++j){
299  primitive_soln_gradient_turbulence_model[i][j] = (solution_gradient[nstate_navier_stokes+i][j]-primitive_soln_turbulence_model[i]*solution_gradient[0][j])/conservative_soln[0];
300  }
301  }
302 
303  return primitive_soln_gradient_turbulence_model;
304 }
305 //----------------------------------------------------------------
306 template <int dim, int nspecies, int nstate, typename real>
308 ::compute_mean_turbulence_property(const std::array<real,nstate> &conservative_soln1,
309  const std::array<real,nstate> &conservative_soln2) const
310 {
311  std::array<real,nstate_turbulence_model> mean_turbulence_property;
312 
313  const std::array<real,nstate_turbulence_model> primitive_soln1_turbulence_model = convert_conservative_to_primitive_turbulence_model(conservative_soln1);
314  const std::array<real,nstate_turbulence_model> primitive_soln2_turbulence_model = convert_conservative_to_primitive_turbulence_model(conservative_soln2);
315 
316  for (int i=0;i<nstate_turbulence_model;++i){
317  mean_turbulence_property[i] = (primitive_soln1_turbulence_model[i]+primitive_soln2_turbulence_model[i])/2.0;
318  }
319 
320  return mean_turbulence_property;
321 }
322 //----------------------------------------------------------------
323 template <int dim, int nspecies, int nstate, typename real>
326  const std::array<real,nstate> &conservative_soln,
327  const dealii::Tensor<1,dim,real> &normal) const
328 {
329  const std::array<real,nstate_navier_stokes> conservative_soln_rans = extract_rans_conservative_solution(conservative_soln);
330  std::array<real,nstate> eig;
331  const real vel_dot_n = this->navier_stokes_physics->convective_eigenvalues(conservative_soln_rans,normal)[0];
332  for (int i=0; i<nstate_navier_stokes; ++i) {
333  eig[i] = 0.0;
334  }
335  for (int i=nstate_navier_stokes; i<nstate; ++i) {
336  eig[i] = vel_dot_n;
337  }
338  return eig;
339 }
340 //----------------------------------------------------------------
341 template <int dim, int nspecies, int nstate, typename real>
343 ::max_convective_eigenvalue (const std::array<real,nstate> &conservative_soln) const
344 {
345  const std::array<real,nstate_navier_stokes> conservative_soln_rans = extract_rans_conservative_solution(conservative_soln);
346 
347  const dealii::Tensor<1,dim,real> vel = this->navier_stokes_physics->template compute_velocities<real>(conservative_soln_rans);
348 
349  const real vel2 = this->navier_stokes_physics->template compute_velocity_squared<real>(vel);
350 
351  const real max_eig = sqrt(vel2);
352 
353  return max_eig;
354 }
355 //----------------------------------------------------------------
356 template <int dim, int nspecies, int nstate, typename real>
359  const std::array<real,nstate> &conservative_soln,
360  const dealii::Tensor<1,dim,real> &normal) const
361 {
362  const std::array<real,nstate_navier_stokes> conservative_soln_rans = extract_rans_conservative_solution(conservative_soln);
363 
364  const dealii::Tensor<1,dim,real> vel = this->navier_stokes_physics->template compute_velocities<real>(conservative_soln_rans);
365 
366  real vel_dot_n = 0.0;
367  for (int d=0;d<dim;++d) { vel_dot_n += vel[d]*normal[d]; };
368  const real max_normal_eig = sqrt(vel_dot_n*vel_dot_n);
369 
370  return max_normal_eig;
371 }
372 //----------------------------------------------------------------
373 template <int dim, int nspecies, int nstate, typename real>
376  const dealii::Point<dim,real> &pos,
377  const std::array<real,nstate> &conservative_soln,
378  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
379  const dealii::types::global_dof_index /*cell_index*/) const
380 {
381  std::array<real,nstate> physical_source;
382  physical_source = this->compute_production_dissipation_cross_term(pos, conservative_soln, solution_gradient);
383 
384  return physical_source;
385 }
386 //----------------------------------------------------------------
387 template <int dim, int nspecies, int nstate, typename real>
390  const dealii::Point<dim,real> &pos,
391  const std::array<real,nstate> &/*solution*/,
392  const real /*current_time*/,
393  const dealii::types::global_dof_index cell_index) const
394 {
395  std::array<real,nstate> conv_source_term = convective_source_term_computed_from_manufactured_solution(pos);
396  std::array<real,nstate> diss_source_term = dissipative_source_term_computed_from_manufactured_solution(pos,cell_index);
397  std::array<real,nstate> phys_source_source_term = physical_source_term_computed_from_manufactured_solution(pos,cell_index);
398  std::array<real,nstate> source_term;
399  for (int s=0; s<nstate; ++s)
400  {
401  source_term[s] = conv_source_term[s] + diss_source_term[s] - phys_source_source_term[s];
402  }
403  return source_term;
404 }
405 
406 //----------------------------------------------------------------
407 template <int dim, int nspecies, int nstate, typename real>
410  const dealii::Point<dim,real> &pos,
411  const std::array<real,nstate> &/*solution*/,
412  const dealii::types::global_dof_index cell_index) const
413 {
414  std::array<real,nstate> conv_source_term = convective_source_term_computed_from_manufactured_solution(pos);
415  std::array<real,nstate> diss_source_term = dissipative_source_term_computed_from_manufactured_solution(pos,cell_index);
416  std::array<real,nstate> convective_dissipative_source_term;
417  for (int s=0; s<nstate; ++s)
418  {
419  convective_dissipative_source_term[s] = conv_source_term[s] + diss_source_term[s];
420  }
422 }
423 
424 // Returns the value from a CoDiPack or Sacado variable.
425 template<typename real>
426 double getValue(const real &x) {
427  if constexpr(std::is_same<real,double>::value) {
428  return x;
429  }
430  else if constexpr(std::is_same<real,FadType>::value) {
431  return x.val(); // sacado
432  }
433  else if constexpr(std::is_same<real,FadFadType>::value) {
434  return x.val().val(); // sacado
435  }
436  else if constexpr(std::is_same<real,RadType>::value) {
437  return x.value(); // CoDiPack
438  }
439  else if(std::is_same<real,RadFadType>::value) {
440  return x.value().value(); // CoDiPack
441  }
442 }
443 //----------------------------------------------------------------
444 template <int dim, int nspecies, int nstate, typename real>
447  const std::array<real,nstate> &conservative_soln,
448  const dealii::Tensor<1,dim,real> &normal) const
449 {
450  using adtype = FadType;
451 
452  // Initialize AD objects
453  std::array<adtype,nstate> AD_conservative_soln;
454  for (int s=0; s<nstate; ++s) {
455  adtype ADvar(nstate, s, getValue<real>(conservative_soln[s])); // create AD variable
456  AD_conservative_soln[s] = ADvar;
457  }
458 
459  // Compute AD convective flux
460  std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_convective_flux = convective_flux_templated<adtype>(AD_conservative_soln);
461 
462  // Assemble the directional Jacobian
463  dealii::Tensor<2,nstate,real> jacobian;
464  for (int sp=0; sp<nstate; ++sp) {
465  // for each perturbed state (sp) variable
466  for (int s=0; s<nstate; ++s) {
467  jacobian[s][sp] = 0.0;
468  for (int d=0;d<dim;++d) {
469  // Compute directional jacobian
470  jacobian[s][sp] += AD_convective_flux[s][d].dx(sp)*normal[d];
471  }
472  }
473  }
474  return jacobian;
475 }
476 //----------------------------------------------------------------
477 template <int dim, int nspecies, int nstate, typename real>
480  const std::array<real,nstate> &conservative_soln,
481  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
482  const dealii::Tensor<1,dim,real> &normal,
483  const dealii::types::global_dof_index cell_index) const
484 {
485  using adtype = FadType;
486 
487  // Initialize AD objects
488  std::array<adtype,nstate> AD_conservative_soln;
489  std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_solution_gradient;
490  for (int s=0; s<nstate; ++s) {
491  adtype ADvar(nstate, s, getValue<real>(conservative_soln[s])); // create AD variable
492  AD_conservative_soln[s] = ADvar;
493  for (int d=0;d<dim;++d) {
494  AD_solution_gradient[s][d] = getValue<real>(solution_gradient[s][d]);
495  }
496  }
497 
498  // Compute AD dissipative flux
499  std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_dissipative_flux = dissipative_flux_templated<adtype>(AD_conservative_soln, AD_solution_gradient, cell_index);
500 
501  // Assemble the directional Jacobian
502  dealii::Tensor<2,nstate,real> jacobian;
503  for (int sp=0; sp<nstate; ++sp) {
504  // for each perturbed state (sp) variable
505  for (int s=0; s<nstate; ++s) {
506  jacobian[s][sp] = 0.0;
507  for (int d=0;d<dim;++d) {
508  // Compute directional jacobian
509  jacobian[s][sp] += AD_dissipative_flux[s][d].dx(sp)*normal[d];
510  }
511  }
512  }
513  return jacobian;
514 }
515 //----------------------------------------------------------------
516 template <int dim, int nspecies, int nstate, typename real>
519  const std::array<real,nstate> &conservative_soln,
520  const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
521  const dealii::Tensor<1,dim,real> &normal,
522  const int d_gradient,
523  const dealii::types::global_dof_index cell_index) const
524 {
525  using adtype = FadType;
526 
527  // Initialize AD objects
528  std::array<adtype,nstate> AD_conservative_soln;
529  std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_solution_gradient;
530  for (int s=0; s<nstate; ++s) {
531  AD_conservative_soln[s] = getValue<real>(conservative_soln[s]);
532  for (int d=0;d<dim;++d) {
533  if(d == d_gradient){
534  adtype ADvar(nstate, s, getValue<real>(solution_gradient[s][d])); // create AD variable
535  AD_solution_gradient[s][d] = ADvar;
536  }
537  else {
538  AD_solution_gradient[s][d] = getValue<real>(solution_gradient[s][d]);
539  }
540  }
541  }
542 
543  // Compute AD dissipative flux
544  std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_dissipative_flux = dissipative_flux_templated<adtype>(AD_conservative_soln, AD_solution_gradient, cell_index);
545 
546  // Assemble the directional Jacobian
547  dealii::Tensor<2,nstate,real> jacobian;
548  for (int sp=0; sp<nstate; ++sp) {
549  // for each perturbed state (sp) variable
550  for (int s=0; s<nstate; ++s) {
551  jacobian[s][sp] = 0.0;
552  for (int d=0;d<dim;++d) {
553  // Compute directional jacobian
554  jacobian[s][sp] += AD_dissipative_flux[s][d].dx(sp)*normal[d];
555  }
556  }
557  }
558  return jacobian;
559 }
560 //----------------------------------------------------------------
561 template <int dim, int nspecies, int nstate, typename real>
564  const dealii::Point<dim,real> &pos) const
565 {
566  std::array<real,nstate> manufactured_solution;
567  for (int s=0; s<nstate; ++s) {
568  manufactured_solution[s] = this->manufactured_solution_function->value (pos, s);
569  if (s==0) {
570  assert(manufactured_solution[s] > 0);
571  }
572  }
573  return manufactured_solution;
574 }
575 //----------------------------------------------------------------
576 template <int dim, int nspecies, int nstate, typename real>
577 std::array<dealii::Tensor<1,dim,real>,nstate> ReynoldsAveragedNavierStokesBase<dim,nspecies,nstate,real>
579  const dealii::Point<dim,real> &pos) const
580 {
581  std::vector<dealii::Tensor<1,dim,real>> manufactured_solution_gradient_dealii(nstate);
582  this->manufactured_solution_function->vector_gradient(pos,manufactured_solution_gradient_dealii);
583  std::array<dealii::Tensor<1,dim,real>,nstate> manufactured_solution_gradient;
584  for (int d=0;d<dim;++d) {
585  for (int s=0; s<nstate; ++s) {
586  manufactured_solution_gradient[s][d] = manufactured_solution_gradient_dealii[s][d];
587  }
588  }
589  return manufactured_solution_gradient;
590 }
591 //----------------------------------------------------------------
592 template <int dim, int nspecies, int nstate, typename real>
595  const dealii::Point<dim,real> &pos) const
596 {
597  // Get Manufactured Solution values
598  const std::array<real,nstate> manufactured_solution = get_manufactured_solution_value(pos);
599 
600  // Get Manufactured Solution gradient
601  const std::array<dealii::Tensor<1,dim,real>,nstate> manufactured_solution_gradient = get_manufactured_solution_gradient(pos);
602 
603  dealii::Tensor<1,nstate,real> convective_flux_divergence;
604  for (int d=0;d<dim;++d) {
605  dealii::Tensor<1,dim,real> normal;
606  normal[d] = 1.0;
607  const dealii::Tensor<2,nstate,real> jacobian = convective_flux_directional_jacobian(manufactured_solution, normal);
608 
609  //convective_flux_divergence += jacobian*manufactured_solution_gradient[d]; <-- needs second term! (jac wrt gradient)
610  for (int sr = 0; sr < nstate; ++sr) {
611  real jac_grad_row = 0.0;
612  for (int sc = 0; sc < nstate; ++sc) {
613  jac_grad_row += jacobian[sr][sc]*manufactured_solution_gradient[sc][d];
614  }
615  convective_flux_divergence[sr] += jac_grad_row;
616  }
617  }
619  for (int s=0; s<nstate; ++s) {
620  convective_source_term_computed_from_manufactured_solution[s] = convective_flux_divergence[s];
621  }
622 
624 }
625 //----------------------------------------------------------------
626 template <int dim, int nspecies, int nstate, typename real>
629  const dealii::Point<dim,real> &pos,
630  const dealii::types::global_dof_index cell_index) const
631 {
636  // Get Manufactured Solution values
637  const std::array<real,nstate> manufactured_solution = get_manufactured_solution_value(pos); // from Euler
638 
639  // Get Manufactured Solution gradient
640  const std::array<dealii::Tensor<1,dim,real>,nstate> manufactured_solution_gradient = get_manufactured_solution_gradient(pos); // from Euler
641 
642  // Get Manufactured Solution hessian
643  std::array<dealii::SymmetricTensor<2,dim,real>,nstate> manufactured_solution_hessian;
644  for (int s=0; s<nstate; ++s) {
645  dealii::SymmetricTensor<2,dim,real> hessian = this->manufactured_solution_function->hessian(pos,s);
646  for (int dr=0;dr<dim;++dr) {
647  for (int dc=0;dc<dim;++dc) {
648  manufactured_solution_hessian[s][dr][dc] = hessian[dr][dc];
649  }
650  }
651  }
652 
653  // First term -- wrt to the conservative variables
654  // This is similar, should simply provide this function a flux_directional_jacobian() -- could restructure later
655  dealii::Tensor<1,nstate,real> dissipative_flux_divergence;
656  for (int d=0;d<dim;++d) {
657  dealii::Tensor<1,dim,real> normal;
658  normal[d] = 1.0;
659  const dealii::Tensor<2,nstate,real> jacobian = dissipative_flux_directional_jacobian(manufactured_solution, manufactured_solution_gradient, normal, cell_index);
660 
661  // get the directional jacobian wrt gradient
662  std::array<dealii::Tensor<2,nstate,real>,dim> jacobian_wrt_gradient;
663  for (int d_gradient=0;d_gradient<dim;++d_gradient) {
664 
665  // get the directional jacobian wrt gradient component (x,y,z)
666  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, cell_index);
667 
668  // store each component in jacobian_wrt_gradient -- could do this in the function used above
669  for (int sr = 0; sr < nstate; ++sr) {
670  for (int sc = 0; sc < nstate; ++sc) {
671  jacobian_wrt_gradient[d_gradient][sr][sc] = jacobian_wrt_gradient_component[sr][sc];
672  }
673  }
674  }
675 
676  //dissipative_flux_divergence += jacobian*manufactured_solution_gradient[d]; <-- needs second term! (jac wrt gradient)
677  for (int sr = 0; sr < nstate; ++sr) {
678  real jac_grad_row = 0.0;
679  for (int sc = 0; sc < nstate; ++sc) {
680  jac_grad_row += jacobian[sr][sc]*manufactured_solution_gradient[sc][d]; // Euler is the same as this
681  // Second term -- wrt to the gradient of conservative variables
682  // -- add the contribution of each gradient component (e.g. x,y,z for dim==3)
683  for (int d_gradient=0;d_gradient<dim;++d_gradient) {
684  jac_grad_row += jacobian_wrt_gradient[d_gradient][sr][sc]*manufactured_solution_hessian[sc][d_gradient][d]; // symmetric so d indexing works both ways
685  }
686  }
687  dissipative_flux_divergence[sr] += jac_grad_row;
688  }
689  }
691  for (int s=0; s<nstate; ++s) {
692  dissipative_source_term_computed_from_manufactured_solution[s] = dissipative_flux_divergence[s];
693  }
694 
696 }
697 //----------------------------------------------------------------
698 template <int dim, int nspecies, int nstate, typename real>
701  const dealii::Point<dim,real> &pos,
702  const dealii::types::global_dof_index cell_index) const
703 {
704  // Get Manufactured Solution values
705  const std::array<real,nstate> manufactured_solution = get_manufactured_solution_value(pos); // from Euler
706 
707  // Get Manufactured Solution gradient
708  const std::array<dealii::Tensor<1,dim,real>,nstate> manufactured_solution_gradient = get_manufactured_solution_gradient(pos); // from Euler
709 
710  std::array<real,nstate> physical_source_source_term_computed_from_manufactured_solution;
711  for (int i=0;i<nstate;++i){
712  physical_source_source_term_computed_from_manufactured_solution = physical_source_term(pos, manufactured_solution, manufactured_solution_gradient, cell_index);
713  }
714 
715  return physical_source_source_term_computed_from_manufactured_solution;
716 }
717 //----------------------------------------------------------------
718 template <int dim, int nspecies, int nstate, typename real>
721  const dealii::Point<dim, real> &pos,
722  const dealii::Tensor<1,dim,real> &/*normal_int*/,
723  const std::array<real,nstate> &/*soln_int*/,
724  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_int*/,
725  std::array<real,nstate> &soln_bc,
726  std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc) const
727 {
728  // Manufactured solution
729  std::array<real,nstate> boundary_values;
730  std::array<dealii::Tensor<1,dim,real>,nstate> boundary_gradients;
731  for (int i=0; i<nstate; ++i) {
732  boundary_values[i] = this->manufactured_solution_function->value (pos, i);
733  boundary_gradients[i] = this->manufactured_solution_function->gradient (pos, i);
734  }
735  for (int istate=nstate_navier_stokes; istate<nstate; ++istate) {
736  soln_bc[istate] = boundary_values[istate];
737  soln_grad_bc[istate] = boundary_gradients[istate];
738  }
739 }
740 //----------------------------------------------------------------
741 //----------------------------------------------------------------
742 //----------------------------------------------------------------
743 // Instantiate explicitly
744 #if PHILIP_SPECIES==1
745  // Define a sequence of possible types
746  #define POSSIBLE_TYPES (double)(FadType)(RadType)(FadFadType)(RadFadType)
747 
748  // Define a macro to instantiate RANS and RANS functions for a specific type
749  #define INSTANTIATE_TYPES(r, data, type) \
750  template class ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >; \
751  template type ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::get_tensor_magnitude_sqr< type >(const dealii::Tensor<2,PHILIP_DIM,type> &tensor) const; \
752  template type ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::get_vector_magnitude_sqr< type >(const dealii::Tensor<1,3,type> &vector) const; \
753  template std::array<type,PHILIP_DIM+2> ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::extract_rans_conservative_solution< type >(const std::array<type,PHILIP_DIM+3> &conservative_soln) const; \
754  template std::array<dealii::Tensor<1,PHILIP_DIM, type >,PHILIP_DIM+2> ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::extract_rans_solution_gradient< type >(const std::array<dealii::Tensor<1,PHILIP_DIM, type >,PHILIP_DIM+3> &solution_gradient) const; \
755  template std::array<type,1> ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::convert_conservative_to_primitive_turbulence_model< type >(const std::array<type,PHILIP_DIM+3> &conservative_soln) const; \
756  template std::array<dealii::Tensor<1,PHILIP_DIM, type>,1> ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::convert_conservative_gradient_to_primitive_gradient_turbulence_model< type >(const std::array<type, PHILIP_DIM+3> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM, type >,PHILIP_DIM+3> &solution_gradient) const;
757  BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_TYPES, _, POSSIBLE_TYPES)
758 
759 // -- -- instantiate all the real types with real2 = FadType for automatic differentiation in NavierStokes::dissipative_flux_directional_jacobian()
760  #undef POSSIBLE_TYPES
761  #define POSSIBLE_TYPES (double)(RadType)(FadFadType)(RadFadType)
762  // Define a macro to instantiate Euler and Euler functions for a specific type
763  #define INSTANTIATE_FADTYPES(r, data, type) \
764  template FadType ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::get_tensor_magnitude_sqr< FadType >(const dealii::Tensor<2,PHILIP_DIM, FadType> &tensor) const; \
765  template FadType ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::get_vector_magnitude_sqr< FadType >(const dealii::Tensor<1,3,FadType> &vector) const; \
766  template std::array<FadType, PHILIP_DIM+2> ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::extract_rans_conservative_solution< FadType >(const std::array<FadType, PHILIP_DIM+3> &conservative_soln) const; \
767  template std::array<dealii::Tensor<1,PHILIP_DIM, FadType>,PHILIP_DIM+2> ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::extract_rans_solution_gradient< FadType >(const std::array<dealii::Tensor<1,PHILIP_DIM, FadType>,PHILIP_DIM+3> &solution_gradient) const; \
768  template std::array<FadType, 1> ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::convert_conservative_to_primitive_turbulence_model< FadType >(const std::array<FadType, PHILIP_DIM+3> &conservative_soln) const; \
769  template std::array<dealii::Tensor<1,PHILIP_DIM, FadType>,1> ReynoldsAveragedNavierStokesBase < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+3, type >::convert_conservative_gradient_to_primitive_gradient_turbulence_model< FadType >(const std::array<FadType, PHILIP_DIM+3> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM, FadType>,PHILIP_DIM+3> &solution_gradient) const;
770  BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_FADTYPES, _, POSSIBLE_TYPES)
771 //==============================================================================
772 #endif
773 } // Physics namespace
774 } // PHiLiP namespace
std::array< real, nstate > convective_eigenvalues(const std::array< real, nstate > &, const dealii::Tensor< 1, dim, real > &) const
Convective eigenvalues of the additional models&#39; PDEs.
virtual dealii::Tensor< 2, dim, real > compute_Reynolds_stress_tensor(const std::array< real, nstate_navier_stokes > &primitive_soln_rans, const std::array< dealii::Tensor< 1, dim, real >, nstate_navier_stokes > &primitive_soln_gradient_rans, const std::array< real, nstate_turbulence_model > &primitive_soln_turbulence_model) const =0
Nondimensionalized Reynolds stress tensor, (tau^reynolds)*.
virtual dealii::Tensor< 2, dim, FadType > compute_Reynolds_stress_tensor_fad(const std::array< FadType, nstate_navier_stokes > &primitive_soln_rans, const std::array< dealii::Tensor< 1, dim, FadType >, nstate_navier_stokes > &primitive_soln_gradient_rans, const std::array< FadType, nstate_turbulence_model > &primitive_soln_turbulence_model) const =0
Nondimensionalized Reynolds stress tensor, (tau^reynolds)* (Automatic Differentiation Type: FadType) ...
std::array< real, nstate > source_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &conservative_solution, const real current_time, const dealii::types::global_dof_index cell_index) const
Source term for manufactured solution functions.
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_flux(const std::array< real, nstate > &conservative_soln) const
Additional convective flux of RANS + convective flux of turbulence model.
std::array< real, nstate > physical_source_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &conservative_solution, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const dealii::types::global_dof_index cell_index) const override
Physical source term.
Sacado::Fad::DFad< double > FadType
Sacado AD type for first derivatives.
Definition: ADTypes.hpp:11
std::array< real, nstate > convective_dissipative_source_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &conservative_solution, const dealii::types::global_dof_index cell_index) const
Convective and dissipative source term for manufactured solution functions.
real2 get_tensor_magnitude_sqr(const dealii::Tensor< 2, dim, real2 > &tensor) const
Returns the square of the magnitude of the tensor (i.e. the double dot product of a tensor with itsel...
Manufactured solution used for grid studies to check convergence orders.
virtual std::array< real, nstate > compute_production_dissipation_cross_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &conservative_solution, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient) const =0
Physical source term (production, dissipation source terms and source term with cross derivatives) in...
dealii::Tensor< 2, nstate, real > convective_flux_directional_jacobian(const std::array< real, nstate > &conservative_soln, const dealii::Tensor< 1, dim, real > &normal) const
ReynoldsAveragedNavierStokesBase(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 turbulent_prandtl_number, 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, nspecies, real > > manufactured_solution_function=nullptr, const two_point_num_flux_enum two_point_num_flux_type=two_point_num_flux_enum::KG)
Constructor.
std::array< real, nstate > physical_source_term_computed_from_manufactured_solution(const dealii::Point< dim, real > &pos, const dealii::types::global_dof_index cell_index) const
static const int nstate_turbulence_model
Number of PDEs for RANS turbulence model.
Files for the baseline physics.
Definition: ADTypes.hpp:10
std::unique_ptr< NavierStokes< dim, nspecies, nstate_navier_stokes, real > > navier_stokes_physics
Pointer to Navier-Stokes physics object.
dealii::Tensor< 2, nstate, real > dissipative_flux_directional_jacobian_wrt_gradient_component(const std::array< real, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const dealii::Tensor< 1, dim, real > &normal, const int d_gradient, const dealii::types::global_dof_index cell_index) const
Physics model additional terms and equations to the baseline physics.
Definition: model.h:18
std::array< dealii::Tensor< 1, dim, real2 >, nstate > convective_flux_templated(const std::array< real2, nstate > &conservative_soln) const
Templated additional convective flux.
virtual std::array< real, nstate_turbulence_model > compute_effective_viscosity_turbulence_model(const std::array< real, nstate_navier_stokes > &primitive_soln_rans, const std::array< real, nstate_turbulence_model > &primitive_soln_turbulence_model) const =0
Nondimensionalized effective (total) viscosities for the turbulence model.
Main parameter class that contains the various other sub-parameter classes.
std::array< dealii::Tensor< 1, dim, real >, nstate > get_manufactured_solution_gradient(const dealii::Point< dim, real > &pos) const
Get manufactured solution value.
real2 get_vector_magnitude_sqr(const dealii::Tensor< 1, 3, real2 > &vector) const
Returns the square of the magnitude of the vector.
TwoPointNumericalFlux
Two point numerical flux type for split form.
std::array< real, nstate > dissipative_flux_dot_normal(const std::array< real, nstate > &solution, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const std::array< real, nstate > &filtered_solution, const std::array< dealii::Tensor< 1, dim, real >, nstate > &filtered_solution_gradient, const bool on_boundary, const dealii::types::global_dof_index cell_index, const dealii::Tensor< 1, dim, real > &normal, const int boundary_type) const override
Additional viscous flux of RANS + viscous flux of turbulence model dot normal.
virtual dealii::Tensor< 1, dim, real > compute_Reynolds_heat_flux(const std::array< real, nstate_navier_stokes > &primitive_soln_rans, const std::array< dealii::Tensor< 1, dim, real >, nstate_navier_stokes > &primitive_soln_gradient_rans, const std::array< real, nstate_turbulence_model > &primitive_soln_turbulence_model) const =0
Nondimensionalized Reynolds heat flux, (q^reynolds)*.
void boundary_manufactured_solution(const dealii::Point< dim, real > &pos, const dealii::Tensor< 1, dim, real > &normal_int, const std::array< real, nstate > &soln_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_int, std::array< real, nstate > &soln_bc, std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_bc) const override
Evaluate the manufactured solution boundary conditions.
std::array< dealii::Tensor< 1, dim, real2 >, nstate-(dim+2)> convert_conservative_gradient_to_primitive_gradient_turbulence_model(const std::array< real2, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &solution_gradient) const
Reynolds-Averaged Navier-Stokes (RANS) equations. Derived from Navier-Stokes for modifying the stress...
static const int nstate_navier_stokes
Number of PDEs for RANS equations.
std::array< real, nstate > convective_source_term_computed_from_manufactured_solution(const dealii::Point< dim, real > &pos) const
real max_convective_normal_eigenvalue(const std::array< real, nstate > &soln, const dealii::Tensor< 1, dim, real > &normal) const
Maximum convective normal eigenvalue (used in Lax-Friedrichs) of the additional models&#39; PDEs...
std::array< dealii::Tensor< 1, dim, real2 >, nstate-(dim+2)> dissipative_flux_turbulence_model(const std::array< real2, nstate_navier_stokes > &primitive_soln_rans, const std::array< real2, nstate_turbulence_model > &primitive_soln_turbulence_model, const std::array< dealii::Tensor< 1, dim, real2 >, nstate_turbulence_model > &primitive_solution_gradient_turbulence_model) const
Templated Additional viscous flux of RANS + viscous flux of turbulence model.
std::array< real2, nstate-(dim+2)> convert_conservative_to_primitive_turbulence_model(const std::array< real2, nstate > &conservative_soln) const
virtual dealii::Tensor< 1, dim, FadType > compute_Reynolds_heat_flux_fad(const std::array< FadType, nstate_navier_stokes > &primitive_soln_rans, const std::array< dealii::Tensor< 1, dim, FadType >, nstate_navier_stokes > &primitive_soln_gradient_rans, const std::array< FadType, nstate_turbulence_model > &primitive_soln_turbulence_model) const =0
Nondimensionalized Reynolds heat flux, (q^reynolds)* (Automatic Differentiation Type: FadType) ...
std::array< real, nstate > get_manufactured_solution_value(const dealii::Point< dim, real > &pos) const
Get manufactured solution value.
std::array< dealii::Tensor< 1, dim, real2 >, nstate > dissipative_flux_templated(const std::array< real2, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &solution_gradient, const dealii::types::global_dof_index cell_index) const
Templated additional dissipative (i.e. viscous) flux.
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const
Maximum convective eigenvalue of the additional models&#39; PDEs.
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 dealii::types::global_dof_index cell_index) const
Additional viscous flux of RANS + viscous flux of turbulence model.
virtual std::array< FadType, nstate_turbulence_model > compute_effective_viscosity_turbulence_model_fad(const std::array< FadType, nstate_navier_stokes > &primitive_soln_rans, const std::array< FadType, nstate_turbulence_model > &primitive_soln_turbulence_model) const =0
Nondimensionalized effective (total) viscosities for the turbulence model (Automatic Differentiation ...
ThermalBoundaryCondition
Types of thermal boundary conditions available.
dealii::Tensor< 2, nstate, real > dissipative_flux_directional_jacobian(const std::array< real, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const dealii::Tensor< 1, dim, real > &normal, const dealii::types::global_dof_index cell_index) const
std::array< dealii::Tensor< 1, dim, real2 >, dim+2 > extract_rans_solution_gradient(const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &solution_gradient) const
Returns the conservative solutions gradient of Reynolds-averaged Navier-Stokes equations (without add...
std::array< real, nstate > dissipative_source_term_computed_from_manufactured_solution(const dealii::Point< dim, real > &pos, const dealii::types::global_dof_index cell_index) const
std::array< real2, dim+2 > extract_rans_conservative_solution(const std::array< real2, nstate > &conservative_soln) const
Returns the conservative solutions of Reynolds-averaged Navier-Stokes equations (without additional R...
Navier-Stokes equations. Derived from Euler for the convective terms, which is derived from PhysicsBa...
Definition: navier_stokes.h:12
std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function
Manufactured solution function.
Definition: model.h:29
std::array< real, nstate-(dim+2)> compute_mean_turbulence_property(const std::array< real, nstate > &conservative_soln1, const std::array< real, nstate > &conservative_soln2) const
Mean turbulence properties given two sets of conservative solutions.