1
1
2
2
# # Preconditioners
3
3
4
- """
5
- LEFT
6
- P * x = x .* (1/P.s)
7
- Pi * x = x .* (P.s)
8
-
9
- RIGHT
10
- P * x = x .* (P.s)
11
- Pi * x = x .* (1/P.s)
12
- """
13
- struct ScaleVector{T}
14
- s:: T
15
- isleft:: Bool
16
- end
17
-
18
- Base. eltype (A:: ScaleVector ) = eltype (A. s)
19
- Base. adjoint (A:: ScaleVector ) = copy (A)
20
- Base. inv (A:: ScaleVector ) = ScaleVector (1 / A. s, A. isleft)
21
-
22
- # y = A x
23
- function LinearAlgebra. mul! (y, A:: ScaleVector , x)
24
- A. s == one (eltype (A. s)) && return y = x
25
-
26
- s = A. isleft ? 1 / A. s : A. s
27
- mul! (y, s, x)
28
- end
29
-
30
- # A B α + C β
31
- function LinearAlgebra. mul! (C, A:: ScaleVector , B, α, β)
32
- A. s == one (eltype (A. s)) && return @. C = α * B + β * C
33
-
34
- s = A. isleft ? 1 / A. s : A. s
35
- mul! (C, s, B, α, β)
36
- end
37
-
38
- function LinearAlgebra. ldiv! (A:: ScaleVector , x)
39
- A. s == one (eltype (A. s)) && return x
40
-
41
- s = A. isleft ? A. s : 1 / A. s
42
- @. x = x * s
43
- end
44
-
45
- function LinearAlgebra. ldiv! (y, A:: ScaleVector , x)
46
- A. s == one (eltype (A. s)) && return y = x
47
-
48
- s = A. isleft ? A. s : 1 / A. s
49
- mul! (y, s, x)
50
- end
4
+ default_preconditioner (s, isleft) = isleft ? I * s : I * (1 / s)
51
5
52
6
"""
53
7
C * x = P * Q * x
60
14
61
15
Base. eltype (A:: ComposePreconditioner ) = Float64 # eltype(A.inner)
62
16
Base. adjoint (A:: ComposePreconditioner ) = ComposePreconditioner (A. outer' , A. inner' )
63
- Base. inv (A:: ComposePreconditioner ) = ComposePreconditioner ( inv (A . outer), inv (A . inner) )
17
+ Base. inv (A:: ComposePreconditioner ) = InvComposePreconditioner (A )
64
18
65
- # y = A x
66
19
function LinearAlgebra. mul! (y, A:: ComposePreconditioner , x)
67
20
@unpack inner, outer = A
68
21
tmp = similar (y)
69
22
mul! (tmp, outer, x)
70
23
mul! (y, inner, tmp)
71
24
end
72
25
73
- # A B α + C β
74
26
function LinearAlgebra. mul! (C, A:: ComposePreconditioner , B, α, β)
75
27
@unpack inner, outer = A
76
28
tmp = similar (B)
@@ -92,6 +44,34 @@ function LinearAlgebra.ldiv!(y, A::ComposePreconditioner, x)
92
44
ldiv! (outer, y)
93
45
end
94
46
47
+ struct InvComposePreconditioner{Tp <: ComposePreconditioner }
48
+ P:: Tp
49
+ end
50
+
51
+ InvComposePreconditioner (inner, outer) = InvComposePreconditioner (ComposePreconditioner (inner, outer))
52
+
53
+ Base. eltype (A:: InvComposePreconditioner ) = Float64 # eltype(A.inner)
54
+ # Base.adjoint(A::InvComposePreconditioner) = ComposePreconditioner(A.outer', A.inner')
55
+ Base. inv (A:: InvComposePreconditioner ) = ComposePreconditioner (A. P)
56
+
57
+ function LinearAlgebra. mul! (y, A:: InvComposePreconditioner , x)
58
+ @unpack P = A
59
+ ldiv! (y, P, x)
60
+ end
61
+
62
+ function LinearAlgebra. mul! (C, A:: InvComposePreconditioner , B, α, β)
63
+ @unpack P = A
64
+ end
65
+
66
+ function LinearAlgebra. ldiv! (A:: InvComposePreconditioner , x)
67
+ @unpack P = A
68
+ end
69
+
70
+ function LinearAlgebra. ldiv! (y, A:: InvComposePreconditioner , x)
71
+ @unpack P = A
72
+ mul! (y, P, x)
73
+ end
74
+
95
75
# # Krylov.jl
96
76
97
77
struct KrylovJL{F,Tl,Tr,I,A,K} <: AbstractKrylovSubspaceMethod
@@ -202,8 +182,8 @@ function SciMLBase.solve(cache::LinearCache, alg::KrylovJL; kwargs...)
202
182
TODO - pass in inv(Pl), inv(Pr) to Krylov.jl
203
183
"""
204
184
205
- # M = ComposePreconditioner (alg.Pl, cache.Pl) # left precond
206
- # N = ComposePreconditioner (alg.Pr, cache.Pr) # right
185
+ # M = InvComposePreconditioner (alg.Pl, cache.Pl) # left precond
186
+ # N = InvComposePreconditioner (alg.Pr, cache.Pr) # right
207
187
208
188
atol = cache. abstol
209
189
rtol = cache. reltol
0 commit comments