9 #include "navier_stokes.h"    14 template <
int dim, 
int nstate, 
typename real>
    17     const double                                              ref_length,
    18     const double                                              gamma_gas,
    19     const double                                              mach_inf,
    20     const double                                              angle_of_attack,
    21     const double                                              side_slip_angle,
    22     const double                                              prandtl_number,
    23     const double                                              reynolds_number_inf,
    24     const bool                                                use_constant_viscosity,
    25     const double                                              constant_viscosity,
    26     const double                                              temperature_inf,
    27     const double                                              isothermal_wall_temperature,
    31     : 
Euler<dim,nstate,real>(parameters_input,
    37                              manufactured_solution_function,
    38                              two_point_num_flux_type,
    41     , viscosity_coefficient_inf(1.0) 
    42     , use_constant_viscosity(use_constant_viscosity)
    43     , constant_viscosity(constant_viscosity) 
    44     , prandtl_number(prandtl_number)
    45     , reynolds_number_inf(reynolds_number_inf)
    46     , isothermal_wall_temperature(isothermal_wall_temperature) 
    47     , thermal_boundary_condition_type(thermal_boundary_condition_type)
    48     , sutherlands_temperature(110.4) 
    49     , freestream_temperature(temperature_inf) 
    50     , temperature_ratio(sutherlands_temperature/freestream_temperature)
    52     static_assert(nstate==dim+2, 
"Physics::NavierStokes() should be created with nstate=dim+2");
    56 template <
int dim, 
int nstate, 
typename real>
    57 template<
typename real2>
    60     const std::array<real2,nstate> &conservative_soln,
    61     const std::array<dealii::Tensor<1,dim,real2>,nstate> &conservative_soln_gradient)
 const    64     std::array<dealii::Tensor<1,dim,real2>,nstate> primitive_soln_gradient;
    67     const std::array<real2,nstate> primitive_soln = this->
template convert_conservative_to_primitive<real2>(conservative_soln); 
    69     const real2 density = primitive_soln[0];
    70     const dealii::Tensor<1,dim,real2> vel = this->
template extract_velocities_from_primitive<real2>(primitive_soln); 
    73     for (
int d=0; d<dim; d++) {
    74         primitive_soln_gradient[0][d] = conservative_soln_gradient[0][d];
    77     for (
int d1=0; d1<dim; d1++) {
    78         for (
int d2=0; d2<dim; d2++) {
    79             primitive_soln_gradient[1+d1][d2] = (conservative_soln_gradient[1+d1][d2] - vel[d1]*conservative_soln_gradient[0][d2])/density;
    93     for (
int d1=0; d1<dim; d1++) {
    94         primitive_soln_gradient[nstate-1][d1] = conservative_soln_gradient[nstate-1][d1];
    95         for (
int d2=0; d2<dim; d2++) {
    96             primitive_soln_gradient[nstate-1][d1] -= 0.5*(primitive_soln[1+d2]*conservative_soln_gradient[1+d2][d1]  
    97                                                            + conservative_soln[1+d2]*primitive_soln_gradient[1+d2][d1]);
    99         primitive_soln_gradient[nstate-1][d1] *= this->gamm1;
   101     return primitive_soln_gradient;
   104 template <
int dim, 
int nstate, 
typename real>
   105 template<
typename real2>
   108     const std::array<real2,nstate> &primitive_soln,
   109     const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient)
 const   111     const real2 density = primitive_soln[0];
   112     const real2 temperature = this->
template compute_temperature<real2>(primitive_soln); 
   114     dealii::Tensor<1,dim,real2> temperature_gradient;
   115     for (
int d=0; d<dim; d++) {
   116         temperature_gradient[d] = (this->gam*this->mach_inf_sqr*primitive_soln_gradient[nstate-1][d] - temperature*primitive_soln_gradient[0][d])/density;
   118     return temperature_gradient;
   121 template <
int dim, 
int nstate, 
typename real>
   122 template<
typename real2>
   127     real2 viscosity_coefficient;
   128     if(use_constant_viscosity){
   129         viscosity_coefficient = 1.0*constant_viscosity;
   131         viscosity_coefficient = compute_viscosity_coefficient_sutherlands_law<real2>(primitive_soln);
   134     return viscosity_coefficient;
   137 template <
int dim, 
int nstate, 
typename real>
   138 template<
typename real2>
   149     const real2 temperature = this->
template compute_temperature<real2>(primitive_soln); 
   151     const real2 viscosity_coefficient = ((1.0 + temperature_ratio)/(temperature + temperature_ratio))*pow(temperature,1.5);
   153     return viscosity_coefficient;
   156 template <
int dim, 
int nstate, 
typename real>
   157 template<
typename real2>
   164     const real2 scaled_viscosity_coefficient = viscosity_coefficient/reynolds_number_inf;
   166     return scaled_viscosity_coefficient;
   169 template <
int dim, 
int nstate, 
typename real>
   170 template<
typename real2>
   177     const real2 viscosity_coefficient = compute_viscosity_coefficient<real2>(primitive_soln);
   178     const real2 scaled_viscosity_coefficient = scale_viscosity_coefficient(viscosity_coefficient);
   180     return scaled_viscosity_coefficient;
   183 template <
int dim, 
int nstate, 
typename real>
   184 template<
typename real2>
   191     const real2 scaled_heat_conductivity = scaled_viscosity_coefficient/(this->gamm1*this->mach_inf_sqr*prandtl_number_input);
   193     return scaled_heat_conductivity;
   196 template <
int dim, 
int nstate, 
typename real>
   197 template<
typename real2>
   204     const real2 scaled_viscosity_coefficient = compute_scaled_viscosity_coefficient<real2>(primitive_soln);
   206     const real2 scaled_heat_conductivity = compute_scaled_heat_conductivity_given_scaled_viscosity_coefficient_and_prandtl_number(scaled_viscosity_coefficient,prandtl_number);
   208     return scaled_heat_conductivity;
   211 template <
int dim, 
int nstate, 
typename real>
   212 template<
typename real2>
   215     const std::array<real2,nstate> &primitive_soln,
   216     const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient)
 const   221     const real2 scaled_heat_conductivity = compute_scaled_heat_conductivity<real2>(primitive_soln);
   222     const dealii::Tensor<1,dim,real2> temperature_gradient = compute_temperature_gradient<real2>(primitive_soln, primitive_soln_gradient);
   224     const dealii::Tensor<1,dim,real2> heat_flux = compute_heat_flux_given_scaled_heat_conductivity_and_temperature_gradient<real2>(scaled_heat_conductivity,temperature_gradient);
   228 template <
int dim, 
int nstate, 
typename real>
   229 template<
typename real2>
   232     const real2 scaled_heat_conductivity,
   233     const dealii::Tensor<1,dim,real2> &temperature_gradient)
 const   238     dealii::Tensor<1,dim,real2> heat_flux;
   239     for (
int d=0; d<dim; d++) {
   240         heat_flux[d] = -scaled_heat_conductivity*temperature_gradient[d];
   245 template <
int dim, 
int nstate, 
typename real>
   246 template<
typename real2>
   249     const std::array<real2,nstate> &conservative_soln,
   250     const std::array<dealii::Tensor<1,dim,real2>,nstate> &conservative_soln_gradient)
 const   253     dealii::Tensor<1,3,real2> vorticity;
   254     for(
int d=0; d<3; ++d) {
   257     if constexpr(dim>1) {
   259         const std::array<dealii::Tensor<1,dim,real2>,nstate> primitive_soln_gradient = convert_conservative_gradient_to_primitive_gradient<real2>(conservative_soln, conservative_soln_gradient);
   260         const dealii::Tensor<2,dim,real2> velocities_gradient = extract_velocities_gradient_from_primitive_solution_gradient<real2>(primitive_soln_gradient);
   261         if constexpr(dim==2) {
   263             vorticity[2] = velocities_gradient[1][0] - velocities_gradient[0][1]; 
   265         if constexpr(dim==3) {
   266             vorticity[0] = velocities_gradient[2][1] - velocities_gradient[1][2]; 
   267             vorticity[1] = velocities_gradient[0][2] - velocities_gradient[2][0]; 
   268             vorticity[2] = velocities_gradient[1][0] - velocities_gradient[0][1]; 
   274 template <
int dim, 
int nstate, 
typename real>
   277     const std::array<real,nstate> &conservative_soln,
   278     const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
 const   281     dealii::Tensor<1,3,real> vorticity = compute_vorticity(conservative_soln, conservative_soln_gradient);
   283     real vorticity_magnitude_sqr = 0.0;
   284     for(
int d=0; d<3; ++d) {
   285         vorticity_magnitude_sqr += vorticity[d]*vorticity[d];
   287     return vorticity_magnitude_sqr;
   290 template <
int dim, 
int nstate, 
typename real>
   293     const std::array<real,nstate> &conservative_soln,
   294     const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
 const   296     real vorticity_magnitude_sqr = compute_vorticity_magnitude_sqr(conservative_soln, conservative_soln_gradient);
   297     real vorticity_magnitude = sqrt(vorticity_magnitude_sqr); 
   298     return vorticity_magnitude;
   301 template <
int dim, 
int nstate, 
typename real>
   304     const std::array<real,nstate> &conservative_soln,
   305     const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
 const   308     const real density = conservative_soln[0];
   309     real enstrophy = 0.5*density*compute_vorticity_magnitude_sqr(conservative_soln, conservative_soln_gradient);
   313 template <
int dim, 
int nstate, 
typename real>
   316     const real integrated_enstrophy)
 const   318     real dissipation_rate = 2.0*integrated_enstrophy/(this->reynolds_number_inf);
   319     return dissipation_rate;
   322 template <
int dim, 
int nstate, 
typename real>
   325     const std::array<real,nstate> &conservative_soln,
   326     const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
 const   329     const real pressure = this->
template compute_pressure<real>(conservative_soln);
   332     const std::array<dealii::Tensor<1,dim,real>,nstate> primitive_soln_gradient = convert_conservative_gradient_to_primitive_gradient<real>(conservative_soln, conservative_soln_gradient);
   333     const dealii::Tensor<2,dim,real> velocities_gradient = extract_velocities_gradient_from_primitive_solution_gradient<real>(primitive_soln_gradient);
   336     real pressure_dilatation = 0.0;
   337     for(
int d=0; d<dim; ++d) {
   338         pressure_dilatation += velocities_gradient[d][d]; 
   340     pressure_dilatation *= pressure;
   342     return pressure_dilatation;
   345 template <
int dim, 
int nstate, 
typename real>
   348     const std::array<real,nstate> &conservative_soln,
   349     const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
 const   352     const std::array<dealii::Tensor<1,dim,real>,nstate> primitive_soln_gradient = convert_conservative_gradient_to_primitive_gradient<real>(conservative_soln, conservative_soln_gradient);
   353     const dealii::Tensor<2,dim,real> velocities_gradient = extract_velocities_gradient_from_primitive_solution_gradient<real>(primitive_soln_gradient);
   356     const dealii::Tensor<2,dim,real> strain_rate_tensor = compute_strain_rate_tensor<real>(velocities_gradient);
   359     real vel_divergence = 0.0;
   360     for(
int d1=0; d1<dim; ++d1) {
   361         vel_divergence += velocities_gradient[d1][d1];
   365     dealii::Tensor<2,dim,real> deviatoric_strain_rate_tensor;
   366     for(
int d1=0; d1<dim; ++d1) {
   367         for(
int d2=0; d2<dim; ++d2) {
   368             deviatoric_strain_rate_tensor[d1][d2] = strain_rate_tensor[d1][d2] - (1.0/3.0)*vel_divergence;
   371     return deviatoric_strain_rate_tensor;
   374 template <
int dim, 
int nstate, 
typename real>
   377     const dealii::Tensor<2,dim,real> &tensor)
 const   379     real tensor_magnitude_sqr = 0.0;
   380     for (
int i=0; i<dim; ++i) {
   381         for (
int j=0; j<dim; ++j) {
   382             tensor_magnitude_sqr += tensor[i][j]*tensor[i][j];
   385     return tensor_magnitude_sqr;
   388 template <
int dim, 
int nstate, 
typename real>
   391     const std::array<real,nstate> &conservative_soln,
   392     const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
 const   395     const dealii::Tensor<2,dim,real> deviatoric_strain_rate_tensor = compute_deviatoric_strain_rate_tensor(conservative_soln,conservative_soln_gradient);
   397     real deviatoric_strain_rate_tensor_magnitude_sqr = get_tensor_magnitude_sqr(deviatoric_strain_rate_tensor);
   399     return deviatoric_strain_rate_tensor_magnitude_sqr;
   402 template <
int dim, 
int nstate, 
typename real>
   405     const real integrated_deviatoric_strain_rate_tensor_magnitude_sqr)
 const   407     real dissipation_rate = 2.0*integrated_deviatoric_strain_rate_tensor_magnitude_sqr/(this->reynolds_number_inf);
   408     return dissipation_rate;
   411 template <
int dim, 
int nstate, 
typename real>
   412 template<
typename real2>
   415     const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient)
 const   417     dealii::Tensor<2,dim,real2> velocities_gradient;
   418     for (
int d1=0; d1<dim; d1++) {
   419         for (
int d2=0; d2<dim; d2++) {
   420             velocities_gradient[d1][d2] = primitive_soln_gradient[1+d1][d2];
   423     return velocities_gradient;
   426 template <
int dim, 
int nstate, 
typename real>
   427 template<
typename real2>
   430     const dealii::Tensor<2,dim,real2> &vel_gradient)
 const   433     dealii::Tensor<2,dim,real2> strain_rate_tensor;
   434     for (
int d1=0; d1<dim; d1++) {
   435         for (
int d2=0; d2<dim; d2++) {
   437             strain_rate_tensor[d1][d2] = 0.5*(vel_gradient[d1][d2] + vel_gradient[d2][d1]);
   440     return strain_rate_tensor;
   443 template <
int dim, 
int nstate, 
typename real>
   446     const std::array<real,nstate> &conservative_soln,
   447     const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
 const   450     const std::array<dealii::Tensor<1,dim,real>,nstate> primitive_soln_gradient = convert_conservative_gradient_to_primitive_gradient<real>(conservative_soln, conservative_soln_gradient);
   451     const dealii::Tensor<2,dim,real> velocities_gradient = extract_velocities_gradient_from_primitive_solution_gradient<real>(primitive_soln_gradient);
   454     const dealii::Tensor<2,dim,real> strain_rate_tensor = compute_strain_rate_tensor(velocities_gradient);
   456     real strain_rate_tensor_magnitude_sqr = get_tensor_magnitude_sqr(strain_rate_tensor);
   458     return strain_rate_tensor_magnitude_sqr;
   461 template <
int dim, 
int nstate, 
typename real>
   464     const real integrated_strain_rate_tensor_magnitude_sqr)
 const   466     real dissipation_rate = 2.0*integrated_strain_rate_tensor_magnitude_sqr/(this->reynolds_number_inf);
   467     return dissipation_rate;
   470 template <
int dim, 
int nstate, 
typename real>
   471 template<
typename real2>
   474     const real2 scaled_viscosity_coefficient,
   475     const dealii::Tensor<2,dim,real2> &strain_rate_tensor)
 const   483     real2 vel_divergence; 
   484     if(std::is_same<real2,real>::value){ 
   485         vel_divergence = 0.0;
   488     for (
int d=0; d<dim; d++) {
   489         vel_divergence += strain_rate_tensor[d][d];
   493     dealii::Tensor<2,dim,real2> viscous_stress_tensor;
   494     const real2 scaled_2nd_viscosity_coefficient = (-2.0/3.0)*scaled_viscosity_coefficient; 
   495     for (
int d1=0; d1<dim; d1++) {
   496         for (
int d2=0; d2<dim; d2++) {
   497             viscous_stress_tensor[d1][d2] = 2.0*scaled_viscosity_coefficient*strain_rate_tensor[d1][d2];
   499         viscous_stress_tensor[d1][d1] += scaled_2nd_viscosity_coefficient*vel_divergence;
   501     return viscous_stress_tensor;
   504 template <
int dim, 
int nstate, 
typename real>
   505 template<
typename real2>
   508     const std::array<real2,nstate> &primitive_soln,
   509     const std::array<dealii::Tensor<1,dim,real2>,nstate> &primitive_soln_gradient)
 const   514     const dealii::Tensor<2,dim,real2> vel_gradient = extract_velocities_gradient_from_primitive_solution_gradient<real2>(primitive_soln_gradient);
   515     const dealii::Tensor<2,dim,real2> strain_rate_tensor = compute_strain_rate_tensor<real2>(vel_gradient);
   516     const real2 scaled_viscosity_coefficient = compute_scaled_viscosity_coefficient<real2>(primitive_soln);
   519     const dealii::Tensor<2,dim,real2> viscous_stress_tensor 
   520         = compute_viscous_stress_tensor_via_scaled_viscosity_and_strain_rate_tensor<real2>(scaled_viscosity_coefficient,strain_rate_tensor);
   522     return viscous_stress_tensor;
   525 template <
int dim, 
int nstate, 
typename real>
   528     const std::array<real,nstate> &conservative_soln,
   529     const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient)
 const   534     std::array<dealii::Tensor<1,dim,real>,nstate> viscous_flux = dissipative_flux_templated<real>(conservative_soln, solution_gradient);
   538 template <
int dim, 
int nstate, 
typename real>
   541     const std::array<real,nstate> &primitive_soln,
   542     const dealii::Tensor<1,dim,real> &temperature_gradient)
 const   547     const real temperature = this->compute_temperature(primitive_soln); 
   548     const real scaled_viscosity_coefficient = compute_scaled_viscosity_coefficient(primitive_soln);
   551     real dmudT = 0.5*(scaled_viscosity_coefficient/(temperature + temperature_ratio))*(1.0 + 3.0*temperature_ratio/temperature);
   554     dealii::Tensor<1,dim,real> scaled_viscosity_coefficient_gradient;
   555     for (
int d=0; d<dim; d++) {
   556         scaled_viscosity_coefficient_gradient[d] = dmudT*temperature_gradient[d];
   559     return scaled_viscosity_coefficient_gradient;
   563 template<
typename real>
   564 double getValue(
const real &x) {
   565     if constexpr(std::is_same<real,double>::value) {
   568     else if constexpr(std::is_same<real,FadType>::value) {
   571     else if constexpr(std::is_same<real,FadFadType>::value) {
   572         return x.val().val(); 
   574     else if constexpr(std::is_same<real,RadType>::value) {
   577     else if(std::is_same<real,RadFadType>::value) {
   578         return x.value().value(); 
   582 template <
int dim, 
int nstate, 
typename real>
   585     const std::array<real,nstate> &conservative_soln,
   586     const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
   587     const dealii::Tensor<1,dim,real> &normal)
 const   592     std::array<adtype,nstate> AD_conservative_soln;
   593     std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_solution_gradient;
   594     for (
int s=0; s<nstate; s++) {
   595         adtype ADvar(nstate, s, getValue<real>(conservative_soln[s])); 
   596         AD_conservative_soln[s] = ADvar;
   597         for (
int d=0;d<dim;d++) {
   598             AD_solution_gradient[s][d] = getValue<real>(solution_gradient[s][d]);
   603     std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_dissipative_flux = dissipative_flux_templated<adtype>(AD_conservative_soln, AD_solution_gradient);
   606     dealii::Tensor<2,nstate,real> jacobian;
   607     for (
int sp=0; sp<nstate; sp++) {
   609         for (
int s=0; s<nstate; s++) {
   610             jacobian[s][sp] = 0.0;
   611             for (
int d=0;d<dim;d++) {
   613                 jacobian[s][sp] += AD_dissipative_flux[s][d].dx(sp)*normal[d];
   620 template <
int dim, 
int nstate, 
typename real>
   623     const std::array<real,nstate> &conservative_soln,
   624     const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
   625     const dealii::Tensor<1,dim,real> &normal,
   626     const int d_gradient)
 const   631     std::array<adtype,nstate> AD_conservative_soln;
   632     std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_solution_gradient;
   633     for (
int s=0; s<nstate; s++) {
   634         AD_conservative_soln[s] = getValue<real>(conservative_soln[s]);
   635         for (
int d=0;d<dim;d++) {
   637                 adtype ADvar(nstate, s, getValue<real>(solution_gradient[s][d])); 
   638                 AD_solution_gradient[s][d] = ADvar;
   641                 AD_solution_gradient[s][d] = getValue<real>(solution_gradient[s][d]);
   647     std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_dissipative_flux = dissipative_flux_templated<adtype>(AD_conservative_soln, AD_solution_gradient);
   650     dealii::Tensor<2,nstate,real> jacobian;
   651     for (
int sp=0; sp<nstate; sp++) {
   653         for (
int s=0; s<nstate; s++) {
   654             jacobian[s][sp] = 0.0;
   655             for (
int d=0;d<dim;d++) {
   657                 jacobian[s][sp] += AD_dissipative_flux[s][d].dx(sp)*normal[d];
   664 template <
int dim, 
int nstate, 
typename real>
   667     const dealii::Point<dim,real> &pos)
 const   670     const std::array<real,nstate> manufactured_solution = this->get_manufactured_solution_value(pos); 
   673     const std::array<dealii::Tensor<1,dim,real>,nstate> manufactured_solution_gradient = this->get_manufactured_solution_gradient(pos); 
   676     std::array<dealii::SymmetricTensor<2,dim,real>,nstate> manufactured_solution_hessian;
   677     for (
int s=0; s<nstate; s++) {
   678         dealii::SymmetricTensor<2,dim,real> hessian = this->manufactured_solution_function->hessian(pos,s);
   679         for (
int dr=0;dr<dim;dr++) {
   680             for (
int dc=0;dc<dim;dc++) {
   681                 manufactured_solution_hessian[s][dr][dc] = hessian[dr][dc];
   688     dealii::Tensor<1,nstate,real> dissipative_flux_divergence;
   689     for (
int d=0;d<dim;d++) {
   690         dealii::Tensor<1,dim,real> normal;
   692         const dealii::Tensor<2,nstate,real> jacobian = dissipative_flux_directional_jacobian(manufactured_solution, manufactured_solution_gradient, normal);
   695         std::array<dealii::Tensor<2,nstate,real>,dim> jacobian_wrt_gradient;
   696         for (
int d_gradient=0;d_gradient<dim;d_gradient++) {
   699             const dealii::Tensor<2,nstate,real> jacobian_wrt_gradient_component = dissipative_flux_directional_jacobian_wrt_gradient_component(manufactured_solution, manufactured_solution_gradient, normal, d_gradient);
   702             for (
int sr = 0; sr < nstate; ++sr) {
   703                 for (
int sc = 0; sc < nstate; ++sc) {
   704                     jacobian_wrt_gradient[d_gradient][sr][sc] = jacobian_wrt_gradient_component[sr][sc];
   708         for (
int sr = 0; sr < nstate; ++sr) {
   709             real jac_grad_row = 0.0;
   710             for (
int sc = 0; sc < nstate; ++sc) {
   711                 jac_grad_row += jacobian[sr][sc]*manufactured_solution_gradient[sc][d];
   714                 for (
int d_gradient=0;d_gradient<dim;d_gradient++) {
   715                     jac_grad_row += jacobian_wrt_gradient[d_gradient][sr][sc]*manufactured_solution_hessian[sc][d_gradient][d]; 
   718             dissipative_flux_divergence[sr] += jac_grad_row;
   721     std::array<real,nstate> dissipative_source_term;
   722     for (
int s=0; s<nstate; s++) {
   723         dissipative_source_term[s] = dissipative_flux_divergence[s];
   726     return dissipative_source_term;
   729 template <
int dim, 
int nstate, 
typename real>
   732     const dealii::Point<dim,real> &pos,
   733     const std::array<real,nstate> &,
   737     const std::array<real,nstate> conv_source_term = this->convective_source_term(pos);
   738     const std::array<real,nstate> diss_source_term = dissipative_source_term(pos);
   739     std::array<real,nstate> source_term;
   740     for (
int s=0; s<nstate; s++)
   742         source_term[s] = conv_source_term[s] + diss_source_term[s];
   747 template <
int dim, 
int nstate, 
typename real>
   750     std::array<real,nstate> &conservative_soln,
   751     const dealii::Tensor<1,dim,real> &normal)
 const   756     std::array<adtype,nstate> AD_conservative_soln;
   757     for (
int s=0; s<nstate; s++) {
   758         adtype ADvar(nstate, s, getValue<real>(conservative_soln[s])); 
   759         AD_conservative_soln[s] = ADvar;
   764     std::array<dealii::Tensor<1,dim,adtype>,nstate> AD_conv_flux;
   765     const adtype density = AD_conservative_soln[0];
   766     const adtype pressure = this->
template compute_pressure<adtype>(AD_conservative_soln);
   767     const dealii::Tensor<1,dim,adtype> vel = this->
template compute_velocities<adtype>(AD_conservative_soln);
   768     const adtype specific_total_energy = AD_conservative_soln[nstate-1]/AD_conservative_soln[0];
   769     const adtype specific_total_enthalpy = specific_total_energy + pressure/density;
   770     for (
int flux_dim=0; flux_dim<dim; ++flux_dim) {
   772         AD_conv_flux[0][flux_dim] = AD_conservative_soln[1+flux_dim];
   774         for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
   775             AD_conv_flux[1+velocity_dim][flux_dim] = density*vel[flux_dim]*vel[velocity_dim];
   777         AD_conv_flux[1+flux_dim][flux_dim] += pressure; 
   779         AD_conv_flux[nstate-1][flux_dim] = density*vel[flux_dim]*specific_total_enthalpy;
   784     dealii::Tensor<2,nstate,real> jacobian;
   785     for (
int sp=0; sp<nstate; sp++) {
   787         for (
int s=0; s<nstate; s++) {
   788             jacobian[s][sp] = 0.0;
   789             for (
int d=0;d<dim;d++) {
   791                 jacobian[s][sp] += AD_conv_flux[s][d].dx(sp)*normal[d];
   798 template <
int dim, 
int nstate, 
typename real>
   801     std::array<real,nstate> &conservative_soln)
 const   806     const std::array<real,nstate> primitive_soln = this->
template convert_conservative_to_primitive<real>(conservative_soln); 
   809     real temperature = this->
template compute_temperature<real>(primitive_soln); 
   812     adtype AD_temperature(1, 0, getValue<real>(temperature));
   815     adtype viscosity_coefficient = ((1.0 + temperature_ratio)/(AD_temperature + temperature_ratio))*pow(AD_temperature,1.5);
   816     adtype scaled_viscosity_coefficient = viscosity_coefficient/reynolds_number_inf;
   819     real dmudT = scaled_viscosity_coefficient.dx(0);
   824 template <
int dim, 
int nstate, 
typename real>
   825 template<
typename real2>
   828     const std::array<real2,nstate> &conservative_soln,
   829     const std::array<dealii::Tensor<1,dim,real2>,nstate> &solution_gradient)
 const   836     const std::array<real2,nstate> primitive_soln = this->
template convert_conservative_to_primitive<real2>(conservative_soln); 
   839     const std::array<dealii::Tensor<1,dim,real2>,nstate> primitive_soln_gradient = convert_conservative_gradient_to_primitive_gradient<real2>(conservative_soln, solution_gradient);
   842     const dealii::Tensor<2,dim,real2> viscous_stress_tensor = compute_viscous_stress_tensor<real2>(primitive_soln, primitive_soln_gradient);
   843     const dealii::Tensor<1,dim,real2> vel = this->
template extract_velocities_from_primitive<real2>(primitive_soln); 
   844     const dealii::Tensor<1,dim,real2> heat_flux = compute_heat_flux<real2>(primitive_soln, primitive_soln_gradient);
   847     const std::array<dealii::Tensor<1,dim,real2>,nstate> viscous_flux = dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<real2>(vel,viscous_stress_tensor,heat_flux);
   851 template <
int dim, 
int nstate, 
typename real>
   852 template<
typename real2>
   855     const dealii::Tensor<1,dim,real2> &vel,
   856     const dealii::Tensor<2,dim,real2> &viscous_stress_tensor,
   857     const dealii::Tensor<1,dim,real2> &heat_flux)
 const   866     std::array<dealii::Tensor<1,dim,real2>,nstate> viscous_flux;
   867     for (
int flux_dim=0; flux_dim<dim; ++flux_dim) {
   869         viscous_flux[0][flux_dim] = 0.0;
   871         for (
int stress_dim=0; stress_dim<dim; ++stress_dim){
   872             viscous_flux[1+stress_dim][flux_dim] = -viscous_stress_tensor[stress_dim][flux_dim];
   875         viscous_flux[nstate-1][flux_dim] = 0.0;
   876         for (
int stress_dim=0; stress_dim<dim; ++stress_dim){
   877            viscous_flux[nstate-1][flux_dim] -= vel[stress_dim]*viscous_stress_tensor[flux_dim][stress_dim];
   879         viscous_flux[nstate-1][flux_dim] += heat_flux[flux_dim];
   884 template <
int dim, 
int nstate, 
typename real>
   887    const dealii::Tensor<1,dim,real> &,
   888    const std::array<real,nstate> &soln_int,
   889    const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
   890    std::array<real,nstate> &soln_bc,
   891    std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
 const   898     const std::array<real,nstate> primitive_interior_values = this->
template convert_conservative_to_primitive<real>(soln_int);
   901     std::array<real,nstate> primitive_boundary_values;
   902     primitive_boundary_values[0] = primitive_interior_values[0];
   905     if(thermal_boundary_condition_type == thermal_boundary_condition_enum::isothermal) { 
   907         primitive_boundary_values[nstate-1] = this->compute_pressure_from_density_temperature(primitive_boundary_values[0], isothermal_wall_temperature);
   908     } 
else if(thermal_boundary_condition_type == thermal_boundary_condition_enum::adiabatic) {
   910         primitive_boundary_values[nstate-1] = primitive_interior_values[nstate-1];
   914     dealii::Tensor<1,dim,real> velocities_bc;
   915     for (
int d=0; d<dim; d++) {
   916         velocities_bc[d] = 0.0;
   918     for (
int d=0; d<dim; ++d) {
   919         primitive_boundary_values[1+d] = velocities_bc[d];
   924     const std::array<real,nstate> modified_conservative_boundary_values = this->convert_primitive_to_conservative(primitive_boundary_values);
   925     for (
int istate=0; istate<nstate; ++istate) {
   926         soln_bc[istate] = modified_conservative_boundary_values[istate];
   929     for (
int istate=0; istate<nstate; ++istate) {
   930         soln_grad_bc[istate] = soln_grad_int[istate];
   934 template <
int dim, 
int nstate, 
typename real>
   937     const dealii::Point<dim, real> &pos,
   938     const dealii::Tensor<1,dim,real> &,
   939     const std::array<real,nstate> &,
   940     const std::array<dealii::Tensor<1,dim,real>,nstate> &,
   941     std::array<real,nstate> &soln_bc,
   942     std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
 const   946     std::array<real,nstate> boundary_values;
   947     std::array<dealii::Tensor<1,dim,real>,nstate> boundary_gradients;
   948     for (
int i=0; i<nstate; i++) {
   949         boundary_values[i] = this->manufactured_solution_function->value (pos, i);
   950         boundary_gradients[i] = this->manufactured_solution_function->gradient (pos, i);
   952     for (
int istate=0; istate<nstate; istate++) {
   953         soln_bc[istate] = boundary_values[istate];
   955         soln_grad_bc[istate] = boundary_gradients[istate];
   981 template std::array<dealii::Tensor<1,PHILIP_DIM,double    >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double    >::convert_conservative_gradient_to_primitive_gradient<
double    >(
const std::array<double    ,PHILIP_DIM+2> &conservative_soln, 
const std::array<dealii::Tensor<1,PHILIP_DIM,double    >,PHILIP_DIM+2> &conservative_soln_gradient) 
const;
   982 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadType   >::convert_conservative_gradient_to_primitive_gradient<
FadType   >(
const std::array<FadType   ,PHILIP_DIM+2> &conservative_soln, 
const std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> &conservative_soln_gradient) 
const;
   983 template std::array<dealii::Tensor<1,PHILIP_DIM,RadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType   >::convert_conservative_gradient_to_primitive_gradient<
RadType   >(
const std::array<RadType   ,PHILIP_DIM+2> &conservative_soln, 
const std::array<dealii::Tensor<1,PHILIP_DIM,RadType   >,PHILIP_DIM+2> &conservative_soln_gradient) 
const;
   984 template std::array<dealii::Tensor<1,PHILIP_DIM,FadFadType>,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::convert_conservative_gradient_to_primitive_gradient<
FadFadType>(
const std::array<FadFadType,PHILIP_DIM+2> &conservative_soln, 
const std::array<dealii::Tensor<1,PHILIP_DIM,FadFadType>,PHILIP_DIM+2> &conservative_soln_gradient) 
const;
   985 template std::array<dealii::Tensor<1,PHILIP_DIM,RadFadType>,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::convert_conservative_gradient_to_primitive_gradient<
RadFadType>(
const std::array<RadFadType,PHILIP_DIM+2> &conservative_soln, 
const std::array<dealii::Tensor<1,PHILIP_DIM,RadFadType>,PHILIP_DIM+2> &conservative_soln_gradient) 
const;
   993 template std::array<dealii::Tensor<1,PHILIP_DIM,double    >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double    >::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<
double    >(
const dealii::Tensor<1,PHILIP_DIM,double    > &vel, 
const dealii::Tensor<2,PHILIP_DIM,double    > &viscous_stress_tensor, 
const dealii::Tensor<1,PHILIP_DIM,double    > &heat_flux) 
const;
   994 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadType   >::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<
FadType   >(
const dealii::Tensor<1,PHILIP_DIM,FadType   > &vel, 
const dealii::Tensor<2,PHILIP_DIM,FadType   > &viscous_stress_tensor, 
const dealii::Tensor<1,PHILIP_DIM,FadType   > &heat_flux) 
const;
   995 template std::array<dealii::Tensor<1,PHILIP_DIM,RadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType   >::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<
RadType   >(
const dealii::Tensor<1,PHILIP_DIM,RadType   > &vel, 
const dealii::Tensor<2,PHILIP_DIM,RadType   > &viscous_stress_tensor, 
const dealii::Tensor<1,PHILIP_DIM,RadType   > &heat_flux) 
const;
   996 template std::array<dealii::Tensor<1,PHILIP_DIM,FadFadType>,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<
FadFadType>(
const dealii::Tensor<1,PHILIP_DIM,FadFadType> &vel, 
const dealii::Tensor<2,PHILIP_DIM,FadFadType> &viscous_stress_tensor, 
const dealii::Tensor<1,PHILIP_DIM,FadFadType> &heat_flux) 
const;
   997 template std::array<dealii::Tensor<1,PHILIP_DIM,RadFadType>,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<
RadFadType>(
const dealii::Tensor<1,PHILIP_DIM,RadFadType> &vel, 
const dealii::Tensor<2,PHILIP_DIM,RadFadType> &viscous_stress_tensor, 
const dealii::Tensor<1,PHILIP_DIM,RadFadType> &heat_flux) 
const;
   999 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double    >::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<
FadType   >(
const dealii::Tensor<1,PHILIP_DIM,FadType   > &vel, 
const dealii::Tensor<2,PHILIP_DIM,FadType   > &viscous_stress_tensor, 
const dealii::Tensor<1,PHILIP_DIM,FadType   > &heat_flux) 
const;
  1000 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType   >::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<
FadType   >(
const dealii::Tensor<1,PHILIP_DIM,FadType   > &vel, 
const dealii::Tensor<2,PHILIP_DIM,FadType   > &viscous_stress_tensor, 
const dealii::Tensor<1,PHILIP_DIM,FadType   > &heat_flux) 
const;
  1001 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<
FadType   >(
const dealii::Tensor<1,PHILIP_DIM,FadType   > &vel, 
const dealii::Tensor<2,PHILIP_DIM,FadType   > &viscous_stress_tensor, 
const dealii::Tensor<1,PHILIP_DIM,FadType   > &heat_flux) 
const;
  1002 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::dissipative_flux_given_velocities_viscous_stress_tensor_and_heat_flux<
FadType   >(
const dealii::Tensor<1,PHILIP_DIM,FadType   > &vel, 
const dealii::Tensor<2,PHILIP_DIM,FadType   > &viscous_stress_tensor, 
const dealii::Tensor<1,PHILIP_DIM,FadType   > &heat_flux) 
const;
  1033 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,double    >::convert_conservative_gradient_to_primitive_gradient<
FadType   >(
const std::array<FadType   ,PHILIP_DIM+2> &conservative_soln, 
const std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> &conservative_soln_gradient) 
const;
  1034 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadType   >::convert_conservative_gradient_to_primitive_gradient<
FadType   >(
const std::array<FadType   ,PHILIP_DIM+2> &conservative_soln, 
const std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> &conservative_soln_gradient) 
const;
  1035 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,FadFadType>::convert_conservative_gradient_to_primitive_gradient<
FadType   >(
const std::array<FadType   ,PHILIP_DIM+2> &conservative_soln, 
const std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> &conservative_soln_gradient) 
const;
  1036 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> 
NavierStokes<PHILIP_DIM,PHILIP_DIM+2,RadFadType>::convert_conservative_gradient_to_primitive_gradient<
FadType   >(
const std::array<FadType   ,PHILIP_DIM+2> &conservative_soln, 
const std::array<dealii::Tensor<1,PHILIP_DIM,FadType   >,PHILIP_DIM+2> &conservative_soln_gradient) 
const;
 Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives. 
NavierStokes(const Parameters::AllParameters *const parameters_input, const double ref_length, const double gamma_gas, const double mach_inf, const double angle_of_attack, const double side_slip_angle, const double prandtl_number, const double reynolds_number_inf, const bool use_constant_viscosity, const double constant_viscosity, const double temperature_inf=273.15, const double isothermal_wall_temperature=1.0, const thermal_boundary_condition_enum thermal_boundary_condition_type=thermal_boundary_condition_enum::adiabatic, std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function=nullptr, const two_point_num_flux_enum two_point_num_flux_type=two_point_num_flux_enum::KG)
Constructor. 
Sacado::Fad::DFad< double > FadType
Sacado AD type for first derivatives. 
Manufactured solution used for grid studies to check convergence orders. 
codi_JacobianComputationType RadType
CoDiPaco reverse-AD type for first derivatives. 
Files for the baseline physics. 
Main parameter class that contains the various other sub-parameter classes. 
TwoPointNumericalFlux
Two point numerical flux type for split form. 
Euler equations. Derived from PhysicsBase. 
ThermalBoundaryCondition
Types of thermal boundary conditions available. 
codi_HessianComputationType RadFadType
Nested reverse-forward mode type for Jacobian and Hessian computation using TapeHelper. 
Navier-Stokes equations. Derived from Euler for the convective terms, which is derived from PhysicsBa...