Skip to content

Commit ca7a2e1

Browse files
committed
Fix unit conversion for expressions
When a parameter is specified in terms of other parameters, no unit conversion should be attempted until the full expression is evaluted.
1 parent 4cb17cd commit ca7a2e1

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/systems/model_parsing.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,14 @@ function convert_units(varunits::Unitful.FreeUnits, value::AbstractArray{T}) whe
663663
Unitful.ustrip.(varunits, value)
664664
end
665665

666+
function convert_units(varunits::Unitful.FreeUnits, value::Num)
667+
value
668+
end
669+
670+
function convert_units(varunits::DynamicQuantities.Quantity, value::Num)
671+
value
672+
end
673+
666674
function parse_variable_arg(dict, mod, arg, varclass, kwargs, where_types)
667675
vv, def, metadata_with_exprs = parse_variable_def!(
668676
dict, mod, arg, varclass, kwargs, where_types)

test/units.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,21 @@ end
223223

224224
@variables x(t)
225225
@test ModelingToolkit.get_unit(sin(x)) == ModelingToolkit.unitless
226+
227+
@mtkmodel ExpressionParametersTest begin
228+
@parameters begin
229+
v = 1.0, [unit = u"m/s"]
230+
τ = 1.0, [unit = u"s"]
231+
end
232+
@components begin
233+
pt = ParamTest(; a = v * τ)
234+
end
235+
end
236+
237+
@named sys = ExpressionParametersTest(; v = 2.0u"m/s", τ = 3.0u"s")
238+
sys = complete(sys)
239+
# TODO: Is there a way to evalute this expression and compare to 6.0?
240+
@test isequal(ModelingToolkit.getdefault(sys.pt.a), sys.v * sys.τ)
241+
@test ModelingToolkit.getdefault(sys.v) 2.0
242+
@test ModelingToolkit.getdefault(sys.τ) 3.0
243+

0 commit comments

Comments
 (0)