@@ -1440,3 +1440,46 @@ end
14401440 @mtkcompile sys = MWE ()
14411441 @test_nowarn ODEProblem (sys, [], (0.0 , 1.0 ))
14421442end
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