14 template <
int dim,
int nspecies,
int nstate,
typename real>
18 const bool has_nonzero_diffusion,
19 const bool has_nonzero_physical_source)
20 :
PhysicsBase<dim,nspecies,nstate,real>(parameters_input, has_nonzero_diffusion,has_nonzero_physical_source,manufactured_solution_function)
21 , gam_ref(parameters_input->euler_param.gamma_gas)
22 , mach_ref(parameters_input->euler_param.mach_inf)
23 , mach_ref_sqr(mach_ref*mach_ref)
24 , two_point_num_flux_type(parameters_input->two_point_num_flux_type)
25 , Ru(8.31446261815324)
26 , MW_Air(28.9651159 * pow(10,-3))
28 , temperature_ref(298.15)
29 , u_ref(mach_ref*sqrt(gam_ref*R_ref*temperature_ref))
30 , u_ref_sqr(u_ref*u_ref)
34 static_assert(nstate==dim+nspecies+1,
"Physics::RealGas() should be created with nstate=PHILIP_DIM+PHILIP_SPECIES+1");
36 this->
pcout <<
"Name of chemistry file containing NASA CAP data for species has not been passed in. Aborting..." << std::endl;
43 template <
int dim,
int nspecies,
int nstate,
typename real>
47 std::string line, dum_char;
49 std::ifstream chemfile (NASADataFilename);
50 std::getline(chemfile, line);
51 std::getline(chemfile, line);
52 int N_species = (int)std::stof(line);
53 if(nspecies != N_species) {
54 std::cout << std::endl << std::endl
55 <<
"----------------------------------------------------" 57 <<
"Number of species in chemistry file does not match PHILIP_SPECIES." << std::endl
58 <<
"Number of species in file = " << N_species <<
" and PHILIP_SPECIES = " << PHILIP_SPECIES << std::endl
59 <<
"Aborting!" << std::endl
60 <<
"----------------------------------------------------" 65 std::string dummy_name;
66 std::string::size_type sz1;
71 for(
int i=0; i<nspecies; i++)
75 std::getline(chemfile, line);
76 std::getline(chemfile, line);
77 std::getline(chemfile, line);
78 species_name[i] = line;
79 std::getline(chemfile, line);
80 std::getline(chemfile, line);
81 std::getline(chemfile, line);
82 species_weight[i] = std::stof(line);
83 species_weight[i] /= 1000.0;
85 std::getline(chemfile, line);
86 std::getline(chemfile, line);
87 std::getline(chemfile, line);
88 species_enthalpy_offset[i] = std::stof(line);
89 species_enthalpy_offset[i] /= (this->species_weight[i]*this->
u_ref_sqr);
91 std::getline(chemfile, line);
92 std::getline(chemfile, line);
93 std::getline(chemfile, line);
94 for(
int j=0; j<4; j++)
96 line = line.substr(sz1);
98 NASACAPTemperatureLimits[i][j] = std::stof(line,&sz1);
101 std::getline(chemfile, line);
102 std::getline(chemfile, line);
104 for(
int k=0; k<3; k++) {
106 std::getline(chemfile, line);
107 for(
int j=0; j<9; j++)
109 line = line.substr(sz1);
116 this->Rs = compute_Rs(this->
Ru);
120 template <
int dim,
int nspecies,
int nstate,
typename real>
124 if (temperature != temperature) {
125 std::cout<<
"Temperature passed in is NaN...Aborting." << std::endl;
128 if (temperature < 0) {
129 std::cout<<
"Temperature passed in is negative... Temperature = " << temperature <<
"...Aborting." << std::endl;
132 std::array<int,nspecies> species_tempindex;
133 for(
int ispecies=0; ispecies<nspecies; ispecies++)
135 species_tempindex[ispecies] = -2;
136 if(temperature < NASACAPTemperatureLimits[ispecies][0]) {
137 species_tempindex[ispecies] = -1;
139 else if((temperature >= NASACAPTemperatureLimits[ispecies][0]) && (temperature < NASACAPTemperatureLimits[ispecies][1]))
141 species_tempindex[ispecies] = 0;
143 else if((temperature >= NASACAPTemperatureLimits[ispecies][1]) && (temperature < NASACAPTemperatureLimits[ispecies][2]))
145 species_tempindex[ispecies] = 1;
147 else if((temperature >= NASACAPTemperatureLimits[ispecies][2]) && (temperature <= NASACAPTemperatureLimits[ispecies][3]))
149 species_tempindex[ispecies] = 2;
151 else if(temperature > NASACAPTemperatureLimits[ispecies][2]) {
152 species_tempindex[ispecies] = 3;
156 std::cout<<
"Invalid temperature of " << temperature <<
" was passed in...Aborting." << std::endl;
161 return species_tempindex;
164 template <
int dim,
int nspecies,
int nstate,
typename real>
167 const std::array<real,nstate> &conservative_soln,
168 const dealii::Tensor<1,dim,real> &normal)
const 170 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
171 std::array<real,nstate> eig;
172 real vel_dot_n = 0.0;
173 for (
int d=0;d<dim;++d) { vel_dot_n += vel[d]*normal[d]; };
174 for (
int i=0; i<nstate; i++) {
181 template <
int dim,
int nspecies,
int nstate,
typename real>
186 real vel2 = compute_velocity_squared_from_conservative_solution(conservative_soln);
188 const real max_eig = sqrt(vel2) + sound;
193 template <
int dim,
int nspecies,
int nstate,
typename real>
196 const std::array<real,nstate> &conservative_soln,
197 const dealii::Tensor<1,dim,real> &normal)
const 199 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
203 real vel_dot_n = 0.0;
204 for (
int d=0;d<dim;++d) { vel_dot_n += vel[d]*normal[d]; };
205 const real max_normal_eig = abs(vel_dot_n) + sound;
207 return max_normal_eig;
210 template <
int dim,
int nspecies,
int nstate,
typename real>
215 const real max_eig = 0.0;
219 template <
int dim,
int nspecies,
int nstate,
typename real>
222 const std::array<real,nstate> &,
223 const std::array<dealii::Tensor<1,dim,real>,nstate> &,
224 const dealii::types::global_dof_index )
const 226 std::array<dealii::Tensor<1,dim,real>,nstate> diss_flux;
228 for (
int i=0; i<nstate; i++) {
234 template <
int dim,
int nspecies,
int nstate,
typename real>
237 const dealii::Point<dim,real> &,
238 const std::array<real,nstate> &,
240 const dealii::types::global_dof_index )
const 242 this->
pcout<<
"Source Terms not implemented for RealGas."<<std::endl;
245 source_term.fill(0.0);
249 template <
int dim,
int nspecies,
int nstate,
typename real>
252 const dealii::Tensor<1,dim,real> &normal_int,
253 const std::array<real,nstate> &soln_int,
254 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
255 std::array<real,nstate> &soln_bc,
256 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 262 template <
int dim,
int nspecies,
int nstate,
typename real>
265 const dealii::Tensor<1,dim,real> &normal_int,
266 const std::array<real,nstate> &soln_int,
267 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
268 std::array<real,nstate> &soln_bc,
269 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 279 std::array<real,nstate> primitive_boundary_values;
280 primitive_boundary_values[0] = primitive_interior_values[0];
281 primitive_boundary_values[dim+1] = primitive_interior_values[dim+1];
282 for (
int ispecies = 0; ispecies < nspecies-1; ++ispecies) {
283 primitive_boundary_values[dim+2+ispecies] = primitive_interior_values[dim+2+ispecies];
286 const dealii::Tensor<1,dim,real> surface_normal = -normal_int;
287 dealii::Tensor<1,dim,real> velocities_int;
288 for (
int d=0; d<dim; d++) { velocities_int[d] = primitive_interior_values[1+d]; }
290 real vel_int_dot_normal = 0.0;
291 for (
int d=0; d<dim; d++) {
292 vel_int_dot_normal = vel_int_dot_normal + velocities_int[d]*surface_normal[d];
294 dealii::Tensor<1,dim,real> velocities_bc;
295 for (
int d=0; d<dim; d++) {
296 velocities_bc[d] = velocities_int[d] - 2.0*(vel_int_dot_normal)*surface_normal[d];
300 for (
int d=0; d<dim; ++d) {
301 primitive_boundary_values[1+d] = velocities_bc[d];
305 for (
int istate=0; istate<nstate; ++istate) {
306 soln_bc[istate] = modified_conservative_boundary_values[istate];
309 for (
int istate=0; istate<nstate; ++istate) {
310 soln_grad_bc[istate] = -soln_grad_int[istate];
314 template <
int dim,
int nspecies,
int nstate,
typename real>
317 const int boundary_type,
318 const dealii::Point<dim, real> &,
319 const dealii::Tensor<1,dim,real> &normal_int,
320 const std::array<real,nstate> &soln_int,
321 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
322 std::array<real,nstate> &soln_bc,
323 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 325 if (boundary_type == 1001) {
327 boundary_wall (normal_int, soln_int, soln_grad_int, soln_bc, soln_grad_bc);
328 }
else if (boundary_type == 1006) {
332 this->
pcout<<
"Boundary condition #" << boundary_type <<
" not implemented for RealGas."<<std::endl;
340 template <
int dim,
int nspecies,
int nstate,
typename real>
341 template<
typename real2>
345 const real2 mixture_density = conservative_soln[0];
347 return mixture_density;
351 template <
int dim,
int nspecies,
int nstate,
typename real>
355 const real mixture_density = compute_mixture_density(conservative_soln);
356 dealii::Tensor<1,dim,real> vel;
357 for (
int d=0; d<dim; ++d) { vel[d] = conservative_soln[1+d]/mixture_density; }
363 template <
int dim,
int nspecies,
int nstate,
typename real>
367 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
369 for (
int d=0; d<dim; d++) {
370 vel2 = vel2 + vel[d]*vel[d];
376 template <
int dim,
int nspecies,
int nstate,
typename real>
381 for (
int d=0; d<dim; d++) {
382 vel2 = vel2 + velocities[d]*velocities[d];
388 template <
int dim,
int nspecies,
int nstate,
typename real>
392 dealii::Tensor<1,dim,real> velocities;
393 for (
int d=0; d<dim; d++) { velocities[d] = primitive_soln[1+d]; }
398 template <
int dim,
int nspecies,
int nstate,
typename real>
402 const real vel2 = compute_velocity_squared_from_conservative_solution(conservative_soln);
403 const real k = 0.5*vel2;
409 template <
int dim,
int nspecies,
int nstate,
typename real>
413 const real mixture_density = compute_mixture_density(conservative_soln);
414 const real mixture_specific_total_energy = conservative_soln[dim+1]/mixture_density;
416 return mixture_specific_total_energy;
420 template <
int dim,
int nspecies,
int nstate,
typename real>
424 const real mixture_density = compute_mixture_density(conservative_soln);
425 std::array<real,nspecies> species_densities;
427 for (
int s=0; s<nspecies-1; ++s)
429 species_densities[s] = conservative_soln[dim+2+s];
430 sum += species_densities[s];
432 species_densities[nspecies-1] = mixture_density - sum;
434 return species_densities;
438 template <
int dim,
int nspecies,
int nstate,
typename real>
442 const real mixture_density = compute_mixture_density(conservative_soln);
443 const std::array<real,nspecies> species_densities = compute_species_densities(conservative_soln);
444 std::array<real,nspecies> mass_fractions;
445 for (
int s=0; s<nspecies; ++s)
447 mass_fractions[s] = species_densities[s]/mixture_density;
450 return mass_fractions;
454 template <
int dim,
int nspecies,
int nstate,
typename real>
459 for (
int s=0; s<nspecies; ++s)
461 mixture += mass_fractions[s]*species[s];
468 template <
int dim,
int nspecies,
int nstate,
typename real>
472 const real dimensional_temperature = temperature*this->
temperature_ref;
474 return dimensional_temperature;
478 template <
int dim,
int nspecies,
int nstate,
typename real>
482 std::array<real,nspecies> Rs;
483 for (
int s=0; s<nspecies; ++s)
485 Rs[s] = Ru/this->species_weight[s]/this->
R_ref;
494 template <
int dim,
int nspecies,
int nstate,
typename real>
498 real dimensional_temperature = compute_dimensional_temperature(temperature);
499 std::array<real,nspecies> Cp;
502 if (dimensional_temperature < 0) {
503 std::cout<<
"Cp Calculation Error: Temperature passed in is negative... Temperature = " << dimensional_temperature <<
"...Aborting." << std::endl;
508 for (
int s=0; s<nspecies; ++s)
512 if(species_tempindex[s] == -1) {
513 species_tempindex[s] = 0;
514 dimensional_temperature = NASACAPTemperatureLimits[s][0];
516 if(species_tempindex[s] == 3) {
517 species_tempindex[s] = 2;
518 dimensional_temperature = NASACAPTemperatureLimits[s][2];
520 for (
int i=0; i<7; i++)
522 Cp[s] += this->
NASACAPCoeffs[s][i][species_tempindex[s]]*pow(dimensional_temperature,i-2);
524 Cp[s] *= this->Rs[s];
531 template <
int dim,
int nspecies,
int nstate,
typename real>
535 const std::array<real,nspecies> Cp = compute_species_specific_Cp(temperature);
536 std::array<real,nspecies> Cv;
538 for (
int s=0; s<nspecies; ++s)
540 Cv[s] = Cp[s] - this->Rs[s];
550 template <
int dim,
int nspecies,
int nstate,
typename real>
554 real dimensional_temperature = compute_dimensional_temperature(temperature);
555 std::array<real,nspecies> h;
557 if (dimensional_temperature < 0) {
558 std::cout<<
"Species Enthalpy Calculation Error: Temperature passed in is negative... Temperature = " << dimensional_temperature <<
"...Aborting." << std::endl;
563 for (
int s=0; s<nspecies; ++s)
567 real out_of_bounds_temp = -1.0;
568 if(species_tempindex[s] == -1) {
569 species_tempindex[s] = 0;
570 std::array<real,nspecies> Cp_species = compute_species_specific_Cp(NASACAPTemperatureLimits[s][0]);
573 out_of_bounds_temp = dimensional_temperature;
574 dimensional_temperature = NASACAPTemperatureLimits[s][0];
576 if(species_tempindex[s] == 3) {
577 species_tempindex[s] = 2;
578 std::array<real,nspecies> Cp_species = compute_species_specific_Cp(NASACAPTemperatureLimits[s][2]);
581 out_of_bounds_temp = dimensional_temperature;
582 dimensional_temperature = NASACAPTemperatureLimits[s][2];
584 h[s] = -this->
NASACAPCoeffs[s][0][species_tempindex[s]]*pow(dimensional_temperature,-2)
585 +this->
NASACAPCoeffs[s][1][species_tempindex[s]]*pow(dimensional_temperature,-1)*log(dimensional_temperature)
586 +this->
NASACAPCoeffs[s][7][species_tempindex[s]]*pow(dimensional_temperature,-1);
587 for (
int i=2; i<7; i++)
589 h[s] += this->
NASACAPCoeffs[s][i][species_tempindex[s]]*pow(dimensional_temperature,i-2)/((double)(i-1));
592 if(out_of_bounds_temp != -1.0) {
593 h[s] = h[s]*(dimensional_temperature/out_of_bounds_temp) + ((out_of_bounds_temp - dimensional_temperature)/out_of_bounds_temp) * Cp;
596 if(out_of_bounds_temp != -1.0)
597 h[s] *= ((this->Ru*out_of_bounds_temp)/(this->species_weight[s]*this->
u_ref_sqr));
599 h[s] *= ((this->Ru*dimensional_temperature)/(this->species_weight[s]*this->u_ref_sqr));
601 h[s] += species_enthalpy_offset[s];
604 if (out_of_bounds_temp != -1.0)
605 dimensional_temperature = out_of_bounds_temp;
611 template <
int dim,
int nspecies,
int nstate,
typename real>
616 const std::array<real,nspecies> Rs = compute_Rs(this->Ru);
617 std::array<real,nspecies> e;
618 for (
int s=0; s<nspecies; ++s)
627 template <
int dim,
int nspecies,
int nstate,
typename real>
630 const real temperature)
const 632 real dimensional_temperature = compute_dimensional_temperature(temperature);
633 std::array<real,nspecies> species_entropy;
635 if (dimensional_temperature < 0) {
636 std::cout<<
" Species Entropy Calculation Error: Temperature passed in is negative... Temperature = " << dimensional_temperature <<
"...Aborting." << std::endl;
642 for (
int s=0; s<nspecies; ++s)
646 real out_of_bounds_temp = -1.0;
647 if(species_tempindex[s] == -1) {
648 species_tempindex[s] = 0;
649 std::array<real,nspecies> Cp_species = compute_species_specific_Cp(NASACAPTemperatureLimits[s][0]);
652 out_of_bounds_temp = dimensional_temperature;
653 dimensional_temperature = NASACAPTemperatureLimits[s][0];
655 if(species_tempindex[s] == 3) {
656 species_tempindex[s] = 2;
657 std::array<real,nspecies> Cp_species = compute_species_specific_Cp(NASACAPTemperatureLimits[s][2]);
660 out_of_bounds_temp = dimensional_temperature;
661 dimensional_temperature = NASACAPTemperatureLimits[s][2];
663 species_entropy[s] = -this->
NASACAPCoeffs[s][0][species_tempindex[s]]*pow(dimensional_temperature,-2)*0.5
664 -this->
NASACAPCoeffs[s][1][species_tempindex[s]]*pow(dimensional_temperature,-1)
665 +this->
NASACAPCoeffs[s][2][species_tempindex[s]]*log(dimensional_temperature)
667 for (
int i=3; i<7; i++)
669 species_entropy[s] += this->
NASACAPCoeffs[s][i][species_tempindex[s]]*pow(dimensional_temperature,
double(i-2))/((double)(i-2));
672 if(out_of_bounds_temp != -1.0) {
673 species_entropy[s] = species_entropy[s] + log(dimensional_temperature/out_of_bounds_temp) * Cp;
677 if (out_of_bounds_temp != -1.0)
678 dimensional_temperature = out_of_bounds_temp;
679 species_entropy[s] *= this->Rs[s];
680 species_entropy[s] -= this->Rs[s]*log(temperature);
683 return species_entropy;
687 template <
int dim,
int nspecies,
int nstate,
typename real>
690 const std::array<real,nstate> &conservative_soln)
const 693 const std::array<real,nspecies> species_densities = compute_species_densities(conservative_soln);
696 for(
int ispecies = 0; ispecies < nspecies; ispecies++) {
697 species_entropy[ispecies] -= this->Rs[ispecies]*log(temperature*species_densities[ispecies]*this->
density_ref);
700 return species_entropy;
705 template <
int dim,
int nspecies,
int nstate,
typename real>
708 const std::array<real,nstate> &conservative_soln)
const 710 const std::array<real,nspecies> species_entropy = compute_species_entropy(conservative_soln);
711 const std::array<real,nspecies> mass_fractions = compute_mass_fractions(conservative_soln);
713 const real entropy = compute_mixture_from_species(mass_fractions,species_entropy);
714 if(entropy != entropy) {
715 std::cout <<
"The calculated entropy is NaN - this is likely due to a species having a mass fraction of zero...Aborting." << std::endl;
723 template <
int dim,
int nspecies,
int nstate,
typename real>
726 const std::array<real,nstate> &conservative_soln)
const 730 std::array<real,nspecies> species_entropy = compute_species_entropy(conservative_soln);
731 std::array<real,nspecies> species_Cp = compute_species_specific_Cp(temperature);
733 std::array<real, nspecies> species_gibbs;
734 for(
int ispecies = 0; ispecies < nspecies; ++ispecies) {
735 species_gibbs[ispecies] = temperature*(species_Cp[ispecies] - species_entropy[ispecies]);
738 return species_gibbs;
742 template <
int dim,
int nspecies,
int nstate,
typename real>
745 const std::array<real,nstate> &conservative_soln)
const 747 std::array<real,nstate> entropy_var;
749 std::array<real,nspecies> species_gibbs = compute_species_gibbs_energy(conservative_soln);
750 real vel2 = compute_velocity_squared_from_conservative_solution(conservative_soln);
752 entropy_var[0] = species_gibbs[nspecies-1] - (0.5*vel2);
753 entropy_var[dim+1] = -1.0;
755 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
756 for (
int idim = 0; idim < dim; ++idim) {
757 entropy_var[idim+1] = vel[idim];
760 for (
int ispecies = 0; ispecies < nspecies - 1; ++ispecies) {
761 entropy_var[dim+2+ispecies] = species_gibbs[ispecies] - species_gibbs[nspecies-1];
764 for (
int istate = 0; istate < nstate; ++istate) {
765 entropy_var[istate] /= temperature;
772 template <
int dim,
int nspecies,
int nstate,
typename real>
775 const std::array<real,nstate> &entropy_var)
const 777 std::array<real,nstate> conservative_var;
778 const real temperature = -1/entropy_var[dim+1];
779 const int nth_species_idx = nspecies - 1;
781 std::array<real,nspecies> species_gibbs;
783 real entropy_var_vel_squared = 0.0;
784 for(
int idim=0; idim<dim; idim++){
785 entropy_var_vel_squared += pow(entropy_var[idim + 1]*temperature, 2.0);
788 species_gibbs[nth_species_idx] = temperature*entropy_var[0] + entropy_var_vel_squared/2.0;
789 for(
int ispecies = 0; ispecies < nth_species_idx; ++ispecies) {
790 species_gibbs[ispecies] = temperature*entropy_var[dim+2+ispecies] + species_gibbs[nth_species_idx];
793 std::array<real,nspecies> species_entropy;
794 std::array<real,nspecies> species_Cp = compute_species_specific_Cp(temperature);
795 for(
int ispecies = 0; ispecies < nth_species_idx; ++ispecies) {
796 species_entropy[ispecies] = species_Cp[ispecies] - (species_gibbs[ispecies]/temperature);
798 species_entropy[nth_species_idx] = species_Cp[nth_species_idx] - (species_gibbs[nth_species_idx]/temperature);
800 std::array<real,nspecies> species_density;
801 const std::array<real,nspecies> Rs = compute_Rs(this->Ru);
802 conservative_var[0] = 0.0;
803 for(
int ispecies = 0; ispecies < nspecies; ++ispecies) {
806 species_density[ispecies] = (exp((species_entropy_integral[ispecies] - species_entropy[ispecies])/(Rs[ispecies])))/(temperature*this->
density_ref);
807 conservative_var[0] += species_density[ispecies];
809 if (dim + 2 + ispecies < nstate)
810 conservative_var[dim+2+ispecies] = species_density[ispecies];
813 const real mixture_density = conservative_var[0];
815 for (
int idim = 0; idim < dim; ++idim) {
816 conservative_var[idim+1] = mixture_density*entropy_var[idim+1]*temperature;
820 const real specific_kinetic_energy = 0.50*entropy_var_vel_squared;
823 std::array<real,nspecies> species_specific_internal_energy;
824 std::array<real,nspecies> species_specific_total_energy;
826 for (
int s=0; s<nspecies; ++s)
829 species_specific_total_energy[s] = species_specific_internal_energy[s] + specific_kinetic_energy;
832 real mixture_specific_total_energy = 0.0;
833 for(
int ispecies = 0; ispecies < nspecies; ++ispecies) {
834 mixture_specific_total_energy += species_specific_total_energy[ispecies] *(species_density[ispecies]/mixture_density);
836 conservative_var[dim+1] = mixture_density*mixture_specific_total_energy;
838 return conservative_var;
842 template <
int dim,
int nspecies,
int nstate,
typename real>
845 const std::array<real,nstate> &conservative_soln)
const 847 std::array<real,nstate> kin_energy_var;
848 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
849 const real vel2 = compute_velocity_squared_from_conservative_solution(conservative_soln);
851 kin_energy_var[0] = - 0.5 * vel2;
852 for(
int idim=0; idim<dim; idim++){
853 kin_energy_var[idim+1] = vel[idim];
855 kin_energy_var[dim+1] = 0.0;
856 for(
int ispecies=0; ispecies<nspecies-1; ispecies++) {
857 int index = dim+2+ispecies;
858 kin_energy_var[index] = 0.0;
861 return kin_energy_var;
865 template <
int dim,
int nspecies,
int nstate,
typename real>
870 const std::array<real,nspecies> mass_fractions = compute_mass_fractions(conservative_soln);
871 const real specific_kinetic_energy= compute_specific_kinetic_energy(conservative_soln);
872 const real mixture_gas_constant = compute_mixture_gas_constant(conservative_soln);
873 const real mixture_specific_total_energy = compute_mixture_specific_total_energy(conservative_soln);
875 std::array<real,nspecies> species_specific_enthalpy;
876 real mixture_specific_internal_energy;
877 real mixture_specific_enthalpy;
880 std::array<real,nspecies> Cv;
893 mixture_specific_internal_energy = (mixture_specific_total_energy - specific_kinetic_energy)*this->
u_ref_sqr;
897 mixture_specific_enthalpy = compute_mixture_from_species(mass_fractions,species_specific_enthalpy)*this->
u_ref_sqr;
899 f = (mixture_specific_enthalpy - mixture_gas_constant*this->
R_ref* T_n) - mixture_specific_internal_energy;
906 mixture_Cv = compute_mixture_from_species(mass_fractions,Cv)*this->
R_ref;
917 if(itr > 9.99999e6) {
920 std::cout <<
"Nearing the max iterations...iteration #" << itr <<
" old temperature: " << T_n
921 <<
" new temperature: " << T_npo << std::endl;
922 std::cout <<
" Mixture Cv: " << mixture_Cv << std::endl << std::endl;
926 while (err>this->
tol && itr < 1e7);
928 std::cout <<
"Maximum iterations for temperature reached without converging...Aborting..." << std::endl;
933 std::cout <<
"Computed temperature is a negative value...Aborting..." << std::endl;
937 std::cout <<
"Computed temperature is NaN...Aborting..." << std::endl;
944 template <
int dim,
int nspecies,
int nstate,
typename real>
948 const std::array<real,nspecies> mass_fractions = compute_mass_fractions(conservative_soln);
949 const real mixture_gas_constant = compute_mixture_from_species(mass_fractions,this->Rs);
950 return mixture_gas_constant;
954 template <
int dim,
int nspecies,
int nstate,
typename real>
958 const real mixture_density = compute_mixture_density(conservative_soln);
959 const real mixture_gas_constant = compute_mixture_gas_constant(conservative_soln);
961 const real mixture_pressure = mixture_density*mixture_gas_constant*temperature/(this->
gam_ref*this->
mach_ref_sqr);
963 return mixture_pressure;
967 template <
int dim,
int nspecies,
int nstate,
typename real>
971 return compute_mixture_pressure(conservative_soln);
973 template <
int dim,
int nspecies,
int nstate,
typename real>
977 const real mixture_gas_constant = compute_mixture_gas_constant(conservative_soln);
978 const real mixture_pressure = density*mixture_gas_constant*temperature/(this->
gam_ref*this->
mach_ref_sqr);
979 return mixture_pressure;
983 template <
int dim,
int nspecies,
int nstate,
typename real>
987 const real mixture_specific_total_energy = compute_mixture_specific_total_energy(conservative_soln);
988 const real mixture_pressure = compute_mixture_pressure(conservative_soln);
989 const real mixture_density = compute_mixture_density(conservative_soln);
990 const real mixture_specific_total_enthalpy = mixture_specific_total_energy + mixture_pressure/mixture_density;
992 return mixture_specific_total_enthalpy;
996 template <
int dim,
int nspecies,
int nstate,
typename real>
1001 std::array<dealii::Tensor<1,dim,real>,nstate> conv_flux;
1002 const real mixture_density = compute_mixture_density(conservative_soln);
1003 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
1004 const real mixture_pressure = compute_mixture_pressure(conservative_soln);
1005 const real mixture_specific_total_enthalpy = compute_mixture_specific_total_enthalpy(conservative_soln);
1006 const std::array<real,nspecies> species_densities = compute_species_densities(conservative_soln);
1009 for (
int flux_dim=0; flux_dim<dim; ++flux_dim)
1012 conv_flux[0][flux_dim] = conservative_soln[1+flux_dim];
1015 for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim)
1017 conv_flux[1+velocity_dim][flux_dim] = mixture_density*vel[flux_dim]*vel[velocity_dim];
1019 conv_flux[1+flux_dim][flux_dim] += mixture_pressure;
1022 conv_flux[dim+1][flux_dim] = mixture_density*vel[flux_dim]*mixture_specific_total_enthalpy;
1025 for (
int s=0; s<nspecies-1; ++s)
1027 conv_flux[dim+2+s][flux_dim] = species_densities[s]*vel[flux_dim];
1034 template <
int dim,
int nspecies,
int nstate,
typename real>
1037 const std::array<real,nstate> &conservative_soln,
1038 const dealii::Tensor<1,dim,real> &normal)
const 1041 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
1042 real vel_normal = 0.0;
1043 for (
int d=0;d<dim;d++) { vel_normal += vel[d] * normal[d]; }
1046 const real gamm1 = gam - 1.0;
1047 const real vel2 = compute_velocity_squared_from_conservative_solution(conservative_soln);
1048 const real phi = 0.5*gamm1 * vel2;
1050 const real density = conservative_soln[0];
1051 const real tot_energy = conservative_soln[dim+1];
1052 const real E = tot_energy / density;
1053 const real a1 = gam*E-phi;
1054 const real a2 = gamm1;
1055 const real a3 = gam-2.0;
1057 dealii::Tensor<2,nstate,real> jacobian;
1058 for (
int d=0; d<dim; ++d) {
1059 jacobian[0][1+d] = normal[d];
1061 for (
int row_dim=0; row_dim<dim; ++row_dim) {
1062 jacobian[1+row_dim][0] = normal[row_dim]*phi - vel[row_dim] * vel_normal;
1063 for (
int col_dim=0; col_dim<dim; ++col_dim){
1064 if (row_dim == col_dim) {
1065 jacobian[1+row_dim][1+col_dim] = vel_normal - a3*normal[row_dim]*vel[row_dim];
1067 jacobian[1+row_dim][1+col_dim] = normal[col_dim]*vel[row_dim] - a2*normal[row_dim]*vel[col_dim];
1070 jacobian[1+row_dim][dim+1] = normal[row_dim]*a2;
1072 jacobian[dim+1][0] = vel_normal*(phi-a1);
1073 for (
int d=0; d<dim; ++d){
1074 jacobian[dim+1][1+d] = normal[d]*a1 - a2*vel[d]*vel_normal;
1076 jacobian[dim+1][dim+1] = gam*vel_normal;
1082 template <
int dim,
int nspecies,
int nstate,
typename real>
1085 const std::array<real,nstate> &conservative_soln2)
const 1087 std::array<dealii::Tensor<1,dim,real>,nstate> conv_num_split_flux;
1091 std::cout <<
"The Ismail Roe two-point flux has not been implemented for multispecies...Aborting." << std::endl;
1094 std::cout <<
"The Chandrashekar two-point flux has not been implemented for multispecies...Aborting." << std::endl;
1097 std::cout <<
"The Ranocha Fix for the Chandrashekar two-point flux has not been implemented for multispecies...Aborting." << std::endl;
1101 return conv_num_split_flux;
1104 template <
int dim,
int nspecies,
int nstate,
typename real>
1107 const std::array<real,nstate> &conservative_soln2)
const 1109 std::array<dealii::Tensor<1,dim,real>,nstate> conv_num_split_flux;
1110 const std::array<real,nspecies> rho_species1 = compute_species_densities(conservative_soln1);
1111 const std::array<real,nspecies> rho_species2 = compute_species_densities(conservative_soln2);
1114 std::array<real, nspecies> mean_species_densities;
1115 real mean_density = 0.0;
1116 for (
int ispecies = 0; ispecies < nspecies; ++ispecies) {
1117 mean_species_densities[ispecies] = (rho_species1[ispecies]+rho_species2[ispecies])/2.0;
1118 mean_density += mean_species_densities[ispecies];
1122 dealii::Tensor<1,dim,real> vel_1 = compute_velocities(conservative_soln1);
1123 dealii::Tensor<1,dim,real> vel_2 = compute_velocities(conservative_soln2);
1124 dealii::Tensor<1,dim,real> mean_vel;
1125 for (
int d=0; d<dim; ++d) {
1126 mean_vel[d] = 0.5*(vel_1[d]+vel_2[d]);
1130 real pressure1 = compute_mixture_pressure(conservative_soln1);
1131 real pressure2 = compute_mixture_pressure(conservative_soln2);
1132 real mean_pressure = (pressure1 + pressure2)/2.0;
1136 real total_energy1 = compute_mixture_specific_total_energy(conservative_soln1);
1137 real total_energy2 = compute_mixture_specific_total_energy(conservative_soln2);
1138 real mean_total_energy = (total_energy1 + total_energy2)/2.0;
1140 for (
int flux_dim = 0; flux_dim < dim; ++flux_dim)
1143 conv_num_split_flux[0][flux_dim] = mean_density * mean_vel[flux_dim];
1145 for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
1146 conv_num_split_flux[1+velocity_dim][flux_dim] = mean_density*mean_vel[flux_dim]*mean_vel[velocity_dim];
1148 conv_num_split_flux[1+flux_dim][flux_dim] += mean_pressure;
1150 conv_num_split_flux[dim+1][flux_dim] = mean_density*mean_vel[flux_dim]*mean_total_energy + mean_pressure * mean_vel[flux_dim];
1152 for (
int ispecies = 0; ispecies < nspecies - 1; ++ispecies) {
1153 conv_num_split_flux[dim+2+ispecies][flux_dim] = mean_species_densities[ispecies] * mean_vel[flux_dim];
1157 return conv_num_split_flux;
1162 template <
int dim,
int nspecies,
int nstate,
typename real>
1167 std::array<real, nstate> conservative_soln;
1168 const real mixture_density = compute_mixture_density(primitive_soln);
1169 std::array<real, dim> vel;
1173 std::array<real,nspecies> species_densities;
1174 std::array<real,nspecies> mass_fractions;
1175 const real mixture_pressure = primitive_soln[dim+1];
1178 conservative_soln[0] = mixture_density;
1181 for (
int d=0; d<dim; ++d)
1183 vel[d] = primitive_soln[1+d];
1184 vel2 = vel2 + vel[d]*vel[d]; ;
1185 conservative_soln[1+d] = mixture_density*vel[d];
1190 for (
int s=0; s<nspecies-1; ++s)
1192 mass_fractions[s] = primitive_soln[dim+2+s];
1193 sum += mass_fractions[s];
1195 mass_fractions[nspecies-1] = 1.00 - sum;
1197 for (
int s=0; s<nspecies; ++s)
1199 species_densities[s] = mixture_density*mass_fractions[s];
1202 const real mixture_gas_constant = compute_mixture_from_species(mass_fractions,this->Rs);
1206 const real specific_kinetic_energy = 0.50*vel2;
1210 const real mixture_specific_enthalpy = compute_mixture_from_species(mass_fractions,species_specific_enthalpy);
1212 const real mixture_specific_internal_energy = mixture_specific_enthalpy - mixture_pressure/mixture_density;
1214 const real mixture_specific_total_energy = mixture_specific_internal_energy + specific_kinetic_energy;
1217 conservative_soln[dim+1] = mixture_density*mixture_specific_total_energy;
1220 for (
int s=0; s<nspecies-1; ++s)
1222 conservative_soln[dim+2+s] = species_densities[s];
1225 return conservative_soln;
1230 template <
int dim,
int nspecies,
int nstate,
typename real>
1235 std::array<real, nstate> primitive_soln;
1236 primitive_soln[0] = conservative_soln[0];
1238 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
1239 for (
int idim = 0; idim < dim; ++idim) {
1240 primitive_soln[idim+1] = vel[idim];
1243 primitive_soln[dim+1] = compute_mixture_pressure(conservative_soln);
1245 const std::array<real,nspecies> mass_fractions = compute_mass_fractions(conservative_soln);
1246 for(
int ispecies = 0; ispecies < nspecies-1; ++ispecies) {
1247 primitive_soln[dim+2+ispecies] = mass_fractions[ispecies];
1250 return primitive_soln;
1253 template <
int dim,
int nspecies,
int nstate,
typename real>
1256 const std::array<real,nstate> &,
1257 const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient)
const 1259 this->
pcout <<
"WARNING: convert_primitive_gradient_to_conservative_gradient() is not defined for current physics." << std::endl;
1260 this->
pcout <<
"Aborting..." << std::endl;
1262 return primitive_soln_gradient;
1265 template <
int dim,
int nspecies,
int nstate,
typename real>
1268 const std::array<real,nstate> &,
1269 const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
const 1271 this->
pcout <<
"WARNING: convert_conservative_gradient_to_primitive_gradient() is not defined for current physics." << std::endl;
1272 this->
pcout <<
"Aborting..." << std::endl;
1274 return conservative_soln_gradient;
1278 template <
int dim,
int nspecies,
int nstate,
typename real>
1283 const std::array<real,nspecies> Cp = compute_species_specific_Cp(temperature);
1284 const std::array<real,nspecies> Cv = compute_species_specific_Cv(temperature);
1285 std::array<real,nspecies> gamma;
1287 for (
int s=0; s<nspecies; ++s)
1289 gamma[s] = Cp[s]/Cv[s];
1295 template <
int dim,
int nspecies,
int nstate,
typename real>
1301 const std::array<real,nspecies> mass_fractions = compute_mass_fractions(conservative_soln);
1302 const std::array<real,nspecies> Cp = compute_species_specific_Cp(temperature);
1303 const std::array<real,nspecies> Cv = compute_species_specific_Cv(temperature);
1305 real mixture_Cp = compute_mixture_from_species(mass_fractions,Cp);
1306 real mixture_Cv = compute_mixture_from_species(mass_fractions,Cv);
1308 real gamma = mixture_Cp/mixture_Cv;
1313 template <
int dim,
int nspecies,
int nstate,
typename real>
1318 const std::array<real,nspecies> gamma = compute_species_specific_heat_ratio(conservative_soln);
1319 const std::array<real,nspecies> Rs = compute_Rs(this->Ru);
1320 std::array<real,nspecies> speed_of_sound;
1321 for (
int s=0; s<nspecies; ++s)
1323 speed_of_sound[s] = sqrt(gamma[s]*Rs[s]*temperature/(this->
mach_ref_sqr));
1326 return speed_of_sound;
1329 template <
int dim,
int nspecies,
int nstate,
typename real>
1338 const real R_mix = compute_mixture_gas_constant(conservative_soln);
1342 const real sound = sqrt(gamma*R_mix*temperature/(this->
mach_ref_sqr));
1348 template <
int dim,
int nspecies,
int nstate,
typename real>
1353 std::array<real, dim+2> mixture_soln;
1354 for (
int s=0; s<(dim+2); ++s)
1356 mixture_soln[s] = full_soln[s];
1358 return mixture_soln;
1362 template <
int dim,
int nspecies,
int nstate,
typename real>
1365 const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
const 1367 std::array<dealii::Tensor<1,dim,real>,dim+2> mixture_soln_gradient;
1368 for (
int d1=0; d1<dim; d1++) {
1369 mixture_soln_gradient[0][d1] = conservative_soln_gradient[0][d1];
1370 for (
int d2=0; d2<dim; d2++) {
1371 mixture_soln_gradient[1+d1][d2] = conservative_soln_gradient[1+d2][d1];
1373 mixture_soln_gradient[dim+1][d1] = conservative_soln_gradient[dim+1][d1];
1375 return mixture_soln_gradient;
1378 template <
int dim,
int nspecies,
int nstate,
typename real>
1380 const dealii::Vector<double> &uh,
1381 const std::vector<dealii::Tensor<1,dim> > &duh,
1382 const std::vector<dealii::Tensor<2,dim> > &dduh,
1383 const dealii::Tensor<1,dim> &normals,
1384 const dealii::Point<dim> &evaluation_points)
const 1388 unsigned int current_data_index = computed_quantities.size() - 1;
1389 computed_quantities.grow_or_shrink(names.size());
1390 if constexpr (std::is_same<real,double>::value) {
1392 std::array<double, nstate> conservative_soln;
1393 for (
unsigned int s=0; s<nstate; ++s) {
1394 conservative_soln[s] = uh(s);
1398 std::array<dealii::Tensor<1,dim,double>,nstate> conservative_soln_gradient;
1399 for (
unsigned int s=0; s<nstate; ++s) {
1400 for (
unsigned int d=0; d<dim; ++d) {
1401 conservative_soln_gradient[s][d] = duh[s][d];
1406 computed_quantities(++current_data_index) = compute_mixture_density(conservative_soln);
1408 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
1409 for (
unsigned int d=0; d<dim; ++d) {
1410 computed_quantities(++current_data_index) = vel[d];
1413 for (
unsigned int d=0; d<dim; ++d) {
1414 computed_quantities(++current_data_index) = conservative_soln[1+d];
1417 computed_quantities(++current_data_index) = compute_mixture_specific_total_energy(conservative_soln);
1419 computed_quantities(++current_data_index) = compute_mixture_pressure(conservative_soln);
1423 computed_quantities(++current_data_index) = compute_dimensional_temperature(
compute_temperature(conservative_soln));
1425 computed_quantities(++current_data_index) = compute_mixture_specific_total_enthalpy(conservative_soln);
1427 const std::array<real,nspecies> mass_fractions = compute_mass_fractions(conservative_soln);
1428 for (
unsigned int s=0; s<nspecies; ++s)
1430 computed_quantities(++current_data_index) = mass_fractions[s];
1433 const std::array<real,nspecies> species_densities = compute_species_densities(conservative_soln);
1434 for (
unsigned int s=0; s<nspecies; ++s)
1436 computed_quantities(++current_data_index) = species_densities[s];
1439 if (computed_quantities.size()-1 != current_data_index) {
1440 this->
pcout <<
" Did not assign a value to all the data. Missing " << computed_quantities.size() - current_data_index <<
" variables." 1441 <<
" If you added a new output variable, make sure the names and DataComponentInterpretation match the above. " 1445 return computed_quantities;
1448 template <
int dim,
int nspecies,
int nstate,
typename real>
1452 namespace DCI = dealii::DataComponentInterpretation;
1454 interpretation.push_back (DCI::component_is_scalar);
1455 for (
unsigned int d=0; d<dim; ++d) {
1456 interpretation.push_back (DCI::component_is_part_of_vector);
1458 for (
unsigned int d=0; d<dim; ++d) {
1459 interpretation.push_back (DCI::component_is_part_of_vector);
1461 interpretation.push_back (DCI::component_is_scalar);
1462 interpretation.push_back (DCI::component_is_scalar);
1463 interpretation.push_back (DCI::component_is_scalar);
1464 interpretation.push_back (DCI::component_is_scalar);
1465 interpretation.push_back (DCI::component_is_scalar);
1466 for (
unsigned int s=0; s<nspecies; ++s) {
1467 interpretation.push_back (DCI::component_is_scalar);
1469 for (
unsigned int s=0; s<nspecies; ++s) {
1470 interpretation.push_back (DCI::component_is_scalar);
1474 if (names.size() != interpretation.size()) {
1475 this->
pcout <<
"Number of DataComponentInterpretation is not the same as number of names for output file" << std::endl;
1477 return interpretation;
1480 template <
int dim,
int nspecies,
int nstate,
typename real>
1485 names.push_back (
"mixture_density");
1486 for (
unsigned int d=0; d<dim; ++d) {
1487 names.push_back (
"velocity");
1489 for (
unsigned int d=0; d<dim; ++d) {
1490 names.push_back (
"mixture_momentum");
1492 names.push_back (
"mixture_energy");
1493 names.push_back (
"mixture_pressure");
1494 names.push_back (
"temperature");
1495 names.push_back (
"dimensional_temperature");
1496 names.push_back (
"mixture_specific_total_enthalpy");
1497 for (
unsigned int s=0; s<nspecies; ++s)
1499 std::string string_mass_fraction =
"mass_fraction";
1500 std::string string_species_mass_fraction = string_mass_fraction +
"_" + this->species_name[s];
1501 names.push_back (string_species_mass_fraction);
1503 for (
unsigned int s=0; s<nspecies; ++s)
1505 std::string string_density =
"species_density";
1506 std::string string_species_density = string_density +
"_" + this->species_name[s];
1507 names.push_back (string_species_density);
1513 template <
int dim,
int nspecies,
int nstate,
typename real>
1517 return dealii::update_values
1518 | dealii::update_gradients
1519 | dealii::update_quadrature_points;
RealGas(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function=nullptr, const bool has_nonzero_diffusion=false, const bool has_nonzero_physical_source=false)
Constructor.
std::array< std::array< std::array< double, 3 >, 9 >, nspecies > NASACAPCoeffs
Variables to store NASA Coefficients.
RealGas equations. Derived from PhysicsBase.
real max_viscous_eigenvalue(const std::array< real, nstate > &soln) const
Maximum viscous eigenvalue.
std::string chemistry_input_file
Name of file containing NASA CAP data for species.
std::array< real, nstate > compute_entropy_variables(const std::array< real, nstate > &conservative_soln) const
Computes the entropy variables.
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
virtual std::array< real, nstate > compute_kinetic_energy_variables(const std::array< real, nstate > &conservative_soln) const
Computes the kinetic energy variables.
Manufactured solution used for grid studies to check convergence orders.
std::array< dealii::Tensor< 1, dim, real >, nstate > dissipative_flux(const std::array< real, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const dealii::types::global_dof_index cell_index) const
Dissipative flux: 0.
virtual dealii::Vector< double > post_compute_derived_quantities_vector(const dealii::Vector< double > &uh, const std::vector< dealii::Tensor< 1, dim > > &, const std::vector< dealii::Tensor< 2, dim > > &, const dealii::Tensor< 1, dim > &, const dealii::Point< dim > &) const
Returns current vector solution to be used by PhysicsPostprocessor to output current solution...
real compute_entropy(const std::array< real, nstate > &conservative_soln) const
Compute entropy from conservative solution.
Files for the baseline physics.
void readspeciesdata(std::string reactionFilename)
Reads in data from chemistry file.
virtual real compute_temperature(const std::array< real, nstate > &conservative_soln) const
virtual real compute_pressure(const std::array< real, nstate > &conservative_soln) const
Compute pressure from conservative solution.
real compute_sound(const std::array< real, nstate > &conservative_soln) const
Evaluate speed of sound from conservative variables.
virtual dealii::Vector< double > post_compute_derived_quantities_vector(const dealii::Vector< double > &uh, const std::vector< dealii::Tensor< 1, dim > > &duh, const std::vector< dealii::Tensor< 2, dim > > &dduh, const dealii::Tensor< 1, dim > &normals, const dealii::Point< dim > &evaluation_points) const
For post processing purposes (update comment later)
virtual std::array< real, nstate > convert_conservative_to_primitive(const std::array< real, nstate > &conservative_soln) const
Convert conservative variables to primitive variables.
virtual std::array< real, nstate > convert_primitive_to_conservative(const std::array< real, nstate > &primitive_soln) const
Convert primitive solution to conservative solution.
const double tol
tolerance for NRM (Newton-raphson Method) [m/s]
const two_point_num_flux_enum two_point_num_flux_type
Two point numerical flux type (for split form)
const double R_ref
reference gas constant: [J/(kg·K)]
Main parameter class that contains the various other sub-parameter classes.
std::array< dealii::Tensor< 1, dim, real >, nstate > convert_primitive_gradient_to_conservative_gradient(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient) const
const double density_ref
reference mixture density: [kg/m^3]
const double Ru
universal gas constant: [J/(mol·K)]
std::array< real, nstate > convective_eigenvalues(const std::array< real, nstate > &, const dealii::Tensor< 1, dim, real > &) const
Spectral radius of convective term Jacobian is 'c'.
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_flux(const std::array< real, nstate > &conservative_soln) const
Convective fluxes that will be differentiated once in space.
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_numerical_split_flux(const std::array< real, nstate > &conservative_soln1, const std::array< real, nstate > &conservative_soln2) const override
Evaluates convective flux based on the chosen split form.
std::array< real, nstate > source_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &conservative_soln, const real current_time, const dealii::types::global_dof_index cell_index) const
Source term is zero or depends on manufactured solution.
const double gam_ref
reference gamma
std::array< dealii::Tensor< 1, dim, real >, dim+2 > get_mixture_solution_gradient(const std::array< dealii::Tensor< 1, dim, real >, nstate > &conservative_soln_gradient) const
returns the solution gradient vector without the species conservation states (only mixture) ...
std::array< real, nstate > compute_conservative_variables_from_entropy_variables(const std::array< real, nstate > &entropy_var) const
Computes the conservative variables from the entropy variables.
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_numerical_split_flux_kennedy_gruber(const std::array< real, nstate > &conservative_soln1, const std::array< real, nstate > &conservative_soln2) const
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const
Maximum convective eigenvalue.
void boundary_face_values(const int, const dealii::Point< dim, real > &, const dealii::Tensor< 1, dim, real > &, const std::array< real, nstate > &, const std::array< dealii::Tensor< 1, dim, real >, nstate > &, std::array< real, nstate > &, std::array< dealii::Tensor< 1, dim, real >, nstate > &) const
Boundary condition handler.
std::array< real, nspecies > compute_species_entropy_cv_integral(const real temperature) const
dealii::Tensor< 1, dim, real > extract_velocities_from_primitive(const std::array< real, nstate > &primitive_soln) const
Given primitive variables, returns velocities.
dealii::ConditionalOStream pcout
ConditionalOStream.
virtual std::vector< std::string > post_get_names() const
For post processing purposes, sets the base names (with no prefix or suffix) of the computed quantiti...
std::array< dealii::Tensor< 1, dim, real >, nstate > convert_conservative_gradient_to_primitive_gradient(const std::array< real, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &conservative_soln_gradient) const
const double u_ref_sqr
reference velocity squared[m/s]^2
real max_convective_normal_eigenvalue(const std::array< real, nstate > &soln, const dealii::Tensor< 1, dim, real > &normal) const override
Maximum convective normal eigenvalue (used in Lax-Friedrichs)
void boundary_slip_wall(const dealii::Tensor< 1, dim, real > &normal_int, const std::array< real, nstate > &soln_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_int, std::array< real, nstate > &soln_bc, std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_bc) const
const double mach_ref_sqr
reference mach number (Farfield Mach number squared)
const double temperature_ref
reference temperature [K]
virtual std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > post_get_data_component_interpretation() const
For post processing purposes, sets the interpretation of each computed quantity as either scalar or v...
virtual real compute_gamma(const std::array< real, nstate > &conservative_soln) const
Compute gamma from conservative solution.
virtual std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > post_get_data_component_interpretation() const
Returns DataComponentInterpretation of the solution to be used by PhysicsPostprocessor to output curr...
virtual void boundary_wall(const dealii::Tensor< 1, dim, real > &normal_int, const std::array< real, nstate > &soln_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_int, std::array< real, nstate > &soln_bc, std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_bc) const
Wall boundary condition.
virtual std::vector< std::string > post_get_names() const
Returns names of the solution to be used by PhysicsPostprocessor to output current solution...
std::array< int, nspecies > GetNASACAP_TemperatureIndex(const real temperature) const
Determine the.
dealii::Tensor< 2, nstate, real > convective_flux_directional_jacobian(const std::array< real, nstate > &conservative_soln, const dealii::Tensor< 1, dim, real > &normal) const
Convective flux Jacobian: .
virtual dealii::UpdateFlags post_get_needed_update_flags() const
For post processing purposes (update comment later)
std::array< real, nspecies > compute_species_specific_enthalpy(const real temperature) const
real compute_pressure_from_density_temperature(const real density, const real temperature, const std::array< real, nstate > &conservative_soln) const
Given density and temperature, returns NON-DIMENSIONALIZED pressure using free-stream non-dimensional...
std::array< real, dim+2 > get_mixture_solution_vector(const std::array< real, nstate > &full_soln) const
returns the solution vector without the species conservation states (only mixture) ...