Ifpack Package Browser (Single Doxygen Collection) Development
Loading...
Searching...
No Matches
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"
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"
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
60std::map<std::string, Ifpack_DynamicFactory::builderFunction>
64
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
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
160 const std::string PrecName,
162{
163 if (PreconditionerMap_.find(PrecName) == PreconditionerMap_.end()) {
164 PreconditionerMap_[PrecName] = PrecBuilder;
166 return 0;
167 }
168 return 1;
169}
170
171void 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//==============================================================================
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
200namespace {
202}
203
virtual int NumProc() const=0
virtual const Epetra_Comm & Comm() const=0
Ifpack_Preconditioner *(* builderFunction)(Epetra_RowMatrix *, int, bool, bool)
static int RegisterPreconditioner(const std::string PrecName, builderFunction PrecBuilder)
Register a new preconditioner with the factory.
static std::map< std::string, builderFunction > PreconditionerMap_
static void Print(std::ostream &os=std::cout)
Prints the current list of registered preconditioners.
static bool Initialize()
Initializes the static data of the Ifpac_DynamicFactory class.
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...
Ifpack_Preconditioner: basic class for preconditioning in Ifpack.