Skip to content

Commit 4d51209

Browse files
Merge pull request #1219 from ashutosh-b-b/get_unit_Integral
Add Integral Operator to get_unit
2 parents ba1ddf2 + 82b86a8 commit 4d51209

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

src/systems/validation.jl

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ function screen_unit(result)
1212
end
1313
"Find the unit of a symbolic item."
1414
get_unit(x::Real) = unitless
15-
function get_unit(x::Unitful.Quantity)
15+
function get_unit(x::Unitful.Quantity)
1616
result = Unitful.unit(x)
1717
screen_unit(result)
1818
return result
@@ -33,6 +33,12 @@ function get_unit(x::Symbolic)
3333
return symunits
3434
elseif operation(x) isa Differential
3535
return get_unit(arguments(x)[1]) / get_unit(operation(x).x)
36+
elseif operation(x) isa Integral
37+
unit = 1
38+
for u in operation(x).x
39+
unit *= get_unit(u)
40+
end
41+
return get_unit(arguments(x)[1]) * unit
3642
elseif operation(x) isa Difference
3743
return get_unit(arguments(x)[1]) / get_unit(operation(x).t) #TODO: make this same as Differential
3844
elseif x isa Pow
@@ -41,7 +47,7 @@ function get_unit(x::Symbolic)
4147
@assert expon isa Unitful.DimensionlessUnits
4248
if base == unitless
4349
unitless
44-
else
50+
else
4551
pargs[2] isa Number ? operation(x)(base, pargs[2]) : operation(x)(1*base, pargs[2])
4652
end
4753
elseif x isa Add # Cannot simply add the units b/c they may differ in magnitude (eg, kg vs g)
@@ -61,7 +67,7 @@ function get_unit(x::Symbolic)
6167
terms[1] == unitless || throw(ValidationError(", in $x, [$(terms[1])] is not dimensionless."))
6268
equivalent(terms[2],terms[3]) || throw(ValidationError(", in $x, units [$(terms[2])] and [$(terms[3])] do not match."))
6369
return terms[2]
64-
elseif operation(x) == Symbolics._mapreduce
70+
elseif operation(x) == Symbolics._mapreduce
6571
if x.arguments[2] == +
6672
get_unit(x.arguments[3])
6773
else
@@ -78,7 +84,7 @@ function safe_get_unit(term, info)
7884
try
7985
side = get_unit(term)
8086
catch err
81-
if err isa Unitful.DimensionError
87+
if err isa Unitful.DimensionError
8288
@warn("$info: $(err.x) and $(err.y) are not dimensionally compatible.")
8389
elseif err isa ValidationError
8490
@warn(info*err.message)
@@ -113,7 +119,7 @@ function _validate(terms::Vector, labels::Vector{String}; info::String = "")
113119
end
114120

115121
function validate(jump::Union{ModelingToolkit.VariableRateJump, ModelingToolkit.ConstantRateJump}, t::Symbolic; info::String = "")
116-
newinfo = replace(info,"eq."=>"jump")
122+
newinfo = replace(info,"eq."=>"jump")
117123
_validate([jump.rate, 1/t], ["rate", "1/t"], info = newinfo) && # Assuming the rate is per time units
118124
validate(jump.affect!,info = newinfo)
119125
end

0 commit comments

Comments
 (0)