diff --git a/lib/DelayDiffEq/Project.toml b/lib/DelayDiffEq/Project.toml index 76fbcd00553..ded4cbad909 100644 --- a/lib/DelayDiffEq/Project.toml +++ b/lib/DelayDiffEq/Project.toml @@ -73,7 +73,7 @@ LinearAlgebra = "1" LinearSolve = "5.1" Logging = "1" OrdinaryDiffEqBDF = "2" -OrdinaryDiffEqCore = "4" +OrdinaryDiffEqCore = "4.12" OrdinaryDiffEqDefault = "2" OrdinaryDiffEqDifferentiation = "3" OrdinaryDiffEqFeagin = "2" diff --git a/lib/DelayDiffEq/src/integrators/interface.jl b/lib/DelayDiffEq/src/integrators/interface.jl index c3a46d7dc29..a1fd1228535 100644 --- a/lib/DelayDiffEq/src/integrators/interface.jl +++ b/lib/DelayDiffEq/src/integrators/interface.jl @@ -510,6 +510,8 @@ function DiffEqBase.reinit!( integrator.iter = 0 integrator.success_iter = 0 integrator.derivative_discontinuity = false + integrator.is_disco_step = false + integrator.disco_checkpoint = zero(integrator.t) # full re-initialize the controller in timestepping OrdinaryDiffEqCore.reinit_controller!(integrator, integrator.controller_cache) diff --git a/lib/DelayDiffEq/src/integrators/type.jl b/lib/DelayDiffEq/src/integrators/type.jl index f6fcda41098..0c886c0cabb 100644 --- a/lib/DelayDiffEq/src/integrators/type.jl +++ b/lib/DelayDiffEq/src/integrators/type.jl @@ -100,6 +100,8 @@ mutable struct DDEIntegrator{ fsalfirst::FSALType fsallast::FSALType initializealg::IA + is_disco_step::Bool + disco_checkpoint::tType # SDE/RODE noise fields: populated for SDDEProblem, Nothing for DDEProblem. W::WType P::PType diff --git a/lib/DelayDiffEq/src/solve.jl b/lib/DelayDiffEq/src/solve.jl index 80437136b35..c443d92b44b 100644 --- a/lib/DelayDiffEq/src/solve.jl +++ b/lib/DelayDiffEq/src/solve.jl @@ -455,6 +455,8 @@ function SciMLBase.__init( success_iter = 0 erracc = QT(1) dtacc = tType(1) + is_disco_step = false + disco_checkpoint = zero(t0) fsalfirst, fsallast = OrdinaryDiffEqCore.get_fsalfirstlast(cache, rate_prototype) OrdinaryDiffEqCore.set_EEst!(controller_cache, EEst) @@ -525,6 +527,7 @@ function SciMLBase.__init( differential_vars, controller_cache, ode_integrator, fsalfirst, fsallast, initializealg, + is_disco_step, disco_checkpoint, W, P, sqdt, nothing, ) diff --git a/lib/DelayDiffEq/test/interface/discontinuities.jl b/lib/DelayDiffEq/test/interface/discontinuities.jl index 85b0c76f24c..9d29fd760bc 100644 --- a/lib/DelayDiffEq/test/interface/discontinuities.jl +++ b/lib/DelayDiffEq/test/interface/discontinuities.jl @@ -1,6 +1,7 @@ using DelayDiffEq, DDEProblemLibrary using OrdinaryDiffEqLowOrderRK using OrdinaryDiffEqTsit5 +using OrdinaryDiffEqCore: PIController using SciMLBase: ReturnCode using Test @@ -62,6 +63,25 @@ end end end +@testset "autonomous discontinuity controller state" begin + alg = BS3() + controller = PIController(alg; discontinuity_detection = true) + integrator = init(prob, MethodOfSteps(alg); controller = controller, dt = 0.01) + + @test !integrator.is_disco_step + @test iszero(integrator.disco_checkpoint) + @test typeof(integrator.disco_checkpoint) === typeof(integrator.t) + + sol = solve!(integrator) + @test sol.retcode == ReturnCode.Success + + integrator.is_disco_step = true + integrator.disco_checkpoint = integrator.t + reinit!(integrator) + @test !integrator.is_disco_step + @test iszero(integrator.disco_checkpoint) +end + # additional discontinuities @testset "DDE with discontinuities" begin integrator = init( diff --git a/lib/DelayDiffEq/test/interface/units.jl b/lib/DelayDiffEq/test/interface/units.jl index 2607790cd17..9312718e437 100644 --- a/lib/DelayDiffEq/test/interface/units.jl +++ b/lib/DelayDiffEq/test/interface/units.jl @@ -29,6 +29,16 @@ const probs = Dict( fpsolve = NLFunctional(; max_iter = 100) ) + integrator = init(prob, alg) + @test typeof(integrator.disco_checkpoint) === typeof(integrator.t) + @test iszero(integrator.disco_checkpoint) + + integrator.is_disco_step = true + integrator.disco_checkpoint = oneunit(integrator.t) + reinit!(integrator) + @test !integrator.is_disco_step + @test iszero(integrator.disco_checkpoint) + # default sol1 = solve(prob, alg)