Skip to content

Commit 022af77

Browse files
committed
Add continuous event support
1 parent 4f1cd26 commit 022af77

File tree

2 files changed

+10
-12
lines changed

2 files changed

+10
-12
lines changed

src/systems/callbacks.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#################################### system operations #####################################
22
get_continuous_events(sys::AbstractSystem) = SymbolicContinuousCallback[]
3-
get_continuous_events(sys::AbstractODESystem) = getfield(sys, :continuous_events)
3+
get_continuous_events(sys::AbstractTimeDependentSystem) = getfield(sys, :continuous_events)
44
has_continuous_events(sys::AbstractSystem) = isdefined(sys, :continuous_events)
55

66
has_discrete_events(sys::AbstractSystem) = isdefined(sys, :discrete_events)
@@ -560,7 +560,7 @@ function compile_affect(eqs::Vector{Equation}, cb, sys, dvs, ps; outputidxs = no
560560
end
561561
end
562562

563-
function generate_rootfinding_callback(sys::AbstractODESystem, dvs = unknowns(sys),
563+
function generate_rootfinding_callback(sys::AbstractTimeDependentSystem, dvs = unknowns(sys),
564564
ps = parameters(sys); kwargs...)
565565
cbs = continuous_events(sys)
566566
isempty(cbs) && return nothing
@@ -571,7 +571,7 @@ Generate a single rootfinding callback; this happens if there is only one equati
571571
generate_rootfinding_callback and thus we can produce a ContinuousCallback instead of a VectorContinuousCallback.
572572
"""
573573
function generate_single_rootfinding_callback(
574-
eq, cb, sys::AbstractODESystem, dvs = unknowns(sys),
574+
eq, cb, sys::AbstractTimeDependentSystem, dvs = unknowns(sys),
575575
ps = parameters(sys); kwargs...)
576576
if !isequal(eq.lhs, 0)
577577
eq = 0 ~ eq.lhs - eq.rhs
@@ -609,7 +609,7 @@ function generate_single_rootfinding_callback(
609609
end
610610

611611
function generate_vector_rootfinding_callback(
612-
cbs, sys::AbstractODESystem, dvs = unknowns(sys),
612+
cbs, sys::AbstractTimeDependentSystem, dvs = unknowns(sys),
613613
ps = parameters(sys); rootfind = SciMLBase.RightRootFind,
614614
reinitialization = SciMLBase.CheckInit(), kwargs...)
615615
eqs = map(cb -> flatten_equations(cb.eqs), cbs)
@@ -683,7 +683,7 @@ end
683683
"""
684684
Compile a single continuous callback affect function(s).
685685
"""
686-
function compile_affect_fn(cb, sys::AbstractODESystem, dvs, ps, kwargs)
686+
function compile_affect_fn(cb, sys::AbstractTimeDependentSystem, dvs, ps, kwargs)
687687
eq_aff = affects(cb)
688688
eq_neg_aff = affect_negs(cb)
689689
affect = compile_affect(eq_aff, cb, sys, dvs, ps; expression = Val{false}, kwargs...)
@@ -698,7 +698,7 @@ function compile_affect_fn(cb, sys::AbstractODESystem, dvs, ps, kwargs)
698698
(affect = affect, affect_neg = affect_neg)
699699
end
700700

701-
function generate_rootfinding_callback(cbs, sys::AbstractODESystem, dvs = unknowns(sys),
701+
function generate_rootfinding_callback(cbs, sys::AbstractTimeDependentSystem, dvs = unknowns(sys),
702702
ps = parameters(sys); kwargs...)
703703
eqs = map(cb -> flatten_equations(cb.eqs), cbs)
704704
num_eqs = length.(eqs)
@@ -859,12 +859,12 @@ merge_cb(x, ::Nothing) = x
859859
merge_cb(x, y) = CallbackSet(x, y)
860860

861861
function process_events(sys; callback = nothing, kwargs...)
862-
if has_continuous_events(sys)
862+
if has_continuous_events(sys) && !isempty(continuous_events(sys))
863863
contin_cb = generate_rootfinding_callback(sys; kwargs...)
864864
else
865865
contin_cb = nothing
866866
end
867-
if has_discrete_events(sys)
867+
if has_discrete_events(sys) && !isempty(discrete_events(sys))
868868
discrete_cb = generate_discrete_callbacks(sys; kwargs...)
869869
else
870870
discrete_cb = nothing

src/systems/jumps/jumpsystem.jl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,6 @@ function DiffEqBase.ODEProblem(sys::JumpSystem, u0map, tspan::Union{Tuple, Nothi
485485
use_union = false,
486486
eval_expression = false,
487487
eval_module = @__MODULE__,
488-
check_length = false,
489488
kwargs...)
490489
if !iscomplete(sys)
491490
error("A completed `JumpSystem` is required. Call `complete` or `structural_simplify` on the system before creating a `DiscreteProblem`")
@@ -496,19 +495,18 @@ function DiffEqBase.ODEProblem(sys::JumpSystem, u0map, tspan::Union{Tuple, Nothi
496495
osys = ODESystem(equations(sys).x[4], get_iv(sys), unknowns(sys), parameters(sys);
497496
observed = observed(sys), name = nameof(sys), description = description(sys),
498497
systems = get_systems(sys), defaults = defaults(sys),
499-
continuous_events = continuous_events(sys),
500498
parameter_dependencies = parameter_dependencies(sys),
501499
metadata = get_metadata(sys), gui_metadata = get_gui_metadata(sys))
502500
osys = complete(osys)
503-
return ODEProblem(osys, u0map, tspan, parammap; check_length, kwargs...)
501+
return ODEProblem(osys, u0map, tspan, parammap; check_length = false, kwargs...)
504502
else
505503
_, u0, p = process_SciMLProblem(EmptySciMLFunction, sys, u0map, parammap;
506504
t = tspan === nothing ? nothing : tspan[1], use_union, tofloat = false,
507505
check_length = false)
508506
f = (du, u, p, t) -> (du .= 0; nothing)
509507
observedfun = ObservedFunctionCache(sys; eval_expression, eval_module)
510508
df = ODEFunction(f; sys, observed = observedfun)
511-
return ODEProblem(df, u0, tspan, p; check_length, kwargs...)
509+
return ODEProblem(df, u0, tspan, p; kwargs...)
512510
end
513511
end
514512

0 commit comments

Comments
 (0)