Skip to content

Commit 605d2ce

Browse files
fixup! fix: fix DDE observed with array variables
1 parent aefe112 commit 605d2ce

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

test/dde.jl

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)