Skip to content

Commit 7de6abf

Browse files
fix: fix DDE observed with array variables
1 parent 65e59d0 commit 7de6abf

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

src/systems/diffeqs/odesystem.jl

+2-2
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

+37
Original file line numberDiff line numberDiff line change
@@ -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 .- prob.ps[ssys.valve.τ]; idxs = ssys.valve.opening).u .+
163+
sum.(sol[ssys.vvecs.x])
164+
end

0 commit comments

Comments
 (0)