Skip to content

Commit 8155e56

Browse files
author
dd
committed
added more tests
1 parent f59d1e4 commit 8155e56

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

src/systems/callbacks.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ get_continuous_events(sys::AbstractSystem) = Equation[]
33
get_continuous_events(sys::AbstractODESystem) = getfield(sys, :continuous_events)
44
has_continuous_events(sys::AbstractSystem) = isdefined(sys, :continuous_events)
55

6-
function has_discrete_events(sys::AbstractSystem)
7-
isdefined(sys, :discrete_events) && length(sys.discrete_events) > 0
8-
end
6+
has_discrete_events(sys::AbstractSystem) = isdefined(sys, :discrete_events)
97
function get_discrete_events(sys::AbstractSystem)
108
has_discrete_events(sys) || return SymbolicDiscreteCallback[]
119
getfield(sys, :discrete_events)

test/funcaffect.jl

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,24 @@ sol = solve(prob, Tsit5())
1515
i4 = findfirst(==(4.0), sol[:t])
1616
@test sol.u[i4 + 1][1] > 10.0
1717

18+
# named tuple
19+
sys1 = ODESystem(eqs, t, [u], [], name = :sys,
20+
discrete_events = [
21+
[4.0] => (f = affect1!, sts = [u], pars = [], ctx = nothing),
22+
])
23+
@test sys == sys1
24+
25+
# has_functional_affect
26+
de = ModelingToolkit.get_discrete_events(sys1)
27+
@test length(de) == 1
28+
de = de[1]
29+
@test ModelingToolkit.condition(de) == [4.0]
30+
@test ModelingToolkit.has_functional_affect(de)
31+
32+
sys2 = ODESystem(eqs, t, [u], [], name = :sys,
33+
discrete_events = [[4.0] => [u ~ -u]])
34+
@test !ModelingToolkit.has_functional_affect(ModelingToolkit.get_discrete_events(sys2)[1])
35+
1836
# context
1937
function affect2!(integ, u, p, ctx)
2038
integ.u[u.u] += ctx[1]
@@ -157,10 +175,41 @@ prob2 = ODEProblem(sys2, u0, (0, 10.0))
157175
sol2 = solve(prob2, Rodas4())
158176
@test all(sol2[rc_model2.capacitor2.v] .== sol[rc_model.capacitor.v])
159177

178+
# discrete events
179+
180+
function affect7!(integ, u, p, ctx)
181+
integ.p[p.g] = 0
182+
end
183+
184+
function Ball(; name, g = 9.8, anti_gravity_time = 1.0)
185+
pars = @parameters g = g
186+
sts = @variables x(t), v(t)
187+
eqs = [D(x) ~ v, D(v) ~ g]
188+
ODESystem(eqs, t, sts, pars; name = name,
189+
discrete_events = [[anti_gravity_time] => (affect7!, [], [g], nothing)])
190+
end
191+
192+
@named ball1 = Ball(anti_gravity_time = 1.0)
193+
@named ball2 = Ball(anti_gravity_time = 2.0)
194+
195+
@named balls = ODESystem(Equation[], t)
196+
balls = compose(balls, [ball1, ball2])
197+
198+
@test ModelingToolkit.has_discrete_events(balls)
199+
200+
prob = ODEProblem(balls, [ball1.x => 10.0, ball1.v => 0, ball2.x => 10.0, ball2.v => 0],
201+
(0, 3.0))
202+
sol = solve(prob, Tsit5())
203+
204+
@test sol(0.99)[1] == sol(0.99)[3]
205+
@test sol(1.01)[4] > sol(1.01)[2]
206+
@test sol(1.99)[2] == sol(1.01)[2]
207+
@test sol(1.99)[4] > sol(1.01)[4]
208+
@test sol(2.5)[4] == sol(3.0)[4]
209+
160210
# bouncing ball
161211

162212
# DiffEq implementation
163-
164213
function f_(du, u, p, t)
165214
du[1] = u[2]
166215
du[2] = -p

0 commit comments

Comments
 (0)