Skip to content

Commit 3bed361

Browse files
Change scaling_preconditioner to a proper set of DiagonalPreconditioner
1 parent 7b8bbbf commit 3bed361

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

docs/make.jl

Lines changed: 1 addition & 0 deletions
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

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,55 @@
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+
function ldiv!(y::Array, A::DiagonalPreconditioner, b::Array)
24+
@inbounds @simd for j 1:size(y, 2)
25+
for i 1:length(A.diag)
26+
y[i,j] = b[i,j] / A.diag[i]
27+
end
28+
end
29+
return y
30+
end
31+
32+
function LinearAlgebra.ldiv!(A::InvDiagonalPreconditioner, x)
33+
x .= x .* A.diag
34+
end
35+
36+
function LinearAlgebra.ldiv!(y, A::InvDiagonalPreconditioner, x)
37+
y .= x .* A.diag
38+
end
39+
40+
function ldiv!(y::Array, A::InvDiagonalPreconditioner, b::Array)
41+
@inbounds @simd for j 1:size(y, 2)
42+
for i 1:length(A.diag)
43+
y[i,j] = b[i,j] * A.diag[i]
44+
end
45+
end
46+
return y
47+
end
48+
49+
LinearAlgebra.mul!(y, A::DiagonalPreconditioner, x) = LinearAlgebra.mul!(y, InvDiagonalPreconditioner(A.diag), x)
50+
LinearAlgebra.mul!(y, A::InvDiagonalPreconditioner, x) = LinearAlgebra.mul!(y, DiagonalPreconditioner(A.diag), x)
51+
52+
## Compose Preconditioner
553

654
struct ComposePreconditioner{Ti,To}
755
inner::Ti

0 commit comments

Comments
 (0)