Skip to content

Commit 820cdbc

Browse files
committed
Handle time dependent parameters and states in setproperty!
1 parent e9b93c4 commit 820cdbc

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

src/systems/abstractsystem.jl

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,20 @@ function Base.getproperty(sys::AbstractSystem, name::Symbol)
223223
end
224224

225225
function Base.setproperty!(sys::AbstractSystem, prop::Symbol, val)
226-
if (pa = Sym{Parameter{Real}}(prop); pa in parameters(sys))
227-
sys.default_p[pa] = value(val)
228-
# comparing a Sym returns a symbolic expression
229-
elseif (st = Sym{Real}(prop); any(s->s.name==st.name, states(sys)))
230-
sys.default_u0[st] = value(val)
226+
# We use this weird syntax because `parameters` and `states` calls are
227+
# potentially expensive.
228+
if (
229+
params = parameters(sys);
230+
idx = findfirst(s->getname(s) == prop, params);
231+
idx !== nothing;
232+
)
233+
sys.default_p[params[idx]] = value(val)
234+
elseif (
235+
sts = states(sys);
236+
idx = findfirst(s->getname(s) == prop, sts);
237+
idx !== nothing;
238+
)
239+
sys.default_u0[sts[idx]] = value(val)
231240
else
232241
setfield!(sys, prop, val)
233242
end

0 commit comments

Comments
 (0)