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.