Skip to content

Commit 93dc5bc

Browse files
fix: fix DDE observed with array variables
1 parent 4cd55df commit 93dc5bc

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

src/systems/diffeqs/odesystem.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -539,10 +539,10 @@ function build_explicit_observed_function(sys, ts;
539539
pre = get_postprocess_fbody(sys)
540540

541541
array_wrapper = if param_only
542-
wrap_array_vars(sys, ts; ps = _ps, dvs = nothing, inputs) .∘
542+
wrap_array_vars(sys, ts; ps = _ps, dvs = nothing, inputs, history = is_dde(sys)) .∘
543543
wrap_parameter_dependencies(sys, isscalar)
544544
else
545-
wrap_array_vars(sys, ts; ps = _ps, inputs) .∘
545+
wrap_array_vars(sys, ts; ps = _ps, inputs, history = is_dde(sys)) .∘
546546
wrap_parameter_dependencies(sys, isscalar)
547547
end
548548
mtkparams_wrapper = wrap_mtkparameters(sys, isscalar, p_start)

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+
@parameters begin
136+
open(t)::Bool = false
137+
Kp = 2
138+
Ksnap = 1.1
139+
τ = 0.1
140+
end
141+
@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)