diff --git a/src/solvers/umfpack.jl b/src/solvers/umfpack.jl index 7a8458d9..fc4b9c17 100644 --- a/src/solvers/umfpack.jl +++ b/src/solvers/umfpack.jl @@ -471,7 +471,8 @@ function lu!(F::UmfpackLU{Tv, Ti}, S::AbstractSparseMatrixCSC; return lu!(F; reuse_symbolic, check, q) end -function lu!(F::UmfpackLU; check::Bool=true, reuse_symbolic::Bool=true, q=nothing) +function lu!(F::UmfpackLU{Tv, Ti}; check::Bool=true, reuse_symbolic::Bool=true, + q=nothing) where {Tv, Ti} if !reuse_symbolic && _isnotnull(F.symbolic) F.symbolic = Symbolic{Tv, Ti}(C_NULL) end diff --git a/test/umfpack.jl b/test/umfpack.jl index 59dc9041..0a4525e2 100644 --- a/test/umfpack.jl +++ b/test/umfpack.jl @@ -408,7 +408,7 @@ end umfpack_report(x.b) end - @testset "Reuse symbolic LU factorization" begin + @testset "Do/do not reuse symbolic LU factorization" for reuse ∈ (true, false) A1 = sparse(increment!([0,4,1,1,2,2,0,1,2,3,4,4]), increment!([0,4,0,2,1,2,1,4,3,2,1,2]), [2.,1.,3.,4.,-1.,-3.,3.,9.,2.,1.,4.,2.], 5, 5) @@ -420,7 +420,7 @@ end b = Tv[8., 45., -3., 3., 19.] F = lu(A) umfpack_report(F) - lu!(F, B) + lu!(F, B; reuse_symbolic=reuse) umfpack_report(F) @test F\b ≈ B\b ≈ Matrix(B)\b @@ -429,14 +429,20 @@ end C[4, 3] = Tv(0) F = lu(A) umfpack_report(F) - @test_throws SingularException lu!(F, C) + @test_throws SingularException lu!(F, C; reuse_symbolic=reuse) # change of nonzero pattern D = copy(B) D[5, 1] = Tv(1.0) F = lu(A) umfpack_report(F) - @test_throws ArgumentError lu!(F, D) - umfpack_report(F) + if reuse + @test_throws ArgumentError lu!(F, D; reuse_symbolic=reuse) + umfpack_report(F) + else + lu!(F, D; reuse_symbolic=reuse) + umfpack_report(F) + @test F\b ≈ D\b ≈ Matrix(D)\b + end end end end