@@ -1377,3 +1377,60 @@ end
13771377    prob =  ODEProblem (decay, [], (0.0 , 10.0 ), [])
13781378    @test_nowarn  solve (prob, Tsit5 (), tstops =  [1.0 ])
13791379end 
1380+ 
1381+ @testset  " Array parameter updates in ImperativeEffect"   begin 
1382+     function  weird1 (max_time; name)
1383+         params =  @parameters  begin 
1384+             θ (t) =  0.0 
1385+         end 
1386+         vars =  @variables  begin 
1387+             x (t) =  0.0 
1388+         end 
1389+         eqs =  reduce (vcat, Symbolics. scalarize .([
1390+             D (x) ~  1.0 
1391+         ]))
1392+         reset =  ModelingToolkit. ImperativeAffect (
1393+             modified =  (; x, θ)) do  m, o, _, i
1394+             @set!  m. θ =  0.0 
1395+             @set!  m. x =  0.0 
1396+             return  m
1397+         end 
1398+         return  ODESystem (eqs, t, vars, params; name =  name,
1399+             continuous_events =  [[x ~  max_time] =>  reset])
1400+     end 
1401+ 
1402+     function  weird2 (max_time; name)
1403+         params =  @parameters  begin 
1404+             θ (t) =  0.0 
1405+         end 
1406+         vars =  @variables  begin 
1407+             x (t) =  0.0 
1408+         end 
1409+         eqs =  reduce (vcat, Symbolics. scalarize .([
1410+             D (x) ~  1.0 
1411+         ]))
1412+         return  ODESystem (eqs, t, vars, params; name =  name) #  note no event
1413+     end 
1414+ 
1415+     @named  wd1 =  weird1 (0.021 )
1416+     @named  wd2 =  weird2 (0.021 )
1417+ 
1418+     sys1 =  structural_simplify (ODESystem ([], t; name =  :parent ,
1419+         discrete_events =  [0.01  =>  ModelingToolkit. ImperativeAffect (
1420+             modified =  (; θs =  reduce (vcat, [[wd1. θ]])), ctx =  [1 ]) do  m, o, c, i
1421+             @set!  m. θs[1 ] =  c[] +=  1 
1422+         end ],
1423+         systems =  [wd1]))
1424+     sys2 =  structural_simplify (ODESystem ([], t; name =  :parent ,
1425+         discrete_events =  [0.01  =>  ModelingToolkit. ImperativeAffect (
1426+             modified =  (; θs =  reduce (vcat, [[wd2. θ]])), ctx =  [1 ]) do  m, o, c, i
1427+             @set!  m. θs[1 ] =  c[] +=  1 
1428+         end ],
1429+         systems =  [wd2]))
1430+ 
1431+     sol1 =  solve (ODEProblem (sys1, [], (0.0 , 1.0 )), Tsit5 ())
1432+     @test  100.0  ∈  sol1[sys1. wd1. θ]
1433+ 
1434+     sol2 =  solve (ODEProblem (sys2, [], (0.0 , 1.0 )), Tsit5 ())
1435+     @test  100.0  ∈  sol2[sys2. wd2. θ]
1436+ end 
0 commit comments