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_dof_map.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 
38 std::string
40 {
41  // We always prefix the condensed system with the nonlinear system name regardless of the number
42  // of systems in the problem. Maybe we'll change this later for more consistency?
43  return _nl.name() + "_condensed_";
44 }
45 
47  const InputParameters & params)
49 {
50  auto check_param = [this](const auto & param_name)
51  {
52  if (isParamValid(param_name))
53  paramError(param_name,
54  "This class prefixes every PETSc option so that it applies to the condensed "
55  "system. Given that, there are multiple issues with setting '",
56  param_name,
57  "': 1) it applies to the nonlinear solver algorithm whereas the prefix this class "
58  "applies makes PETSc options conceptually applicable only to the linear solve of "
59  "the statically condensed system 2) these are singleton MOOSE-wrapped PETSc "
60  "options. Consequently even if having multiple prefixes for a system's nonlinear "
61  "solver options made sense, we don't support it. E.g. if you specify '",
62  param_name,
63  "' in both this object's block and the Executioner block, then there will be a "
64  "logical conflict");
65  };
66  check_param("mffd_type");
67  check_param("solve_type");
68 
69  // Now check the solve type set in the Executioner
71  mooseError(
72  "Static condensation preconditioning should use a PJFNK solve type. This is because it "
73  "provides a means to compute the action of the Jacobian on vectors, which we otherwise "
74  "would not have because when using static condensation, the Jacobian is never formed. Note "
75  "that actions of the Jacobian on a vector are necessary for things like: GMRES, printing "
76  "of linear residuals, or application of line searches like cubic backtracking. These "
77  "particular operations can be avoided by using '-ksp_type preonly', disabling printing of "
78  "linear residuals, and using the 'cp' or 'basic' line search.");
79 
80  auto * const implicit_sys = dynamic_cast<libMesh::ImplicitSystem *>(&_nl.system());
81  if (!implicit_sys)
82  mooseError("Static condensation can only be used with implicit systems");
83  implicit_sys->create_static_condensation();
84  _sc_dof_map = &implicit_sys->get_dof_map().get_static_condensation();
85  _sc_system_matrix = &implicit_sys->get_static_condensation();
86  std::unordered_set<unsigned int> uncondensed_vars;
87  for (auto & nl_var_name : getParam<std::vector<NonlinearVariableName>>("dont_condense_vars"))
88  uncondensed_vars.insert(_nl.getVariable(0, nl_var_name).number());
89  _sc_dof_map->dont_condense_vars(uncondensed_vars);
90 }
91 
92 void
94 {
96 }
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.
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:435
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
Definition: MooseBase.h:384
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()
libMesh::StaticCondensationDofMap * _sc_dof_map
Pointer to the libMesh static condensation dof map object.
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...
virtual const std::string & name() const
Definition: SystemBase.C:1332
void dont_condense_vars(const std::unordered_set< unsigned int > &vars)
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33
unsigned int number() const
Gets the number of this system.
Definition: SystemBase.C:1149
libMesh::StaticCondensation * _sc_system_matrix
Pointer to the libMesh static condensation system matrix object.
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:267
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:845
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
Definition: MooseBase.h:195
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:90
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:545
MooseStaticCondensationPreconditioner(const InputParameters &params)
const std::string & _type
The type of this class.
Definition: MooseBase.h:356
virtual libMesh::System & system() override
Get the reference to the libMesh system.