[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
dg_factory.cpp
1 #include "dg_factory.hpp"
2 #include "weak_dg.hpp"
3 #include "strong_dg.hpp"
4 #include "strong_dg_les.hpp"
5 
6 namespace PHiLiP {
7 
8 template <int dim, int nspecies, typename real, typename MeshType>
9 std::shared_ptr< DGBase<dim,nspecies,real,MeshType> >
12  const Parameters::AllParameters *const parameters_input,
13  const unsigned int degree,
14  const unsigned int max_degree_input,
15  const unsigned int grid_degree_input,
16  const std::shared_ptr<Triangulation> triangulation_input)
17 {
19  const PDE_enum pde_type = parameters_input->pde_type;
20  using Model_enum = Parameters::AllParameters::ModelType;
21  const Model_enum model_type = parameters_input->model_type;
23  const RANSModel_enum rans_model_type = parameters_input->physics_model_param.RANS_model_type;
24 
25  if (parameters_input->use_weak_form) {
26  if constexpr(nspecies==1){
27  if (pde_type == PDE_enum::advection) {
28  return std::make_shared< DGWeak<dim,nspecies,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
29  } else if (pde_type == PDE_enum::advection_vector) {
30  return std::make_shared< DGWeak<dim,nspecies,2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
31  } else if (pde_type == PDE_enum::diffusion) {
32  return std::make_shared< DGWeak<dim,nspecies,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
33  } else if (pde_type == PDE_enum::convection_diffusion) {
34  return std::make_shared< DGWeak<dim,nspecies,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
35  } else if (pde_type == PDE_enum::burgers_inviscid) {
36  return std::make_shared< DGWeak<dim,nspecies,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
37  } else if (pde_type == PDE_enum::burgers_viscous) {
38  return std::make_shared< DGWeak<dim,nspecies,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
39  } else if (pde_type == PDE_enum::burgers_rewienski) {
40  return std::make_shared< DGWeak<dim,nspecies,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
41  } else if (pde_type == PDE_enum::euler) {
42  return std::make_shared< DGWeak<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
43  } else if (pde_type == PDE_enum::navier_stokes) {
44  return std::make_shared< DGWeak<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
45  } else if (pde_type == PDE_enum::navier_stokes_channel_flow_constant_source_term) {
46  return std::make_shared< DGWeak<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
47  } else if ((pde_type == PDE_enum::physics_model) && (model_type == Model_enum::reynolds_averaged_navier_stokes) && (rans_model_type == RANSModel_enum::SA_negative)) {
48  return std::make_shared< DGWeak<dim,nspecies,dim+3,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
49  } else if(pde_type == PDE_enum::real_gas) {
50  std::cout << "Real Gas PDE only supports 2 or more species... Aborting." << std::endl;
51  std::abort();
52  }
53 #if PHILIP_DIM==3
54  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)) {
55  return std::make_shared< DGWeak<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
56  }
57 #endif
58  }
59  else if (pde_type == PDE_enum::real_gas) {
60  // nspecies > 1
61  return std::make_shared< DGWeak<dim,nspecies,dim+nspecies+1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
62  }
63  } else {
64  if constexpr(nspecies==1) {
65  if (pde_type == PDE_enum::advection) {
66  return std::make_shared< DGStrong<dim,nspecies,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
67  } else if (pde_type == PDE_enum::advection_vector) {
68  return std::make_shared< DGStrong<dim,nspecies,2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
69  } else if (pde_type == PDE_enum::diffusion) {
70  return std::make_shared< DGStrong<dim,nspecies,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
71  } else if (pde_type == PDE_enum::convection_diffusion) {
72  return std::make_shared< DGStrong<dim,nspecies,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
73  } else if (pde_type == PDE_enum::burgers_inviscid) {
74  return std::make_shared< DGStrong<dim,nspecies,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
75  } else if (pde_type == PDE_enum::burgers_viscous) {
76  return std::make_shared< DGStrong<dim,nspecies,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
77  } else if (pde_type == PDE_enum::burgers_rewienski) {
78  return std::make_shared< DGStrong<dim,nspecies,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
79  } else if (pde_type == PDE_enum::euler) {
80  return std::make_shared< DGStrong<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
81  } else if (pde_type == PDE_enum::navier_stokes) {
82  return std::make_shared< DGStrong<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
83  } else if (pde_type == PDE_enum::navier_stokes_channel_flow_constant_source_term) {
84  return std::make_shared< DGStrong<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
85  } else if (pde_type == PDE_enum::navier_stokes_channel_flow_constant_source_term_wall_model) {
86  return std::make_shared< DGStrong<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
87  } else if ((pde_type == PDE_enum::physics_model) && (model_type == Model_enum::reynolds_averaged_navier_stokes) && (rans_model_type == RANSModel_enum::SA_negative)) {
88  return std::make_shared< DGStrong<dim,nspecies,dim+3,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
89  }
90 #if PHILIP_DIM==3
91  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)) {
92  using FlowCaseType_enum = Parameters::FlowSolverParam::FlowCaseType;
93  const FlowCaseType_enum flow_case_type = parameters_input->flow_solver_param.flow_case_type;
94  if(model_type == Model_enum::large_eddy_simulation) {
96  const SGS_enum SGS_model_type = parameters_input->physics_model_param.SGS_model_type;
97  if(SGS_model_type == SGS_enum::shear_improved_smagorinsky) {
98  return std::make_shared< DGStrongLES_ShearImproved<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
99  } else if(SGS_model_type == SGS_enum::dynamic_smagorinsky) {
100  return std::make_shared< DGStrongLES_DynamicSmagorinsky<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
101  } else {
102  return std::make_shared< DGStrongLES<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
103  }
104  } else if (model_type == Model_enum::navier_stokes_model && flow_case_type == FlowCaseType_enum::channel_flow) {
105  return std::make_shared< DGStrong_ChannelFlow<dim,nspecies,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
106  }
107  }
108 #endif
109  }
110  else if (pde_type == PDE_enum::real_gas) {
111  // nspecies > 1
112  return std::make_shared< DGStrong<dim,nspecies,dim+nspecies+1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
113  }
114  }
115  std::cout << "Can't create DGBase in create_discontinuous_galerkin(). Invalid PDE type: " << pde_type << std::endl;
116  return nullptr;
117 }
118 
119 template <int dim, int nspecies, typename real, typename MeshType>
120 std::shared_ptr< DGBase<dim,nspecies,real,MeshType> >
123  const Parameters::AllParameters *const parameters_input,
124  const unsigned int degree,
125  const unsigned int max_degree_input,
126  const std::shared_ptr<Triangulation> triangulation_input)
127 {
128  return create_discontinuous_galerkin(parameters_input, degree, max_degree_input, degree+1, triangulation_input);
129 }
130 
131 template <int dim, int nspecies, typename real, typename MeshType>
132 std::shared_ptr< DGBase<dim,nspecies,real,MeshType> >
135  const Parameters::AllParameters *const parameters_input,
136  const unsigned int degree,
137  const std::shared_ptr<Triangulation> triangulation_input)
138 {
139  return create_discontinuous_galerkin(parameters_input, degree, degree, triangulation_input);
140 }
141 
144 #if PHILIP_DIM!=1
146 #endif
147 } // PHiLiP namespace
FlowCaseType
Selects the flow case to be simulated.
PartialDifferentialEquation pde_type
Store the PDE type to be solved.
FlowCaseType flow_case_type
Selected FlowCaseType from the input file.
FlowSolverParam flow_solver_param
Contains the parameters for simulation cases (flow solver test)
PartialDifferentialEquation
Possible Partial Differential Equations to solve.
Files for the baseline physics.
Definition: ADTypes.hpp:10
bool use_weak_form
Flag to use weak or strong form of DG.
ModelType
Types of models available.
Main parameter class that contains the various other sub-parameter classes.
SubGridScaleModel SGS_model_type
Store the SubGridScale (SGS) model type.
This class creates a new DGBase object.
Definition: dg_factory.hpp:16
ReynoldsAveragedNavierStokesModel
Types of Reynolds-averaged Navier-Stokes (RANS) models that can be used.
static std::shared_ptr< DGBase< dim, nspecies, real, MeshType > > create_discontinuous_galerkin(const Parameters::AllParameters *const parameters_input, const unsigned int degree, const unsigned int max_degree_input, const unsigned int grid_degree_input, const std::shared_ptr< Triangulation > triangulation_input)
Creates a derived object DG, but returns it as DGBase.
Definition: dg_factory.cpp:11
ReynoldsAveragedNavierStokesModel RANS_model_type
Store the Reynolds-averaged Navier-Stokes (RANS) model type.
SubGridScaleModel
Types of sub-grid scale (SGS) models that can be used.
ModelType model_type
Store the model type.
PhysicsModelParam physics_model_param
Contains parameters for Physics Model.