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: .