Is it possible to read a variable of another subsystem in a callback? For example if I want tu use decay2.u in a callback defined in decay1 in the following example code:
using ModelingToolkit
function affect!(integ,u,p,ctx)
println(integ.u[u.decay2.u])
end
function decay_1(; name)
@parameters t a
@variables x(t) f(t)
D = Differential(t)
control = 10 => (affect!, [x,decay2.u], [], nothing)
ODESystem([
D(x) ~ -a * x + f,
];
name = name,discrete_events=[control])
end
function decay_2(; name)
@parameters t a
@variables u(t) f(t)
D = Differential(t)
ODESystem([
D(u) ~ -a * u + f,
];
name = name)
end
@named decay1 = decay_1()
@named decay2 = decay_2()
@parameters t
D = Differential(t)
connected = compose(ODESystem([decay2.f ~ decay1.x
D(decay1.f) ~ 0], t; name = :connected), decay1, decay2)
equations(connected)
simplified_sys = structural_simplify(connected)
equations(simplified_sys)
x0 = [decay1.x => 1.0
decay1.f => 0.0
decay2.u => 1.0]
p = [decay1.a => 0.1
decay2.a => 0.2]
using DifferentialEquations
prob = ODEProblem(simplified_sys, x0, (0.0, 100.0), p)
sol = solve(prob, Tsit5())
sol[decay2.f]