Thanks for this tip. I gave GlobalScope()
a try, and technically it works well, but I can see a duplication of the global parameter in parent components. For example, the following code produces comp
with 2 parameters named rho
using ModelingToolkit
@variables t
@variables p(t)
@parameters rho
D = Differential(t)
rho = GlobalScope(rho)
fluid(;name) = ODESystem(Equation[], t, [p], [rho], defaults=[rho=>1000, p=>0], name=name)
@named A = fluid()
@named B = fluid()
eqs = [
D(B.p) ~ A.p
0 ~ (A.p) - (A.rho)
]
@named comp = ODESystem(eqs, t, [], [], systems=[A, B])
Here is the result for comp
julia> comp
Model comp with 2 equations
States (2):
A₊p(t) [defaults to 0]
B₊p(t) [defaults to 0]
Parameters (2):
rho [defaults to 1000]
rho [defaults to 1000]
The solution works well, if I run the model, it does seem to set rho
globally
ps = [
rho=>900
]
prob = ODEProblem(comp, [], (0,0.1), ps)
solve(prob, ImplicitEuler())
With result…
retcode: Success
Interpolation: 3rd order Hermite
t: 9-element Vector{Float64}:
0.0
1.0e-6
1.2e-6
3.2e-6
2.3199999999999998e-5
0.00022319999999999998
0.0022231999999999994
0.02222319999999999
0.1
u: 9-element Vector{Vector{Float64}}:
[900.0, 0.0]
[900.0, 0.0009]
[900.0, 0.00108]
[900.0, 0.0028799999999999997]
[900.0, 0.02088]
[900.0, 0.20088]
[900.0, 2.0008799999999995]
[900.0, 20.00087999999999]
[900.0, 90.0]