Skip to content

Commit e17d676

Browse files
Merge pull request #241 from SciML/sparspak
Add Sparspak
2 parents a0facd9 + 5f33804 commit e17d676

File tree

4 files changed

+45
-1
lines changed

4 files changed

+45
-1
lines changed

Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
2020
Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46"
2121
SnoopPrecompile = "66db9d55-30c0-4569-8b51-7e840670fc0c"
2222
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
23+
Sparspak = "e56a9233-b9d6-4f03-8d0f-1825330902ac"
2324
SuiteSparse = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"
2425
UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
2526

src/LinearSolve.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ using Setfield
1212
using UnPack
1313
using SuiteSparse
1414
using KLU
15+
using Sparspak
1516
using FastLapackInterface
1617
using DocStringExtensions
1718
import GPUArraysCore
@@ -82,7 +83,8 @@ end
8283

8384
export LUFactorization, SVDFactorization, QRFactorization, GenericFactorization,
8485
GenericLUFactorization, SimpleLUFactorization, RFLUFactorization,
85-
UMFPACKFactorization, KLUFactorization, FastLUFactorization, FastQRFactorization
86+
UMFPACKFactorization, KLUFactorization, FastLUFactorization, FastQRFactorization,
87+
SparspakFactorization
8688

8789
export LinearSolveFunction
8890

src/factorization_sparse.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,31 @@ function _ldiv!(x::Vector,
55
SuiteSparse.SPQR.QRSparse}, b::Vector)
66
x .= A \ b
77
end
8+
9+
struct SparspakFactorization <: AbstractFactorization end
10+
11+
function init_cacheval(::SparspakFactorization, A, b, u, Pl, Pr, maxiters::Int, abstol,
12+
reltol,
13+
verbose::Bool, assumptions::OperatorAssumptions)
14+
A = convert(AbstractMatrix, A)
15+
p = Sparspak.Problem.Problem(size(A)...)
16+
Sparspak.Problem.insparse!(p, A)
17+
Sparspak.Problem.infullrhs!(p, b)
18+
s = Sparspak.SparseSolver.SparseSolver(p)
19+
return s
20+
end
21+
22+
function SciMLBase.solve(cache::LinearCache, alg::SparspakFactorization; kwargs...)
23+
A = cache.A
24+
A = convert(AbstractMatrix, A)
25+
if cache.isfresh
26+
p = Sparspak.Problem.Problem(size(A)...)
27+
Sparspak.Problem.insparse!(p, A)
28+
Sparspak.Problem.infullrhs!(p, cache.b)
29+
s = Sparspak.SparseSolver.SparseSolver(p)
30+
cache = set_cacheval(cache, s)
31+
end
32+
Sparspak.SparseSolver.solve!(cache.cacheval)
33+
copyto!(cache.u, cache.cacheval.p.x)
34+
SciMLBase.build_linear_solution(alg, cache.u, nothing, cache)
35+
end

test/basictests.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,19 @@ end
124124
@test X * solve(cache) b1
125125
end
126126

127+
@testset "Sparspak Factorization" begin
128+
A1 = sparse(A / 1)
129+
b1 = rand(n)
130+
x1 = zero(b)
131+
A2 = sparse(A / 2)
132+
b2 = rand(n)
133+
x2 = zero(b)
134+
135+
prob1 = LinearProblem(A1, b1; u0 = x1)
136+
prob2 = LinearProblem(A2, b2; u0 = x2)
137+
test_interface(SparspakFactorization(), prob1, prob2)
138+
end
139+
127140
@testset "FastLAPACK Factorizations" begin
128141
A1 = A / 1
129142
b1 = rand(n)

0 commit comments

Comments
 (0)