Skip to content

Commit ea299e0

Browse files
Add discontinuity-controller state to DDE integrators
The shared autonomous-discontinuity controller reads is_disco_step and disco_checkpoint, but DDEIntegrator did not carry either field. Initialize the state from the runtime time value, reset it during reinit!, and cover discontinuity-enabled and unitful public solver paths. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
1 parent b22e2e5 commit ea299e0

5 files changed

Lines changed: 37 additions & 0 deletions

File tree

lib/DelayDiffEq/src/integrators/interface.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,8 @@ function DiffEqBase.reinit!(
510510
integrator.iter = 0
511511
integrator.success_iter = 0
512512
integrator.derivative_discontinuity = false
513+
integrator.is_disco_step = false
514+
integrator.disco_checkpoint = zero(integrator.t)
513515

514516
# full re-initialize the controller in timestepping
515517
OrdinaryDiffEqCore.reinit_controller!(integrator, integrator.controller_cache)

lib/DelayDiffEq/src/integrators/type.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ mutable struct DDEIntegrator{
100100
fsalfirst::FSALType
101101
fsallast::FSALType
102102
initializealg::IA
103+
is_disco_step::Bool
104+
disco_checkpoint::tType
103105
# SDE/RODE noise fields: populated for SDDEProblem, Nothing for DDEProblem.
104106
W::WType
105107
P::PType

lib/DelayDiffEq/src/solve.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,8 @@ function SciMLBase.__init(
455455
success_iter = 0
456456
erracc = QT(1)
457457
dtacc = tType(1)
458+
is_disco_step = false
459+
disco_checkpoint = zero(t0)
458460

459461
fsalfirst, fsallast = OrdinaryDiffEqCore.get_fsalfirstlast(cache, rate_prototype)
460462
OrdinaryDiffEqCore.set_EEst!(controller_cache, EEst)
@@ -525,6 +527,7 @@ function SciMLBase.__init(
525527
differential_vars,
526528
controller_cache,
527529
ode_integrator, fsalfirst, fsallast, initializealg,
530+
is_disco_step, disco_checkpoint,
528531
W, P, sqdt, nothing,
529532
)
530533

lib/DelayDiffEq/test/interface/discontinuities.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using DelayDiffEq, DDEProblemLibrary
22
using OrdinaryDiffEqLowOrderRK
33
using OrdinaryDiffEqTsit5
4+
using OrdinaryDiffEqCore: PIController
45
using SciMLBase: ReturnCode
56
using Test
67

@@ -62,6 +63,25 @@ end
6263
end
6364
end
6465

66+
@testset "autonomous discontinuity controller state" begin
67+
alg = BS3()
68+
controller = PIController(alg; discontinuity_detection = true)
69+
integrator = init(prob, MethodOfSteps(alg); controller = controller, dt = 0.01)
70+
71+
@test !integrator.is_disco_step
72+
@test iszero(integrator.disco_checkpoint)
73+
@test typeof(integrator.disco_checkpoint) === typeof(integrator.t)
74+
75+
sol = solve!(integrator)
76+
@test sol.retcode == ReturnCode.Success
77+
78+
integrator.is_disco_step = true
79+
integrator.disco_checkpoint = integrator.t
80+
reinit!(integrator)
81+
@test !integrator.is_disco_step
82+
@test iszero(integrator.disco_checkpoint)
83+
end
84+
6585
# additional discontinuities
6686
@testset "DDE with discontinuities" begin
6787
integrator = init(

lib/DelayDiffEq/test/interface/units.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ const probs = Dict(
2929
fpsolve = NLFunctional(; max_iter = 100)
3030
)
3131

32+
integrator = init(prob, alg)
33+
@test typeof(integrator.disco_checkpoint) === typeof(integrator.t)
34+
@test iszero(integrator.disco_checkpoint)
35+
36+
integrator.is_disco_step = true
37+
integrator.disco_checkpoint = oneunit(integrator.t)
38+
reinit!(integrator)
39+
@test !integrator.is_disco_step
40+
@test iszero(integrator.disco_checkpoint)
41+
3242
# default
3343
sol1 = solve(prob, alg)
3444

0 commit comments

Comments
 (0)