3 #include <boost/preprocessor/seq/for_each.hpp> 13 template <
int dim,
int nspecies,
int nstate,
typename real>
16 const double ref_length,
17 const double gamma_gas,
18 const double mach_inf,
19 const double angle_of_attack,
20 const double side_slip_angle,
23 const bool has_nonzero_diffusion,
24 const bool has_nonzero_physical_source)
25 :
PhysicsBase<dim,nspecies,nstate,real>(parameters_input, has_nonzero_diffusion,has_nonzero_physical_source,manufactured_solution_function)
26 , ref_length(ref_length)
31 , mach_inf_sqr(mach_inf*mach_inf)
32 , angle_of_attack(angle_of_attack)
33 , side_slip_angle(side_slip_angle)
34 , sound_inf(1.0/(mach_inf))
35 , pressure_inf(1.0/(gam*mach_inf_sqr))
36 , entropy_inf(pressure_inf*pow(density_inf,-gam))
37 , two_point_num_flux_type(two_point_num_flux_type_input)
41 static_assert(nstate==dim+2,
"Physics::Euler() should be created with nstate=dim+2");
44 temperature_inf = gam*pressure_inf/density_inf * mach_inf_sqr;
47 if (std::abs(side_slip_angle) >= 1e-14) {
48 this->pcout <<
"Side slip angle = " << side_slip_angle <<
". Side_slip_angle must be zero. " << std::endl;
49 this->pcout <<
"I have not figured out the side slip angles just yet." << std::endl;
53 velocities_inf[0] = 1.0;
55 velocities_inf[0] = cos(angle_of_attack);
56 velocities_inf[1] = sin(angle_of_attack);
58 velocities_inf[0] = cos(angle_of_attack)*cos(side_slip_angle);
59 velocities_inf[1] = sin(angle_of_attack)*cos(side_slip_angle);
60 velocities_inf[2] = sin(side_slip_angle);
63 assert(std::abs(velocities_inf.norm() - 1.0) < 1e-14);
65 double velocity_inf_sqr = 1.0;
66 dynamic_pressure_inf = 0.5 * density_inf * velocity_inf_sqr;
69 template <
int dim,
int nspecies,
int nstate,
typename real>
72 const dealii::Point<dim,real> &pos,
73 const std::array<real,nstate> &conservative_soln,
74 const real current_time,
75 const dealii::types::global_dof_index )
const 77 return source_term(pos,conservative_soln,current_time);
80 template <
int dim,
int nspecies,
int nstate,
typename real>
83 const dealii::Point<dim,real> &pos,
84 const std::array<real,nstate> &,
87 std::array<real,nstate> source_term = convective_source_term(pos);
91 template <
int dim,
int nspecies,
int nstate,
typename real>
94 const dealii::Point<dim,real> &pos)
const 96 std::array<real,nstate> manufactured_solution;
97 for (
int s=0; s<nstate; s++) {
98 manufactured_solution[s] = this->manufactured_solution_function->value (pos, s);
100 assert(manufactured_solution[s] > 0);
103 return manufactured_solution;
106 template <
int dim,
int nspecies,
int nstate,
typename real>
109 const dealii::Point<dim,real> &pos)
const 111 std::vector<dealii::Tensor<1,dim,real>> manufactured_solution_gradient_dealii(nstate);
112 this->manufactured_solution_function->vector_gradient(pos,manufactured_solution_gradient_dealii);
113 std::array<dealii::Tensor<1,dim,real>,nstate> manufactured_solution_gradient;
114 for (
int d=0;d<dim;d++) {
115 for (
int s=0; s<nstate; s++) {
116 manufactured_solution_gradient[s][d] = manufactured_solution_gradient_dealii[s][d];
119 return manufactured_solution_gradient;
122 template <
int dim,
int nspecies,
int nstate,
typename real>
125 const dealii::Point<dim,real> &pos)
const 127 const std::array<real,nstate> manufactured_solution = get_manufactured_solution_value(pos);
128 const std::array<dealii::Tensor<1,dim,real>,nstate> manufactured_solution_gradient = get_manufactured_solution_gradient(pos);
130 dealii::Tensor<1,nstate,real> convective_flux_divergence;
131 for (
int d=0;d<dim;d++) {
132 dealii::Tensor<1,dim,real> normal;
134 const dealii::Tensor<2,nstate,real> jacobian = convective_flux_directional_jacobian(manufactured_solution, normal);
137 for (
int sr = 0; sr < nstate; ++sr) {
138 real jac_grad_row = 0.0;
139 for (
int sc = 0; sc < nstate; ++sc) {
140 jac_grad_row += jacobian[sr][sc]*manufactured_solution_gradient[sc][d];
142 convective_flux_divergence[sr] += jac_grad_row;
145 std::array<real,nstate> convective_source_term;
146 for (
int s=0; s<nstate; s++) {
147 convective_source_term[s] = convective_flux_divergence[s];
150 return convective_source_term;
153 template <
int dim,
int nspecies,
int nstate,
typename real>
154 template<
typename real2>
157 bool qty_is_positive;
159 if (this->all_parameters->limiter_param.bound_preserving_limiter != limiter_enum::positivity_preservingZhang2010
160 && this->all_parameters->limiter_param.bound_preserving_limiter != limiter_enum::positivity_preservingWang2012) {
163 qty = this->
template handle_non_physical_result<real2>(qty_name +
" is negative.");
164 qty_is_positive =
false;
167 qty_is_positive =
true;
170 qty_is_positive =
true;
172 return qty_is_positive;
175 template <
int dim,
int nspecies,
int nstate,
typename real>
176 template<
typename real2>
180 std::array<real2, nstate> primitive_soln;
182 real2 density = conservative_soln[0];
183 dealii::Tensor<1,dim,real2> vel = compute_velocities<real2>(conservative_soln);
184 real2 pressure = compute_pressure_templated<real2>(conservative_soln);
186 check_positive_quantity<real2>(density,
"density");
187 check_positive_quantity<real2>(pressure,
"pressure");
188 primitive_soln[0] = density;
189 for (
int d=0; d<dim; ++d) {
190 primitive_soln[1+d] = vel[d];
192 primitive_soln[nstate-1] = pressure;
194 return primitive_soln;
197 template <
int dim,
int nspecies,
int nstate,
typename real>
201 return convert_conservative_to_primitive_templated<real>(conservative_soln);
204 template <
int dim,
int nspecies,
int nstate,
typename real>
209 const real density = primitive_soln[0];
210 const dealii::Tensor<1,dim,real> velocities = extract_velocities_from_primitive<real>(primitive_soln);
212 std::array<real, nstate> conservative_soln;
213 conservative_soln[0] = density;
214 for (
int d=0; d<dim; ++d) {
215 conservative_soln[1+d] = density*velocities[d];
217 conservative_soln[nstate-1] = compute_total_energy(primitive_soln);
219 return conservative_soln;
222 template <
int dim,
int nspecies,
int nstate,
typename real>
225 const std::array<real,nstate> &primitive_soln,
226 const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient)
const 228 std::array<dealii::Tensor<1,dim,real>,nstate> conservative_soln_gradient;
231 const std::array<real,nstate> conservative_soln = convert_primitive_to_conservative(primitive_soln);
233 const real density = primitive_soln[0];
234 const dealii::Tensor<1,dim,real> vel = extract_velocities_from_primitive<real>(primitive_soln);
237 for (
int d=0; d<dim; d++) {
238 conservative_soln_gradient[0][d] = primitive_soln_gradient[0][d];
241 for (
int d1=0; d1<dim; d1++) {
242 for (
int d2=0; d2<dim; d2++) {
243 conservative_soln_gradient[1+d1][d2] = density*primitive_soln_gradient[1+d1][d2] + vel[d1]*conservative_soln_gradient[0][d2];
247 for (
int d1=0; d1<dim; d1++) {
248 conservative_soln_gradient[nstate-1][d1] = primitive_soln_gradient[nstate-1][d1];
249 conservative_soln_gradient[nstate-1][d1] /= this->gamm1;
250 for (
int d2=0; d2<dim; d2++) {
251 conservative_soln_gradient[nstate-1][d1] += 0.5*(primitive_soln[1+d2]*conservative_soln_gradient[1+d2][d1]
252 + conservative_soln[1+d2]*primitive_soln_gradient[1+d2][d1]);
255 return conservative_soln_gradient;
258 template <
int dim,
int nspecies,
int nstate,
typename real>
259 template<
typename real2>
262 const std::array<real2,nstate> &conservative_soln,
263 const std::array<dealii::Tensor<1,dim,real2>,nstate> &conservative_soln_gradient)
const 265 std::array<dealii::Tensor<1,dim,real2>,nstate> primitive_soln_gradient;
268 const std::array<real2,nstate> primitive_soln = convert_conservative_to_primitive_templated<real2>(conservative_soln);
270 const real2 density = primitive_soln[0];
271 const dealii::Tensor<1,dim,real2> vel = extract_velocities_from_primitive<real2>(primitive_soln);
274 for (
int d=0; d<dim; d++) {
275 primitive_soln_gradient[0][d] = conservative_soln_gradient[0][d];
278 for (
int d1=0; d1<dim; d1++) {
279 for (
int d2=0; d2<dim; d2++) {
280 primitive_soln_gradient[1+d1][d2] = (conservative_soln_gradient[1+d1][d2] - vel[d1]*conservative_soln_gradient[0][d2])/density;
294 for (
int d1=0; d1<dim; d1++) {
295 primitive_soln_gradient[nstate-1][d1] = conservative_soln_gradient[nstate-1][d1];
296 for (
int d2=0; d2<dim; d2++) {
297 primitive_soln_gradient[nstate-1][d1] -= 0.5*(primitive_soln[1+d2]*conservative_soln_gradient[1+d2][d1]
298 + conservative_soln[1+d2]*primitive_soln_gradient[1+d2][d1]);
300 primitive_soln_gradient[nstate-1][d1] *= this->gamm1;
302 return primitive_soln_gradient;
305 template <
int dim,
int nspecies,
int nstate,
typename real>
308 const std::array<real,nstate> &conservative_soln,
309 const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
const 311 return convert_conservative_gradient_to_primitive_gradient_templated<real>(conservative_soln,conservative_soln_gradient);
314 template <
int dim,
int nspecies,
int nstate,
typename real>
328 template <
int dim,
int nspecies,
int nstate,
typename real>
329 template<
typename real2>
333 const real2 density = conservative_soln[0];
334 dealii::Tensor<1,dim,real2> vel;
335 for (
int d=0; d<dim; ++d) { vel[d] = conservative_soln[1+d]/density; }
339 template <
int dim,
int nspecies,
int nstate,
typename real>
340 template <
typename real2>
345 for (
int d=0; d<dim; d++) {
346 vel2 = vel2 + velocities[d]*velocities[d];
352 template <
int dim,
int nspecies,
int nstate,
typename real>
353 template<
typename real2>
357 dealii::Tensor<1,dim,real2> velocities;
358 for (
int d=0; d<dim; d++) { velocities[d] = primitive_soln[1+d]; }
362 template <
int dim,
int nspecies,
int nstate,
typename real>
366 const real pressure = primitive_soln[nstate-1];
367 const real kinetic_energy = compute_kinetic_energy_from_primitive_solution(primitive_soln);
368 const real tot_energy = pressure / this->gamm1 + kinetic_energy;
372 template <
int dim,
int nspecies,
int nstate,
typename real>
376 const real density = primitive_soln[0];
377 const dealii::Tensor<1,dim,real> velocities = extract_velocities_from_primitive<real>(primitive_soln);
378 const real vel2 = compute_velocity_squared<real>(velocities);
379 const real kinetic_energy = 0.5*density*vel2;
380 return kinetic_energy;
383 template <
int dim,
int nspecies,
int nstate,
typename real>
387 const dealii::Tensor<1,dim,real> velocities = extract_velocities_from_primitive<real>(primitive_soln);
388 const real vel2 = compute_velocity_squared<real>(velocities);
389 const real kinetic_energy = 0.5*vel2;
390 return kinetic_energy;
393 template <
int dim,
int nspecies,
int nstate,
typename real>
397 const std::array<real,nstate> primitive_soln = convert_conservative_to_primitive_templated<real>(conservative_soln);
398 const real kinetic_energy = compute_kinetic_energy_from_primitive_solution(primitive_soln);
399 return kinetic_energy;
402 template <
int dim,
int nspecies,
int nstate,
typename real>
406 const std::array<real,nstate> primitive_soln = convert_conservative_to_primitive_templated<real>(conservative_soln);
407 const real kinetic_energy = compute_incompressible_kinetic_energy_from_primitive_solution(primitive_soln);
408 return kinetic_energy;
411 template <
int dim,
int nspecies,
int nstate,
typename real>
415 real density = conservative_soln[0];
416 const real pressure = compute_pressure_templated<real>(conservative_soln);
417 return compute_entropy_measure(density, pressure);
420 template <
int dim,
int nspecies,
int nstate,
typename real>
425 real density_check = density;
426 const bool density_is_positive = check_positive_quantity<real>(density_check,
"density");
427 if (density_is_positive)
return pressure*pow(density,-gam);
428 else return (real)this->BIG_NUMBER;
432 template <
int dim,
int nspecies,
int nstate,
typename real>
436 const real density = conservative_soln[0];
437 const real total_energy = conservative_soln[nstate-1];
438 const real specific_enthalpy = (total_energy+pressure)/density;
439 return specific_enthalpy;
442 template <
int dim,
int nspecies,
int nstate,
typename real>
446 const real density = conservative_soln[0];
448 const real entropy = compute_entropy_templated<real>(conservative_soln);
450 const real numerical_entropy_function = - density * entropy;
452 return numerical_entropy_function;
455 template <
int dim,
int nspecies,
int nstate,
typename real>
456 template<
typename real2>
460 const real2 density = primitive_soln[0];
461 const real2 pressure = primitive_soln[nstate-1];
462 const real2 temperature = gam*mach_inf_sqr*(pressure/density);
466 template <
int dim,
int nspecies,
int nstate,
typename real>
470 const real density = gam*mach_inf_sqr*(pressure/temperature);
474 template <
int dim,
int nspecies,
int nstate,
typename real>
478 const real temperature = gam*mach_inf_sqr*(pressure/density);
482 template <
int dim,
int nspecies,
int nstate,
typename real>
486 const real pressure = density*temperature/(gam*mach_inf_sqr);
490 template <
int dim,
int nspecies,
int nstate,
typename real>
491 template<
typename real2>
495 const real2 density = conservative_soln[0];
497 const real2 tot_energy = conservative_soln[nstate-1];
499 const dealii::Tensor<1,dim,real2> vel = compute_velocities<real2>(conservative_soln);
501 const real2 vel2 = compute_velocity_squared<real2>(vel);
502 real2 pressure = gamm1*(tot_energy - 0.5*density*vel2);
504 check_positive_quantity<real2>(pressure,
"pressure");
508 template <
int dim,
int nspecies,
int nstate,
typename real>
512 return compute_pressure_templated<real>(conservative_soln);
515 template <
int dim,
int nspecies,
int nstate,
typename real>
516 template<
typename real2>
520 real2 density = conservative_soln[0];
521 real2 pressure = compute_pressure_templated<real2>(conservative_soln);
522 const bool density_is_positive = check_positive_quantity(density,
"density");
523 const bool pressure_is_positive = check_positive_quantity(pressure,
"pressure");
524 if (density_is_positive && pressure_is_positive) {
525 real2 entropy = pressure * pow(density, -gam);
526 entropy = log(entropy);
529 this->pcout <<
"WARNING: Entropy is not defined because " << std::endl
530 <<
" pressure * pow(density, -gam) < 0 ." << std::endl
531 <<
" Setting entropy = BIG_NUMBER." << std::endl;
532 this->pcout <<
"Aborting..." << std::endl;
534 return (real2)this->BIG_NUMBER;
539 template <
int dim,
int nspecies,
int nstate,
typename real>
543 return compute_entropy_templated<real>(conservative_soln);
546 template <
int dim,
int nspecies,
int nstate,
typename real>
550 real density = conservative_soln[0];
551 check_positive_quantity<real>(density,
"density");
552 const real pressure = compute_pressure_templated<real>(conservative_soln);
553 const real sound = sqrt(pressure*gam/density);
557 template <
int dim,
int nspecies,
int nstate,
typename real>
562 const real sound = sqrt(pressure*gam/density);
566 template <
int dim,
int nspecies,
int nstate,
typename real>
570 const dealii::Tensor<1,dim,real> vel = compute_velocities<real>(conservative_soln);
571 const real velocity = sqrt(compute_velocity_squared<real>(vel));
572 const real sound = compute_sound (conservative_soln);
573 const real mach_number = velocity/sound;
579 template <
int dim,
int nspecies,
int nstate,
typename real>
582 const std::array<real,nstate> &conservative_soln2)
const 584 std::array<dealii::Tensor<1,dim,real>,nstate> conv_num_split_flux;
585 if(two_point_num_flux_type == two_point_num_flux_enum::KG) {
586 conv_num_split_flux = convective_numerical_split_flux_kennedy_gruber(conservative_soln1, conservative_soln2);
587 }
else if(two_point_num_flux_type == two_point_num_flux_enum::IR) {
588 conv_num_split_flux = convective_numerical_split_flux_ismail_roe(conservative_soln1, conservative_soln2);
589 }
else if(two_point_num_flux_type == two_point_num_flux_enum::CH) {
590 conv_num_split_flux = convective_numerical_split_flux_chandrashekar(conservative_soln1, conservative_soln2);
591 }
else if(two_point_num_flux_type == two_point_num_flux_enum::Ra) {
592 conv_num_split_flux = convective_numerical_split_flux_ranocha(conservative_soln1, conservative_soln2);
595 return conv_num_split_flux;
598 template <
int dim,
int nspecies,
int nstate,
typename real>
601 const std::array<real,nstate> &conservative_soln2)
const 603 std::array<dealii::Tensor<1,dim,real>,nstate> conv_num_split_flux;
604 const real mean_density = compute_mean_density(conservative_soln1, conservative_soln2);
605 const real mean_pressure = compute_mean_pressure(conservative_soln1, conservative_soln2);
606 const dealii::Tensor<1,dim,real> mean_velocities = compute_mean_velocities(conservative_soln1,conservative_soln2);
607 const real mean_specific_total_energy = compute_mean_specific_total_energy(conservative_soln1, conservative_soln2);
609 for (
int flux_dim = 0; flux_dim < dim; ++flux_dim)
612 conv_num_split_flux[0][flux_dim] = mean_density * mean_velocities[flux_dim];
614 for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
615 conv_num_split_flux[1+velocity_dim][flux_dim] = mean_density*mean_velocities[flux_dim]*mean_velocities[velocity_dim];
617 conv_num_split_flux[1+flux_dim][flux_dim] += mean_pressure;
619 conv_num_split_flux[nstate-1][flux_dim] = mean_density*mean_velocities[flux_dim]*mean_specific_total_energy + mean_pressure * mean_velocities[flux_dim];
622 return conv_num_split_flux;
625 template <
int dim,
int nspecies,
int nstate,
typename real>
630 std::array<real,nstate> ismail_roe_parameter_vector;
631 ismail_roe_parameter_vector[0] = sqrt(primitive_soln[0]/primitive_soln[nstate-1]);
632 for(
int d=0; d<dim; ++d){
633 ismail_roe_parameter_vector[1+d] = ismail_roe_parameter_vector[0]*primitive_soln[1+d];
635 ismail_roe_parameter_vector[nstate-1] = sqrt(primitive_soln[0]*primitive_soln[nstate-1]);
637 return ismail_roe_parameter_vector;
640 template <
int dim,
int nspecies,
int nstate,
typename real>
646 const real zeta = val1/val2;
647 const real f = (zeta-1.0)/(zeta+1.0);
651 if(u<1.0e-2){ F = 1.0 + u/3.0 + u*u/5.0 + u*u*u/7.0; }
656 const real log_mean_val = (val1+val2)/(2.0*F);
661 template <
int dim,
int nspecies,
int nstate,
typename real>
664 const std::array<real,nstate> &conservative_soln2)
const 667 const std::array<real,nstate> parameter_vector1 = compute_ismail_roe_parameter_vector_from_primitive(
668 convert_conservative_to_primitive_templated<real>(conservative_soln1));
669 const std::array<real,nstate> parameter_vector2 = compute_ismail_roe_parameter_vector_from_primitive(
670 convert_conservative_to_primitive_templated<real>(conservative_soln2));
673 std::array<real,nstate> avg_parameter_vector;
674 for(
int s=0; s<nstate; ++s){
675 avg_parameter_vector[s] = 0.5*(parameter_vector1[s] + parameter_vector2[s]);
679 std::array<real,nstate> log_mean_parameter_vector;
680 for(
int s=0; s<nstate; ++s){
681 log_mean_parameter_vector[s] = compute_ismail_roe_logarithmic_mean(parameter_vector1[s], parameter_vector2[s]);
685 std::array<real,dim> mean_velocities;
686 const real mean_density = avg_parameter_vector[0]*log_mean_parameter_vector[nstate-1];
687 for(
int d=0; d<dim; ++d){
688 mean_velocities[d] = avg_parameter_vector[1+d]/avg_parameter_vector[0];
690 const real mean_pressure = avg_parameter_vector[nstate-1]/avg_parameter_vector[0];
692 real mean_enthalpy = (gam+1.0)*(log_mean_parameter_vector[nstate-1]/log_mean_parameter_vector[0]) + gamm1*mean_pressure;
693 mean_enthalpy /= 2.0*gam;
694 mean_enthalpy *= gam/(mean_density*gamm1);
696 real mean_velocities_sqr_sum = 0.0;
697 for(
int d=0; d<dim; ++d){
698 mean_velocities_sqr_sum += mean_velocities[d]*mean_velocities[d];
701 mean_enthalpy += 0.5*mean_velocities_sqr_sum;
704 std::array<dealii::Tensor<1,dim,real>,nstate> conv_num_split_flux;
705 for (
int flux_dim = 0; flux_dim < dim; ++flux_dim)
708 conv_num_split_flux[0][flux_dim] = mean_density * mean_velocities[flux_dim];
710 for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
711 conv_num_split_flux[1+velocity_dim][flux_dim] = mean_density*mean_velocities[flux_dim]*mean_velocities[velocity_dim];
713 conv_num_split_flux[1+flux_dim][flux_dim] += mean_pressure;
715 conv_num_split_flux[nstate-1][flux_dim] = mean_density*mean_velocities[flux_dim]*mean_enthalpy;
718 return conv_num_split_flux;
721 template <
int dim,
int nspecies,
int nstate,
typename real>
724 const std::array<real,nstate> &conservative_soln2)
const 727 std::array<dealii::Tensor<1,dim,real>,nstate> conv_num_split_flux;
728 const real rho_log = compute_ismail_roe_logarithmic_mean(conservative_soln1[0], conservative_soln2[0]);
729 const real pressure1 = compute_pressure_templated<real>(conservative_soln1);
730 const real pressure2 = compute_pressure_templated<real>(conservative_soln2);
732 const real beta1 = conservative_soln1[0]/(2.0*pressure1);
733 const real beta2 = conservative_soln2[0]/(2.0*pressure2);
735 const real beta_log = compute_ismail_roe_logarithmic_mean(beta1, beta2);
736 const dealii::Tensor<1,dim,real> vel1 = compute_velocities<real>(conservative_soln1);
737 const dealii::Tensor<1,dim,real> vel2 = compute_velocities<real>(conservative_soln2);
739 const real pressure_hat = 0.5*(conservative_soln1[0] + conservative_soln2[0])/(2.0*0.5*(beta1+beta2));
741 dealii::Tensor<1,dim,real> vel_avg;
742 real vel_square_avg = 0.0;;
743 for(
int idim=0; idim<dim; idim++){
744 vel_avg[idim] = 0.5*(vel1[idim]+vel2[idim]);
745 vel_square_avg += (0.5 *(vel1[idim]+vel2[idim])) * (0.5 *(vel1[idim]+vel2[idim]));
748 real enthalpy_hat = 1.0/(2.0*beta_log*gamm1) + vel_square_avg + pressure_hat/rho_log;
750 for(
int idim=0; idim<dim; idim++){
751 enthalpy_hat -= 0.5*(0.5*(vel1[idim]*vel1[idim] + vel2[idim]*vel2[idim]));
754 for(
int flux_dim=0; flux_dim<dim; flux_dim++){
756 conv_num_split_flux[0][flux_dim] = rho_log * vel_avg[flux_dim];
758 for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
759 conv_num_split_flux[1+velocity_dim][flux_dim] = rho_log*vel_avg[flux_dim]*vel_avg[velocity_dim];
761 conv_num_split_flux[1+flux_dim][flux_dim] += pressure_hat;
764 conv_num_split_flux[nstate-1][flux_dim] = rho_log * vel_avg[flux_dim] * enthalpy_hat;
767 return conv_num_split_flux;
770 template <
int dim,
int nspecies,
int nstate,
typename real>
773 const std::array<real,nstate> &conservative_soln2)
const 776 std::array<dealii::Tensor<1,dim,real>,nstate> conv_num_split_flux;
777 const real rho_log = compute_ismail_roe_logarithmic_mean(conservative_soln1[0], conservative_soln2[0]);
778 const real pressure1 = compute_pressure_templated<real>(conservative_soln1);
779 const real pressure2 = compute_pressure_templated<real>(conservative_soln2);
781 const real beta1 = conservative_soln1[0]/(pressure1);
782 const real beta2 = conservative_soln2[0]/(pressure2);
784 const real beta_log = compute_ismail_roe_logarithmic_mean(beta1, beta2);
785 const dealii::Tensor<1,dim,real> vel1 = compute_velocities<real>(conservative_soln1);
786 const dealii::Tensor<1,dim,real> vel2 = compute_velocities<real>(conservative_soln2);
788 const real pressure_hat = 0.5*(pressure1+pressure2);
790 dealii::Tensor<1,dim,real> vel_avg;
791 real vel_square_avg = 0.0;;
792 for(
int idim=0; idim<dim; idim++){
793 vel_avg[idim] = 0.5*(vel1[idim]+vel2[idim]);
794 vel_square_avg += (0.5 *(vel1[idim]+vel2[idim])) * (0.5 *(vel1[idim]+vel2[idim]));
797 real enthalpy_hat = 1.0/(beta_log*gamm1) + vel_square_avg + 2.0*pressure_hat/rho_log;
799 for(
int idim=0; idim<dim; idim++){
800 enthalpy_hat -= 0.5*(0.5*(vel1[idim]*vel1[idim] + vel2[idim]*vel2[idim]));
803 for(
int flux_dim=0; flux_dim<dim; flux_dim++){
805 conv_num_split_flux[0][flux_dim] = rho_log * vel_avg[flux_dim];
807 for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
808 conv_num_split_flux[1+velocity_dim][flux_dim] = rho_log*vel_avg[flux_dim]*vel_avg[velocity_dim];
810 conv_num_split_flux[1+flux_dim][flux_dim] += pressure_hat;
813 conv_num_split_flux[nstate-1][flux_dim] = rho_log * vel_avg[flux_dim] * enthalpy_hat;
814 conv_num_split_flux[nstate-1][flux_dim] -= ( 0.5 *(pressure1*vel1[flux_dim] + pressure2*vel2[flux_dim]));
817 return conv_num_split_flux;
821 template <
int dim,
int nspecies,
int nstate,
typename real>
824 const std::array<real,nstate> &conservative_soln)
const 826 std::array<real,nstate> entropy_var;
827 const real density = conservative_soln[0];
828 const real pressure = compute_pressure_templated<real>(conservative_soln);
830 const real entropy = compute_entropy_templated<real>(conservative_soln);
832 const real rho_theta = pressure / gamm1;
834 entropy_var[0] = (rho_theta *(gam + 1.0 - entropy) - conservative_soln[nstate-1])/rho_theta;
835 for(
int idim=0; idim<dim; idim++){
836 entropy_var[idim+1] = conservative_soln[idim+1] / rho_theta;
838 entropy_var[nstate-1] = - density / rho_theta;
843 template <
int dim,
int nspecies,
int nstate,
typename real>
846 const std::array<real,nstate> &entropy_var)
const 850 std::array<real,nstate> conservative_var;
851 real entropy_var_vel_squared = 0.0;
852 for(
int idim=0; idim<dim; idim++){
853 entropy_var_vel_squared += entropy_var[idim + 1] * entropy_var[idim + 1];
855 const real entropy = gam - entropy_var[0] + 0.5 * entropy_var_vel_squared / entropy_var[nstate-1];
856 const real rho_theta = pow( (gamm1/ pow(- entropy_var[nstate-1], gam)), 1.0 /gamm1)
857 * exp( - entropy / gamm1);
859 conservative_var[0] = - rho_theta * entropy_var[nstate-1];
860 for(
int idim=0; idim<dim; idim++){
861 conservative_var[idim+1] = rho_theta * entropy_var[idim+1];
863 conservative_var[nstate-1] = rho_theta * (1.0 - 0.5 * entropy_var_vel_squared / entropy_var[nstate-1]);
864 return conservative_var;
867 template <
int dim,
int nspecies,
int nstate,
typename real>
870 const std::array<real,nstate> &conservative_soln)
const 872 std::array<real,nstate> kin_energy_var;
873 const dealii::Tensor<1,dim,real> vel = compute_velocities<real>(conservative_soln);
874 const real vel2 = compute_velocity_squared<real>(vel);
876 kin_energy_var[0] = - 0.5 * vel2;
877 for(
int idim=0; idim<dim; idim++){
878 kin_energy_var[idim+1] = vel[idim];
880 kin_energy_var[nstate-1] = 0;
882 return kin_energy_var;
885 template <
int dim,
int nspecies,
int nstate,
typename real>
888 const std::array<real,nstate> &conservative_soln2)
const 890 return (conservative_soln1[0] + conservative_soln2[0])/2.;
893 template <
int dim,
int nspecies,
int nstate,
typename real>
896 const std::array<real,nstate> &conservative_soln2)
const 898 real pressure_1 = compute_pressure_templated<real>(conservative_soln1);
899 real pressure_2 = compute_pressure_templated<real>(conservative_soln2);
900 return (pressure_1 + pressure_2)/2.;
903 template <
int dim,
int nspecies,
int nstate,
typename real>
906 const std::array<real,nstate> &conservative_soln2)
const 908 dealii::Tensor<1,dim,real> vel_1 = compute_velocities<real>(conservative_soln1);
909 dealii::Tensor<1,dim,real> vel_2 = compute_velocities<real>(conservative_soln2);
910 dealii::Tensor<1,dim,real> mean_vel;
911 for (
int d=0; d<dim; ++d) {
912 mean_vel[d] = 0.5*(vel_1[d]+vel_2[d]);
917 template <
int dim,
int nspecies,
int nstate,
typename real>
920 const std::array<real,nstate> &conservative_soln2)
const 922 return ((conservative_soln1[nstate-1]/conservative_soln1[0]) + (conservative_soln2[nstate-1]/conservative_soln2[0]))/2.;
926 template <
int dim,
int nspecies,
int nstate,
typename real>
930 std::array<dealii::Tensor<1,dim,real>,nstate> conv_flux;
931 const real density = conservative_soln[0];
932 const real pressure = compute_pressure_templated<real>(conservative_soln);
933 const dealii::Tensor<1,dim,real> vel = compute_velocities<real>(conservative_soln);
934 const real specific_total_energy = conservative_soln[nstate-1]/conservative_soln[0];
935 const real specific_total_enthalpy = specific_total_energy + pressure/density;
937 for (
int flux_dim=0; flux_dim<dim; ++flux_dim) {
939 conv_flux[0][flux_dim] = conservative_soln[1+flux_dim];
941 for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
942 conv_flux[1+velocity_dim][flux_dim] = density*vel[flux_dim]*vel[velocity_dim];
944 conv_flux[1+flux_dim][flux_dim] += pressure;
946 conv_flux[nstate-1][flux_dim] = density*vel[flux_dim]*specific_total_enthalpy;
951 template <
int dim,
int nspecies,
int nstate,
typename real>
955 std::array<real, nstate> conv_normal_flux;
956 const real density = conservative_soln[0];
957 const real pressure = compute_pressure_templated<real>(conservative_soln);
958 const dealii::Tensor<1,dim,real> vel = compute_velocities<real>(conservative_soln);
959 real normal_vel = 0.0;
960 for (
int d=0; d<dim; ++d) {
961 normal_vel += vel[d]*normal[d];
963 const real total_energy = conservative_soln[nstate-1];
964 const real specific_total_enthalpy = (total_energy + pressure) / density;
966 const real rhoV = density*normal_vel;
968 conv_normal_flux[0] = rhoV;
970 for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
971 conv_normal_flux[1+velocity_dim] = rhoV*vel[velocity_dim] + normal[velocity_dim] * pressure;
974 conv_normal_flux[nstate-1] = rhoV*specific_total_enthalpy;
975 return conv_normal_flux;
978 template <
int dim,
int nspecies,
int nstate,
typename real>
981 const std::array<real,nstate> &conservative_soln,
982 const dealii::Tensor<1,dim,real> &normal)
const 987 const dealii::Tensor<1,dim,real> vel = compute_velocities<real>(conservative_soln);
988 real vel_normal = 0.0;
989 for (
int d=0;d<dim;d++) { vel_normal += vel[d] * normal[d]; }
991 const real vel2 = compute_velocity_squared<real>(vel);
992 const real phi = 0.5*gamm1 * vel2;
994 const real density = conservative_soln[0];
995 const real tot_energy = conservative_soln[nstate-1];
996 const real E = tot_energy / density;
997 const real a1 = gam*E-phi;
998 const real a2 = gam-1.0;
999 const real a3 = gam-2.0;
1001 dealii::Tensor<2,nstate,real> jacobian;
1002 for (
int d=0; d<dim; ++d) {
1003 jacobian[0][1+d] = normal[d];
1005 for (
int row_dim=0; row_dim<dim; ++row_dim) {
1006 jacobian[1+row_dim][0] = normal[row_dim]*phi - vel[row_dim] * vel_normal;
1007 for (
int col_dim=0; col_dim<dim; ++col_dim){
1008 if (row_dim == col_dim) {
1009 jacobian[1+row_dim][1+col_dim] = vel_normal - a3*normal[row_dim]*vel[row_dim];
1011 jacobian[1+row_dim][1+col_dim] = normal[col_dim]*vel[row_dim] - a2*normal[row_dim]*vel[col_dim];
1014 jacobian[1+row_dim][nstate-1] = normal[row_dim]*a2;
1016 jacobian[nstate-1][0] = vel_normal*(phi-a1);
1017 for (
int d=0; d<dim; ++d){
1018 jacobian[nstate-1][1+d] = normal[d]*a1 - a2*vel[d]*vel_normal;
1020 jacobian[nstate-1][nstate-1] = gam*vel_normal;
1025 template <
int dim,
int nspecies,
int nstate,
typename real>
1028 const std::array<real,nstate> &conservative_soln,
1029 const dealii::Tensor<1,dim,real> &normal)
const 1031 const dealii::Tensor<1,dim,real> vel = compute_velocities<real>(conservative_soln);
1032 std::array<real,nstate> eig;
1033 real vel_dot_n = 0.0;
1034 for (
int d=0;d<dim;++d) { vel_dot_n += vel[d]*normal[d]; };
1035 for (
int i=0; i<nstate; i++) {
1045 template <
int dim,
int nspecies,
int nstate,
typename real>
1049 const dealii::Tensor<1,dim,real> vel = compute_velocities<real>(conservative_soln);
1051 const real sound = compute_sound (conservative_soln);
1053 real vel2 = compute_velocity_squared<real>(vel);
1055 const real max_eig = sqrt(vel2) + sound;
1060 template <
int dim,
int nspecies,
int nstate,
typename real>
1063 const std::array<real,nstate> &conservative_soln,
1064 const dealii::Tensor<1,dim,real> &normal)
const 1066 const dealii::Tensor<1,dim,real> vel = compute_velocities<real>(conservative_soln);
1068 const real sound = compute_sound (conservative_soln);
1069 real vel_dot_n = 0.0;
1070 for (
int d=0;d<dim;++d) { vel_dot_n += vel[d]*normal[d]; };
1071 const real max_normal_eig = abs(vel_dot_n) + sound;
1073 return max_normal_eig;
1076 template <
int dim,
int nspecies,
int nstate,
typename real>
1083 template <
int dim,
int nspecies,
int nstate,
typename real>
1086 const std::array<real,nstate> &conservative_soln,
1087 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
1088 const dealii::types::global_dof_index )
const 1090 return dissipative_flux(conservative_soln, solution_gradient);
1093 template <
int dim,
int nspecies,
int nstate,
typename real>
1096 const std::array<real,nstate> &,
1097 const std::array<dealii::Tensor<1,dim,real>,nstate> &)
const 1099 std::array<dealii::Tensor<1,dim,real>,nstate> diss_flux;
1101 for (
int i=0; i<nstate; i++) {
1107 template <
int dim,
int nspecies,
int nstate,
typename real>
1110 const dealii::Tensor<1,dim,real> &normal_int,
1111 const std::array<real,nstate> &soln_int,
1112 std::array<real,nstate> &soln_bc)
const 1114 std::array<real,nstate> primitive_int = convert_conservative_to_primitive_templated<real>(soln_int);
1115 std::array<real,nstate> primitive_ext;
1116 primitive_ext[0] = density_inf;
1117 for (
int d=0;d<dim;d++) { primitive_ext[1+d] = velocities_inf[d]; }
1118 primitive_ext[nstate-1] = pressure_inf;
1120 const dealii::Tensor<1,dim,real> velocities_int = extract_velocities_from_primitive<real>(primitive_int);
1121 const dealii::Tensor<1,dim,real> velocities_ext = extract_velocities_from_primitive<real>(primitive_ext);
1123 const real sound_int = compute_sound ( primitive_int[0], primitive_int[nstate-1] );
1124 const real sound_ext = compute_sound ( primitive_ext[0], primitive_ext[nstate-1] );
1126 real vel_int_dot_normal = 0.0;
1127 real vel_ext_dot_normal = 0.0;
1128 for (
int d=0; d<dim; d++) {
1129 vel_int_dot_normal = vel_int_dot_normal + velocities_int[d]*normal_int[d];
1130 vel_ext_dot_normal = vel_ext_dot_normal + velocities_ext[d]*normal_int[d];
1134 const real out_riemann_invariant = vel_int_dot_normal + 2.0/gamm1*sound_int,
1135 inc_riemann_invariant = vel_ext_dot_normal - 2.0/gamm1*sound_ext;
1137 const real normal_velocity_bc = 0.5*(out_riemann_invariant+inc_riemann_invariant),
1138 sound_bc = 0.25*gamm1*(out_riemann_invariant-inc_riemann_invariant);
1140 std::array<real,nstate> primitive_bc;
1141 if (abs(normal_velocity_bc) >= abs(sound_bc)) {
1142 if (normal_velocity_bc < 0.0) {
1143 primitive_bc = primitive_ext;
1145 primitive_bc = primitive_int;
1150 dealii::Tensor<1,dim,real> velocities_bc;
1153 dealii::Tensor<1,dim,real> velocities_tangential;
1154 if (normal_velocity_bc < 0.0) {
1155 const real entropy_ext = compute_entropy_measure(primitive_ext[0], primitive_ext[nstate-1]);
1156 density_bc = pow( 1.0/gam * sound_bc * sound_bc / entropy_ext, 1.0/gamm1 );
1157 for (
int d=0; d<dim; ++d) {
1158 velocities_tangential[d] = velocities_ext[d] - vel_ext_dot_normal * normal_int[d];
1161 const real entropy_int = compute_entropy_measure(primitive_int[0], primitive_int[nstate-1]);
1162 density_bc = pow( 1.0/gam * sound_bc * sound_bc / entropy_int, 1.0/gamm1 );
1163 for (
int d=0; d<dim; ++d) {
1164 velocities_tangential[d] = velocities_int[d] - vel_int_dot_normal * normal_int[d];
1167 for (
int d=0; d<dim; ++d) {
1168 velocities_bc[d] = velocities_tangential[d] + normal_velocity_bc*normal_int[d];
1171 pressure_bc = 1.0/gam * sound_bc * sound_bc * density_bc;
1173 primitive_bc[0] = density_bc;
1174 for (
int d=0;d<dim;d++) { primitive_bc[1+d] = velocities_bc[d]; }
1175 primitive_bc[nstate-1] = pressure_bc;
1178 soln_bc = convert_primitive_to_conservative(primitive_bc);
1181 template <
int dim,
int nspecies,
int nstate,
typename real>
1184 const dealii::Tensor<1,dim,real> &normal_int,
1185 const std::array<real,nstate> &soln_int,
1186 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
1187 std::array<real,nstate> &soln_bc,
1188 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 1195 const std::array<real,nstate> primitive_interior_values = convert_conservative_to_primitive_templated<real>(soln_int);
1198 std::array<real,nstate> primitive_boundary_values;
1199 primitive_boundary_values[0] = primitive_interior_values[0];
1200 primitive_boundary_values[nstate-1] = primitive_interior_values[nstate-1];
1202 const dealii::Tensor<1,dim,real> surface_normal = -normal_int;
1203 const dealii::Tensor<1,dim,real> velocities_int = extract_velocities_from_primitive<real>(primitive_interior_values);
1205 real vel_int_dot_normal = 0.0;
1206 for (
int d=0; d<dim; d++) {
1207 vel_int_dot_normal = vel_int_dot_normal + velocities_int[d]*surface_normal[d];
1209 dealii::Tensor<1,dim,real> velocities_bc;
1210 for (
int d=0; d<dim; d++) {
1211 velocities_bc[d] = velocities_int[d] - 2.0*(vel_int_dot_normal)*surface_normal[d];
1215 for (
int d=0; d<dim; ++d) {
1216 primitive_boundary_values[1+d] = velocities_bc[d];
1219 const std::array<real,nstate> modified_conservative_boundary_values = convert_primitive_to_conservative(primitive_boundary_values);
1220 for (
int istate=0; istate<nstate; ++istate) {
1221 soln_bc[istate] = modified_conservative_boundary_values[istate];
1224 for (
int istate=0; istate<nstate; ++istate) {
1225 soln_grad_bc[istate] = -soln_grad_int[istate];
1229 template <
int dim,
int nspecies,
int nstate,
typename real>
1232 const dealii::Tensor<1,dim,real> &normal_int,
1233 const std::array<real,nstate> &soln_int,
1234 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
1235 std::array<real,nstate> &soln_bc,
1236 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 1239 boundary_slip_wall(normal_int, soln_int, soln_grad_int, soln_bc, soln_grad_bc);
1242 template <
int dim,
int nspecies,
int nstate,
typename real>
1245 const dealii::Point<dim, real> &pos,
1246 const dealii::Tensor<1,dim,real> &normal_int,
1247 const std::array<real,nstate> &soln_int,
1248 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
1249 std::array<real,nstate> &soln_bc,
1250 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 1253 std::array<real,nstate> conservative_boundary_values;
1254 std::array<dealii::Tensor<1,dim,real>,nstate> boundary_gradients;
1255 for (
int s=0; s<nstate; s++) {
1256 conservative_boundary_values[s] = this->manufactured_solution_function->value (pos, s);
1257 boundary_gradients[s] = this->manufactured_solution_function->gradient (pos, s);
1259 std::array<real,nstate> primitive_boundary_values = convert_conservative_to_primitive_templated<real>(conservative_boundary_values);
1260 for (
int istate=0; istate<nstate; ++istate) {
1262 std::array<real,nstate> characteristic_dot_n = convective_eigenvalues(conservative_boundary_values, normal_int);
1263 const bool inflow = (characteristic_dot_n[istate] <= 0.);
1267 soln_bc[istate] = conservative_boundary_values[istate];
1268 soln_grad_bc[istate] = soln_grad_int[istate];
1275 const std::array<real,nstate> modified_conservative_boundary_values = convert_primitive_to_conservative(primitive_boundary_values);
1276 (void) modified_conservative_boundary_values;
1278 soln_bc[istate] = conservative_boundary_values[istate];
1282 soln_bc[istate] = soln_int[istate];
1289 soln_grad_bc[istate] = soln_grad_int[istate];
1295 soln_bc[istate] = conservative_boundary_values[istate];
1299 template <
int dim,
int nspecies,
int nstate,
typename real>
1302 const real total_inlet_pressure,
1303 const real back_pressure,
1304 const std::array<real,nstate> &soln_int,
1305 std::array<real,nstate> &soln_bc)
const 1310 const real mach_int = compute_mach_number(soln_int);
1311 if (mach_int > 1.0) {
1313 for (
int istate=0; istate<nstate; ++istate) {
1314 soln_bc[istate] = soln_int[istate];
1318 const std::array<real,nstate> primitive_interior_values = convert_conservative_to_primitive_templated<real>(soln_int);
1319 const real pressure_int = primitive_interior_values[nstate-1];
1321 const real radicant = 1.0+0.5*gamm1*mach_inf_sqr;
1322 const real pressure_inlet = total_inlet_pressure * pow(radicant, -gam/gamm1);
1323 const real pressure_bc = (mach_int >= 1) * pressure_int + (1-(mach_int >= 1)) * back_pressure*pressure_inlet;
1324 const real temperature_int = compute_temperature<real>(primitive_interior_values);
1327 std::array<real,nstate> primitive_boundary_values;
1328 primitive_boundary_values[0] = compute_density_from_pressure_temperature(pressure_bc, temperature_int);
1329 for (
int d=0;d<dim;d++) { primitive_boundary_values[1+d] = primitive_interior_values[1+d]; }
1330 primitive_boundary_values[nstate-1] = pressure_bc;
1332 const std::array<real,nstate> conservative_bc = convert_primitive_to_conservative(primitive_boundary_values);
1333 for (
int istate=0; istate<nstate; ++istate) {
1334 soln_bc[istate] = conservative_bc[istate];
1339 template <
int dim,
int nspecies,
int nstate,
typename real>
1342 const real total_inlet_pressure,
1343 const real total_inlet_temperature,
1344 const dealii::Tensor<1,dim,real> &normal_int,
1345 const std::array<real,nstate> &soln_int,
1346 std::array<real,nstate> &soln_bc)
const 1351 const std::array<real,nstate> primitive_interior_values = convert_conservative_to_primitive_templated<real>(soln_int);
1353 const dealii::Tensor<1,dim,real> normal = -normal_int;
1355 const real density_i = primitive_interior_values[0];
1356 const dealii::Tensor<1,dim,real> velocities_i = extract_velocities_from_primitive<real>(primitive_interior_values);
1357 const real pressure_i = primitive_interior_values[nstate-1];
1360 real normal_vel_i = 0.0;
1361 for (
int d=0; d<dim; ++d) {
1362 normal_vel_i += velocities_i[d]*normal[d];
1364 const real sound_i = compute_sound(soln_int);
1372 if(mach_inf < 1.0) {
1379 const real riemann_pos = normal_vel_i + 2.0*sound_i/gamm1;
1381 const real specific_total_energy = soln_int[nstate-1]/density_i;
1382 const real specific_total_enthalpy = specific_total_energy + pressure_i/density_i;
1384 const real a = 1.0+2.0/gamm1;
1385 const real b = -2.0*riemann_pos;
1386 const real c = 0.5*gamm1 * (riemann_pos*riemann_pos - 2.0*specific_total_enthalpy);
1388 const real term1 = -0.5*b/a;
1389 const real term2= 0.5*sqrt(b*b-4.0*a*c)/a;
1390 const real sound_bc1 = term1 + term2;
1391 const real sound_bc2 = term1 - term2;
1393 const real sound_bc = std::max(sound_bc1, sound_bc2);
1396 const real velocity_magnitude_bc = riemann_pos - 2.0*sound_bc/gamm1;
1397 const real mach_bc = velocity_magnitude_bc/sound_bc;
1399 const real radicant = 1.0+0.5*gamm1*mach_bc*mach_bc;
1400 const real pressure_bc = total_inlet_pressure * pow(radicant, -gam/gamm1);
1401 const real temperature_bc = total_inlet_temperature * pow(radicant, -1.0);
1405 const real density_bc = compute_density_from_pressure_temperature(pressure_bc, temperature_bc);
1406 std::array<real,nstate> primitive_boundary_values;
1407 primitive_boundary_values[0] = density_bc;
1408 for (
int d=0;d<dim;d++) { primitive_boundary_values[1+d] = velocity_magnitude_bc*normal[d]; }
1409 primitive_boundary_values[nstate-1] = pressure_bc;
1410 const std::array<real,nstate> conservative_bc = convert_primitive_to_conservative(primitive_boundary_values);
1411 for (
int istate=0; istate<nstate; ++istate) {
1412 soln_bc[istate] = conservative_bc[istate];
1424 const real radicant = 1.0+0.5*gamm1*mach_inf_sqr;
1425 const real static_inlet_pressure = total_inlet_pressure * pow(radicant, -gam/gamm1);
1426 const real static_inlet_temperature = total_inlet_temperature * pow(radicant, -1.0);
1428 const real pressure_bc = static_inlet_pressure;
1429 const real temperature_bc = static_inlet_temperature;
1430 const real density_bc = compute_density_from_pressure_temperature(pressure_bc, temperature_bc);
1431 const real sound_bc = sqrt(gam * pressure_bc / density_bc);
1432 const real velocity_magnitude_bc = mach_inf * sound_bc;
1435 std::array<real,nstate> primitive_boundary_values;
1436 primitive_boundary_values[0] = density_bc;
1437 for (
int d=0;d<dim;d++) { primitive_boundary_values[1+d] = -velocity_magnitude_bc*normal_int[d]; }
1438 primitive_boundary_values[nstate-1] = pressure_bc;
1439 const std::array<real,nstate> conservative_bc = convert_primitive_to_conservative(primitive_boundary_values);
1440 for (
int istate=0; istate<nstate; ++istate) {
1441 soln_bc[istate] = conservative_bc[istate];
1446 template <
int dim,
int nspecies,
int nstate,
typename real>
1449 std::array<real,nstate> &soln_bc)
const 1451 const real density_bc = density_inf;
1452 const real pressure_bc = 1.0/(gam*mach_inf_sqr);
1453 std::array<real,nstate> primitive_boundary_values;
1454 primitive_boundary_values[0] = density_bc;
1455 for (
int d=0;d<dim;d++) { primitive_boundary_values[1+d] = velocities_inf[d]; }
1456 primitive_boundary_values[nstate-1] = pressure_bc;
1457 const std::array<real,nstate> conservative_bc = convert_primitive_to_conservative(primitive_boundary_values);
1458 for (
int istate=0; istate<nstate; ++istate) {
1459 soln_bc[istate] = conservative_bc[istate];
1463 template <
int dim,
int nspecies,
int nstate,
typename real>
1466 const std::array<real, nstate>& soln_int,
1467 std::array<real, nstate>& soln_bc,
1468 std::array<dealii::Tensor<1, dim, real>, nstate>& soln_grad_bc)
const 1470 for (
int istate = 0; istate < nstate; ++istate) {
1471 soln_bc[istate] = soln_int[istate];
1472 soln_grad_bc[istate] = 0;
1477 template <
int dim,
int nspecies,
int nstate,
typename real>
1480 std::array<real, nstate>& soln_bc)
const 1482 std::array<real, nstate> primitive_boundary_values;
1483 for (
int istate = 0; istate < nstate; ++istate) {
1484 primitive_boundary_values[istate] = this->all_parameters->euler_param.custom_boundary_for_each_state[istate];
1487 const std::array<real, nstate> conservative_bc = convert_primitive_to_conservative(primitive_boundary_values);
1488 for (
int istate = 0; istate < nstate; ++istate) {
1489 soln_bc[istate] = conservative_bc[istate];
1493 template <
int dim,
int nspecies,
int nstate,
typename real>
1496 std::array<real, nstate>& soln_bc)
const 1498 std::array<real, nstate> primitive_boundary_values;
1499 for (
int istate = 0; istate < nstate; ++istate) {
1501 primitive_boundary_values[istate] = 0.5;
1503 primitive_boundary_values[istate] = 0.0;
1505 primitive_boundary_values[istate] = 0.0;
1507 primitive_boundary_values[istate] = 0.4127;
1509 primitive_boundary_values[istate] = 0.0;
1512 const std::array<real, nstate> conservative_bc = convert_primitive_to_conservative(primitive_boundary_values);
1513 for (
int istate = 0; istate < nstate; ++istate) {
1514 soln_bc[istate] = conservative_bc[istate];
1518 template <
int dim,
int nspecies,
int nstate,
typename real>
1521 const int boundary_type,
1522 const dealii::Point<dim, real> &pos,
1523 const dealii::Tensor<1,dim,real> &normal_int,
1524 const std::array<real,nstate> &soln_int,
1525 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
1526 std::array<real,nstate> &soln_bc,
1527 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 1530 const real total_inlet_pressure = pressure_inf*pow(1.0+0.5*gamm1*mach_inf_sqr, gam/gamm1);
1531 const real total_inlet_temperature = temperature_inf*pow(total_inlet_pressure/pressure_inf, gamm1/gam);
1533 if (boundary_type == 1000) {
1535 boundary_manufactured_solution (pos, normal_int, soln_int, soln_grad_int, soln_bc, soln_grad_bc);
1537 else if (boundary_type == 1001) {
1539 boundary_wall (normal_int, soln_int, soln_grad_int, soln_bc, soln_grad_bc);
1541 else if (boundary_type == 1002) {
1543 const real back_pressure = 0.99;
1544 boundary_pressure_outflow (total_inlet_pressure, back_pressure, soln_int, soln_bc);
1546 else if (boundary_type == 1003) {
1548 boundary_inflow (total_inlet_pressure, total_inlet_temperature, normal_int, soln_int, soln_bc);
1550 else if (boundary_type == 1004) {
1552 boundary_riemann (normal_int, soln_int, soln_bc);
1554 else if (boundary_type == 1005) {
1556 boundary_farfield(soln_bc);
1558 else if (boundary_type == 1006) {
1560 boundary_slip_wall (normal_int, soln_int, soln_grad_int, soln_bc, soln_grad_bc);
1562 else if (boundary_type == 1007) {
1564 boundary_p0_extrapolation (soln_int, soln_bc, soln_grad_bc);
1566 else if (boundary_type == 1008) {
1568 boundary_custom (soln_bc);
1570 else if (boundary_type == 1009) {
1572 boundary_astrophysical_inflow (soln_bc);
1575 this->pcout <<
"Invalid boundary_type: " << boundary_type << std::endl;
1580 template <
int dim,
int nspecies,
int nstate,
typename real>
1582 const dealii::Vector<double> &uh,
1583 const std::vector<dealii::Tensor<1,dim> > &duh,
1584 const std::vector<dealii::Tensor<2,dim> > &dduh,
1585 const dealii::Tensor<1,dim> &normals,
1586 const dealii::Point<dim> &evaluation_points)
const 1588 std::vector<std::string> names = post_get_names ();
1590 unsigned int current_data_index = computed_quantities.size() - 1;
1591 computed_quantities.grow_or_shrink(names.size());
1592 if constexpr (std::is_same<real,double>::value) {
1594 std::array<double, nstate> conservative_soln;
1595 for (
unsigned int s=0; s<nstate; ++s) {
1596 conservative_soln[s] = uh(s);
1598 const std::array<double, nstate> primitive_soln = convert_conservative_to_primitive_templated<real>(conservative_soln);
1602 computed_quantities(++current_data_index) = primitive_soln[0];
1604 for (
unsigned int d=0; d<dim; ++d) {
1605 computed_quantities(++current_data_index) = primitive_soln[1+d];
1608 for (
unsigned int d=0; d<dim; ++d) {
1609 computed_quantities(++current_data_index) = conservative_soln[1+d];
1612 computed_quantities(++current_data_index) = conservative_soln[nstate-1];
1614 computed_quantities(++current_data_index) = primitive_soln[nstate-1];
1616 computed_quantities(++current_data_index) = (primitive_soln[nstate-1] - pressure_inf) / dynamic_pressure_inf;
1618 computed_quantities(++current_data_index) = compute_temperature<real>(primitive_soln);
1620 computed_quantities(++current_data_index) = compute_entropy_measure(conservative_soln) - entropy_inf;
1622 computed_quantities(++current_data_index) = compute_mach_number(conservative_soln);
1625 if (computed_quantities.size()-1 != current_data_index) {
1626 this->pcout <<
" Did not assign a value to all the data. Missing " << computed_quantities.size() - current_data_index <<
" variables." 1627 <<
" If you added a new output variable, make sure the names and DataComponentInterpretation match the above. " 1631 return computed_quantities;
1634 template <
int dim,
int nspecies,
int nstate,
typename real>
1638 namespace DCI = dealii::DataComponentInterpretation;
1640 interpretation.push_back (DCI::component_is_scalar);
1641 for (
unsigned int d=0; d<dim; ++d) {
1642 interpretation.push_back (DCI::component_is_part_of_vector);
1644 for (
unsigned int d=0; d<dim; ++d) {
1645 interpretation.push_back (DCI::component_is_part_of_vector);
1647 interpretation.push_back (DCI::component_is_scalar);
1648 interpretation.push_back (DCI::component_is_scalar);
1649 interpretation.push_back (DCI::component_is_scalar);
1650 interpretation.push_back (DCI::component_is_scalar);
1651 interpretation.push_back (DCI::component_is_scalar);
1652 interpretation.push_back (DCI::component_is_scalar);
1654 std::vector<std::string> names = post_get_names();
1655 if (names.size() != interpretation.size()) {
1656 this->pcout <<
"Number of DataComponentInterpretation is not the same as number of names for output file" << std::endl;
1658 return interpretation;
1662 template <
int dim,
int nspecies,
int nstate,
typename real>
1667 names.push_back (
"density");
1668 for (
unsigned int d=0; d<dim; ++d) {
1669 names.push_back (
"velocity");
1671 for (
unsigned int d=0; d<dim; ++d) {
1672 names.push_back (
"momentum");
1674 names.push_back (
"energy");
1675 names.push_back (
"pressure");
1676 names.push_back (
"pressure_coefficient");
1677 names.push_back (
"temperature");
1679 names.push_back (
"entropy_generation");
1680 names.push_back (
"mach_number");
1684 template <
int dim,
int nspecies,
int nstate,
typename real>
1689 return dealii::update_values
1690 | dealii::update_quadrature_points
1694 #if PHILIP_SPECIES==1 1696 #define POSSIBLE_TYPES (double)(FadType)(RadType)(FadFadType)(RadFadType) 1699 #define INSTANTIATE_TYPES(r, data, type) \ 1700 template std::array<dealii::Tensor<1,PHILIP_DIM,type>,PHILIP_DIM+2> Euler<PHILIP_DIM,PHILIP_SPECIES,PHILIP_DIM+2,type>::convert_conservative_gradient_to_primitive_gradient_templated<type>(const std::array<type,PHILIP_DIM+2> &conservative_soln, const std::array<dealii::Tensor<1,PHILIP_DIM,type>,PHILIP_DIM+2> &conservative_soln_gradient) const; \ 1701 template std::array<type, PHILIP_DIM+2> Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type>::convert_conservative_to_primitive_templated< type >(const std::array<type, PHILIP_DIM+2> &conservative_soln) const; \ 1702 template class Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >; \ 1703 template bool Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::check_positive_quantity< type >(type &qty, const std::string qty_name) const; \ 1704 template type Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::compute_pressure_templated< type >(const std::array<type, PHILIP_DIM+2> &conservative_soln) const; \ 1705 template type Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::compute_entropy_templated< type >(const std::array<type, PHILIP_DIM+2> &conservative_soln) const; \ 1706 template type Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::compute_temperature< type >(const std::array<type, PHILIP_DIM+2> &primitive_soln) const; \ 1707 template type Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::compute_velocity_squared< type >(const dealii::Tensor<1,PHILIP_DIM, type > &velocities) const; \ 1708 template dealii::Tensor<1,PHILIP_DIM, type > Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::extract_velocities_from_primitive< type >(const std::array<type, PHILIP_DIM+2> &primitive_soln) const; \ 1709 template dealii::Tensor<1,PHILIP_DIM, type > Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::compute_velocities< type >(const std::array<type, PHILIP_DIM+2> &conservative_soln) const; 1710 BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_TYPES, _, POSSIBLE_TYPES)
1712 #undef POSSIBLE_TYPES 1713 #define POSSIBLE_TYPES (double)(RadType)(FadFadType)(RadFadType) 1715 #define INSTANTIATE_FADTYPES(r, data, type) \ 1716 template std::array<dealii::Tensor<1,PHILIP_DIM,FadType>,PHILIP_DIM+2> Euler<PHILIP_DIM,PHILIP_SPECIES,PHILIP_DIM+2,type>::convert_conservative_gradient_to_primitive_gradient_templated<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;\ 1717 template std::array<FadType, PHILIP_DIM+2> Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type>::convert_conservative_to_primitive_templated< FadType >(const std::array<FadType, PHILIP_DIM+2> &conservative_soln) const; \ 1718 template bool Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::check_positive_quantity< FadType >(FadType &qty, const std::string qty_name) const; \ 1719 template FadType Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::compute_pressure_templated< FadType >(const std::array<FadType, PHILIP_DIM+2> &conservative_soln) const; \ 1720 template FadType Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::compute_entropy_templated< FadType >(const std::array<FadType, PHILIP_DIM+2> &conservative_soln) const; \ 1721 template FadType Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::compute_temperature< FadType >(const std::array<FadType, PHILIP_DIM+2> &primitive_soln) const; \ 1722 template FadType Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::compute_velocity_squared< FadType >(const dealii::Tensor<1,PHILIP_DIM, FadType > &velocities) const; \ 1723 template dealii::Tensor<1,PHILIP_DIM, FadType > Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::extract_velocities_from_primitive< FadType >(const std::array<FadType, PHILIP_DIM+2> &primitive_soln) const; \ 1724 template dealii::Tensor<1,PHILIP_DIM, FadType > Euler < PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+2, type >::compute_velocities< FadType >(const std::array<FadType, PHILIP_DIM+2> &conservative_soln) const; 1725 BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_FADTYPES, _, POSSIBLE_TYPES)
LimiterType
Limiter type to be applied on the solution.
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Manufactured solution used for grid studies to check convergence orders.
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.
Euler(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, std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function=nullptr, const two_point_num_flux_enum two_point_num_flux_type=two_point_num_flux_enum::KG, const bool has_nonzero_diffusion=false, const bool has_nonzero_physical_source=false)
Constructor.