Skip to content

Commit 659924b

Browse files
committed
fix newly introduced type piracies
1 parent 868991c commit 659924b

File tree

2 files changed

+25
-19
lines changed

2 files changed

+25
-19
lines changed

ext/ExtendableSparseLinearSolveExt.jl

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,23 @@ import ExtendableSparse: LinearSolvePreconBuilder
44
import LinearAlgebra
55
using SparseArrays: AbstractSparseMatrixCSC
66

7-
# Harrr!
8-
# Avoid type piracy by adding a wrapper struct
9-
function (method::LinearSolve.AbstractFactorization)(A)
7+
8+
struct LinearSolvePrecon{T}
9+
cache::T
10+
end
11+
12+
function LinearSolvePrecon(A,method::LinearSolve.AbstractFactorization)
1013
pr = LinearProblem(A, zeros(eltype(A), size(A, 1)))
11-
init(pr, method)
14+
LinearSolvePrecon(init(pr, method))
1215
end
1316

14-
function LinearAlgebra.ldiv!(u, cache::LinearSolve.LinearCache, b)
15-
cache.b = b
16-
sol = solve!(cache)
17+
function LinearAlgebra.ldiv!(u, P::LinearSolvePrecon, b)
18+
P.cache.b = b
19+
sol = solve!(P.cache)
1720
copyto!(u, sol.u)
1821
end
1922

20-
(b::LinearSolvePreconBuilder)(A::AbstractSparseMatrixCSC,p) = (b.method(A), LinearAlgebra.I)
23+
(b::LinearSolvePreconBuilder)(A::AbstractSparseMatrixCSC,p) = (LinearSolvePrecon(A,b.method), LinearAlgebra.I)
2124

2225
end
2326

src/preconbuilders.jl

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,29 @@ Base.@kwdef struct ILUZeroPreconBuilder
3030
blocksize::Int = 1
3131
end
3232

33-
function (b::ILUZeroPreconBuilder)(A0,p)
34-
A=SparseMatrixCSC(size(A0)..., getcolptr(A0), rowvals(A0),nonzeros(A0))
35-
if b.blocksize==1
36-
(ILUZero.ilu0(A),LinearAlgebra.I)
37-
else
38-
(ILUZero.ilu0(pointblock(A,b.blocksize),SVector{b.blocksize,eltype(A)}),LinearAlgebra.I)
39-
end
33+
struct ILUBlockPrecon{N,NN,Tv,Ti}
34+
ilu0::ILUZero.ILU0Precon{SMatrix{N, N, Tv, NN}, Ti, SVector{N, Tv}}
4035
end
4136

42-
# Harrr!!! ☠
43-
# We could resolve this piracy by introducing a wrapper type for the block case.
4437
function LinearAlgebra.ldiv!(Y::Vector{Tv},
45-
A::ILUZero.ILU0Precon{SMatrix{N, N, Tv, NN}, Ti, SVector{N, Tv}},
38+
A::ILUBlockPrecon{N,NN,Tv,Ti},
4639
B::Vector{Tv}) where {N,NN,Tv,Ti}
4740
BY=reinterpret(SVector{N,Tv},Y)
4841
BB=reinterpret(SVector{N,Tv},B)
49-
ldiv!(BY,A,BB)
42+
ldiv!(BY,A.ilu0,BB)
5043
Y
5144
end
5245

46+
function (b::ILUZeroPreconBuilder)(A0,p)
47+
A=SparseMatrixCSC(size(A0)..., getcolptr(A0), rowvals(A0),nonzeros(A0))
48+
if b.blocksize==1
49+
(ILUZero.ilu0(A),LinearAlgebra.I)
50+
else
51+
(ILUBlockPrecon(ILUZero.ilu0(pointblock(A,b.blocksize),SVector{b.blocksize,eltype(A)})),LinearAlgebra.I)
52+
end
53+
end
54+
55+
5356
"""
5457
ILUTPreconBuilder(; droptol=0.1)
5558

0 commit comments

Comments
 (0)