28 SUBROUTINE cg (dim, mat, rhs, sol, max_iter, tol)
39#include "implicit_f.inc"
43 INTEGER,
INTENT(IN) :: dim
44 my_real,
INTENT(INOUT) :: mat(dim, dim)
45 my_real,
INTENT(INOUT) :: rhs(dim)
46 my_real,
INTENT(OUT) :: sol(dim)
47 INTEGER,
INTENT(IN) :: max_iter
55 my_real :: r(dim), rnew(dim), p(dim), temp(dim)
63 r(1:dim) = rhs(1:dim) - matmul(mat(1:dim, 1:dim), sol(1:dim))
65 norm_init = maxval(abs(r(1:dim)))
70 DO WHILE ((iter < max_iter) .AND. (error > tol
73 temp(1:dim) = matmul(mat(1:dim, 1:dim), p(1:dim))
74 alpha = dot_product(r(1:dim), r(1:dim)) / dot_product(temp(1:dim), p(1:dim))
77 rnew(ii) = r(ii) -
alpha * temp(ii)
79 beta = dot_product(rnew(1:dim), rnew(1:dim)) / dot_product(r(1:dim), r(1:dim))
81 p(ii) = rnew(ii) + beta * p(ii)
84 error = maxval(abs(r(1:dim))) / norm_init