Skip to content

Commit ad7c877

Browse files
Merge pull request #63 from SciML/prec
Change scaling_preconditioner to a proper set of DiagonalPreconditioner
2 parents 7b8bbbf + 2bb64f9 commit ad7c877

File tree

3 files changed

+62
-9
lines changed

3 files changed

+62
-9
lines changed

docs/make.jl

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ makedocs(
2020
"Basics" => Any[
2121
"basics/LinearProblem.md",
2222
"basics/CachingAPI.md",
23+
"basics/Preconditioners.md",
2324
"basics/FAQ.md"
2425
],
2526
"Solvers" => Any[

src/preconditioners.jl

+55-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,59 @@
1-
## Preconditioners
1+
## Diagonal Preconditioners
22

3-
scaling_preconditioner(s::Number) = I * (1/s), I * s
4-
scaling_preconditioner(s::AbstractVector) = Diagonal(inv.(s)),Diagonal(s)
3+
struct DiagonalPreconditioner{D}
4+
diag::D
5+
end
6+
struct InvDiagonalPreconditioner{D}
7+
diag::D
8+
end
9+
10+
Base.eltype(A::Union{DiagonalPreconditioner,InvDiagonalPreconditioner}) = eltype(A.diag)
11+
Base.adjoint(A::Union{DiagonalPreconditioner,InvDiagonalPreconditioner}) = A
12+
Base.inv(A::DiagonalPreconditioner) = InvDiagonalPreconditioner(A.diag)
13+
Base.inv(A::InvDiagonalPreconditioner) = DiagonalPreconditioner(A.diag)
14+
15+
function LinearAlgebra.ldiv!(A::DiagonalPreconditioner, x)
16+
x .= x ./ A.diag
17+
end
18+
19+
function LinearAlgebra.ldiv!(y, A::DiagonalPreconditioner, x)
20+
y .= x ./ A.diag
21+
end
22+
23+
#=
24+
function LinearAlgebra.ldiv!(y::Matrix, A::DiagonalPreconditioner, b::Matrix)
25+
@inbounds @simd for j ∈ 1:size(y, 2)
26+
for i ∈ 1:length(A.diag)
27+
y[i,j] = b[i,j] / A.diag[i]
28+
end
29+
end
30+
return y
31+
end
32+
=#
33+
34+
function LinearAlgebra.ldiv!(A::InvDiagonalPreconditioner, x)
35+
x .= x .* A.diag
36+
end
37+
38+
function LinearAlgebra.ldiv!(y, A::InvDiagonalPreconditioner, x)
39+
y .= x .* A.diag
40+
end
41+
42+
#=
43+
function LinearAlgebra.ldiv!(y::Matrix, A::InvDiagonalPreconditioner, b::Matrix)
44+
@inbounds @simd for j ∈ 1:size(y, 2)
45+
for i ∈ 1:length(A.diag)
46+
y[i,j] = b[i,j] * A.diag[i]
47+
end
48+
end
49+
return y
50+
end
51+
=#
52+
53+
LinearAlgebra.mul!(y, A::DiagonalPreconditioner, x) = LinearAlgebra.ldiv!(y, InvDiagonalPreconditioner(A.diag), x)
54+
LinearAlgebra.mul!(y, A::InvDiagonalPreconditioner, x) = LinearAlgebra.ldiv!(y, DiagonalPreconditioner(A.diag), x)
55+
56+
## Compose Preconditioner
557

658
struct ComposePreconditioner{Ti,To}
759
inner::Ti

test/runtests.jl

+6-6
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,13 @@ end
197197
end
198198

199199
@testset "Preconditioners" begin
200-
@testset "scaling_preconditioner" begin
200+
@testset "Scalar Diagonal Preconditioner" begin
201201
s = rand()
202202

203203
x = rand(n,n)
204204
y = rand(n,n)
205205

206-
Pl, Pr = LinearSolve.scaling_preconditioner(1/s)
206+
Pl, Pr = LinearSolve.DiagonalPreconditioner(s),LinearSolve.InvDiagonalPreconditioner(s)
207207

208208
mul!(y, Pl, x); @test y s * x
209209
mul!(y, Pr, x); @test y s \ x
@@ -215,9 +215,9 @@ end
215215
ldiv!(y, Pr, x); @test y s * x
216216
end
217217

218-
@testset "vector scaling_preconditioner" begin
218+
@testset "Vector Diagonal Preconditioner" begin
219219
s = rand(n)
220-
Pl, Pr = LinearSolve.scaling_preconditioner(1 ./ s)
220+
Pl, Pr = LinearSolve.DiagonalPreconditioner(s),LinearSolve.InvDiagonalPreconditioner(s)
221221

222222
x = rand(n,n)
223223
y = rand(n,n)
@@ -239,8 +239,8 @@ end
239239
x = rand(n,n)
240240
y = rand(n,n)
241241

242-
P1, _ = LinearSolve.scaling_preconditioner(s1)
243-
P2, _ = LinearSolve.scaling_preconditioner(s2)
242+
P1 = LinearSolve.DiagonalPreconditioner(s1)
243+
P2 = LinearSolve.DiagonalPreconditioner(s2)
244244

245245
P = LinearSolve.ComposePreconditioner(P1,P2)
246246
Pi = LinearSolve.InvComposePreconditioner(P)

0 commit comments

Comments
 (0)