Skip to content

Commit eddb0ea

Browse files
committed
Add sparspak lu factorization (via require)
1 parent ce380c3 commit eddb0ea

File tree

5 files changed

+73
-20
lines changed

5 files changed

+73
-20
lines changed

Project.toml

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

66
[deps]
77
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
8-
IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153"
98
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
10-
Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2"
119
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
1210
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
1311
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
@@ -16,7 +14,6 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1614

1715
[compat]
1816
DocStringExtensions = "0.8.0,0.9"
19-
IterativeSolvers = "0.9.2"
2017
Requires = "1.1.3"
2118
julia = "1.6"
2219

src/ExtendableSparse.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
module ExtendableSparse
22
using SparseArrays
33
using LinearAlgebra
4-
using SuiteSparse
4+
5+
if Base.USE_GPL_LIBS
6+
using SuiteSparse
7+
end
58

69
using Requires
710

@@ -23,7 +26,7 @@ export AbstractFactorization,LUFactorization, CholeskyFactorization
2326
export issolver
2427
export factorize!, update!
2528
export ILUTPreconditioner, AMGPreconditioner
26-
export PardisoLU, MKLPardisoLU
29+
export PardisoLU, MKLPardisoLU,SparspakLU
2730

2831
include("simple_iteration.jl")
2932
export simple,simple!
@@ -39,6 +42,7 @@ function __init__()
3942
@require Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" include("pardiso_lu.jl")
4043
@require IncompleteLU = "40713840-3770-5561-ab4c-a76e7d0d7895" include("ilut.jl")
4144
@require AlgebraicMultigrid = "2169fc97-5a83-5252-b627-83903c6c433c" include("amg.jl")
45+
@require Sparspak = "e56a9233-b9d6-4f03-8d0f-1825330902ac" include("sparspak.jl")
4246
end
4347

4448

src/sparspak.jl

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
mutable struct SparspakLU{Tv, Ti} <: AbstractLUFactorization{Tv,Ti}
2+
A::Union{ExtendableSparseMatrix{Tv,Ti},Nothing}
3+
P::Union{Sparspak.SpkProblem.Problem{Ti,Tv},Nothing}
4+
S::Union{Sparspak.SparseSolver.SparseSolver{Ti,Tv},Nothing}
5+
phash::UInt64
6+
end
7+
8+
function SparspakLU{Tv,Ti}() where {Tv,Ti}
9+
fact=SparspakLU{Tv,Ti}(nothing,nothing,nothing,0)
10+
end
11+
12+
13+
"""
14+
```
15+
SparspakLU(;valuetype=Float64)
16+
```
17+
18+
LU factorization based on P.Kryls's re-implementation of SPARSPAK.
19+
"""
20+
SparspakLU(;valuetype::Type=Float64, indextype::Type=Int64,kwargs...)=SparspakLU{valuetype,indextype}(;kwargs...)
21+
22+
function update!(lufact::SparspakLU{Tv,Ti}) where {Tv, Ti}
23+
flush!(lufact.A)
24+
lufact.P=Sparspak.SpkProblem.Problem(size(lufact.A)...)
25+
Sparspak.SpkProblem.insparse!(lufact.P,lufact.A)
26+
lufact.S=Sparspak.SparseSolver.SparseSolver(lufact.P)
27+
end
28+
29+
function LinearAlgebra.ldiv!(u::AbstractArray{T,1} where T, lufact::SparspakLU, v::AbstractArray{T,1} where T)
30+
u.=ldiv!(lufact,v)
31+
end
32+
33+
function LinearAlgebra.ldiv!(lufact::SparspakLU, v::AbstractArray{T,1} where T)
34+
Sparspak.SpkProblem.infullrhs!(lufact.P,v)
35+
Sparspak.SparseSolver.solve!(lufact.S)
36+
lufact.P.x
37+
end
38+
39+
40+
@eval begin
41+
@makefrommatrix SparspakLU
42+
end

test/Project.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
77
Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2"
88
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
99
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
10+
Sparspak = "e56a9233-b9d6-4f03-8d0f-1825330902ac"
1011
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1112

1213
[compat]
1314
AlgebraicMultigrid = "0.4,0.5"
1415
IncompleteLU = "^0.2"
16+
IterativeSolvers = "0.9"
1517
Pardiso = "^0.5.1"
18+
Sparspak = "0.2"

test/runtests.jl

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ using Pardiso
99
using AlgebraicMultigrid
1010
using IncompleteLU
1111
using IterativeSolvers
12+
using Sparspak
1213

1314

1415
##############################################################
@@ -403,26 +404,21 @@ end
403404
end
404405

405406

406-
if Base.USE_GPL_LIBS
407-
#requires SuiteSparse which is not available on non-GPL builds
408407
@testset "mkl-pardiso" begin
409-
if !Sys.isapple()
410-
@test test_lu1(10,10,10,lufac=MKLPardisoLU())
411-
@test test_lu1(25,40,1,lufac=MKLPardisoLU())
412-
@test test_lu1(1000,1,1,lufac=MKLPardisoLU())
413-
414-
@test test_lu2(10,10,10,lufac=MKLPardisoLU())
415-
@test test_lu2(25,40,1,lufac=MKLPardisoLU())
416-
@test test_lu2(1000,1,1,lufac=MKLPardisoLU())
417-
end
408+
if !Sys.isapple()
409+
@test test_lu1(10,10,10,lufac=MKLPardisoLU())
410+
@test test_lu1(25,40,1,lufac=MKLPardisoLU())
411+
@test test_lu1(1000,1,1,lufac=MKLPardisoLU())
412+
413+
@test test_lu2(10,10,10,lufac=MKLPardisoLU())
414+
@test test_lu2(25,40,1,lufac=MKLPardisoLU())
415+
@test test_lu2(1000,1,1,lufac=MKLPardisoLU())
416+
end
418417
# @test test_lu2(10,10,10,lufac=MKLPardisoLU(mtype=2))
419418
# @test test_lu2(25,40,1,lufac=MKLPardisoLU(mtype=2))
420419
# @test test_lu2(1000,1,1,lufac=MKLPardisoLU(mtype=2))
421420
end
422-
end
423421

424-
if Base.USE_GPL_LIBS
425-
#requires SuiteSparse which is not available on non-GPL builds
426422
if Pardiso.PARDISO_LOADED[]
427423
@testset "pardiso" begin
428424
@test test_lu1(10,10,10,lufac=PardisoLU())
@@ -439,6 +435,17 @@ if Pardiso.PARDISO_LOADED[]
439435

440436
end
441437
end
438+
439+
440+
@testset "sparspak" begin
441+
@test test_lu1(10,10,10,lufac=SparspakLU())
442+
@test test_lu1(25,40,1,lufac=SparspakLU())
443+
@test test_lu1(1000,1,1,lufac=SparspakLU())
444+
445+
@test test_lu2(10,10,10,lufac=SparspakLU())
446+
@test test_lu2(25,40,1,lufac=SparspakLU())
447+
@test test_lu2(1000,1,1,lufac=SparspakLU())
448+
442449
end
443450

444451

0 commit comments

Comments
 (0)