Skip to content

Commit 82b86a8

Browse files
committed
Add integral to get_unit
1 parent 0c6c628 commit 82b86a8

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
@@ -32,6 +32,12 @@ function get_unit(x::Symbolic)
3232
return symunits
3333
elseif operation(x) isa Differential
3434
return get_unit(arguments(x)[1]) / get_unit(operation(x).x)
35+
elseif operation(x) isa Integral
36+
unit = 1
37+
for u in operation(x).x
38+
unit *= get_unit(u)
39+
end
40+
return get_unit(arguments(x)[1]) * unit
3541
elseif operation(x) isa Difference
3642
return get_unit(arguments(x)[1]) / get_unit(operation(x).t) #TODO: make this same as Differential
3743
elseif x isa Pow
@@ -40,7 +46,7 @@ function get_unit(x::Symbolic)
4046
@assert expon isa Unitful.DimensionlessUnits
4147
if base == unitless
4248
unitless
43-
else
49+
else
4450
pargs[2] isa Number ? operation(x)(base, pargs[2]) : operation(x)(1*base, pargs[2])
4551
end
4652
elseif x isa Add # Cannot simply add the units b/c they may differ in magnitude (eg, kg vs g)
@@ -60,7 +66,7 @@ function get_unit(x::Symbolic)
6066
terms[1] == unitless || throw(ValidationError(", in $x, [$(terms[1])] is not dimensionless."))
6167
equivalent(terms[2],terms[3]) || throw(ValidationError(", in $x, units [$(terms[2])] and [$(terms[3])] do not match."))
6268
return terms[2]
63-
elseif operation(x) == Symbolics._mapreduce
69+
elseif operation(x) == Symbolics._mapreduce
6470
if x.arguments[2] == +
6571
get_unit(x.arguments[3])
6672
else
@@ -77,7 +83,7 @@ function safe_get_unit(term, info)
7783
try
7884
side = get_unit(term)
7985
catch err
80-
if err isa Unitful.DimensionError
86+
if err isa Unitful.DimensionError
8187
@warn("$info: $(err.x) and $(err.y) are not dimensionally compatible.")
8288
elseif err isa ValidationError
8389
@warn(info*err.message)
@@ -112,7 +118,7 @@ function _validate(terms::Vector, labels::Vector{String}; info::String = "")
112118
end
113119

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

0 commit comments

Comments
 (0)