From 8a4f2750bb51a789815f44af420f2a85fae2fc06 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 8 Jul 2026 03:37:18 -0400 Subject: [PATCH] Initialize sparse Jacobian caches with stored values Co-Authored-By: Chris Rackauckas --- .../src/derivative_utils.jl | 7 +++++++ .../sparse/nonfulldiagonal_sparse_tests.jl | 20 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/OrdinaryDiffEqDifferentiation/src/derivative_utils.jl b/lib/OrdinaryDiffEqDifferentiation/src/derivative_utils.jl index 82565aa470a..e6976fca45d 100644 --- a/lib/OrdinaryDiffEqDifferentiation/src/derivative_utils.jl +++ b/lib/OrdinaryDiffEqDifferentiation/src/derivative_utils.jl @@ -1134,6 +1134,13 @@ function build_J_W( # If factorization, then just use the jac_prototype J = similar(f.jac_prototype) W = similar(J) + if is_sparse(J) + set_all_nzval!(J, one(eltype(J))) + set_all_nzval!(W, one(eltype(W))) + else + fill!(J, one(eltype(J))) + fill!(W, one(eltype(W))) + end elseif ( IIP && (concrete_jac(alg) === nothing || !concrete_jac(alg)) && alg.linsolve !== nothing && diff --git a/lib/OrdinaryDiffEqDifferentiation/test/sparse/nonfulldiagonal_sparse_tests.jl b/lib/OrdinaryDiffEqDifferentiation/test/sparse/nonfulldiagonal_sparse_tests.jl index 3fe6b5ee676..ad1f841bfeb 100644 --- a/lib/OrdinaryDiffEqDifferentiation/test/sparse/nonfulldiagonal_sparse_tests.jl +++ b/lib/OrdinaryDiffEqDifferentiation/test/sparse/nonfulldiagonal_sparse_tests.jl @@ -1,4 +1,4 @@ -using OrdinaryDiffEq, SparseArrays, LinearSolve, LinearAlgebra +using OrdinaryDiffEq, SparseArrays, LinearSolve, LinearAlgebra, Test using OrdinaryDiffEqSDIRK using ComponentArrays @@ -153,3 +153,21 @@ solve(odeprob, TRBDF2()); solve(sparseodeprob, TRBDF2()); solve(sparseodeprob, Rosenbrock23(linsolve = KLUFactorization())); solve(sparseodeprob, KenCarp47(linsolve = KrylovJL_GMRES())); + +@testset "Sparse Jacobian caches are initialized with stored values" begin + function sparse_cache_f!(du, u, p, t) + return du .= u + end + + N = 8 + jac_prototype = sparse(1:N, 1:N, ones(N), N, N) + prob = ODEProblem( + ODEFunction(sparse_cache_f!; jac_prototype), + ones(N), + (0.0, 1.0) + ) + integ = init(prob, Rodas5P()) + + @test all(==(1), nonzeros(integ.cache.J)) + @test all(==(1), nonzeros(integ.cache.W)) +end