Skip to content

Commit 565df5d

Browse files
committed
default
1 parent e6e2b5e commit 565df5d

File tree

4 files changed

+63
-16
lines changed

4 files changed

+63
-16
lines changed

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153"
99
Krylov = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7"
1010
KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77"
1111
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
12+
RecursiveFactorization = "f2c3362d-daeb-58d1-803e-2bc74f2840b4"
1213
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
1314
SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
1415
Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46"
16+
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
1517
UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
1618

1719
[compat]

src/LinearSolve.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
module LinearSolve
22

3-
using ArrayInterface: lu_instance
3+
using ArrayInterface
4+
using RecursiveFactorization
45
using Base: cache_dependencies, Bool
56
using LinearAlgebra
7+
using SparseArrays
68
using SciMLBase: AbstractDiffEqOperator, AbstractLinearAlgorithm
79
using Setfield
810
using UnPack
@@ -20,15 +22,15 @@ abstract type AbstractFactorization <: SciMLLinearSolveAlgorithm end
2022
abstract type AbstractKrylovSubspaceMethod <: SciMLLinearSolveAlgorithm end
2123

2224
include("common.jl")
23-
include("default.jl")
2425
include("factorization.jl")
2526
include("wrappers.jl")
27+
include("default.jl")
2628

27-
export DefaultLinSolve
28-
export LUFactorization, SVDFactorization, QRFactorization
29+
export LUFactorization, SVDFactorization, QRFactorization, DefaultFactorization
2930
export KrylovJL, KrylovJL_CG, KrylovJL_GMRES, KrylovJL_BICGSTAB,
3031
KrylovJL_MINRES,
3132
IterativeSolversJL, IterativeSolversJL_CG, IterativeSolversJL_GMRES,
3233
IterativeSolversJL_BICGSTAB, IterativeSolversJL_MINRES
34+
export DefaultLinSolve
3335

3436
end

src/default.jl

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,51 @@
1-
#
2-
mutable struct DefaultLinSolve <: SciMLLinearSolveAlgorithm
3-
iterable
1+
## Default algorithm
2+
3+
struct DefaultLinSolve{Ta} <: SciMLLinearSolveAlgorithm
4+
linalg::Ta
5+
ifopenblas::Union{Bool,Nothing}
6+
isset::Bool # true => do nothing, false => find alg
47
end
58

6-
DefaultLinSolve() = DefaultLinSolve(nothing, nothing, nothing)
9+
DefaultLinSolve() = DefaultLinSolve(nothing, nothing, true)
10+
11+
function isopenblas()
12+
@static if VERSION < v"1.7beta"
13+
blas = BLAS.vendor()
14+
blas == :openblas64 || blas == :openblas
15+
else
16+
occursin("openblas", BLAS.get_config().loaded_libs[1].libname)
17+
end
18+
end
19+
20+
function SciMLBase.solve(cache::LinearCache, alg::DefaultLinSolve,
21+
args...; kwargs...)
22+
@unpack A = cache
23+
24+
if alg.isset
25+
linalg = if A isa Matrix
26+
if ArrayInterface.can_setindex(x) && (size(A,1) <= 100 ||
27+
(p.openblas && size(A,1) <= 500)
28+
)
29+
DefaultFactorization(;fact_alg=:(RecursiveFactorization.lu!))
30+
else
31+
LUFactorization()
32+
end
33+
elseif A isa Union{Tridiagonal,} # ForwardSensitivityJacobian
34+
DefaultFactorization(;fact_alg=lu!)
35+
elseif A isa Union{SymTridiagonal}
36+
DefaultFactorization(;fact_alg=ldlt!)
37+
elseif A isa SparseMatrixCSC
38+
LUFactorization()
39+
elseif ArrayInterface.isstructured(A)
40+
DefaultFactorization() # change fact_alg=LinearAlgebra.factorize
41+
elseif !(A isa AbstractDiffEqOperator)
42+
QRFactorization()
43+
else
44+
IterativeSolversJL_GMRES()
45+
end
746

8-
function SciMLBase.solve(cache::LinearCache,
9-
alg::DefaultLinSolve,
10-
args...;kwargs...)
11-
@unpack iterable = alg
12-
@unpack A, b, u, cacheval = cache
47+
@set! alg.linalg = linalg
48+
end
1349

14-
return A \ u
50+
SciMLBase.solve(cache, alg.linalg, args...; kwargs...)
1551
end

src/factorization.jl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,20 @@ end
7474

7575
## DefaultFactorization
7676

77-
struct DefaultFactorization <: AbstractFactorization
77+
struct DefaultFactorization{F} <: AbstractFactorization
78+
fact_alg::F
7879
end
7980

81+
DefaultFactorization(
82+
# https://github.com/SciML/SciMLBase.jl/pull/119
83+
# ;fact_alg = LinearAlgebra.factorize
84+
;fact_alg = lu!
85+
) = DefaultFactorization(fact_alg)
86+
8087
function init_cacheval(alg::DefaultFactorization, A, b, u)
8188
A isa Union{AbstractMatrix,AbstractDiffEqOperator} ||
8289
error("DefaultFactorization is not defined for $(typeof(A))")
8390

84-
fact = factorize(A)
91+
fact = alg.fact_alg(A)
8592
return fact
8693
end

0 commit comments

Comments
 (0)