/[escript]/trunk/paso/src/Solver.h
ViewVC logotype

Contents of /trunk/paso/src/Solver.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2551 - (show annotations)
Thu Jul 23 09:19:15 2009 UTC (9 years, 8 months ago) by gross
File MIME type: text/plain
File size: 6050 byte(s)
a problem with the sparse matrix unrolling fixed.
1
2 /*******************************************************
3 *
4 * Copyright (c) 2003-2009 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 #define TOLERANCE_FOR_SCALARS (double)(0.)
32 #define PASO_ONE (double)(1.0)
33 #define PASO_ZERO (double)(0.0)
34
35 /* static double ONE=1.; */
36 /* static double ZERO=0.;*/
37 /*static double TOLERANCE_FOR_SCALARS=0.;*/
38
39 /* jacobi preconditioner */
40
41 typedef struct Paso_Solver_Jacobi {
42 dim_t n_block;
43 dim_t n;
44 double* values;
45 index_t* pivot;
46 } Paso_Solver_Jacobi;
47
48
49 /* ILU preconditioner */
50 struct Paso_Solver_ILU {
51 dim_t n_block;
52 dim_t n;
53 index_t num_colors;
54 index_t* colorOf;
55 index_t* main_iptr;
56 double* factors;
57 Paso_Pattern* pattern;
58 };
59 typedef struct Paso_Solver_ILU Paso_Solver_ILU;
60
61 /* GS preconditioner */
62 struct Paso_Solver_GS {
63 dim_t n_block;
64 dim_t n;
65 index_t num_colors;
66 index_t* colorOf;
67 index_t* main_iptr;
68 double* diag;
69 Paso_SparseMatrix * factors;
70 Paso_Pattern* pattern;
71 dim_t sweeps;
72 double* x_old;
73 };
74 typedef struct Paso_Solver_GS Paso_Solver_GS;
75
76 /* RILU preconditioner */
77 struct Paso_Solver_RILU {
78 dim_t n;
79 dim_t n_block;
80 dim_t n_F;
81 dim_t n_C;
82 double* inv_A_FF;
83 index_t* A_FF_pivot;
84 Paso_SparseMatrix * A_FC;
85 Paso_SparseMatrix * A_CF;
86 index_t* rows_in_F;
87 index_t* rows_in_C;
88 index_t* mask_F;
89 index_t* mask_C;
90 double* x_F;
91 double* b_F;
92 double* x_C;
93 double* b_C;
94 struct Paso_Solver_RILU * RILU_of_Schur;
95 };
96 typedef struct Paso_Solver_RILU Paso_Solver_RILU;
97
98 /* AMG preconditioner */
99 struct Paso_Solver_AMG {
100 dim_t n;
101 dim_t level;
102 bool_t coarsest_level;
103 dim_t n_block;
104 dim_t n_F;
105 dim_t n_C;
106 double* inv_A_FF;
107 index_t* A_FF_pivot;
108 Paso_SparseMatrix * A_FC;
109 Paso_SparseMatrix * A_CF;
110 index_t* rows_in_F;
111 index_t* rows_in_C;
112 index_t* mask_F;
113 index_t* mask_C;
114 double* x_F;
115 double* b_F;
116 double* x_C;
117 double* b_C;
118 Paso_SparseMatrix * A;
119 void* solver;
120 Paso_Solver_Jacobi* GS;
121 struct Paso_Solver_AMG * AMG_of_Schur;
122 };
123 typedef struct Paso_Solver_AMG Paso_Solver_AMG;
124
125
126 /* general preconditioner interface */
127
128 typedef struct Paso_Solver_Preconditioner {
129 dim_t type;
130 /* jacobi preconditioner */
131 Paso_Solver_Jacobi* jacobi;
132 /* ilu preconditioner */
133 Paso_Solver_ILU* ilu;
134 /* rilu preconditioner */
135 Paso_Solver_RILU* rilu;
136 /* Gauss-Seidel preconditioner */
137 Paso_Solver_GS* gs;
138 /* amg preconditioner */
139 Paso_Solver_AMG* amg;
140
141 } Paso_Solver_Preconditioner;
142
143 void Paso_Solver(Paso_SystemMatrix*,double*,double*,Paso_Options*,Paso_Performance* pp);
144 void Paso_Solver_free(Paso_SystemMatrix*);
145 err_t Paso_Solver_BiCGStab( Paso_SystemMatrix * A, double* B, double * X, dim_t *iter, double * tolerance, Paso_Performance* pp);
146 err_t Paso_Solver_PCG( Paso_SystemMatrix * A, double* B, double * X, dim_t *iter, double * tolerance, Paso_Performance* pp);
147 err_t Paso_Solver_TFQMR( Paso_SystemMatrix * A, double* B, double * X, dim_t *iter, double * tolerance, Paso_Performance* pp);
148 err_t Paso_Solver_MINRES( Paso_SystemMatrix * A, double* B, double * X, dim_t *iter, double * tolerance, Paso_Performance* pp);
149 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);
150 void Paso_Preconditioner_free(Paso_Solver_Preconditioner*);
151 void Paso_Solver_setPreconditioner(Paso_SystemMatrix* A,Paso_Options* options);
152 void Paso_Solver_solvePreconditioner(Paso_SystemMatrix* A,double*,double*);
153 void Paso_Solver_applyBlockDiagonalMatrix(dim_t n_block,dim_t n,double* D,index_t* pivot,double* x,double* b);
154
155 void Paso_Solver_ILU_free(Paso_Solver_ILU * in);
156 Paso_Solver_ILU* Paso_Solver_getILU(Paso_SparseMatrix * A_p,bool_t verbose);
157 void Paso_Solver_solveILU(Paso_Solver_ILU * ilu, double * x, double * b);
158
159 void Paso_Solver_GS_free(Paso_Solver_GS * in);
160 Paso_Solver_GS* Paso_Solver_getGS(Paso_SparseMatrix * A_p,bool_t verbose);
161 void Paso_Solver_solveGS(Paso_Solver_GS * gs, double * x, double * b);
162
163 void Paso_Solver_RILU_free(Paso_Solver_RILU * in);
164 Paso_Solver_RILU* Paso_Solver_getRILU(Paso_SparseMatrix * A_p,bool_t verbose);
165 void Paso_Solver_solveRILU(Paso_Solver_RILU * rilu, double * x, double * b);
166
167 void Paso_Solver_AMG_free(Paso_Solver_AMG * in);
168 Paso_Solver_AMG* Paso_Solver_getAMG(Paso_SparseMatrix * A_p,dim_t level,Paso_Options* options);
169 void Paso_Solver_solveAMG(Paso_Solver_AMG * amg, double * x, double * b);
170
171 void Paso_Solver_updateIncompleteSchurComplement(Paso_SparseMatrix* A_CC, Paso_SparseMatrix *A_CF,double* invA_FF,index_t* A_FF_pivot, Paso_SparseMatrix *A_FC);
172 Paso_Solver_Jacobi* Paso_Solver_getJacobi(Paso_SparseMatrix * A_p);
173 void Paso_Solver_solveJacobi(Paso_Solver_Jacobi * prec, double * x, double * b);
174 void Paso_Solver_Jacobi_free(Paso_Solver_Jacobi * in);
175
176 err_t Paso_Solver_GMRES2(Paso_Function * F, const double* f0, const double* x0, double * x, dim_t *iter, double* tolerance, Paso_Performance* pp);
177 err_t Paso_Solver_NewtonGMRES(Paso_Function *F, double *x, Paso_Options* options, Paso_Performance* pp);
178
179 Paso_Function * Paso_Function_LinearSystem_alloc(Paso_SystemMatrix* A, double* b, Paso_Options* options);
180 err_t Paso_Function_LinearSystem_call(Paso_Function * F,double* value, const double* arg, Paso_Performance *pp);
181 void Paso_Function_LinearSystem_free(Paso_Function * F);
182 err_t Paso_Function_LinearSystem_setInitialGuess(Paso_SystemMatrix* A, double* x, Paso_Performance *pp);
183
184 #endif /* #ifndef INC_SOLVER */

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.26