How to cache dual numbers correctly /dual_cache reinterpretation error

Hi, I love the possibility to use Forwarddiff in DiffeEq, but now I’m encountering a problem with the caching of variables.
let’s say I have a function foo that takes an array of size 10. Within this function I need a dual_cache(zeros(5)) for an array of length 5. Then the dimensions of the Dual in cache are different from that what forwarddiff puts in to foo. As a result I can not access the cache like shown below, instead an error is thrown from reinterpret within get_tmp.

MWE (I know that the equation is nonsense :wink: ):

using LinearAlgebra, OrdinaryDiffEq
using DiffEqBase: get_tmp, dualcache
function foo(du, u, (A, tmp), t)
    tmp = DiffEqBase.get_tmp(tmp, u)
    mul!(tmp,A,u)

    @. du[1:5] =  + tmp
    @. du[6:10] = -tmp
    nothing
end
prob = ODEProblem(foo, ones(10), (0., 1.0), (ones(5,10), DiffEqBase.dualcache(zeros(5))))

julia> solve(prob, TRBDF2())
ERROR: ArgumentError: cannot reinterpret an `ForwardDiff.Dual{nothing,Float64,5}` array to `ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10}` whose first dimension has size `5`.
The resulting array would have non-integral first dimension.

The full Stacktrace is attached below. Any idea to cache correctly w/o loosing autodiff? Thanks in advance

Stacktrace
Stacktrace:
 [1] (::getfield(Base, Symbol("#thrownonint#204")){ForwardDiff.Dual{nothing,Float64,5},ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10}})(::Type{ForwardDiff.Dual{nothing,Float64,5}}, ::Type{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10}}, ::Int64) at ./reinterpretarray.jl:24
 [2] reinterpret at ./reinterpretarray.jl:39 [inlined]
 [3] get_tmp at /home/mazi/.julia/packages/DiffEqBase/4V8I6/src/init.jl:56 [inlined]
 [4] foo(::Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}, ::Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}, ::Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}, ::Float64) at /home/mazi/git/julionmonger.jl/tests/codetest.jl:135
 [5] UJacobianWrapper at /home/mazi/.julia/packages/DiffEqBase/4V8I6/src/diffeqfunction.jl:203 [inlined]
 [6] vector_mode_dual_eval(::DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}}, ::Array{Float64,1}, ::Array{Float64,1}, ::ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}}) at /home/mazi/.julia/packages/ForwardDiff/yPcDQ/src/apiutils.jl:44
 [7] vector_mode_jacobian!(::Array{Float64,2}, ::DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}}, ::Array{Float64,1}, ::Array{Float64,1}, ::ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}}) at /home/mazi/.julia/packages/ForwardDiff/yPcDQ/src/jacobian.jl:164
 [8] jacobian! at /home/mazi/.julia/packages/ForwardDiff/yPcDQ/src/jacobian.jl:74 [inlined]
 [9] jacobian! at /home/mazi/.julia/packages/ForwardDiff/yPcDQ/src/jacobian.jl:72 [inlined]
 [10] jacobian_autodiff! at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/derivative_wrappers.jl:98 [inlined]
 [11] jacobian! at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/derivative_wrappers.jl:106 [inlined]
 [12] calc_J! at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/derivative_utils.jl:91 [inlined]
 [13] calc_W!(::Array{Float64,2}, ::OrdinaryDiffEq.ODEIntegrator{TRBDF2{0,true,DefaultLinSolve,NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},DataType},true,Array{Float64,1},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}},Float64,Float64,Float64,Array{Array{Float64,1},1},ODESolution{Float64,2,Array{Array{Float64,1},1},Nothing,Nothing,Array{Float64,1},Array{Array{Array{Float64,1},1},1},ODEProblem{Array{Float64,1},Tuple{Float64,Float64},true,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}},ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},DiffEqBase.StandardODEProblem},TRBDF2{0,true,DefaultLinSolve,NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},DataType},OrdinaryDiffEq.InterpolationData{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Array{Array{Float64,1},1},Array{Float64,1},Array{Array{Array{Float64,1},1},1},OrdinaryDiffEq.TRBDF2Cache{Array{Float64,1},Array{Float64,1},Array{Float64,1},OrdinaryDiffEq.TRBDF2Tableau{Float64,Float64},OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},true,Array{Float64,1},Float64,Float64,OrdinaryDiffEq.NLNewtonCache{Array{Float64,1},Float64,Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,2},Array{Float64,1},DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}},DefaultLinSolve,Float64}}}},DiffEqBase.DEStats},ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},OrdinaryDiffEq.TRBDF2Cache{Array{Float64,1},Array{Float64,1},Array{Float64,1},OrdinaryDiffEq.TRBDF2Tableau{Float64,Float64},OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},true,Array{Float64,1},Float64,Float64,OrdinaryDiffEq.NLNewtonCache{Array{Float64,1},Float64,Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,2},Array{Float64,1},DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}},DefaultLinSolve,Float64}}},OrdinaryDiffEq.DEOptions{Float64,Float64,Float64,Float64,typeof(DiffEqBase.ODE_DEFAULT_NORM),typeof(opnorm),CallbackSet{Tuple{},Tuple{}},typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN),typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE),typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK),DataStructures.BinaryHeap{Float64,DataStructures.LessThan},DataStructures.BinaryHeap{Float64,DataStructures.LessThan},Nothing,Nothing,Int64,Array{Float64,1},Array{Float64,1},Array{Float64,1}},Array{Float64,1},Float64,Nothing}, ::OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},true,Array{Float64,1},Float64,Float64,OrdinaryDiffEq.NLNewtonCache{Array{Float64,1},Float64,Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,2},Array{Float64,1},DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}},DefaultLinSolve,Float64}}, ::OrdinaryDiffEq.TRBDF2Cache{Array{Float64,1},Array{Float64,1},Array{Float64,1},OrdinaryDiffEq.TRBDF2Tableau{Float64,Float64},OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},true,Array{Float64,1},Float64,Float64,OrdinaryDiffEq.NLNewtonCache{Array{Float64,1},Float64,Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,2},Array{Float64,1},DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}},DefaultLinSolve,Float64}}}, ::Float64, ::Bool, ::Bool) at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/derivative_utils.jl:401
 [14] update_W! at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/derivative_utils.jl:454 [inlined]
 [15] update_W! at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/derivative_utils.jl:449 [inlined]
 [16] perform_step!(::OrdinaryDiffEq.ODEIntegrator{TRBDF2{0,true,DefaultLinSolve,NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},DataType},true,Array{Float64,1},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}},Float64,Float64,Float64,Array{Array{Float64,1},1},ODESolution{Float64,2,Array{Array{Float64,1},1},Nothing,Nothing,Array{Float64,1},Array{Array{Array{Float64,1},1},1},ODEProblem{Array{Float64,1},Tuple{Float64,Float64},true,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}},ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},DiffEqBase.StandardODEProblem},TRBDF2{0,true,DefaultLinSolve,NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},DataType},OrdinaryDiffEq.InterpolationData{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Array{Array{Float64,1},1},Array{Float64,1},Array{Array{Array{Float64,1},1},1},OrdinaryDiffEq.TRBDF2Cache{Array{Float64,1},Array{Float64,1},Array{Float64,1},OrdinaryDiffEq.TRBDF2Tableau{Float64,Float64},OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},true,Array{Float64,1},Float64,Float64,OrdinaryDiffEq.NLNewtonCache{Array{Float64,1},Float64,Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,2},Array{Float64,1},DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}},DefaultLinSolve,Float64}}}},DiffEqBase.DEStats},ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},OrdinaryDiffEq.TRBDF2Cache{Array{Float64,1},Array{Float64,1},Array{Float64,1},OrdinaryDiffEq.TRBDF2Tableau{Float64,Float64},OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},true,Array{Float64,1},Float64,Float64,OrdinaryDiffEq.NLNewtonCache{Array{Float64,1},Float64,Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,2},Array{Float64,1},DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}},DefaultLinSolve,Float64}}},OrdinaryDiffEq.DEOptions{Float64,Float64,Float64,Float64,typeof(DiffEqBase.ODE_DEFAULT_NORM),typeof(opnorm),CallbackSet{Tuple{},Tuple{}},typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN),typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE),typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK),DataStructures.BinaryHeap{Float64,DataStructures.LessThan},DataStructures.BinaryHeap{Float64,DataStructures.LessThan},Nothing,Nothing,Int64,Array{Float64,1},Array{Float64,1},Array{Float64,1}},Array{Float64,1},Float64,Nothing}, ::OrdinaryDiffEq.TRBDF2Cache{Array{Float64,1},Array{Float64,1},Array{Float64,1},OrdinaryDiffEq.TRBDF2Tableau{Float64,Float64},OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},true,Array{Float64,1},Float64,Float64,OrdinaryDiffEq.NLNewtonCache{Array{Float64,1},Float64,Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,2},Array{Float64,1},DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}},DefaultLinSolve,Float64}}}, ::Bool) at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/perform_step/sdirk_perform_step.jl:372
 [17] perform_step! at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/perform_step/sdirk_perform_step.jl:362 [inlined]
 [18] solve!(::OrdinaryDiffEq.ODEIntegrator{TRBDF2{0,true,DefaultLinSolve,NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},DataType},true,Array{Float64,1},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}},Float64,Float64,Float64,Array{Array{Float64,1},1},ODESolution{Float64,2,Array{Array{Float64,1},1},Nothing,Nothing,Array{Float64,1},Array{Array{Array{Float64,1},1},1},ODEProblem{Array{Float64,1},Tuple{Float64,Float64},true,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}},ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},DiffEqBase.StandardODEProblem},TRBDF2{0,true,DefaultLinSolve,NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},DataType},OrdinaryDiffEq.InterpolationData{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Array{Array{Float64,1},1},Array{Float64,1},Array{Array{Array{Float64,1},1},1},OrdinaryDiffEq.TRBDF2Cache{Array{Float64,1},Array{Float64,1},Array{Float64,1},OrdinaryDiffEq.TRBDF2Tableau{Float64,Float64},OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},true,Array{Float64,1},Float64,Float64,OrdinaryDiffEq.NLNewtonCache{Array{Float64,1},Float64,Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,2},Array{Float64,1},DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}},DefaultLinSolve,Float64}}}},DiffEqBase.DEStats},ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},OrdinaryDiffEq.TRBDF2Cache{Array{Float64,1},Array{Float64,1},Array{Float64,1},OrdinaryDiffEq.TRBDF2Tableau{Float64,Float64},OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},true,Array{Float64,1},Float64,Float64,OrdinaryDiffEq.NLNewtonCache{Array{Float64,1},Float64,Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,2},Array{Float64,1},DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},ForwardDiff.JacobianConfig{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10,Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1},Array{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqDiffTools.UJacobianWrapper{ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Float64,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}}},Float64},Float64,10},1}}},DefaultLinSolve,Float64}}},OrdinaryDiffEq.DEOptions{Float64,Float64,Float64,Float64,typeof(DiffEqBase.ODE_DEFAULT_NORM),typeof(opnorm),CallbackSet{Tuple{},Tuple{}},typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN),typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE),typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK),DataStructures.BinaryHeap{Float64,DataStructures.LessThan},DataStructures.BinaryHeap{Float64,DataStructures.LessThan},Nothing,Nothing,Int64,Array{Float64,1},Array{Float64,1},Array{Float64,1}},Array{Float64,1},Float64,Nothing}) at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/solve.jl:372
 [19] #__solve#334(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(DiffEqBase.__solve), ::ODEProblem{Array{Float64,1},Tuple{Float64,Float64},true,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}},ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},DiffEqBase.StandardODEProblem}, ::TRBDF2{0,true,DefaultLinSolve,NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},DataType}) at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/solve.jl:5
 [20] __solve at /home/mazi/.julia/packages/OrdinaryDiffEq/xJCph/src/solve.jl:4 [inlined]
 [21] #solve_call#433(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(DiffEqBase.solve_call), ::ODEProblem{Array{Float64,1},Tuple{Float64,Float64},true,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}},ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},DiffEqBase.StandardODEProblem}, ::TRBDF2{0,true,DefaultLinSolve,NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},DataType}) at /home/mazi/.julia/packages/DiffEqBase/4V8I6/src/solve.jl:38
 [22] solve_call at /home/mazi/.julia/packages/DiffEqBase/4V8I6/src/solve.jl:37 [inlined]
 [23] #solve#434 at /home/mazi/.julia/packages/DiffEqBase/4V8I6/src/solve.jl:57 [inlined]
 [24] solve(::ODEProblem{Array{Float64,1},Tuple{Float64,Float64},true,Tuple{Array{Float64,2},DiffEqBase.DiffCache{Array{Float64,1},Array{ForwardDiff.Dual{nothing,Float64,5},1}}},ODEFunction{true,typeof(foo),UniformScaling{Bool},Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing},Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},DiffEqBase.StandardODEProblem}, ::TRBDF2{0,true,DefaultLinSolve,NLNewton{Rational{Int64},Rational{Int64},Rational{Int64}},DataType}) at /home/mazi/.julia/packages/DiffEqBase/4V8I6/src/solve.jl:45
 [25] top-level scope at none:0

After crawling trough the source of DiffEqBase.dualcache i found that there is an undocumented option to adopt the chunksize when creating dualcache using

    N = Val{ForwardDiff.pickchunksize(length(u))}
    DiffEqBase.dualcache(zeros(5),N)

where u is the input array of foo in my example :partying_face:

2 Likes