@@ -15,6 +15,24 @@ sol = solve(prob, Tsit5())
15
15
i4 = findfirst (== (4.0 ), sol[:t ])
16
16
@test sol. u[i4 + 1 ][1 ] > 10.0
17
17
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
+
18
36
# context
19
37
function affect2! (integ, u, p, ctx)
20
38
integ. u[u. u] += ctx[1 ]
@@ -157,10 +175,41 @@ prob2 = ODEProblem(sys2, u0, (0, 10.0))
157
175
sol2 = solve (prob2, Rodas4 ())
158
176
@test all (sol2[rc_model2. capacitor2. v] .== sol[rc_model. capacitor. v])
159
177
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
+
160
210
# bouncing ball
161
211
162
212
# DiffEq implementation
163
-
164
213
function f_ (du, u, p, t)
165
214
du[1 ] = u[2 ]
166
215
du[2 ] = - p
0 commit comments