https://mooseframework.inl.gov
SIMPLESolveBase.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "SIMPLESolveBase.h"
11 #include "FEProblem.h"
12 #include "SegregatedSolverUtils.h"
13 
16 {
18  params.addRequiredParam<UserObjectName>("rhie_chow_user_object", "The rhie-chow user-object");
19 
20  /*
21  * The names of the different systems in the segregated solver
22  */
23  params.addRequiredParam<std::vector<SolverSystemName>>(
24  "momentum_systems", "The solver system(s) for the momentum equation(s).");
25  params.addRequiredParam<SolverSystemName>("pressure_system",
26  "The solver system for the pressure equation.");
27  params.addParam<SolverSystemName>("energy_system", "The solver system for the energy equation.");
28  params.addParam<SolverSystemName>("solid_energy_system",
29  "The solver system for the solid energy equation.");
30  params.addParam<std::vector<SolverSystemName>>(
31  "passive_scalar_systems", {}, "The solver system for each scalar advection equation.");
32  params.addParam<std::vector<SolverSystemName>>(
33  "pm_radiation_systems",
34  {},
35  "The solver system for each participating media radiation equation.");
36  params.addParam<std::vector<SolverSystemName>>(
37  "turbulence_systems", {}, "The solver system for each surrogate turbulence equation.");
38 
39  /*
40  * Parameters to control the solution of the momentum equation
41  */
42 
43  params.addRangeCheckedParam<Real>(
44  "momentum_equation_relaxation",
45  1.0,
46  "0.0<momentum_equation_relaxation<=1.0",
47  "The relaxation which should be used for the momentum equation. (=1 for no relaxation, "
48  "diagonal dominance will still be enforced)");
49 
50  params.addParam<MultiMooseEnum>("momentum_petsc_options",
52  "Singleton PETSc options for the momentum equation");
53  params.addParam<MultiMooseEnum>("momentum_petsc_options_iname",
55  "Names of PETSc name/value pairs for the momentum equation");
56  params.addParam<std::vector<std::string>>(
57  "momentum_petsc_options_value",
58  "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\" for the "
59  "momentum equation");
60 
61  params.addRangeCheckedParam<Real>(
62  "momentum_absolute_tolerance",
63  1e-5,
64  "0.0<momentum_absolute_tolerance",
65  "The absolute tolerance on the normalized residual of the momentum equation.");
66 
67  params.addRangeCheckedParam<Real>("momentum_l_tol",
68  1e-5,
69  "0.0<=momentum_l_tol & momentum_l_tol<1.0",
70  "The relative tolerance on the normalized residual in the "
71  "linear solver of the momentum equation.");
72  params.addRangeCheckedParam<Real>("momentum_l_abs_tol",
73  1e-50,
74  "0.0<momentum_l_abs_tol",
75  "The absolute tolerance on the normalized residual in the "
76  "linear solver of the momentum equation.");
77  params.addParam<unsigned int>(
78  "momentum_l_max_its",
79  10000,
80  "The maximum allowed iterations in the linear solver of the momentum equation.");
81 
82  params.addParamNamesToGroup(
83  "momentum_equation_relaxation momentum_petsc_options momentum_petsc_options_iname "
84  "momentum_petsc_options_value momentum_petsc_options_value momentum_absolute_tolerance "
85  "momentum_l_tol momentum_l_abs_tol momentum_l_max_its momentum_systems",
86  "Momentum Equation");
87 
88  /*
89  * Parameters to control the solution of the pressure equation
90  */
91  params.addRangeCheckedParam<Real>(
92  "pressure_variable_relaxation",
93  1.0,
94  "0.0<pressure_variable_relaxation<=1.0",
95  "The relaxation which should be used for the pressure variable (=1 for no relaxation).");
96 
97  params.addParam<MultiMooseEnum>("pressure_petsc_options",
99  "Singleton PETSc options for the pressure equation");
100  params.addParam<MultiMooseEnum>("pressure_petsc_options_iname",
102  "Names of PETSc name/value pairs for the pressure equation");
103  params.addParam<std::vector<std::string>>(
104  "pressure_petsc_options_value",
105  "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\" for the "
106  "pressure equation");
107 
108  params.addRangeCheckedParam<Real>(
109  "pressure_absolute_tolerance",
110  1e-5,
111  "0.0<pressure_absolute_tolerance",
112  "The absolute tolerance on the normalized residual of the pressure equation.");
113 
114  params.addRangeCheckedParam<Real>("pressure_l_tol",
115  1e-5,
116  "0.0<=pressure_l_tol & pressure_l_tol<1.0",
117  "The relative tolerance on the normalized residual in the "
118  "linear solver of the pressure equation.");
119  params.addRangeCheckedParam<Real>("pressure_l_abs_tol",
120  1e-10,
121  "0.0<pressure_l_abs_tol",
122  "The absolute tolerance on the normalized residual in the "
123  "linear solver of the pressure equation.");
124  params.addParam<unsigned int>(
125  "pressure_l_max_its",
126  10000,
127  "The maximum allowed iterations in the linear solver of the pressure equation.");
128 
129  params.addParamNamesToGroup(
130  "pressure_variable_relaxation pressure_petsc_options pressure_petsc_options_iname "
131  "pressure_petsc_options_value pressure_petsc_options_value pressure_absolute_tolerance "
132  "pressure_l_tol pressure_l_abs_tol pressure_l_max_its pressure_system",
133  "Pressure Equation");
134 
135  /*
136  * Pressure pin parameters for enclosed flows
137  */
138 
139  params.addParam<bool>(
140  "pin_pressure", false, "If the pressure field needs to be pinned at a point.");
141  params.addParam<Real>(
142  "pressure_pin_value", 0.0, "The value which needs to be enforced for the pressure.");
143  params.addParam<Point>("pressure_pin_point", "The point where the pressure needs to be pinned.");
144 
145  params.addParamNamesToGroup("pin_pressure pressure_pin_value pressure_pin_point", "Pressure Pin");
146 
147  params.addParam<bool>(
148  "print_fields",
149  false,
150  "Use this to print the coupling and solution fields and matrices throughout the iteration.");
151 
152  /*
153  * Parameters to control the solution of the energy equation
154  */
155 
156  params.addRangeCheckedParam<Real>(
157  "energy_equation_relaxation",
158  1.0,
159  "0.0<energy_equation_relaxation<=1.0",
160  "The relaxation which should be used for the energy equation. (=1 for no relaxation, "
161  "diagonal dominance will still be enforced)");
162 
163  params.addParam<MultiMooseEnum>("energy_petsc_options",
165  "Singleton PETSc options for the energy equation");
166  params.addParam<MultiMooseEnum>("energy_petsc_options_iname",
168  "Names of PETSc name/value pairs for the energy equation");
169  params.addParam<std::vector<std::string>>(
170  "energy_petsc_options_value",
171  "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\" for the "
172  "energy equation");
173 
174  params.addRangeCheckedParam<Real>(
175  "energy_absolute_tolerance",
176  1e-5,
177  "0.0<energy_absolute_tolerance",
178  "The absolute tolerance on the normalized residual of the energy equation.");
179 
180  params.addRangeCheckedParam<Real>("energy_l_tol",
181  1e-5,
182  "0.0<=energy_l_tol & energy_l_tol<1.0",
183  "The relative tolerance on the normalized residual in the "
184  "linear solver of the energy equation.");
185  params.addRangeCheckedParam<Real>("energy_l_abs_tol",
186  1e-10,
187  "0.0<energy_l_abs_tol",
188  "The absolute tolerance on the normalized residual in the "
189  "linear solver of the energy equation.");
190  params.addRangeCheckedParam<unsigned int>(
191  "energy_l_max_its",
192  10000,
193  "0<energy_l_max_its",
194  "The maximum allowed iterations in the linear solver of the energy equation.");
195 
196  params.addParamNamesToGroup(
197  "energy_equation_relaxation energy_petsc_options energy_petsc_options_iname "
198  "energy_petsc_options_value energy_petsc_options_value energy_absolute_tolerance "
199  "energy_l_tol energy_l_abs_tol energy_l_max_its",
200  "Energy Equation");
201 
202  /*
203  * Parameters to control the solution of the solid energy equation
204  */
205 
206  params.addParam<MultiMooseEnum>("solid_energy_petsc_options",
208  "Singleton PETSc options for the solid energy equation");
209  params.addParam<MultiMooseEnum>("solid_energy_petsc_options_iname",
211  "Names of PETSc name/value pairs for the solid energy equation");
212  params.addParam<std::vector<std::string>>(
213  "solid_energy_petsc_options_value",
214  "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\" for the "
215  "solid energy equation");
216 
217  params.addRangeCheckedParam<Real>(
218  "solid_energy_absolute_tolerance",
219  1e-5,
220  "0.0<solid_energy_absolute_tolerance",
221  "The absolute tolerance on the normalized residual of the solid energy equation.");
222 
223  params.addRangeCheckedParam<Real>("solid_energy_l_tol",
224  1e-5,
225  "0.0<=solid_energy_l_tol & solid_energy_l_tol<1.0",
226  "The relative tolerance on the normalized residual in the "
227  "linear solver of the solid energy equation.");
228 
229  params.addRangeCheckedParam<Real>("solid_energy_l_abs_tol",
230  1e-10,
231  "0.0<solid_energy_l_abs_tol",
232  "The absolute tolerance on the normalized residual in the "
233  "linear solver of the solid energy equation.");
234  params.addRangeCheckedParam<unsigned int>(
235  "solid_energy_l_max_its",
236  10000,
237  "0<solid_energy_l_max_its",
238  "The maximum allowed iterations in the linear solver of the solid energy equation.");
239 
240  params.addParamNamesToGroup("solid_energy_petsc_options solid_energy_petsc_options_iname "
241  "solid_energy_petsc_options_value solid_energy_absolute_tolerance "
242  "solid_energy_l_tol solid_energy_l_abs_tol solid_energy_l_max_its",
243  "Solid Energy Equation");
244 
245  /*
246  * Parameters to control the solution of each scalar advection system
247  */
248  params.addParam<std::vector<Real>>("passive_scalar_equation_relaxation",
249  std::vector<Real>(),
250  "The relaxation which should be used for the passive scalar "
251  "equations. (=1 for no relaxation, "
252  "diagonal dominance will still be enforced)");
253 
254  params.addParam<MultiMooseEnum>("passive_scalar_petsc_options",
256  "Singleton PETSc options for the passive scalar equation(s)");
257  params.addParam<MultiMooseEnum>(
258  "passive_scalar_petsc_options_iname",
260  "Names of PETSc name/value pairs for the passive scalar equation(s)");
261  params.addParam<std::vector<std::string>>(
262  "passive_scalar_petsc_options_value",
263  "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\" for the "
264  "passive scalar equation(s)");
265  params.addParam<std::vector<Real>>(
266  "passive_scalar_absolute_tolerance",
267  std::vector<Real>(),
268  "The absolute tolerance(s) on the normalized residual(s) of the passive scalar equation(s).");
269  params.addRangeCheckedParam<Real>("passive_scalar_l_tol",
270  1e-5,
271  "0.0<=passive_scalar_l_tol & passive_scalar_l_tol<1.0",
272  "The relative tolerance on the normalized residual in the "
273  "linear solver of the passive scalar equation(s).");
274  params.addRangeCheckedParam<Real>("passive_scalar_l_abs_tol",
275  1e-10,
276  "0.0<passive_scalar_l_abs_tol",
277  "The absolute tolerance on the normalized residual in the "
278  "linear solver of the passive scalar equation(s).");
279  params.addParam<unsigned int>(
280  "passive_scalar_l_max_its",
281  10000,
282  "The maximum allowed iterations in the linear solver of the turbulence equation.");
283 
284  params.addParamNamesToGroup(
285  "passive_scalar_systems passive_scalar_equation_relaxation passive_scalar_petsc_options "
286  "passive_scalar_petsc_options_iname "
287  "passive_scalar_petsc_options_value passive_scalar_petsc_options_value "
288  "passive_scalar_absolute_tolerance "
289  "passive_scalar_l_tol passive_scalar_l_abs_tol passive_scalar_l_max_its",
290  "passive_scalar Equation");
291 
292  /*
293  * Parameters to control the solution of each participating media radiation equation
294  */
295  params.addParam<std::vector<Real>>(
296  "pm_radiation_equation_relaxation",
297  std::vector<Real>(),
298  "The relaxation which should be used for the participating media radiation "
299  "equations. (=1 for no relaxation, "
300  "diagonal dominance will still be enforced)");
301 
302  params.addParam<MultiMooseEnum>(
303  "pm_radiation_petsc_options",
305  "Singleton PETSc options for the participating media radiation equation(s)");
306  params.addParam<MultiMooseEnum>(
307  "pm_radiation_petsc_options_iname",
309  "Names of PETSc name/value pairs for the participating media radiation equation(s)");
310  params.addParam<std::vector<std::string>>(
311  "pm_radiation_petsc_options_value",
312  "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\" for the "
313  "participating media radiation equation(s)");
314  params.addParam<std::vector<Real>>("pm_radiation_absolute_tolerance",
315  std::vector<Real>(),
316  "The absolute tolerance(s) on the normalized residual(s) of "
317  "the participating media radiation equation(s).");
318  params.addRangeCheckedParam<Real>(
319  "pm_radiation_l_tol",
320  1e-5,
321  "0.0<=pm_radiation_l_tol & pm_radiation_l_tol<1.0",
322  "The relative tolerance on the normalized residual in the "
323  "linear solver of the participating media radiation equation(s).");
324  params.addRangeCheckedParam<Real>(
325  "pm_radiation_l_abs_tol",
326  1e-10,
327  "0.0<pm_radiation_l_abs_tol",
328  "The absolute tolerance on the normalized residual in the "
329  "linear solver of the participating media radiation equation(s).");
330  params.addParam<unsigned int>("pm_radiation_l_max_its",
331  10000,
332  "The maximum allowed iterations in the linear solver of the "
333  "participating media radiation equation.");
334 
335  params.addParamNamesToGroup(
336  "pm_radiation_systems pm_radiation_equation_relaxation pm_radiation_petsc_options "
337  "pm_radiation_petsc_options_iname "
338  "pm_radiation_petsc_options_value pm_radiation_petsc_options_value "
339  "pm_radiation_absolute_tolerance "
340  "pm_radiation_l_tol pm_radiation_l_abs_tol pm_radiation_l_max_its",
341  "Participating Medium Radiation Equation");
342 
343  /*
344  * Parameters to control the solution of each turbulence system
345  */
346  params.addParam<std::vector<Real>>("turbulence_equation_relaxation",
347  std::vector<Real>(),
348  "The relaxation which should be used for the turbulence "
349  "equations. (=1 for no relaxation, "
350  "diagonal dominance will still be enforced)");
351 
352  params.addParam<std::vector<Real>>("turbulence_field_relaxation",
353  std::vector<Real>(),
354  "The relaxation which should be used for the turbulence "
355  "fields.");
356 
357  params.addParam<std::vector<Real>>(
358  "turbulence_field_min_limit",
359  std::vector<Real>(),
360  "The lower limit imposed on turbulent quantities. The recommended value for robustness "
361  "is 1e-8. This is the imposed default if not set.");
362 
363  params.addParam<MultiMooseEnum>("turbulence_petsc_options",
365  "Singleton PETSc options for the turbulence equation(s)");
366  params.addParam<MultiMooseEnum>("turbulence_petsc_options_iname",
368  "Names of PETSc name/value pairs for the turbulence equation(s)");
369  params.addParam<std::vector<std::string>>(
370  "turbulence_petsc_options_value",
371  "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\" for the "
372  "turbulence equation(s)");
373  params.addParam<std::vector<Real>>(
374  "turbulence_absolute_tolerance",
375  std::vector<Real>(),
376  "The absolute tolerance(s) on the normalized residual(s) of the turbulence equation(s).");
377  params.addRangeCheckedParam<Real>("turbulence_l_tol",
378  1e-5,
379  "0.0<=turbulence_l_tol & turbulence_l_tol<1.0",
380  "The relative tolerance on the normalized residual in the "
381  "linear solver of the turbulence equation(s).");
382  params.addRangeCheckedParam<Real>("turbulence_l_abs_tol",
383  1e-10,
384  "0.0<turbulence_l_abs_tol",
385  "The absolute tolerance on the normalized residual in the "
386  "linear solver of the turbulence equation(s).");
387  params.addParam<unsigned int>(
388  "turbulence_l_max_its",
389  10000,
390  "The maximum allowed iterations in the linear solver of the turbulence equation.");
391 
392  params.addParamNamesToGroup("turbulence_systems "
393  "turbulence_equation_relaxation "
394  "turbulence_field_relaxation "
395  "turbulence_field_min_limit "
396  "turbulence_petsc_options "
397  "turbulence_petsc_options_iname "
398  "turbulence_petsc_options_value turbulence_petsc_options_value "
399  "turbulence_absolute_tolerance "
400  "turbulence_l_tol turbulence_l_abs_tol turbulence_l_max_its",
401  "Turbulence Equations");
402 
403  /*
404  * SIMPLE iteration control
405  */
406 
407  params.addRangeCheckedParam<unsigned int>(
408  "num_iterations",
409  1000,
410  "0<num_iterations",
411  "The number of momentum-pressure-(other fields) iterations needed.");
412 
413  params.addParam<bool>("continue_on_max_its",
414  false,
415  "If solve should continue if maximum number of iterations is hit.");
416 
417  return params;
418 }
419 
421  : SolveObject(ex),
422  UserObjectInterface(this),
423  _momentum_system_names(getParam<std::vector<SolverSystemName>>("momentum_systems")),
424  _momentum_l_abs_tol(getParam<Real>("momentum_l_abs_tol")),
425  _momentum_equation_relaxation(getParam<Real>("momentum_equation_relaxation")),
426  _pressure_system_name(getParam<SolverSystemName>("pressure_system")),
427  _pressure_l_abs_tol(getParam<Real>("pressure_l_abs_tol")),
428  _pressure_variable_relaxation(getParam<Real>("pressure_variable_relaxation")),
429  _pin_pressure(getParam<bool>("pin_pressure")),
430  _pressure_pin_value(getParam<Real>("pressure_pin_value")),
431  _pressure_pin_dof(libMesh::invalid_uint),
432  _has_energy_system(isParamValid("energy_system")),
433  _energy_equation_relaxation(getParam<Real>("energy_equation_relaxation")),
434  _energy_l_abs_tol(getParam<Real>("energy_l_abs_tol")),
435  _has_solid_energy_system(_has_energy_system && isParamValid("solid_energy_system")),
436  _solid_energy_l_abs_tol(getParam<Real>("solid_energy_l_abs_tol")),
437  _passive_scalar_system_names(getParam<std::vector<SolverSystemName>>("passive_scalar_systems")),
438  _has_passive_scalar_systems(!_passive_scalar_system_names.empty()),
439  _passive_scalar_equation_relaxation(
440  getParam<std::vector<Real>>("passive_scalar_equation_relaxation")),
441  _passive_scalar_l_abs_tol(getParam<Real>("passive_scalar_l_abs_tol")),
442  _pm_radiation_system_names(getParam<std::vector<SolverSystemName>>("pm_radiation_systems")),
443  _has_pm_radiation_systems(!_pm_radiation_system_names.empty()),
444  _pm_radiation_equation_relaxation(
445  getParam<std::vector<Real>>("pm_radiation_equation_relaxation")),
446  _pm_radiation_l_abs_tol(getParam<Real>("pm_radiation_l_abs_tol")),
447  _turbulence_system_names(getParam<std::vector<SolverSystemName>>("turbulence_systems")),
448  _has_turbulence_systems(!_turbulence_system_names.empty()),
449  _turbulence_equation_relaxation(getParam<std::vector<Real>>("turbulence_equation_relaxation")),
450  _turbulence_field_relaxation(getParam<std::vector<Real>>("turbulence_field_relaxation")),
451  _turbulence_field_min_limit(getParam<std::vector<Real>>("turbulence_field_min_limit")),
452  _turbulence_l_abs_tol(getParam<Real>("turbulence_l_abs_tol")),
453  _momentum_absolute_tolerance(getParam<Real>("momentum_absolute_tolerance")),
454  _pressure_absolute_tolerance(getParam<Real>("pressure_absolute_tolerance")),
455  _energy_absolute_tolerance(getParam<Real>("energy_absolute_tolerance")),
456  _solid_energy_absolute_tolerance(getParam<Real>("solid_energy_absolute_tolerance")),
457  _passive_scalar_absolute_tolerance(
458  getParam<std::vector<Real>>("passive_scalar_absolute_tolerance")),
459  _pm_radiation_absolute_tolerance(
460  getParam<std::vector<Real>>("pm_radiation_absolute_tolerance")),
461  _turbulence_absolute_tolerance(getParam<std::vector<Real>>("turbulence_absolute_tolerance")),
462  _num_iterations(getParam<unsigned int>("num_iterations")),
463  _continue_on_max_its(getParam<bool>("continue_on_max_its")),
464  _print_fields(getParam<bool>("print_fields"))
465 {
466  if (_momentum_system_names.size() != _problem.mesh().dimension())
467  paramError("momentum_systems",
468  "The number of momentum components should be equal to the number of "
469  "spatial dimensions on the mesh.");
470 
471  const auto & momentum_petsc_options = getParam<MultiMooseEnum>("momentum_petsc_options");
472  const auto & momentum_petsc_pair_options = getParam<MooseEnumItem, std::string>(
473  "momentum_petsc_options_iname", "momentum_petsc_options_value");
475  momentum_petsc_options, "", *this, _momentum_petsc_options);
477  momentum_petsc_pair_options, _problem.mesh().dimension(), "", *this, _momentum_petsc_options);
478 
479  _momentum_linear_control.real_valued_data["rel_tol"] = getParam<Real>("momentum_l_tol");
480  _momentum_linear_control.real_valued_data["abs_tol"] = getParam<Real>("momentum_l_abs_tol");
482  getParam<unsigned int>("momentum_l_max_its");
483 
484  const auto & pressure_petsc_options = getParam<MultiMooseEnum>("pressure_petsc_options");
485  const auto & pressure_petsc_pair_options = getParam<MooseEnumItem, std::string>(
486  "pressure_petsc_options_iname", "pressure_petsc_options_value");
488  pressure_petsc_options, "", *this, _pressure_petsc_options);
490  pressure_petsc_pair_options, _problem.mesh().dimension(), "", *this, _pressure_petsc_options);
491 
492  _pressure_linear_control.real_valued_data["rel_tol"] = getParam<Real>("pressure_l_tol");
493  _pressure_linear_control.real_valued_data["abs_tol"] = getParam<Real>("pressure_l_abs_tol");
495  getParam<unsigned int>("pressure_l_max_its");
496 
497  if (_has_energy_system)
498  {
499  const auto & energy_petsc_options = getParam<MultiMooseEnum>("energy_petsc_options");
500  const auto & energy_petsc_pair_options = getParam<MooseEnumItem, std::string>(
501  "energy_petsc_options_iname", "energy_petsc_options_value");
503  energy_petsc_options, "", *this, _energy_petsc_options);
505  energy_petsc_pair_options, _problem.mesh().dimension(), "", *this, _energy_petsc_options);
506 
507  _energy_linear_control.real_valued_data["rel_tol"] = getParam<Real>("energy_l_tol");
508  _energy_linear_control.real_valued_data["abs_tol"] = getParam<Real>("energy_l_abs_tol");
509  _energy_linear_control.int_valued_data["max_its"] = getParam<unsigned int>("energy_l_max_its");
510  }
511  else
512  checkDependentParameterError("energy_system",
513  {"energy_petsc_options",
514  "energy_petsc_options_iname",
515  "energy_petsc_options_value",
516  "energy_l_tol",
517  "energy_l_abs_tol",
518  "energy_l_max_its",
519  "energy_absolute_tolerance",
520  "energy_equation_relaxation"},
521  false);
522 
524  {
525  const auto & solid_energy_petsc_options =
526  getParam<MultiMooseEnum>("solid_energy_petsc_options");
527  const auto & solid_energy_petsc_pair_options = getParam<MooseEnumItem, std::string>(
528  "solid_energy_petsc_options_iname", "solid_energy_petsc_options_value");
530  solid_energy_petsc_options, "", *this, _solid_energy_petsc_options);
531  Moose::PetscSupport::addPetscPairsToPetscOptions(solid_energy_petsc_pair_options,
532  _problem.mesh().dimension(),
533  "",
534  *this,
536 
537  _solid_energy_linear_control.real_valued_data["rel_tol"] = getParam<Real>("solid_energy_l_tol");
539  getParam<Real>("solid_energy_l_abs_tol");
541  getParam<unsigned int>("solid_energy_l_max_its");
542  }
543  else
544  checkDependentParameterError("solid_energy_system",
545  {"solid_energy_petsc_options",
546  "solid_energy_petsc_options_iname",
547  "solid_energy_petsc_options_value",
548  "solid_energy_l_tol",
549  "solid_energy_l_abs_tol",
550  "solid_energy_l_max_its",
551  "solid_energy_absolute_tolerance",
552  "solid_energy_equation_relaxation"},
553  false);
554 
555  // We check for input errors with regards to the participating media radiation equations. At the
556  // same time, we set up the corresponding system numbers
558  {
560  paramError("pm_radiation_equation_relaxation",
561  "The number of equation relaxation parameters does not match the number of "
562  "participating media radiation equations!");
564  paramError("pm_radiation_absolute_tolerance",
565  "The number of absolute tolerances does not match the number of "
566  "participating media radiation equations!");
567  }
569  {
570  const auto & pm_radiation_petsc_options =
571  getParam<MultiMooseEnum>("pm_radiation_petsc_options");
572  const auto & pm_radiation_petsc_pair_options = getParam<MooseEnumItem, std::string>(
573  "pm_radiation_petsc_options_iname", "pm_radiation_petsc_options_value");
575  pm_radiation_petsc_options, "", *this, _pm_radiation_petsc_options);
576  Moose::PetscSupport::addPetscPairsToPetscOptions(pm_radiation_petsc_pair_options,
577  _problem.mesh().dimension(),
578  "",
579  *this,
581 
582  _pm_radiation_linear_control.real_valued_data["rel_tol"] = getParam<Real>("pm_radiation_l_tol");
584  getParam<Real>("pm_radiation_l_abs_tol");
586  getParam<unsigned int>("pm_radiation_l_max_its");
587  }
588  else
589  checkDependentParameterError("pm_radiation_systems",
590  {"pm_radiation_petsc_options",
591  "pm_radiation_petsc_options_iname",
592  "pm_radiation_petsc_options_value",
593  "pm_radiation_l_tol",
594  "pm_radiation_l_abs_tol",
595  "pm_radiation_l_max_its",
596  "pm_radiation_equation_relaxation",
597  "pm_radiation_absolute_tolerance"},
598  false);
599 
600  // We check for input errors with regards to the passive scalar equations. At the same time, we
601  // set up the corresponding system numbers
603  {
605  paramError("passive_scalar_equation_relaxation",
606  "The number of equation relaxation parameters does not match the number of "
607  "passive scalar equations!");
609  paramError("passive_scalar_absolute_tolerance",
610  "The number of absolute tolerances does not match the number of "
611  "passive scalar equations!");
612  }
614  {
615  const auto & passive_scalar_petsc_options =
616  getParam<MultiMooseEnum>("passive_scalar_petsc_options");
617  const auto & passive_scalar_petsc_pair_options = getParam<MooseEnumItem, std::string>(
618  "passive_scalar_petsc_options_iname", "passive_scalar_petsc_options_value");
620  passive_scalar_petsc_options, "", *this, _passive_scalar_petsc_options);
621  Moose::PetscSupport::addPetscPairsToPetscOptions(passive_scalar_petsc_pair_options,
622  _problem.mesh().dimension(),
623  "",
624  *this,
626 
628  getParam<Real>("passive_scalar_l_tol");
630  getParam<Real>("passive_scalar_l_abs_tol");
632  getParam<unsigned int>("passive_scalar_l_max_its");
633  }
634  else
635  checkDependentParameterError("passive_scalar_systems",
636  {"passive_scalar_petsc_options",
637  "passive_scalar_petsc_options_iname",
638  "passive_scalar_petsc_options_value",
639  "passive_scalar_l_tol",
640  "passive_scalar_l_abs_tol",
641  "passive_scalar_l_max_its",
642  "passive_scalar_equation_relaxation",
643  "passive_scalar_absolute_tolerance"},
644  false);
645 
646  // We check for input errors with regards to the surrogate turbulence equations. At the same time,
647  // we set up the corresponding system numbers
649  {
651  paramError("turbulence_equation_relaxation",
652  "The number of equation relaxation parameters does not match the number of "
653  "turbulence equations!");
655  paramError("turbulence_absolute_tolerance",
656  "The number of absolute tolerances does not match the number of "
657  "turbulence equations!");
658  if (_turbulence_field_min_limit.empty())
659  // If no minimum bounds are given, initialize to default value 1e-8
661 
662  // Assign turbulence field relaxation as 1.0 if not defined
663  if (_turbulence_field_relaxation.empty())
665 
666  const auto & turbulence_petsc_options = getParam<MultiMooseEnum>("turbulence_petsc_options");
667  const auto & turbulence_petsc_pair_options = getParam<MooseEnumItem, std::string>(
668  "turbulence_petsc_options_iname", "turbulence_petsc_options_value");
670  turbulence_petsc_options, "", *this, _turbulence_petsc_options);
671  Moose::PetscSupport::addPetscPairsToPetscOptions(turbulence_petsc_pair_options,
672  _problem.mesh().dimension(),
673  "",
674  *this,
676 
677  _turbulence_linear_control.real_valued_data["rel_tol"] = getParam<Real>("turbulence_l_tol");
678  _turbulence_linear_control.real_valued_data["abs_tol"] = getParam<Real>("turbulence_l_abs_tol");
680  getParam<unsigned int>("turbulence_l_max_its");
681  }
682  else
683  checkDependentParameterError("turbulence_systems",
684  {"turbulence_petsc_options",
685  "turbulence_petsc_options_iname",
686  "turbulence_petsc_options_value",
687  "turbulence_l_tol",
688  "turbulence_l_abs_tol",
689  "turbulence_l_max_its",
690  "turbulence_equation_relaxation",
691  "turbulence_field_relaxation",
692  "turbulence_field_min_limit",
693  "turbulence_absolute_tolerance"},
694  false);
695 }
696 
697 void
699 {
700  if (_pin_pressure)
702  _problem.mesh(),
703  getParam<Point>("pressure_pin_point"));
704 }
705 
706 void
707 SIMPLESolveBase::checkDependentParameterError(const std::string & main_parameter,
708  const std::vector<std::string> & dependent_parameters,
709  const bool should_be_defined)
710 {
711  for (const auto & param : dependent_parameters)
712  if (parameters().isParamSetByUser(param) == !should_be_defined)
713  paramError(param,
714  "This parameter should " + std::string(should_be_defined ? "" : "not") +
715  " be given by the user with the corresponding " + main_parameter +
716  " setting!");
717 }
MultiMooseEnum getCommonPetscKeys()
FEProblemBase & _problem
SIMPLESolverConfiguration _momentum_linear_control
Options for the linear solver of the momentum equation.
void addPetscFlagsToPetscOptions(const MultiMooseEnum &petsc_flags, std::string prefix, const ParallelParamObject &param_object, PetscOptions &petsc_options)
SIMPLESolverConfiguration _turbulence_linear_control
Options for the linear solver of the turbulence equation(s)
SIMPLESolverConfiguration _energy_linear_control
Options for the linear solver of the energy equation.
const unsigned int invalid_uint
void paramError(const std::string &param, Args... args) const
Moose::PetscSupport::PetscOptions _turbulence_petsc_options
Options which hold the petsc settings for the turbulence equation(s)
SIMPLESolverConfiguration _pm_radiation_linear_control
Options for the linear solver of the participating media radiation equation(s)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const bool _has_energy_system
Boolean for easy check if a fluid energy system shall be solved or not.
void addPetscPairsToPetscOptions(const std::vector< std::pair< MooseEnumItem, std::string >> &petsc_pair_options, const unsigned int mesh_dimension, std::string prefix, const ParallelParamObject &param_object, PetscOptions &petsc_options)
std::vector< Real > _turbulence_field_relaxation
The user-defined relaxation parameter(s) for the turbulence field(s)
Moose::PetscSupport::PetscOptions _solid_energy_petsc_options
Options which hold the petsc settings for the fluid energy equation.
const InputParameters & parameters() const
const bool _has_turbulence_systems
Boolean for easy check if a turbulence scalar systems shall be solved or not.
void checkDependentParameterError(const std::string &main_parameter, const std::vector< std::string > &dependent_parameters, const bool should_be_defined)
static InputParameters validParams()
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
std::map< std::string, Real > real_valued_data
void addRequiredParam(const std::string &name, const std::string &doc_string)
virtual const MooseVariableFieldBase & getVariable(const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type=Moose::VarKindType::VAR_ANY, Moose::VarFieldType expected_var_field_type=Moose::VarFieldType::VAR_FIELD_ANY) const override
InputParameters emptyInputParameters()
const std::vector< SolverSystemName > & _pm_radiation_system_names
The names of the participating media radiation systems.
const std::vector< SolverSystemName > & _passive_scalar_system_names
The names of the passive scalar systems.
SIMPLESolverConfiguration _passive_scalar_linear_control
Options for the linear solver of the passive scalar equation(s)
Moose::PetscSupport::PetscOptions _energy_petsc_options
Options which hold the petsc settings for the fluid energy equation.
SIMPLESolverConfiguration _pressure_linear_control
Options for the linear solver of the pressure equation.
MultiMooseEnum getCommonPetscFlags()
const bool _has_pm_radiation_systems
Boolean for easy check if participating media radiation systems shall be solved or not...
Moose::PetscSupport::PetscOptions _passive_scalar_petsc_options
Options which hold the petsc settings for the passive scalar equation(s)
virtual unsigned int dimension() const
std::map< std::string, int > int_valued_data
Moose::PetscSupport::PetscOptions _momentum_petsc_options
Options which hold the petsc settings for the momentum equation.
const std::vector< Real > _passive_scalar_absolute_tolerance
The user-defined absolute tolerance for determining the convergence in passive scalars.
dof_id_type _pressure_pin_dof
The dof ID where the pressure needs to be pinned.
const std::vector< SolverSystemName > & _turbulence_system_names
The names of the turbulence systems.
const std::vector< Real > _pm_radiation_equation_relaxation
The user-defined relaxation parameter(s) for the participating media radiation equation(s) ...
const bool _pin_pressure
If the pressure needs to be pinned.
const std::vector< Real > _pm_radiation_absolute_tolerance
The user-defined absolute tolerance for determining the convergence in participating media radiation...
dof_id_type findPointDoFID(const MooseVariableFieldBase &variable, const MooseMesh &mesh, const Point &point)
Find the ID of the degree of freedom which corresponds to the variable and a given point on the mesh...
const std::vector< Real > _turbulence_equation_relaxation
The user-defined relaxation parameter(s) for the turbulence equation(s)
const std::vector< SolverSystemName > & _momentum_system_names
The names of the momentum systems.
const std::vector< Real > _passive_scalar_equation_relaxation
The user-defined relaxation parameter(s) for the passive scalar equation(s)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
SIMPLESolveBase(Executioner &ex)
virtual MooseMesh & mesh() override
const bool _has_passive_scalar_systems
Boolean for easy check if a passive scalar systems shall be solved or not.
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
SIMPLESolverConfiguration _solid_energy_linear_control
Options for the linear solver of the energy equation.
Moose::PetscSupport::PetscOptions _pm_radiation_petsc_options
Options which hold the petsc settings for the participating media radiation equation(s) ...
std::vector< Real > _turbulence_field_min_limit
The user-defined lower limit for turbulent quantities e.g. k, eps/omega, etc..
bool isParamSetByUser(const std::string &name) const
const std::vector< Real > _turbulence_absolute_tolerance
The user-defined absolute tolerance for determining the convergence turbulence variables.
void setupPressurePin()
Setup pressure pin if there is need for one.
void ErrorVector unsigned int
Moose::PetscSupport::PetscOptions _pressure_petsc_options
Options which hold the petsc settings for the pressure equation.
const bool _has_solid_energy_system
Boolean for easy check if a solid energy system shall be solved or not.
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)