@@ -26,6 +26,9 @@ function MultiLevelWorkspace(::Type{Val{bs}}, ::Type{T}) where {bs, T<:Number}
26
26
end
27
27
MultiLevelWorkspace {TX, bs} (TX[], TX[], TX[])
28
28
end
29
+ Base. eltype (w:: MultiLevelWorkspace{TX} ) where TX = eltype (TX)
30
+ blocksize (w:: MultiLevelWorkspace{TX, bs} ) where {TX, bs} = bs
31
+
29
32
function residual! (m:: MultiLevelWorkspace{TX, bs} , n) where {TX, bs}
30
33
if bs === 1
31
34
push! (m. res_vecs, TX (undef, n))
@@ -129,16 +132,22 @@ Keyword Arguments
129
132
* log::Bool - return vector of residuals along with solution
130
133
131
134
"""
132
- function solve (ml:: MultiLevel , b:: AbstractVector{T} ,
135
+ function solve (ml:: MultiLevel , b:: AbstractVector , args... ; kwargs... )
136
+ n = length (ml) == 1 ? size (ml. final_A, 1 ) : size (ml. levels[1 ]. A, 1 )
137
+ V = promote_type (eltype (ml. workspace), eltype (b))
138
+ bs = blocksize (ml. workspace)
139
+ x = bs === 1 ? zeros (V, n) : zeros (V, n, bs)
140
+ return solve! (x, ml, b, args... ; kwargs... )
141
+ end
142
+ function solve! (x, ml:: MultiLevel , b:: AbstractVector{T} ,
133
143
cycle:: Cycle = V ();
134
144
maxiter:: Int = 100 ,
135
145
tol:: Float64 = 1e-5 ,
136
146
verbose:: Bool = false ,
137
147
log:: Bool = false ) where {T}
138
148
139
- A = length (ml) == 1 ? ml. final_A : ml. levels[1 ]. A
149
+ A = length (ml) == 1 ? ml. final_A : ml. levels[1 ]. A
140
150
V = promote_type (eltype (A), eltype (b))
141
- x = zeros (V, size (b))
142
151
tol = eltype (b)(tol)
143
152
log && (residuals = Vector {V} ())
144
153
normres = normb = norm (b)
0 commit comments