GRINS-0.6.0
physics_factory.C
Go to the documentation of this file.
1 //-----------------------------------------------------------------------bl-
2 //--------------------------------------------------------------------------
3 //
4 // GRINS - General Reacting Incompressible Navier-Stokes
5 //
6 // Copyright (C) 2014-2015 Paul T. Bauman, Roy H. Stogner
7 // Copyright (C) 2010-2013 The PECOS Development Team
8 //
9 // This library is free software; you can redistribute it and/or
10 // modify it under the terms of the Version 2.1 GNU Lesser General
11 // Public License as published by the Free Software Foundation.
12 //
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // Lesser General Public License for more details.
17 //
18 // You should have received a copy of the GNU Lesser General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc. 51 Franklin Street, Fifth Floor,
21 // Boston, MA 02110-1301 USA
22 //
23 //-----------------------------------------------------------------------el-
24 
25 
26 // This class
27 #include "grins/physics_factory.h"
28 
29 // GRINS
30 #include "grins/cantera_mixture.h"
31 #include "grins/cantera_thermo.h"
33 #include "grins/cantera_kinetics.h"
35 #include "grins/physics.h"
36 #include "grins/stokes.h"
40 #include "grins/heat_transfer.h"
53 #include "grins/averaged_fan.h"
55 #include "grins/averaged_turbine.h"
56 #include "grins/scalar_ode.h"
57 #include "grins/velocity_drag.h"
59 #include "grins/velocity_penalty.h"
63 #include "grins/elastic_membrane.h"
64 #include "grins/elastic_cable.h"
70 
71 #include "grins/spalart_allmaras.h"
73 
78 #include "grins/parsed_viscosity.h"
80 
82 #include "grins/heat_conduction.h"
84 
88 
89 #include "grins/hookes_law.h"
90 #include "grins/hookes_law_1d.h"
92 #include "grins/mooney_rivlin.h"
93 
94 // libMesh
95 #include "libmesh/getpot.h"
96 
97 namespace GRINS
98 {
99 
100  // Starting with helper functions for model-templated physics
101  // instantiation. These don't need to be visible elsewhere.
102 
104 
105  void visc_cond_specheat_error( const std::string& physics,
106  const std::string& conductivity,
107  const std::string& viscosity,
108  const std::string& specific_heat )
109  {
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;
116  libmesh_error();
117  }
118 
119  void visc_error( const std::string& physics,
120  const std::string& viscosity )
121  {
122  std::cerr << "================================================================" << std::endl
123  << "Invalid combination of models for " << physics << std::endl
124  << "Viscosity model = " << viscosity << std::endl
125  << "================================================================" << std::endl;
126  libmesh_error();
127  }
128 
129  void conductivity_error( const std::string& physics,
130  const std::string& conductivity )
131  {
132  std::cerr << "================================================================" << std::endl
133  << "Invalid combination of models for " << physics << std::endl
134  << "Conductivity model = " << conductivity << std::endl
135  << "================================================================" << std::endl;
136  libmesh_error();
137  }
138 
139 
140  // FIXME: Currently we always look for a lone viscosity model in the
141  // IncompressibleNavierStokes input, or for a lone conductivity
142  // model in the HeatTransfer input, or for a viscosity + specific
143  // heat + conductivity model set in the LowMachNavierStokes input.
144  // This needs to be fixed, but carefully to avoid breaking old input
145  // files.
146 
147  template <template<typename> class Subclass>
148  PhysicsPtr new_mu_class(const std::string& physics_to_add,
149  const GetPot& input)
150  {
151  std::string viscosity =
152  input( "Physics/"+incompressible_navier_stokes+"/viscosity_model", "constant" );
153 
154  if( viscosity == "constant" )
155  return PhysicsPtr
156  (new Subclass<ConstantViscosity>(physics_to_add,input));
157  else if( viscosity == "parsed" )
158  return PhysicsPtr
159  (new Subclass<ParsedViscosity>(physics_to_add,input));
160  else if( viscosity == "spalartallmaras" )
161  return PhysicsPtr
162  (new Subclass<SpalartAllmarasViscosity<ConstantViscosity> >(physics_to_add,input));
163 
164  visc_error(physics_to_add, viscosity);
165  return PhysicsPtr();
166  }
167 
168  /* Specialize new_mu_class for SA since it is only valid for viscosity == "spalartallmaras"
169  AND *must* be instantiated with *physical* viscosity */
170  template <>
171  PhysicsPtr new_mu_class<SpalartAllmaras>(const std::string& physics_to_add,
172  const GetPot& input)
173  {
174  std::string viscosity =
175  input( "Physics/"+incompressible_navier_stokes+"/viscosity_model", "constant" );
176 
177  if( viscosity == "spalartallmaras" )
178  return PhysicsPtr
179  (new SpalartAllmaras<ConstantViscosity>(physics_to_add,input));
180 
181  visc_error(physics_to_add, viscosity);
182  return PhysicsPtr();
183  }
184 
185  // Instantiate classes whose only valid viscosity models are turbulent
186  template <template<typename> class Subclass>
187  PhysicsPtr new_turb_mu_class(const std::string& physics_to_add,
188  const GetPot& input)
189  {
190  std::string viscosity =
191  input( "Physics/"+incompressible_navier_stokes+"/viscosity_model", "constant" );
192 
193  if( viscosity == "spalartallmaras" )
194  return PhysicsPtr
195  (new Subclass<SpalartAllmarasViscosity<ConstantViscosity> >(physics_to_add,input));
196 
197  visc_error(physics_to_add, viscosity);
198  return PhysicsPtr();
199  }
200 
201  template <template<typename> class Subclass>
202  PhysicsPtr new_k_class(const std::string& physics_to_add,
203  const GetPot& input)
204  {
205  std::string conductivity =
206  input( "Physics/"+heat_transfer+"/conductivity_model", "constant" );
207 
208  if( conductivity == "constant" )
209  return PhysicsPtr
210  (new Subclass<ConstantConductivity>(physics_to_add,input));
211  else if( conductivity == "parsed" )
212  return PhysicsPtr
213  (new Subclass<ParsedConductivity>(physics_to_add,input));
214 
215  conductivity_error(physics_to_add, conductivity);
216  return PhysicsPtr();
217  }
218 
219  template <template<typename,typename,typename> class Subclass>
220  PhysicsPtr new_mu_cp_k_class(const std::string& physics_to_add,
221  const GetPot& input)
222  {
223  std::string conductivity = input( "Physics/"+low_mach_navier_stokes+"/conductivity_model", "constant" );
224  std::string viscosity = input( "Physics/"+low_mach_navier_stokes+"/viscosity_model", "constant" );
225  std::string specific_heat = input( "Physics/"+low_mach_navier_stokes+"/specific_heat_model", "constant" );
226 
227  if( conductivity == "constant" && viscosity == "constant" && specific_heat == "constant" )
228  {
229  return PhysicsPtr
230  (new Subclass<ConstantViscosity,
233  (physics_to_add,input));
234  }
235 
236  visc_cond_specheat_error(physics_to_add, conductivity,
237  viscosity, specific_heat);
238  return PhysicsPtr();
239  }
240 
241  template <template<typename,typename> class Subclass>
242  PhysicsPtr new_reacting_low_mach_class(const std::string& physics_to_add,
243  const GetPot& input)
244  {
245  std::string thermochem_lib = input( "Physics/"+reacting_low_mach_navier_stokes+"/thermochemistry_library", "DIE!" );
246 
247  if( thermochem_lib == "cantera" )
248  {
249 #ifdef GRINS_HAVE_CANTERA
250  return PhysicsPtr(new Subclass<CanteraMixture,CanteraEvaluator>(physics_to_add,input));
251 #else
252  std::cerr << "Error: Cantera not enabled. Cannot use Cantera library."
253  << std::endl;
254  libmesh_error();
255 
256 #endif // GRINS_HAVE_CANTERA
257  }
258  else if( thermochem_lib == "antioch" )
259  {
260 #ifdef GRINS_HAVE_ANTIOCH
261  std::string mixing_model = input( "Physics/Antioch/mixing_model" , "wilke" );
262 
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");
267 
268  if( mixing_model == std::string("wilke") )
269  {
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")) )
274  {
275  return PhysicsPtr(new Subclass<GRINS::AntiochWilkeTransportMixture<Antioch::StatMechThermodynamics<libMesh::Real>,
276  Antioch::MixtureViscosity<Antioch::SutherlandViscosity<libMesh::Real> >,
277  Antioch::EuckenThermalConductivity<Antioch::StatMechThermodynamics<libMesh::Real> >,
278  Antioch::ConstantLewisDiffusivity<libMesh::Real> >,
279  GRINS::AntiochWilkeTransportEvaluator<Antioch::StatMechThermodynamics<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) );
283  }
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")) )
288  {
289  return PhysicsPtr(new Subclass<GRINS::AntiochWilkeTransportMixture<Antioch::StatMechThermodynamics<libMesh::Real>,
290  Antioch::MixtureViscosity<Antioch::BlottnerViscosity<libMesh::Real> >,
291  Antioch::EuckenThermalConductivity<Antioch::StatMechThermodynamics<libMesh::Real> >,
292  Antioch::ConstantLewisDiffusivity<libMesh::Real> >,
293  GRINS::AntiochWilkeTransportEvaluator<Antioch::StatMechThermodynamics<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) );
297  }
298  else
299  {
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;
305  libmesh_error();
306  }
307  }
308  else if( mixing_model == std::string("constant") )
309  {
310  if( viscosity_model != std::string("constant") )
311  {
312  std::cerr << "Error: For constant mixing_model, viscosity model must be constant!"
313  << std::endl;
314  libmesh_error();
315  }
316 
317  if( diffusivity_model != std::string("constant_lewis") )
318  {
319  std::cerr << "Error: For constant mixing_model, diffusivity model must be constant_lewis!"
320  << std::endl;
321  libmesh_error();
322  }
323 
324  if( (thermo_model == std::string("stat_mech")) &&
325  (conductivity_model == std::string("constant")) )
326  {
328  GRINS::AntiochConstantTransportEvaluator<Antioch::StatMechThermodynamics<libMesh::Real>, GRINS::ConstantConductivity> >(physics_to_add,input) );
329  }
330  else if( (thermo_model == std::string("cea")) &&
331  (conductivity_model == std::string("constant")) )
332  {
334  GRINS::AntiochConstantTransportEvaluator<Antioch::CEAEvaluator<libMesh::Real>, GRINS::ConstantConductivity> >(physics_to_add,input) );
335  }
336  else if( (thermo_model == std::string("stat_mech")) &&
337  (conductivity_model == std::string("constant_prandtl")) )
338  {
340  GRINS::AntiochConstantTransportEvaluator<Antioch::StatMechThermodynamics<libMesh::Real>, GRINS::ConstantPrandtlConductivity> >(physics_to_add,input) );
341  }
342  else if( (thermo_model == std::string("cea")) &&
343  (conductivity_model == std::string("constant_prandtl")) )
344  {
346  GRINS::AntiochConstantTransportEvaluator<Antioch::CEAEvaluator<libMesh::Real>, GRINS::ConstantPrandtlConductivity> >(physics_to_add,input) );
347  }
348  else
349  {
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;
355  libmesh_error();
356  }
357  }
358  else // mixing_model
359  {
360  std::cerr << "Error: Unknown Antioch mixing_model "
361  << mixing_model << "!" << std::endl;
362  libmesh_error();
363  }
364 #else
365  std::cerr << "Error: Antioch not enabled. Cannot use Antioch library."
366  << std::endl;
367  libmesh_error();
368 
369 #endif // GRINS_HAVE_ANTIOCH
370  }
371  else
372  {
373  std::cerr << "Error: Invalid thermo-chemistry library" << std::endl
374  << " for ReactingLowMachNavierStokes physics." << std::endl
375  << " thermochemistry_library = " << thermochem_lib << std::endl;
376  libmesh_error();
377  }
378 
379  return PhysicsPtr();
380  }
381 
382 
383  // And now PhysicsFactory methods
384 
386  {
387  return;
388  }
389 
391  {
392  return;
393  }
394 
395  PhysicsList PhysicsFactory::build( const GetPot& input )
396  {
397  PhysicsList physics_list;
398 
399  int num_physics = input.vector_variable_size("Physics/enabled_physics");
400 
401  if( num_physics < 1 )
402  {
403  std::cerr << "Error: Must enable at least one physics model" << std::endl;
404  libmesh_error();
405  }
406 
407  std::set<std::string> requested_physics;
408 
409  // Go through and create a physics object for each physics we're enabling
410  for( int i = 0; i < num_physics; i++ )
411  {
412  requested_physics.insert( input("Physics/enabled_physics", "NULL", i ) );
413  }
414 
415  for( std::set<std::string>::const_iterator physics = requested_physics.begin();
416  physics != requested_physics.end();
417  physics++ )
418  {
419  this->add_physics( input, *physics, physics_list );
420  }
421 
422  this->check_physics_consistency( physics_list );
423 
424  if( input( "screen-options/echo_physics", true ) )
425  {
426  std::cout << "==========================================================" << std::endl
427  << "List of Enabled Physics:" << std::endl;
428 
429  for( PhysicsListIter it = physics_list.begin();
430  it != physics_list.end();
431  it++ )
432  {
433  std::cout<< it->first << std::endl;
434  }
435  std::cout << "==========================================================" << std::endl;
436  }
437 
438  return physics_list;
439  }
440 
441  void PhysicsFactory::add_physics( const GetPot& input,
442  const std::string& physics_to_add,
443  PhysicsList& physics_list )
444  {
445  if( physics_to_add == incompressible_navier_stokes )
446  {
447  physics_list[physics_to_add] =
448  new_mu_class<IncompressibleNavierStokes>
449  (physics_to_add, input);
450  }
451  else if( physics_to_add == stokes )
452  {
453  physics_list[physics_to_add] =
454  new_mu_class<Stokes>
455  (physics_to_add, input);
456  }
457  else if( physics_to_add == incompressible_navier_stokes_adjoint_stab )
458  {
459  physics_list[physics_to_add] =
460  new_mu_class<IncompressibleNavierStokesAdjointStabilization>
461  (physics_to_add, input);
462  }
463  else if( physics_to_add == incompressible_navier_stokes_spgsm_stab )
464  {
465  physics_list[physics_to_add] =
466  new_mu_class<IncompressibleNavierStokesSPGSMStabilization>
467  (physics_to_add, input);
468  }
469  else if( physics_to_add == velocity_drag )
470  {
471  physics_list[physics_to_add] =
472  new_mu_class<VelocityDrag>
473  (physics_to_add, input);
474  }
475  else if( physics_to_add == velocity_drag_adjoint_stab )
476  {
477  physics_list[physics_to_add] =
478  new_mu_class<VelocityDragAdjointStabilization>
479  (physics_to_add, input);
480  }
481  else if( physics_to_add == velocity_penalty ||
482  physics_to_add == velocity_penalty2 ||
483  physics_to_add == velocity_penalty3)
484  {
485  physics_list[physics_to_add] =
486  new_mu_class<VelocityPenalty>
487  (physics_to_add, input);
488  }
489  else if( physics_to_add == velocity_penalty_adjoint_stab ||
490  physics_to_add == velocity_penalty2_adjoint_stab ||
491  physics_to_add == velocity_penalty3_adjoint_stab )
492  {
493  physics_list[physics_to_add] =
494  new_mu_class<VelocityPenaltyAdjointStabilization>
495  (physics_to_add, input);
496  }
497  else if( physics_to_add == parsed_velocity_source )
498  {
499  physics_list[physics_to_add] =
500  new_mu_class<ParsedVelocitySource>
501  (physics_to_add, input);
502  }
503  else if( physics_to_add == parsed_velocity_source_adjoint_stab )
504  {
505  physics_list[physics_to_add] =
506  new_mu_class<ParsedVelocitySourceAdjointStabilization>
507  (physics_to_add, input);
508  }
509  else if( physics_to_add == averaged_fan )
510  {
511  physics_list[physics_to_add] =
512  new_mu_class<AveragedFan>
513  (physics_to_add, input);
514  }
515  else if( physics_to_add == averaged_fan_adjoint_stab )
516  {
517  physics_list[physics_to_add] =
518  new_mu_class<AveragedFanAdjointStabilization>
519  (physics_to_add, input);
520  }
521  else if( physics_to_add == averaged_turbine )
522  {
523  physics_list[physics_to_add] =
524  new_mu_class<AveragedTurbine>
525  (physics_to_add, input);
526  }
527  else if( physics_to_add == spalart_allmaras )
528  {
529  physics_list[physics_to_add] =
531  (physics_to_add, input);
532  }
533  else if( physics_to_add == spalart_allmaras_spgsm_stab )
534  {
535  physics_list[physics_to_add] =
536  new_turb_mu_class<SpalartAllmarasSPGSMStabilization>
537  (physics_to_add, input);
538  }
539  else if( physics_to_add == scalar_ode )
540  {
541  physics_list[physics_to_add] =
542  PhysicsPtr(new ScalarODE(physics_to_add,input));
543  }
544  else if( physics_to_add == heat_transfer )
545  {
546  physics_list[physics_to_add] =
547  new_k_class<HeatTransfer>
548  (physics_to_add, input);
549  }
550  else if( physics_to_add == heat_transfer_adjoint_stab )
551  {
552  physics_list[physics_to_add] =
553  new_k_class<HeatTransferAdjointStabilization>
554  (physics_to_add, input);
555  }
556  else if( physics_to_add == heat_transfer_spgsm_stab )
557  {
558  physics_list[physics_to_add] =
559  new_k_class<HeatTransferSPGSMStabilization>
560  (physics_to_add, input);
561  }
562  else if( physics_to_add == heat_transfer_source )
563  {
564  std::string source_function = input( "Physics/"+physics_to_add+"/source_function", "constant" );
565  if( source_function == "constant")
566  {
567  physics_list[physics_to_add] =
568  PhysicsPtr(new HeatTransferSource<ConstantSourceFunction>(physics_to_add,input));
569  }
570  else
571  {
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;
576  libmesh_error();
577  }
578  }
579  else if( physics_to_add == axisymmetric_heat_transfer )
580  {
581  physics_list[physics_to_add] =
582  new_k_class<AxisymmetricHeatTransfer>
583  (physics_to_add, input);
584  }
585  else if( physics_to_add == boussinesq_buoyancy )
586  {
587  physics_list[physics_to_add] =
588  PhysicsPtr(new BoussinesqBuoyancy(physics_to_add,input));
589  }
590  else if( physics_to_add == boussinesq_buoyancy_adjoint_stab )
591  {
592  physics_list[physics_to_add] =
593  new_mu_class<BoussinesqBuoyancyAdjointStabilization>
594  (physics_to_add, input);
595  }
596  else if( physics_to_add == boussinesq_buoyancy_spgsm_stab )
597  {
598  physics_list[physics_to_add] =
599  new_mu_class<BoussinesqBuoyancySPGSMStabilization>
600  (physics_to_add, input);
601  }
602  else if( physics_to_add == axisymmetric_boussinesq_buoyancy)
603  {
604  physics_list[physics_to_add] =
605  PhysicsPtr(new AxisymmetricBoussinesqBuoyancy(physics_to_add,input));
606  }
607  else if( physics_to_add == "HeatConduction" )
608  {
609  physics_list[physics_to_add] =
610  new_k_class<HeatConduction>
611  (physics_to_add, input);
612  }
613  else if( physics_to_add == low_mach_navier_stokes )
614  {
615  physics_list[physics_to_add] =
616  new_mu_cp_k_class<LowMachNavierStokes>
617  (physics_to_add, input);
618  }
619  else if( physics_to_add == low_mach_navier_stokes_spgsm_stab )
620  {
621  physics_list[physics_to_add] =
622  new_mu_cp_k_class<LowMachNavierStokesSPGSMStabilization>
623  (physics_to_add, input);
624  }
625  else if( physics_to_add == low_mach_navier_stokes_vms_stab )
626  {
627  physics_list[physics_to_add] =
628  new_mu_cp_k_class<LowMachNavierStokesVMSStabilization>
629  (physics_to_add, input);
630  }
631  else if( physics_to_add == low_mach_navier_stokes_braack_stab )
632  {
633  physics_list[physics_to_add] =
634  new_mu_cp_k_class<LowMachNavierStokesBraackStabilization>
635  (physics_to_add, input);
636  }
637  else if( physics_to_add == reacting_low_mach_navier_stokes )
638  {
639  physics_list[physics_to_add] =
640  new_reacting_low_mach_class<ReactingLowMachNavierStokes>
641  (physics_to_add, input);
642  }
643  else if( physics_to_add == elastic_membrane )
644  {
645  std::string elasticity_model = input("Physics/"+elastic_membrane+"/elasticity_model", "HookesLaw" );
646 
647  if( elasticity_model == std::string("HookesLaw") )
648  {
649  physics_list[physics_to_add] =
650  PhysicsPtr(new ElasticMembrane<HookesLaw>(physics_to_add,input,false /*is_compressible*/));
651  }
652  else if( elasticity_model == std::string("MooneyRivlin") )
653  {
654  physics_list[physics_to_add] =
655  // \lambda determined from incompressiblity
656  PhysicsPtr(new ElasticMembrane<IncompressiblePlaneStressHyperelasticity<MooneyRivlin> >(physics_to_add,input,false /*is_compressible*/));
657  }
658  else
659  {
660  std::cerr << "Error: Invalid elasticity_model: " << elasticity_model << std::endl
661  << " Valid selections are: Hookean" << std::endl;
662  libmesh_error();
663  }
664  }
665  else if( physics_to_add == elastic_membrane_constant_pressure )
666  {
667  physics_list[physics_to_add] =
668  PhysicsPtr(new ElasticMembraneConstantPressure(physics_to_add,input));
669  }
670  else if( physics_to_add == elastic_cable )
671  {
672  std::string elasticity_model = input("Physics/"+elastic_cable+"/elasticity_model", "HookesLaw" );
673 
674  if( elasticity_model == std::string("HookesLaw") )
675  {
676  physics_list[physics_to_add] =
677  PhysicsPtr(new ElasticCable<HookesLaw1D>(physics_to_add,input,false /*is_compressible*/));
678  }
679  else
680  {
681  std::cerr << "Error: Invalid elasticity_model: " << elasticity_model << std::endl
682  << " Valid selections are: Hookean" << std::endl;
683  libmesh_error();
684  }
685  }
686  else if( physics_to_add == elastic_cable_constant_gravity )
687  {
688  physics_list[physics_to_add] =
689  PhysicsPtr(new ElasticCableConstantGravity(physics_to_add,input));
690  }
691  else if( physics_to_add == constant_source_term )
692  {
693  physics_list[physics_to_add] =
694  PhysicsPtr(new ConstantSourceTerm(physics_to_add,input));
695  }
696  else if( physics_to_add == parsed_source_term )
697  {
698  physics_list[physics_to_add] =
699  PhysicsPtr(new ParsedSourceTerm(physics_to_add,input));
700  }
701  else
702  {
703  std::cerr << "Error: Invalid physics name " << physics_to_add << std::endl;
704  libmesh_error();
705  }
706 
707  return;
708  }
709 
711  {
714  for( PhysicsListIter physics = physics_list.begin();
715  physics != physics_list.end();
716  physics++ )
717  {
718  // For IncompressibleNavierStokes*Stabilization, we'd better have IncompressibleNavierStokes
719  if( (physics->first == incompressible_navier_stokes_adjoint_stab) ||
720  (physics->first == incompressible_navier_stokes_spgsm_stab) )
721  {
722  if( physics_list.find(incompressible_navier_stokes) == physics_list.end() )
723  {
725  }
726  }
727 
728  // For HeatTransfer, we need IncompressibleNavierStokes
729  if( physics->first == heat_transfer )
730  {
731  if( physics_list.find(incompressible_navier_stokes) == physics_list.end() )
732  {
734  }
735  }
736 
737  // For BoussinesqBuoyancy, we need both HeatTransfer and IncompressibleNavierStokes
738  if( physics->first == boussinesq_buoyancy )
739  {
740  if( physics_list.find(incompressible_navier_stokes) == physics_list.end() )
741  {
743  }
744 
745  if( physics_list.find(heat_transfer) == physics_list.end() )
746  {
748  }
749  }
750 
751  /* For AxisymmetricBoussinesqBuoyancy, we need both AxisymmetricHeatTransfer
752  and AxisymmetricIncompNavierStokes */
753  if( physics->first == axisymmetric_boussinesq_buoyancy )
754  {
755 
756  if( physics_list.find(axisymmetric_heat_transfer) == physics_list.end() )
757  {
760  }
761  }
762 
763  /* For LowMachNavierStokes, there should be nothing else loaded, except
764  for stabilization. */
765  if( physics->first == low_mach_navier_stokes )
766  {
767  if( physics_list.size() > 2 )
768  {
769  std::cerr << "=======================================================" << std::endl
770  << "Error: For physics " << low_mach_navier_stokes << std::endl
771  << "only one stabilization physics is allowed. Detected the" << std::endl
772  << "following:" << std::endl;
773  for( GRINS::PhysicsListIter iter = physics_list.begin();
774  iter != physics_list.end();
775  iter++ )
776  {
777  std::cerr << physics->first << std::endl;
778  }
779  std::cerr << "=======================================================" << std::endl;
780  libmesh_error();
781  }
782  }
783 
784  /* For HeatTransferSource, we'd better have HeatTransfer */
785  if( physics->first == heat_transfer_source )
786  {
787  if( physics_list.find(heat_transfer) == physics_list.end() )
788  {
789  this->physics_consistency_error( physics->first, heat_transfer );
790  }
791  }
792 
793  /* For HeatTransferAdjointStabilization, we'd better have HeatTransfer */
794  if( physics->first == heat_transfer_adjoint_stab )
795  {
796  if( physics_list.find(heat_transfer) == physics_list.end() )
797  {
798  this->physics_consistency_error( physics->first, heat_transfer );
799  }
800  }
801 
802  /* For BoussinesqBuoyancyAdjointStabilization, we'd better have IncompressibleNavierStokes */
803  if( physics->first == boussinesq_buoyancy_adjoint_stab )
804  {
805  if( physics_list.find(incompressible_navier_stokes) == physics_list.end() )
806  {
808  }
809  }
810 
811  /* For ReactingLowMachNavierStokes, there should be nothing else loaded, except
812  for stabilization. */
813  if( physics->first == reacting_low_mach_navier_stokes )
814  {
815  if( physics_list.size() > 2 )
816  {
817  std::cerr << "=======================================================" << std::endl
818  << "Error: For physics " << reacting_low_mach_navier_stokes << std::endl
819  << "only one stabilization physics is allowed. Detected the" << std::endl
820  << "following:" << std::endl;
821  for( GRINS::PhysicsListIter iter = physics_list.begin();
822  iter != physics_list.end();
823  iter++ )
824  {
825  std::cerr << physics->first << std::endl;
826  }
827  std::cerr << "=======================================================" << std::endl;
828  libmesh_error();
829  }
830  }
831  }
832 
833  return;
834  }
835 
836  void PhysicsFactory::physics_consistency_error( const std::string physics_checked,
837  const std::string physics_required ) const
838  {
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."
842  << std::endl;
843 
844  libmesh_error();
845 
846  return;
847  }
848 
849 } // namespace GRINS
Physics class for arbitrary scalar-valued ODEs.
Definition: scalar_ode.h:50
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.
Definition: var_typedefs.h:57
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.
Definition: var_typedefs.h:60
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)
GRINS namespace.
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 stokes
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

Generated on Mon Jun 22 2015 21:32:20 for GRINS-0.6.0 by  doxygen 1.8.9.1