|
1 |
| -## Preconditioners |
| 1 | +## Diagonal Preconditioners |
2 | 2 |
|
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 |
5 | 57 |
|
6 | 58 | struct ComposePreconditioner{Ti,To}
|
7 | 59 | inner::Ti
|
|
0 commit comments