13 template <
int dim,
int nspecies,
int nstate,
typename real>
16 const dealii::Point<dim,real> &pos,
17 const std::array<real,nstate> &conservative_soln,
18 const real current_time,
19 const dealii::types::global_dof_index )
const 21 return source_term(pos,conservative_soln,current_time);
24 template <
int dim,
int nspecies,
int nstate,
typename real>
27 const dealii::Point<dim,real> &,
28 const std::array<real,nstate> &,
31 std::array<real,nstate> source_term;
32 for (
int s=0; s<nstate; s++) {
40 template <
int dim,
int nspecies,
int nstate,
typename real>
44 std::array<real, nstate> primitive_soln;
46 real density = conservative_soln[0];
47 dealii::Tensor<1,dim,real> vel = compute_velocities (conservative_soln);
48 real pressure = compute_pressure (conservative_soln);
50 primitive_soln[0] = density;
51 for (
int d=0; d<dim; ++d) {
52 primitive_soln[1+d] = vel[d];
54 primitive_soln[nstate-1] = pressure;
55 return primitive_soln;
59 template <
int dim,
int nspecies,
int nstate,
typename real>
64 const real density = primitive_soln[0];
65 const dealii::Tensor<1,dim,real> velocities = extract_velocities_from_primitive(primitive_soln);
67 std::array<real, nstate> conservative_soln;
68 conservative_soln[0] = density;
69 for (
int d=0; d<dim; ++d) {
70 conservative_soln[1+d] = density*velocities[d];
72 conservative_soln[nstate-1] = compute_total_energy(primitive_soln);
74 return conservative_soln;
77 template <
int dim,
int nspecies,
int nstate,
typename real>
80 const std::array<real,nstate> &,
81 const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient)
const 83 this->pcout <<
"WARNING: convert_primitive_gradient_to_conservative_gradient() is not defined for current physics." << std::endl;
84 this->pcout <<
"Aborting..." << std::endl;
86 return primitive_soln_gradient;
89 template <
int dim,
int nspecies,
int nstate,
typename real>
92 const std::array<real,nstate> &,
93 const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
const 95 return conservative_soln_gradient;
98 template <
int dim,
int nspecies,
int nstate,
typename real>
102 const real density = conservative_soln[0];
103 dealii::Tensor<1,dim,real> vel;
104 for (
int d=0; d<dim; ++d) { vel[d] = conservative_soln[1+d]/density; }
108 template <
int dim,
int nspecies,
int nstate,
typename real>
113 for (
int d=0; d<dim; d++) { vel2 = vel2 + velocities[d]*velocities[d]; }
117 template <
int dim,
int nspecies,
int nstate,
typename real>
121 dealii::Tensor<1,dim,real> velocities;
122 for (
int d=0; d<dim; d++) { velocities[d] = primitive_soln[1+d]; }
128 template <
int dim,
int nspecies,
int nstate,
typename real>
132 const real density = primitive_soln[0];
133 const real pressure = primitive_soln[nstate-1];
134 const dealii::Tensor<1,dim,real> velocities = extract_velocities_from_primitive(primitive_soln);
135 const real vel2 = compute_velocity_squared(velocities);
137 const real tot_energy = pressure / gamm1 + 0.5*density*vel2;
142 template <
int dim,
int nspecies,
int nstate,
typename real>
146 const real density = conservative_soln[0];
147 const real pressure = compute_pressure(conservative_soln);
148 const real entropy_measure = pressure*pow(density,-gam);
149 return entropy_measure;
153 template <
int dim,
int nspecies,
int nstate,
typename real>
157 const real density = conservative_soln[0];
158 const real total_energy = conservative_soln[nstate-1];
159 const real specific_enthalpy = (total_energy+pressure)/density;
160 return specific_enthalpy;
164 template <
int dim,
int nspecies,
int nstate,
typename real>
168 const real density = primitive_soln[0];
169 const real pressure = primitive_soln[nstate-1];
170 const real temperature = gam*pressure/density;
174 template <
int dim,
int nspecies,
int nstate,
typename real>
178 const real dimensional_temperature = compute_dimensional_temperature(primitive_soln);
179 const real temperature = dimensional_temperature ;
183 template <
int dim,
int nspecies,
int nstate,
typename real>
187 const real density = gam*pressure/temperature ;
190 template <
int dim,
int nspecies,
int nstate,
typename real>
194 const real temperature = gam*pressure/density ;
199 template <
int dim,
int nspecies,
int nstate,
typename real>
203 const real density = conservative_soln[0];
206 const real tot_energy = conservative_soln[nstate-1];
209 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
214 const real vel2 = compute_velocity_squared(vel);
216 real pressure = gamm1*(tot_energy - 0.5*density*vel2);
219 std::cout<<
"Cannot compute pressure..."<<std::endl;
220 std::cout<<
"density "<<density<<std::endl;
221 for(
int d=0;d<dim;d++) std::cout<<
"vel"<<d<<
" "<<vel[d]<<std::endl;
222 std::cout<<
"energy "<<tot_energy<<std::endl;
224 assert(pressure>0.0);
229 template <
int dim,
int nspecies,
int nstate,
typename real>
233 real density = conservative_soln[0];
236 std::cout<<
"density"<<density<<std::endl;
240 const real pressure = compute_pressure(conservative_soln);
242 const real sound = sqrt(pressure*gam/density);
247 template <
int dim,
int nspecies,
int nstate,
typename real>
252 const real sound = sqrt(pressure*gam/density);
256 template <
int dim,
int nspecies,
int nstate,
typename real>
260 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
261 const real velocity = sqrt(compute_velocity_squared(vel));
262 const real sound = compute_sound (conservative_soln);
263 const real mach_number = velocity/sound;
267 template <
int dim,
int nspecies,
int nstate,
typename real>
271 real magnetic_energy = 0;
272 for (
int i = 1; i <= 3; ++i)
273 magnetic_energy += 1./2. * (conservative_soln[nstate - i] * conservative_soln[nstate - i] );
274 return magnetic_energy;
280 template <
int dim,
int nspecies,
int nstate,
typename real>
283 const std::array<real,nstate> &soln_loop)
const 285 return (soln_const[0] + soln_loop[0])/2.;
288 template <
int dim,
int nspecies,
int nstate,
typename real>
291 const std::array<real,nstate> &soln_loop)
const 293 real pressure_const = compute_pressure(soln_const);
294 real pressure_loop = compute_pressure(soln_loop);
295 return (pressure_const + pressure_loop)/2.;
298 template <
int dim,
int nspecies,
int nstate,
typename real>
301 const std::array<real,nstate> &soln_loop)
const 303 dealii::Tensor<1,dim,real> vel_const = compute_velocities(soln_const);
304 dealii::Tensor<1,dim,real> vel_loop = compute_velocities(soln_loop);
306 dealii::Tensor<1,dim,real> mean_vel;
307 for (
int d=0; d<0; ++d) {
308 mean_vel[d] = (vel_const[d] + vel_loop[d]) * 0.5;
313 template <
int dim,
int nspecies,
int nstate,
typename real>
316 const std::array<real,nstate> &soln_loop)
const 318 return ((soln_const[nstate-1]/soln_const[0]) + (soln_loop[nstate-1]/soln_loop[0]))/2.;
322 template <
int dim,
int nspecies,
int nstate,
typename real>
326 std::array<dealii::Tensor<1,dim,real>,nstate> conv_flux;
327 const real density = conservative_soln[0];
328 const real pressure = compute_pressure (conservative_soln);
329 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
330 const real specific_total_energy = conservative_soln[nstate-1]/conservative_soln[0];
331 const real specific_total_enthalpy = specific_total_energy + pressure/density;
332 const real magnetic_energy = compute_magnetic_energy(conservative_soln);
334 for (
int flux_dim=0; flux_dim<dim; ++flux_dim) {
336 conv_flux[0][flux_dim] = conservative_soln[1+flux_dim];
338 for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
339 conv_flux[1+velocity_dim][flux_dim] = density*vel[flux_dim]*vel[velocity_dim];
341 conv_flux[1+flux_dim][flux_dim] += pressure + magnetic_energy;
343 conv_flux[nstate-4][flux_dim] = density*vel[flux_dim]*specific_total_enthalpy;
348 template <
int dim,
int nspecies,
int nstate,
typename real>
351 const std::array<real,nstate> &conservative_soln)
const 353 std::cout<<
"Entropy variables for MHD hasn't been done yet."<<std::endl;
355 return conservative_soln;
358 template <
int dim,
int nspecies,
int nstate,
typename real>
361 const std::array<real,nstate> &entropy_var)
const 363 std::cout<<
"Entropy variables for MHD hasn't been done yet."<<std::endl;
368 template <
int dim,
int nspecies,
int nstate,
typename real>
372 std::array<real, nstate> conv_normal_flux;
373 const real density = conservative_soln[0];
374 const real pressure = compute_pressure (conservative_soln);
375 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
377 real normal_vel = 0.0;
378 for (
int d=0; d<dim; ++d) {
379 normal_vel += vel[d]*normal[d];
381 const real total_energy = conservative_soln[nstate-1];
382 const real specific_total_enthalpy = (total_energy + pressure) / density;
384 const real rhoV = density*normal_vel;
386 conv_normal_flux[0] = rhoV;
388 for (
int velocity_dim=0; velocity_dim<dim; ++velocity_dim){
389 conv_normal_flux[1+velocity_dim] = rhoV*vel[velocity_dim] + normal[velocity_dim] * pressure;
392 conv_normal_flux[nstate-1] = rhoV*specific_total_enthalpy;
393 return conv_normal_flux;
396 template <
int dim,
int nspecies,
int nstate,
typename real>
399 const std::array<real,nstate> &conservative_soln,
400 const dealii::Tensor<1,dim,real> &normal)
const 403 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
404 real vel_normal = 0.0;
405 for (
int d=0;d<dim;d++) { vel_normal += vel[d] * normal[d]; }
407 const real vel2 = compute_velocity_squared(vel);
408 const real phi = 0.5*gamm1 * vel2;
410 const real density = conservative_soln[0];
411 const real tot_energy = conservative_soln[nstate-1];
412 const real E = tot_energy / density;
413 const real a1 = gam*E-phi;
414 const real a2 = gam-1.0;
415 const real a3 = gam-2.0;
417 dealii::Tensor<2,nstate,real> jacobian;
418 for (
int d=0; d<dim; ++d) {
419 jacobian[0][1+d] = normal[d];
421 for (
int row_dim=0; row_dim<dim; ++row_dim) {
422 jacobian[1+row_dim][0] = normal[row_dim]*phi - vel[row_dim] * vel_normal;
423 for (
int col_dim=0; col_dim<dim; ++col_dim){
424 if (row_dim == col_dim) {
425 jacobian[1+row_dim][1+col_dim] = vel_normal - a3*normal[row_dim]*vel[row_dim];
427 jacobian[1+row_dim][1+col_dim] = normal[col_dim]*vel[row_dim] - a2*normal[row_dim]*vel[col_dim];
430 jacobian[1+row_dim][nstate-1] = normal[row_dim]*a2;
432 jacobian[nstate-1][0] = vel_normal*(phi-a1);
433 for (
int d=0; d<dim; ++d){
434 jacobian[nstate-1][1+d] = normal[d]*a1 - a2*vel[d]*vel_normal;
436 jacobian[nstate-1][nstate-1] = gam*vel_normal;
441 template <
int dim,
int nspecies,
int nstate,
typename real>
444 const std::array<real,nstate> &conservative_soln,
445 const dealii::Tensor<1,dim,real> &normal)
const 447 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
448 std::array<real,nstate> eig;
449 real vel_dot_n = 0.0;
450 for (
int d=0;d<dim;++d) { vel_dot_n += vel[d]*normal[d]; };
451 for (
int i=0; i<nstate; i++) {
460 template <
int dim,
int nspecies,
int nstate,
typename real>
465 const dealii::Tensor<1,dim,real> vel = compute_velocities(conservative_soln);
468 const real sound = compute_sound (conservative_soln);
471 real vel2 = compute_velocity_squared(vel);
477 const real max_eig = sqrt(vel2) + sound;
483 template <
int dim,
int nspecies,
int nstate,
typename real>
490 template <
int dim,
int nspecies,
int nstate,
typename real>
493 const std::array<real,nstate> &conservative_soln,
494 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
495 const dealii::types::global_dof_index )
const 497 return dissipative_flux(conservative_soln,solution_gradient);
500 template <
int dim,
int nspecies,
int nstate,
typename real>
503 const std::array<real,nstate> &,
504 const std::array<dealii::Tensor<1,dim,real>,nstate> &)
const 506 std::array<dealii::Tensor<1,dim,real>,nstate> diss_flux;
508 for (
int i=0; i<nstate; i++) {
514 template <
int dim,
int nspecies,
int nstate,
typename real>
518 const dealii::Point<dim, real> &pos,
519 const dealii::Tensor<1,dim,real> &normal_int,
520 const std::array<real,nstate> &soln_int,
521 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
522 std::array<real,nstate> &soln_bc,
523 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 525 std::array<real,nstate> boundary_values;
526 std::array<dealii::Tensor<1,dim,real>,nstate> boundary_gradients;
527 for (
int s=0; s<nstate; s++) {
528 boundary_values[s] = this->manufactured_solution_function->value (pos, s);
529 boundary_gradients[s] = this->manufactured_solution_function->gradient (pos, s);
532 for (
int istate=0; istate<nstate; ++istate) {
534 std::array<real,nstate> characteristic_dot_n = convective_eigenvalues(boundary_values, normal_int);
535 const bool inflow = (characteristic_dot_n[istate] <= 0.);
541 soln_bc[istate] = boundary_values[istate];
542 soln_grad_bc[istate] = soln_grad_int[istate];
549 soln_bc[istate] = soln_int[istate];
556 soln_grad_bc[istate] = soln_grad_int[istate];
889 #if PHILIP_SPECIES==1 dealii::Tensor< 1, dim, real > compute_velocities(const std::array< real, nstate > &conservative_soln) const
Evaluate velocities from conservative variables.
std::array< real, nstate > convert_conservative_to_primitive(const std::array< real, nstate > &conservative_soln) const
real compute_temperature_from_density_pressure(const real density, const real pressure) const
Given density and pressure, returns NON-DIMENSIONALIZED temperature using free-stream non-dimensional...
real compute_velocity_squared(const dealii::Tensor< 1, dim, real > &velocities) const
Given the velocity vector , returns the dot-product .
std::array< real, nstate > compute_entropy_variables(const std::array< real, nstate > &conservative_soln) const
Computes the entropy variables.
Files for the baseline physics.
dealii::Tensor< 1, dim, real > compute_mean_velocities(const std::array< real, nstate > &conservative_soln1, const std::array< real, nstate > &convervative_soln2) const
Mean velocities given two sets of conservative solutions.
real compute_temperature(const std::array< real, nstate > &primitive_soln) const
Given primitive variables, returns NON-DIMENSIONALIZED temperature using free-stream non-dimensionali...
real compute_mean_density(const std::array< real, nstate > &conservative_soln1, const std::array< real, nstate > &convervative_soln2) const
Mean density given two sets of conservative solutions.
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
real compute_mean_pressure(const std::array< real, nstate > &conservative_soln1, const std::array< real, nstate > &convervative_soln2) const
Mean pressure given two sets of conservative solutions.
real max_viscous_eigenvalue(const std::array< real, nstate > &soln) const
Maximum viscous eigenvalue.
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.
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
Evaluates boundary values and gradients on the other side of the face.
real compute_dimensional_temperature(const std::array< real, nstate > &primitive_soln) const
Given primitive variables, returns DIMENSIONALIZED temperature using the equation of state...
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.
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: .
real compute_magnetic_energy(const std::array< real, nstate > &conservative_soln) const
Evaluate Magnetic Energy.
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_flux(const std::array< real, nstate > &conservative_soln) const
Convective flux: .
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'.
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const
Maximum convective eigenvalue.
std::array< real, nstate > convective_normal_flux(const std::array< real, nstate > &conservative_soln, const dealii::Tensor< 1, dim, real > &normal) const
Convective flux: .
real compute_pressure(const std::array< real, nstate > &conservative_soln) const
Evaluate pressure from conservative variables.
real compute_specific_enthalpy(const std::array< real, nstate > &conservative_soln, const real pressure) const
Evaluate pressure from conservative variables.
real compute_mean_specific_energy(const std::array< real, nstate > &conservative_soln1, const std::array< real, nstate > &convervative_soln2) const
Mean specific energy given two sets of conservative solutions.
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.
real compute_total_energy(const std::array< real, nstate > &primitive_soln) const
Given primitive variables, returns total energy.
dealii::Tensor< 1, dim, real > extract_velocities_from_primitive(const std::array< real, nstate > &primitive_soln) const
Given primitive variables, returns velocities.
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
Magnetohydrodynamics (MHD) equations. Derived from PhysicsBase.
std::array< real, nstate > convert_primitive_to_conservative(const std::array< real, nstate > &primitive_soln) const
real compute_mach_number(const std::array< real, nstate > &conservative_soln) const
Given conservative variables, returns Mach number.
real compute_entropy_measure(const std::array< real, nstate > &conservative_soln) const
Evaluate entropy from conservative variables.
real compute_sound(const std::array< real, nstate > &conservative_soln) const
Evaluate speed of sound from conservative variables.
real compute_density_from_pressure_temperature(const real pressure, const real temperature) const
Given pressure and temperature, returns NON-DIMENSIONALIZED density using free-stream non-dimensional...