@@ -129,3 +129,42 @@ obsval = @test_nowarn obsfn(sol.u[1], (_, t) -> sol(t), prob.p, sol.t[1])
129129@test_nowarn sol[[sys.osc1.delx, sys.osc2.delx]]
130130@test sol[sys.osc1.delx] ≈ sol(sol.t .- 0.01; idxs = sys.osc1.x)
131131=#
132+
133+ @testset " DDE observed with array variables" begin
134+ @component function valve (; name)
135+ parms = @parameters begin
136+ open (t):: Bool = false
137+ Kp = 2
138+ Ksnap = 1.1
139+ τ = 0.1
140+ end
141+ vars = @variables begin
142+ opening (.. )
143+ lag_opening (t)
144+ snap_opening (t)
145+ end
146+ eqs = [D (opening (t)) ~ Kp * (open - opening (t))
147+ lag_opening ~ opening (t - τ)
148+ snap_opening ~ clamp (Ksnap * lag_opening - 1 / Ksnap, 0 , 1 )]
149+ return System (eqs, t; name = name)
150+ end
151+
152+ @component function veccy (; name)
153+ @parameters dx[1 : 3 ] = ones (3 )
154+ @variables begin
155+ x (t)[1 : 3 ] = zeros (3 )
156+ end
157+ return System ([D (x) ~ dx], t; name = name)
158+ end
159+
160+ @mtkbuild ssys = System (
161+ Equation[], t; systems = [valve (name = :valve ), veccy (name = :vvecs )])
162+ prob = DDEProblem (ssys, [ssys. valve. opening => 1.0 ], (0.0 , 1.0 ))
163+ sol = solve (prob, MethodOfSteps (Tsit5 ()))
164+ obsfn = ModelingToolkit. build_explicit_observed_function (
165+ ssys, ssys. valve. lag_opening + sum (ssys. vvecs. x))
166+ obsval = @test_nowarn obsfn (sol. u[end ], (_, t) -> sol (t), prob. p, sol. t[end ])
167+ @test obsval ≈
168+ sol (sol. t[end ] - prob. ps[ssys. valve. τ]; idxs = ssys. valve. opening) +
169+ sum (sol[ssys. vvecs. x][end ])
170+ end
0 commit comments