Hi everyone!

Can someone provide a minimal example of how to use sparsity patterns (jac_prototype) when solving DAEs with IDA solver? I manage to use sparsity patterns with ODEs and the julia solvers…

Here are some examples that I am trying to solve:

ODE Version

n = 1000

L = 0.5 .+ rand(n)

function odefun(yp, y, p, t)

yp[:] = -L.*y

end

jac_pattern = spdiagm(ones(n))

colorvec = matrix_colors(jac_pattern)

tspan = (0,2)

y0 = ones(n)

ode = ODEFunction(odefun)

ode_sparse = ODEFunction(odefun, jac_prototype=jac_pattern, colorvec=colorvec)

prob = ODEProblem(ode, y0, tspan)

prob_sparse = ODEProblem(ode_sparse, y0, tspan)

@btime solve(prob, TRBDF2()) # solves in 85 ms

@btime solve(prob_sparse, TRBDF2()) # solves in 1 ms

However the DAE doesn’t work:

n = 1000

L = 0.5 .+ rand(n)

function residuals(res, yp, y, p, t)

res[:] = yp + L.*y

end

jac_pattern = spdiagm(ones(n))

colorvec = matrix_colors(jac_pattern)

tspan = (0,2)

y0 = ones(n)

yp0 = -L

dae = DAEFunction(residuals)

dae_sparse = DAEFunction(residuals, jac_prototype=jac_pattern, colorvec=colorvec)

prob = DAEProblem(dae, yp0, y0, tspan, differential_vars=trues(n))

prob_sparse = DAEProblem(dae_sparse, yp0, y0, tspan, differential_vars=trues(n))

@btime solve(prob, IDA()) # solves in 52 ms

@btime solve(prob_sparse, IDA()) # solves in 49 ms

I would expect that the sparse problem would have a huge decrease in time as in the ODE case.

Thanks for the support!