29
30
31
32
33
34
35
36
37
38
39#include "implicit_f.inc"
40
41
42
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
49
50
51
52 INTEGER ii
53 INTEGER iter
55 my_real :: r(dim), rnew(dim), p(dim), temp(dim)
57
58
59
60
61 sol(1:dim) = zero
62
63 r(1:dim) = rhs(1:dim) - matmul(mat(1:dim, 1:dim), sol(1:dim))
64 p(1:dim) = r(1:dim)
65 norm_init = maxval(abs(r(1:dim)))
66 error = norm_init
67 iter = 0
68
69
70 DO WHILE ((iter < max_iter) .AND. (error > tol))
71
72 iter = iter + 1
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))
75 DO ii = 1, dim
76 sol(ii) = sol(ii) +
alpha * p(ii)
77 rnew(ii) = r(ii) -
alpha * temp(ii)
78 ENDDO
79 beta = dot_product(rnew(1:dim), rnew(1:dim)) / dot_product(r(1:dim), r(1:dim))
80 DO ii = 1, dim
81 p(ii) = rnew(ii) + beta * p(ii)
82 r(ii) = rnew(ii)
83 ENDDO
84 error = maxval(abs(r(1:dim))) / norm_init
85 ENDDO
86
87 IF (error > tol) THEN
88
89 ENDIF
90
91