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