Based on the following docs (https://docs.sciml.ai/ModelingToolkit/stable/comparison/), which says ‘Modelica is a declarative programming language. ModelingToolkit.jl is a declarative symbolic modeling language’, I would imagine no, but then I imagine there might be a smart workaround. As an example, I am trying to do fluid modeling while obtaining fluid properties within MTK. To do so, I need to pass a parameter that is not a number (either a string or custom object). Is it possible to do so?
Please find my minimum example, where it is possible to define the fluid model outside of the mtk object, but it is not possible to pass it as a parameter. Is there a way I can make it possible to pass either a string or an object into the mtkmodel?
1. This works using CoolProp
## Coolprop working
# Helper functions
function calc_ρ(T, p)
return PropsSI("D", "T", T, "P", p, fluid_name)
end
@register_symbolic calc_ρ(T::Real, p::Real);
# Fluid parameters
fluid_name = "Hydrogen"
T_in = 70 # K
p_in = 350e5 # Pa
# MTK model
@mtkmodel DensityCalc begin
@parameters begin
T
p
end
@variables begin
ρ(t)
end
@equations begin
ρ ~ calc_ρ(T, p)
end
end
# Solve
@mtkbuild sys = DensityCalc(; T=T_in, p=p_in)
prob = ODEProblem(sys, [], (0, 10.0))
sol = solve(prob, Tsit5())
# Display
println(sol[sys.ρ][end])
println(typeof(fluid_name))
67.30013202474123
String
2. This works using Clapeyron
## Clapeyron working
# Helper functions
function calc_ρ_Clap(T, p)
return mass_density(fluid_model, p, T)
end
@register_symbolic calc_ρ_Clap(T::Real, p::Real);
# Fluid parameters
fluid_model = SingleFluid("Hydrogen")
T_in = 70 # K
p_in = 350e5 # Pa
# MTK model
@mtkmodel DensityCalc begin
@parameters begin
T
p
end
@variables begin
ρ(t)
end
@equations begin
ρ ~ calc_ρ_Clap(T, p)
end
end
# Solve
@mtkbuild sys = DensityCalc(; T=T_in, p=p_in)
prob = ODEProblem(sys, [], (0, 10.0))
sol = solve(prob, Tsit5())
# Display
println(sol[sys.ρ][end])
println(typeof(fluid_model))
3. Coolprop not working
## Coolprop not working
# Helper functions
function calc_ρ(T, p, fluid_name)
return PropsSI("D", "T", T, "P", p, fluid_name)
end
@register_symbolic calc_ρ(T::Real, p::Real, fluid_name);
# Fluid parameters
fluid_name = "Hydrogen"
T_in = 70 # K
p_in = 350e5 # Pa
# MTK model
@mtkmodel DensityCalc begin
@parameters begin
T
p
fluid_name
end
@variables begin
ρ(t)
end
@equations begin
ρ ~ calc_ρ(T, p, fluid_name)
end
end
# Solve
@mtkbuild sys = DensityCalc(; T=T_in, p=p_in, fluid_name=fluid_name)
prob = ODEProblem(sys, [], (0, 10.0))
sol = solve(prob, Tsit5())
# Display
println(sol[sys.ρ][end])
println(typeof(fluid_name))
TypeError: in keyword argument fluid_name, expected Union{Missing, Nothing, ModelingToolkit.NoValue, Real}, got a value of type String
Stacktrace:
[1] (::ModelingToolkit.Model{typeof(DensityCalc), Dict{Symbol, Any}})(; kw::@Kwargs{name::Symbol, T::Int64, p::Float64, fluid_name::String})
@ ModelingToolkit C:\Users\matth.julia\packages\ModelingToolkit\aau6A\src\systems\model_parsing.jl:25
[2] top-level scope
@ C:\Users\matth.julia\packages\ModelingToolkit\aau6A\src\systems\abstractsystem.jl:2268
4. Clapeyron not working
## Clapeyron not working
# Helper functions
function calc_ρ_Clap(T, p, fluid_model)
return mass_density(fluid_model, p, T)
end
@register_symbolic calc_ρ_Clap(T::Real, p::Real);
# Fluid parameters
fluid_model = SingleFluid("Hydrogen")
T_in = 70 # K
p_in = 350e5 # Pa
# MTK model
@mtkmodel DensityCalc begin
@parameters begin
T
p
fluid_model
end
@variables begin
ρ(t)
end
@equations begin
ρ ~ calc_ρ_Clap(T, p, fluid_model)
end
end
# Solve
@mtkbuild sys = DensityCalc(; T=T_in, p=p_in, fluid_model=fluid_model)
prob = ODEProblem(sys, [], (0, 10.0))
sol = solve(prob, Tsit5())
# Display
println(sol[sys.ρ][end])
println(typeof(fluid_model))
TypeError: in keyword argument fluid_model, expected Union{Missing, Nothing, ModelingToolkit.NoValue, Real}, got a value of type SingleFluid{EmpiricAncillary}
Stacktrace:
[1] (::ModelingToolkit.Model{typeof(DensityCalc), Dict{Symbol, Any}})(; kw::@Kwargs{name::Symbol, T::Int64, p::Float64, fluid_model::SingleFluid{EmpiricAncillary}})
@ ModelingToolkit C:\Users\matth.julia\packages\ModelingToolkit\aau6A\src\systems\model_parsing.jl:25
[2] top-level scope
@ C:\Users\matth.julia\packages\ModelingToolkit\aau6A\src\systems\abstractsystem.jl:2268