escript  Revision_
Preconditioner.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2016 by The University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Apache License, version 2.0
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014 by Centre for Geoscience Computing (GeoComp)
14 *
15 *****************************************************************************/
16 
17 #ifndef __PASO_PRECONDITIONER_H__
18 #define __PASO_PRECONDITIONER_H__
19 
20 #include "Paso.h"
21 #include "BOOMERAMG.h"
22 #include "SystemMatrix.h"
23 
24 namespace paso {
25 
26 struct MergedSolver;
28 typedef boost::shared_ptr<Preconditioner> Preconditioner_ptr;
29 typedef boost::shared_ptr<const Preconditioner> const_Preconditioner_ptr;
30 
33 struct Solver_ILU;
34 struct Solver_RILU;
35 
36 // general preconditioner interface
38 {
51 };
52 
55 void Preconditioner_solve(Preconditioner* prec, SystemMatrix_ptr A, double*, double*);
56 
57 
58 // GAUSS SEIDEL & Jacobi
60 {
61  bool Jacobi;
62  double* diag;
63  double* buffer;
65 };
66 
68 {
70  bool is_local;
71 };
72 
75 
77  SystemMatrix_ptr A, bool jacobi, bool is_local, bool verbose);
78 
80  SparseMatrix_ptr A, bool jacobi, bool verbose);
81 
83  Preconditioner_Smoother* gs, double* x, const double* b,
84  dim_t sweeps, bool x_is_initial);
85 
87  Preconditioner_LocalSmoother* gs, double* x, const double* b,
88  dim_t sweeps, bool x_is_initial);
89 
91  Preconditioner_Smoother* gs, double* x, const double* b,
92  double atol, dim_t* sweeps, bool x_is_initial);
93 
95  Preconditioner_LocalSmoother* gs, double* x);
96 
99  double* x);
100 
102  Preconditioner_LocalSmoother* gs, double* x);
103 
105  Preconditioner_LocalSmoother* gs, double* x);
106 
107 
108 typedef enum
109 {
114 
117 {
118  int level;
125 
132  bool verbose;
138  double* r;
140  double* x_C;
142  double* b_C;
146 };
147 
149  Options* options);
150 
152 
154  double* x, double* b);
155 
157  dim_t* degree_S, index_t* offset_S, index_t* S,
158  double theta, double tau);
159 
161  dim_t* degree_S, index_t* offset_S, index_t* S,
162  double theta, double tau);
163 
165  const index_t* offset_S, const dim_t* degree_S,
166  const index_t* S, dim_t n_C, index_t* counter_C,
167  index_t interpolation_method);
168 
170  SystemMatrix_ptr A, const index_t* offset_S,
171  const dim_t* degree_S, const index_t* S,
172  const index_t* counter_C);
173 
175  SystemMatrix_ptr A, const index_t* offset_S,
176  const dim_t* degree_S, const index_t* S,
177  const index_t* counter_C);
178 
180  SystemMatrix_ptr A, const index_t* offset_S,
181  const dim_t* degree_S, const index_t* S,
182  const index_t* counter_C);
183 
185  SystemMatrix_ptr A, const index_t* offset_S,
186  const dim_t* degree_S, const index_t* S,
187  const index_t* counter_C);
189 
191 
193 
195  const dim_t* degree_S, const index_t* offset_S,
196  const index_t* S, dim_t nT, dim_t* degree_ST,
197  index_t* offset_ST, index_t* ST);
198 
200  AMGBlockSelect* split_marker, const dim_t* degree_S,
201  const index_t* offset_S, const index_t* S,
202  const dim_t* degree_ST, const index_t* offset_ST,
203  const index_t* ST, const_Connector_ptr col_connector,
205 
207 
210 
213 
215 
217 
220 {
222  SparseMatrix_ptr A_C; // coarse level matrix
223  SparseMatrix_ptr P; // prolongation n x n_C
224  SparseMatrix_ptr R; // restriction n_C x n
225 
229  index_t reordering; // applied reordering in direct solver
230  int refinements; // number of refinements in direct solver (typically=0)
231  double* r; // buffer for residual
232  double* x_C; // solution of coarse level system
233  double* b_C; // right hand side of coarse level system
235 };
236 
238  int level, Options* options);
241  Preconditioner_LocalAMG* amg, double* x, double* b);
242 
244  const dim_t* degree, const index_t* S,
245  AMGBlockSelect* split_marker, bool usePanel);
246 
248  dim_t* degree, index_t* S, double theta, double tau);
249 
251  dim_t* degree, index_t* S, double theta, double tau);
252 
254  const index_t* offset_S, const dim_t* degree_S,
255  const index_t* S, dim_t n_C, const index_t* counter_C,
256  index_t interpolation_method);
257 
259  const_SparseMatrix_ptr A, const index_t* counter_C);
260 
262  const_SparseMatrix_ptr A, const index_t* counter_C);
263 
265  SparseMatrix_ptr A, const index_t* offset_S,
266  const dim_t* degree_S, const index_t* S,
267  const index_t* counter_C);
268 
270  SparseMatrix_ptr A, const index_t* offset_S,
271  const dim_t* degree_S, const index_t* S,
272  const index_t* counter_C);
273 
278  const index_t* offset_S, const dim_t* degree_S,
279  const index_t* S, AMGBlockSelect* split_marker);
280 
281 
283 {
284  bool is_local;
288  int sweeps;
290 };
291 
293  Options* options);
296  Preconditioner_AMG_Root* amg, double* x, double* b);
297 
300 {
301  double* factors;
302 };
303 
306 {
311  double* inv_A_FF;
319  double* x_F;
320  double* b_F;
321  double* x_C;
322  double* b_C;
324 };
325 
326 void Solver_ILU_free(Solver_ILU * in);
327 Solver_ILU* Solver_getILU(SparseMatrix_ptr A, bool verbose);
328 void Solver_solveILU(SparseMatrix_ptr A, Solver_ILU* ilu, double* x, const double* b);
329 
330 void Solver_RILU_free(Solver_RILU* in);
332 void Solver_solveRILU(Solver_RILU* rilu, double* x, double* b);
333 
335  SparseMatrix_ptr A_CF, double* invA_FF, index_t* A_FF_pivot,
336  SparseMatrix_ptr A_FC);
337 
338 } // namespace paso
339 
340 #endif // __PASO_PRECONDITIONER_H__
341 
Solver_RILU * RILU_of_Schur
Definition: Preconditioner.h:323
bool is_local
Definition: Preconditioner.h:284
Solver_RILU * Solver_getRILU(SparseMatrix_ptr A, bool verbose)
Definition: RILU.cpp:71
void Preconditioner_Smoother_free(Preconditioner_Smoother *in)
Definition: Smoother.cpp:34
void Preconditioner_Smoother_solve(SystemMatrix_ptr A, Preconditioner_Smoother *gs, double *x, const double *b, dim_t sweeps, bool x_is_initial)
Definition: Smoother.cpp:100
dim_t type
Definition: Preconditioner.h:39
Preconditioner_AMG * AMG_C
Definition: Preconditioner.h:145
Preconditioner_BoomerAMG * boomeramg
Definition: Preconditioner.h:287
SystemMatrix_ptr Preconditioner_AMG_getRestriction(SystemMatrix_ptr P)
Definition: AMG_Restriction.cpp:47
double * inv_A_FF
Definition: Preconditioner.h:311
SparseMatrix_ptr P
Definition: Preconditioner.h:223
void Preconditioner_LocalSmoother_free(Preconditioner_LocalSmoother *in)
Definition: Smoother.cpp:42
AMGBlockSelect
Definition: Preconditioner.h:108
boost::shared_ptr< const SparseMatrix > const_SparseMatrix_ptr
Definition: SparseMatrix.h:37
void Preconditioner_LocalAMG_solve(SparseMatrix_ptr A, Preconditioner_LocalAMG *amg, double *x, double *b)
Definition: LocalAMG.cpp:308
double Preconditioner_LocalAMG_getCoarseLevelSparsity(const Preconditioner_LocalAMG *in)
Definition: LocalAMG.cpp:63
int post_sweeps
Definition: Preconditioner.h:227
Definition: Preconditioner.h:110
SystemMatrix_ptr A_C
coarse level matrix
Definition: Preconditioner.h:120
index_t * rows_in_C
Definition: Preconditioner.h:316
Preconditioner_Smoother * amgsubstitute
Definition: Preconditioner.h:289
double * b_C
Definition: Preconditioner.h:233
Definition: Preconditioner.h:282
SparseMatrix_ptr Preconditioner_AMG_mergeSystemMatrix(SystemMatrix_ptr A)
double * x_C
Definition: Preconditioner.h:321
void Preconditioner_LocalAMG_setStrongConnections(SparseMatrix_ptr A, dim_t *degree_S, index_t *S, const double theta, const double tau)
Definition: LocalAMG.cpp:375
void Preconditioner_AMG_solve(SystemMatrix_ptr A, Preconditioner_AMG *amg, double *x, double *b)
Definition: AMG.cpp:321
void Preconditioner_LocalSmoother_Sweep_colored(SparseMatrix_ptr A, Preconditioner_LocalSmoother *gs, double *x)
Definition: Smoother.cpp:338
double * x_C
solution of coarse level system
Definition: Preconditioner.h:140
Definition: Options.h:89
Definition: BOOMERAMG.h:44
Preconditioner_LocalAMG * localamg
Definition: Preconditioner.h:286
void Solver_ILU_free(Solver_ILU *in)
Definition: ILU.cpp:35
Preconditioner * Preconditioner_alloc(SystemMatrix_ptr A, Options *options)
Definition: Preconditioner.cpp:47
dim_t Preconditioner_AMG_getNumCoarseUnknowns(const Preconditioner_AMG *in)
Definition: AMG.cpp:99
index_t * pivot
Definition: Preconditioner.h:64
void Preconditioner_AMG_Root_solve(SystemMatrix_ptr A, Preconditioner_AMG_Root *prec, double *x, double *b)
Definition: AMG_Root.cpp:119
double * x_C
Definition: Preconditioner.h:232
Preconditioner_Smoother * jacobi
Jacobi preconditioner.
Definition: Preconditioner.h:42
void Preconditioner_LocalAMG_setClassicProlongation(SparseMatrix_ptr P_p, SparseMatrix_ptr A_p, const index_t *offset_S, const dim_t *degree_S, const index_t *S, const index_t *counter_C)
Definition: LocalAMG_Prolongation.cpp:355
void Preconditioner_AMG_Root_free(Preconditioner_AMG_Root *in)
Definition: AMG_Root.cpp:37
Preconditioner_AMG_Root * amg
AMG preconditioner.
Definition: Preconditioner.h:46
void Preconditioner_LocalAMG_setStrongConnections_Block(SparseMatrix_ptr A, dim_t *degree_S, index_t *S, double theta, double tau)
Definition: LocalAMG.cpp:423
double * b_F
Definition: Preconditioner.h:320
void Preconditioner_AMG_setStrongConnections_Block(SystemMatrix_ptr A, dim_t *degree_S, index_t *offset_S, index_t *S, double theta, double tau)
Definition: AMG.cpp:494
void Preconditioner_LocalSmoother_Sweep(SparseMatrix_ptr A, Preconditioner_LocalSmoother *gs, double *x)
Definition: Smoother.cpp:201
void Solver_updateIncompleteSchurComplement(SparseMatrix_ptr A_CC, SparseMatrix_ptr A_CF, double *invA_FF, index_t *A_FF_pivot, SparseMatrix_ptr A_FC)
Definition: SchurComplement.cpp:28
bool is_local
Definition: Preconditioner.h:70
int refinements
Definition: Preconditioner.h:230
Preconditioner_LocalAMG * Preconditioner_LocalAMG_alloc(SparseMatrix_ptr A_p, int level, Options *options)
Definition: LocalAMG.cpp:92
double * r
buffer for residual
Definition: Preconditioner.h:138
Definition: Preconditioner.h:112
Preconditioner_LocalSmoother * Preconditioner_LocalSmoother_alloc(SparseMatrix_ptr A, bool jacobi, bool verbose)
Definition: Smoother.cpp:64
void Preconditioner_LocalAMG_enforceFFConnectivity(dim_t n, const index_t *offset_S, const dim_t *degree_S, const index_t *S, AMGBlockSelect *split_marker)
ensures that two F nodes are connected via a C node
Definition: LocalAMG.cpp:702
SolverResult Preconditioner_Smoother_solve_byTolerance(SystemMatrix_ptr A, Preconditioner_Smoother *gs, double *x, const double *b, double atol, dim_t *sweeps, bool x_is_initial)
Definition: Smoother.cpp:127
int pre_sweeps
Definition: Preconditioner.h:228
int post_sweeps
Definition: Preconditioner.h:127
dim_t level
Definition: Preconditioner.h:221
void Preconditioner_LocalSmoother_solve(SparseMatrix_ptr A, Preconditioner_LocalSmoother *gs, double *x, const double *b, dim_t sweeps, bool x_is_initial)
Definition: Smoother.cpp:161
boost::shared_ptr< SparseMatrix > SparseMatrix_ptr
Definition: SparseMatrix.h:35
void Preconditioner_LocalAMG_setDirectProlongation_Block(SparseMatrix_ptr P_p, const_SparseMatrix_ptr A_p, const index_t *counter_C)
Definition: LocalAMG_Prolongation.cpp:227
boost::shared_ptr< Preconditioner > Preconditioner_ptr
Definition: Preconditioner.h:27
struct Preconditioner_LocalAMG * AMG_C
Definition: Preconditioner.h:234
index_t * mask_F
Definition: Preconditioner.h:317
void Solver_solveRILU(Solver_RILU *rilu, double *x, double *b)
Definition: RILU.cpp:289
Solver_RILU * rilu
RILU preconditioner.
Definition: Preconditioner.h:50
void Preconditioner_LocalSmoother_Sweep_sequential(SparseMatrix_ptr A, Preconditioner_LocalSmoother *gs, double *x)
inplace Gauss-Seidel sweep in sequential mode
Definition: Smoother.cpp:221
SparseMatrix_ptr R
Definition: Preconditioner.h:224
boost::shared_ptr< SystemMatrix > SystemMatrix_ptr
Definition: SystemMatrix.h:40
index_t reordering
Definition: Preconditioner.h:229
Solver_ILU * Solver_getILU(SparseMatrix_ptr A, bool verbose)
constructs the incomplete block factorization
Definition: ILU.cpp:44
double Preconditioner_AMG_getCoarseLevelSparsity(const Preconditioner_AMG *in)
Definition: AMG.cpp:87
Preconditioner_Smoother * gs
Gauss-Seidel preconditioner.
Definition: Preconditioner.h:44
Preconditioner_AMG_Root * Preconditioner_AMG_Root_alloc(SystemMatrix_ptr A, Options *options)
Definition: AMG_Root.cpp:48
Definition: AMG.cpp:45
dim_t Preconditioner_LocalAMG_getNumCoarseUnknowns(const Preconditioner_LocalAMG *in)
Definition: LocalAMG.cpp:75
void Preconditioner_LocalAMG_setClassicProlongation_Block(SparseMatrix_ptr P_p, SparseMatrix_ptr A_p, const index_t *offset_S, const dim_t *degree_S, const index_t *S, const index_t *counter_C)
Definition: LocalAMG_Prolongation.cpp:451
dim_t n_block
Definition: Preconditioner.h:308
Preconditioner_Smoother * Preconditioner_Smoother_alloc(SystemMatrix_ptr A, bool jacobi, bool is_local, bool verbose)
constructs the symmetric Gauss-Seidel preconditioner
Definition: Smoother.cpp:54
void Preconditioner_LocalSmoother_Sweep_tiled(SparseMatrix_ptr A, Preconditioner_LocalSmoother *gs, double *x)
int index_t
type for array/matrix indices used both globally and on each rank
Definition: DataTypes.h:59
SparseMatrix_ptr A_CF
Definition: Preconditioner.h:314
Local AMG preconditioner.
Definition: Preconditioner.h:219
ILU preconditioner.
Definition: Preconditioner.h:299
void Preconditioner_AMG_CIJPCoarsening(dim_t n, dim_t my_n, AMGBlockSelect *split_marker, const dim_t *degree_S, const index_t *offset_S, const index_t *S, const dim_t *degree_ST, const index_t *offset_ST, const index_t *ST, const_Connector_ptr col_connector, escript::const_Distribution_ptr col_dist)
Definition: AMG.cpp:677
double * buffer
Definition: Preconditioner.h:63
Preconditioner_LocalSmoother * localSmoother
Definition: Preconditioner.h:69
Preconditioner_Smoother * Smoother
Definition: Preconditioner.h:126
int refinements
number of refinements in direct solver (typically =0)
Definition: Preconditioner.h:136
void Preconditioner_free(Preconditioner *in)
Definition: Preconditioner.cpp:35
Definition: Preconditioner.h:111
void Preconditioner_AMG_mergeSolve(Preconditioner_AMG *amg)
Preconditioner_AMG * Preconditioner_AMG_alloc(SystemMatrix_ptr A, int level, Options *options)
Definition: AMG.cpp:116
Definition: Preconditioner.h:37
int Preconditioner_LocalAMG_getMaxLevel(const Preconditioner_LocalAMG *in)
Definition: LocalAMG.cpp:55
SystemMatrix_ptr R
restriction n_C x n
Definition: Preconditioner.h:124
int pre_sweeps
Definition: Preconditioner.h:128
void Solver_solveILU(SparseMatrix_ptr A, Solver_ILU *ilu, double *x, const double *b)
Definition: ILU.cpp:316
void Solver_RILU_free(Solver_RILU *in)
Definition: RILU.cpp:35
void Preconditioner_AMG_setClassicProlongation(SystemMatrix_ptr P, SystemMatrix_ptr A, const index_t *offset_S, const dim_t *degree_S, const index_t *S, const index_t *counter_C)
Definition: AMG_Prolongation.cpp:664
void Preconditioner_AMG_setDirectProlongation_Block(SystemMatrix_ptr P, SystemMatrix_ptr A, const index_t *offset_S, const dim_t *degree_S, const index_t *S, const index_t *counter_C)
Definition: AMG_Prolongation.cpp:469
Preconditioner_LocalSmoother * Smoother
Definition: Preconditioner.h:226
RILU preconditioner.
Definition: Preconditioner.h:305
index_t * A_FF_pivot
Definition: Preconditioner.h:312
Definition: Preconditioner.h:67
int level
Definition: Preconditioner.h:118
boost::shared_ptr< const Distribution > const_Distribution_ptr
Definition: Distribution.h:26
dim_t n
Definition: Preconditioner.h:307
void Preconditioner_AMG_setClassicProlongation_Block(SystemMatrix_ptr P, SystemMatrix_ptr A, const index_t *offset_S, const dim_t *degree_S, const index_t *S, const index_t *counter_C)
Definition: AMG_Prolongation.cpp:894
int Preconditioner_AMG_getMaxLevel(const Preconditioner_AMG *in)
Definition: AMG.cpp:78
SystemMatrix_ptr P
prolongation n x n_C
Definition: Preconditioner.h:122
Definition: MergedSolver.h:36
index_t reordering
applied reordering in direct solver
Definition: Preconditioner.h:134
Local preconditioner.
Definition: Preconditioner.h:116
void Preconditioner_AMG_setStrongConnections(SystemMatrix_ptr A, dim_t *degree_S, index_t *offset_S, index_t *S, double theta, double tau)
Definition: AMG.cpp:378
bool verbose
used in direct solver
Definition: Preconditioner.h:132
MergedSolver * merged_solver
used on the coarsest level
Definition: Preconditioner.h:144
index_t * rows_in_F
Definition: Preconditioner.h:315
int sweeps
Definition: Preconditioner.h:288
void Preconditioner_LocalAMG_free(Preconditioner_LocalAMG *in)
Definition: LocalAMG.cpp:43
void Preconditioner_solve(Preconditioner *prec, SystemMatrix_ptr A, double *x, double *b)
Definition: Preconditioner.cpp:120
double * b_C
right hand side of coarse level system
Definition: Preconditioner.h:142
SparseMatrix_ptr A_FC
Definition: Preconditioner.h:313
void Preconditioner_AMG_setDirectProlongation(SystemMatrix_ptr P, SystemMatrix_ptr A, const index_t *offset_S, const dim_t *degree_S, const index_t *S, const index_t *counter_C)
Definition: AMG_Prolongation.cpp:332
boost::shared_ptr< const Preconditioner > const_Preconditioner_ptr
Definition: Preconditioner.h:29
SparseMatrix_ptr A_C
Definition: Preconditioner.h:222
dim_t sweeps
Definition: Preconditioner.h:40
double * b_C
Definition: Preconditioner.h:322
double * x_F
Definition: Preconditioner.h:319
boost::shared_ptr< const Connector > const_Connector_ptr
Definition: Coupler.h:39
SystemMatrix_ptr Preconditioner_AMG_getProlongation(SystemMatrix_ptr A_p, const index_t *offset_S, const dim_t *degree_S, const index_t *S, const dim_t n_C, index_t *counter_C, const index_t interpolation_method)
Definition: AMG_Prolongation.cpp:57
void Preconditioner_LocalAMG_setDirectProlongation(SparseMatrix_ptr P_p, const_SparseMatrix_ptr A_p, const index_t *counter_C)
Definition: LocalAMG_Prolongation.cpp:146
SystemMatrix_ptr Preconditioner_AMG_buildInterpolationOperatorBlock(SystemMatrix_ptr A, SystemMatrix_ptr P, SystemMatrix_ptr R)
Definition: AMG_Interpolation.cpp:1950
dim_t n_C
Definition: Preconditioner.h:310
dim_t options_smoother
used in direct solver
Definition: Preconditioner.h:130
SolverResult
Definition: Paso.h:42
Definition: Preconditioner.h:59
SystemMatrix_ptr Preconditioner_AMG_buildInterpolationOperator(SystemMatrix_ptr A, SystemMatrix_ptr P, SystemMatrix_ptr R)
Definition: AMG_Interpolation.cpp:556
void Preconditioner_AMG_transposeStrongConnections(dim_t n, const dim_t *degree_S, const index_t *offset_S, const index_t *S, const dim_t nT, dim_t *degree_ST, index_t *offset_ST, index_t *ST)
Definition: AMG.cpp:650
SparseMatrix_ptr Preconditioner_LocalAMG_getProlongation(SparseMatrix_ptr A_p, const index_t *offset_S, const dim_t *degree_S, const index_t *S, dim_t n_C, const index_t *counter_C, index_t interpolation_method)
Definition: LocalAMG_Prolongation.cpp:55
#define S(_J_, _I_)
Definition: ShapeFunctions.cpp:121
index_t * mask_C
Definition: Preconditioner.h:318
dim_t n_F
Definition: Preconditioner.h:309
double * diag
Definition: Preconditioner.h:62
index_t dim_t
Definition: DataTypes.h:64
double * factors
Definition: Preconditioner.h:301
double * r
Definition: Preconditioner.h:231
void Preconditioner_LocalAMG_RungeStuebenSearch(dim_t n, const index_t *offset_S, const dim_t *degree_S, const index_t *S, AMGBlockSelect *split_marker, bool usePanel)
Definition: LocalAMG.cpp:489
Preconditioner_AMG * amg
Definition: Preconditioner.h:285
void Preconditioner_AMG_free(Preconditioner_AMG *in)
Definition: AMG.cpp:65
Solver_ILU * ilu
ILU preconditioner.
Definition: Preconditioner.h:48
bool Jacobi
Definition: Preconditioner.h:61