Skip to content

Commit fccb74f

Browse files
committed
test: add test case
1 parent 65e4703 commit fccb74f

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

test/symbolic_events.jl

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,3 +1440,46 @@ end
14401440
@mtkcompile sys = MWE()
14411441
@test_nowarn ODEProblem(sys, [], (0.0, 1.0))
14421442
end
1443+
1444+
@testset "Test explicit updates correctly handle observed variables." begin
1445+
t = ModelingToolkit.t_nounits; D = ModelingToolkit.D_nounits
1446+
@variables V(t)=-70.0 G(t)=0.0 jcn(t) [input = true] z(t)= 0.0
1447+
@parameters Eₘ=-70.0 θ=-50.0
1448+
1449+
ev = (V θ) => [V ~ Eₘ]
1450+
1451+
@named lif1 = System([D(V) ~ jcn], t, [V, jcn], [Eₘ, θ]; discrete_events = [ev])
1452+
@named lif2 = System([D(V) ~ jcn], t, [V, jcn], [Eₘ, θ]; discrete_events = [ev])
1453+
@named qif = System([D(G) ~ G + z, D(z) ~ z, D(V) ~ jcn], t, [V, G, z, jcn], [Eₘ, θ]; discrete_events = [ev])
1454+
1455+
sys2 = compose(System([lif1.jcn ~ -lif2.V - qif.G, lif2.jcn ~ -lif1.V - qif.G, qif.jcn ~ -lif1.V - lif2.V], t; name = :outer), [lif1, lif2, qif])
1456+
sys2 = mtkcompile(sys2)
1457+
1458+
ev = discrete_events(sys2)[1]
1459+
@test length(observed(ev.affect.system)) == 1
1460+
prob = ODEProblem(sys2, [], (0., 2.))
1461+
sol = solve(prob)
1462+
1463+
first_ev_idx = findfirst(i -> sol.t[i] == sol.t[i+1], 1:length(sol.t))
1464+
t_e = sol.t[first_ev_idx]
1465+
@test sol(t_e - eps(), idxs = [lif2.V, lif1.V]) sol(t_e + eps(), idxs = [lif2.V, lif1.V])
1466+
1467+
# Add observed equations if explicit observed
1468+
ev = (V θ) => [V ~ -jcn]
1469+
@named lif1 = System([D(V) ~ jcn], t, [V, jcn], [Eₘ, θ]; discrete_events = [ev])
1470+
@named lif2 = System([D(V) ~ jcn], t, [V, jcn], [Eₘ, θ]; discrete_events = [ev])
1471+
@named qif = System([D(G) ~ G + z, D(z) ~ z, D(V) ~ jcn], t, [V, G, z, jcn], [Eₘ, θ]; discrete_events = [ev])
1472+
1473+
sys3 = compose(System([lif1.jcn ~ -lif2.V - qif.G, lif2.jcn ~ -lif1.V - qif.G, qif.jcn ~ -lif1.V - lif2.V], t; name = :outer), [lif1, lif2, qif])
1474+
sys3 = mtkcompile(sys3)
1475+
1476+
ev = discrete_events(sys3)[1]
1477+
@test length(observed(ev.affect.system)) == 4
1478+
prob = ODEProblem(sys3, [], (0., 2.))
1479+
sol = solve(prob)
1480+
1481+
first_ev_idx = findfirst(i -> sol.t[i] == sol.t[i+1], 1:length(sol.t))
1482+
t_e = sol.t[first_ev_idx]
1483+
@test sol(t_e + eps(), idxs = qif.V) -sol(t_e + eps(), idxs = qif.jcn)
1484+
@test sol(t_e + eps(), idxs = [lif1.V, lif2.V]) sol(t_e + eps(), idxs = [lif1.V, lif2.V])
1485+
end

0 commit comments

Comments
 (0)