Skip to content

Commit 271857b

Browse files
committed
First steps towards cholesky
1 parent df3d104 commit 271857b

File tree

5 files changed

+84
-3
lines changed

5 files changed

+84
-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.5.1"
4+
version = "0.5.2"
55

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

src/cholmod_cholesky.jl

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""
2+
$(TYPEDEF)
3+
4+
Default Julia LU Factorization based on umfpack.
5+
"""
6+
mutable struct ExtendableSparseCholmodCholesky{Tv, Ti} <: AbstractExtendableSparseLU{Tv,Ti}
7+
A::ExtendableSparseMatrix{Tv,Ti}
8+
A64
9+
fact::SuiteSparse.CHOLMOD.Factor{Tv}
10+
phash::UInt64
11+
end
12+
13+
"""
14+
```
15+
ExtendableSparseCholmodCholesky(A)
16+
```
17+
"""
18+
function ExtendableSparseCholmodCholesky(A::ExtendableSparseMatrix{Tv,Ti}) where {Tv,Ti}
19+
flush!(A)
20+
A64=Symmetric(SparseMatrixCSC{Float64,Int64}(A.cscmatrix))
21+
ExtendableSparseCholmodCholesky(A,A64,cholesky(A64),A.phash)
22+
end
23+
24+
function update!(cholfact::ExtendableSparseCholmodCholesky)
25+
flush!(cholfact.A)
26+
if cholfact.A.phash!=cholfact.phash
27+
cholfact.A64=Symmetric{SparseMatrixCSC{Float64,Int64}(A.cscmatrix)}
28+
cholfact.fact=cholesky(cholfact.fact,cholfact.A64)
29+
cholfact.phash=cholfact.A.phash
30+
else
31+
cholfact.A64.data.nzval.=cholfact.A.cscmatrix.nzval
32+
cholfact.fact=cholesky!(cholfact.fact,cholfact.A64)
33+
end
34+
cholfact
35+
end
36+
37+
38+
LinearAlgebra.ldiv!(fact::ExtendableSparseCholmodCholesky, v)=fact.fact\v
39+
LinearAlgebra.ldiv!(u,fact::ExtendableSparseCholmodCholesky, v)=u.=fact.fact\v
40+

src/extendable.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,16 @@ function LinearAlgebra.cond(A::ExtendableSparseMatrix, p::Real=2)
342342
return LinearAlgebra.cond(A.cscmatrix,p)
343343
end
344344

345+
"""
346+
$(SIGNATURES)
347+
348+
[`flush!`](@ref) and check for symmetry of cscmatrix
349+
"""
350+
function LinearAlgebra.issymmetric(A::ExtendableSparseMatrix)
351+
@inbounds flush!(A)
352+
return LinearAlgebra.issymmetric(A.cscmatrix)
353+
end
354+
345355

346356

347357
"""
@@ -382,3 +392,5 @@ function SparseArrays.dropzeros!(ext::ExtendableSparseMatrix)
382392
@inbounds flush!(ext)
383393
dropzeros!(ext.cscmatrix)
384394
end
395+
396+

src/factorizations.jl

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,15 @@ end
102102
```
103103
factorize(matrix)
104104
factorize(matrix; kind=:umfpack)
105+
factorize(matrix; kind=:default)
105106
```
106-
Default Julia LU factorization based on UMFPACK.
107+
Default Julia LU factorization based on SuiteSparse.UMFPACK.
108+
109+
```
110+
factorize(matrix; kind=:cholmod)
111+
factorize(matrix; kind=:cholesky)
112+
```
113+
Default Cholesky factorization via SuiteSparse.CHOLMOD
107114
108115
```
109116
factorize(matrix; kind=:pardiso)
@@ -145,6 +152,9 @@ Create the [`AMGPreconditioner`](@ref) wrapping the Ruge-Stüben AMG preconditi
145152
function factorize(A::ExtendableSparseMatrix; kwargs...)
146153
opt=options(;kwargs...)
147154
opt[:kind]==:umfpack && return ExtendableSparseUmfpackLU(A)
155+
opt[:kind]==:default && return ExtendableSparseUmfpackLU(A)
156+
opt[:kind]==:cholmod && return ExtendableSparseCholmodCholesky(A)
157+
opt[:kind]==:cholesky && return ExtendableSparseCholmodCholesky(A)
148158
opt[:kind]==:pardiso && return PardisoLU(A,ps=Pardiso.PardisoSolver())
149159
opt[:kind]==:mklpardiso && return PardisoLU(A,ps=Pardiso.MKLPardisoSolver())
150160
if opt[:ensurelu]
@@ -237,3 +247,4 @@ include("jacobi.jl")
237247
include("ilu0.jl")
238248
include("parallel_jacobi.jl")
239249
include("umfpack_lu.jl")
250+
include("cholmod_cholesky.jl")

src/pardiso_lu.jl

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,23 @@ mutable struct PardisoLU{Tv, Ti} <: AbstractExtendableSparseLU{Tv,Ti}
99
phash::UInt64
1010
end
1111

12+
13+
function Pardiso.set_matrixtype!(ps, A::ExtendableSparseMatrix)
14+
Acsc=A.cscmatrix
15+
16+
if eltype(Acsc)==Float64 && issymmetric(Acsc)
17+
Pardiso.set_matrixtype!(ps, Pardiso.REAL_SYM)
18+
elseif eltype(Acsc)==Float64
19+
Pardiso.set_matrixtype!(ps, Pardiso.REAL_NONSYM)
20+
elseif eltype(Acsc)==Complex64 && ishermitian(Acsc)
21+
Pardiso.set_matrixtype!(ps, Pardiso.COMPLEX_HERM_INDEF)
22+
elseif eltype(Acsc)==Complex64
23+
Pardiso.set_matrixtype!(ps, Pardiso.COMPLEX_NONYSYM)
24+
else
25+
error("unable to detect matrix type")
26+
end
27+
end
28+
1229
"""
1330
```
1431
PardisoLU(A; ps=Pardiso.MKLPardisoSolver)
@@ -17,8 +34,8 @@ PardisoLU(A; ps=Pardiso.MKLPardisoSolver)
1734
function PardisoLU(A::ExtendableSparseMatrix{Tv,Ti};ps::Pardiso.AbstractPardisoSolver=Pardiso.MKLPardisoSolver()) where {Tv,Ti}
1835
@inbounds flush!(A)
1936
Acsc=A.cscmatrix
20-
eltype(Acsc) == Float64 ? Pardiso.set_matrixtype!(ps, Pardiso.REAL_NONSYM) : Pardiso.set_matrixtype!(ps, Pardiso.COMPLEX_NONSYM)
2137
Pardiso.pardisoinit(ps)
38+
Pardiso.set_matrixtype!(ps,A)
2239
Pardiso.fix_iparm!(ps, :N)
2340
Pardiso.set_phase!(ps, Pardiso.ANALYSIS_NUM_FACT)
2441
Pardiso.pardiso(ps, Tv[], Acsc, Tv[])
@@ -32,6 +49,7 @@ function update!(lufact::PardisoLU{Tv,Ti}) where {Tv, Ti}
3249
if lufact.phash!=lufact.A.phash
3350
Pardiso.set_phase!(ps, Pardiso.RELEASE_ALL)
3451
Pardiso.pardiso(ps, Tv[], Acsc, Tv[])
52+
Pardiso.set_matrixtype!(ps,lufact.A)
3553
Pardiso.set_phase!(ps, Pardiso.ANALYSIS_NUM_FACT)
3654
lufact.phash=lufact.A.phash
3755
else

0 commit comments

Comments
 (0)