Skip to content

Commit f0f22f0

Browse files
committed
Fix solve and preconditioner API allowing different initializations
1 parent f67246c commit f0f22f0

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

src/preconditioner.jl

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,42 @@
1-
struct Preconditioner
2-
ml::MultiLevel
1+
struct Preconditioner{ML<:MultiLevel}
2+
ml::ML
3+
init::Symbol
34
end
5+
Preconditioner(ml) = Preconditioner(ml, :zero)
46

57
aspreconditioner(ml::MultiLevel) = Preconditioner(ml)
68

79
@static if VERSION < v"0.7-"
810
import Base: \, *, A_ldiv_B!, A_mul_B!
9-
A_ldiv_B!(x, p::Preconditioner, b) = copyto!(x, p \ b)
11+
function A_ldiv_B!(x, p::Preconditioner, b)
12+
if p.init == :zero
13+
x .= 0
14+
else
15+
x .= b
16+
end
17+
solve!(x, p.ml, b, maxiter = 1, calculate_residual = false)
18+
end
1019
A_mul_B!(b, p::Preconditioner, x) = A_mul_B!(b, p.ml.levels[1].A, x)
1120
else
1221
import Compat.LinearAlgebra: \, *, ldiv!, mul!
1322
ldiv!(p::Preconditioner, b) = copyto!(b, p \ b)
14-
ldiv!(x, p::Preconditioner, b) = copyto!(x, p \ b)
23+
function ldiv!(x, p::Preconditioner, b)
24+
if p.init == :zero
25+
x .= 0
26+
else
27+
x .= b
28+
end
29+
solve!(x, p.ml, b, maxiter = 1, calculate_residual = false)
30+
end
1531
mul!(b, p::Preconditioner, x) = mul!(b, p.ml.levels[1].A, x)
1632
end
1733

18-
\(p::Preconditioner, b) = solve(p.ml, b, maxiter = 1, calculate_residual = false)
34+
function \(p::Preconditioner, b)
35+
if p.init == :zero
36+
x = zeros(b)
37+
else
38+
x = copy(b)
39+
end
40+
solve!(x, p.ml, b)
41+
end
1942
*(p::Preconditioner, b) = p.ml.levels[1].A * x

0 commit comments

Comments
 (0)