Go to the documentation of this file. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #ifndef MOAB_HYPRESOLVER
17 #define MOAB_HYPRESOLVER
18
19 #include "moab/MOABConfig.h"
20 #include "moab/Core.hpp"
21
22 #ifdef MOAB_HAVE_MPI
23 #include <mpi.h>
24
25
26 #ifndef HYPRE_TIMING
27 #define HYPRE_TIMING
28 #endif
29
30 #include "HypreParVector.hpp"
31 #include "HypreParMatrix.hpp"
32
33 namespace moab
34 {
35
36
37 class AbstractSolver
38 {
39 protected:
40 const Eigen::SparseMatrix< double >* m_operator;
41
42 public:
43
44 bool iterative_mode;
45
46
47 explicit AbstractSolver( bool iter_mode )
48 {
49 iterative_mode = iter_mode;
50 }
51
52
53 virtual void SetOperator( const HypreParMatrix& op ) = 0;
54 };
55
56
57 class HypreSolver : public AbstractSolver
58 {
59 public:
60 typedef HypreParVector Vector;
61
62 protected:
63
64 HypreParMatrix* A;
65
66
67 mutable HypreParVector *B, *X;
68
69
70 mutable int setup_called;
71
72 public:
73 HypreSolver( bool iterative = true );
74
75 HypreSolver( HypreParMatrix* _A, bool iterative = true );
76
77
78 virtual operator HYPRE_Solver() const = 0;
79
80 virtual void Verbosity( int )
81 {
82 }
83
84
85 virtual void SetPreconditioner( HypreSolver& )
86 {
87 }
88
89
90 virtual HYPRE_PtrToParSolverFcn SetupFcn() const = 0;
91
92 virtual HYPRE_PtrToParSolverFcn SolveFcn() const = 0;
93
94 virtual void SetOperator( const HypreParMatrix& )
95 {
96 MB_SET_ERR_RET( "HypreSolvers do not support SetOperator!" );
97 }
98
99 virtual void GetFinalResidualNorm( double& normr ) = 0;
100
101 virtual void GetNumIterations( int& num_iterations ) = 0;
102
103
104 virtual HYPRE_Int Solve( const HypreParVector& b, HypreParVector& x ) const;
105
106 virtual ~HypreSolver();
107 };
108
109
110 class HyprePCG : public HypreSolver
111 {
112 private:
113 HYPRE_Solver pcg_solver;
114
115 public:
116 HyprePCG( HypreParMatrix& _A );
117
118 void SetTol( double tol );
119 void SetMaxIter( int max_iter );
120 void SetLogging( int logging );
121 virtual void Verbosity( int print_lvl );
122
123
124 virtual void SetPreconditioner( HypreSolver& precond );
125
126
129 void SetResidualConvergenceOptions( int res_frequency = -1, double rtol = 0.0 );
130
131
132 void SetZeroInintialIterate()
133 {
134 iterative_mode = false;
135 }
136
137 virtual void GetFinalResidualNorm( double& normr )
138 {
139 HYPRE_ParCSRPCGGetFinalRelativeResidualNorm( pcg_solver, &normr );
140 }
141
142 virtual void GetNumIterations( int& num_iterations )
143 {
144 HYPRE_Int num_it;
145 HYPRE_ParCSRPCGGetNumIterations( pcg_solver, &num_it );
146 num_iterations = internal::to_int( num_it );
147 }
148
149
150 virtual operator HYPRE_Solver() const
151 {
152 return pcg_solver;
153 }
154
155
156 virtual HYPRE_PtrToParSolverFcn SetupFcn() const
157 {
158 return (HYPRE_PtrToParSolverFcn)HYPRE_ParCSRPCGSetup;
159 }
160
161 virtual HYPRE_PtrToParSolverFcn SolveFcn() const
162 {
163 return (HYPRE_PtrToParSolverFcn)HYPRE_ParCSRPCGSolve;
164 }
165
166
167 virtual HYPRE_Int Solve( const HypreParVector& b, HypreParVector& x ) const;
168 using HypreSolver::Solve;
169
170 virtual ~HyprePCG();
171 };
172
173
174 class HypreGMRES : public HypreSolver
175 {
176 private:
177 HYPRE_Solver gmres_solver;
178
179 public:
180 HypreGMRES( HypreParMatrix& _A );
181
182 void SetTol( double atol, double rtol = 1e-20 );
183 void SetMaxIter( int max_iter );
184 void SetKDim( int dim );
185 void SetLogging( int logging );
186 virtual void Verbosity( int print_lvl );
187
188
189 virtual void SetPreconditioner( HypreSolver& precond );
190
191
194 void SkipRealResidualCheck()
195 {
196 HYPRE_GMRESSetSkipRealResidualCheck( gmres_solver, 1 );
197 }
198
199
200 void SetZeroInintialIterate()
201 {
202 iterative_mode = false;
203 }
204
205 virtual void GetFinalResidualNorm( double& normr )
206 {
207 HYPRE_ParCSRGMRESGetFinalRelativeResidualNorm( gmres_solver, &normr );
208 }
209
210 virtual void GetNumIterations( int& num_iterations )
211 {
212 HYPRE_Int num_it;
213 HYPRE_GMRESGetNumIterations( gmres_solver, &num_it );
214 num_iterations = internal::to_int( num_it );
215 }
216
217
218 virtual operator HYPRE_Solver() const
219 {
220 return gmres_solver;
221 }
222
223
224 virtual HYPRE_PtrToParSolverFcn SetupFcn() const
225 {
226 return (HYPRE_PtrToParSolverFcn)HYPRE_ParCSRGMRESSetup;
227 }
228
229 virtual HYPRE_PtrToParSolverFcn SolveFcn() const
230 {
231 return (HYPRE_PtrToParSolverFcn)HYPRE_ParCSRGMRESSolve;
232 }
233
234
235 virtual HYPRE_Int Solve( const HypreParVector& b, HypreParVector& x ) const;
236 using HypreSolver::Solve;
237
238 virtual ~HypreGMRES();
239 };
240
241
242 class HypreIdentity : public HypreSolver
243 {
244 public:
245 virtual operator HYPRE_Solver() const
246 {
247 return NULL;
248 }
249
250 virtual HYPRE_PtrToParSolverFcn SetupFcn() const
251 {
252 return (HYPRE_PtrToParSolverFcn)hypre_ParKrylovIdentitySetup;
253 }
254 virtual HYPRE_PtrToParSolverFcn SolveFcn() const
255 {
256 return (HYPRE_PtrToParSolverFcn)hypre_ParKrylovIdentity;
257 }
258
259 virtual void GetNumIterations( int& num_iterations )
260 {
261 num_iterations = 1;
262 }
263
264 virtual void GetFinalResidualNorm( double& normr )
265 {
266 normr = 0.0;
267 }
268
269 virtual ~HypreIdentity() {}
270 };
271
272
273 class HypreDiagScale : public HypreSolver
274 {
275 public:
276 HypreDiagScale() : HypreSolver() {}
277 explicit HypreDiagScale( HypreParMatrix& A ) : HypreSolver( &A ) {}
278 virtual operator HYPRE_Solver() const
279 {
280 return NULL;
281 }
282
283 virtual HYPRE_PtrToParSolverFcn SetupFcn() const
284 {
285 return (HYPRE_PtrToParSolverFcn)HYPRE_ParCSRDiagScaleSetup;
286 }
287 virtual HYPRE_PtrToParSolverFcn SolveFcn() const
288 {
289 return (HYPRE_PtrToParSolverFcn)HYPRE_ParCSRDiagScale;
290 }
291
292 virtual void GetNumIterations( int& num_iterations )
293 {
294 num_iterations = 1;
295 }
296
297 virtual void GetFinalResidualNorm( double& normr )
298 {
299 normr = 0.0;
300 }
301
302 HypreParMatrix* GetData()
303 {
304 return A;
305 }
306 virtual ~HypreDiagScale() {}
307 };
308
309
310 class HypreParaSails : public HypreSolver
311 {
312 private:
313 HYPRE_Solver sai_precond;
314
315 public:
316 HypreParaSails( HypreParMatrix& A );
317
318 void SetSymmetry( int sym );
319
320 virtual void GetNumIterations( int& num_iterations )
321 {
322 num_iterations = 1;
323 }
324
325 virtual void GetFinalResidualNorm( double& normr )
326 {
327 normr = 0.0;
328 }
329
330
331 virtual operator HYPRE_Solver() const
332 {
333 return sai_precond;
334 }
335
336 virtual HYPRE_PtrToParSolverFcn SetupFcn() const
337 {
338 return (HYPRE_PtrToParSolverFcn)HYPRE_ParaSailsSetup;
339 }
340 virtual HYPRE_PtrToParSolverFcn SolveFcn() const
341 {
342 return (HYPRE_PtrToParSolverFcn)HYPRE_ParaSailsSolve;
343 }
344
345 virtual ~HypreParaSails();
346 };
347
348
349 class HypreBoomerAMG : public HypreSolver
350 {
351 private:
352 HYPRE_Solver amg_precond;
353
354
355 void SetDefaultOptions();
356
357
358
359
360 void ResetAMGPrecond();
361
362 public:
363 HypreBoomerAMG();
364
365 HypreBoomerAMG( HypreParMatrix& A );
366
367 virtual void SetOperator( const HypreParMatrix& op );
368
369 virtual void GetNumIterations( int& num_iterations )
370 {
371 num_iterations = 1;
372 }
373
374 virtual void GetFinalResidualNorm( double& normr )
375 {
376 normr = 0.0;
377 }
378
379
382 void SetSystemsOptions( int dim );
383
384 virtual void Verbosity( int print_level )
385 {
386 HYPRE_BoomerAMGSetPrintLevel( amg_precond, print_level );
387 }
388
389
390 virtual operator HYPRE_Solver() const
391 {
392 return amg_precond;
393 }
394
395 virtual HYPRE_PtrToParSolverFcn SetupFcn() const
396 {
397 return (HYPRE_PtrToParSolverFcn)HYPRE_BoomerAMGSetup;
398 }
399 virtual HYPRE_PtrToParSolverFcn SolveFcn() const
400 {
401 return (HYPRE_PtrToParSolverFcn)HYPRE_BoomerAMGSolve;
402 }
403
404 virtual ~HypreBoomerAMG();
405 };
406
407 }
408
409 #endif
410
411 #endif