Skip to content

Commit 889881d

Browse files
Merge pull request #244 from SciML/diagonal
Specialize diagonal matrices
2 parents 3ed00b6 + 49e7cd7 commit 889881d

File tree

4 files changed

+33
-1
lines changed

4 files changed

+33
-1
lines changed

docs/src/solvers/solvers.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ customized per-package, details given below describe a subset of important array
8484
LinearSolve.jl contains some linear solvers built in.
8585

8686
- `SimpleLUFactorization`: a simple LU-factorization implementation without BLAS. Fast for small matrices.
87+
- `DiagonalFactorization`: a special implementation only for solving `Diagonal` matrices fast.
8788

8889
### FastLapackInterface.jl
8990

src/LinearSolve.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ end
8484
export LUFactorization, SVDFactorization, QRFactorization, GenericFactorization,
8585
GenericLUFactorization, SimpleLUFactorization, RFLUFactorization,
8686
UMFPACKFactorization, KLUFactorization, FastLUFactorization, FastQRFactorization,
87-
SparspakFactorization
87+
SparspakFactorization, DiagonalFactorization
8888

8989
export LinearSolveFunction
9090

src/default.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@ end
3333
function defaultalg(A::SymTridiagonal, b, ::OperatorAssumptions{true})
3434
GenericFactorization(; fact_alg = ldlt!)
3535
end
36+
function defaultalg(A::Diagonal, b, ::OperatorAssumptions{true})
37+
DiagonalFactorization()
38+
end
39+
function defaultalg(A::Diagonal, b, ::OperatorAssumptions{false})
40+
DiagonalFactorization()
41+
end
42+
function defaultalg(A::Diagonal, b, ::OperatorAssumptions{Nothing})
43+
DiagonalFactorization()
44+
end
3645

3746
@static if INCLUDE_SPARSE
3847
function defaultalg(A::SparseMatrixCSC, b, ::OperatorAssumptions{true})

src/factorization.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,28 @@ function SciMLBase.solve(cache::LinearCache, alg::RFLUFactorization{P, T};
374374
SciMLBase.build_linear_solution(alg, y, nothing, cache)
375375
end
376376

377+
## DiagonalFactorization
378+
379+
struct DiagonalFactorization <: AbstractFactorization end
380+
381+
function init_cacheval(alg::DiagonalFactorization, A, b, u, Pl, Pr, maxiters::Int,
382+
abstol, reltol, verbose::Bool, assumptions::OperatorAssumptions)
383+
nothing
384+
end
385+
386+
function SciMLBase.solve(cache::LinearCache, alg::DiagonalFactorization;
387+
kwargs...) where {P, T}
388+
A = cache.A
389+
if cache.u isa Vector && cache.b isa Vector
390+
@simd ivdep for i in eachindex(cache.u)
391+
cache.u[i] = A.diag[i] \ cache.b[i]
392+
end
393+
else
394+
cache.u .= A.diag .\ cache.b
395+
end
396+
SciMLBase.build_linear_solution(alg, cache.u, nothing, cache)
397+
end
398+
377399
## FastLAPACKFactorizations
378400

379401
struct WorkspaceAndFactors{W, F}

0 commit comments

Comments
 (0)