[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
physics_post_processor.cpp
1 #include "physics_post_processor.h"
2 #include "physics/physics_factory.h"
3 #include "physics/model_factory.h"
4 
5 namespace PHiLiP {
6 namespace Postprocess {
7 
8 template <int dim, int nspecies>
9 std::unique_ptr< dealii::DataPostprocessor<dim> > PostprocessorFactory<dim,nspecies>
10 ::create_Postprocessor(const Parameters::AllParameters *const parameters_input)
11 {
13  const PDE_enum pde_type = parameters_input->pde_type;
14 
15 #if PHILIP_SPECIES==1
16  using Model_enum = Parameters::AllParameters::ModelType;
17  const Model_enum model_type = parameters_input->model_type;
19  const RANSModel_enum rans_model_type = parameters_input->physics_model_param.RANS_model_type;
20 #endif
21 
22  if (pde_type == PDE_enum::real_gas) {
23  return std::make_unique< PhysicsPostprocessor<dim,nspecies,dim+nspecies+1> >(parameters_input);
24  }
25 #if PHILIP_SPECIES==1
26  if (pde_type == PDE_enum::advection && nspecies == 1) {
27  return std::make_unique< PhysicsPostprocessor<dim,nspecies,1> >(parameters_input);
28  } else if (pde_type == PDE_enum::advection_vector && nspecies == 1) {
29  return std::make_unique< PhysicsPostprocessor<dim,nspecies,2> >(parameters_input);
30  } else if (pde_type == PDE_enum::diffusion && nspecies == 1) {
31  return std::make_unique< PhysicsPostprocessor<dim,nspecies,1> >(parameters_input);
32  } else if (pde_type == PDE_enum::convection_diffusion && nspecies == 1) {
33  return std::make_unique< PhysicsPostprocessor<dim,nspecies,1> >(parameters_input);
34  } else if (pde_type == PDE_enum::burgers_inviscid && nspecies == 1) {
35  return std::make_unique< PhysicsPostprocessor<dim,nspecies,dim> >(parameters_input);
36  } else if (pde_type == PDE_enum::burgers_viscous && nspecies == 1) {
37  return std::make_unique< PhysicsPostprocessor<dim,nspecies,dim> >(parameters_input);
38  } else if (pde_type == PDE_enum::burgers_rewienski && nspecies == 1) {
39  return std::make_unique< PhysicsPostprocessor<dim,nspecies,dim> >(parameters_input);
40  } else if (pde_type == PDE_enum::euler && nspecies == 1) {
41  return std::make_unique< PhysicsPostprocessor<dim,nspecies,dim+2> >(parameters_input);
42  } else if (pde_type == PDE_enum::navier_stokes && nspecies == 1) {
43  return std::make_unique< PhysicsPostprocessor<dim,nspecies,dim+2> >(parameters_input);
44  } else if (pde_type == PDE_enum::navier_stokes_channel_flow_constant_source_term && nspecies == 1) {
45  return std::make_unique< PhysicsPostprocessor<dim,nspecies,dim+2> >(parameters_input);
46  } else if (pde_type == PDE_enum::navier_stokes_channel_flow_constant_source_term_wall_model && nspecies == 1) {
47  return std::make_unique< PhysicsPostprocessor<dim,nspecies,dim+2> >(parameters_input);
48  } else if ((pde_type == PDE_enum::physics_model) && (model_type == Model_enum::reynolds_averaged_navier_stokes) && (rans_model_type == RANSModel_enum::SA_negative) && nspecies == 1) {
49  return std::make_unique< PhysicsPostprocessor<dim,nspecies,dim+3> >(parameters_input);
50  }
51 #if PHILIP_DIM==3
52  else if ((pde_type == PDE_enum::physics_model || pde_type == PDE_enum::physics_model_filtered) && (model_type==Model_enum::large_eddy_simulation || model_type==Model_enum::navier_stokes_model) && nspecies == 1) {
53  return std::make_unique< PhysicsPostprocessor<dim,nspecies,dim+2> >(parameters_input);
54  }
55 #endif
56 #endif
57  else {
58  std::cout << "Invalid PDE when creating post-processor" << std::endl;
59  std::abort();
60  }
61 }
63 
64 template <int dim, int nspecies,int nstate> PhysicsPostprocessor<dim,nspecies,nstate>
65 ::PhysicsPostprocessor (const Parameters::AllParameters *const parameters_input)
66 {
67  if constexpr(nspecies==1) {
69  this->physics = Physics::PhysicsFactory<dim,nspecies,nstate,double>::create_Physics(parameters_input,this->model);
70  } else {
71  this->model = nullptr;
72  this->physics = Physics::PhysicsFactory<dim,nspecies,nstate,double>::create_Physics(parameters_input, this->model);
73  }
74 }
75 
76 template <int dim, int nspecies, int nstate> void PhysicsPostprocessor<dim,nspecies,nstate>
77 ::evaluate_vector_field (const dealii::DataPostprocessorInputs::Vector<dim> &inputs, std::vector<dealii::Vector<double>> &computed_quantities) const
78 {
79  const unsigned int n_quadrature_points = inputs.solution_values.size();
80  Assert (computed_quantities.size() == n_quadrature_points, dealii::ExcInternalError());
81  Assert (inputs.solution_values[0].size() == nstate, dealii::ExcInternalError());
82  for (unsigned int q=0; q<n_quadrature_points; ++q)
83  {
84  computed_quantities[q] = this->physics->post_compute_derived_quantities_vector(
85  inputs.solution_values[q],
86  inputs.solution_gradients[q],
87  inputs.solution_hessians[q],
88  inputs.normals[q],
89  inputs.evaluation_points[q]);
90  }
91 }
92 
93 template <int dim, int nspecies, int nstate> void PhysicsPostprocessor<dim,nspecies,nstate>
94 ::evaluate_scalar_field (const dealii::DataPostprocessorInputs::Scalar<dim> &inputs, std::vector<dealii::Vector<double>> &computed_quantities) const
95 {
96  const unsigned int n_quadrature_points = inputs.solution_values.size();
97  Assert (computed_quantities.size() == n_quadrature_points, dealii::ExcInternalError());
98  for (unsigned int q=0; q<n_quadrature_points; ++q)
99  {
100  computed_quantities[q] = this->physics->post_compute_derived_quantities_scalar(
101  inputs.solution_values[q],
102  inputs.solution_gradients[q],
103  inputs.solution_hessians[q],
104  inputs.normals[q],
105  inputs.evaluation_points[q]);
106  }
107 }
108 
109 
110 template <int dim, int nspecies, int nstate>
112 {
113  return this->physics->post_get_names();
114 }
115 template <int dim, int nspecies, int nstate>
116 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
118 {
119  return this->physics->post_get_data_component_interpretation();
120 }
121 template <int dim, int nspecies, int nstate>
123 {
124  return this->physics->post_get_needed_update_flags();
125 }
126 
127 #if PHILIP_SPECIES==1
134 #else
136 #endif
137 } // Postprocess namespace
138 } // PHiLiP namespace
139 
140 
141 
PartialDifferentialEquation pde_type
Store the PDE type to be solved.
Postprocessor to output solution and other values computed by associated physics. ...
virtual std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > get_data_component_interpretation() const override
Queries the Physics for the type (scalar/vector) of output data variables.
PhysicsPostprocessor(const Parameters::AllParameters *const parameters_input)
Constructor.
PartialDifferentialEquation
Possible Partial Differential Equations to solve.
Files for the baseline physics.
Definition: ADTypes.hpp:10
virtual std::vector< std::string > get_names() const override
Queries the Physics for the names of output data variables.
virtual void evaluate_scalar_field(const dealii::DataPostprocessorInputs::Scalar< dim > &inputs, std::vector< dealii::Vector< double >> &computed_quantities) const override
Queries the Physics to output data of a scalar-valued problem.
ModelType
Types of models available.
Main parameter class that contains the various other sub-parameter classes.
ReynoldsAveragedNavierStokesModel
Types of Reynolds-averaged Navier-Stokes (RANS) models that can be used.
ReynoldsAveragedNavierStokesModel RANS_model_type
Store the Reynolds-averaged Navier-Stokes (RANS) model type.
static std::shared_ptr< PhysicsBase< dim, nspecies, nstate, real > > create_Physics(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ModelBase< dim, nspecies, nstate, real > > model_input=nullptr)
Factory to return the correct physics given input file.
ModelType model_type
Store the model type.
virtual void evaluate_vector_field(const dealii::DataPostprocessorInputs::Vector< dim > &inputs, std::vector< dealii::Vector< double >> &computed_quantities) const override
Queries the Physics to output data of a vector-valued problem.
static std::shared_ptr< ModelBase< dim, nspecies, nstate, real > > create_Model(const Parameters::AllParameters *const parameters_input)
Factory to return the correct model given input parameters.
PhysicsModelParam physics_model_param
Contains parameters for Physics Model.
static std::unique_ptr< dealii::DataPostprocessor< dim > > create_Postprocessor(const Parameters::AllParameters *const parameters_input)
Create the post-processor with the correct template parameters.
virtual dealii::UpdateFlags get_needed_update_flags() const override
Queries the Physics for the required update flags to evaluate output data.