Skip to content

Commit 376b216

Browse files
committed
Add tests and pass callback to ODEProblem as a kwarg
1 parent 507ca08 commit 376b216

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ function time_varying_as_func(x, sys)
154154
end
155155

156156
function calculate_massmatrix(sys::AbstractODESystem; simplify=false)
157-
eqs = equations(sys)
157+
eqs = [eq for eq in equations(sys) if !isdifferenceeq(eq)]
158158
dvs = states(sys)
159159
M = zeros(length(eqs),length(eqs))
160160
state2idx = Dict(s => i for (i, s) in enumerate(dvs))
@@ -566,7 +566,12 @@ symbolically calculating numerical enhancements.
566566
function DiffEqBase.ODEProblem{iip}(sys::AbstractODESystem,u0map,tspan,
567567
parammap=DiffEqBase.NullParameters();kwargs...) where iip
568568
f, u0, p = process_DEProblem(ODEFunction{iip}, sys, u0map, parammap; kwargs...)
569-
ODEProblem{iip}(f,u0,tspan,p;kwargs...)
569+
if any(isdifferenceeq.(equations(sys)))
570+
ODEProblem{iip}(f,u0,tspan,p;difference_cb=generate_difference_cb(sys),kwargs...)
571+
else
572+
ODEProblem{iip}(f,u0,tspan,p;kwargs...)
573+
end
574+
570575
end
571576

572577
"""
@@ -593,7 +598,12 @@ function DiffEqBase.DAEProblem{iip}(sys::AbstractODESystem,du0map,u0map,tspan,
593598
diffvars = collect_differential_variables(sys)
594599
sts = states(sys)
595600
differential_vars = map(Base.Fix2(in, diffvars), sts)
596-
DAEProblem{iip}(f,du0,u0,tspan,p;differential_vars=differential_vars,kwargs...)
601+
if any(isdifferenceeq.(equations(sys)))
602+
DAEProblem{iip}(f,du0,u0,tspan,p;differential_vars=differential_vars,kwargs...)
603+
else
604+
DAEProblem{iip}(f,du0,u0,tspan,p;difference_cb=generate_difference_cb(sys),differential_vars=differential_vars,kwargs...)
605+
end
606+
597607
end
598608

599609
"""

test/odesystem.jl

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,4 +379,27 @@ let
379379
reshape(Num[0,1], 2, 1)
380380
)
381381

382-
end
382+
end
383+
384+
# Mixed Difference Differential equations
385+
@parameters t a b c d
386+
@variables x(t) y(t)
387+
δ = Differential(t)
388+
D = Difference(t; dt=0.01)
389+
eqs = [
390+
δ(x) ~ a*x - b*x*y,
391+
δ(y) ~ -c*y + d*x*y,
392+
D(x) ~ y
393+
]
394+
395+
de = ODESystem(eqs,t,[x,y],[a,b,c,d])
396+
397+
@test generate_difference_cb(de) isa ModelingToolkit.DiffEqCallbacks.DiscreteCallback
398+
399+
prob = ODEProblem(ODEFunction{false}(de),[1.0,1.0],(0.0,1.0),[1.5,1.0,3.0,1.0])
400+
401+
prob = ODEProblem(de,[1.0,1.0],(0.0,1.0),[1.5,1.0,3.0,1.0], check_length=false)
402+
403+
@test prob.kwargs[:difference_cb] isa ModelingToolkit.DiffEqCallbacks.DiscreteCallback
404+
405+
solve(prob, Tsit5(); cb=prob.kwargs[:difference_cb])

0 commit comments

Comments
 (0)