diff --git a/src/systems/imperative_affect.jl b/src/systems/imperative_affect.jl index 4c9ff3d248..9be9536c93 100644 --- a/src/systems/imperative_affect.jl +++ b/src/systems/imperative_affect.jl @@ -101,10 +101,22 @@ end namespace_affects(af::ImperativeAffect, s) = namespace_affect(af, s) function namespace_affect(affect::ImperativeAffect, s) + rmn = [] + for modded in modified(affect) + if symbolic_type(modded) == NotSymbolic() && modded isa AbstractArray + res = [] + for m in modded + push!(res, renamespace(s, m)) + end + push!(rmn, res) + else + push!(rmn, renamespace(s, modded)) + end + end ImperativeAffect(func(affect), namespace_expr.(observed(affect), (s,)), observed_syms(affect), - renamespace.((s,), modified(affect)), + rmn, modified_syms(affect), context(affect), affect.skip_checks) diff --git a/test/symbolic_events.jl b/test/symbolic_events.jl index 3fb66081a2..5c0a2ee7fc 100644 --- a/test/symbolic_events.jl +++ b/test/symbolic_events.jl @@ -1434,3 +1434,30 @@ end sol2 = solve(ODEProblem(sys2, [], (0.0, 1.0)), Tsit5()) @test 100.0 ∈ sol2[sys2.wd2.θ] end + +@testset "Array parameter updates of parent components in ImperativeEffect" begin + function child(vals; name, max_time = 0.1) + vars = @variables begin + x(t) = 0.0 + end + eqs = reduce(vcat, Symbolics.scalarize.([ + D(x) ~ 1.0 + ])) + reset = ModelingToolkit.ImperativeAffect( + modified = (; vals = Symbolics.scalarize(ParentScope.(vals)), x)) do m, o, _, i + @set! m.vals = m.vals .+ 1 + @set! m.x = 0.0 + return m + end + return ODESystem(eqs, t, vars, []; name = name, + continuous_events = [[x ~ max_time] => reset]) + end + shared_pars = @parameters begin + vals(t)[1:2] = 0.0 + end + + @named sys = ODESystem(Equation[], t, [], Symbolics.scalarize(vals); + systems = [child(vals; name = :child)]) + sys = structural_simplify(sys) + sol = solve(ODEProblem(sys, [], (0.0, 1.0)), Tsit5()) +end