lduMatrixPreconditioner.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2016 OpenFOAM Foundation
9  Copyright (C) 2019-2021 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 \*---------------------------------------------------------------------------*/
28 
29 #include "lduMatrix.H"
30 
31 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
32 
33 namespace Foam
34 {
35  defineRunTimeSelectionTable(lduMatrix::preconditioner, symMatrix);
37 }
38 
39 
40 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
41 
43 (
44  const dictionary& solverControls
45 )
46 {
47  word name;
48 
49  // Handle primitive or dictionary entry
50  const entry& e =
51  solverControls.lookupEntry("preconditioner", keyType::LITERAL);
52 
53  if (e.isDict())
54  {
55  e.dict().readEntry("preconditioner", name);
56  }
57  else
58  {
59  e.stream() >> name;
60  }
61 
62  return name;
63 }
64 
65 
68 (
69  const solver& sol,
70  const dictionary& solverControls
71 )
72 {
73  word name;
74 
75  // Handle primitive or dictionary entry
76 
77  const entry& e =
78  solverControls.lookupEntry("preconditioner", keyType::LITERAL);
79 
80  if (e.isDict())
81  {
82  e.dict().readEntry("preconditioner", name);
83  }
84  else
85  {
86  e.stream() >> name;
87  }
88 
89  const dictionary& controls = e.isDict() ? e.dict() : dictionary::null;
90 
91  if (sol.matrix().symmetric())
92  {
93  auto* ctorPtr = symMatrixConstructorTable(name);
94 
95  if (!ctorPtr)
96  {
98  (
99  controls,
100  "symmetric matrix preconditioner",
101  name,
102  *symMatrixConstructorTablePtr_
103  ) << exit(FatalIOError);
104  }
105 
106  return autoPtr<lduMatrix::preconditioner>
107  (
108  ctorPtr
109  (
110  sol,
111  controls
112  )
113  );
114  }
115  else if (sol.matrix().asymmetric())
116  {
117  auto* ctorPtr = asymMatrixConstructorTable(name);
118 
119  if (!ctorPtr)
120  {
122  (
123  controls,
124  "asymmetric matrix preconditioner",
125  name,
126  *asymMatrixConstructorTablePtr_
127  ) << exit(FatalIOError);
128  }
129 
130  return autoPtr<lduMatrix::preconditioner>
131  (
132  ctorPtr
133  (
134  sol,
135  controls
136  )
137  );
138  }
139 
140  FatalIOErrorInFunction(controls)
141  << "cannot solve incomplete matrix, "
142  "no diagonal or off-diagonal coefficient"
143  << exit(FatalIOError);
144 
145  return nullptr;
146 }
147 
148 
149 // ************************************************************************* //
bool symmetric() const noexcept
Definition: lduMatrix.H:786
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:125
A list of keyword definitions, which are a keyword followed by a number of values (eg...
Definition: dictionary.H:129
const lduMatrix & matrix() const noexcept
Definition: lduMatrix.H:306
const entry & lookupEntry(const word &keyword, enum keyType::option matchOpt) const
Search for an entry (const access) with the given keyword.
Definition: dictionary.C:347
const dimensionedScalar e
Elementary charge.
Definition: createFields.H:11
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
Definition: exprTraits.C:127
A class for handling words, derived from Foam::string.
Definition: word.H:63
static autoPtr< preconditioner > New(const solver &sol, const dictionary &solverControls)
Return a new preconditioner.
Abstract base-class for lduMatrix solvers.
Definition: lduMatrix.H:129
static const dictionary null
An empty dictionary, which is also the parent for all dictionaries.
Definition: dictionary.H:474
String literal.
Definition: keyType.H:82
bool asymmetric() const noexcept
Definition: lduMatrix.H:791
defineRunTimeSelectionTable(reactionRateFlameArea, dictionary)
Abstract base-class for lduMatrix preconditioners.
Definition: lduMatrix.H:549
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Definition: error.H:627
static word getName(const dictionary &)
Find the preconditioner name (directly or from a sub-dictionary)
#define FatalIOErrorInLookup(ios, lookupTag, lookupName, lookupTable)
Report an error message using Foam::FatalIOError.
Definition: error.H:635
Namespace for OpenFOAM.
A keyword and a list of tokens is an &#39;entry&#39;.
Definition: entry.H:63
IOerror FatalIOError
Error stream (stdout output on all processes), with additional &#39;FOAM FATAL IO ERROR&#39; header text and ...