Skip to content

Commit 228da15

Browse files
committed
actually create the callbacks
1 parent de8bce1 commit 228da15

File tree

3 files changed

+29
-25
lines changed

3 files changed

+29
-25
lines changed

src/structural_transformation/codegen.jl

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -524,18 +524,11 @@ function ODAEProblem{iip}(sys,
524524
use_union)
525525

526526
has_difference = any(isdifferenceeq, eqs)
527-
if has_continuous_events(sys)
528-
event_cb = generate_rootfinding_callback(sys; kwargs...)
529-
else
530-
event_cb = nothing
531-
end
532-
difference_cb = has_difference ? generate_difference_cb(sys; kwargs...) : nothing
533-
cb = merge_cb(event_cb, difference_cb)
534-
cb = merge_cb(cb, callback)
527+
cbs = process_events(sys; callback, has_difference, kwargs...)
535528

536-
if cb === nothing
529+
if cbs === nothing
537530
ODEProblem{iip}(fun, u0, tspan, p; kwargs...)
538531
else
539-
ODEProblem{iip}(fun, u0, tspan, p; callback = cb, kwargs...)
532+
ODEProblem{iip}(fun, u0, tspan, p; callback = cbs, kwargs...)
540533
end
541534
end

src/systems/callbacks.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,4 +297,27 @@ function generate_discrete_callbacks(sys::AbstractSystem, dvs = states(sys),
297297
end
298298

299299
dbs
300+
end
301+
302+
merge_cb(::Nothing, ::Nothing) = nothing
303+
merge_cb(::Nothing, x) = merge_cb(x, nothing)
304+
merge_cb(x, ::Nothing) = x
305+
merge_cb(x, y) = CallbackSet(x, y)
306+
307+
function process_events(sys; callback = nothing, has_difference = false, kwargs...)
308+
if has_continuous_events(sys)
309+
contin_cb = generate_rootfinding_callback(sys; kwargs...)
310+
else
311+
contin_cb = nothing
312+
end
313+
if has_discrete_events(sys)
314+
discrete_cb = generate_discrete_callbacks(sys; kwargs...)
315+
else
316+
discrete_cb = nothing
317+
end
318+
difference_cb = has_difference ? generate_difference_cb(sys; kwargs...) : nothing
319+
320+
cb = merge_cb(contin_cb, discrete_cb)
321+
cb = merge_cb(cb, difference_cb)
322+
merge_cb(cb, callback)
300323
end

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -635,26 +635,14 @@ function DiffEqBase.ODEProblem{iip}(sys::AbstractODESystem, u0map, tspan,
635635
f, u0, p = process_DEProblem(ODEFunction{iip}, sys, u0map, parammap;
636636
has_difference = has_difference,
637637
check_length, kwargs...)
638-
if has_continuous_events(sys)
639-
event_cb = generate_rootfinding_callback(sys; kwargs...)
640-
else
641-
event_cb = nothing
642-
end
643-
difference_cb = has_difference ? generate_difference_cb(sys; kwargs...) : nothing
644-
cb = merge_cb(event_cb, difference_cb)
645-
cb = merge_cb(cb, callback)
646-
638+
cbs = process_events(sys; callback, has_difference, kwargs...)
647639
kwargs = filter_kwargs(kwargs)
648-
if cb === nothing
640+
if cbs === nothing
649641
ODEProblem{iip}(f, u0, tspan, p; kwargs...)
650642
else
651-
ODEProblem{iip}(f, u0, tspan, p; callback = cb, kwargs...)
643+
ODEProblem{iip}(f, u0, tspan, p; callback = cbs, kwargs...)
652644
end
653645
end
654-
merge_cb(::Nothing, ::Nothing) = nothing
655-
merge_cb(::Nothing, x) = merge_cb(x, nothing)
656-
merge_cb(x, ::Nothing) = x
657-
merge_cb(x, y) = CallbackSet(x, y)
658646
get_callback(prob::ODEProblem) = prob.kwargs[:callback]
659647

660648
"""

0 commit comments

Comments
 (0)