1
1
import Base: start, next, done
2
2
3
- export cg, cg!, CGIterable, PCGIterable, cg_iterator!
3
+ export cg, cg!, CGIterable, PCGIterable, cg_iterator!, CGStateVariables
4
4
5
5
mutable struct CGIterable{matT, solT, vecT, numT <: Real }
6
6
A:: matT
90
90
91
91
# Utility functions
92
92
93
+ struct CGStateVariables{T}
94
+ u:: Vector{T}
95
+ r:: Vector{T}
96
+ c:: Vector{T}
97
+ end
98
+
93
99
function cg_iterator! (x, A, b, Pl = Identity ();
94
100
tol = sqrt (eps (real (eltype (b)))),
95
101
maxiter:: Int = size (A, 2 ),
102
+ statevars:: CGStateVariables = CGStateVariables {eltype(x)} (zeros (x), similar (x), similar (x)),
96
103
initially_zero:: Bool = false
97
104
)
98
- u = zeros (x)
99
- r = similar (x)
105
+ u = statevars. u
106
+ r = statevars. r
107
+ c = statevars. c
108
+ u .= zero (eltype (x))
100
109
copy! (r, b)
101
110
102
111
# Compute r with an MV-product or not.
@@ -107,7 +116,7 @@ function cg_iterator!(x, A, b, Pl = Identity();
107
116
reltol = residual * tol # Save one dot product
108
117
else
109
118
mv_products = 1
110
- c = A * x
119
+ A_mul_B! (c, A, x)
111
120
r .- = c
112
121
residual = norm (r)
113
122
reltol = norm (b) * tol
@@ -175,6 +184,7 @@ function cg!(x, A, b;
175
184
tol = sqrt (eps (real (eltype (b)))),
176
185
maxiter:: Int = size (A, 2 ),
177
186
log:: Bool = false ,
187
+ statevars:: CGStateVariables = CGStateVariables {eltype(x)} (zeros (x), similar (x), similar (x)),
178
188
verbose:: Bool = false ,
179
189
Pl = Identity (),
180
190
kwargs...
@@ -184,7 +194,7 @@ function cg!(x, A, b;
184
194
log && reserve! (history, :resnorm , maxiter + 1 )
185
195
186
196
# Actually perform CG
187
- iterable = cg_iterator! (x, A, b, Pl; tol = tol, maxiter = maxiter, kwargs... )
197
+ iterable = cg_iterator! (x, A, b, Pl; tol = tol, maxiter = maxiter, statevars = statevars, kwargs... )
188
198
if log
189
199
history. mvps = iterable. mv_products
190
200
end
0 commit comments