Ifpack2 Templated Preconditioning Package Version 1.0
Loading...
Searching...
No Matches
Ifpack2_Hypre_FunctionParameters.hpp
1// @HEADER
2// *****************************************************************************
3// Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
4//
5// Copyright 2009 NTESS and the Ifpack2 contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef IFPACK2_HYPRE_FUNCTIONPARAMETERS_HPP
11#define IFPACK2_HYPRE_FUNCTIONPARAMETERS_HPP
12
13#include "Ifpack2_ConfigDefs.hpp"
14#if defined(HAVE_IFPACK2_HYPRE) && defined(HAVE_IFPACK2_MPI)
15
16#include <sstream>
17#include "HYPRE_utilities.h"
18#include "HYPRE_IJ_mv.h"
19#include "HYPRE_parcsr_ls.h"
20#if defined(HAVE_IFPACK2_HYPRE_UNDERSCORE_KRYLOV_H)
21#include "_hypre_krylov.h"
22#else
23#include "krylov.h"
24#endif
25#include "_hypre_parcsr_mv.h"
26#include "_hypre_IJ_mv.h"
27#include "HYPRE_parcsr_mv.h"
28#include "HYPRE.h"
29
30// Hypre forward declarations (to avoid downstream header pollution)
31struct hypre_IJMatrix_struct;
32typedef struct hypre_IJMatrix_struct *HYPRE_IJMatrix;
33struct hypre_IJVector_struct;
34typedef struct hypre_IJVector_struct *HYPRE_IJVector;
35struct hypre_ParCSRMatrix_struct;
36typedef struct hypre_ParCSRMatrix_struct *HYPRE_ParCSRMatrix;
37struct hypre_ParVector_struct;
38typedef struct hypre_ParVector_struct *HYPRE_ParVector;
39struct hypre_Solver_struct;
40typedef struct hypre_Solver_struct *HYPRE_Solver;
41struct hypre_ParVector_struct;
42typedef struct hypre_ParVector_struct hypre_ParVector;
43// struct hypre_Vector;
44
45#ifndef HYPRE_ENUMS
46#define HYPRE_ENUMS
48enum Hypre_Solver {
49 BoomerAMG,
50 ParaSails,
51 Euclid,
52 AMS,
53 Hybrid,
54 PCG,
55 GMRES,
56 FlexGMRES,
57 LGMRES,
58 BiCGSTAB
59};
60
62enum Hypre_Chooser {
63 Hypre_Is_Solver,
64 Hypre_Is_Preconditioner
65};
66#endif // HYPRE_ENUMS
67
68// The Python script that generates the ParameterMap needs to be after these typedefs
69typedef HYPRE_Int (*int_func)(HYPRE_Solver, HYPRE_Int);
70typedef HYPRE_Int (*double_func)(HYPRE_Solver, HYPRE_Real);
71typedef HYPRE_Int (*double_int_func)(HYPRE_Solver, HYPRE_Real, HYPRE_Int);
72typedef HYPRE_Int (*int_double_func)(HYPRE_Solver, HYPRE_Int, HYPRE_Real);
73typedef HYPRE_Int (*int_int_func)(HYPRE_Solver, HYPRE_Int, HYPRE_Int);
74typedef HYPRE_Int (*int_star_func)(HYPRE_Solver, HYPRE_Int *);
75typedef HYPRE_Int (*int_star_star_func)(HYPRE_Solver, HYPRE_Int **);
76typedef HYPRE_Int (*double_star_func)(HYPRE_Solver, HYPRE_Real *);
77typedef HYPRE_Int (*int_int_double_double_func)(HYPRE_Solver, HYPRE_Int, HYPRE_Int, HYPRE_Real, HYPRE_Real);
78typedef HYPRE_Int (*int_int_int_double_int_int_func)(HYPRE_Solver, HYPRE_Int, HYPRE_Int, HYPRE_Int, HYPRE_Real, HYPRE_Int, HYPRE_Int);
79typedef HYPRE_Int (*char_star_func)(HYPRE_Solver, char *);
80
81namespace Ifpack2 {
82
83void IFPACK2_CHK_ERRV(int code);
84
85void IFPACK2_CHK_ERR(int code);
86
88class FunctionParameter {
89 public:
91 FunctionParameter(Hypre_Chooser chooser, int_func funct, HYPRE_Int param1)
92 : chooser_(chooser)
93 , option_(0)
94 , int_func_(funct)
95 , int_param1_(param1) {}
96
97 FunctionParameter(Hypre_Chooser chooser, std::string funct_name, HYPRE_Int param1)
98 : chooser_(chooser)
99 , option_(0)
100 , int_func_(hypreMapIntFunc_.at(funct_name))
101 , int_param1_(param1) {}
102
104 FunctionParameter(Hypre_Chooser chooser, double_func funct, HYPRE_Real param1)
105 : chooser_(chooser)
106 , option_(1)
107 , double_func_(funct)
108 , double_param1_(param1) {}
109
110 FunctionParameter(Hypre_Chooser chooser, std::string funct_name, HYPRE_Real param1)
111 : chooser_(chooser)
112 , option_(1)
113 , double_func_(hypreMapDoubleFunc_.at(funct_name))
114 , double_param1_(param1) {}
115
117 FunctionParameter(Hypre_Chooser chooser, double_int_func funct, HYPRE_Real param1, HYPRE_Int param2)
118 : chooser_(chooser)
119 , option_(2)
120 , double_int_func_(funct)
121 , int_param1_(param2)
122 , double_param1_(param1) {}
123
125 FunctionParameter(Hypre_Chooser chooser, int_double_func funct, HYPRE_Int param1, HYPRE_Real param2)
126 : chooser_(chooser)
127 , option_(10)
128 , int_double_func_(funct)
129 , int_param1_(param1)
130 , double_param1_(param2) {}
131
132 FunctionParameter(Hypre_Chooser chooser, std::string funct_name, HYPRE_Real param1, HYPRE_Int param2)
133 : chooser_(chooser)
134 , option_(2)
135 , double_int_func_(hypreMapDoubleIntFunc_.at(funct_name))
136 , int_param1_(param2)
137 , double_param1_(param1) {}
138
140 FunctionParameter(Hypre_Chooser chooser, int_int_func funct, HYPRE_Int param1, HYPRE_Int param2)
141 : chooser_(chooser)
142 , option_(3)
143 , int_int_func_(funct)
144 , int_param1_(param1)
145 , int_param2_(param2) {}
146
147 FunctionParameter(Hypre_Chooser chooser, std::string funct_name, HYPRE_Int param1, HYPRE_Int param2)
148 : chooser_(chooser)
149 , option_(3)
150 , int_int_func_(hypreMapIntIntFunc_.at(funct_name))
151 , int_param1_(param1)
152 , int_param2_(param2) {}
153
155 FunctionParameter(Hypre_Chooser chooser, int_star_func funct, HYPRE_Int *param1)
156 : chooser_(chooser)
157 , option_(4)
158 , int_star_func_(funct)
159 , int_star_param_(param1) {}
160
161 FunctionParameter(Hypre_Chooser chooser, std::string funct_name, HYPRE_Int *param1)
162 : chooser_(chooser)
163 , option_(4)
164 , int_star_func_(hypreMapIntStarFunc_.at(funct_name))
165 , int_star_param_(param1) {}
166
168 FunctionParameter(Hypre_Chooser chooser, double_star_func funct, double *param1)
169 : chooser_(chooser)
170 , option_(5)
171 , double_star_func_(funct)
172 , double_star_param_(param1) {}
173
174 FunctionParameter(Hypre_Chooser chooser, std::string funct_name, double *param1)
175 : chooser_(chooser)
176 , option_(5)
177 , double_star_func_(hypreMapDoubleStarFunc_.at(funct_name))
178 , double_star_param_(param1) {}
179
181 FunctionParameter(Hypre_Chooser chooser, int_int_double_double_func funct, HYPRE_Int param1, HYPRE_Int param2, HYPRE_Real param3, HYPRE_Real param4)
182 : chooser_(chooser)
183 , option_(6)
184 , int_int_double_double_func_(funct)
185 , int_param1_(param1)
186 , int_param2_(param2)
187 , double_param1_(param3)
188 , double_param2_(param4) {}
189
190 FunctionParameter(Hypre_Chooser chooser, std::string funct_name, HYPRE_Int param1, HYPRE_Int param2, HYPRE_Real param3, HYPRE_Real param4)
191 : chooser_(chooser)
192 , option_(6)
193 , int_int_double_double_func_(hypreMapIntIntDoubleDoubleFunc_.at(funct_name))
194 , int_param1_(param1)
195 , int_param2_(param2)
196 , double_param1_(param3)
197 , double_param2_(param4) {}
198
200 FunctionParameter(Hypre_Chooser chooser, int_star_star_func funct, HYPRE_Int **param1)
201 : chooser_(chooser)
202 , option_(7)
203 , int_star_star_func_(funct)
204 , int_star_star_param_(param1) {}
205
206 FunctionParameter(Hypre_Chooser chooser, std::string funct_name, HYPRE_Int **param1)
207 : chooser_(chooser)
208 , option_(7)
209 , int_star_star_func_(hypreMapIntStarStarFunc_.at(funct_name))
210 , int_star_star_param_(param1) {}
211
213 FunctionParameter(Hypre_Chooser chooser, int_int_int_double_int_int_func funct, HYPRE_Int param1, HYPRE_Int param2, HYPRE_Int param3, HYPRE_Real param4, HYPRE_Int param5, HYPRE_Int param6)
214 : chooser_(chooser)
215 , option_(8)
216 , int_int_int_double_int_int_func_(funct)
217 , int_param1_(param1)
218 , int_param2_(param2)
219 , int_param3_(param3)
220 , int_param4_(param5)
221 , int_param5_(param6)
222 , double_param1_(param4) {}
223
224 FunctionParameter(Hypre_Chooser chooser, std::string funct_name, HYPRE_Int param1, HYPRE_Int param2, HYPRE_Int param3, HYPRE_Real param4, HYPRE_Int param5, HYPRE_Int param6)
225 : chooser_(chooser)
226 , option_(8)
227 , int_int_int_double_int_int_func_(hypreMapIntIntIntDoubleIntIntFunc_.at(funct_name))
228 , int_param1_(param1)
229 , int_param2_(param2)
230 , int_param3_(param3)
231 , int_param4_(param5)
232 , int_param5_(param6)
233 , double_param1_(param4) {}
234
236 FunctionParameter(Hypre_Chooser chooser, char_star_func funct, char *param1)
237 : chooser_(chooser)
238 , option_(9)
239 , char_star_func_(funct)
240 , char_star_param_(param1) {}
241
242 FunctionParameter(Hypre_Chooser chooser, std::string funct_name, char *param1)
243 : chooser_(chooser)
244 , option_(9)
245 , char_star_func_(hypreMapCharStarFunc_.at(funct_name))
246 , char_star_param_(param1) {}
247
249 int CallFunction(HYPRE_Solver solver, HYPRE_Solver precond) {
250 if (chooser_ == Hypre_Is_Solver) {
251 if (option_ == 0) {
252 return int_func_(solver, int_param1_);
253 } else if (option_ == 1) {
254 return double_func_(solver, double_param1_);
255 } else if (option_ == 2) {
256 return double_int_func_(solver, double_param1_, int_param1_);
257 } else if (option_ == 3) {
258 return int_int_func_(solver, int_param1_, int_param2_);
259 } else if (option_ == 4) {
260 return int_star_func_(solver, int_star_param_);
261 } else if (option_ == 5) {
262 return double_star_func_(solver, double_star_param_);
263 } else if (option_ == 6) {
264 return int_int_double_double_func_(solver, int_param1_, int_param2_, double_param1_, double_param2_);
265 } else if (option_ == 7) {
266 return int_star_star_func_(solver, int_star_star_param_);
267 } else if (option_ == 8) {
268 return int_int_int_double_int_int_func_(solver, int_param1_, int_param2_, int_param3_, double_param1_, int_param4_, int_param5_);
269 } else if (option_ == 9) {
270 return char_star_func_(solver, char_star_param_);
271 } else if (option_ == 10) {
272 return int_double_func_(solver, int_param1_, double_param1_);
273 } else {
274 IFPACK2_CHK_ERR(-2);
275 }
276 } else {
277 if (option_ == 0) {
278 return int_func_(precond, int_param1_);
279 } else if (option_ == 1) {
280 return double_func_(precond, double_param1_);
281 } else if (option_ == 2) {
282 return double_int_func_(precond, double_param1_, int_param1_);
283 } else if (option_ == 3) {
284 return int_int_func_(precond, int_param1_, int_param2_);
285 } else if (option_ == 4) {
286 return int_star_func_(precond, int_star_param_);
287 } else if (option_ == 5) {
288 return double_star_func_(precond, double_star_param_);
289 } else if (option_ == 6) {
290 return int_int_double_double_func_(precond, int_param1_, int_param2_, double_param1_, double_param2_);
291 } else if (option_ == 7) {
292 return int_star_star_func_(precond, int_star_star_param_);
293 } else if (option_ == 8) {
294 return int_int_int_double_int_int_func_(precond, int_param1_, int_param2_, int_param3_, double_param1_, int_param4_, int_param5_);
295 } else if (option_ == 9) {
296 return char_star_func_(solver, char_star_param_);
297 } else if (option_ == 10) {
298 return int_double_func_(precond, int_param1_, double_param1_);
299 } else {
300 IFPACK2_CHK_ERR(-2);
301 }
302 }
303 return 0;
304 }
305
306 static bool isFuncIntInt(std::string funct_name) {
307 return (hypreMapIntIntFunc_.find(funct_name) != hypreMapIntIntFunc_.end());
308 }
309
310 static bool isFuncIntIntDoubleDouble(std::string funct_name) {
311 return (hypreMapIntIntDoubleDoubleFunc_.find(funct_name) != hypreMapIntIntDoubleDoubleFunc_.end());
312 }
313
314 static bool isFuncIntIntIntDoubleIntInt(std::string funct_name) {
315 return (hypreMapIntIntIntDoubleIntIntFunc_.find(funct_name) != hypreMapIntIntIntDoubleIntIntFunc_.end());
316 }
317
318 static bool isFuncIntStarStar(std::string funct_name) {
319 return (hypreMapIntStarStarFunc_.find(funct_name) != hypreMapIntStarStarFunc_.end());
320 }
321
322 private:
323 Hypre_Chooser chooser_;
324 int option_;
325 int_func int_func_;
326 double_func double_func_;
327 double_int_func double_int_func_;
328 int_double_func int_double_func_;
329 int_int_func int_int_func_;
330 int_star_func int_star_func_;
331 double_star_func double_star_func_;
332 int_int_double_double_func int_int_double_double_func_;
333 int_int_int_double_int_int_func int_int_int_double_int_int_func_;
334 int_star_star_func int_star_star_func_;
335 char_star_func char_star_func_;
336 HYPRE_Int int_param1_;
337 HYPRE_Int int_param2_;
338 HYPRE_Int int_param3_;
339 HYPRE_Int int_param4_;
340 HYPRE_Int int_param5_;
341 HYPRE_Real double_param1_;
342 HYPRE_Real double_param2_;
343 HYPRE_Int *int_star_param_;
344 HYPRE_Int **int_star_star_param_;
345 HYPRE_Real *double_star_param_;
346 char *char_star_param_;
347
348 static const std::map<std::string, int_func> hypreMapIntFunc_;
349 static const std::map<std::string, double_func> hypreMapDoubleFunc_;
350 static const std::map<std::string, double_int_func> hypreMapDoubleIntFunc_;
351 static const std::map<std::string, int_double_func> hypreMapIntDoubleFunc_;
352 static const std::map<std::string, int_int_func> hypreMapIntIntFunc_;
353 static const std::map<std::string, int_star_func> hypreMapIntStarFunc_;
354 static const std::map<std::string, double_star_func> hypreMapDoubleStarFunc_;
355 static const std::map<std::string, int_int_double_double_func> hypreMapIntIntDoubleDoubleFunc_;
356 static const std::map<std::string, int_int_int_double_int_int_func> hypreMapIntIntIntDoubleIntIntFunc_;
357 static const std::map<std::string, int_star_star_func> hypreMapIntStarStarFunc_;
358 static const std::map<std::string, char_star_func> hypreMapCharStarFunc_;
359};
360
361} // namespace Ifpack2
362
363#endif // HAVE_IFPACK2_HYPRE && HAVE_IFPACK2_MPI
364
365#endif /* IFPACK2_HYPRE_FUNCTIONPARAMETERS_HPP */
Preconditioners and smoothers for Tpetra sparse matrices.
Definition Ifpack2_AdditiveSchwarz_decl.hpp:40
@ GMRES
Uses AztecOO's GMRES.
Definition Ifpack2_CondestType.hpp:20