Solving a non-autonomous linear ODE using a Magnus integrator (e.g. MagnusGL6) throws a FieldError because OrdinaryDiffEqDifferentiation tries to access an autodiff field on the algorithm struct via _alg_autodiff, but Magnus solvers (defined in OrdinaryDiffEqLinear) have no such field — their only fields are krylov, m, and iop.
julia solver_testing.jl
ERROR: LoadError: FieldError: type OrdinaryDiffEqLinear.MagnusGL6 has no field `autodiff`, available fields: `krylov`, `m`, `iop`
Stacktrace:
[1] getproperty
@ ./Base_compiler.jl:54 [inlined]
[2] _alg_autodiff(alg::OrdinaryDiffEqLinear.MagnusGL6)
@ OrdinaryDiffEqDifferentiation ~/.julia/packages/OrdinaryDiffEqDifferentiation/TKWRC/src/alg_utils.jl:16
[3] alg_autodiff(alg::OrdinaryDiffEqLinear.MagnusGL6)
@ OrdinaryDiffEqDifferentiation ~/.julia/packages/OrdinaryDiffEqDifferentiation/TKWRC/src/alg_utils.jl:20
[4] forwarddiffs_model(alg::OrdinaryDiffEqLinear.MagnusGL6)
@ OrdinaryDiffEqCore ~/.julia/packages/OrdinaryDiffEqCore/GMkz9/src/alg_utils.jl:15
[5] _uses_forwarddiff(alg::OrdinaryDiffEqLinear.MagnusGL6)
@ DiffEqBase ~/.julia/packages/DiffEqBase/XLzeg/src/solve.jl:768
[6] get_concrete_problem(prob::SciMLBase.ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, SciMLBase.NullParameters, SciMLBase.ODEFunction{true, SciMLBase.AutoSpecialize, SciMLOperators.MatrixOperator{Float64, Matrix{Float64}, SciMLOperators.FilterKwargs{Nothing, Val{()}}, SciMLOperators.FilterKwargs{typeof(update_func), Val{()}}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing, Nothing, Nothing, Nothing}, @Kwargs{}, SciMLBase.StandardODEProblem}, isadapt::Bool; alg::OrdinaryDiffEqLinear.MagnusGL6, kwargs::@Kwargs{u0::Vector{Float64}, p::SciMLBase.NullParameters, dt::Float64})
@ DiffEqBase ~/.julia/packages/DiffEqBase/XLzeg/src/solve.jl:676
[7] solve_up(prob::SciMLBase.ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, SciMLBase.NullParameters, SciMLBase.ODEFunction{true, SciMLBase.AutoSpecialize, SciMLOperators.MatrixOperator{Float64, Matrix{Float64}, SciMLOperators.FilterKwargs{Nothing, Val{()}}, SciMLOperators.FilterKwargs{typeof(update_func), Val{()}}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing, Nothing, Nothing, Nothing}, @Kwargs{}, SciMLBase.StandardODEProblem}, sensealg::Nothing, u0::Vector{Float64}, p::SciMLBase.NullParameters, args::OrdinaryDiffEqLinear.MagnusGL6; originator::SciMLBase.ChainRulesOriginator, kwargs::@Kwargs{dt::Float64})
@ DiffEqBase ~/.julia/packages/DiffEqBase/XLzeg/src/solve.jl:624
[8] solve(prob::SciMLBase.ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, SciMLBase.NullParameters, SciMLBase.ODEFunction{true, SciMLBase.AutoSpecialize, SciMLOperators.MatrixOperator{Float64, Matrix{Float64}, SciMLOperators.FilterKwargs{Nothing, Val{()}}, SciMLOperators.FilterKwargs{typeof(update_func), Val{()}}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing, Nothing, Nothing, Nothing}, @Kwargs{}, SciMLBase.StandardODEProblem}, args::OrdinaryDiffEqLinear.MagnusGL6; sensealg::Nothing, u0::Nothing, p::Nothing, wrap::Val{true}, kwargs::@Kwargs{dt::Float64})
@ DiffEqBase ~/.julia/packages/DiffEqBase/XLzeg/src/solve.jl:587
[9] top-level scope
@ solver_testing.jl:12
[10] include(mod::Module, _path::String)
@ Base ./Base.jl:306
[11] exec_options(opts::Base.JLOptions)
@ Base ./client.jl:317
[12] _start()
@ Base ./client.jl:550
in expression starting at solver_testing.jl:12
Describe the bug 🐞
Solving a non-autonomous linear ODE using a Magnus integrator (e.g. MagnusGL6) throws a FieldError because OrdinaryDiffEqDifferentiation tries to access an autodiff field on the algorithm struct via _alg_autodiff, but Magnus solvers (defined in OrdinaryDiffEqLinear) have no such field — their only fields are krylov, m, and iop.
Expected behavior
Reproduce example code output from docs
Minimal Reproducible Example 👇
Taken from the docs:
Error & Stacktrace⚠️
Environment (please complete the following information):
using Pkg; Pkg.status()using Pkg; Pkg.status(; mode = PKGMODE_MANIFEST)versioninfo()Additional context