www.mooseframework.org
FiniteDifferencePreconditioner.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 // MOOSE includes
13 #include "FEProblem.h"
14 #include "MooseVariableFE.h"
15 #include "NonlinearSystem.h"
16 
17 #include "libmesh/coupling_matrix.h"
18 
20 
22 
25 {
27 
28  params.addParam<std::vector<std::string>>(
29  "off_diag_row",
30  "The off diagonal row you want to add into the matrix, it will be associated "
31  "with an off diagonal column from the same position in off_diag_colum.");
32  params.addParam<std::vector<std::string>>("off_diag_column",
33  "The off diagonal column you want to add into the "
34  "matrix, it will be associated with an off diagonal "
35  "row from the same position in off_diag_row.");
36  params.addParam<bool>("full",
37  false,
38  "Set to true if you want the full set of couplings. Simply "
39  "for convenience so you don't have to set every "
40  "off_diag_row and off_diag_column combination.");
41  params.addParam<bool>("implicit_geometric_coupling",
42  false,
43  "Set to true if you want to add entries into the "
44  "matrix for degrees of freedom that might be coupled "
45  "by inspection of the geometric search objects.");
46 
47  MooseEnum finite_difference_type("standard coloring", "coloring");
48  params.addParam<MooseEnum>("finite_difference_type",
49  finite_difference_type,
50  "standard: standard finite difference"
51  "coloring: finite difference based on coloring");
52 
53  return params;
54 }
55 
57  : MoosePreconditioner(params),
58  _finite_difference_type(getParam<MooseEnum>("finite_difference_type"))
59 {
60  if (n_processors() > 1)
61  mooseWarning("Finite differencing to assemble the Jacobian is MUCH MUCH slower than forming "
62  "the Jacobian by hand, so don't complain about performance if you use it!");
63 
65  unsigned int n_vars = nl.nVariables();
66 
67  std::unique_ptr<CouplingMatrix> cm = libmesh_make_unique<CouplingMatrix>(n_vars);
68 
69  bool full = getParam<bool>("full");
70 
71  // standard finite difference method will add off-diagonal entries
72  if (_finite_difference_type == "standard")
73  full = true;
74 
75  if (!full)
76  {
77  // put 1s on diagonal
78  for (unsigned int i = 0; i < n_vars; i++)
79  (*cm)(i, i) = 1;
80 
81  // off-diagonal entries
82  std::vector<std::vector<unsigned int>> off_diag(n_vars);
83  for (unsigned int i = 0; i < getParam<std::vector<std::string>>("off_diag_row").size(); i++)
84  {
85  unsigned int row =
86  nl.getVariable(0, getParam<std::vector<std::string>>("off_diag_row")[i]).number();
87  unsigned int column =
88  nl.getVariable(0, getParam<std::vector<std::string>>("off_diag_column")[i]).number();
89  (*cm)(row, column) = 1;
90  }
91 
92  // TODO: handle coupling entries between NL-vars and SCALAR-vars
93  }
94  else
95  {
96  for (unsigned int i = 0; i < n_vars; i++)
97  for (unsigned int j = 0; j < n_vars; j++)
98  (*cm)(i, j) = 1;
99  }
100 
101  _fe_problem.setCouplingMatrix(std::move(cm));
102 
103  bool implicit_geometric_coupling = getParam<bool>("implicit_geometric_coupling");
104 
105  nl.addImplicitGeometricCouplingEntriesToJacobian(implicit_geometric_coupling);
106 
107  // Set the jacobian to null so that libMesh won't override our finite differenced jacobian
109 }
SystemBase::getVariable
MooseVariableFEBase & getVariable(THREAD_ID tid, const std::string &var_name)
Gets a reference to a variable of with specified name.
Definition: SystemBase.C:109
MoosePreconditioner::validParams
static InputParameters validParams()
Definition: MoosePreconditioner.C:21
FEProblem.h
FiniteDifferencePreconditioner::FiniteDifferencePreconditioner
FiniteDifferencePreconditioner(const InputParameters &params)
Definition: FiniteDifferencePreconditioner.C:56
FiniteDifferencePreconditioner::validParams
static InputParameters validParams()
Definition: FiniteDifferencePreconditioner.C:24
MoosePreconditioner::_fe_problem
FEProblemBase & _fe_problem
Subproblem this preconditioner is part of.
Definition: MoosePreconditioner.h:56
nl
NonlinearSystemBase * nl
Definition: PetscDMMoose.C:1267
MooseEnum
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:31
registerMooseObjectAliased
registerMooseObjectAliased("MooseApp", FiniteDifferencePreconditioner, "FDP")
FiniteDifferencePreconditioner
Finite difference preconditioner.
Definition: FiniteDifferencePreconditioner.h:23
InputParameters::addParam
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an option parameter and a documentation string to the InputParameters object.
Definition: InputParameters.h:1198
MoosePreconditioner
Base class for MOOSE preconditioners.
Definition: MoosePreconditioner.h:34
SystemBase::nVariables
virtual unsigned int nVariables() const
Get the number of variables in this system.
Definition: SystemBase.C:734
InputParameters
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
Definition: InputParameters.h:53
defineLegacyParams
defineLegacyParams(FiniteDifferencePreconditioner)
NonlinearSystem.h
MooseVariableFE.h
FiniteDifferencePreconditioner.h
FiniteDifferencePreconditioner::_finite_difference_type
MooseEnum _finite_difference_type
Definition: FiniteDifferencePreconditioner.h:32
NonlinearSystemBase::addImplicitGeometricCouplingEntriesToJacobian
void addImplicitGeometricCouplingEntriesToJacobian(bool add=true)
If called with true this will add entries into the jacobian to link together degrees of freedom that ...
Definition: NonlinearSystemBase.h:454
NonlinearSystemBase::useFiniteDifferencedPreconditioner
void useFiniteDifferencedPreconditioner(bool use=true)
If called with true this system will use a finite differenced form of the Jacobian as the preconditio...
Definition: NonlinearSystemBase.h:429
FEProblemBase::getNonlinearSystemBase
NonlinearSystemBase & getNonlinearSystemBase()
Definition: FEProblemBase.h:560
FEProblemBase::setCouplingMatrix
void setCouplingMatrix(std::unique_ptr< CouplingMatrix > cm)
Set custom coupling matrix.
Definition: FEProblemBase.C:4462
NonlinearSystemBase
Nonlinear system to be solved.
Definition: NonlinearSystemBase.h:61
MooseObject::mooseWarning
void mooseWarning(Args &&... args) const
Definition: MooseObject.h:150
MooseVariableBase::number
unsigned int number() const
Get variable number coming from libMesh.
Definition: MooseVariableBase.h:48