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.