https://mooseframework.inl.gov
MooseStaticCondensationPreconditioner.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 
11 
12 #include "FEProblem.h"
13 #include "MooseUtils.h"
14 #include "NonlinearSystemBase.h"
15 #include "MooseVariableFieldBase.h"
16 #include "libmesh/implicit_system.h"
17 #include "libmesh/static_condensation.h"
18 
19 registerMooseObjectAliased("MooseApp", MooseStaticCondensationPreconditioner, "StaticCondensation");
20 
23 {
25  params.addClassDescription("Static condensation preconditioner");
26  params.set<bool>("full") = true;
27  params.suppressParameter<bool>("full");
28  params.addParam<std::vector<NonlinearVariableName>>(
29  "dont_condense_vars",
30  {},
31  "A list of variables for whom to not statically condense their degrees of freedom out of the "
32  "system. By default all degrees of freedom on element interiors are condensed out.");
33  // Need to make this non-defaulted so that isParamValid doesn't always return true
34  params.set<MooseEnum>("mffd_type") = "";
35  return params;
36 }
37 
39  const InputParameters & params)
41 {
42  auto check_param = [this](const auto & param_name)
43  {
44  if (isParamValid(param_name))
45  paramError(param_name,
46  "This class prefixes every PETSc option so that it applies to the condensed "
47  "system. Given that, there are multiple issues with setting '",
48  param_name,
49  "': 1) it applies to the nonlinear solver algorithm whereas the prefix this class "
50  "applies makes PETSc options conceptually applicable only to the linear solve of "
51  "the statically condensed system 2) these are singleton MOOSE-wrapped PETSc "
52  "options. Consequently even if having multiple prefixes for a system's nonlinear "
53  "solver options made sense, we don't support it. E.g. if you specify '",
54  param_name,
55  "' in both this object's block and the Executioner block, then there will be a "
56  "logical conflict");
57  };
58  check_param("mffd_type");
59  check_param("solve_type");
60 
61  // Now check the solve type set in the Executioner
63  mooseError(
64  "Static condensation preconditioning should use a PJFNK solve type. This is because it "
65  "provides a means to compute the action of the Jacobian on vectors, which we otherwise "
66  "would not have because when using static condensation, the Jacobian is never formed. Note "
67  "that actions of the Jacobian on a vector are necessary for things like: GMRES, printing "
68  "of linear residuals, or application of line searches like cubic backtracking. These "
69  "particular operations can be avoided by using '-ksp_type preonly', disabling printing of "
70  "linear residuals, and using the 'cp' or 'basic' line search.");
71 
72  auto * const implicit_sys = dynamic_cast<libMesh::ImplicitSystem *>(&_nl.system());
73  if (!implicit_sys)
74  mooseError("Static condensation can only be used with implicit systems");
75  implicit_sys->create_static_condensation();
76  auto & sc = implicit_sys->get_static_condensation();
77  std::unordered_set<unsigned int> uncondensed_vars;
78  for (auto & nl_var_name : getParam<std::vector<NonlinearVariableName>>("dont_condense_vars"))
79  uncondensed_vars.insert(_nl.getVariable(0, nl_var_name).number());
80  sc.dont_condense_vars(uncondensed_vars);
81 }
82 
83 void
85 {
86  Moose::PetscSupport::storePetscOptions(_fe_problem, "-" + _nl.name() + "_condensed_", *this);
87 }
NonlinearSystemBase & _nl
The nonlinear system whose linearization this preconditioner should be applied to.
virtual void initialSetup() override
Perform some setup tasks such as storing the PETSc options.
unsigned int number() const
Get variable number coming from libMesh.
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
FEProblemBase & _fe_problem
Subproblem this preconditioner is part of.
static InputParameters validParams()
void suppressParameter(const std::string &name)
This method suppresses an inherited parameter so that it isn&#39;t required or valid in the derived class...
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
virtual const std::string & name() const
Definition: SystemBase.C:1330
const std::string _type
The type of this class.
Definition: MooseBase.h:87
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33
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 ...
unsigned int number() const
Gets the number of this system.
Definition: SystemBase.C:1159
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
SolverParams & solverParams(unsigned int solver_sys_num=0)
Get the solver parameters.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump...
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...
Single matrix preconditioner.
Preconditioned Jacobian-Free Newton Krylov.
Definition: MooseTypes.h:844
registerMooseObjectAliased("MooseApp", MooseStaticCondensationPreconditioner, "StaticCondensation")
MooseVariableFieldBase & getVariable(THREAD_ID tid, const std::string &var_name) const
Gets a reference to a variable of with specified name.
Definition: SystemBase.C:89
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:588
MooseStaticCondensationPreconditioner(const InputParameters &params)
virtual libMesh::System & system() override
Get the reference to the libMesh system.