@@ -125,3 +125,40 @@ obsfn = ModelingToolkit.build_explicit_observed_function(
125
125
sys, [sys. osc1. delx, sys. osc2. delx])
126
126
@test_nowarn sol[[sys. osc1. delx, sys. osc2. delx]]
127
127
@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 .- prob. ps[ssys. valve. τ]; idxs = ssys. valve. opening). u .+
163
+ sum .(sol[ssys. vvecs. x])
164
+ end
0 commit comments