Skip to content

Commit 93c8890

Browse files
committed
Started to introduce preconditioners
1 parent 48ba27f commit 93c8890

File tree

6 files changed

+134
-3
lines changed

6 files changed

+134
-3
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ExtendableSparse"
22
uuid = "95c220a8-a1cf-11e9-0c77-dbfce5f500b3"
33
authors = ["Juergen Fuhrmann <juergen.fuhrmann@wias-berlin.de>"]
4-
version = "0.2.3"
4+
version = "0.2.4"
55

66
[deps]
77
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"

src/ExtendableSparse.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ using LinearAlgebra
55

66
include("sparsematrixlnk.jl")
77
include("extendable.jl")
8+
include("preconditioners.jl")
89
include("sprand.jl")
910

1011
export SparseMatrixLNK,ExtendableSparseMatrix,flush!,nnz, sprand!,sprand_sdd!
12+
export JacobiPreconditioner, ILU0Preconditioner
1113

1214
export colptrs
1315
end # module

src/extendable.jl

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ mutable struct ExtendableSparseMatrix{Tv,Ti<:Integer} <: AbstractSparseMatrix{Tv
1717
Linked list structure holding data of extension
1818
"""
1919
lnkmatrix::Union{SparseMatrixLNK{Tv,Ti},Nothing}
20+
21+
"""
22+
Time stamp of last pattern update
23+
"""
24+
pattern_timestamp::Float64
2025
end
2126

2227

@@ -26,7 +31,7 @@ $(SIGNATURES)
2631
Create empty ExtendableSparseMatrix.
2732
"""
2833
function ExtendableSparseMatrix{Tv,Ti}(m::Integer, n::Integer) where{Tv,Ti<:Integer}
29-
ExtendableSparseMatrix{Tv,Ti}(spzeros(Tv,Ti,m,n),nothing)
34+
ExtendableSparseMatrix{Tv,Ti}(spzeros(Tv,Ti,m,n),nothing,time())
3035
end
3136

3237
"""
@@ -62,7 +67,7 @@ $(SIGNATURES)
6267
Create ExtendableSparseMatrix from SparseMatrixCSC
6368
"""
6469
function ExtendableSparseMatrix(csc::SparseMatrixCSC{Tv,Ti}) where{Tv,Ti<:Integer}
65-
return ExtendableSparseMatrix{Tv,Ti}(csc, nothing)
70+
return ExtendableSparseMatrix{Tv,Ti}(csc, nothing, time())
6671
end
6772

6873

@@ -148,6 +153,7 @@ function flush!(ext::ExtendableSparseMatrix{Tv,Ti}) where {Tv, Ti<:Integer}
148153
if ext.lnkmatrix!=nothing && nnz(ext.lnkmatrix)>0
149154
ext.cscmatrix=ext.lnkmatrix+ext.cscmatrix
150155
ext.lnkmatrix=nothing
156+
ext.pattern_timestamp
151157
end
152158
return ext
153159
end

src/ilu0.jl

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
mutable struct ILU0Preconditioner{Tv, Ti} <: AbstractPreconditioner{Tv,Ti}
2+
extmatrix::ExtendableSparseMatrix{Tv,Ti}
3+
xdiag::Array{Tv,1}
4+
idiag::Array{Ti,1}
5+
pattern_timestamp::Float64
6+
end
7+
8+
9+
function ILU0Preconditioner(extmatrix::ExtendableSparseMatrix{Tv,Ti}) where {Tv,Ti}
10+
@assert size(extmatrix,1)==size(extmatrix,2)
11+
flush!(extmatrix)
12+
n=size(extmatrix,1)
13+
xdiag=Array{Tv,1}(undef,n)
14+
idiag=Array{Ti,1}(undef,n)
15+
precon=ILU0Preconditioner{Tv, Ti}(extmatrix,xdiag,idiag,0.0)
16+
update!(precon)
17+
end
18+
19+
function update!(precon::ILU0Preconditioner{Tv,Ti}) where {Tv,Ti}
20+
cscmatrix=precon.extmatrix.cscmatrix
21+
colptr=cscmatrix.colptr
22+
rowval=cscmatrix.rowval
23+
nzval=cscmatrix.nzval
24+
n=cscmatrix.n
25+
xdiag=precon.xdiag
26+
idiag=precon.idiag
27+
28+
# Find main diagonal index and
29+
# copy main diagonal values
30+
if need_symbolic_update(precon)
31+
@inbounds for j=1:n
32+
@inbounds for k=colptr[j]:colptr[j+1]-1
33+
i=rowval[k]
34+
if i==j
35+
idiag[j]=k
36+
break
37+
end
38+
end
39+
end
40+
timestamp!(precon)
41+
end
42+
43+
@inbounds for j=1:n
44+
xdiag[j]=one(Tv)/nzval[idiag[j]]
45+
@inbounds for k=idiag[j]+1:colptr[j+1]-1
46+
i=rowval[k]
47+
for l=colptr[i]:colptr[i+1]-1
48+
if rowval[l]==j
49+
xdiag[i]-=nzval[l]*xdiag[j]*nzval[k]
50+
break
51+
end
52+
end
53+
end
54+
end
55+
precon
56+
end
57+
58+
59+
function LinearAlgebra.ldiv!(u::AbstractArray{T,1}, precon::ILU0Preconditioner, v::AbstractArray{T,1}) where T
60+
cscmatrix=precon.extmatrix.cscmatrix
61+
colptr=cscmatrix.colptr
62+
rowval=cscmatrix.rowval
63+
n=cscmatrix.n
64+
nzval=cscmatrix.nzval
65+
xdiag=precon.xdiag
66+
idiag=precon.idiag
67+
68+
@inbounds for j=1:n
69+
x=zero(T)
70+
@inbounds for k=colptr[j]:idiag[j]-1
71+
x+=nzval[k]*u[rowval[k]]
72+
end
73+
u[j]=xdiag[j]*(v[j]-x)
74+
end
75+
76+
@inbounds for j=n:-1:1
77+
x=zero(T)
78+
@inbounds for k=idiag[j]+1:colptr[j+1]-1
79+
x+=u[rowval[k]]*nzval[k]
80+
end
81+
u[j]-=x*xdiag[j]
82+
end
83+
end
84+
85+

src/jacobi.jl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
struct JacobiPreconditioner{Tv, Ti} <: AbstractPreconditioner{Tv,Ti}
2+
extmatrix::ExtendableSparseMatrix{Tv,Ti}
3+
invdiag::Array{Tv,1}
4+
end
5+
6+
function update!(precon::JacobiPreconditioner)
7+
cscmatrix=precon.extmatrix.cscmatrix
8+
invdiag=precon.invdiag
9+
n=cscmatrix.n
10+
@inbounds for i=1:n
11+
invdiag[i]=1.0/cscmatrix[i,i]
12+
end
13+
precon
14+
end
15+
16+
function JacobiPreconditioner(extmatrix::ExtendableSparseMatrix{Tv,Ti}) where {Tv,Ti}
17+
@assert size(extmatrix,1)==size(extmatrix,2)
18+
flush!(extmatrix)
19+
invdiag=Array{Tv,1}(undef,extmatrix.cscmatrix.n)
20+
precon=JacobiPreconditioner{Tv, Ti}(extmatrix,invdiag)
21+
update!(precon)
22+
end
23+
24+
25+
function LinearAlgebra.ldiv!(u::AbstractArray{T,1} where T, precon::JacobiPreconditioner, v::AbstractArray{T,1} where T)
26+
invdiag=precon.invdiag
27+
n=length(invdiag)
28+
@inbounds @simd for i=1:n
29+
u[i]=invdiag[i]*v[i]
30+
end
31+
end

src/preconditioners.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
abstract type AbstractPreconditioner{Tv,Ti} end
2+
3+
need_symbolic_update(precon::AbstractPreconditioner)=precon.extmatrix.pattern_timestamp>precon.pattern_timestamp
4+
timestamp!(precon::AbstractPreconditioner)= precon.pattern_timestamp=time()
5+
6+
include("jacobi.jl")
7+
include("ilu0.jl")

0 commit comments

Comments
 (0)