1 #include "flow_solver_factory.h" 6 #include "flow_solver_cases/periodic_turbulence.h" 7 #include "flow_solver_cases/periodic_1D_unsteady.h" 8 #include "flow_solver_cases/periodic_entropy_tests.h" 9 #include "flow_solver_cases/1D_burgers_rewienski_snapshot.h" 10 #include "flow_solver_cases/1d_burgers_viscous_snapshot.h" 11 #include "flow_solver_cases/naca0012.h" 12 #include "flow_solver_cases/gaussian_bump.h" 13 #include "flow_solver_cases/non_periodic_cube_flow.h" 14 #include "flow_solver_cases/positivity_preserving_tests.h" 18 namespace FlowSolver {
23 template <
int dim,
int nstate>
24 std::unique_ptr < FlowSolver<dim,nstate> >
27 const dealii::ParameterHandler ¶meter_handler_input)
32 if (flow_type == FlowCaseEnum::taylor_green_vortex){
33 if constexpr (dim==3 && nstate==dim+2){
34 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PeriodicTurbulence<dim,nstate>>(parameters_input);
35 return std::make_unique<FlowSolver<dim,nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
37 }
else if (flow_type == FlowCaseEnum::decaying_homogeneous_isotropic_turbulence){
38 if constexpr (dim==3 && nstate==dim+2){
39 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PeriodicTurbulence<dim,nstate>>(parameters_input);
40 return std::make_unique<FlowSolver<dim,nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
42 }
else if (flow_type == FlowCaseEnum::burgers_viscous_snapshot){
43 if constexpr (dim==1 && nstate==dim) {
44 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<BurgersViscousSnapshot<dim,nstate>>(parameters_input);
45 return std::make_unique<FlowSolver<dim,nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
47 }
else if (flow_type == FlowCaseEnum::burgers_rewienski_snapshot){
48 if constexpr (dim==1 && nstate==dim){
49 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<BurgersRewienskiSnapshot<dim,nstate>>(parameters_input);
50 return std::make_unique<FlowSolver<dim,nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
52 }
else if (flow_type == FlowCaseEnum::naca0012){
53 if constexpr (dim==2 && nstate==dim+2){
54 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<NACA0012<dim,nstate>>(parameters_input);
55 return std::make_unique<FlowSolver<dim,nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
57 }
else if (flow_type == FlowCaseEnum::periodic_1D_unsteady){
58 if constexpr (dim==1 && nstate==dim){
59 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<Periodic1DUnsteady<dim,nstate>>(parameters_input);
60 return std::make_unique<FlowSolver<dim,nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
62 }
else if (flow_type == FlowCaseEnum::isentropic_vortex){
63 if constexpr (nstate==dim+2 && dim!=1){
64 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PeriodicEntropyTests<dim,nstate>>(parameters_input);
65 return std::make_unique<FlowSolver<dim,nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
67 }
else if (flow_type == FlowCaseEnum::gaussian_bump){
68 if constexpr (dim>1 && nstate==dim+2){
69 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<GaussianBump<dim, nstate>>(parameters_input);
70 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
72 }
else if (flow_type == FlowCaseEnum::kelvin_helmholtz_instability){
73 if constexpr (dim==2 && nstate==dim+2){
74 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PeriodicEntropyTests<dim,nstate>>(parameters_input);
75 return std::make_unique<FlowSolver<dim,nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
77 }
else if (flow_type == FlowCaseEnum::non_periodic_cube_flow){
78 if constexpr (dim==2 && nstate==1){
79 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<NonPeriodicCubeFlow<dim, nstate>>(parameters_input);
80 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
82 }
else if (flow_type == FlowCaseEnum::sod_shock_tube){
83 if constexpr (dim==1 && nstate==dim+2){
84 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PositivityPreservingTests<dim, nstate>>(parameters_input);
85 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
87 }
else if (flow_type == FlowCaseEnum::leblanc_shock_tube){
88 if constexpr (dim==1 && nstate==dim+2){
89 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PositivityPreservingTests<dim, nstate>>(parameters_input);
90 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
92 }
else if (flow_type == FlowCaseEnum::shu_osher_problem) {
93 if constexpr (dim==1 && nstate==dim + 2) {
94 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PositivityPreservingTests<dim, nstate>>(parameters_input);
95 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
97 }
else if (flow_type == FlowCaseEnum::double_mach_reflection) {
98 if constexpr (dim==2 && nstate==dim + 2) {
99 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PositivityPreservingTests<dim, nstate>>(parameters_input);
100 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
102 }
else if (flow_type == FlowCaseEnum::shock_diffraction) {
103 if constexpr (dim==2 && nstate==dim + 2) {
104 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PositivityPreservingTests<dim, nstate>>(parameters_input);
105 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
107 }
else if (flow_type == FlowCaseEnum::astrophysical_jet) {
108 if constexpr (dim==2 && nstate==dim + 2) {
109 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PositivityPreservingTests<dim, nstate>>(parameters_input);
110 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
112 }
else if (flow_type == FlowCaseEnum::strong_vortex_shock_wave) {
113 if constexpr (dim==2 && nstate==dim + 2) {
114 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PositivityPreservingTests<dim, nstate>>(parameters_input);
115 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
117 }
else if (flow_type == FlowCaseEnum::advection_limiter) {
118 if constexpr (dim<3 && nstate==1) {
119 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PeriodicCubeFlow<dim, nstate>>(parameters_input);
120 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
122 }
else if (flow_type == FlowCaseEnum::burgers_limiter) {
123 if constexpr (dim<3 && nstate==dim) {
124 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PeriodicCubeFlow<dim, nstate>>(parameters_input);
125 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
127 }
else if (flow_type == FlowCaseEnum::low_density) {
128 if constexpr (dim<3 && nstate==dim + 2) {
129 std::shared_ptr<FlowSolverCaseBase<dim, nstate>> flow_solver_case = std::make_shared<PeriodicCubeFlow<dim, nstate>>(parameters_input);
130 return std::make_unique<FlowSolver<dim, nstate>>(parameters_input, flow_solver_case, parameter_handler_input);
133 std::cout <<
"Invalid flow case. You probably forgot to add it to the list of flow cases in flow_solver_factory.cpp" << std::endl;
139 template<
int dim,
int nstate>
142 const dealii::ParameterHandler ¶meter_handler_input)
152 if(nstate == parameters_input->
nstate)
154 else if constexpr (nstate > 1)
159 else if constexpr (dim > 1)
FlowCaseType
Selects the flow case to be simulated.
FlowCaseType flow_case_type
Selected FlowCaseType from the input file.
FlowSolverParam flow_solver_param
Contains the parameters for simulation cases (flow solver test)
Files for the baseline physics.
static std::unique_ptr< FlowSolverBase > create_flow_solver(const Parameters::AllParameters *const parameters_input, const dealii::ParameterHandler ¶meter_handler_input)
Recursive factory that will create FlowSolverBase (i.e. FlowSolver<dim,nstate>)
unsigned int dimension
Number of dimensions. Note that it has to match the executable PHiLiP_xD.
Main parameter class that contains the various other sub-parameter classes.
static std::unique_ptr< FlowSolver< dim, nstate > > select_flow_case(const Parameters::AllParameters *const parameters_input, const dealii::ParameterHandler ¶meter_handler_input)
Factory to return the correct flow solver given input file.
int nstate
Number of state variables. Will depend on PDE.
Create specified flow solver as FlowSolver object.