[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
physics_factory.cpp
1 #include "parameters/all_parameters.h"
2 #include "parameters/parameters_manufactured_solution.h"
3 
4 #include <deal.II/base/tensor.h>
5 
6 #include "ADTypes.hpp"
7 
8 #include "physics_factory.h"
9 #include "manufactured_solution.h"
10 #include "physics.h"
11 #include "convection_diffusion.h"
12 #include "burgers.h"
13 #include "burgers_rewienski.h"
14 #include "euler.h"
15 #include "mhd.h"
16 #include "navier_stokes.h"
17 #include "physics_model.h"
18 
19 namespace PHiLiP {
20 namespace Physics {
21 
22 template <int dim, int nstate, typename real>
23 std::shared_ptr < PhysicsBase<dim,nstate,real> >
25 ::create_Physics(const Parameters::AllParameters *const parameters_input,
26  std::shared_ptr< ModelBase<dim,nstate,real> > model_input)
27 {
29  PDE_enum pde_type = parameters_input->pde_type;
30 
31  return create_Physics(parameters_input, pde_type, model_input);
32 }
33 
34 template <int dim, int nstate, typename real>
35 std::shared_ptr < PhysicsBase<dim,nstate,real> >
37 ::create_Physics(const Parameters::AllParameters *const parameters_input,
39  std::shared_ptr< ModelBase<dim,nstate,real> > model_input)
40 {
42 
43  // generating the manufactured solution from the manufactured solution factory
44  std::shared_ptr< ManufacturedSolutionFunction<dim,real> > manufactured_solution_function
46 
47  // setting the diffusion tensor and advection vectors from parameters (if needed)
48  const dealii::Tensor<2,3,double> diffusion_tensor = parameters_input->manufactured_convergence_study_param.manufactured_solution_param.diffusion_tensor;
49  const dealii::Tensor<1,3,double> advection_vector = parameters_input->manufactured_convergence_study_param.manufactured_solution_param.advection_vector;
50  const double diffusion_coefficient = parameters_input->manufactured_convergence_study_param.manufactured_solution_param.diffusion_coefficient;
51 
52  if (pde_type == PDE_enum::advection || pde_type == PDE_enum::advection_vector) {
53  if constexpr (nstate<=2)
54  return std::make_shared < ConvectionDiffusion<dim,nstate,real> >(
55  parameters_input,
56  true, false,
57  diffusion_tensor, advection_vector, diffusion_coefficient,
58  manufactured_solution_function);
59  } else if (pde_type == PDE_enum::diffusion) {
60  if constexpr (nstate==1)
61  return std::make_shared < ConvectionDiffusion<dim,nstate,real> >(
62  parameters_input,
63  false, true,
64  diffusion_tensor, advection_vector, diffusion_coefficient,
65  manufactured_solution_function,
66  parameters_input->test_type);
67  } else if (pde_type == PDE_enum::convection_diffusion) {
68  if constexpr (nstate==1)
69  return std::make_shared < ConvectionDiffusion<dim,nstate,real> >(
70  parameters_input,
71  true, true,
72  diffusion_tensor, advection_vector, diffusion_coefficient,
73  manufactured_solution_function,
74  parameters_input->test_type);
75  } else if (pde_type == PDE_enum::burgers_inviscid) {
76  if constexpr (nstate==dim)
77  return std::make_shared < Burgers<dim,nstate,real> >(
78  parameters_input,
79  parameters_input->burgers_param.diffusion_coefficient,
80  true, false,
81  diffusion_tensor,
82  manufactured_solution_function,
83  parameters_input->test_type);
84  } else if (pde_type == PDE_enum::burgers_viscous) {
85  if constexpr (nstate==dim)
86  return std::make_shared < Burgers<dim,nstate,real> >(
87  parameters_input,
88  parameters_input->burgers_param.diffusion_coefficient,
89  true, true,
90  diffusion_tensor,
91  manufactured_solution_function);
92  } else if (pde_type == PDE_enum::burgers_rewienski) {
93  if constexpr (nstate==dim)
94  return std::make_shared < BurgersRewienski<dim,nstate,real> >(
95  parameters_input,
96  parameters_input->burgers_param.rewienski_a,
97  parameters_input->burgers_param.rewienski_b,
98  parameters_input->burgers_param.rewienski_manufactured_solution,
99  true,
100  false,
101  diffusion_tensor,
102  manufactured_solution_function);
103  } else if (pde_type == PDE_enum::euler) {
104  if constexpr (nstate==dim+2) {
105  return std::make_shared < Euler<dim,nstate,real> > (
106  parameters_input,
107  parameters_input->euler_param.ref_length,
108  parameters_input->euler_param.gamma_gas,
109  parameters_input->euler_param.mach_inf,
110  parameters_input->euler_param.angle_of_attack,
111  parameters_input->euler_param.side_slip_angle,
112  manufactured_solution_function,
113  parameters_input->two_point_num_flux_type);
114  }
115  } else if (pde_type == PDE_enum::mhd) {
116  if constexpr (nstate == 8)
117  return std::make_shared < MHD<dim,nstate,real> > (
118  parameters_input,
119  parameters_input->euler_param.gamma_gas,
120  diffusion_tensor,
121  manufactured_solution_function);
122  } else if (pde_type == PDE_enum::navier_stokes) {
123  if constexpr (nstate==dim+2) {
124  return std::make_shared < NavierStokes<dim,nstate,real> > (
125  parameters_input,
126  parameters_input->euler_param.ref_length,
127  parameters_input->euler_param.gamma_gas,
128  parameters_input->euler_param.mach_inf,
129  parameters_input->euler_param.angle_of_attack,
130  parameters_input->euler_param.side_slip_angle,
131  parameters_input->navier_stokes_param.prandtl_number,
132  parameters_input->navier_stokes_param.reynolds_number_inf,
133  parameters_input->navier_stokes_param.use_constant_viscosity,
134  parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
135  parameters_input->navier_stokes_param.temperature_inf,
136  parameters_input->navier_stokes_param.nondimensionalized_isothermal_wall_temperature,
137  parameters_input->navier_stokes_param.thermal_boundary_condition_type,
138  manufactured_solution_function,
139  parameters_input->two_point_num_flux_type);
140  }
141  } else if (pde_type == PDE_enum::physics_model) {
142  if constexpr (nstate>=dim+2) {
143  return create_Physics_Model(parameters_input,
144  manufactured_solution_function,
145  model_input);
146  }
147  } else {
148  // prevent warnings for dim=3,nstate=4, etc.
149  (void) diffusion_tensor;
150  (void) advection_vector;
151  (void) diffusion_coefficient;
152  }
153  std::cout << "Can't create PhysicsBase, invalid PDE type: " << pde_type << std::endl;
154  assert(0==1 && "Can't create PhysicsBase, invalid PDE type");
155  return nullptr;
156 }
157 
158 template <int dim, int nstate, typename real>
159 std::shared_ptr < PhysicsBase<dim,nstate,real> >
161 ::create_Physics_Model(const Parameters::AllParameters *const parameters_input,
162  std::shared_ptr< ManufacturedSolutionFunction<dim,real> > manufactured_solution_function,
163  std::shared_ptr< ModelBase<dim,nstate,real> > model_input)
164 {
166 
167  using Model_enum = Parameters::AllParameters::ModelType;
168  Model_enum model_type = parameters_input->model_type;
169 
171  RANSModel_enum rans_model_type = parameters_input->physics_model_param.RANS_model_type;
172 
173  // ===============================================================================
174  // Physics Model
175  // ===============================================================================
176 
177  // Create baseline physics object
178  PDE_enum baseline_physics_type;
179 
180  // Flag to signal non-zero diffusion
181  bool has_nonzero_diffusion;
182 
183  // Flag to signal non-zero physical source
184  bool has_nonzero_physical_source;
185 
186  // -------------------------------------------------------------------------------
187  // Large Eddy Simulation (LES)
188  // -------------------------------------------------------------------------------
189  if (model_type == Model_enum::large_eddy_simulation) {
190  has_nonzero_diffusion = true; // because of SGS model term
191  has_nonzero_physical_source = false; // LES has no physical source terms
192  if constexpr ((nstate==dim+2) && (dim==3)) {
193  // Assign baseline physics type (and corresponding nstates) based on the physics model type
194  // -- Assign nstates for the baseline physics (constexpr because template parameter)
195  constexpr int nstate_baseline_physics = dim+2;
196  // -- Assign baseline physics type
197  if(parameters_input->physics_model_param.euler_turbulence) {
198  baseline_physics_type = PDE_enum::euler;
199  }
200  else {
201  baseline_physics_type = PDE_enum::navier_stokes;
202  }
203 
204  // Create the physics model object in physics
205  return std::make_shared < PhysicsModel<dim,nstate,real,nstate_baseline_physics> > (
206  parameters_input,
207  baseline_physics_type,
208  model_input,
209  manufactured_solution_function,
210  has_nonzero_diffusion,
211  has_nonzero_physical_source);
212  }
213  else {
214  // LES does not exist for nstate!=(dim+2) || dim!=3
215  (void) baseline_physics_type;
216  (void) has_nonzero_diffusion;
217  (void) has_nonzero_physical_source;
218  return nullptr;
219  }
220  }
221  // -------------------------------------------------------------------------------
222  // Reynolds-Averaged Navier-Stokes (RANS) + RANS model
223  // -------------------------------------------------------------------------------
224  else if (model_type == Model_enum::reynolds_averaged_navier_stokes) {
225  has_nonzero_diffusion = true; // RANS (baseline part) has diffusion terms
226  has_nonzero_physical_source = true; // RANS (baseline part) has physical source terms
227  if (rans_model_type == RANSModel_enum::SA_negative)
228  {
229  if constexpr (nstate==dim+3) {
230  // Assign baseline physics type (and corresponding nstates) based on the physics model type
231  // -- Assign nstates for the baseline physics (constexpr because template parameter)
232  constexpr int nstate_baseline_physics = dim+2;
233  // -- Assign baseline physics type
234  if(parameters_input->physics_model_param.euler_turbulence) {
235  baseline_physics_type = PDE_enum::euler;
236  }
237  else {
238  baseline_physics_type = PDE_enum::navier_stokes;
239  }
240 
241  // Create the physics model object in physics
242  return std::make_shared < PhysicsModel<dim,nstate,real,nstate_baseline_physics> > (
243  parameters_input,
244  baseline_physics_type,
245  model_input,
246  manufactured_solution_function,
247  has_nonzero_diffusion,
248  has_nonzero_physical_source);
249  }
250  else {
251  // RANS+one-equation model does not exist for nstate!=(dim+3)
252  (void) baseline_physics_type;
253  (void) has_nonzero_physical_source;
254  std::cout << "Can't create RANS + negative SA model for nstate!=(dim+3). " << std::endl;
255  return nullptr;
256  }
257  }
258  }
259  else {
260  // prevent warnings for dim=3,nstate=4, etc.
261  (void) baseline_physics_type;
262  (void) has_nonzero_diffusion;
263  (void) has_nonzero_physical_source;
264  }
265  std::cout << "Can't create PhysicsModel, invalid ModelType type: " << model_type << std::endl;
266  assert(0==1 && "Can't create PhysicsModel, invalid ModelType type");
267  return nullptr;
268 }
269 
277 
285 
293 
301 
309 
310 
311 
312 } // Physics namespace
313 } // PHiLiP namespace
314 
double diffusion_coefficient
Parameter for diffusion coefficient.
PartialDifferentialEquation pde_type
Store the PDE type to be solved.
Manufactured solution used for grid studies to check convergence orders.
static std::shared_ptr< ManufacturedSolutionFunction< dim, real > > create_ManufacturedSolution(Parameters::AllParameters const *const param, int nstate)
Construct Manufactured solution object from global parameter file.
PartialDifferentialEquation
Possible Partial Differential Equations to solve.
Files for the baseline physics.
Definition: ADTypes.hpp:10
ManufacturedSolutionParam manufactured_solution_param
Associated manufactured solution parameters.
Physics model additional terms and equations to the baseline physics.
Definition: model.h:18
EulerParam euler_param
Contains parameters for the Euler equations non-dimensionalization.
ModelType
Types of models available.
Main parameter class that contains the various other sub-parameter classes.
ManufacturedConvergenceStudyParam manufactured_convergence_study_param
Contains parameters for manufactured convergence study.
double ref_length
Reference length.
TestType test_type
Store selected TestType from the input file.
ReynoldsAveragedNavierStokesModel
Types of Reynolds-averaged Navier-Stokes (RANS) models that can be used.
dealii::Tensor< 1, 3, double > advection_vector
Advection velocity.
Create specified physics as PhysicsBase object.
static std::shared_ptr< PhysicsBase< dim, nstate, real > > create_Physics(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ModelBase< dim, nstate, real > > model_input=nullptr)
Factory to return the correct physics given input file.
ReynoldsAveragedNavierStokesModel RANS_model_type
Store the Reynolds-averaged Navier-Stokes (RANS) model type.
static std::shared_ptr< PhysicsBase< dim, nstate, real > > create_Physics_Model(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function=nullptr, std::shared_ptr< ModelBase< dim, nstate, real > > model_input=nullptr)
Factory to return the correct physics model, i.e. when PDE_type==physics_model, given input file...
dealii::Tensor< 2, 3, double > diffusion_tensor
Diffusion tensor.
ModelType model_type
Store the model type.
PhysicsModelParam physics_model_param
Contains parameters for Physics Model.
BurgersParam burgers_param
Contains parameters for Burgers equation.