8 #include "large_eddy_simulation.h" 16 template <
int dim,
int nstate,
typename real>
19 const double ref_length,
20 const double gamma_gas,
21 const double mach_inf,
22 const double angle_of_attack,
23 const double side_slip_angle,
24 const double prandtl_number,
25 const double reynolds_number_inf,
26 const bool use_constant_viscosity,
27 const double constant_viscosity,
28 const double temperature_inf,
29 const double turbulent_prandtl_number,
30 const double ratio_of_filter_width_to_cell_size,
31 const double isothermal_wall_temperature,
35 :
ModelBase<dim,nstate,real>(manufactured_solution_function)
36 , turbulent_prandtl_number(turbulent_prandtl_number)
37 , ratio_of_filter_width_to_cell_size(ratio_of_filter_width_to_cell_size)
38 , navier_stokes_physics(
std::make_unique <
NavierStokes<dim,nstate,real> > (
47 use_constant_viscosity,
50 isothermal_wall_temperature,
51 thermal_boundary_condition_type,
52 manufactured_solution_function,
53 two_point_num_flux_type))
55 static_assert(nstate==dim+2,
"ModelBase::LargeEddySimulationBase() should be created with nstate=dim+2");
58 template <
int dim,
int nstate,
typename real>
59 template<
typename real2>
62 const dealii::Tensor<2,dim,real2> &tensor)
const 64 real2 tensor_magnitude_sqr;
65 if(std::is_same<real2,real>::value){
66 tensor_magnitude_sqr = 0.0;
68 for (
int i=0; i<dim; ++i) {
69 for (
int j=0; j<dim; ++j) {
70 tensor_magnitude_sqr += tensor[i][j]*tensor[i][j];
73 return tensor_magnitude_sqr;
76 template <
int dim,
int nstate,
typename real>
79 const std::array<real,nstate> &)
const 81 std::array<dealii::Tensor<1,dim,real>,nstate> conv_flux;
82 for (
int i=0; i<nstate; i++) {
88 template <
int dim,
int nstate,
typename real>
91 const std::array<real,nstate> &conservative_soln,
92 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
93 const dealii::types::global_dof_index cell_index)
const 95 return dissipative_flux_templated<real>(conservative_soln,solution_gradient,cell_index);
98 template <
int dim,
int nstate,
typename real>
99 template <
typename real2>
102 const std::array<real2,nstate> &conservative_soln,
103 const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient,
104 const dealii::types::global_dof_index cell_index)
const 107 const std::array<dealii::Tensor<1,dim,real2>,nstate> primitive_soln_gradient = this->
navier_stokes_physics->convert_conservative_gradient_to_primitive_gradient(conservative_soln, solution_gradient);
108 const std::array<real2,nstate> primitive_soln = this->
navier_stokes_physics->convert_conservative_to_primitive(conservative_soln);
111 const dealii::Tensor<1,dim,real2> vel = this->
navier_stokes_physics->extract_velocities_from_primitive(primitive_soln);
113 dealii::Tensor<2,dim,real2> viscous_stress_tensor;
114 dealii::Tensor<1,dim,real2> heat_flux;
115 if constexpr(std::is_same<real2,real>::value){
119 else if constexpr(std::is_same<real2,FadType>::value){
124 std::cout <<
"ERROR in physics/large_eddy_simulation.cpp --> dissipative_flux_templated(): real2!=real || real2!=FadType)" << std::endl;
129 std::array<dealii::Tensor<1,dim,real2>,nstate> viscous_flux
130 = this->
navier_stokes_physics->dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux(vel,viscous_stress_tensor,heat_flux);
135 template <
int dim,
int nstate,
typename real>
138 const std::array<real,nstate> &,
139 const dealii::Tensor<1,dim,real> &)
const 141 std::array<real,nstate> eig;
146 template <
int dim,
int nstate,
typename real>
150 const real max_eig = 0.0;
154 template <
int dim,
int nstate,
typename real>
157 const std::array<real,nstate> &,
158 const dealii::Tensor<1,dim,real> &)
const 160 const real max_eig = 0.0;
164 template <
int dim,
int nstate,
typename real>
167 const dealii::Point<dim,real> &pos,
168 const std::array<real,nstate> &,
170 const dealii::types::global_dof_index cell_index)
const 181 template <
int dim,
int nstate,
typename real>
191 const double cell_volume = this->cellwise_volume[cell_index];
192 double filter_width = pow(cell_volume, (1.0/3.0))/(cell_poly_degree+1);
200 template<
typename real>
201 double getValue(
const real &x) {
202 if constexpr(std::is_same<real,double>::value) {
205 else if constexpr(std::is_same<real,FadType>::value) {
208 else if constexpr(std::is_same<real,FadFadType>::value) {
209 return x.val().val();
211 else if constexpr(std::is_same<real,RadType>::value) {
214 else if(std::is_same<real,RadFadType>::value) {
215 return x.value().value();
219 template <
int dim,
int nstate,
typename real>
222 const std::array<real,nstate> &conservative_soln,
223 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
224 const dealii::Tensor<1,dim,real> &normal,
225 const dealii::types::global_dof_index cell_index)
const 230 std::array<adtype,nstate> AD_conservative_soln;
231 std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_solution_gradient;
232 for (
int s=0; s<nstate; s++) {
233 adtype ADvar(nstate, s, getValue<real>(conservative_soln[s]));
234 AD_conservative_soln[s] = ADvar;
235 for (
int d=0;d<dim;d++) {
236 AD_solution_gradient[s][d] = getValue<real>(solution_gradient[s][d]);
241 std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_dissipative_flux = dissipative_flux_templated<adtype>(AD_conservative_soln, AD_solution_gradient, cell_index);
244 dealii::Tensor<2,nstate,real> jacobian;
245 for (
int sp=0; sp<nstate; sp++) {
247 for (
int s=0; s<nstate; s++) {
248 jacobian[s][sp] = 0.0;
249 for (
int d=0;d<dim;d++) {
251 jacobian[s][sp] += AD_dissipative_flux[s][d].dx(sp)*normal[d];
258 template <
int dim,
int nstate,
typename real>
261 const std::array<real,nstate> &conservative_soln,
262 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
263 const dealii::Tensor<1,dim,real> &normal,
264 const int d_gradient,
265 const dealii::types::global_dof_index cell_index)
const 270 std::array<adtype,nstate> AD_conservative_soln;
271 std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_solution_gradient;
272 for (
int s=0; s<nstate; s++) {
273 AD_conservative_soln[s] = getValue<real>(conservative_soln[s]);
274 for (
int d=0;d<dim;d++) {
276 adtype ADvar(nstate, s, getValue<real>(solution_gradient[s][d]));
277 AD_solution_gradient[s][d] = ADvar;
280 AD_solution_gradient[s][d] = getValue<real>(solution_gradient[s][d]);
286 std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_dissipative_flux = dissipative_flux_templated<adtype>(AD_conservative_soln, AD_solution_gradient, cell_index);
289 dealii::Tensor<2,nstate,real> jacobian;
290 for (
int sp=0; sp<nstate; sp++) {
292 for (
int s=0; s<nstate; s++) {
293 jacobian[s][sp] = 0.0;
294 for (
int d=0;d<dim;d++) {
296 jacobian[s][sp] += AD_dissipative_flux[s][d].dx(sp)*normal[d];
303 template <
int dim,
int nstate,
typename real>
306 const dealii::Point<dim,real> &pos)
const 308 std::array<real,nstate> manufactured_solution;
309 for (
int s=0; s<nstate; s++) {
312 assert(manufactured_solution[s] > 0);
315 return manufactured_solution;
318 template <
int dim,
int nstate,
typename real>
321 const dealii::Point<dim,real> &pos)
const 323 std::vector<dealii::Tensor<1,dim,real>> manufactured_solution_gradient_dealii(nstate);
325 std::array<dealii::Tensor<1,dim,real>,nstate> manufactured_solution_gradient;
326 for (
int d=0;d<dim;d++) {
327 for (
int s=0; s<nstate; s++) {
328 manufactured_solution_gradient[s][d] = manufactured_solution_gradient_dealii[s][d];
331 return manufactured_solution_gradient;
334 template <
int dim,
int nstate,
typename real>
337 const dealii::Point<dim,real> &pos,
338 const dealii::types::global_dof_index cell_index)
const 351 std::array<dealii::SymmetricTensor<2,dim,real>,nstate> manufactured_solution_hessian;
352 for (
int s=0; s<nstate; s++) {
354 for (
int dr=0;dr<dim;dr++) {
355 for (
int dc=0;dc<dim;dc++) {
356 manufactured_solution_hessian[s][dr][dc] = hessian[dr][dc];
363 dealii::Tensor<1,nstate,real> dissipative_flux_divergence;
364 for (
int d=0;d<dim;d++) {
365 dealii::Tensor<1,dim,real> normal;
370 std::array<dealii::Tensor<2,nstate,real>,dim> jacobian_wrt_gradient;
371 for (
int d_gradient=0;d_gradient<dim;d_gradient++) {
377 for (
int sr = 0; sr < nstate; ++sr) {
378 for (
int sc = 0; sc < nstate; ++sc) {
379 jacobian_wrt_gradient[d_gradient][sr][sc] = jacobian_wrt_gradient_component[sr][sc];
385 for (
int sr = 0; sr < nstate; ++sr) {
386 real jac_grad_row = 0.0;
387 for (
int sc = 0; sc < nstate; ++sc) {
388 jac_grad_row += jacobian[sr][sc]*manufactured_solution_gradient[sc][d];
391 for (
int d_gradient=0;d_gradient<dim;d_gradient++) {
392 jac_grad_row += jacobian_wrt_gradient[d_gradient][sr][sc]*manufactured_solution_hessian[sc][d_gradient][d];
395 dissipative_flux_divergence[sr] += jac_grad_row;
399 for (
int s=0; s<nstate; s++) {
400 dissipative_source_term[s] = dissipative_flux_divergence[s];
409 template <
int dim,
int nstate,
typename real>
412 const double ref_length,
413 const double gamma_gas,
414 const double mach_inf,
415 const double angle_of_attack,
416 const double side_slip_angle,
417 const double prandtl_number,
418 const double reynolds_number_inf,
419 const bool use_constant_viscosity,
420 const double constant_viscosity,
421 const double temperature_inf,
424 const double model_constant,
425 const double isothermal_wall_temperature,
437 use_constant_viscosity,
440 turbulent_prandtl_number,
441 ratio_of_filter_width_to_cell_size,
442 isothermal_wall_temperature,
443 thermal_boundary_condition_type,
445 two_point_num_flux_type)
446 , model_constant(model_constant)
449 template <
int dim,
int nstate,
typename real>
452 const dealii::types::global_dof_index cell_index)
const 457 const double model_constant_times_filter_width =
model_constant*filter_width;
458 return model_constant_times_filter_width;
461 template <
int dim,
int nstate,
typename real>
464 const std::array<real,nstate> &primitive_soln,
465 const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
466 const dealii::types::global_dof_index cell_index)
const 468 return compute_eddy_viscosity_templated<real>(primitive_soln,primitive_soln_gradient,cell_index);
471 template <
int dim,
int nstate,
typename real>
474 const std::array<FadType,nstate> &primitive_soln,
475 const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
476 const dealii::types::global_dof_index cell_index)
const 478 return compute_eddy_viscosity_templated<FadType>(primitive_soln,primitive_soln_gradient,cell_index);
481 template <
int dim,
int nstate,
typename real>
482 template<
typename real2>
485 const std::array<real2,nstate> &,
486 const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient,
487 const dealii::types::global_dof_index cell_index)
const 490 const dealii::Tensor<2,dim,real2> vel_gradient
491 = this->
navier_stokes_physics->extract_velocities_gradient_from_primitive_solution_gradient(primitive_soln_gradient);
493 const dealii::Tensor<2,dim,real2> strain_rate_tensor
499 const real2 strain_rate_tensor_magnitude_sqr = this->
template get_tensor_magnitude_sqr<real2>(strain_rate_tensor);
501 const real2 eddy_viscosity = model_constant_times_filter_width*model_constant_times_filter_width*sqrt(2.0*strain_rate_tensor_magnitude_sqr);
503 return eddy_viscosity;
506 template <
int dim,
int nstate,
typename real>
507 template<
typename real2>
510 const std::array<real2,nstate> &primitive_soln,
511 const real2 eddy_viscosity)
const 514 const real2 scaled_eddy_viscosity = primitive_soln[0]*eddy_viscosity;
516 return scaled_eddy_viscosity;
519 template <
int dim,
int nstate,
typename real>
522 const std::array<real,nstate> &primitive_soln,
523 const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
524 const dealii::types::global_dof_index cell_index)
const 526 return compute_SGS_heat_flux_templated<real>(primitive_soln,primitive_soln_gradient,cell_index);
529 template <
int dim,
int nstate,
typename real>
532 const std::array<FadType,nstate> &primitive_soln,
533 const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
534 const dealii::types::global_dof_index cell_index)
const 536 return compute_SGS_heat_flux_templated<FadType>(primitive_soln,primitive_soln_gradient,cell_index);
539 template <
int dim,
int nstate,
typename real>
540 template<
typename real2>
543 const std::array<real2,nstate> &primitive_soln,
544 const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient,
545 const dealii::types::global_dof_index cell_index)
const 548 real2 eddy_viscosity;
549 if constexpr(std::is_same<real2,real>::value){
552 else if constexpr(std::is_same<real2,FadType>::value){
556 std::cout <<
"ERROR in physics/large_eddy_simulation.cpp --> compute_SGS_heat_flux_templated(): real2 != real or FadType" << std::endl;
561 const real2 scaled_eddy_viscosity = scale_eddy_viscosity_templated<real2>(primitive_soln,eddy_viscosity);
567 const dealii::Tensor<1,dim,real2> temperature_gradient = this->
navier_stokes_physics->compute_temperature_gradient(primitive_soln, primitive_soln_gradient);
570 dealii::Tensor<1,dim,real2> heat_flux_SGS = this->
navier_stokes_physics->compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient(scaled_heat_conductivity,temperature_gradient);
572 return heat_flux_SGS;
575 template <
int dim,
int nstate,
typename real>
578 const std::array<real,nstate> &primitive_soln,
579 const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
580 const dealii::types::global_dof_index cell_index)
const 582 return compute_SGS_stress_tensor_templated<real>(primitive_soln,primitive_soln_gradient,cell_index);
585 template <
int dim,
int nstate,
typename real>
588 const std::array<FadType,nstate> &primitive_soln,
589 const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
590 const dealii::types::global_dof_index cell_index)
const 592 return compute_SGS_stress_tensor_templated<FadType>(primitive_soln,primitive_soln_gradient,cell_index);
595 template <
int dim,
int nstate,
typename real>
596 template<
typename real2>
599 const std::array<real2,nstate> &primitive_soln,
600 const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient,
601 const dealii::types::global_dof_index cell_index)
const 604 real2 eddy_viscosity;
605 if constexpr(std::is_same<real2,real>::value){
608 else if constexpr(std::is_same<real2,FadType>::value){
612 std::cout <<
"ERROR in physics/large_eddy_simulation.cpp --> compute_SGS_stress_tensor_templated(): real2 != real or FadType" << std::endl;
617 const real2 scaled_eddy_viscosity = scale_eddy_viscosity_templated<real2>(primitive_soln,eddy_viscosity);
620 const dealii::Tensor<2,dim,real2> vel_gradient
621 = this->
navier_stokes_physics->extract_velocities_gradient_from_primitive_solution_gradient(primitive_soln_gradient);
624 const dealii::Tensor<2,dim,real2> strain_rate_tensor
628 dealii::Tensor<2,dim,real2> SGS_stress_tensor;
629 SGS_stress_tensor = this->
navier_stokes_physics->compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor(scaled_eddy_viscosity,strain_rate_tensor);
631 return SGS_stress_tensor;
637 template <
int dim,
int nstate,
typename real>
640 const double ref_length,
641 const double gamma_gas,
642 const double mach_inf,
643 const double angle_of_attack,
644 const double side_slip_angle,
645 const double prandtl_number,
646 const double reynolds_number_inf,
647 const bool use_constant_viscosity,
648 const double constant_viscosity,
649 const double temperature_inf,
653 const double isothermal_wall_temperature,
665 use_constant_viscosity,
668 turbulent_prandtl_number,
669 ratio_of_filter_width_to_cell_size,
671 isothermal_wall_temperature,
672 thermal_boundary_condition_type,
674 two_point_num_flux_type)
677 template <
int dim,
int nstate,
typename real>
680 const std::array<real,nstate> &primitive_soln,
681 const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
682 const dealii::types::global_dof_index cell_index)
const 684 return compute_eddy_viscosity_templated<real>(primitive_soln,primitive_soln_gradient,cell_index);
687 template <
int dim,
int nstate,
typename real>
690 const std::array<FadType,nstate> &primitive_soln,
691 const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
692 const dealii::types::global_dof_index cell_index)
const 694 return compute_eddy_viscosity_templated<FadType>(primitive_soln,primitive_soln_gradient,cell_index);
697 template <
int dim,
int nstate,
typename real>
698 template<
typename real2>
701 const std::array<real2,nstate> &,
702 const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient,
703 const dealii::types::global_dof_index cell_index)
const 705 const dealii::Tensor<2,dim,real2> vel_gradient
706 = this->
navier_stokes_physics->extract_velocities_gradient_from_primitive_solution_gradient(primitive_soln_gradient);
707 const dealii::Tensor<2,dim,real2> strain_rate_tensor
717 dealii::Tensor<2,dim,real2> g_sqr;
718 for (
int i=0; i<dim; ++i) {
719 for (
int j=0; j<dim; ++j) {
721 real2 val;
if(std::is_same<real2,real>::value){val = 0.0;}
723 for (
int k=0; k<dim; ++k) {
724 val += vel_gradient[i][k]*vel_gradient[k][j];
729 real2 trace_g_sqr;
if(std::is_same<real2,real>::value){trace_g_sqr = 0.0;}
730 for (
int k=0; k<dim; ++k) {
731 trace_g_sqr += g_sqr[k][k];
733 dealii::Tensor<2,dim,real2> traceless_symmetric_square_of_velocity_gradient_tensor;
734 for (
int i=0; i<dim; ++i) {
735 for (
int j=0; j<dim; ++j) {
736 traceless_symmetric_square_of_velocity_gradient_tensor[i][j] = 0.5*(g_sqr[i][j]+g_sqr[j][i]);
739 for (
int k=0; k<dim; ++k) {
740 traceless_symmetric_square_of_velocity_gradient_tensor[k][k] += -(1.0/3.0)*trace_g_sqr;
744 const real2 strain_rate_tensor_magnitude_sqr = this->
template get_tensor_magnitude_sqr<real2>(strain_rate_tensor);
745 const real2 traceless_symmetric_square_of_velocity_gradient_tensor_magnitude_sqr = this->
template get_tensor_magnitude_sqr<real2>(traceless_symmetric_square_of_velocity_gradient_tensor);
748 real2 eddy_viscosity;
if(std::is_same<real2,real>::value){eddy_viscosity = 0.0;}
749 if((strain_rate_tensor_magnitude_sqr != 0.0) &&
750 (traceless_symmetric_square_of_velocity_gradient_tensor_magnitude_sqr != 0.0)) {
757 eddy_viscosity = model_constant_times_filter_width*model_constant_times_filter_width*pow(traceless_symmetric_square_of_velocity_gradient_tensor_magnitude_sqr,1.5)/(pow(strain_rate_tensor_magnitude_sqr,2.5) + pow(traceless_symmetric_square_of_velocity_gradient_tensor_magnitude_sqr,1.25));
760 return eddy_viscosity;
766 template <
int dim,
int nstate,
typename real>
769 const double ref_length,
770 const double gamma_gas,
771 const double mach_inf,
772 const double angle_of_attack,
773 const double side_slip_angle,
774 const double prandtl_number,
775 const double reynolds_number_inf,
776 const bool use_constant_viscosity,
777 const double constant_viscosity,
778 const double temperature_inf,
782 const double isothermal_wall_temperature,
794 use_constant_viscosity,
797 turbulent_prandtl_number,
798 ratio_of_filter_width_to_cell_size,
800 isothermal_wall_temperature,
801 thermal_boundary_condition_type,
803 two_point_num_flux_type)
806 template <
int dim,
int nstate,
typename real>
809 const std::array<real,nstate> &primitive_soln,
810 const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient,
811 const dealii::types::global_dof_index cell_index)
const 813 return compute_eddy_viscosity_templated<real>(primitive_soln,primitive_soln_gradient,cell_index);
816 template <
int dim,
int nstate,
typename real>
819 const std::array<FadType,nstate> &primitive_soln,
820 const std::array<dealii::Tensor<1,dim,FadType>,nstate> &primitive_soln_gradient,
821 const dealii::types::global_dof_index cell_index)
const 823 return compute_eddy_viscosity_templated<FadType>(primitive_soln,primitive_soln_gradient,cell_index);
826 template <
int dim,
int nstate,
typename real>
827 template<
typename real2>
830 const std::array<real2,nstate> &,
831 const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient,
832 const dealii::types::global_dof_index cell_index)
const 834 const dealii::Tensor<2,dim,real2> vel_gradient
835 = this->
navier_stokes_physics->extract_velocities_gradient_from_primitive_solution_gradient(primitive_soln_gradient);
843 dealii::Tensor<2,dim,real2> beta_tensor;
844 for (
int i=0; i<dim; ++i) {
845 for (
int j=0; j<dim; ++j) {
847 real2 val;
if(std::is_same<real2,real>::value){val = 0.0;}
849 for (
int k=0; k<dim; ++k) {
850 val += vel_gradient[i][k]*vel_gradient[j][k];
852 beta_tensor[i][j] = filter_width*filter_width*val;
856 real2 beta_tensor_determinant;
if(std::is_same<real2,real>::value){beta_tensor_determinant = 0.0;}
858 beta_tensor_determinant = beta_tensor[0][0]*beta_tensor[1][1] - beta_tensor[0][1]*beta_tensor[0][1];
860 if constexpr(dim==3){
861 for (
int i=0; i<2; ++i) {
862 beta_tensor_determinant += beta_tensor[i][i]*beta_tensor[2][2] - beta_tensor[i][2]*beta_tensor[i][2];
867 const real2 velocity_gradient_tensor_magnitude_sqr = this->
template get_tensor_magnitude_sqr<real2>(vel_gradient);
870 real2 eddy_viscosity;
if(std::is_same<real2,real>::value){eddy_viscosity = 0.0;}
871 if((velocity_gradient_tensor_magnitude_sqr !=0.0) && (beta_tensor_determinant >= 0.0)) {
880 eddy_viscosity = this->
model_constant*sqrt(beta_tensor_determinant/velocity_gradient_tensor_magnitude_sqr);
883 return eddy_viscosity;
virtual dealii::Tensor< 2, dim, real > compute_SGS_stress_tensor(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const =0
Nondimensionalized sub-grid scale (SGS) stress tensor, (tau^sgs)*.
const double model_constant
SGS model constant.
virtual FadType compute_eddy_viscosity_fad(const std::array< FadType, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, FadType >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
Nondimensionalized eddy viscosity for the Smagorinsky model (Automatic Differentiation Type: FadType)...
std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function
Manufactured solution function.
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...
const double turbulent_prandtl_number
Turbulent Prandtl number.
virtual dealii::Tensor< 2, dim, FadType > compute_SGS_stress_tensor_fad(const std::array< FadType, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, FadType >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const =0
Nondimensionalized sub-grid scale (SGS) stress tensor, (tau^sgs)* (Automatic Differentiation Type: Fa...
virtual dealii::Tensor< 1, dim, real > compute_SGS_heat_flux(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const =0
Nondimensionalized sub-grid scale (SGS) heat flux, (q^sgs)*.
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Smagorinsky eddy viscosity model. Derived from Large Eddy Simulation.
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
virtual real compute_eddy_viscosity(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
Nondimensionalized eddy viscosity for the Smagorinsky model.
Sacado::Fad::DFad< double > FadType
Sacado AD type for first derivatives.
std::array< real, nstate > get_manufactured_solution_value(const dealii::Point< dim, real > &pos) const
Get manufactured solution value (repeated from Euler)
Manufactured solution used for grid studies to check convergence orders.
WALE (Wall-Adapting Local Eddy-viscosity) eddy viscosity model. Derived from LargeEddySimulation_Smag...
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const
Maximum convective eigenvalue of the additional models' PDEs.
codi_JacobianComputationType RadType
CoDiPaco reverse-AD type for first derivatives.
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< real, nstate > convective_eigenvalues(const std::array< real, nstate > &, const dealii::Tensor< 1, dim, real > &) const override
Convective eigenvalues of the additional models' PDEs.
std::array< real, nstate > source_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &solution, const real current_time, const dealii::types::global_dof_index cell_index) const
Source term for manufactured solution functions.
Files for the baseline physics.
LargeEddySimulation_WALE(const Parameters::AllParameters *const parameters_input, const double ref_length, const double gamma_gas, const double mach_inf, const double angle_of_attack, const double side_slip_angle, const double prandtl_number, const double reynolds_number_inf, const bool use_constant_viscosity, const double constant_viscosity, const double temperature_inf, const double turbulent_prandtl_number, const double ratio_of_filter_width_to_cell_size, const double model_constant, 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)
real2 compute_eddy_viscosity_templated(const std::array< real2, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
Physics model additional terms and equations to the baseline physics.
dealii::Tensor< 1, dim, real > compute_SGS_heat_flux(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
Nondimensionalized sub-grid scale (SGS) heat flux, (q^sgs)*.
dealii::Tensor< 2, dim, FadType > compute_SGS_stress_tensor_fad(const std::array< FadType, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, FadType >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
Nondimensionalized sub-grid scale (SGS) stress tensor, (tau^sgs)* (Automatic Differentiation Type: Fa...
dealii::Tensor< 1, dim, real2 > compute_SGS_heat_flux_templated(const std::array< real2, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
Templated nondimensionalized sub-grid scale (SGS) heat flux, (q^sgs)*.
FadType compute_eddy_viscosity_fad(const std::array< FadType, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, FadType >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const override
Main parameter class that contains the various other sub-parameter classes.
std::array< real, nstate > dissipative_source_term(const dealii::Point< dim, real > &pos, const dealii::types::global_dof_index cell_index) const
Dissipative flux contribution to the source term (repeated from NavierStokes)
std::unique_ptr< NavierStokes< dim, nstate, real > > navier_stokes_physics
Pointer to Navier-Stokes physics object.
TwoPointNumericalFlux
Two point numerical flux type for split form.
LargeEddySimulationBase(const Parameters::AllParameters *const parameters_input, const double ref_length, const double gamma_gas, const double mach_inf, const double angle_of_attack, const double side_slip_angle, const double prandtl_number, const double reynolds_number_inf, const bool use_constant_viscosity, const double constant_viscosity, const double temperature_inf, const double turbulent_prandtl_number, const double ratio_of_filter_width_to_cell_size, const double isothermal_wall_temperature=1.0, const thermal_boundary_condition_enum thermal_boundary_condition_type=thermal_boundary_condition_enum::adiabatic, std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function=nullptr, const two_point_num_flux_enum two_point_num_flux_type=two_point_num_flux_enum::KG)
Constructor.
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' PDEs...
real compute_eddy_viscosity(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const override
Large Eddy Simulation equations. Derived from Navier-Stokes for modifying the stress tensor and heat ...
real compute_eddy_viscosity(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const override
real2 compute_eddy_viscosity_templated(const std::array< real2, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
Templated nondimensionalized eddy viscosity for the Smagorinsky model.
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_flux(const std::array< real, nstate > &conservative_soln) const
Convective flux: .
Vreman eddy viscosity model. Derived from LargeEddySimulation_Smagorinsky for only modifying compute_...
dealii::LinearAlgebra::distributed::Vector< int > cellwise_poly_degree
Cellwise polynomial degree.
LargeEddySimulation_Smagorinsky(const Parameters::AllParameters *const parameters_input, const double ref_length, const double gamma_gas, const double mach_inf, const double angle_of_attack, const double side_slip_angle, const double prandtl_number, const double reynolds_number_inf, const bool use_constant_viscosity, const double constant_viscosity, const double temperature_inf, const double turbulent_prandtl_number, const double ratio_of_filter_width_to_cell_size, const double model_constant, 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)
virtual dealii::Tensor< 1, dim, FadType > compute_SGS_heat_flux_fad(const std::array< FadType, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, FadType >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const =0
Nondimensionalized sub-grid scale (SGS) heat flux, (q^sgs)* (Automatic Differentiation Type: FadType)...
LargeEddySimulation_Vreman(const Parameters::AllParameters *const parameters_input, const double ref_length, const double gamma_gas, const double mach_inf, const double angle_of_attack, const double side_slip_angle, const double prandtl_number, const double reynolds_number_inf, const bool use_constant_viscosity, const double constant_viscosity, const double temperature_inf, const double turbulent_prandtl_number, const double ratio_of_filter_width_to_cell_size, const double model_constant, 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)
dealii::Tensor< 2, dim, real > compute_SGS_stress_tensor(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
Nondimensionalized sub-grid scale (SGS) stress tensor, (tau^sgs)*.
double get_model_constant_times_filter_width(const dealii::types::global_dof_index cell_index) const
Returns the product of the eddy viscosity model constant and the filter width.
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
Dissipative (i.e. viscous) flux: .
dealii::Tensor< 2, dim, real2 > compute_SGS_stress_tensor_templated(const std::array< real2, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
Templated nondimensionalized sub-grid scale (SGS) stress tensor, (tau^sgs)*.
real2 compute_eddy_viscosity_templated(const std::array< real2, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
ThermalBoundaryCondition
Types of thermal boundary conditions available.
dealii::Tensor< 1, dim, FadType > compute_SGS_heat_flux_fad(const std::array< FadType, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, FadType >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const
Nondimensionalized sub-grid scale (SGS) heat flux, (q^sgs)* (Automatic Differentiation Type: FadType)...
FadType compute_eddy_viscosity_fad(const std::array< FadType, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, FadType >, nstate > &primitive_soln_gradient, const dealii::types::global_dof_index cell_index) const override
codi_HessianComputationType RadFadType
Nested reverse-forward mode type for Jacobian and Hessian computation using TapeHelper.
double get_filter_width(const dealii::types::global_dof_index cell_index) const
Compute the nondimensionalized filter width used by the SGS model given a cell index.
std::array< dealii::Tensor< 1, dim, real >, nstate > get_manufactured_solution_gradient(const dealii::Point< dim, real > &pos) const
Get manufactured solution value (repeated from Euler)
Navier-Stokes equations. Derived from Euler for the convective terms, which is derived from PhysicsBa...
const double ratio_of_filter_width_to_cell_size
Ratio of filter width to cell size.
real2 scale_eddy_viscosity_templated(const std::array< real2, nstate > &primitive_soln, const real2 eddy_viscosity) const
Templated scale nondimensionalized eddy viscosity for Smagorinsky model.
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 dissipative (i.e. viscous) flux: .