https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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"
16#include "libmesh/implicit_system.h"
17#include "libmesh/static_condensation_dof_map.h"
18
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
38std::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
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
92void
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
registerMooseObjectAliased("MooseApp", MooseStaticCondensationPreconditioner, "StaticCondensation")
SolverParams & solverParams(unsigned int solver_sys_num=0)
Get the solver parameters.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void suppressParameter(const std::string &name)
This method suppresses an inherited parameter so that it isn't required or valid in the derived class...
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 addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump.
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
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
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
Definition MooseBase.h:199
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition MooseEnum.h:55
FEProblemBase & _fe_problem
Subproblem this preconditioner is part of.
NonlinearSystemBase & _nl
The nonlinear system whose linearization this preconditioner should be applied to.
MooseStaticCondensationPreconditioner(const InputParameters &params)
libMesh::StaticCondensation * _sc_system_matrix
Pointer to the libMesh static condensation system matrix object.
libMesh::StaticCondensationDofMap * _sc_dof_map
Pointer to the libMesh static condensation dof map object.
virtual void initialSetup() override
Perform some setup tasks such as storing the PETSc options.
unsigned int number() const
Get variable number coming from libMesh.
virtual libMesh::System & system() override
Get the reference to the libMesh system.
Single matrix preconditioner.
static InputParameters validParams()
Moose::SolveType _type
MooseVariableFieldBase & getVariable(THREAD_ID tid, const std::string &var_name) const
Gets a reference to a variable of with specified name.
Definition SystemBase.C:91
unsigned int number() const
Gets the number of this system.
virtual const std::string & name() const
void dont_condense_vars(const std::unordered_set< unsigned int > &vars)
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.
@ ST_PJFNK
Preconditioned Jacobian-Free Newton Krylov.
Definition MooseTypes.h:898