Skip to content

Commit 2d1554a

Browse files
fix: support non-tunable parameters with DDEs
1 parent 75fdc56 commit 2d1554a

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

src/systems/diffeqs/abstractodesystem.jl

+7-4
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,9 @@ function generate_function(sys::AbstractODESystem, dvs = unknowns(sys),
189189
wrap_code = identity,
190190
kwargs...)
191191
if isdde
192-
eqs = delay_to_function(sys)
192+
issplit = has_index_cache(sys) && get_index_cache(sys) !== nothing
193+
eqs = delay_to_function(
194+
sys; history_arg = issplit ? MTKPARAMETERS_ARG : DEFAULT_PARAMS_ARG)
193195
else
194196
eqs = [eq for eq in equations(sys)]
195197
end
@@ -211,7 +213,10 @@ function generate_function(sys::AbstractODESystem, dvs = unknowns(sys),
211213
t = get_iv(sys)
212214

213215
if isdde
214-
build_function(rhss, u, DDE_HISTORY_FUN, p..., t; kwargs...)
216+
build_function(rhss, u, DDE_HISTORY_FUN, p..., t; kwargs...,
217+
wrap_code = wrap_code .∘ wrap_mtkparameters(sys, false, 3) .∘
218+
wrap_array_vars(sys, rhss; dvs, ps) .∘
219+
wrap_parameter_dependencies(sys, false))
215220
else
216221
pre, sol_states = get_substitutions_and_solved_unknowns(sys)
217222

@@ -570,9 +575,7 @@ function DiffEqBase.DDEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
570575
kwargs...)
571576
f_oop, f_iip = eval_or_rgf.(f_gen; eval_expression, eval_module)
572577
f(u, h, p, t) = f_oop(u, h, p, t)
573-
f(u, h, p::MTKParameters, t) = f_oop(u, h, p..., t)
574578
f(du, u, h, p, t) = f_iip(du, u, h, p, t)
575-
f(du, u, h, p::MTKParameters, t) = f_iip(du, u, h, p..., t)
576579

577580
DDEFunction{iip}(f, sys = sys)
578581
end

test/dde.jl

+17
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,20 @@ prob_sa = DDEProblem(sys, [], (0.0, 10.0); constant_lags = [sys.osc1.τ, sys.osc
170170
sol(sol.t .- prob.ps[ssys.valve.τ]; idxs = ssys.valve.opening).u .+
171171
sum.(sol[ssys.vvecs.x])
172172
end
173+
174+
@testset "Issue#3165 DDEs with non-tunables" begin
175+
@variables x(..) = 1.0
176+
@parameters w=1.0 [tunable = false] τ=0.5
177+
eqs = [D(x(t)) ~ -w * x(t - τ)]
178+
179+
@named sys = System(eqs, t)
180+
sys = structural_simplify(sys)
181+
182+
prob = DDEProblem(sys,
183+
[],
184+
(0.0, 10.0),
185+
constant_lags = [τ])
186+
187+
alg = MethodOfSteps(Vern7())
188+
@test_nowarn solve(prob, alg)
189+
end

0 commit comments

Comments
 (0)