[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
tests.cpp
1 #include <iostream>
2 
3 #include <deal.II/grid/grid_out.h>
4 
5 #include <deal.II/distributed/solution_transfer.h>
6 
7 #include <deal.II/grid/tria.h>
8 #include <deal.II/distributed/shared_tria.h>
9 #include <deal.II/distributed/tria.h>
10 
11 #include "tests.h"
12 #include "grid_study.h"
13 #include "grid_refinement_study.h"
14 #include "burgers_stability.h"
15 #include "diffusion_exact_adjoint.h"
16 #include "euler_gaussian_bump.h"
17 #include "euler_gaussian_bump_enthalpy_check.h"
18 #include "euler_gaussian_bump_adjoint.h"
19 #include "euler_cylinder.h"
20 #include "euler_cylinder_adjoint.h"
21 #include "euler_vortex.h"
22 #include "euler_entropy_waves.h"
23 #include "advection_explicit_periodic.h"
24 #include "inviscid_split_taylor_green_vortex.h"
25 #include "TGV_scaling.h"
26 #include "optimization_inverse_manufactured/optimization_inverse_manufactured.h"
27 #include "euler_bump_optimization.h"
28 #include "euler_naca0012_optimization.hpp"
29 #include "shock_1d.h"
30 #include "euler_naca0012.hpp"
31 #include "reduced_order.h"
32 #include "unsteady_reduced_order.h"
33 #include "convection_diffusion_explicit_periodic.h"
34 #include "dual_weighted_residual_mesh_adaptation.h"
35 #include "anisotropic_mesh_adaptation_cases.h"
36 #include "pod_adaptive_sampling_run.h"
37 #include "pod_adaptive_sampling_testing.h"
38 #include "taylor_green_vortex_energy_check.h"
39 #include "taylor_green_vortex_restart_check.h"
40 #include "general_refinement_study.h"
41 #include "time_refinement_study_reference.h"
42 #include "h_refinement_study_isentropic_vortex.h"
43 #include "rrk_numerical_entropy_conservation_check.h"
44 #include "euler_entropy_conserving_split_forms_check.h"
45 #include "homogeneous_isotropic_turbulence_initialization_check.h"
46 #include "khi_robustness.h"
47 #include "stability_fr_parameter_range.h"
48 #include "bound_preserving_limiter_tests.h"
49 #include "naca0012_unsteady_check_quick.h"
50 #include "turbulent_channel_flow_skin_friction_check.h"
51 #include "dipole_wall_collision_unsteady_quantity_check.h"
52 #include "turbulent_channel_flow_unsteady_quantity_check.h"
53 #include "build_NNLS_problem.h"
54 #include "hyper_reduction_comparison.h"
55 #include "hyper_adaptive_sampling_run.h"
56 #include "hyper_reduction_post_sampling.h"
57 #include "ROM_error_post_sampling.h"
58 #include "HROM_error_post_sampling.h"
59 #include "hyper_adaptive_sampling_new_error.h"
60 #include "halton_sampling_run.h"
61 #include "multispecies_vortex_advection.h"
62 
63 namespace PHiLiP {
64 namespace Tests {
65 
66 using AllParam = Parameters::AllParameters;
67 
68 TestsBase::TestsBase(Parameters::AllParameters const *const parameters_input)
69  : all_parameters(parameters_input)
70  , mpi_communicator(MPI_COMM_WORLD)
71  , mpi_rank(dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD))
72  , n_mpi(dealii::Utilities::MPI::n_mpi_processes(MPI_COMM_WORLD))
73  , pcout(std::cout, mpi_rank==0)
74 {}
75 
76 std::vector<int> TestsBase::get_number_1d_cells(const int n_grids) const
77 {
78  std::vector<int> n_1d_cells(n_grids);
80  n_1d_cells[0] = param.initial_grid_size;
81  for (int igrid=1;igrid<n_grids;++igrid) {
82  n_1d_cells[igrid] = static_cast<int>(n_1d_cells[igrid-1]*param.grid_progression) + param.grid_progression_add;
83  }
84  return n_1d_cells;
85 }
86 
87 std::string TestsBase::get_pde_string(const Parameters::AllParameters *const param) const
88 {
93 
94  const PDE_enum pde_type = param->pde_type;
95  std::string pde_string;
96  if (pde_type == PDE_enum::advection) {pde_string = "advection";}
97  if (pde_type == PDE_enum::advection_vector) {pde_string = "advection_vector";}
98  if (pde_type == PDE_enum::diffusion) {pde_string = "diffusion";}
99  if (pde_type == PDE_enum::convection_diffusion) {pde_string = "convection_diffusion";}
100  if (pde_type == PDE_enum::burgers_inviscid) {pde_string = "burgers_inviscid";}
101  if (pde_type == PDE_enum::burgers_viscous) {pde_string = "burgers_viscous";}
102  if (pde_type == PDE_enum::burgers_rewienski) {pde_string = "burgers_rewienski";}
103  if (pde_type == PDE_enum::euler) {pde_string = "euler";}
104  if (pde_type == PDE_enum::navier_stokes) {pde_string = "navier_stokes";}
105  if (pde_type == PDE_enum::physics_model) {
106  pde_string = "physics_model";
107  // add the model name + sub model name (if applicable)
108  const Model_enum model = param->model_type;
109  std::string model_string = "WARNING: invalid model";
110  if(model == Model_enum::large_eddy_simulation) {
111  // assign model string
112  model_string = "large_eddy_simulation";
113  // sub-grid scale (SGS)
114  const SGSModel_enum sgs_model = param->physics_model_param.SGS_model_type;
115  std::string sgs_model_string = "WARNING: invalid SGS model";
116  // assign SGS model string
117  if (sgs_model==SGSModel_enum::smagorinsky) sgs_model_string = "smagorinsky";
118  else if(sgs_model==SGSModel_enum::wall_adaptive_local_eddy_viscosity) sgs_model_string = "wall_adaptive_local_eddy_viscosity";
119  else if(sgs_model==SGSModel_enum::vreman) sgs_model_string = "vreman";
120  pde_string += std::string(" (Model: ") + model_string + std::string(", SGS Model: ") + sgs_model_string + std::string(")");
121  } else if(model == Model_enum::navier_stokes_model) {
122  model_string = "navier_stokes_model";
123  }
124  else if(model == Model_enum::reynolds_averaged_navier_stokes) {
125  // assign model string
126  model_string = "reynolds_averaged_navier_stokes";
127  // reynolds-averaged navier-stokes (RANS)
128  const RANSModel_enum rans_model = param->physics_model_param.RANS_model_type;
129  std::string rans_model_string = "WARNING: invalid RANS model";
130  // assign RANS model string
131  if (rans_model==RANSModel_enum::SA_negative) rans_model_string = "SA_negative";
132  pde_string += std::string(" (Model: ") + model_string + std::string(", RANS Model: ") + rans_model_string + std::string(")");
133  }
134  if(pde_string == "physics_model") pde_string += std::string(" (Model: ") + model_string + std::string(")");
135  }
136  return pde_string;
137 }
138 
140 {
142  const CNF_enum CNF_type = param->conv_num_flux_type;
143  std::string conv_num_flux_string;
144  if (CNF_type == CNF_enum::lax_friedrichs) {conv_num_flux_string = "lax_friedrichs";}
145  if (CNF_type == CNF_enum::roe) {conv_num_flux_string = "roe";}
146  if (CNF_type == CNF_enum::l2roe) {conv_num_flux_string = "l2roe";}
147  if (CNF_type == CNF_enum::central_flux) {conv_num_flux_string = "central_flux";}
148  if (CNF_type == CNF_enum::two_point_flux) {conv_num_flux_string = "two_point_flux";}
149  if (CNF_type == CNF_enum::two_point_flux_with_lax_friedrichs_dissipation) {
150  conv_num_flux_string = "two_point_flux_with_lax_friedrichs_dissipation";
151  } if (CNF_type == CNF_enum::two_point_flux_with_roe_dissipation) {
152  conv_num_flux_string = "two_point_flux_with_roe_dissipation";
153  } if (CNF_type == CNF_enum::two_point_flux_with_l2roe_dissipation) {
154  conv_num_flux_string = "two_point_flux_with_l2roe_dissipation";
155  }
156 
157  return conv_num_flux_string;
158 }
159 
161 {
163  const DNF_enum DNF_type = param->diss_num_flux_type;
164  std::string diss_num_flux_string;
165  if (DNF_type == DNF_enum::symm_internal_penalty) {diss_num_flux_string = "symm_internal_penalty";}
166  if (DNF_type == DNF_enum::bassi_rebay_2) {diss_num_flux_string = "bassi_rebay_2";}
167  return diss_num_flux_string;
168 }
169 
171 {
173  ManParam manu_grid_conv_param = param->manufactured_convergence_study_param;
175  const ManufacturedSolutionEnum MS_type = manu_grid_conv_param.manufactured_solution_param.manufactured_solution_type;
176  std::string manufactured_solution_string;
177  if (MS_type == ManufacturedSolutionEnum::sine_solution) {manufactured_solution_string = "sine_solution";}
178  if (MS_type == ManufacturedSolutionEnum::cosine_solution) {manufactured_solution_string = "cosine_solution";}
179  if (MS_type == ManufacturedSolutionEnum::additive_solution) {manufactured_solution_string = "additive_solution";}
180  if (MS_type == ManufacturedSolutionEnum::exp_solution) {manufactured_solution_string = "exp_solution";}
181  if (MS_type == ManufacturedSolutionEnum::poly_solution) {manufactured_solution_string = "poly_solution";}
182  if (MS_type == ManufacturedSolutionEnum::even_poly_solution) {manufactured_solution_string = "even_poly_solution";}
183  if (MS_type == ManufacturedSolutionEnum::atan_solution) {manufactured_solution_string = "atan_solution";}
184  if (MS_type == ManufacturedSolutionEnum::boundary_layer_solution) {manufactured_solution_string = "boundary_layer_solution";}
185  if (MS_type == ManufacturedSolutionEnum::s_shock_solution) {manufactured_solution_string = "s_shock_solution";}
186  if (MS_type == ManufacturedSolutionEnum::quadratic_solution) {manufactured_solution_string = "quadratic_solution";}
187  if (MS_type == ManufacturedSolutionEnum::example_solution) {manufactured_solution_string = "example_solution";}
188  if (MS_type == ManufacturedSolutionEnum::navah_solution_1) {manufactured_solution_string = "navah_solution_1";}
189  if (MS_type == ManufacturedSolutionEnum::navah_solution_2) {manufactured_solution_string = "navah_solution_2";}
190  if (MS_type == ManufacturedSolutionEnum::navah_solution_3) {manufactured_solution_string = "navah_solution_3";}
191  if (MS_type == ManufacturedSolutionEnum::navah_solution_4) {manufactured_solution_string = "navah_solution_4";}
192  if (MS_type == ManufacturedSolutionEnum::navah_solution_5) {manufactured_solution_string = "navah_solution_5";}
193  return manufactured_solution_string;
194 }
195 
196 //template<int dim, int nspecies, int nstate>
197 // void TestsBase::globally_refine_and_interpolate(DGBase<dim, nspecies, double> &dg) const
198 //{
199 // dealii::LinearAlgebra::distributed::Vector<double> old_solution(dg->solution);
200 // dealii::parallel::distributed::SolutionTransfer<dim,dealii::LinearAlgebra::distributed::Vector<double>, dealii::hp::DoFHandler<dim>> solution_transfer(dg->dof_handler);
201 // solution_transfer.prepare_for_coarsening_and_refinement(old_solution);
202 // grid.refine_global (1);
203 // dg->allocate_system ();
204 // solution_transfer.interpolate(old_solution, dg->solution);
205 // solution_transfer.clear();
206 //}
207 
208 template<int dim, int nspecies, int nstate, typename MeshType>
209 std::unique_ptr< TestsBase > TestsFactory<dim,nspecies,nstate,MeshType>
210 ::select_mesh(const AllParam *const parameters_input,
211  dealii::ParameterHandler &parameter_handler_input) {
212  using Mesh_enum = AllParam::MeshType;
213  Mesh_enum mesh_type = parameters_input->mesh_type;
214 
215  if(mesh_type == Mesh_enum::default_triangulation) {
216  #if PHILIP_DIM == 1
217  return TestsFactory<dim,nspecies,nstate,dealii::Triangulation<dim>>::select_test(parameters_input,parameter_handler_input);
218  #else
219  return TestsFactory<dim,nspecies,nstate,dealii::parallel::distributed::Triangulation<dim>>::select_test(parameters_input,parameter_handler_input);
220  #endif
221  } else if(mesh_type == Mesh_enum::triangulation) {
222  return TestsFactory<dim,nspecies,nstate,dealii::Triangulation<dim>>::select_test(parameters_input,parameter_handler_input);
223  } else if(mesh_type == Mesh_enum::parallel_shared_triangulation) {
224  return TestsFactory<dim,nspecies,nstate,dealii::parallel::shared::Triangulation<dim>>::select_test(parameters_input,parameter_handler_input);
225  } else if(mesh_type == Mesh_enum::parallel_distributed_triangulation) {
226  #if PHILIP_DIM == 1
227  std::cout << "dealii::parallel::distributed::Triangulation is unavailible in 1D." << std::endl;
228  #else
229  return TestsFactory<dim,nspecies,nstate,dealii::parallel::distributed::Triangulation<dim>>::select_test(parameters_input,parameter_handler_input);
230  #endif
231  } else {
232  std::cout << "Invalid mesh type." << std::endl;
233  }
234 
235  return nullptr;
236 }
237 
238 template<int dim, int nspecies, int nstate, typename MeshType>
239 std::unique_ptr< TestsBase > TestsFactory<dim,nspecies,nstate,MeshType>
240 ::select_test(const AllParam *const parameters_input,
241  dealii::ParameterHandler &parameter_handler_input) {
242  using Test_enum = AllParam::TestType;
243  const Test_enum test_type = parameters_input->test_type;
244 
245  // prevent warnings for when a create_FlowSolver is not being called (explicit and implicit cases)
246  if((test_type != Test_enum::finite_difference_sensitivity) &&
247  (test_type != Test_enum::taylor_green_vortex_energy_check) &&
248  (test_type != Test_enum::taylor_green_vortex_restart_check) &&
249  (test_type != Test_enum::dipole_wall_collision_quantity_check) &&
250  (test_type != Test_enum::turbulent_channel_flow_quantity_check)) {
251  (void) parameter_handler_input;
252  } else if (!((dim==3 && nstate==dim+2) || (dim==1 && nstate==1))) {
253  (void) parameter_handler_input;
254  }
255 
256  if(test_type == Test_enum::run_control) { // TO DO: rename to grid_study
257  if constexpr(nspecies==1) return std::make_unique<GridStudy<dim,nspecies,nstate>>(parameters_input);
258  } else if(test_type == Test_enum::grid_refinement_study) {
259  if constexpr(nspecies==1) return std::make_unique<GridRefinementStudy<dim,nspecies,nstate,MeshType>>(parameters_input);
260  } else if(test_type == Test_enum::stability_fr_parameter_range) {
261  if constexpr (((dim==1 && nstate==1 ) || (dim==2 && nstate==1 )) && nspecies==1)
262  return std::make_unique<StabilityFRParametersRange<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
263  } else if(test_type == Test_enum::burgers_energy_stability) {
264  if constexpr (dim==1 && nstate==1 && nspecies==1) return std::make_unique<BurgersEnergyStability<dim,nspecies,nstate>>(parameters_input);
265  } else if(test_type == Test_enum::diffusion_exact_adjoint) {
266  if constexpr (dim>=1 && nstate==1 && nspecies==1) return std::make_unique<DiffusionExactAdjoint<dim,nspecies,nstate>>(parameters_input);
267  } else if (test_type == Test_enum::advection_periodicity){
268  if constexpr (nstate == 1 && nspecies==1) return std::make_unique<AdvectionPeriodic<dim,nspecies,nstate>> (parameters_input);
269  } else if (test_type == Test_enum::convection_diffusion_periodicity){
270  if constexpr (nstate == 1 && nspecies==1) return std::make_unique<ConvectionDiffusionPeriodic<dim,nspecies,nstate>> (parameters_input);
271  } else if(test_type == Test_enum::euler_gaussian_bump) {
272  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<EulerGaussianBump<dim,nspecies,nstate>>(parameters_input,parameter_handler_input);
273  } else if(test_type == Test_enum::euler_gaussian_bump_enthalpy) {
274  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<EulerGaussianBumpEnthalpyCheck<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
275  //} else if(test_type == Test_enum::euler_gaussian_bump_adjoint){
276  // if constexpr (dim==2 && nstate==dim+2) return std::make_unique<EulerGaussianBumpAdjoint<dim,nspecies,nstate>>(parameters_input);
277  } else if(test_type == Test_enum::euler_cylinder) {
278  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<EulerCylinder<dim,nspecies,nstate>>(parameters_input);
279  } else if(test_type == Test_enum::euler_cylinder_adjoint) {
280  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<EulerCylinderAdjoint<dim,nspecies,nstate>>(parameters_input);
281  } else if(test_type == Test_enum::euler_vortex) {
282  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<EulerVortex<dim,nspecies,nstate>>(parameters_input);
283  } else if(test_type == Test_enum::euler_entropy_waves) {
284  if constexpr (dim>=2 && nstate==PHILIP_DIM+2 && nspecies==1) return std::make_unique<EulerEntropyWaves<dim,nspecies,nstate>>(parameters_input);
285  } else if(test_type == Test_enum::euler_split_taylor_green) {
286  if constexpr (dim==3 && nstate == dim+2 && nspecies==1) return std::make_unique<InviscidTaylorGreen<dim,nspecies,nstate>>(parameters_input);
287  } else if(test_type == Test_enum::taylor_green_scaling) {
288  if constexpr (dim==3 && nstate == dim+2 && nspecies==1) return std::make_unique<InviscidTaylorGreenScaling<dim,nspecies,nstate>>(parameters_input);
289  } else if(test_type == Test_enum::optimization_inverse_manufactured) {
290  if constexpr(nspecies==1) return std::make_unique<OptimizationInverseManufactured<dim,nspecies,nstate>>(parameters_input);
291  } else if(test_type == Test_enum::euler_bump_optimization) {
292  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<EulerBumpOptimization<dim,nspecies,nstate>>(parameters_input);
293  } else if(test_type == Test_enum::euler_naca_optimization) {
294  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<EulerNACAOptimization<dim,nspecies,nstate>>(parameters_input);
295  } else if(test_type == Test_enum::shock_1d) {
296  if constexpr (dim==1 && nstate==1 && nspecies==1) return std::make_unique<Shock1D<dim,nspecies,nstate>>(parameters_input);
297  } else if(test_type == Test_enum::reduced_order) {
298  if constexpr (((dim==2 && nstate==dim+2) || (dim==1 && nstate==1)) && nspecies==1) return std::make_unique<ReducedOrder<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
299  } else if(test_type == Test_enum::unsteady_reduced_order) {
300  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<UnsteadyReducedOrder<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
301  } else if(test_type == Test_enum::POD_adaptive_sampling_run) {
302  if constexpr (((dim==2 && nstate==dim+2) || (dim==1 && nstate==1)) && nspecies==1) return std::make_unique<AdaptiveSamplingRun<dim,nspecies,nstate>>(parameters_input,parameter_handler_input);
303  } else if(test_type == Test_enum::adaptive_sampling_testing) {
304  if constexpr (((dim==2 && nstate==dim+2) || (dim==1 && nstate==1)) && nspecies==1) return std::make_unique<AdaptiveSamplingTesting<dim,nspecies,nstate>>(parameters_input,parameter_handler_input);
305  } else if(test_type == Test_enum::euler_naca0012) {
306  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<EulerNACA0012<dim,nspecies,nstate>>(parameters_input,parameter_handler_input);
307  } else if(test_type == Test_enum::dual_weighted_residual_mesh_adaptation) {
308  if constexpr (dim==2 && nstate==1 && nspecies==1) return std::make_unique<DualWeightedResidualMeshAdaptation<dim, nspecies, nstate>>(parameters_input,parameter_handler_input);
309  } else if(test_type == Test_enum::anisotropic_mesh_adaptation) {
310  if constexpr (((dim==2 && nstate==1) || (dim==2 && nstate==dim+2)) && nspecies==1) return std::make_unique<AnisotropicMeshAdaptationCases<dim, nspecies, nstate>>(parameters_input,parameter_handler_input);
311  } else if(test_type == Test_enum::taylor_green_vortex_energy_check) {
312  if constexpr (dim==3 && nstate==dim+2 && nspecies==1) return std::make_unique<TaylorGreenVortexEnergyCheck<dim,nspecies,nstate>>(parameters_input,parameter_handler_input);
313  } else if(test_type == Test_enum::taylor_green_vortex_restart_check) {
314  if constexpr (dim==3 && nstate==dim+2 && nspecies==1) return std::make_unique<TaylorGreenVortexRestartCheck<dim,nspecies,nstate>>(parameters_input,parameter_handler_input);
315  } else if(test_type == Test_enum::homogeneous_isotropic_turbulence_initialization_check){
316  if constexpr (dim==3 && nstate==dim+2 && nspecies==1) return std::make_unique<HomogeneousIsotropicTurbulenceInitializationCheck<dim,nspecies,nstate>>(parameters_input,parameter_handler_input);
317  } else if(test_type == Test_enum::turbulent_channel_flow_skin_friction_check){
318  if constexpr (dim==3 && nstate==dim+2 && nspecies==1) return std::make_unique<TurbulentChannelFlowSkinFrictionCheck<dim,nspecies,nstate>>(parameters_input,parameter_handler_input);
319  } else if(test_type == Test_enum::dipole_wall_collision_quantity_check) {
320  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<DipoleWallCollisionUnsteadyQuantityCheck<dim,nspecies,nstate>>(parameters_input,parameter_handler_input);
321  } else if(test_type == Test_enum::turbulent_channel_flow_quantity_check) {
322  if constexpr (dim==3 && nstate==dim+2 && nspecies==1) return std::make_unique<TurbulentChannelFlowUnsteadyQuantityCheck<dim,nspecies,nstate>>(parameters_input,parameter_handler_input);
323  } else if(test_type == Test_enum::time_refinement_study) {
324  if constexpr (dim==1 && nstate==1 && nspecies==1) return std::make_unique<GeneralRefinementStudy<dim, nspecies, nstate>>(parameters_input, parameter_handler_input,
326  } else if(test_type == Test_enum::h_refinement_study_isentropic_vortex) {
327  if constexpr (dim+2==nstate && dim!=1 && nspecies==1) return std::make_unique<HRefinementStudyIsentropicVortex<dim, nspecies, nstate>>(parameters_input, parameter_handler_input);
328  } else if(test_type == Test_enum::time_refinement_study_reference) {
329  if constexpr (dim==1 && nstate==1 && nspecies==1) return std::make_unique<TimeRefinementStudyReference<dim, nspecies, nstate>>(parameters_input, parameter_handler_input);
330  } else if(test_type == Test_enum::rrk_numerical_entropy_conservation_check) {
331  if constexpr (((dim==1 && nstate==1) || (dim==3 && nstate==dim+2)) && nspecies==1) return std::make_unique<RRKNumericalEntropyConservationCheck<dim, nspecies, nstate>>(parameters_input, parameter_handler_input);
332  } else if(test_type == Test_enum::euler_entropy_conserving_split_forms_check) {
333  if constexpr (dim==3 && nstate==dim+2 && nspecies==1) return std::make_unique<EulerSplitEntropyCheck<dim, nspecies, nstate>>(parameters_input, parameter_handler_input);
334  } else if(test_type == Test_enum::khi_robustness) {
335  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<KHIRobustness<dim, nspecies, nstate>>(parameters_input, parameter_handler_input);
336  } else if(test_type == Test_enum::build_NNLS_problem) {
337  if constexpr (dim==1 && nstate==1 && nspecies==1) return std::make_unique<BuildNNLSProblem<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
338  } else if(test_type == Test_enum::hyper_reduction_comparison) {
339  if constexpr (dim==1 && nstate==1 && nspecies==1) return std::make_unique<HyperReductionComparison<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
340  } else if(test_type == Test_enum::hyper_adaptive_sampling_run) {
341  if constexpr (((dim==2 && nstate==dim+2) || (dim==1 && nstate==1)) && nspecies==1) return std::make_unique<HyperAdaptiveSamplingRun<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
342  } else if(test_type == Test_enum::hyper_reduction_post_sampling) {
343  if constexpr (((dim==2 && nstate==dim+2) || (dim==1 && nstate==1)) && nspecies==1) return std::make_unique<HyperReductionPostSampling<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
344  } else if(test_type == Test_enum::ROM_error_post_sampling) {
345  if constexpr (((dim==2 && nstate==dim+2) || (dim==1 && nstate==1)) && nspecies==1) return std::make_unique<ROMErrorPostSampling<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
346  } else if(test_type == Test_enum::HROM_error_post_sampling) {
347  if constexpr (((dim==2 && nstate==dim+2) || (dim==1 && nstate==1)) && nspecies==1) return std::make_unique<HROMErrorPostSampling<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
348  } else if(test_type == Test_enum::hyper_adaptive_sampling_new_error) {
349  if constexpr (((dim==2 && nstate==dim+2) || (dim==1 && nstate==1)) && nspecies==1) return std::make_unique<HyperAdaptiveSamplingNewError<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
350  } else if(test_type == Test_enum::halton_sampling_run) {
351  if constexpr (((dim==2 && nstate==dim+2) || (dim==1 && nstate==1)) && nspecies==1) return std::make_unique<HaltonSamplingRun<dim,nspecies,nstate>>(parameters_input, parameter_handler_input);
352  } else if (test_type == Test_enum::advection_limiter) {
353  if constexpr (nstate == 1 && dim < 3 && nspecies==1) return std::make_unique<BoundPreservingLimiterTests<dim, nspecies, nstate>>(parameters_input, parameter_handler_input);
354  } else if (test_type == Test_enum::burgers_limiter) {
355  if constexpr (nstate == dim && dim < 3 && nspecies==1) return std::make_unique<BoundPreservingLimiterTests<dim, nspecies, nstate>>(parameters_input, parameter_handler_input);
356  } else if(test_type == Test_enum::low_density) {
357  if constexpr (dim<3 && nstate==dim+2 && nspecies==1) return std::make_unique<BoundPreservingLimiterTests<dim, nspecies, nstate>>(parameters_input, parameter_handler_input);
358  } else if(test_type == Test_enum::naca0012_unsteady_check_quick){
359  if constexpr (dim==2 && nstate==dim+2 && nspecies==1) return std::make_unique<NACA0012UnsteadyCheckQuick<dim, nspecies, nstate>>(parameters_input, parameter_handler_input);
360  } else if(test_type == Test_enum::multi_species_vortex_advection){
361  if constexpr ((nspecies==2 || nspecies==3) && nstate==dim+nspecies+1)
362  return std::make_unique<MultispeciesVortexAdvection<dim, nspecies, nstate>>(parameters_input, parameter_handler_input);
363  } else if(test_type == Test_enum::real_gas_split_taylor_green) {
364  if constexpr (dim==3 && nstate == dim+nspecies+1) return std::make_unique<InviscidTaylorGreen<dim,nspecies,nstate>>(parameters_input);
365  } else {
366  std::cout << "Invalid test. You probably forgot to add it to the list of tests in tests.cpp" << std::endl;
367  std::abort();
368  }
369 
370  return nullptr;
371 }
372 
373 template<int dim, int nspecies, int nstate, typename MeshType>
374 std::unique_ptr< TestsBase > TestsFactory<dim,nspecies,nstate,MeshType>
375 ::create_test(AllParam const *const parameters_input,
376  dealii::ParameterHandler &parameter_handler_input)
377 {
378  // Recursive templating required because template parameters must be compile time constants
379  // As a results, this recursive template initializes all possible dimensions with all possible nstate
380  // without having 15 different if-else statements
381  if(dim == parameters_input->dimension)
382  {
383  // This template parameters dim and nstate match the runtime parameters
384  // then create the selected test with template parameters dim and nstate
385  // Otherwise, keep decreasing nstate and dim until it matches
386  if(nspecies > 1)
387  return TestsFactory<dim,nspecies,dim+nspecies+1>::select_mesh(parameters_input,parameter_handler_input);
388  else if(nstate == parameters_input->nstate)
389  return TestsFactory<dim,nspecies,nstate>::select_mesh(parameters_input,parameter_handler_input);
390  else if constexpr (nstate > 1)
391  return TestsFactory<dim,nspecies,nstate-1>::create_test(parameters_input,parameter_handler_input);
392  else
393  return nullptr;
394  }
395  else if constexpr (dim > 1)
396  {
397  //return TestsFactory<dim-1,nstate>::create_test(parameters_input);
398  return nullptr;
399  }
400  else
401  {
402  return nullptr;
403  }
404 }
405 
408 #if PHILIP_DIM!=1
410 #endif
411 } // Tests namespace
412 } // PHiLiP namespace
static std::unique_ptr< TestsBase > select_mesh(const Parameters::AllParameters *const parameters_input, dealii::ParameterHandler &parameter_handler_input)
selects the mesh type to be used in the test
Definition: tests.cpp:210
ManufacturedSolutionType
Selects the manufactured solution to be used if use_manufactured_source_term=true.
PartialDifferentialEquation pde_type
Store the PDE type to be solved.
Advection time refinement study.
static std::unique_ptr< TestsBase > select_test(const Parameters::AllParameters *const parameters_input, dealii::ParameterHandler &parameter_handler_input)
Selects the actual test such as grid convergence, numerical flux conversation, etc.
Definition: tests.cpp:240
TestType
Possible integration tests to run.
Parameters related to the manufactured convergence study.
PartialDifferentialEquation
Possible Partial Differential Equations to solve.
Test factory, that will create the correct test with the right template parameters.
Definition: tests.h:71
Files for the baseline physics.
Definition: ADTypes.hpp:10
TestsBase()=delete
Constructor. Deleted the default constructor since it should not be used.
ModelType
Types of models available.
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.
SubGridScaleModel SGS_model_type
Store the SubGridScale (SGS) model type.
ManufacturedConvergenceStudyParam manufactured_convergence_study_param
Contains parameters for manufactured convergence study.
const Parameters::AllParameters *const all_parameters
Pointer to all parameters.
Definition: tests.h:20
DissipativeNumericalFlux
Possible dissipative numerical flux types.
TestType test_type
Store selected TestType from the input file.
std::string get_conv_num_flux_string(const Parameters::AllParameters *const param) const
Returns a string describing which convective numerical flux is being used.
Definition: tests.cpp:139
ReynoldsAveragedNavierStokesModel
Types of Reynolds-averaged Navier-Stokes (RANS) models that can be used.
ConvectiveNumericalFlux
Possible convective numerical flux types.
MeshType
Mesh type to be used in defining the triangulation.
std::string get_pde_string(const Parameters::AllParameters *const param) const
Returns a string describing which PDE is being used.
Definition: tests.cpp:87
ReynoldsAveragedNavierStokesModel RANS_model_type
Store the Reynolds-averaged Navier-Stokes (RANS) model type.
ConvectiveNumericalFlux conv_num_flux_type
Store convective flux type.
std::string get_diss_num_flux_string(const Parameters::AllParameters *const param) const
Returns a string describing which dissipative numerical flux is being used.
Definition: tests.cpp:160
int nstate
Number of state variables. Will depend on PDE.
static std::unique_ptr< TestsBase > create_test(const Parameters::AllParameters *const parameters_input, dealii::ParameterHandler &parameter_handler_input)
Recursive factory that will create TestBase<int dim, int nspecies, int nstate>
Definition: tests.cpp:375
std::string get_manufactured_solution_string(const Parameters::AllParameters *const param) const
Returns a string describing which manufactured solution is being used.
Definition: tests.cpp:170
DissipativeNumericalFlux diss_num_flux_type
Store diffusive flux type.
SubGridScaleModel
Types of sub-grid scale (SGS) models that can be used.
double grid_progression
Multiplies the last grid size by this amount.
ModelType model_type
Store the model type.
std::vector< int > get_number_1d_cells(const int ngrids) const
Evaluates the number of cells to generate the grids for 1D grid based on input file.
Definition: tests.cpp:76
PhysicsModelParam physics_model_param
Contains parameters for Physics Model.
MeshType mesh_type
Store selected MeshType from the input file.