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