1 |
|
2 |
/* $Id$ */ |
3 |
|
4 |
/******************************************************* |
5 |
* |
6 |
* Copyright 2003-2007 by ACceSS MNRF |
7 |
* Copyright 2007 by University of Queensland |
8 |
* |
9 |
* http://esscc.uq.edu.au |
10 |
* Primary Business: Queensland, Australia |
11 |
* Licensed under the Open Software License version 3.0 |
12 |
* http://www.opensource.org/licenses/osl-3.0.php |
13 |
* |
14 |
*******************************************************/ |
15 |
|
16 |
#ifndef INC_SOLVER |
17 |
#define INC_SOLVER |
18 |
|
19 |
#include "SystemMatrix.h" |
20 |
#include "performance.h" |
21 |
|
22 |
#define PASO_TRACE |
23 |
/* error codes used in the solver */ |
24 |
#define SOLVER_NO_ERROR 0 |
25 |
#define SOLVER_MAXITER_REACHED 1 |
26 |
#define SOLVER_INPUT_ERROR -1 |
27 |
#define SOLVER_MEMORY_ERROR -9 |
28 |
#define SOLVER_BREAKDOWN -10 |
29 |
|
30 |
static double ONE=1.; |
31 |
static double ZERO=0.; |
32 |
static double TOLERANCE_FOR_SCALARS=0.; |
33 |
|
34 |
/* ILU preconditioner */ |
35 |
struct Paso_Solver_ILU { |
36 |
dim_t n_block; |
37 |
dim_t n; |
38 |
index_t num_colors; |
39 |
index_t* colorOf; |
40 |
index_t* main_iptr; |
41 |
double* factors; |
42 |
Paso_Pattern* pattern; |
43 |
}; |
44 |
typedef struct Paso_Solver_ILU Paso_Solver_ILU; |
45 |
|
46 |
/* RILU preconditioner */ |
47 |
struct Paso_Solver_RILU { |
48 |
dim_t n; |
49 |
dim_t n_block; |
50 |
dim_t n_F; |
51 |
dim_t n_C; |
52 |
double* inv_A_FF; |
53 |
index_t* A_FF_pivot; |
54 |
Paso_SparseMatrix * A_FC; |
55 |
Paso_SparseMatrix * A_CF; |
56 |
index_t* rows_in_F; |
57 |
index_t* rows_in_C; |
58 |
index_t* mask_F; |
59 |
index_t* mask_C; |
60 |
double* x_F; |
61 |
double* b_F; |
62 |
double* x_C; |
63 |
double* b_C; |
64 |
struct Paso_Solver_RILU * RILU_of_Schur; |
65 |
}; |
66 |
typedef struct Paso_Solver_RILU Paso_Solver_RILU; |
67 |
|
68 |
|
69 |
/* jacobi preconditioner */ |
70 |
|
71 |
typedef struct Paso_Solver_Jacobi { |
72 |
dim_t n_block; |
73 |
dim_t n; |
74 |
double* values; |
75 |
index_t* pivot; |
76 |
} Paso_Solver_Jacobi; |
77 |
|
78 |
/* general preconditioner interface */ |
79 |
|
80 |
typedef struct Paso_Solver_Preconditioner { |
81 |
dim_t type; |
82 |
/* jacobi preconditioner */ |
83 |
Paso_Solver_Jacobi* jacobi; |
84 |
/* ilu preconditioner */ |
85 |
Paso_Solver_ILU* ilu; |
86 |
/* ilu preconditioner */ |
87 |
Paso_Solver_RILU* rilu; |
88 |
} Paso_Solver_Preconditioner; |
89 |
|
90 |
void Paso_Solver(Paso_SystemMatrix*,double*,double*,Paso_Options*,Paso_Performance* pp); |
91 |
void Paso_Solver_free(Paso_SystemMatrix*); |
92 |
err_t Paso_Solver_BiCGStab( Paso_SystemMatrix * A, double* B, double * X, dim_t *iter, double * tolerance, Paso_Performance* pp); |
93 |
err_t Paso_Solver_PCG( Paso_SystemMatrix * A, double* B, double * X, dim_t *iter, double * tolerance, Paso_Performance* pp); |
94 |
err_t Paso_Solver_GMRES(Paso_SystemMatrix * A, double * r, double * x, dim_t *num_iter, double * tolerance,dim_t length_of_recursion,dim_t restart, Paso_Performance* pp); |
95 |
void Paso_Preconditioner_free(Paso_Solver_Preconditioner*); |
96 |
void Paso_Solver_setPreconditioner(Paso_SystemMatrix* A,Paso_Options* options); |
97 |
void Paso_Solver_solvePreconditioner(Paso_SystemMatrix* A,double*,double*); |
98 |
void Paso_Solver_applyBlockDiagonalMatrix(dim_t n_block,dim_t n,double* D,index_t* pivot,double* x,double* b); |
99 |
|
100 |
void Paso_Solver_ILU_free(Paso_Solver_ILU * in); |
101 |
Paso_Solver_ILU* Paso_Solver_getILU(Paso_SparseMatrix * A_p,bool_t verbose); |
102 |
void Paso_Solver_solveILU(Paso_Solver_ILU * ilu, double * x, double * b); |
103 |
|
104 |
void Paso_Solver_RILU_free(Paso_Solver_RILU * in); |
105 |
Paso_Solver_RILU* Paso_Solver_getRILU(Paso_SparseMatrix * A_p,bool_t verbose); |
106 |
void Paso_Solver_solveRILU(Paso_Solver_RILU * rilu, double * x, double * b); |
107 |
|
108 |
void Paso_Solver_updateIncompleteSchurComplement(Paso_SparseMatrix* A_CC, Paso_SparseMatrix *A_CF,double* invA_FF,index_t* A_FF_pivot, Paso_SparseMatrix *A_FC); |
109 |
Paso_Solver_Jacobi* Paso_Solver_getJacobi(Paso_SparseMatrix * A_p); |
110 |
void Paso_Solver_solveJacobi(Paso_Solver_Jacobi * prec, double * x, double * b); |
111 |
void Paso_Solver_Jacobi_free(Paso_Solver_Jacobi * in); |
112 |
|
113 |
#endif /* #ifndef INC_SOLVER */ |