1 |
|
2 |
/******************************************************* |
3 |
* |
4 |
* Copyright (c) 2003-2008 by University of Queensland |
5 |
* Earth Systems Science Computational Center (ESSCC) |
6 |
* http://www.uq.edu.au/esscc |
7 |
* |
8 |
* Primary Business: Queensland, Australia |
9 |
* Licensed under the Open Software License version 3.0 |
10 |
* http://www.opensource.org/licenses/osl-3.0.php |
11 |
* |
12 |
*******************************************************/ |
13 |
|
14 |
|
15 |
#ifndef INC_SOLVER |
16 |
#define INC_SOLVER |
17 |
|
18 |
#include "SystemMatrix.h" |
19 |
#include "performance.h" |
20 |
#include "Functions.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 |
#define SOLVER_NEGATIVE_NORM_ERROR -11 |
30 |
|
31 |
|
32 |
static double ONE=1.; |
33 |
static double ZERO=0.; |
34 |
static double TOLERANCE_FOR_SCALARS=0.; |
35 |
|
36 |
/* jacobi preconditioner */ |
37 |
|
38 |
typedef struct Paso_Solver_Jacobi { |
39 |
dim_t n_block; |
40 |
dim_t n; |
41 |
double* values; |
42 |
index_t* pivot; |
43 |
} Paso_Solver_Jacobi; |
44 |
|
45 |
|
46 |
/* ILU preconditioner */ |
47 |
struct Paso_Solver_ILU { |
48 |
dim_t n_block; |
49 |
dim_t n; |
50 |
index_t num_colors; |
51 |
index_t* colorOf; |
52 |
index_t* main_iptr; |
53 |
double* factors; |
54 |
Paso_Pattern* pattern; |
55 |
}; |
56 |
typedef struct Paso_Solver_ILU Paso_Solver_ILU; |
57 |
|
58 |
/* GS preconditioner */ |
59 |
struct Paso_Solver_GS { |
60 |
dim_t n_block; |
61 |
dim_t n; |
62 |
index_t num_colors; |
63 |
index_t* colorOf; |
64 |
index_t* main_iptr; |
65 |
double* diag; |
66 |
Paso_SparseMatrix * factors; |
67 |
Paso_Pattern* pattern; |
68 |
dim_t sweeps; |
69 |
double* x_old; |
70 |
}; |
71 |
typedef struct Paso_Solver_GS Paso_Solver_GS; |
72 |
|
73 |
/* RILU preconditioner */ |
74 |
struct Paso_Solver_RILU { |
75 |
dim_t n; |
76 |
dim_t n_block; |
77 |
dim_t n_F; |
78 |
dim_t n_C; |
79 |
double* inv_A_FF; |
80 |
index_t* A_FF_pivot; |
81 |
Paso_SparseMatrix * A_FC; |
82 |
Paso_SparseMatrix * A_CF; |
83 |
index_t* rows_in_F; |
84 |
index_t* rows_in_C; |
85 |
index_t* mask_F; |
86 |
index_t* mask_C; |
87 |
double* x_F; |
88 |
double* b_F; |
89 |
double* x_C; |
90 |
double* b_C; |
91 |
struct Paso_Solver_RILU * RILU_of_Schur; |
92 |
}; |
93 |
typedef struct Paso_Solver_RILU Paso_Solver_RILU; |
94 |
|
95 |
|
96 |
|
97 |
/* general preconditioner interface */ |
98 |
|
99 |
typedef struct Paso_Solver_Preconditioner { |
100 |
dim_t type; |
101 |
/* jacobi preconditioner */ |
102 |
Paso_Solver_Jacobi* jacobi; |
103 |
/* ilu preconditioner */ |
104 |
Paso_Solver_ILU* ilu; |
105 |
/* rilu preconditioner */ |
106 |
Paso_Solver_RILU* rilu; |
107 |
/* Gauss-Seidel preconditioner */ |
108 |
Paso_Solver_GS* gs; |
109 |
} Paso_Solver_Preconditioner; |
110 |
|
111 |
void Paso_Solver(Paso_SystemMatrix*,double*,double*,Paso_Options*,Paso_Performance* pp); |
112 |
void Paso_Solver_free(Paso_SystemMatrix*); |
113 |
err_t Paso_Solver_BiCGStab( Paso_SystemMatrix * A, double* B, double * X, dim_t *iter, double * tolerance, Paso_Performance* pp); |
114 |
err_t Paso_Solver_PCG( Paso_SystemMatrix * A, double* B, double * X, dim_t *iter, double * tolerance, Paso_Performance* pp); |
115 |
err_t Paso_Solver_TFQMR( Paso_SystemMatrix * A, double* B, double * X, dim_t *iter, double * tolerance, Paso_Performance* pp); |
116 |
err_t Paso_Solver_MINRES( Paso_SystemMatrix * A, double* B, double * X, dim_t *iter, double * tolerance, double *tol, Paso_Performance* pp); |
117 |
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); |
118 |
void Paso_Preconditioner_free(Paso_Solver_Preconditioner*); |
119 |
void Paso_Solver_setPreconditioner(Paso_SystemMatrix* A,Paso_Options* options); |
120 |
void Paso_Solver_solvePreconditioner(Paso_SystemMatrix* A,double*,double*); |
121 |
void Paso_Solver_applyBlockDiagonalMatrix(dim_t n_block,dim_t n,double* D,index_t* pivot,double* x,double* b); |
122 |
|
123 |
void Paso_Solver_ILU_free(Paso_Solver_ILU * in); |
124 |
Paso_Solver_ILU* Paso_Solver_getILU(Paso_SparseMatrix * A_p,bool_t verbose); |
125 |
void Paso_Solver_solveILU(Paso_Solver_ILU * ilu, double * x, double * b); |
126 |
|
127 |
void Paso_Solver_GS_free(Paso_Solver_GS * in); |
128 |
Paso_Solver_GS* Paso_Solver_getGS(Paso_SparseMatrix * A_p,bool_t verbose); |
129 |
void Paso_Solver_solveGS(Paso_Solver_GS * gs, double * x, double * b); |
130 |
|
131 |
void Paso_Solver_RILU_free(Paso_Solver_RILU * in); |
132 |
Paso_Solver_RILU* Paso_Solver_getRILU(Paso_SparseMatrix * A_p,bool_t verbose); |
133 |
void Paso_Solver_solveRILU(Paso_Solver_RILU * rilu, double * x, double * b); |
134 |
|
135 |
void Paso_Solver_updateIncompleteSchurComplement(Paso_SparseMatrix* A_CC, Paso_SparseMatrix *A_CF,double* invA_FF,index_t* A_FF_pivot, Paso_SparseMatrix *A_FC); |
136 |
Paso_Solver_Jacobi* Paso_Solver_getJacobi(Paso_SparseMatrix * A_p); |
137 |
void Paso_Solver_solveJacobi(Paso_Solver_Jacobi * prec, double * x, double * b); |
138 |
void Paso_Solver_Jacobi_free(Paso_Solver_Jacobi * in); |
139 |
|
140 |
err_t Paso_Solver_GMRES2(Paso_Function * F, const double* f0, const double* x0, double * x, dim_t *iter, double* tolerance, Paso_Performance* pp); |
141 |
err_t Paso_Solver_NewtonGMRES(Paso_Function *F, double *x, Paso_Options* options, Paso_Performance* pp); |
142 |
|
143 |
Paso_Function * Paso_Function_LinearSystem_alloc(Paso_SystemMatrix* A, double* b, Paso_Options* options); |
144 |
err_t Paso_Function_LinearSystem_call(Paso_Function * F,double* value, const double* arg, Paso_Performance *pp); |
145 |
void Paso_Function_LinearSystem_free(Paso_Function * F); |
146 |
err_t Paso_Function_LinearSystem_setInitialGuess(Paso_SystemMatrix* A, double* x, Paso_Performance *pp); |
147 |
|
148 |
#endif /* #ifndef INC_SOLVER */ |