1 #include <boost/preprocessor/seq/for_each.hpp> 3 #include "parameters/all_parameters.h" 4 #include "parameters/parameters_manufactured_solution.h" 6 #include <deal.II/base/tensor.h> 10 #include "physics_factory.h" 11 #include "manufactured_solution.h" 13 #include "convection_diffusion.h" 15 #include "burgers_rewienski.h" 18 #include "navier_stokes.h" 19 #include "physics_model.h" 25 template <
int dim,
int nspecies,
int nstate,
typename real>
26 std::shared_ptr < PhysicsBase<dim,nspecies,nstate,real> >
32 PDE_enum pde_type = parameters_input->
pde_type;
34 return create_Physics(parameters_input, pde_type, model_input);
37 template <
int dim,
int nspecies,
int nstate,
typename real>
38 std::shared_ptr < PhysicsBase<dim,nspecies,nstate,real> >
46 if constexpr(nspecies==1) {
48 std::shared_ptr< ManufacturedSolutionFunction<dim,nspecies,real> > manufactured_solution_function
56 if (pde_type == PDE_enum::advection || pde_type == PDE_enum::advection_vector) {
57 if constexpr (nstate<=2)
58 return std::make_shared < ConvectionDiffusion<dim,nspecies,nstate,real> >(
61 diffusion_tensor, advection_vector, diffusion_coefficient,
62 manufactured_solution_function);
63 }
else if (pde_type == PDE_enum::diffusion) {
64 if constexpr (nstate==1)
65 return std::make_shared < ConvectionDiffusion<dim,nspecies,nstate,real> >(
68 diffusion_tensor, advection_vector, diffusion_coefficient,
69 manufactured_solution_function,
71 }
else if (pde_type == PDE_enum::convection_diffusion) {
72 if constexpr (nstate==1)
73 return std::make_shared < ConvectionDiffusion<dim,nspecies,nstate,real> >(
76 diffusion_tensor, advection_vector, diffusion_coefficient,
77 manufactured_solution_function,
79 }
else if (pde_type == PDE_enum::burgers_inviscid) {
80 if constexpr (nstate==dim)
81 return std::make_shared < Burgers<dim,nspecies,nstate,real> >(
86 manufactured_solution_function,
87 parameters_input->test_type);
88 }
else if (pde_type == PDE_enum::burgers_viscous) {
89 if constexpr (nstate==dim)
90 return std::make_shared < Burgers<dim,nspecies,nstate,real> >(
95 manufactured_solution_function);
96 }
else if (pde_type == PDE_enum::burgers_rewienski) {
97 if constexpr (nstate==dim)
98 return std::make_shared < BurgersRewienski<dim,nspecies,nstate,real> >(
101 parameters_input->burgers_param.rewienski_b,
102 parameters_input->burgers_param.rewienski_manufactured_solution,
106 manufactured_solution_function);
107 }
else if (pde_type == PDE_enum::euler) {
108 if constexpr (nstate==dim+2) {
109 return std::make_shared < Euler<dim,nspecies,nstate,real> > (
112 parameters_input->euler_param.gamma_gas,
113 parameters_input->euler_param.mach_inf,
114 parameters_input->euler_param.angle_of_attack,
115 parameters_input->euler_param.side_slip_angle,
116 manufactured_solution_function,
117 parameters_input->two_point_num_flux_type);
119 }
else if (pde_type == PDE_enum::mhd) {
120 if constexpr (nstate == 8)
121 return std::make_shared < MHD<dim,nspecies,nstate,real> > (
125 manufactured_solution_function);
126 }
else if (pde_type == PDE_enum::navier_stokes) {
127 if constexpr (nstate==dim+2) {
128 return std::make_shared < NavierStokes<dim,nspecies,nstate,real> > (
131 parameters_input->euler_param.gamma_gas,
132 parameters_input->euler_param.mach_inf,
133 parameters_input->euler_param.angle_of_attack,
134 parameters_input->euler_param.side_slip_angle,
135 parameters_input->navier_stokes_param.prandtl_number,
136 parameters_input->navier_stokes_param.reynolds_number_inf,
137 parameters_input->navier_stokes_param.use_constant_viscosity,
138 parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
139 parameters_input->navier_stokes_param.temperature_inf,
140 parameters_input->navier_stokes_param.nondimensionalized_isothermal_wall_temperature,
141 parameters_input->navier_stokes_param.thermal_boundary_condition_type,
142 manufactured_solution_function,
143 parameters_input->two_point_num_flux_type);
145 }
else if (pde_type == PDE_enum::navier_stokes_channel_flow_constant_source_term) {
146 if constexpr (nstate==dim+2) {
148 const double half_channel_height = domain_length_y_direction/2.0;
149 return std::make_shared < NavierStokes_ChannelFlowConstantSourceTerm<dim,nspecies,nstate,real> > (
152 parameters_input->euler_param.gamma_gas,
153 parameters_input->euler_param.mach_inf,
154 parameters_input->euler_param.angle_of_attack,
155 parameters_input->euler_param.side_slip_angle,
156 parameters_input->navier_stokes_param.prandtl_number,
157 parameters_input->navier_stokes_param.reynolds_number_inf,
158 parameters_input->navier_stokes_param.use_constant_viscosity,
159 parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
160 parameters_input->flow_solver_param.turbulent_channel_friction_velocity_reynolds_number,
162 parameters_input->navier_stokes_param.temperature_inf,
163 parameters_input->navier_stokes_param.nondimensionalized_isothermal_wall_temperature,
164 parameters_input->navier_stokes_param.thermal_boundary_condition_type,
165 manufactured_solution_function,
166 parameters_input->two_point_num_flux_type);
168 }
else if (pde_type == PDE_enum::navier_stokes_channel_flow_constant_source_term_wall_model) {
169 if constexpr (nstate==dim+2) {
171 std::cout <<
"Invalid flow case, can only create NavierStokes_ChannelFlowConstantSourceTerm_WallModel for ChannelFlow." << std::endl;
175 const double half_channel_height = domain_length_y_direction/2.0;
177 const double uniform_spacing_y_direction = domain_length_y_direction/double(number_of_cells_y_direction);
178 return std::make_shared < NavierStokes_ChannelFlowConstantSourceTerm_WallModel<dim,nspecies,nstate,real> > (
181 parameters_input->euler_param.gamma_gas,
182 parameters_input->euler_param.mach_inf,
183 parameters_input->euler_param.angle_of_attack,
184 parameters_input->euler_param.side_slip_angle,
185 parameters_input->navier_stokes_param.prandtl_number,
186 parameters_input->navier_stokes_param.reynolds_number_inf,
187 parameters_input->navier_stokes_param.use_constant_viscosity,
188 parameters_input->navier_stokes_param.nondimensionalized_constant_viscosity,
189 parameters_input->flow_solver_param.turbulent_channel_friction_velocity_reynolds_number,
191 uniform_spacing_y_direction,
192 parameters_input->navier_stokes_param.temperature_inf,
193 parameters_input->navier_stokes_param.nondimensionalized_isothermal_wall_temperature,
194 parameters_input->navier_stokes_param.thermal_boundary_condition_type,
195 manufactured_solution_function,
196 parameters_input->two_point_num_flux_type);
198 }
else if (pde_type == PDE_enum::physics_model || pde_type == PDE_enum::physics_model_filtered) {
199 if constexpr (nstate>=dim+2) {
200 return create_Physics_Model(parameters_input,
201 manufactured_solution_function,
206 (void) diffusion_tensor;
207 (void) advection_vector;
208 (void) diffusion_coefficient;
209 }
else if (pde_type == PDE_enum::real_gas) {
210 if constexpr (nstate==dim+nspecies+1) {
211 return std::make_shared < RealGas<dim,nspecies,nstate,real> > (parameters_input);
214 std::cout <<
"Can't create PhysicsBase, invalid PDE type: " << pde_type << std::endl;
215 assert(0==1 &&
"Can't create PhysicsBase, invalid PDE type");
219 template <
int dim,
int nspecies,
int nstate,
typename real>
220 std::shared_ptr < PhysicsBase<dim,nspecies,nstate,real> >
227 const PDE_enum pde_type = parameters_input->
pde_type;
230 const Model_enum model_type = parameters_input->
model_type;
243 PDE_enum baseline_physics_type;
246 bool has_nonzero_diffusion;
249 bool has_nonzero_physical_source;
254 if (model_type==Model_enum::large_eddy_simulation || model_type==Model_enum::navier_stokes_model) {
255 has_nonzero_diffusion =
true;
256 has_nonzero_physical_source =
false;
257 if(flow_case_type==FlowCase_enum::channel_flow) {
258 has_nonzero_physical_source =
true;
260 if constexpr ((nstate==dim+2) && (dim==3) && nspecies == 1) {
263 constexpr
int nstate_baseline_physics = dim+2;
266 baseline_physics_type = PDE_enum::euler;
267 if(model_type==Model_enum::navier_stokes_model) has_nonzero_diffusion =
false;
270 baseline_physics_type = PDE_enum::navier_stokes;
274 if (pde_type == PDE_enum::physics_model) {
275 return std::make_shared < PhysicsModel<dim,nspecies,nstate,real,nstate_baseline_physics> > (
277 baseline_physics_type,
279 manufactured_solution_function,
280 has_nonzero_diffusion,
281 has_nonzero_physical_source);
282 }
else if(pde_type == PDE_enum::physics_model_filtered) {
283 return std::make_shared < PhysicsModelFiltered<dim,nspecies,nstate,real,nstate_baseline_physics> > (
285 baseline_physics_type,
287 manufactured_solution_function,
288 has_nonzero_diffusion,
289 has_nonzero_physical_source);
294 (void) baseline_physics_type;
295 (void) has_nonzero_diffusion;
296 (void) has_nonzero_physical_source;
303 else if (model_type == Model_enum::reynolds_averaged_navier_stokes) {
304 has_nonzero_diffusion =
true;
305 has_nonzero_physical_source =
true;
306 if (rans_model_type == RANSModel_enum::SA_negative)
308 if constexpr (nstate==dim+3 && nspecies==1) {
311 constexpr
int nstate_baseline_physics = dim+2;
314 baseline_physics_type = PDE_enum::euler;
317 baseline_physics_type = PDE_enum::navier_stokes;
321 return std::make_shared < PhysicsModel<dim,nspecies,nstate,real,nstate_baseline_physics> > (
323 baseline_physics_type,
325 manufactured_solution_function,
326 has_nonzero_diffusion,
327 has_nonzero_physical_source);
331 (void) baseline_physics_type;
332 (void) has_nonzero_physical_source;
333 std::cout <<
"Can't create RANS + negative SA model for nstate!=(dim+3). " << std::endl;
340 (void) baseline_physics_type;
341 (void) has_nonzero_diffusion;
342 (void) has_nonzero_physical_source;
344 std::cout <<
"Can't create PhysicsModel, invalid ModelType type: " << model_type << std::endl;
345 assert(0==1 &&
"Can't create PhysicsModel, invalid ModelType type");
349 #if PHILIP_SPECIES==1 351 #define POSSIBLE_NSTATE (1)(2)(3)(4)(5)(6)(8) 354 #define INSTANTIATE_FOR_NSTATE(r, data, nstate) \ 355 template class PhysicsFactory<PHILIP_DIM, PHILIP_SPECIES, nstate, double>; \ 356 template class PhysicsFactory<PHILIP_DIM, PHILIP_SPECIES, nstate, FadType>; \ 357 template class PhysicsFactory<PHILIP_DIM, PHILIP_SPECIES, nstate, RadType>; \ 358 template class PhysicsFactory<PHILIP_DIM, PHILIP_SPECIES, nstate, FadFadType>; \ 359 template class PhysicsFactory<PHILIP_DIM, PHILIP_SPECIES, nstate, RadFadType>; 360 BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_FOR_NSTATE, _, POSSIBLE_NSTATE)
362 #define POSSIBLE_TYPE (double)(FadType)(RadType)(FadFadType)(RadFadType) 363 #define INSTANTIATE_TYPES(r, data, type) \ 364 template class PhysicsFactory<PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+PHILIP_SPECIES+1, type>; 365 BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_TYPES, _, POSSIBLE_TYPE)
double diffusion_coefficient
Parameter for diffusion coefficient.
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.
double diffusion_coefficient
Diffusion coefficient.
FlowSolverParam flow_solver_param
Contains the parameters for simulation cases (flow solver test)
double turbulent_channel_domain_length_y_direction
For channel flow, domain length in y-direction.
Manufactured solution used for grid studies to check convergence orders.
PartialDifferentialEquation
Possible Partial Differential Equations to solve.
Files for the baseline physics.
ManufacturedSolutionParam manufactured_solution_param
Associated manufactured solution parameters.
Physics model additional terms and equations to the baseline physics.
EulerParam euler_param
Contains parameters for the Euler equations non-dimensionalization.
ModelType
Types of models available.
Main parameter class that contains the various other sub-parameter classes.
ManufacturedConvergenceStudyParam manufactured_convergence_study_param
Contains parameters for manufactured convergence study.
double ref_length
Reference length.
static std::shared_ptr< PhysicsBase< dim, nspecies, nstate, real > > create_Physics_Model(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function=nullptr, std::shared_ptr< ModelBase< dim, nspecies, nstate, real > > model_input=nullptr)
Factory to return the correct physics model, i.e. when PDE_type==physics_model || PDE_type==physics_m...
TestType test_type
Store selected TestType from the input file.
ReynoldsAveragedNavierStokesModel
Types of Reynolds-averaged Navier-Stokes (RANS) models that can be used.
dealii::Tensor< 1, 3, double > advection_vector
Advection velocity.
int turbulent_channel_number_of_cells_y_direction
For channel flow, number of cells in y-direction.
ReynoldsAveragedNavierStokesModel RANS_model_type
Store the Reynolds-averaged Navier-Stokes (RANS) model type.
static std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > create_ManufacturedSolution(Parameters::AllParameters const *const param, int nstate)
Construct Manufactured solution object from global parameter file.
static std::shared_ptr< PhysicsBase< dim, nspecies, nstate, real > > create_Physics(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ModelBase< dim, nspecies, nstate, real > > model_input=nullptr)
Factory to return the correct physics given input file.
dealii::Tensor< 2, 3, double > diffusion_tensor
Diffusion tensor.
ModelType model_type
Store the model type.
PhysicsModelParam physics_model_param
Contains parameters for Physics Model.
BurgersParam burgers_param
Contains parameters for Burgers equation.