Rheolef
7.1
an efficient C++ finite element environment
|
gmres
generalized minimum residual algorithm
solver_option sopt; sopt.tol = 1e-7; sopt.max_iter = 100; size_t m = sopt.krylov_dimension = 6; Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> H(m+1,m+1); Eigen::Matrix<T,Eigen::Dynamic,1> V(m); int status = gmres (A, x, b, ilut(a), H, V, sopt);
This function solves the unsymmetric linear system A*x=b
with the generalized minimum residual algorithm. The gmres
function follows the algorithm described on p. 20 in
R. Barrett, M. Berry, T. F. Chan, J. Demmel, J. Donato, J. Dongarra, V. Eijkhout, R. Pozo, C. Romine and H. Van der Vorst, Templates for the solution of linear systems: building blocks for iterative methods, SIAM, 1994.
The fourth argument of gmres
is a preconditionner: here, the ilut
one is used, for simplicity.
Next, H
specifies a matrix to hold the coefficients of the upper Hessenberg matrix constructed by the gmres
iterations, m
specifies the number of iterations for each restart. We have used here the eigen
dense matrix and vector types for the H
and V
vectors, with sizes related to the Krylov space dimension m
. Finally, the solver_option
variable sopt
transmits the stopping criterion with sopt.tol
and sopt.max_iter
.
On return, the sopt.residue
and sopt.n_iter
indicate the reached residue and the number of iterations effectively performed. The return status
is zero when the prescribed tolerance tol
has been obtained, and non-zero otherwise. Also, the x
variable contains the approximate solution. See also the solver_option
for more controls upon the stopping criterion.
gmres
requires two matrices as input: A
and H
. The A
matrix, which will typically be sparse, corresponds to the matrix involved in the linear system A*x=b. Conversely, the H
matrix, which will typically be dense, corresponds to the upper Hessenberg matrix that is constructed during the gmres
iterations. Within gmres
, H
is used in a different way than A
, so its class must supply different functionality. That is, A
is only accessed though its matrix-vector and transpose-matrix-vector multiplication functions. On the other hand, gmres
solves a dense upper triangular linear system of equations on H
. Therefore, the class to which H
belongs must provide H(i,j)
accessors.
It is important to remember that we use the convention that indices are 0-based. That is H(0,0)
is the first component of the matrix. Also, the type of the matrix must be compatible with the type of single vector entry. That is, operations such as H(i,j)*x(j) must be able to be carried out.
This documentation has been generated from file linalg/lib/gmres.h
The present template implementation is inspired from the IML++ 1.2
iterative method library, http://math.nist.gov/iml++