[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 
5 namespace PHiLiP {
6 
7 template <int dim, typename real, typename MeshType>
8 std::shared_ptr< DGBase<dim,real,MeshType> >
11  const Parameters::AllParameters *const parameters_input,
12  const unsigned int degree,
13  const unsigned int max_degree_input,
14  const unsigned int grid_degree_input,
15  const std::shared_ptr<Triangulation> triangulation_input)
16 {
18  const PDE_enum pde_type = parameters_input->pde_type;
19  using Model_enum = Parameters::AllParameters::ModelType;
20  const Model_enum model_type = parameters_input->model_type;
22  const RANSModel_enum rans_model_type = parameters_input->physics_model_param.RANS_model_type;
23 
24  if (parameters_input->use_weak_form) {
25  if (pde_type == PDE_enum::advection) {
26  return std::make_shared< DGWeak<dim,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
27  } else if (pde_type == PDE_enum::advection_vector) {
28  return std::make_shared< DGWeak<dim,2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
29  } else if (pde_type == PDE_enum::diffusion) {
30  return std::make_shared< DGWeak<dim,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
31  } else if (pde_type == PDE_enum::convection_diffusion) {
32  return std::make_shared< DGWeak<dim,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
33  } else if (pde_type == PDE_enum::burgers_inviscid) {
34  return std::make_shared< DGWeak<dim,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
35  } else if (pde_type == PDE_enum::burgers_viscous) {
36  return std::make_shared< DGWeak<dim,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
37  } else if (pde_type == PDE_enum::burgers_rewienski) {
38  return std::make_shared< DGWeak<dim,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
39  } else if (pde_type == PDE_enum::euler) {
40  return std::make_shared< DGWeak<dim,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
41  } else if (pde_type == PDE_enum::navier_stokes) {
42  return std::make_shared< DGWeak<dim,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
43  } else if ((pde_type == PDE_enum::physics_model) && (model_type == Model_enum::reynolds_averaged_navier_stokes) && (rans_model_type == RANSModel_enum::SA_negative)) {
44  return std::make_shared< DGWeak<dim,dim+3,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
45  }
46 #if PHILIP_DIM==3
47  else if ((pde_type == PDE_enum::physics_model) && (model_type == Model_enum::large_eddy_simulation)) {
48  return std::make_shared< DGWeak<dim,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
49  }
50 #endif
51  } else {
52  if (pde_type == PDE_enum::advection) {
53  return std::make_shared< DGStrong<dim,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
54  } else if (pde_type == PDE_enum::advection_vector) {
55  return std::make_shared< DGStrong<dim,2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
56  } else if (pde_type == PDE_enum::diffusion) {
57  return std::make_shared< DGStrong<dim,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
58  } else if (pde_type == PDE_enum::convection_diffusion) {
59  return std::make_shared< DGStrong<dim,1,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
60  } else if (pde_type == PDE_enum::burgers_inviscid) {
61  return std::make_shared< DGStrong<dim,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
62  } else if (pde_type == PDE_enum::burgers_viscous) {
63  return std::make_shared< DGStrong<dim,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
64  } else if (pde_type == PDE_enum::burgers_rewienski) {
65  return std::make_shared< DGStrong<dim,dim,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
66  } else if (pde_type == PDE_enum::euler) {
67  return std::make_shared< DGStrong<dim,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
68  } else if (pde_type == PDE_enum::navier_stokes) {
69  return std::make_shared< DGStrong<dim,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
70  } else if ((pde_type == PDE_enum::physics_model) && (model_type == Model_enum::reynolds_averaged_navier_stokes) && (rans_model_type == RANSModel_enum::SA_negative)) {
71  return std::make_shared< DGStrong<dim,dim+3,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
72  }
73 #if PHILIP_DIM==3
74  else if ((pde_type == PDE_enum::physics_model) && (model_type == Model_enum::large_eddy_simulation)) {
75  return std::make_shared< DGStrong<dim,dim+2,real,MeshType> >(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input);
76  }
77 #endif
78  }
79  std::cout << "Can't create DGBase in create_discontinuous_galerkin(). Invalid PDE type: " << pde_type << std::endl;
80  return nullptr;
81 }
82 
83 template <int dim, typename real, typename MeshType>
84 std::shared_ptr< DGBase<dim,real,MeshType> >
87  const Parameters::AllParameters *const parameters_input,
88  const unsigned int degree,
89  const unsigned int max_degree_input,
90  const std::shared_ptr<Triangulation> triangulation_input)
91 {
92  return create_discontinuous_galerkin(parameters_input, degree, max_degree_input, degree+1, triangulation_input);
93 }
94 
95 template <int dim, typename real, typename MeshType>
96 std::shared_ptr< DGBase<dim,real,MeshType> >
99  const Parameters::AllParameters *const parameters_input,
100  const unsigned int degree,
101  const std::shared_ptr<Triangulation> triangulation_input)
102 {
103  return create_discontinuous_galerkin(parameters_input, degree, degree, triangulation_input);
104 }
105 
108 #if PHILIP_DIM!=1
110 #endif
111 
112 } // PHiLiP namespace
PartialDifferentialEquation pde_type
Store the PDE type to be solved.
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.
This class creates a new DGBase object.
Definition: dg_factory.hpp:16
static std::shared_ptr< DGBase< dim, 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:10
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.
ModelType model_type
Store the model type.
PhysicsModelParam physics_model_param
Contains parameters for Physics Model.