95 #include "libmesh/getpot.h"
106 const std::string& conductivity,
107 const std::string& viscosity,
108 const std::string& specific_heat )
110 std::cerr <<
"================================================================" << std::endl
111 <<
"Invalid combination of models for " << physics << std::endl
112 <<
"Conductivity model = " << conductivity << std::endl
113 <<
"Viscosity model = " << viscosity << std::endl
114 <<
"Specific heat model = " << specific_heat << std::endl
115 <<
"================================================================" << std::endl;
120 const std::string& viscosity )
122 std::cerr <<
"================================================================" << std::endl
123 <<
"Invalid combination of models for " << physics << std::endl
124 <<
"Viscosity model = " << viscosity << std::endl
125 <<
"================================================================" << std::endl;
130 const std::string& conductivity )
132 std::cerr <<
"================================================================" << std::endl
133 <<
"Invalid combination of models for " << physics << std::endl
134 <<
"Conductivity model = " << conductivity << std::endl
135 <<
"================================================================" << std::endl;
147 template <
template<
typename>
class Subclass>
151 std::string viscosity =
154 if( viscosity ==
"constant" )
156 (
new Subclass<ConstantViscosity>(physics_to_add,input));
157 else if( viscosity ==
"parsed" )
159 (
new Subclass<ParsedViscosity>(physics_to_add,input));
160 else if( viscosity ==
"spalartallmaras" )
174 std::string viscosity =
177 if( viscosity ==
"spalartallmaras" )
186 template <
template<
typename>
class Subclass>
190 std::string viscosity =
193 if( viscosity ==
"spalartallmaras" )
201 template <
template<
typename>
class Subclass>
205 std::string conductivity =
206 input(
"Physics/"+
heat_transfer+
"/conductivity_model",
"constant" );
208 if( conductivity ==
"constant" )
210 (
new Subclass<ConstantConductivity>(physics_to_add,input));
211 else if( conductivity ==
"parsed" )
213 (
new Subclass<ParsedConductivity>(physics_to_add,input));
219 template <
template<
typename,
typename,
typename>
class Subclass>
225 std::string specific_heat = input(
"Physics/"+
low_mach_navier_stokes+
"/specific_heat_model",
"constant" );
227 if( conductivity ==
"constant" && viscosity ==
"constant" && specific_heat ==
"constant" )
233 (physics_to_add,input));
237 viscosity, specific_heat);
241 template <
template<
typename,
typename>
class Subclass>
247 if( thermochem_lib ==
"cantera" )
249 #ifdef GRINS_HAVE_CANTERA
250 return PhysicsPtr(
new Subclass<CanteraMixture,CanteraEvaluator>(physics_to_add,input));
252 std::cerr <<
"Error: Cantera not enabled. Cannot use Cantera library."
256 #endif // GRINS_HAVE_CANTERA
258 else if( thermochem_lib ==
"antioch" )
260 #ifdef GRINS_HAVE_ANTIOCH
261 std::string mixing_model = input(
"Physics/Antioch/mixing_model" ,
"wilke" );
263 std::string thermo_model = input(
"Physics/Antioch/thermo_model",
"stat_mech");
264 std::string viscosity_model = input(
"Physics/Antioch/viscosity_model",
"blottner");
265 std::string conductivity_model = input(
"Physics/Antioch/conductivity_model",
"eucken");
266 std::string diffusivity_model = input(
"Physics/Antioch/diffusivity_model",
"constant_lewis");
268 if( mixing_model == std::string(
"wilke") )
270 if( (thermo_model == std::string(
"stat_mech")) &&
271 (diffusivity_model == std::string(
"constant_lewis")) &&
272 (conductivity_model == std::string(
"eucken")) &&
273 (viscosity_model == std::string(
"sutherland")) )
276 Antioch::MixtureViscosity<Antioch::SutherlandViscosity<libMesh::Real> >,
277 Antioch::EuckenThermalConductivity<Antioch::StatMechThermodynamics<libMesh::Real> >,
278 Antioch::ConstantLewisDiffusivity<libMesh::Real> >,
280 Antioch::MixtureViscosity<Antioch::SutherlandViscosity<libMesh::Real> >,
281 Antioch::EuckenThermalConductivity<Antioch::StatMechThermodynamics<libMesh::Real> >,
282 Antioch::ConstantLewisDiffusivity<libMesh::Real> > >(physics_to_add,input) );
284 else if( (thermo_model == std::string(
"stat_mech")) &&
285 (diffusivity_model == std::string(
"constant_lewis")) &&
286 (conductivity_model == std::string(
"eucken")) &&
287 (viscosity_model == std::string(
"blottner")) )
290 Antioch::MixtureViscosity<Antioch::BlottnerViscosity<libMesh::Real> >,
291 Antioch::EuckenThermalConductivity<Antioch::StatMechThermodynamics<libMesh::Real> >,
292 Antioch::ConstantLewisDiffusivity<libMesh::Real> >,
294 Antioch::MixtureViscosity<Antioch::BlottnerViscosity<libMesh::Real> >,
295 Antioch::EuckenThermalConductivity<Antioch::StatMechThermodynamics<libMesh::Real> >,
296 Antioch::ConstantLewisDiffusivity<libMesh::Real> > >(physics_to_add,input) );
300 std::cerr <<
"Error: Unknown Antioch model combination: "
301 <<
"viscosity_model = " << viscosity_model << std::endl
302 <<
"conductivity_model = " << conductivity_model << std::endl
303 <<
"diffusivity_model = " << diffusivity_model << std::endl
304 <<
"thermo_model = " << thermo_model << std::endl;
308 else if( mixing_model == std::string(
"constant") )
310 if( viscosity_model != std::string(
"constant") )
312 std::cerr <<
"Error: For constant mixing_model, viscosity model must be constant!"
317 if( diffusivity_model != std::string(
"constant_lewis") )
319 std::cerr <<
"Error: For constant mixing_model, diffusivity model must be constant_lewis!"
324 if( (thermo_model == std::string(
"stat_mech")) &&
325 (conductivity_model == std::string(
"constant")) )
330 else if( (thermo_model == std::string(
"cea")) &&
331 (conductivity_model == std::string(
"constant")) )
336 else if( (thermo_model == std::string(
"stat_mech")) &&
337 (conductivity_model == std::string(
"constant_prandtl")) )
342 else if( (thermo_model == std::string(
"cea")) &&
343 (conductivity_model == std::string(
"constant_prandtl")) )
350 std::cerr <<
"Error: Unknown Antioch model combination: "
351 <<
"viscosity_model = " << viscosity_model << std::endl
352 <<
"conductivity_model = " << conductivity_model << std::endl
353 <<
"diffusivity_model = " << diffusivity_model << std::endl
354 <<
"thermo_model = " << thermo_model << std::endl;
360 std::cerr <<
"Error: Unknown Antioch mixing_model "
361 << mixing_model <<
"!" << std::endl;
365 std::cerr <<
"Error: Antioch not enabled. Cannot use Antioch library."
369 #endif // GRINS_HAVE_ANTIOCH
373 std::cerr <<
"Error: Invalid thermo-chemistry library" << std::endl
374 <<
" for ReactingLowMachNavierStokes physics." << std::endl
375 <<
" thermochemistry_library = " << thermochem_lib << std::endl;
399 int num_physics = input.vector_variable_size(
"Physics/enabled_physics");
401 if( num_physics < 1 )
403 std::cerr <<
"Error: Must enable at least one physics model" << std::endl;
407 std::set<std::string> requested_physics;
410 for(
int i = 0; i < num_physics; i++ )
412 requested_physics.insert( input(
"Physics/enabled_physics",
"NULL", i ) );
415 for( std::set<std::string>::const_iterator physics = requested_physics.begin();
416 physics != requested_physics.end();
419 this->
add_physics( input, *physics, physics_list );
424 if( input(
"screen-options/echo_physics",
true ) )
426 std::cout <<
"==========================================================" << std::endl
427 <<
"List of Enabled Physics:" << std::endl;
430 it != physics_list.end();
433 std::cout<< it->first << std::endl;
435 std::cout <<
"==========================================================" << std::endl;
442 const std::string& physics_to_add,
447 physics_list[physics_to_add] =
448 new_mu_class<IncompressibleNavierStokes>
449 (physics_to_add, input);
451 else if( physics_to_add ==
stokes )
453 physics_list[physics_to_add] =
455 (physics_to_add, input);
459 physics_list[physics_to_add] =
460 new_mu_class<IncompressibleNavierStokesAdjointStabilization>
461 (physics_to_add, input);
465 physics_list[physics_to_add] =
466 new_mu_class<IncompressibleNavierStokesSPGSMStabilization>
467 (physics_to_add, input);
471 physics_list[physics_to_add] =
472 new_mu_class<VelocityDrag>
473 (physics_to_add, input);
477 physics_list[physics_to_add] =
478 new_mu_class<VelocityDragAdjointStabilization>
479 (physics_to_add, input);
485 physics_list[physics_to_add] =
486 new_mu_class<VelocityPenalty>
487 (physics_to_add, input);
493 physics_list[physics_to_add] =
494 new_mu_class<VelocityPenaltyAdjointStabilization>
495 (physics_to_add, input);
499 physics_list[physics_to_add] =
500 new_mu_class<ParsedVelocitySource>
501 (physics_to_add, input);
505 physics_list[physics_to_add] =
506 new_mu_class<ParsedVelocitySourceAdjointStabilization>
507 (physics_to_add, input);
511 physics_list[physics_to_add] =
512 new_mu_class<AveragedFan>
513 (physics_to_add, input);
517 physics_list[physics_to_add] =
518 new_mu_class<AveragedFanAdjointStabilization>
519 (physics_to_add, input);
523 physics_list[physics_to_add] =
524 new_mu_class<AveragedTurbine>
525 (physics_to_add, input);
529 physics_list[physics_to_add] =
531 (physics_to_add, input);
535 physics_list[physics_to_add] =
536 new_turb_mu_class<SpalartAllmarasSPGSMStabilization>
537 (physics_to_add, input);
541 physics_list[physics_to_add] =
546 physics_list[physics_to_add] =
547 new_k_class<HeatTransfer>
548 (physics_to_add, input);
552 physics_list[physics_to_add] =
553 new_k_class<HeatTransferAdjointStabilization>
554 (physics_to_add, input);
558 physics_list[physics_to_add] =
559 new_k_class<HeatTransferSPGSMStabilization>
560 (physics_to_add, input);
564 std::string source_function = input(
"Physics/"+physics_to_add+
"/source_function",
"constant" );
565 if( source_function ==
"constant")
567 physics_list[physics_to_add] =
572 std::cerr <<
"================================================================" << std::endl
573 <<
"Invalid combination of models for " << physics_to_add << std::endl
574 <<
"Source function = " << source_function << std::endl
575 <<
"================================================================" << std::endl;
581 physics_list[physics_to_add] =
582 new_k_class<AxisymmetricHeatTransfer>
583 (physics_to_add, input);
587 physics_list[physics_to_add] =
592 physics_list[physics_to_add] =
593 new_mu_class<BoussinesqBuoyancyAdjointStabilization>
594 (physics_to_add, input);
598 physics_list[physics_to_add] =
599 new_mu_class<BoussinesqBuoyancySPGSMStabilization>
600 (physics_to_add, input);
604 physics_list[physics_to_add] =
607 else if( physics_to_add ==
"HeatConduction" )
609 physics_list[physics_to_add] =
610 new_k_class<HeatConduction>
611 (physics_to_add, input);
615 physics_list[physics_to_add] =
616 new_mu_cp_k_class<LowMachNavierStokes>
617 (physics_to_add, input);
621 physics_list[physics_to_add] =
622 new_mu_cp_k_class<LowMachNavierStokesSPGSMStabilization>
623 (physics_to_add, input);
627 physics_list[physics_to_add] =
628 new_mu_cp_k_class<LowMachNavierStokesVMSStabilization>
629 (physics_to_add, input);
633 physics_list[physics_to_add] =
634 new_mu_cp_k_class<LowMachNavierStokesBraackStabilization>
635 (physics_to_add, input);
639 physics_list[physics_to_add] =
640 new_reacting_low_mach_class<ReactingLowMachNavierStokes>
641 (physics_to_add, input);
645 std::string elasticity_model = input(
"Physics/"+
elastic_membrane+
"/elasticity_model",
"HookesLaw" );
647 if( elasticity_model == std::string(
"HookesLaw") )
649 physics_list[physics_to_add] =
652 else if( elasticity_model == std::string(
"MooneyRivlin") )
654 physics_list[physics_to_add] =
660 std::cerr <<
"Error: Invalid elasticity_model: " << elasticity_model << std::endl
661 <<
" Valid selections are: Hookean" << std::endl;
667 physics_list[physics_to_add] =
672 std::string elasticity_model = input(
"Physics/"+
elastic_cable+
"/elasticity_model",
"HookesLaw" );
674 if( elasticity_model == std::string(
"HookesLaw") )
676 physics_list[physics_to_add] =
681 std::cerr <<
"Error: Invalid elasticity_model: " << elasticity_model << std::endl
682 <<
" Valid selections are: Hookean" << std::endl;
688 physics_list[physics_to_add] =
693 physics_list[physics_to_add] =
698 physics_list[physics_to_add] =
703 std::cerr <<
"Error: Invalid physics name " << physics_to_add << std::endl;
715 physics != physics_list.end();
767 if( physics_list.size() > 2 )
769 std::cerr <<
"=======================================================" << std::endl
771 <<
"only one stabilization physics is allowed. Detected the" << std::endl
772 <<
"following:" << std::endl;
774 iter != physics_list.end();
777 std::cerr << physics->first << std::endl;
779 std::cerr <<
"=======================================================" << std::endl;
815 if( physics_list.size() > 2 )
817 std::cerr <<
"=======================================================" << std::endl
819 <<
"only one stabilization physics is allowed. Detected the" << std::endl
820 <<
"following:" << std::endl;
822 iter != physics_list.end();
825 std::cerr << physics->first << std::endl;
827 std::cerr <<
"=======================================================" << std::endl;
837 const std::string physics_required )
const
839 std::cerr <<
"Error: " << physics_checked <<
" physics class requires using "
840 << physics_required <<
" physics." << std::endl
841 << physics_required <<
" not found in list of requested physics."
Physics class for arbitrary scalar-valued ODEs.
const PhysicsName parsed_velocity_source_adjoint_stab
const PhysicsName incompressible_navier_stokes_spgsm_stab
Adds Boussinesq bouyancy source term.
const PhysicsName incompressible_navier_stokes
Wrapper class for evaluating constant transport properties, including Antioch::ConstantLewisDiffusivi...
const PhysicsName parsed_source_term
void physics_consistency_error(const std::string physics_checked, const std::string physics_required) const
Utility function.
const PhysicsName elastic_cable_constant_gravity
const PhysicsName incompressible_navier_stokes_adjoint_stab
std::map< std::string, std::tr1::shared_ptr< GRINS::Physics > > PhysicsList
Container for GRINS::Physics object pointers.
const PhysicsName axisymmetric_heat_transfer
const PhysicsName boussinesq_buoyancy_adjoint_stab
PhysicsPtr new_mu_class< SpalartAllmaras >(const std::string &physics_to_add, const GetPot &input)
Adds Axisymmetric Boussinesq bouyancy source term.
const PhysicsName velocity_drag_adjoint_stab
std::map< std::string, std::tr1::shared_ptr< GRINS::Physics > >::const_iterator PhysicsListIter
Iterator for PhysicsList.
void visc_cond_specheat_error(const std::string &physics, const std::string &conductivity, const std::string &viscosity, const std::string &specific_heat)
PhysicsPtr new_mu_cp_k_class(const std::string &physics_to_add, const GetPot &input)
const PhysicsName averaged_turbine
const PhysicsName spalart_allmaras
const PhysicsName spalart_allmaras_spgsm_stab
PhysicsPtr new_k_class(const std::string &physics_to_add, const GetPot &input)
PhysicsPtr new_mu_class(const std::string &physics_to_add, const GetPot &input)
virtual ~PhysicsFactory()
Destructor does not need to delete std::tr1::shared_ptr's.
const PhysicsName averaged_fan_adjoint_stab
void visc_error(const std::string &physics, const std::string &viscosity)
const PhysicsName heat_transfer_spgsm_stab
void conductivity_error(const std::string &physics, const std::string &conductivity)
const PhysicsName elastic_membrane
const PhysicsName velocity_penalty2_adjoint_stab
const PhysicsName elastic_cable
const PhysicsName velocity_penalty_adjoint_stab
const PhysicsName scalar_ode
Physics class for Incompressible Navier-Stokes.
const PhysicsName boussinesq_buoyancy_spgsm_stab
const PhysicsName heat_transfer_source
const PhysicsName elastic_membrane_constant_pressure
PhysicsFactory::PhysicsPtr PhysicsPtr
PhysicsPtr new_reacting_low_mach_class(const std::string &physics_to_add, const GetPot &input)
const PhysicsName parsed_velocity_source
virtual void check_physics_consistency(const GRINS::PhysicsList &physics_list)
Make sure the requested GRINS::Physics classes are consistent.
const PhysicsName velocity_penalty3
const PhysicsName velocity_penalty2
const PhysicsName low_mach_navier_stokes
PhysicsPtr new_turb_mu_class(const std::string &physics_to_add, const GetPot &input)
const PhysicsName heat_transfer
const PhysicsName low_mach_navier_stokes_braack_stab
Adds generic, spatially dependent source term to HeatTransfer physics.
std::tr1::shared_ptr< Physics > PhysicsPtr
const PhysicsName reacting_low_mach_navier_stokes
const PhysicsName boussinesq_buoyancy
const PhysicsName low_mach_navier_stokes_vms_stab
const PhysicsName heat_transfer_adjoint_stab
const PhysicsName axisymmetric_boussinesq_buoyancy
const PhysicsName velocity_penalty3_adjoint_stab
const PhysicsName low_mach_navier_stokes_spgsm_stab
Wrapper class for storing state for computing Wilke transport properties using Antioch.
GRINS::PhysicsList build(const GetPot &input)
Builds PhysicsList. This is the primary function of this class.
Wrapper class for storing state for constant transport properties, including Antioch::ConstantLewisDi...
virtual void add_physics(const GetPot &input, const std::string &physics_to_add, GRINS::PhysicsList &physics_list)
Figures out which GRINS::Physics pointer to create.
Wrapper class for evaluating Wilke transport properties using Antioch.
const PhysicsName averaged_fan
const PhysicsName velocity_penalty
const PhysicsName velocity_drag
const PhysicsName constant_source_term