9 #include "navier_stokes.h" 11 #include "physics_model.h" 12 #include "physics_factory.h" 18 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
24 const bool has_nonzero_diffusion,
25 const bool has_nonzero_physical_source)
26 :
PhysicsBase<dim,nstate,real>(parameters_input, has_nonzero_diffusion, has_nonzero_physical_source, manufactured_solution_function)
27 , n_model_equations(nstate-nstate_baseline_physics)
28 , physics_baseline(
PhysicsFactory<dim,nstate_baseline_physics,real>::create_Physics(parameters_input, baseline_physics_type))
30 , mpi_communicator(MPI_COMM_WORLD)
31 , mpi_rank(dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD))
32 , n_mpi(dealii::Utilities::MPI::n_mpi_processes(MPI_COMM_WORLD))
33 , pcout(
std::cout, mpi_rank==0)
36 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
41 std::array<real,nstate_baseline_physics> baseline_conservative_soln;
42 for(
int s=0; s<nstate_baseline_physics; ++s){
43 baseline_conservative_soln[s] = conservative_soln[s];
47 std::array<dealii::Tensor<1,dim,real>,nstate_baseline_physics> baseline_conv_flux
51 std::array<dealii::Tensor<1,dim,real>,nstate> conv_flux =
model->convective_flux(conservative_soln);
54 for(
int s=0; s<nstate_baseline_physics; ++s){
55 for (
int d=0; d<dim; ++d) {
56 conv_flux[s][d] += baseline_conv_flux[s][d];
62 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
65 const std::array<real,nstate> &conservative_soln,
66 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
67 const dealii::types::global_dof_index cell_index)
const 70 std::array<real,nstate_baseline_physics> baseline_conservative_soln;
71 for(
int s=0; s<nstate_baseline_physics; ++s){
72 baseline_conservative_soln[s] = conservative_soln[s];
76 std::array<dealii::Tensor<1,dim,real>,nstate_baseline_physics> baseline_solution_gradient;
77 for(
int s=0; s<nstate_baseline_physics; ++s){
78 for (
int d=0; d<dim; ++d) {
79 baseline_solution_gradient[s][d] = solution_gradient[s][d];
86 std::array<dealii::Tensor<1,dim,real>,nstate_baseline_physics> baseline_diss_flux
87 =
physics_baseline->dissipative_flux(baseline_conservative_soln, baseline_solution_gradient, cell_index);
90 std::array<dealii::Tensor<1,dim,real>,nstate> diss_flux =
model->dissipative_flux(conservative_soln, solution_gradient, cell_index);
93 for(
int s=0; s<nstate_baseline_physics; ++s){
94 for (
int d=0; d<dim; ++d) {
95 diss_flux[s][d] += baseline_diss_flux[s][d];
101 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
104 const dealii::Point<dim,real> &pos,
105 const std::array<real,nstate> &conservative_soln,
106 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
107 const dealii::types::global_dof_index cell_index)
const 110 std::array<real,nstate>
physical_source_term =
model->physical_source_term(pos, conservative_soln, solution_gradient, cell_index);
113 std::array<real,nstate_baseline_physics> baseline_conservative_soln;
114 std::array<dealii::Tensor<1,dim,real>,nstate_baseline_physics> baseline_solution_gradient;
115 for(
int s=0; s<nstate_baseline_physics; ++s){
116 baseline_conservative_soln[s] = conservative_soln[s];
117 baseline_solution_gradient[s] = solution_gradient[s];
123 std::array<real,nstate_baseline_physics> baseline_physical_source_term =
physics_baseline->physical_source_term(pos,baseline_conservative_soln,baseline_solution_gradient,cell_index);
126 for(
int s=0; s<nstate_baseline_physics; ++s){
127 physical_source_term[s] += baseline_physical_source_term[s];
133 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
136 const dealii::Point<dim,real> &pos,
137 const std::array<real,nstate> &conservative_soln,
138 const real current_time,
139 const dealii::types::global_dof_index cell_index)
const 149 std::array<real,nstate_baseline_physics> baseline_conservative_soln;
150 for(
int s=0; s<nstate_baseline_physics; ++s){
151 baseline_conservative_soln[s] = conservative_soln[s];
157 std::array<real,nstate_baseline_physics> baseline_source_term =
physics_baseline->source_term(
159 baseline_conservative_soln,
164 for(
int s=0; s<nstate_baseline_physics; ++s){
165 source_term[s] += baseline_source_term[s];
171 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
174 const std::array<real,nstate> &conservative_soln2)
const 176 std::array<dealii::Tensor<1,dim,real>,nstate> conv_num_split_flux;
177 if constexpr(nstate==nstate_baseline_physics) {
178 conv_num_split_flux =
physics_baseline->convective_numerical_split_flux(conservative_soln1,conservative_soln2);
180 pcout <<
"Error: convective_numerical_split_flux() not implemented for nstate!=nstate_baseline_physics." << std::endl;
181 pcout <<
"Aborting..." << std::endl;
184 return conv_num_split_flux;
187 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
190 const std::array<real,nstate> &conservative_soln)
const 192 std::array<real,nstate> entropy_var;
193 if constexpr(nstate==nstate_baseline_physics) {
194 entropy_var =
physics_baseline->compute_entropy_variables(conservative_soln);
202 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
205 const std::array<real,nstate> &entropy_var)
const 207 std::array<real,nstate> conservative_soln;
208 if constexpr(nstate==nstate_baseline_physics) {
209 conservative_soln =
physics_baseline->compute_conservative_variables_from_entropy_variables(entropy_var);
214 return conservative_soln;
217 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
220 const std::array<real,nstate> &conservative_soln,
221 const dealii::Tensor<1,dim,real> &normal)
const 223 std::array<real,nstate> eig;
224 if constexpr(nstate==nstate_baseline_physics) {
227 eig =
model->convective_eigenvalues(conservative_soln, normal);
228 std::array<real,nstate_baseline_physics> baseline_conservative_soln;
229 for(
int s=0; s<nstate_baseline_physics; ++s){
230 baseline_conservative_soln[s] = conservative_soln[s];
232 std::array<real,nstate_baseline_physics> baseline_eig =
physics_baseline->convective_eigenvalues(baseline_conservative_soln, normal);
233 for(
int s=0; s<nstate_baseline_physics; ++s){
235 pcout <<
"Error: PhysicsModel does not currently support additional convective flux terms." << std::endl;
236 pcout <<
"Aborting..." << std::endl;
239 eig[s] += baseline_eig[s];
247 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
252 if constexpr(nstate==nstate_baseline_physics) {
255 max_eig =
model->max_convective_eigenvalue(conservative_soln);
256 std::array<real,nstate_baseline_physics> baseline_conservative_soln;
257 for(
int s=0; s<nstate_baseline_physics; ++s){
258 baseline_conservative_soln[s] = conservative_soln[s];
260 real baseline_max_eig =
physics_baseline->max_convective_eigenvalue(baseline_conservative_soln);
261 max_eig = max_eig > baseline_max_eig ? max_eig : baseline_max_eig;
266 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
269 const std::array<real,nstate> &conservative_soln,
270 const dealii::Tensor<1,dim,real> &normal)
const 273 if constexpr(nstate==nstate_baseline_physics) {
274 max_eig =
physics_baseline->max_convective_normal_eigenvalue(conservative_soln,normal);
276 max_eig =
model->max_convective_normal_eigenvalue(conservative_soln,normal);
277 std::array<real,nstate_baseline_physics> baseline_conservative_soln;
278 for(
int s=0; s<nstate_baseline_physics; ++s){
279 baseline_conservative_soln[s] = conservative_soln[s];
281 real baseline_max_eig =
physics_baseline->max_convective_normal_eigenvalue(baseline_conservative_soln,normal);
282 max_eig = max_eig > baseline_max_eig ? max_eig : baseline_max_eig;
287 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
294 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
297 const int boundary_type,
298 const dealii::Point<dim, real> &pos,
299 const dealii::Tensor<1,dim,real> &normal_int,
300 const std::array<real,nstate> &soln_int,
301 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
302 std::array<real,nstate> &soln_bc,
303 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 305 if constexpr(nstate==nstate_baseline_physics) {
307 boundary_type, pos, normal_int, soln_int, soln_grad_int,
308 soln_bc, soln_grad_bc);
310 std::array<real,nstate_baseline_physics> baseline_soln_int;
311 std::array<dealii::Tensor<1,dim,real>,nstate_baseline_physics> baseline_soln_grad_int;
312 for(
int s=0; s<nstate_baseline_physics; ++s){
313 baseline_soln_int[s] = soln_int[s];
314 baseline_soln_grad_int[s] = soln_grad_int[s];
317 std::array<real,nstate_baseline_physics> baseline_soln_bc;
318 std::array<dealii::Tensor<1,dim,real>,nstate_baseline_physics> baseline_soln_grad_bc;
320 for (
int istate=0; istate<nstate_baseline_physics; istate++) {
321 baseline_soln_bc[istate] = 0;
322 baseline_soln_grad_bc[istate] = 0;
326 boundary_type, pos, normal_int, baseline_soln_int, baseline_soln_grad_int,
327 baseline_soln_bc, baseline_soln_grad_bc);
329 model->boundary_face_values(
330 boundary_type, pos, normal_int, soln_int, soln_grad_int,
331 soln_bc, soln_grad_bc);
333 for(
int s=0; s<nstate_baseline_physics; ++s){
334 soln_bc[s] += baseline_soln_bc[s];
335 soln_grad_bc[s] += baseline_soln_grad_bc[s];
340 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
342 const dealii::Vector<double> &uh,
343 const std::vector<dealii::Tensor<1,dim> > &duh,
344 const std::vector<dealii::Tensor<2,dim> > &dduh,
345 const dealii::Tensor<1,dim> &normals,
346 const dealii::Point<dim> &evaluation_points)
const 348 dealii::Vector<double> computed_quantities;
349 if constexpr(nstate==nstate_baseline_physics) {
350 computed_quantities =
physics_baseline->post_compute_derived_quantities_vector(
351 uh, duh, dduh, normals, evaluation_points);
353 dealii::Vector<double> computed_quantities_model;
354 computed_quantities_model =
model->post_compute_derived_quantities_vector(
355 uh, duh, dduh, normals, evaluation_points);
356 dealii::Vector<double> computed_quantities_base;
357 computed_quantities_base =
physics_baseline->post_compute_derived_quantities_vector(
358 uh, duh, dduh, normals, evaluation_points);
360 dealii::Vector<double> computed_quantities_total(computed_quantities_base.size()+computed_quantities_model.size());
361 for (
unsigned int i=0;i<computed_quantities_base.size();i++){
362 computed_quantities_total(i) = computed_quantities_base(i);
364 for (
unsigned int i=0;i<computed_quantities_model.size();i++){
365 computed_quantities_total(i+computed_quantities_base.size()) = computed_quantities_model(i);
367 computed_quantities = computed_quantities_total;
369 return computed_quantities;
372 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
376 std::vector<std::string> names;
377 if constexpr(nstate==nstate_baseline_physics) {
380 std::vector<std::string> names_model;
382 names_model =
model->post_get_names();
383 names.insert(names.end(),names_model.begin(),names_model.end());
388 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
392 namespace DCI = dealii::DataComponentInterpretation;
393 std::vector<DCI::DataComponentInterpretation> interpretation;
394 if constexpr(nstate==nstate_baseline_physics) {
395 interpretation =
physics_baseline->post_get_data_component_interpretation();
397 std::vector<DCI::DataComponentInterpretation> interpretation_model;
398 interpretation =
physics_baseline->post_get_data_component_interpretation();
399 interpretation_model =
model->post_get_data_component_interpretation();
400 interpretation.insert(interpretation.end(),interpretation_model.begin(),interpretation_model.end());
402 return interpretation;
405 template <
int dim,
int nstate,
typename real,
int nstate_baseline_physics>
411 return dealii::update_values
412 | dealii::update_quadrature_points
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
Returns current vector solution to be used by PhysicsPostprocessor to output current solution...
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 (i.e. viscous) flux: .
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Manufactured solution used for grid studies to check convergence orders.
Physics Model equations. Derived from PhysicsBase, holds a baseline physics and model terms and equat...
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.
PartialDifferentialEquation
Possible Partial Differential Equations to solve.
Files for the baseline physics.
std::array< real, nstate > physical_source_term(const dealii::Point< dim, real > &pos, 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
Physical source term.
std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > post_get_data_component_interpretation() const
Returns DataComponentInterpretation of the solution to be used by PhysicsPostprocessor to output curr...
Physics model additional terms and equations to the baseline physics.
Main parameter class that contains the various other sub-parameter classes.
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_flux(const std::array< real, nstate > &conservative_soln) const
Convective flux: .
real max_viscous_eigenvalue(const std::array< real, nstate > &soln) const
Maximum viscous eigenvalue.
std::vector< std::string > post_get_names() const
Returns names of the solution to be used by PhysicsPostprocessor to output current solution...
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 that does not require differentiation.
std::array< real, nstate > convective_eigenvalues(const std::array< real, nstate > &, const dealii::Tensor< 1, dim, real > &) const
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const
Maximum convective eigenvalue.
std::shared_ptr< PhysicsBase< dim, nstate_baseline_physics, real > > physics_baseline
Baseline physics object with nstate==nstate_baseline_physics.
std::array< real, nstate > compute_entropy_variables(const std::array< real, nstate > &conservative_soln) const
Computes the entropy variables.
Create specified physics as PhysicsBase object.
std::shared_ptr< ModelBase< dim, nstate, real > > model
Model object.
dealii::ConditionalOStream pcout
ConditionalOStream.
dealii::UpdateFlags post_get_needed_update_flags() const
Returns required update flags of the solution to be used by PhysicsPostprocessor to output current so...
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
Convective Numerical Split Flux for split form.
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)
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.
PhysicsModel(const Parameters::AllParameters *const parameters_input, Parameters::AllParameters::PartialDifferentialEquation baseline_physics_type, std::shared_ptr< ModelBase< dim, nstate, real > > model_input, std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function, const bool has_nonzero_diffusion, const bool has_nonzero_physical_source)
Constructor.