Ifpack Package Browser (Single Doxygen Collection)
Development
Toggle main menu visibility
Loading...
Searching...
No Matches
src
Ifpack_DynamicFactory.cpp
Go to the documentation of this file.
1
/*@HEADER
2
// ***********************************************************************
3
//
4
// Ifpack: Object-Oriented Algebraic Preconditioner Package
5
// Copyright (2002) Sandia Corporation
6
//
7
// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8
// license for use of this work by or on behalf of the U.S. Government.
9
//
10
// This library is free software; you can redistribute it and/or modify
11
// it under the terms of the GNU Lesser General Public License as
12
// published by the Free Software Foundation; either version 2.1 of the
13
// License, or (at your option) any later version.
14
//
15
// This library is distributed in the hope that it will be useful, but
16
// WITHOUT ANY WARRANTY; without even the implied warranty of
17
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18
// Lesser General Public License for more details.
19
//
20
// You should have received a copy of the GNU Lesser General Public
21
// License along with this library; if not, write to the Free Software
22
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
23
// USA
24
// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
25
//
26
// ***********************************************************************
27
//@HEADER
28
*/
29
30
#include "
Ifpack_ConfigDefs.h
"
31
#include "
Ifpack_DynamicFactory.h
"
32
#include "
Ifpack_Preconditioner.h
"
33
#include "
Ifpack_PointRelaxation.h
"
34
#include "
Ifpack_BlockRelaxation.h
"
35
#include "
Ifpack_IC.h
"
36
#include "
Ifpack_ICT.h
"
37
#include "
Ifpack_ILU.h
"
38
#include "
Ifpack_ILUT.h
"
39
#include "
Ifpack_SPARSKIT.h
"
40
#include "
Ifpack_AdditiveSchwarz.h
"
41
#include "
Ifpack_DenseContainer.h
"
42
#include "
Ifpack_SparseContainer.h
"
43
#ifdef HAVE_IFPACK_AMESOS
44
#include "
Ifpack_Amesos.h
"
45
#endif
46
#ifdef HAVE_IFPACK_HIPS
47
#include "
Ifpack_HIPS.h
"
48
#endif
49
#ifdef HAVE_IFPACK_SUPERLU
50
#include "
Ifpack_SILU.h
"
51
#endif
52
53
#include "
Ifpack_Chebyshev.h
"
54
#include "
Ifpack_IHSS.h
"
55
#include "
Ifpack_SORa.h
"
56
57
#include "Teuchos_StringToIntMap.hpp"
58
#include "
Epetra_CrsMatrix.h
"
59
60
std::map<std::string, Ifpack_DynamicFactory::builderFunction>
61
Ifpack_DynamicFactory::PreconditionerMap_
;
62
bool
Ifpack_DynamicFactory::Initialized_
=
false
;
63
int
Ifpack_DynamicFactory::NumPreconditioners_
= 0;
64
65
bool
Ifpack_DynamicFactory::Initialize
()
66
{
67
if
(!
Initialized_
) {
68
PreconditionerMap_
[
"point relaxation"
]
69
= &
buildPreconditioner<Ifpack_PointRelaxation, false>
;
70
PreconditionerMap_
[
"point relaxation stand-alone"
]
71
= &
buildPreconditioner<Ifpack_PointRelaxation, true>
;
72
PreconditionerMap_
[
"block relaxation"
]
73
= &
buildPreconditioner<Ifpack_BlockRelaxation<Ifpack_DenseContainer>
,
false
>;
74
PreconditionerMap_
[
"block relaxation stand-alone"
]
75
= &
buildPreconditioner<Ifpack_BlockRelaxation<Ifpack_DenseContainer>
,
true
>;
76
PreconditionerMap_
[
"block relaxation stand-alone (ILU)"
]
77
= &
buildPreconditioner<Ifpack_BlockRelaxation<Ifpack_SparseContainer<Ifpack_ILU>
>,
true
>;
78
79
#ifdef HAVE_IFPACK_AMESOS
80
PreconditionerMap_
[
"block relaxation stand-alone (Amesos)"
]
81
= &
buildPreconditioner<Ifpack_BlockRelaxation<Ifpack_SparseContainer<Ifpack_Amesos>
>,
true
>;
82
PreconditionerMap_
[
"block relaxation (Amesos)"
]
83
= &
buildPreconditioner<Ifpack_BlockRelaxation<Ifpack_SparseContainer<Ifpack_Amesos>
>,
false
>;
84
PreconditionerMap_
[
"Amesos"
]
85
= &
buildPreconditioner<Ifpack_Amesos, false>
;
86
PreconditionerMap_
[
"Amesos stand-alone"
]
87
= &
buildPreconditioner<Ifpack_Amesos, true>
;
88
#endif
// HAVE_IFPACK_AMESOS
89
90
PreconditionerMap_
[
"IC"
] = &
buildPreconditioner<Ifpack_IC, false>
;
91
PreconditionerMap_
[
"IC stand-alone"
] = &
buildPreconditioner<Ifpack_IC, true>
;
92
PreconditionerMap_
[
"ICT"
] = &
buildPreconditioner<Ifpack_ICT, false>
;
93
PreconditionerMap_
[
"ICT stand-alone"
] = &
buildPreconditioner<Ifpack_ICT, true>
;
94
PreconditionerMap_
[
"ILU"
] = &
buildPreconditioner<Ifpack_ILU, false>
;
95
PreconditionerMap_
[
"ILU stand-alone"
] = &
buildPreconditioner<Ifpack_ILU, true>
;
96
PreconditionerMap_
[
"ILUT"
] = &
buildPreconditioner<Ifpack_ILUT, false>
;
97
PreconditionerMap_
[
"ILUT stand-alone"
] = &
buildPreconditioner<Ifpack_ILUT, true>
;
98
99
#ifdef HAVE_IFPACK_SPARSKIT
100
PreconditionerMap_
[
"SPARSKIT"
]
101
= &
buildPreconditioner<Ifpack_SPARSKIT, true>
;
102
#endif
103
104
#ifdef HAVE_IFPACK_HIPS
105
PreconditionerMap_
[
"HIPS"
]
106
= &
buildPreconditioner<Ifpack_HIPS, true>
;
107
#endif
108
109
#ifdef HAVE_HYPRE
110
PreconditionerMap_
[
"Hypre"
]
111
= &
buildPreconditioner<Ifpack_Hypre, true>
;
112
#endif
113
114
#ifdef HAVE_IFPACK_SUPERLU
115
PreconditionerMap_
[
"SILU"
]
116
= &
buildPreconditioner<Ifpack_SILU, true>
;
117
#endif
118
119
PreconditionerMap_
[
"Chebyshev"
]
120
= &
buildPreconditioner<Ifpack_Chebyshev, true>
;
121
122
#ifdef HAVE_IFPACK_EPETRAEXT
123
PreconditionerMap_
[
"IHSS"
]
124
= &
buildPreconditioner<Ifpack_IHSS, true>
;
125
PreconditionerMap_
[
"SORa"
]
126
= &
buildPreconditioner<Ifpack_SORa, true>
;
127
#endif
128
129
NumPreconditioners_
=
130
+5
131
#ifdef HAVE_IFPACK_AMESOS
132
+4
133
#endif
134
+8
135
#ifdef HAVE_IFPACK_SPARSKIT
136
+1
137
#endif
138
#ifdef HAVE_IFPACK_HIPS
139
+1
140
#endif
141
#ifdef HAVE_HYPRE
142
+1
143
#endif
144
#ifdef HAVE_IFPACK_SUPERLU
145
+1
146
#endif
147
+1
148
#ifdef HAVE_IFPACK_EPETRAEXT
149
+2
150
#endif
151
;
152
153
Initialized_
=
true
;
154
}
155
156
return
true
;
157
}
158
159
int
Ifpack_DynamicFactory::RegisterPreconditioner
(
160
const
std::string PrecName,
161
Ifpack_DynamicFactory::builderFunction
PrecBuilder)
162
{
163
if
(
PreconditionerMap_
.find(PrecName) ==
PreconditionerMap_
.end()) {
164
PreconditionerMap_
[PrecName] = PrecBuilder;
165
NumPreconditioners_
++;
166
return
0;
167
}
168
return
1;
169
}
170
171
void
Ifpack_DynamicFactory::Print
(std::ostream& os)
172
{
173
os <<
"Ifpack_DynamicFactory registered preconditioners: "
<< std::endl;
174
for
(std::map<std::string, builderFunction>::const_iterator it =
PreconditionerMap_
.begin();
175
it !=
PreconditionerMap_
.end(); ++it) {
176
os << it->first << std::endl;
177
}
178
}
179
180
//==============================================================================
181
Ifpack_Preconditioner
*
Ifpack_DynamicFactory::Create
(
const
std::string PrecType,
182
Epetra_RowMatrix
* Matrix,
183
const
int
Overlap,
184
bool
overrideSerialDefault)
185
{
186
bool
serial = (Matrix->
Comm
().NumProc() == 1);
187
188
std::map<std::string, builderFunction>::const_iterator it
189
=
PreconditionerMap_
.find(PrecType);
190
bool
found = it !=
PreconditionerMap_
.end();
191
if
(found) {
192
builderFunction
f = it->second;
193
return
f(Matrix, Overlap, serial, overrideSerialDefault);
194
}
195
196
return
0;
197
}
198
199
// Let's initialize the factory upon compilation
200
namespace
{
201
bool
init =
Ifpack_DynamicFactory::Initialize
();
202
}
203
Epetra_CrsMatrix.h
Ifpack_AdditiveSchwarz.h
Ifpack_Amesos.h
Ifpack_BlockRelaxation.h
Ifpack_Chebyshev.h
Ifpack_ConfigDefs.h
Ifpack_DenseContainer.h
Ifpack_DynamicFactory.h
Ifpack_HIPS.h
Ifpack_ICT.h
Ifpack_IC.h
Ifpack_IHSS.h
Ifpack_ILUT.h
Ifpack_ILU.h
Ifpack_PointRelaxation.h
Ifpack_Preconditioner.h
Ifpack_SILU.h
Ifpack_SORa.h
Ifpack_SPARSKIT.h
Ifpack_SparseContainer.h
Epetra_Operator::Comm
virtual const Epetra_Comm & Comm() const=0
Epetra_RowMatrix
Ifpack_DynamicFactory::NumPreconditioners_
static int NumPreconditioners_
Definition
Ifpack_DynamicFactory.h:115
Ifpack_DynamicFactory::builderFunction
Ifpack_Preconditioner *(* builderFunction)(Epetra_RowMatrix *, int, bool, bool)
Definition
Ifpack_DynamicFactory.h:60
Ifpack_DynamicFactory::RegisterPreconditioner
static int RegisterPreconditioner(const std::string PrecName, builderFunction PrecBuilder)
Register a new preconditioner with the factory.
Definition
Ifpack_DynamicFactory.cpp:159
Ifpack_DynamicFactory::PreconditionerMap_
static std::map< std::string, builderFunction > PreconditionerMap_
Definition
Ifpack_DynamicFactory.h:114
Ifpack_DynamicFactory::Print
static void Print(std::ostream &os=std::cout)
Prints the current list of registered preconditioners.
Definition
Ifpack_DynamicFactory.cpp:171
Ifpack_DynamicFactory::Initialize
static bool Initialize()
Initializes the static data of the Ifpac_DynamicFactory class.
Definition
Ifpack_DynamicFactory.cpp:65
Ifpack_DynamicFactory::buildPreconditioner
static Ifpack_Preconditioner * buildPreconditioner(Epetra_RowMatrix *Matrix, int Overlap, bool Serial, bool OverrideSerialDefault)
Definition
Ifpack_DynamicFactory.h:122
Ifpack_DynamicFactory::Create
Ifpack_Preconditioner * Create(const std::string PrecType, Epetra_RowMatrix *Matrix, const int overlap=0, bool overrideSerialDefault=false)
Creates an instance of Ifpack_Preconditioner given the std::string name of the preconditioner type (c...
Definition
Ifpack_DynamicFactory.cpp:181
Ifpack_DynamicFactory::Initialized_
static bool Initialized_
Definition
Ifpack_DynamicFactory.h:116
Ifpack_Preconditioner
Ifpack_Preconditioner: basic class for preconditioning in Ifpack.
Definition
Ifpack_Preconditioner.h:136
Generated by
1.17.0