https://mooseframework.inl.gov
FEProblemSolve.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 "FEProblemSolve.h"
11 
12 #include "FEProblem.h"
13 #include "NonlinearSystemBase.h"
14 #include "LinearSystem.h"
15 #include "Convergence.h"
16 #include "Executioner.h"
18 #include "MooseUtils.h"
19 
20 std::set<std::string> const FEProblemSolve::_moose_line_searches = {"contact", "project"};
21 
22 const std::set<std::string> &
24 {
25  return _moose_line_searches;
26 }
27 
30 {
32 
33  params.addParam<unsigned int>("nl_max_its", 50, "Max Nonlinear Iterations");
34  params.addParam<unsigned int>("nl_forced_its", 0, "The Number of Forced Nonlinear Iterations");
35  params.addParam<unsigned int>("nl_max_funcs", 10000, "Max Nonlinear solver function evaluations");
36  params.addParam<Real>("nl_abs_tol", 1.0e-50, "Nonlinear Absolute Tolerance");
37  params.addParam<Real>("nl_rel_tol", 1.0e-8, "Nonlinear Relative Tolerance");
38  params.addParam<Real>(
39  "nl_div_tol",
40  1.0e10,
41  "Nonlinear Relative Divergence Tolerance. A negative value disables this check.");
42  params.addParam<Real>(
43  "nl_abs_div_tol",
44  1.0e50,
45  "Nonlinear Absolute Divergence Tolerance. A negative value disables this check.");
46  params.addParam<Real>("nl_abs_step_tol", 0., "Nonlinear Absolute step Tolerance");
47  params.addParam<Real>("nl_rel_step_tol", 0., "Nonlinear Relative step Tolerance");
48  params.addParam<unsigned int>("n_max_nonlinear_pingpong",
49  100,
50  "The maximum number of times the nonlinear residual can ping pong "
51  "before requesting halting the current evaluation and requesting "
52  "timestep cut for transient simulations");
53 
54  params.addParamNamesToGroup(
55  "nl_max_its nl_forced_its nl_max_funcs nl_abs_tol nl_rel_tol "
56  "nl_rel_step_tol nl_abs_step_tol nl_div_tol nl_abs_div_tol n_max_nonlinear_pingpong",
57  "Nonlinear Solver");
58 
59  return params;
60 }
61 
64 {
67 
68  std::set<std::string> line_searches = mooseLineSearches();
69 
70  std::set<std::string> alias_line_searches = {"default", "none", "basic"};
71  line_searches.insert(alias_line_searches.begin(), alias_line_searches.end());
72  std::set<std::string> petsc_line_searches = Moose::PetscSupport::getPetscValidLineSearches();
73  line_searches.insert(petsc_line_searches.begin(), petsc_line_searches.end());
74  std::string line_search_string = Moose::stringify(line_searches, " ");
75  MooseEnum line_search(line_search_string, "default");
76  std::string addtl_doc_str(" (Note: none = basic)");
77  params.addParam<MooseEnum>(
78  "line_search", line_search, "Specifies the line search type" + addtl_doc_str);
79  MooseEnum line_search_package("petsc moose", "petsc");
80  params.addParam<MooseEnum>("line_search_package",
81  line_search_package,
82  "The solver package to use to conduct the line-search");
83 
84  params.addParam<unsigned>("contact_line_search_allowed_lambda_cuts",
85  2,
86  "The number of times lambda is allowed to be cut in half in the "
87  "contact line search. We recommend this number be roughly bounded by 0 "
88  "<= allowed_lambda_cuts <= 3");
89  params.addParam<Real>("contact_line_search_ltol",
90  "The linear relative tolerance to be used while the contact state is "
91  "changing between non-linear iterations. We recommend that this tolerance "
92  "be looser than the standard linear tolerance");
93 
95  params.addParam<Real>("l_tol", 1.0e-5, "Linear Relative Tolerance");
96  params.addParam<Real>("l_abs_tol", 1.0e-50, "Linear Absolute Tolerance");
97  params.addParam<unsigned int>("l_max_its", 10000, "Max Linear Iterations");
98  params.addParam<std::vector<ConvergenceName>>(
99  "nonlinear_convergence",
100  "Name of the Convergence object(s) to use to assess convergence of the "
101  "nonlinear system(s) solve. If not provided, the default Convergence "
102  "associated with the Problem will be constructed internally.");
103  params.addParam<std::vector<ConvergenceName>>(
104  "linear_convergence",
105  "Name of the Convergence object(s) to use to assess convergence of the "
106  "linear system(s) solve. If not provided, the linear solver tolerance parameters are used");
107  params.addParam<bool>(
108  "snesmf_reuse_base",
109  true,
110  "Specifies whether or not to reuse the base vector for matrix-free calculation");
111  params.addParam<bool>(
112  "skip_exception_check", false, "Specifies whether or not to skip exception check");
113  params.addParam<bool>(
114  "use_pre_SMO_residual",
115  false,
116  "Compute the pre-SMO residual norm and use it in the relative convergence check. The "
117  "pre-SMO residual is computed at the begining of the time step before solution-modifying "
118  "objects are executed. Solution-modifying objects include preset BCs, constraints, "
119  "predictors, etc.");
120  params.addParam<bool>("automatic_scaling", "Whether to use automatic scaling for the variables.");
121  params.addParam<std::vector<bool>>(
122  "compute_scaling_once",
123  {true},
124  "Whether the scaling factors should only be computed once at the beginning of the simulation "
125  "through an extra Jacobian evaluation. If this is set to false, then the scaling factors "
126  "will be computed during an extra Jacobian evaluation at the beginning of every time step. "
127  "Vector entries correspond to each nonlinear system.");
128  params.addParam<std::vector<bool>>(
129  "off_diagonals_in_auto_scaling",
130  {false},
131  "Whether to consider off-diagonals when determining automatic scaling factors. Vector "
132  "entries correspond to each nonlinear system.");
133  params.addRangeCheckedParam<std::vector<Real>>(
134  "resid_vs_jac_scaling_param",
135  {0},
136  "0<=resid_vs_jac_scaling_param<=1",
137  "A parameter that indicates the weighting of the residual vs the Jacobian in determining "
138  "variable scaling parameters. A value of 1 indicates pure residual-based scaling. A value of "
139  "0 indicates pure Jacobian-based scaling. Vector entries correspond to each nonlinear "
140  "system.");
141  params.addParam<std::vector<std::vector<std::vector<std::string>>>>(
142  "scaling_group_variables",
143  "Name of variables that are grouped together for determining scale factors. (Multiple "
144  "groups can be provided, separated by semicolon). Vector entries correspond to each "
145  "nonlinear system.");
146  params.addParam<std::vector<std::vector<std::string>>>(
147  "ignore_variables_for_autoscaling",
148  "List of variables that do not participate in autoscaling. Vector entries correspond to each "
149  "nonlinear system.");
150  params.addRangeCheckedParam<unsigned int>(
151  "num_grids",
152  1,
153  "num_grids>0",
154  "The number of grids to use for a grid sequencing algorithm. This includes the final grid, "
155  "so num_grids = 1 indicates just one solve in a time-step");
156  params.addParam<std::vector<bool>>("residual_and_jacobian_together",
157  {false},
158  "Whether to compute the residual and Jacobian together. "
159  "Vector entries correspond to each nonlinear system.");
160 
161  params.addParam<bool>("reuse_preconditioner",
162  false,
163  "If true reuse the previously calculated "
164  "preconditioner for the linearized "
165  "system across multiple solves "
166  "spanning nonlinear iterations and time steps. "
167  "The preconditioner resets as controlled by "
168  "reuse_preconditioner_max_linear_its");
169  params.addParam<unsigned int>("reuse_preconditioner_max_linear_its",
170  25,
171  "Reuse the previously calculated "
172  "preconditioner for the linear system "
173  "until the number of linear iterations "
174  "exceeds this number");
175 
176  params.addParamNamesToGroup("l_tol l_abs_tol l_max_its reuse_preconditioner "
177  "reuse_preconditioner_max_linear_its",
178  "Linear Solver");
179  params.addParamNamesToGroup(
180  "solve_type snesmf_reuse_base use_pre_SMO_residual "
181  "num_grids residual_and_jacobian_together nonlinear_convergence linear_convergence",
182  "Nonlinear Solver");
183  params.addParamNamesToGroup(
184  "automatic_scaling compute_scaling_once off_diagonals_in_auto_scaling "
185  "scaling_group_variables resid_vs_jac_scaling_param ignore_variables_for_autoscaling",
186  "Solver variable scaling");
187  params.addParamNamesToGroup("line_search line_search_package contact_line_search_ltol "
188  "contact_line_search_allowed_lambda_cuts",
189  "Solver line search");
190  params.addParamNamesToGroup("skip_exception_check", "Advanced");
191 
192  return params;
193 }
194 
197  _num_grid_steps(cast_int<unsigned int>(getParam<unsigned int>("num_grids") - 1))
198 {
199  if (_moose_line_searches.find(getParam<MooseEnum>("line_search").operator std::string()) !=
200  _moose_line_searches.end())
202 
203  auto set_solver_params = [this, &ex](const SolverSystem & sys)
204  {
205  const auto prefix = sys.prefix();
206  if (dynamic_cast<const LinearSystem *>(&sys))
210 
211  // Set solver parameter prefix and system number
212  auto & solver_params = _problem.solverParams(sys.number());
213  solver_params._prefix = prefix;
214  solver_params._solver_sys_num = sys.number();
215  };
216 
217  // Extract and store PETSc related settings on FEProblemBase
218  for (const auto * const sys : _systems)
219  set_solver_params(*sys);
220 
221  // Set linear solve parameters in the equation system
222  // Nonlinear solve parameters are added in the DefaultNonlinearConvergence
223  EquationSystems & es = _problem.es();
224  es.parameters.set<Real>("linear solver tolerance") = getParam<Real>("l_tol");
225  es.parameters.set<Real>("linear solver absolute tolerance") = getParam<Real>("l_abs_tol");
226  es.parameters.set<unsigned int>("linear solver maximum iterations") =
227  getParam<unsigned int>("l_max_its");
228  es.parameters.set<bool>("reuse preconditioner") = getParam<bool>("reuse_preconditioner");
229  es.parameters.set<unsigned int>("reuse preconditioner maximum linear iterations") =
230  getParam<unsigned int>("reuse_preconditioner_max_linear_its");
231 
232  // Transfer to the Problem misc nonlinear solve optimization parameters
233  _problem.setSNESMFReuseBase(getParam<bool>("snesmf_reuse_base"),
234  _pars.isParamSetByUser("snesmf_reuse_base"));
235  _problem.skipExceptionCheck(getParam<bool>("skip_exception_check"));
236 
237  if (isParamValid("nonlinear_convergence"))
238  {
240  mooseError("The selected problem does not allow 'nonlinear_convergence' to be set.");
242  getParam<std::vector<ConvergenceName>>("nonlinear_convergence"));
243  }
244  else
246  if (isParamValid("linear_convergence"))
247  {
248  if (_problem.numLinearSystems() == 0)
249  paramError(
250  "linear_convergence",
251  "Setting 'linear_convergence' is currently only possible for solving linear systems");
253  getParam<std::vector<ConvergenceName>>("linear_convergence"));
254  }
255 
256  // Check whether the user has explicitly requested automatic scaling and is using a solve type
257  // without a matrix. If so, then we warn them
258  if ((_pars.isParamSetByUser("automatic_scaling") && getParam<bool>("automatic_scaling")) &&
259  std::all_of(_systems.begin(),
260  _systems.end(),
261  [this](const auto & solver_sys)
262  { return _problem.solverParams(solver_sys->number())._type == Moose::ST_JFNK; }))
263  {
264  paramWarning("automatic_scaling",
265  "Automatic scaling isn't implemented for the case where you do not have a "
266  "preconditioning matrix. No scaling will be applied");
267  _problem.automaticScaling(false);
268  }
269  else
270  // Check to see whether automatic_scaling has been specified anywhere, including at the
271  // application level. No matter what: if we don't have a matrix, we don't do scaling
273  isParamValid("automatic_scaling")
274  ? getParam<bool>("automatic_scaling")
275  : (getMooseApp().defaultAutomaticScaling() &&
276  std::any_of(_systems.begin(),
277  _systems.end(),
278  [this](const auto & solver_sys)
279  {
280  return _problem.solverParams(solver_sys->number())._type !=
282  })));
283 
284  if (!_using_multi_sys_fp_iterations && isParamValid("multi_system_fixed_point_convergence"))
285  paramError("multi_system_fixed_point_convergence",
286  "Cannot set a convergence object for multi-system fixed point iterations if "
287  "'multi_system_fixed_point' is set to false");
288  if (_using_multi_sys_fp_iterations && !isParamValid("multi_system_fixed_point_convergence"))
289  paramError("multi_system_fixed_point_convergence",
290  "Must set a convergence object for multi-system fixed point iterations if using "
291  "multi-system fixed point iterations");
292 
293  // Set the same parameters to every nonlinear system by default
294  int i_nl_sys = -1;
295  for (const auto i_sys : index_range(_systems))
296  {
297  auto nl_ptr = dynamic_cast<NonlinearSystemBase *>(_systems[i_sys]);
298  // Linear systems have very different parameters at the moment
299  if (!nl_ptr)
300  continue;
301  auto & nl = *nl_ptr;
302  i_nl_sys++;
303 
304  nl.setPreSMOResidual(getParam<bool>("use_pre_SMO_residual"));
305 
306  const auto res_and_jac =
307  getParamFromNonlinearSystemVectorParam<bool>("residual_and_jacobian_together", i_nl_sys);
308  if (res_and_jac)
309  nl.residualAndJacobianTogether();
310 
311  // Automatic scaling parameters
312  nl.computeScalingOnce(
313  getParamFromNonlinearSystemVectorParam<bool>("compute_scaling_once", i_nl_sys));
314  nl.autoScalingParam(
315  getParamFromNonlinearSystemVectorParam<Real>("resid_vs_jac_scaling_param", i_nl_sys));
316  nl.offDiagonalsInAutoScaling(
317  getParamFromNonlinearSystemVectorParam<bool>("off_diagonals_in_auto_scaling", i_nl_sys));
318  if (isParamValid("scaling_group_variables"))
319  nl.scalingGroupVariables(
320  getParamFromNonlinearSystemVectorParam<std::vector<std::vector<std::string>>>(
321  "scaling_group_variables", i_nl_sys));
322  if (isParamValid("ignore_variables_for_autoscaling"))
323  {
324  // Before setting ignore_variables_for_autoscaling, check that they are not present in
325  // scaling_group_variables
326  if (isParamValid("scaling_group_variables"))
327  {
328  const auto & ignore_variables_for_autoscaling =
329  getParamFromNonlinearSystemVectorParam<std::vector<std::string>>(
330  "ignore_variables_for_autoscaling", i_nl_sys);
331  const auto & scaling_group_variables =
332  getParamFromNonlinearSystemVectorParam<std::vector<std::vector<std::string>>>(
333  "scaling_group_variables", i_nl_sys);
334  for (const auto & group : scaling_group_variables)
335  for (const auto & var_name : group)
336  if (std::find(ignore_variables_for_autoscaling.begin(),
337  ignore_variables_for_autoscaling.end(),
338  var_name) != ignore_variables_for_autoscaling.end())
339  paramError("ignore_variables_for_autoscaling",
340  "Variables cannot be in a scaling grouping and also be ignored");
341  }
342  nl.ignoreVariablesForAutoscaling(
343  getParamFromNonlinearSystemVectorParam<std::vector<std::string>>(
344  "ignore_variables_for_autoscaling", i_nl_sys));
345  }
346  }
347 
348  // Multi-grid options
350 }
351 
352 template <typename T>
353 T
355  unsigned int index) const
356 {
357  const auto & param_vec = getParam<std::vector<T>>(param_name);
358  if (index > _num_nl_systems)
359  paramError(param_name,
360  "Vector parameter is requested at index (" + std::to_string(index) +
361  ") which is larger than number of nonlinear systems (" +
362  std::to_string(_num_nl_systems) + ").");
363  if (param_vec.size() == 0)
364  paramError(
365  param_name,
366  "This parameter was passed to a routine which cannot handle empty vector parameters");
367  if (param_vec.size() != 1 && param_vec.size() != _num_nl_systems)
368  paramError(param_name,
369  "Vector parameter size (" + std::to_string(param_vec.size()) +
370  ") is different than the number of nonlinear systems (" +
371  std::to_string(_num_nl_systems) + ").");
372 
373  // User passed only one parameter, assume it applies to all nonlinear systems
374  if (param_vec.size() == 1)
375  return param_vec[0];
376  else
377  return param_vec[index];
378 }
379 
380 void
382 {
385  // Keep track of the solution warnings from the setup
386  // before a count reset at the beginning of the time step
387  if (!_app.isRecovering())
388  {
392  }
393 }
394 
395 void
397 {
398  // nonlinear
399  const auto conv_names = _problem.getNonlinearConvergenceNames();
400  for (const auto & conv_name : conv_names)
401  {
402  auto & conv = _problem.getConvergence(conv_name);
404  }
405 
406  // linear
407  if (isParamValid("linear_convergence"))
408  {
409  const auto conv_names = getParam<std::vector<ConvergenceName>>("linear_convergence");
410  for (const auto & conv_name : conv_names)
411  {
412  auto & conv = _problem.getConvergence(conv_name);
414  }
415  }
416 
417  // multisystem fixed point
418  if (isParamValid("multi_system_fixed_point_convergence"))
419  {
421  &_problem.getConvergence(getParam<ConvergenceName>("multi_system_fixed_point_convergence"));
424  }
425 }
426 
427 bool
429 {
430  // Outer loop for multi-grid convergence
431  bool converged = false;
432  unsigned int fp_iter = 0;
433 
434  for (MooseIndex(_num_grid_steps) grid_step = 0; grid_step <= _num_grid_steps; ++grid_step)
435  {
436  // Multi-system fixed point loop
437  fp_iter = 0;
438  converged = false;
439  while (!converged)
440  {
442  _console << COLOR_MAGENTA << "Multi-system fixed point iteration " << fp_iter << ":"
443  << COLOR_DEFAULT << "\n"
444  << std::endl;
445 
446  // Loop over each system
447  for (const auto sys_i : index_range(_systems))
448  {
449  auto * const sys = _systems[sys_i];
450  const bool is_nonlinear = (dynamic_cast<NonlinearSystemBase *>(sys) != nullptr);
451  const Real fp_relax =
453  const bool apply_fp_relax =
454  _using_multi_sys_fp_iterations && !MooseUtils::absoluteFuzzyEqual(fp_relax, 1.0);
455  if (apply_fp_relax)
456  {
457  sys->setFixedPointRelaxationFactor(fp_relax);
458  sys->saveOldSolutionForFixedPointRelaxation();
459  }
460 
461  // Call solve on the problem for that system
462  if (is_nonlinear)
463  _problem.solve(sys->number());
464  else
465  {
466  const auto linear_sys_number =
467  cast_int<unsigned int>(sys->number() - _problem.numNonlinearSystems());
468  _problem.solveLinearSystem(linear_sys_number, &_problem.getPetscOptions());
469  }
470 
471  // Check convergence
472  const auto solve_name =
473  _systems.size() == 1 ? " Solve" : "System " + sys->name() + ": Solve";
474  if (_problem.shouldSolve())
475  {
476  if (_problem.converged(sys->number()))
477  {
478  if (apply_fp_relax)
479  sys->applyFixedPointRelaxation();
480  _console << COLOR_GREEN << solve_name << " Converged!" << COLOR_DEFAULT << "\n"
481  << std::endl;
482  }
483  else
484  {
485  _console << COLOR_RED << solve_name << " Did NOT Converge!" << COLOR_DEFAULT << "\n"
486  << std::endl;
487  if (apply_fp_relax)
488  sys->clearFixedPointRelaxation();
489  return false;
490  }
491  }
492  else
493  _console << COLOR_GREEN << solve_name << " Skipped!" << COLOR_DEFAULT << "\n"
494  << std::endl;
495 
496  if (!is_nonlinear)
497  {
498  const auto linear_sys_number =
499  cast_int<unsigned int>(sys->number() - _problem.numNonlinearSystems());
500  auto & linear_sys = _problem.getLinearSystem(linear_sys_number);
501 
502  // This is for postprocessing purposes in case none of the objects request the gradients.
503  // TODO: Somehow collect information if the postprocessors need gradients and if nothing
504  // needs this, just skip it
505  linear_sys.computeGradients();
506  }
507 
508  if (apply_fp_relax)
509  sys->clearFixedPointRelaxation();
510  }
511 
512  // Assess convergence of the multi-system fixed point iteration
514  converged = true;
515  else
516  {
518 
519  // checkConvergence expects the number of iterations performed, not the iteration index:
520  const auto n_fp_iter = fp_iter + 1;
521  const auto convergence_status = _multi_sys_fp_convergence->checkConvergence(n_fp_iter);
522  converged = convergence_status == Convergence::MooseConvergenceStatus::CONVERGED;
523  if (convergence_status == Convergence::MooseConvergenceStatus::DIVERGED)
524  break;
525  }
526  fp_iter++;
527  }
528 
529  if (grid_step != _num_grid_steps)
531  }
532 
533  return converged;
534 }
const ExecFlagType EXEC_MULTISYSTEM_FIXED_POINT_CONVERGENCE
Definition: Moose.C:46
static InputParameters validParams()
bool shouldSolve() const
const std::vector< ConvergenceName > & getNonlinearConvergenceNames() const
Gets the nonlinear system convergence object name(s).
FEProblemBase & _problem
Reference to FEProblem.
Definition: SolveObject.h:47
Moose::PetscSupport::PetscOptions & getPetscOptions()
Retrieve a writable reference the PETSc options (used by PetscSupport)
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition: KokkosUtils.h:40
void accumulateTimeStepIntoTotalOccurences(const unsigned int timestep_index)
Pass the number of solution invalid occurrences from current timestep to cumulative timestep counter ...
const InputParameters & _pars
The object&#39;s parameters.
Definition: MooseBase.h:384
void paramError(const std::string &param, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
Definition: MooseBase.h:457
std::string _prefix
Definition: SolverParams.h:35
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
Definition: MooseBase.h:406
virtual std::size_t numNonlinearSystems() const override
std::set< std::string > getPetscValidLineSearches()
Returns the valid petsc line search options as a set of strings.
void accumulateIterationIntoTimeStepOccurences()
Pass the number of solution invalid occurrences from current iteration to cumulative counters...
static std::set< std::string > const _moose_line_searches
Moose provided line searches.
virtual bool onlyAllowDefaultNonlinearConvergence() const
Returns true if an error will result if the user supplies &#39;nonlinear_convergence&#39;.
virtual bool solve() override
Picard solve the FEProblem.
FEProblemSolve(Executioner &ex)
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
virtual void initialSetup()
Method that should be executed once, before any solve calls.
Definition: SolveObject.h:32
const unsigned int _num_grid_steps
The number of steps to perform in a grid sequencing algorithm.
virtual void solve(const unsigned int nl_sys_num)
MooseApp & getMooseApp() const
Get the MooseApp this class is associated with.
Definition: MooseBase.h:87
void computeGradients()
Compute and store raw and requested limited Green-Gauss gradients for linear FV variables.
InputParameters emptyInputParameters()
const bool _using_multi_sys_fp_iterations
Whether we are using fixed point iterations for multi-system.
Nonlinear system to be solved.
void skipExceptionCheck(bool skip_exception_check)
Set a flag that indicates if we want to skip exception and stop solve.
virtual void addLineSearch(const InputParameters &)
add a MOOSE line search
void setConvergedReasonFlags(FEProblemBase &fe_problem, std::string prefix)
Set flags that will instruct the user on the reason their simulation diverged from PETSc&#39;s perspectiv...
Definition: PetscSupport.C:804
virtual void execute(const ExecFlagType &exec_type)
Convenience function for performing execution of MOOSE systems.
void syncIteration()
Sync iteration counts to main processor Sum across all processors.
void uniformRefine()
uniformly refine the problem mesh(es).
void numGridSteps(unsigned int num_grid_steps)
Set the number of steps in a grid sequences.
Convergence * _multi_sys_fp_convergence
Convergence object to assess the convergence of the multi-system fixed point iteration.
virtual Convergence & getConvergence(const std::string &name, const THREAD_ID tid=0) const
Gets a Convergence object.
SolutionInvalidity & solutionInvalidity()
Get the SolutionInvalidity for this app.
Definition: MooseApp.h:185
Jacobian-Free Newton Krylov.
Definition: MooseTypes.h:894
virtual libMesh::EquationSystems & es() override
virtual MooseConvergenceStatus checkConvergence(unsigned int n_iter)=0
Returns convergence status.
virtual bool converged(const unsigned int sys_num)
Eventually we want to convert this virtual over to taking a solver system number argument.
Definition: SubProblem.h:113
static InputParameters feProblemDefaultConvergenceParams()
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:54
void setLinearConvergenceNames(const std::vector< ConvergenceName > &convergence_names)
Sets the linear convergence object name(s) if there is one.
Executioners are objects that do the actual work of solving your problem.
Definition: Executioner.h:30
virtual void checkIterationType(IterationType) const
Perform checks related to the iteration type.
Definition: Convergence.h:48
MooseApp & _app
The MOOSE application this is associated with.
Definition: MooseBase.h:375
void setNonlinearConvergenceNames(const std::vector< ConvergenceName > &convergence_names)
Sets the nonlinear convergence object name(s) if there is one.
static InputParameters validParams()
std::string stringify(const T &t)
conversion to string
Definition: Conversion.h:64
void setNeedToAddDefaultNonlinearConvergence()
Sets _need_to_add_default_nonlinear_convergence to true.
LinearSystem & getLinearSystem(unsigned int sys_num)
Get non-constant reference to a linear system.
bool isParamSetByUser(const std::string &name) const
Method returns true if the parameter was set by the user.
void dontAddCommonSNESOptions(FEProblemBase &fe_problem)
Function to ensure that common SNES options are not added to the PetscOptions storage object to be la...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
InputParameters getPetscValidParams()
Returns the PETSc options that are common between Executioners and Preconditioners.
T getParamFromNonlinearSystemVectorParam(const std::string &param_name, unsigned int index) const
Helper routine to get the nonlinear system parameter at the right index.
T & set(const std::string &)
unsigned int _num_nl_systems
Number of nonlinear systems.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
Definition: MooseBase.h:271
SolverParams & solverParams(unsigned int solver_sys_num=0)
Get the solver parameters.
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object...
void convergenceSetup()
Performs setup related to Convergence objects.
virtual std::size_t numLinearSystems() const override
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
Definition: MooseBase.h:199
const ConsoleStream _console
An instance of helper class to write streams to the Console objects.
void automaticScaling(bool automatic_scaling) override
Automatic scaling setter.
void paramWarning(const std::string &param, Args... args) const
void storePetscOptions(FEProblemBase &fe_problem, const std::string &prefix, const ParallelParamObject &param_object)
Stores the PETSc options supplied from the parameter object on the problem.
Definition: PetscSupport.C:677
void setSNESMFReuseBase(bool reuse, bool set_by_user)
If or not to reuse the base vector for matrix-free calculation.
virtual void solveLinearSystem(const unsigned int linear_sys_num, const Moose::PetscSupport::PetscOptions *po=nullptr)
Build and solve a linear system.
bool isRecovering() const
Whether or not this is a "recover" calculation.
Definition: MooseApp.C:1669
void ErrorVector unsigned int
auto index_range(const T &sizable)
const std::string & _type
The type of this class.
Definition: MooseBase.h:378
std::vector< SolverSystem * > _systems
Vector of pointers to the systems.
virtual void initialSetup() override
Method that should be executed once, before any solve calls.
void setPreSMOResidual(bool use)
Set whether to evaluate the pre-SMO residual and use it in the subsequent relative convergence checks...
Tnew cast_int(Told oldvar)
static const std::set< std::string > & mooseLineSearches()
std::vector< Real > _multi_sys_fp_relax_factors
Per-system relaxation factors for multi-system fixed point iterations (expanded to match the number/o...
A solve object for use when wanting to solve multiple systems.
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
This method takes a space delimited list of parameter names and adds them to the specified group name...