[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
negative_spalart_allmaras_rans_model.cpp
1 #include <cmath>
2 #include <vector>
3 #include <complex> // for the jacobian
4 
5 #include "ADTypes.hpp"
6 
7 #include "model.h"
8 #include "reynolds_averaged_navier_stokes.h"
9 #include "negative_spalart_allmaras_rans_model.h"
10 
11 namespace PHiLiP {
12 namespace Physics {
13 
14 //================================================================
15 // Negative Spalart-Allmaras model
16 //================================================================
17 template <int dim, 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,real> > manufactured_solution_function,
34  const two_point_num_flux_enum two_point_num_flux_type)
35  : ReynoldsAveragedNavierStokesBase<dim,nstate,real>(parameters_input,
36  ref_length,
37  gamma_gas,
38  mach_inf,
39  angle_of_attack,
40  side_slip_angle,
41  prandtl_number,
42  reynolds_number_inf,
43  use_constant_viscosity,
44  constant_viscosity,
45  turbulent_prandtl_number,
46  temperature_inf,
47  isothermal_wall_temperature,
48  thermal_boundary_condition_type,
49  manufactured_solution_function,
50  two_point_num_flux_type)
51 { }
52 //----------------------------------------------------------------
53 template <int dim, int nstate, typename real>
56  const std::array<real,nstate_navier_stokes> &primitive_soln_rans,
57  const std::array<real,nstate_turbulence_model> &primitive_soln_turbulence_model) const
58 {
59  return compute_eddy_viscosity_templated<real>(primitive_soln_rans,primitive_soln_turbulence_model);
60 }
61 //----------------------------------------------------------------
62 template <int dim, int nstate, typename real>
65  const std::array<FadType,nstate_navier_stokes> &primitive_soln_rans,
66  const std::array<FadType,nstate_turbulence_model> &primitive_soln_turbulence_model) const
67 {
68  return compute_eddy_viscosity_templated<FadType>(primitive_soln_rans,primitive_soln_turbulence_model);
69 }
70 //----------------------------------------------------------------
71 template <int dim, int nstate, typename real>
72 template<typename real2>
75  const std::array<real2,nstate_navier_stokes> &primitive_soln_rans,
76  const std::array<real2,nstate_turbulence_model> &primitive_soln_turbulence_model) const
77 {
78  real2 eddy_viscosity;
79  if (primitive_soln_turbulence_model[0]>=0.0)
80  {
81  // Compute needed coefficients
82  const real2 laminar_dynamic_viscosity = this->navier_stokes_physics->compute_viscosity_coefficient(primitive_soln_rans);
83  const real2 laminar_kinematic_viscosity = laminar_dynamic_viscosity/primitive_soln_rans[0];
84  const real2 Chi = this->compute_coefficient_Chi(primitive_soln_turbulence_model[0],laminar_kinematic_viscosity);
85  const real2 f_v1 = this->compute_coefficient_f_v1(Chi);
86  eddy_viscosity = primitive_soln_rans[0]*primitive_soln_turbulence_model[0]*f_v1;
87  } else {
88  eddy_viscosity = 0.0;
89  }
90 
91  return eddy_viscosity;
92 }
93 //----------------------------------------------------------------
94 template <int dim, int nstate, typename real>
95 template<typename real2>
98  const real2 coefficient) const
99 {
100  real2 scaled_coefficient;
101  if constexpr(std::is_same<real2,real>::value){
102  scaled_coefficient = coefficient/this->navier_stokes_physics->reynolds_number_inf;
103  }
104  else if constexpr(std::is_same<real2,FadType>::value){
105  const FadType reynolds_number_inf_fad = this->navier_stokes_physics->reynolds_number_inf;
106  scaled_coefficient = coefficient/reynolds_number_inf_fad;
107  }
108  else{
109  std::cout << "ERROR in physics/negative_spalart_allmaras_rans_model.cpp --> scale_coefficient(): real2 != real or FadType" << std::endl;
110  std::abort();
111  }
112 
113  return scaled_coefficient;
114 }
115 //----------------------------------------------------------------
116 template <int dim, int nstate, typename real>
117 std::array<real,nstate-(dim+2)> ReynoldsAveragedNavierStokes_SAneg<dim,nstate,real>
119  const std::array<real,nstate_navier_stokes> &primitive_soln_rans,
120  const std::array<real,nstate_turbulence_model> &primitive_soln_turbulence_model) const
121 {
122  return compute_effective_viscosity_turbulence_model_templated<real>(primitive_soln_rans,primitive_soln_turbulence_model);
123 }
124 //----------------------------------------------------------------
125 template <int dim, int nstate, typename real>
128  const std::array<FadType,nstate_navier_stokes> &primitive_soln_rans,
129  const std::array<FadType,nstate_turbulence_model> &primitive_soln_turbulence_model) const
130 {
131  return compute_effective_viscosity_turbulence_model_templated<FadType>(primitive_soln_rans,primitive_soln_turbulence_model);
132 }
133 //----------------------------------------------------------------
134 template <int dim, int nstate, typename real>
135 template <typename real2>
136 std::array<real2,nstate-(dim+2)> ReynoldsAveragedNavierStokes_SAneg<dim,nstate,real>
138  const std::array<real2,nstate_navier_stokes> &primitive_soln_rans,
139  const std::array<real2,nstate_turbulence_model> &primitive_soln_turbulence_model) const
140 {
141  const real2 laminar_dynamic_viscosity = this->navier_stokes_physics->compute_viscosity_coefficient(primitive_soln_rans);
142  const real2 laminar_kinematic_viscosity = laminar_dynamic_viscosity/primitive_soln_rans[0];
143 
144  const real2 coefficient_f_n = this->compute_coefficient_f_n(primitive_soln_turbulence_model[0],laminar_kinematic_viscosity);
145 
146  std::array<real2,nstate_turbulence_model> effective_viscosity_turbulence_model;
147 
148  for(int i=0; i<nstate_turbulence_model; ++i){
149  if constexpr(std::is_same<real2,real>::value){
150  effective_viscosity_turbulence_model[i] = (laminar_dynamic_viscosity+coefficient_f_n*primitive_soln_rans[0]*primitive_soln_turbulence_model[0])/sigma;
151  }
152  else if constexpr(std::is_same<real2,FadType>::value){
153  effective_viscosity_turbulence_model[i] = (laminar_dynamic_viscosity+coefficient_f_n*primitive_soln_rans[0]*primitive_soln_turbulence_model[0])/sigma_fad;
154  }
155  else{
156  std::cout << "ERROR in physics/negative_spalart_allmaras_rans_model.cpp --> compute_effective_viscosity_turbulence_model_templated(): real2 != real or FadType" << std::endl;
157  std::abort();
158  }
159  effective_viscosity_turbulence_model[i] = scale_coefficient(effective_viscosity_turbulence_model[i]);
160  }
161 
162  return effective_viscosity_turbulence_model;
163 }
164 //----------------------------------------------------------------
165 template <int dim, int nstate, typename real>
166 template<typename real2>
169  const real2 nu_tilde,
170  const real2 laminar_kinematic_viscosity) const
171 {
172  // Compute coefficient Chi
173  const real2 Chi = nu_tilde/laminar_kinematic_viscosity;
174 
175  return Chi;
176 }
177 //----------------------------------------------------------------
178 template <int dim, int nstate, typename real>
179 template<typename real2>
182  const real2 coefficient_Chi) const
183 {
184  // Compute coefficient f_v1
185  const real2 coefficient_Chi_power_3 = pow(coefficient_Chi,3.0);
186  real2 coefficient_f_v1;
187 
188  if constexpr(std::is_same<real2,real>::value){
189  coefficient_f_v1 = coefficient_Chi_power_3/(coefficient_Chi_power_3+c_v1*c_v1*c_v1);
190  }
191  else if constexpr(std::is_same<real2,FadType>::value){
192  coefficient_f_v1 = coefficient_Chi_power_3/(coefficient_Chi_power_3+c_v1_fad*c_v1_fad*c_v1_fad);
193  }
194  else{
195  std::cout << "ERROR in physics/negative_spalart_allmaras_rans_model.cpp --> compute_coefficient_f_v1(): real2 != real or FadType" << std::endl;
196  std::abort();
197  }
198 
199  return coefficient_f_v1;
200 }
201 //----------------------------------------------------------------
202 template <int dim, int nstate, typename real>
205  const real coefficient_Chi) const
206 {
207  // Compute coefficient f_v2
208  real coefficient_f_v2;
209  const real coefficient_f_v1 = compute_coefficient_f_v1(coefficient_Chi);
210 
211  coefficient_f_v2 = 1.0-coefficient_Chi/(1.0+coefficient_Chi*coefficient_f_v1);
212 
213  return coefficient_f_v2;
214 }
215 //----------------------------------------------------------------
216 template <int dim, int nstate, typename real>
217 template<typename real2>
220  const real2 nu_tilde,
221  const real2 laminar_kinematic_viscosity) const
222 {
223  // Compute coefficient f_n
224  real2 coefficient_f_n;
225  const real2 coefficient_Chi_power_3 = pow(compute_coefficient_Chi(nu_tilde,laminar_kinematic_viscosity),3.0);
226 
227  if constexpr(std::is_same<real2,real>::value){
228  if (nu_tilde>=0.0)
229  coefficient_f_n = 1.0;
230  else
231  coefficient_f_n = (c_n1+coefficient_Chi_power_3)/(c_n1-coefficient_Chi_power_3);
232  }
233  else if constexpr(std::is_same<real2,FadType>::value){
234  const FadType const_one_fad = 1.0;
235  if (nu_tilde>=0.0)
236  coefficient_f_n = const_one_fad;
237  else
238  coefficient_f_n = (c_n1_fad+coefficient_Chi_power_3)/(c_n1_fad-coefficient_Chi_power_3);
239  }
240  else{
241  std::cout << "ERROR in physics/negative_spalart_allmaras_rans_model.cpp --> compute_coefficient_f_n(): real2 != real or FadType" << std::endl;
242  std::abort();
243  }
244 
245  return coefficient_f_n;
246 }
247 //----------------------------------------------------------------
248 template <int dim, int nstate, typename real>
251  const real coefficient_Chi) const
252 {
253  // Compute coefficient f_t2
254  real coefficient_f_t2;
255 
256  coefficient_f_t2 = c_t3*exp(-c_t4*coefficient_Chi*coefficient_Chi);
257 
258  return coefficient_f_t2;
259 }
260 //----------------------------------------------------------------
261 template <int dim, int nstate, typename real>
264  const real coefficient_g) const
265 {
266  // Compute coefficient f_w
267  real coefficient_f_w;
268  const real cw3_power_6 = pow(c_w3,6.0);
269  coefficient_f_w = coefficient_g*pow((1.0+cw3_power_6)/(pow(coefficient_g,6.0)+cw3_power_6),1.0/6.0);
270 
271  return coefficient_f_w;
272 }
273 //----------------------------------------------------------------
274 template <int dim, int nstate, typename real>
277  const real nu_tilde,
278  const real d_wall,
279  const real s_tilde) const
280 {
281  // Compute coefficient r
282  real coefficient_r;
283 
284  coefficient_r = nu_tilde/(s_tilde*kappa*kappa*d_wall*d_wall);
285  coefficient_r = scale_coefficient(coefficient_r);
286  coefficient_r = coefficient_r <= r_lim ? coefficient_r : r_lim;
287 
288  return coefficient_r;
289 }
290 //----------------------------------------------------------------
291 template <int dim, int nstate, typename real>
294  const real coefficient_r) const
295 {
296  // Compute coefficient g
297  real coefficient_g;
298 
299  coefficient_g = coefficient_r+c_w2*(pow(coefficient_r,6.0)-coefficient_r);
300 
301  return coefficient_g;
302 }
303 //----------------------------------------------------------------
304 template <int dim, int nstate, typename real>
307  const std::array<real,nstate_navier_stokes> &conservative_soln_rans,
308  const std::array<dealii::Tensor<1,dim,real>,nstate_navier_stokes> &conservative_soln_gradient_rans) const
309 {
310  // Compute s
311  real s;
312 
313  // Get vorticity
314  const dealii::Tensor<1,3,real> vorticity
315  = this->navier_stokes_physics->compute_vorticity(conservative_soln_rans,conservative_soln_gradient_rans);
316 
317  s = sqrt(this->get_vector_magnitude_sqr(vorticity));
318 
319  return s;
320 }
321 //----------------------------------------------------------------
322 template <int dim, int nstate, typename real>
325  const real coefficient_Chi,
326  const real nu_tilde,
327  const real d_wall) const
328 {
329  // Compute s_bar
330  real s_bar;
331  const real f_v2 = compute_coefficient_f_v2(coefficient_Chi);
332 
333  s_bar = nu_tilde*f_v2/(kappa*kappa*d_wall*d_wall);
334 
335  return s_bar;
336 }
337 //----------------------------------------------------------------
338 template <int dim, int nstate, typename real>
341  const real coefficient_Chi,
342  const real nu_tilde,
343  const real d_wall,
344  const real s) const
345 {
346  // Compute s_bar
347  real s_tilde;
348  const real s_bar = compute_s_bar(coefficient_Chi,nu_tilde,d_wall);
349  const real scaled_s_bar = scale_coefficient(s_bar);
350 
351 
352  const real dimensional_s = s*this->navier_stokes_physics->mach_inf/this->navier_stokes_physics->ref_length;
353  const real dimensional_s_bar = s_bar*this->navier_stokes_physics->mach_inf/(this->navier_stokes_physics->reynolds_number_inf*this->navier_stokes_physics->ref_length);
354  if(dimensional_s_bar>=-c_v2*dimensional_s)
355  s_tilde = s+scaled_s_bar;
356  else
357  s_tilde = s+s*(c_v2*c_v2*s+c_v3*scaled_s_bar)/((c_v3-2.0*c_v2)*s-scaled_s_bar);
358 
359  return s_tilde;
360 }
361 //----------------------------------------------------------------
362 template <int dim, int nstate, typename real>
365  const real coefficient_f_t2,
366  const real density,
367  const real nu_tilde,
368  const real s,
369  const real s_tilde) const
370 {
371  std::array<real,nstate> production_source;
372 
373  for (int i=0;i<nstate_navier_stokes;++i){
374  production_source[i] = 0.0;
375  }
376 
377  if(nu_tilde>=0.0)
378  production_source[nstate_navier_stokes] = c_b1*(1.0-coefficient_f_t2)*s_tilde*nu_tilde;
379  else
380  production_source[nstate_navier_stokes] = c_b1*(1.0-c_t3)*s*nu_tilde;
381 
382  production_source[nstate_navier_stokes] *= density;
383 
384  return production_source;
385 }
386 //----------------------------------------------------------------
387 template <int dim, int nstate, typename real>
390  const real coefficient_f_t2,
391  const real density,
392  const real nu_tilde,
393  const real d_wall,
394  const real s_tilde) const
395 {
396  const real coefficient_r = this->compute_coefficient_r(nu_tilde,d_wall,s_tilde);
397  const real coefficient_g = this->compute_coefficient_g(coefficient_r);
398  const real coefficient_f_w = this->compute_coefficient_f_w(coefficient_g);
399  std::array<real,nstate> dissipation_source;
400 
401  for (int i=0;i<nstate_navier_stokes;++i){
402  dissipation_source[i] = 0.0;
403  }
404 
405  if(nu_tilde>=0.0)
406  dissipation_source[nstate_navier_stokes] = (c_w1*coefficient_f_w-c_b1*coefficient_f_t2/(kappa*kappa))*nu_tilde*nu_tilde/(d_wall*d_wall);
407  else
408  dissipation_source[nstate_navier_stokes] = -c_w1*nu_tilde*nu_tilde/(d_wall*d_wall);
409 
410  dissipation_source[nstate_navier_stokes] *= density;
411  dissipation_source[nstate_navier_stokes] = scale_coefficient(dissipation_source[nstate_navier_stokes]);
412 
413  return dissipation_source;
414 }
415 //----------------------------------------------------------------
416 template <int dim, int nstate, typename real>
419  const real density,
420  const real nu_tilde,
421  const real laminar_kinematic_viscosity,
422  const std::array<dealii::Tensor<1,dim,real>,nstate_navier_stokes> &primitive_soln_gradient_rans,
423  const std::array<dealii::Tensor<1,dim,real>,nstate_turbulence_model> &primitive_solution_gradient_turbulence_model) const
424 {
425  real cross_nu_tilde_nu_tilde = 0.0;
426  real cross_rho_nu_tilde = 0.0;
427  std::array<real,nstate> cross_source;
428  const real coefficient_f_n = this->compute_coefficient_f_n(nu_tilde,laminar_kinematic_viscosity);
429 
430  for (int i=0;i<nstate_navier_stokes;++i){
431  cross_source[i] = 0.0;
432  }
433  for (int i=0;i<dim;++i){
434  cross_nu_tilde_nu_tilde += primitive_solution_gradient_turbulence_model[0][i]*primitive_solution_gradient_turbulence_model[0][i];
435  cross_rho_nu_tilde += primitive_soln_gradient_rans[0][i]*primitive_solution_gradient_turbulence_model[0][i];
436  }
437 
438  cross_source[nstate_navier_stokes] = (c_b2*density*cross_nu_tilde_nu_tilde-(laminar_kinematic_viscosity+nu_tilde*coefficient_f_n)*cross_rho_nu_tilde)/sigma;
439  cross_source[nstate_navier_stokes] = scale_coefficient(cross_source[nstate_navier_stokes]);
440 
441  return cross_source;
442 }
443 //----------------------------------------------------------------
444 template <int dim, int nstate, typename real>
447  const std::array<real,nstate_navier_stokes> &primitive_soln_rans,
448  const std::array<dealii::Tensor<1,dim,real>,nstate_navier_stokes> &primitive_soln_gradient_rans,
449  const std::array<real,nstate_turbulence_model> &primitive_soln_turbulence_model) const
450 {
451  return compute_Reynolds_heat_flux_templated<real>(primitive_soln_rans,primitive_soln_gradient_rans,primitive_soln_turbulence_model);
452 }
453 //----------------------------------------------------------------
454 template <int dim, int nstate, typename real>
455 dealii::Tensor<1,dim,FadType> ReynoldsAveragedNavierStokes_SAneg<dim,nstate,real>
457  const std::array<FadType,nstate_navier_stokes> &primitive_soln_rans,
458  const std::array<dealii::Tensor<1,dim,FadType>,nstate_navier_stokes> &primitive_soln_gradient_rans,
459  const std::array<FadType,nstate_turbulence_model> &primitive_soln_turbulence_model) const
460 {
461  return compute_Reynolds_heat_flux_templated<FadType>(primitive_soln_rans,primitive_soln_gradient_rans,primitive_soln_turbulence_model);
462 }
463 //----------------------------------------------------------------
464 template <int dim, int nstate, typename real>
465 template<typename real2>
466 dealii::Tensor<1,dim,real2> ReynoldsAveragedNavierStokes_SAneg<dim,nstate,real>
468  const std::array<real2,nstate_navier_stokes> &primitive_soln_rans,
469  const std::array<dealii::Tensor<1,dim,real2>,nstate_navier_stokes> &primitive_soln_gradient_rans,
470  const std::array<real2,nstate_turbulence_model> &primitive_soln_turbulence_model) const
471 {
472  // Compute non-dimensional eddy viscosity;
473  real2 eddy_viscosity;
474  if constexpr(std::is_same<real2,real>::value){
475  eddy_viscosity = compute_eddy_viscosity(primitive_soln_rans,primitive_soln_turbulence_model);
476  }
477  else if constexpr(std::is_same<real2,FadType>::value){
478  eddy_viscosity = compute_eddy_viscosity_fad(primitive_soln_rans,primitive_soln_turbulence_model);
479  }
480  else{
481  std::cout << "ERROR in physics/negative_spalart_allmaras_rans_model.cpp --> compute_Reynolds_heat_flux_templated(): real2 != real or FadType" << std::endl;
482  std::abort();
483  }
484 
485  // Scaled non-dimensional eddy viscosity;
486  const real2 scaled_eddy_viscosity = scale_coefficient(eddy_viscosity);
487 
488  // Compute scaled heat conductivity
489  const real2 scaled_heat_conductivity = this->navier_stokes_physics->compute_scaled_heat_conductivity_given_scaled_viscosity_coefficient_and_prandtl_number(scaled_eddy_viscosity,this->turbulent_prandtl_number);
490 
491  // Get temperature gradient
492  const dealii::Tensor<1,dim,real2> temperature_gradient = this->navier_stokes_physics->compute_temperature_gradient(primitive_soln_rans, primitive_soln_gradient_rans);
493 
494  // Compute the Reynolds stress tensor via the eddy_viscosity and the strain rate tensor
495  dealii::Tensor<1,dim,real2> heat_flux_Reynolds = this->navier_stokes_physics->compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient(scaled_heat_conductivity,temperature_gradient);
496 
497  return heat_flux_Reynolds;
498 }
499 //----------------------------------------------------------------
500 template <int dim, int nstate, typename real>
503  const std::array<real,nstate_navier_stokes> &primitive_soln_rans,
504  const std::array<dealii::Tensor<1,dim,real>,nstate_navier_stokes> &primitive_soln_gradient_rans,
505  const std::array<real,nstate_turbulence_model> &primitive_soln_turbulence_model) const
506 {
507  return compute_Reynolds_stress_tensor_templated<real>(primitive_soln_rans,primitive_soln_gradient_rans,primitive_soln_turbulence_model);
508 }
509 //----------------------------------------------------------------
510 template <int dim, int nstate, typename real>
511 dealii::Tensor<2,dim,FadType> ReynoldsAveragedNavierStokes_SAneg<dim,nstate,real>
513  const std::array<FadType,nstate_navier_stokes> &primitive_soln_rans,
514  const std::array<dealii::Tensor<1,dim,FadType>,nstate_navier_stokes> &primitive_soln_gradient_rans,
515  const std::array<FadType,nstate_turbulence_model> &primitive_soln_turbulence_model) const
516 {
517  return compute_Reynolds_stress_tensor_templated<FadType>(primitive_soln_rans,primitive_soln_gradient_rans,primitive_soln_turbulence_model);
518 }
519 //----------------------------------------------------------------
520 template <int dim, int nstate, typename real>
521 template<typename real2>
522 dealii::Tensor<2,dim,real2> ReynoldsAveragedNavierStokes_SAneg<dim,nstate,real>
524  const std::array<real2,nstate_navier_stokes> &primitive_soln_rans,
525  const std::array<dealii::Tensor<1,dim,real2>,nstate_navier_stokes> &primitive_soln_gradient_rans,
526  const std::array<real2,nstate_turbulence_model> &primitive_soln_turbulence_model) const
527 {
528  // Compute non-dimensional eddy viscosity;
529  real2 eddy_viscosity;
530  if constexpr(std::is_same<real2,real>::value){
531  eddy_viscosity = compute_eddy_viscosity(primitive_soln_rans,primitive_soln_turbulence_model);
532  }
533  else if constexpr(std::is_same<real2,FadType>::value){
534  eddy_viscosity = compute_eddy_viscosity_fad(primitive_soln_rans,primitive_soln_turbulence_model);
535  }
536  else{
537  std::cout << "ERROR in physics/negative_spalart_allmaras_rans_model.cpp --> compute_Reynolds_stress_tensor_templated(): real2 != real or FadType" << std::endl;
538  std::abort();
539  }
540 
541  // Scaled non-dimensional eddy viscosity;
542  const real2 scaled_eddy_viscosity = scale_coefficient(eddy_viscosity);
543 
544  // Get velocity gradients
545  const dealii::Tensor<2,dim,real2> vel_gradient
546  = this->navier_stokes_physics->extract_velocities_gradient_from_primitive_solution_gradient(primitive_soln_gradient_rans);
547 
548  // Get strain rate tensor
549  const dealii::Tensor<2,dim,real2> strain_rate_tensor
550  = this->navier_stokes_physics->compute_strain_rate_tensor(vel_gradient);
551 
552  // Compute the Reynolds stress tensor via the eddy_viscosity and the strain rate tensor
553  dealii::Tensor<2,dim,real2> Reynolds_stress_tensor;
554  Reynolds_stress_tensor = this->navier_stokes_physics->compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor(scaled_eddy_viscosity,strain_rate_tensor);
555 
556  return Reynolds_stress_tensor;
557 }
558 //----------------------------------------------------------------
559 template <int dim, int nstate, typename real>
562  const dealii::Point<dim,real> &pos,
563  const std::array<real,nstate> &conservative_soln,
564  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_gradient) const
565 {
566 
567  const std::array<real,nstate_navier_stokes> conservative_soln_rans = this->extract_rans_conservative_solution(conservative_soln);
568  const std::array<dealii::Tensor<1,dim,real>,nstate_navier_stokes> conservative_soln_gradient_rans = this->extract_rans_solution_gradient(soln_gradient);
569  const std::array<real,nstate_navier_stokes> primitive_soln_rans = this->navier_stokes_physics->convert_conservative_to_primitive(conservative_soln_rans); // from Euler
570  const std::array<dealii::Tensor<1,dim,real>,nstate_navier_stokes> primitive_soln_gradient_rans = this->navier_stokes_physics->convert_conservative_gradient_to_primitive_gradient(conservative_soln_rans, conservative_soln_gradient_rans);
571  const std::array<dealii::Tensor<1,dim,real>,nstate_turbulence_model> primitive_soln_gradient_turbulence_model = this->convert_conservative_gradient_to_primitive_gradient_turbulence_model(conservative_soln, soln_gradient);
572 
573 
574  const real density = conservative_soln_rans[0];
575  const real nu_tilde = conservative_soln[nstate-1]/conservative_soln_rans[0];
576  const real laminar_dynamic_viscosity = this->navier_stokes_physics->compute_viscosity_coefficient(primitive_soln_rans);
577  const real laminar_kinematic_viscosity = laminar_dynamic_viscosity/density;
578 
579  const real coefficient_Chi = compute_coefficient_Chi(nu_tilde,laminar_kinematic_viscosity);
580  const real coefficient_f_t2 = compute_coefficient_f_t2(coefficient_Chi);
581 
582  const real d_wall = pos[1]+1.0;
583 
584  const real s = compute_s(conservative_soln_rans, conservative_soln_gradient_rans);
585  const real s_tilde = compute_s_tilde(coefficient_Chi, nu_tilde, d_wall, s);
586 
587  const std::array<real,nstate> production = compute_production_source(coefficient_f_t2, density, nu_tilde, s, s_tilde);
588  const std::array<real,nstate> dissipation = compute_dissipation_source(coefficient_f_t2, density, nu_tilde, d_wall, s_tilde);
589  const std::array<real,nstate> cross = compute_cross_source(density, nu_tilde, laminar_kinematic_viscosity, primitive_soln_gradient_rans, primitive_soln_gradient_turbulence_model);
590 
591  std::array<real,nstate> physical_source_term;
592  for (int i=0;i<nstate;++i){
593  physical_source_term[i] = production[i]-dissipation[i]+cross[i];
594  }
595 
596  return physical_source_term;
597 }
598 //----------------------------------------------------------------
599 template <int dim, int nstate, typename real>
602  std::array<real,nstate> &soln_bc,
603  std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc) const
604 {
605  // Wall boundary condition for nu_tilde (working variable of negative SA model)
606  // nu_tilde = 0
607  for (int istate=nstate_navier_stokes; istate<nstate; ++istate) {
608  soln_bc[istate] = 0.0;
609  soln_grad_bc[istate] = 0.0;
610  }
611 }
612 //----------------------------------------------------------------
613 template <int dim, int nstate, typename real>
616  const std::array<real,nstate> &soln_int,
617  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
618  std::array<real,nstate> &soln_bc,
619  std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc) const
620 {
621  for (int istate=nstate_navier_stokes; istate<nstate; ++istate) {
622  soln_bc[istate] = soln_int[istate];
623  soln_grad_bc[istate] = soln_grad_int[istate];
624  }
625 }
626 //----------------------------------------------------------------
627 template <int dim, int nstate, typename real>
630  const std::array<real,nstate> &/*soln_int*/,
631  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
632  std::array<real,nstate> &soln_bc,
633  std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc) const
634 {
635  const real density_bc = this->navier_stokes_physics->density_inf;
636  const real dynamic_viscosity_coefficient_bc = this->navier_stokes_physics->viscosity_coefficient_inf;
637  const real kinematic_viscosity_coefficient_bc = dynamic_viscosity_coefficient_bc/density_bc;
638  for (int istate=nstate_navier_stokes; istate<nstate; ++istate) {
639  soln_bc[istate] = density_bc*3.0*kinematic_viscosity_coefficient_bc;
640  soln_grad_bc[istate] = soln_grad_int[istate];
641  }
642 }
643 //----------------------------------------------------------------
644 template <int dim, int nstate, typename real>
647  std::array<real,nstate> &soln_bc) const
648 {
649  const real density_bc = this->navier_stokes_physics->density_inf;
650  const real dynamic_viscosity_coefficient_bc = this->navier_stokes_physics->viscosity_coefficient_inf;
651  const real kinematic_viscosity_coefficient_bc = dynamic_viscosity_coefficient_bc/density_bc;
652 
653  // Farfield boundary condition for nu_tilde (working variable of negative SA model)
654  // nu_tilde = 3.0*kinematic_viscosity_inf to 5.0*kinematic_viscosity_inf
655  for (int istate=nstate_navier_stokes; istate<nstate; ++istate) {
656  soln_bc[istate] = density_bc*3.0*kinematic_viscosity_coefficient_bc;
657  }
658 }
659 //----------------------------------------------------------------
660 template <int dim, int nstate, typename real>
663  const dealii::Vector<double> &uh,
664  const std::vector<dealii::Tensor<1,dim> > &duh,
665  const std::vector<dealii::Tensor<2,dim> > &dduh,
666  const dealii::Tensor<1,dim> &normals,
667  const dealii::Point<dim> &evaluation_points) const
668 {
669  std::vector<std::string> names = post_get_names ();
670  dealii::Vector<double> computed_quantities = ModelBase<dim,nstate,real>::post_compute_derived_quantities_vector ( uh, duh, dduh, normals, evaluation_points);
671  unsigned int current_data_index = computed_quantities.size() - 1;
672  computed_quantities.grow_or_shrink(names.size());
673  if constexpr (std::is_same<real,double>::value) {
674 
675  std::array<double, nstate> conservative_soln;
676  for (unsigned int s=0; s<nstate; ++s) {
677  conservative_soln[s] = uh(s);
678  }
679 
680  const std::array<double,nstate_turbulence_model> primitive_soln_turbulence_model = this->convert_conservative_to_primitive_turbulence_model(conservative_soln);
681 
682  computed_quantities(++current_data_index) = primitive_soln_turbulence_model[0];
683  }
684  if (computed_quantities.size()-1 != current_data_index) {
685  std::cout << " Did not assign a value to all the data. Missing " << computed_quantities.size() - current_data_index << " variables."
686  << " If you added a new output variable, make sure the names and DataComponentInterpretation match the above. "
687  << std::endl;
688  }
689 
690  return computed_quantities;
691 }
692 //----------------------------------------------------------------
693 template <int dim, int nstate, typename real>
694 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation> ReynoldsAveragedNavierStokes_SAneg<dim,nstate,real>
696 {
697  namespace DCI = dealii::DataComponentInterpretation;
698  std::vector<DCI::DataComponentInterpretation> interpretation = ModelBase<dim,nstate,real>::post_get_data_component_interpretation (); // state variables
699  interpretation.push_back (DCI::component_is_scalar);
700 
701  std::vector<std::string> names = post_get_names();
702  if (names.size() != interpretation.size()) {
703  std::cout << "Number of DataComponentInterpretation is not the same as number of names for output file" << std::endl;
704  }
705  return interpretation;
706 }
707 //----------------------------------------------------------------
708 template <int dim, int nstate, typename real>
711 {
712  std::vector<std::string> names = ModelBase<dim,nstate,real>::post_get_names ();
713  names.push_back ("nu_tilde");
714 
715  return names;
716 }
717 //----------------------------------------------------------------
718 //----------------------------------------------------------------
719 //----------------------------------------------------------------
720 // Instantiate explicitly
721 // -- ReynoldsAveragedNavierStokes_SAneg
727 
728 } // Physics namespace
729 } // PHiLiP namespace
static const int nstate_navier_stokes
Number of PDEs for RANS equations.
std::array< real, nstate-(dim+2)> 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
Nondimensionalized effective (total) viscosities for the negative SA model.
virtual std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > post_get_data_component_interpretation() const
Returns DataComponentInterpretation of the solution to be used by PhysicsPostprocessor to output curr...
Definition: model.cpp:220
real compute_s_bar(const real coefficient_Chi, const real nu_tilde, const real d_wall) const
Correction of vorticity magnitude for the negative SA model.
std::array< real2, nstate-(dim+2)> convert_conservative_to_primitive_turbulence_model(const std::array< real2, nstate > &conservative_soln) const
real2 scale_coefficient(const real2 coefficient) const
Templated nondimensionalized variables scaled by reynolds_number_inf for the negative SA model...
real2 compute_coefficient_f_v1(const real2 coefficient_Chi) const
Templated coefficient f_v1 for the negative SA model.
Negative Spalart-Allmaras model. Derived from Reynolds Averaged Navier Stokes.
void boundary_inflow(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
Inflow boundary condition.
Sacado::Fad::DFad< double > FadType
Sacado AD type for first derivatives.
Definition: ADTypes.hpp:11
real compute_coefficient_r(const real nu_tilde, const real d_wall, const real s_tilde) const
Coefficient r for the negative SA model.
real compute_coefficient_g(const real coefficient_r) const
Coefficient g for the negative SA model.
Manufactured solution used for grid studies to check convergence orders.
FadType compute_eddy_viscosity_fad(const std::array< FadType, nstate_navier_stokes > &primitive_soln_rans, const std::array< FadType, nstate_turbulence_model > &primitive_soln_turbulence_model) const
Nondimensionalized eddy viscosity for the negative SA model (Automatic Differentiation Type: FadType)...
static const int nstate_turbulence_model
Number of PDEs for RANS turbulence model.
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
Nondimensionalized Reynolds heat flux, (q^reynolds)*, for the negative SA model.
Files for the baseline physics.
Definition: ADTypes.hpp:10
dealii::Tensor< 2, dim, real2 > compute_Reynolds_stress_tensor_templated(const std::array< real2, nstate_navier_stokes > &primitive_soln_rans, const std::array< dealii::Tensor< 1, dim, real2 >, nstate_navier_stokes > &primitive_soln_gradient_rans, const std::array< real2, nstate_turbulence_model > &primitive_soln_turbulence_model) const
Templated nondimensionalized Reynolds stress tensor, (tau^reynolds)* for the negative SA model...
std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > post_get_data_component_interpretation() const override
For post processing purposes, sets the interpretation of each computed quantity as either scalar or v...
real2 compute_coefficient_Chi(const real2 nu_tilde, const real2 laminar_kinematic_viscosity) const
Templated coefficient Chi for the negative SA model.
std::array< real2, nstate-(dim+2)> compute_effective_viscosity_turbulence_model_templated(const std::array< real2, nstate_navier_stokes > &primitive_soln_rans, const std::array< real2, nstate_turbulence_model > &primitive_soln_turbulence_model) const
Templated nondimensionalized effective (total) viscosities for the negative SA model.
Main parameter class that contains the various other sub-parameter classes.
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
Nondimensionalized Reynolds stress tensor, (tau^reynolds)*, for the negative SA model.
real compute_s(const std::array< real, nstate_navier_stokes > &conservative_soln_rans, const std::array< dealii::Tensor< 1, dim, real >, nstate_navier_stokes > &conservative_soln_gradient_rans) const
Vorticity magnitude for the negative SA model, sqrt(vorticity_x^2+vorticity_y^2+vorticity_z^2) ...
const real c_b1
Constant coefficients for the negative SA model.
real compute_coefficient_f_v2(const real coefficient_Chi) const
Coefficient f_v2 for the negative SA model.
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...
real compute_eddy_viscosity(const std::array< real, nstate_navier_stokes > &primitive_soln_rans, const std::array< real, nstate_turbulence_model > &primitive_soln_turbulence_model) const
Nondimensionalized eddy viscosity for the negative SA model.
std::array< real, nstate > compute_production_source(const real coefficient_f_t2, const real density, const real nu_tilde, const real s, const real s_tilde) const
Production source term for the negative SA model.
TwoPointNumericalFlux
Two point numerical flux type for split form.
std::vector< std::string > post_get_names() const override
For post processing purposes, sets the base names (with no prefix or suffix) of the computed quantiti...
void boundary_wall(std::array< real, nstate > &soln_bc, std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_bc) const override
Wall boundary condition.
std::unique_ptr< NavierStokes< dim, nstate_navier_stokes, real > > navier_stokes_physics
Pointer to Navier-Stokes physics object.
std::array< FadType, nstate-(dim+2)> 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
Nondimensionalized effective (total) viscosities for the negative SA model (Automatic Differentiation...
Reynolds-Averaged Navier-Stokes (RANS) equations. Derived from Navier-Stokes for modifying the stress...
real compute_coefficient_f_t2(const real coefficient_Chi) const
Coefficient f_t2 for the negative SA model.
ReynoldsAveragedNavierStokes_SAneg(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, real > > manufactured_solution_function=nullptr, const two_point_num_flux_enum two_point_num_flux_type=two_point_num_flux_enum::KG)
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
Physical source term (production, dissipation source terms and source term with cross derivatives) fo...
real2 compute_coefficient_f_n(const real2 nu_tilde, const real2 laminar_kinematic_viscosity) const
Templated coefficient f_n for the negative SA model.
dealii::Tensor< 1, dim, real2 > compute_Reynolds_heat_flux_templated(const std::array< real2, nstate_navier_stokes > &primitive_soln_rans, const std::array< dealii::Tensor< 1, dim, real2 >, nstate_navier_stokes > &primitive_soln_gradient_rans, const std::array< real2, nstate_turbulence_model > &primitive_soln_turbulence_model) const
Templated nondimensionalized Reynolds heat flux, (q^reynolds)* for the negative SA model...
std::array< real, nstate > compute_dissipation_source(const real coefficient_f_t2, const real density, const real nu_tilde, const real d_wall, const real s_tilde) const
Dissipation source term for the negative SA model.
real compute_s_tilde(const real coefficient_Chi, const real nu_tilde, const real d_wall, const real s) const
Modified vorticity magnitude for the negative SA model.
real compute_coefficient_f_w(const real coefficient_g) const
Coefficient f_t2 for the negative SA model.
const double turbulent_prandtl_number
Turbulent Prandtl number.
real2 get_vector_magnitude_sqr(const dealii::Tensor< 1, 3, real2 > &vector) const
Returns the square of the magnitude of the vector.
real2 compute_eddy_viscosity_templated(const std::array< real2, nstate_navier_stokes > &primitive_soln_rans, const std::array< real2, nstate_turbulence_model > &primitive_soln_turbulence_model) const
Templated nondimensionalized eddy viscosity for the negative SA model.
void boundary_farfield(std::array< real, nstate > &soln_bc) const override
Farfield boundary conditions based on freestream values.
std::array< real, nstate > compute_cross_source(const real density, const real nu_tilde, const real laminar_kinematic_viscosity, const std::array< dealii::Tensor< 1, dim, real >, nstate_navier_stokes > &primitive_soln_gradient_rans, const std::array< dealii::Tensor< 1, dim, real >, nstate_turbulence_model > &primitive_solution_gradient_turbulence_model) const
Source term with cross derivatives for the negative SA model.
void boundary_outflow(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
Outflow boundary condition.
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
Nondimensionalized Reynolds heat flux, (q^reynolds)* (Automatic Differentiation Type: FadType)...
ThermalBoundaryCondition
Types of thermal boundary conditions available.
virtual dealii::Vector< double > post_compute_derived_quantities_vector(const dealii::Vector< double > &uh, const std::vector< dealii::Tensor< 1, dim > > &, const std::vector< dealii::Tensor< 2, dim > > &, const dealii::Tensor< 1, dim > &, const dealii::Point< dim > &) const
Returns current vector solution to be used by PhysicsPostprocessor to output current solution...
Definition: model.cpp:192
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
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...
virtual std::vector< std::string > post_get_names() const
Returns names of the solution to be used by PhysicsPostprocessor to output current solution...
Definition: model.cpp:208
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
Nondimensionalized Reynolds stress tensor, (tau^reynolds)* (Automatic Differentiation Type: FadType)...
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.
dealii::Vector< double > post_compute_derived_quantities_vector(const dealii::Vector< double > &uh, const std::vector< dealii::Tensor< 1, dim > > &, const std::vector< dealii::Tensor< 2, dim > > &, const dealii::Tensor< 1, dim > &, const dealii::Point< dim > &) const override
For post processing purposes, returns conservative and primitive solution variables for the negative ...