@@ -12,7 +12,7 @@ function screen_unit(result)
12
12
end
13
13
" Find the unit of a symbolic item."
14
14
get_unit (x:: Real ) = unitless
15
- function get_unit (x:: Unitful.Quantity )
15
+ function get_unit (x:: Unitful.Quantity )
16
16
result = Unitful. unit (x)
17
17
screen_unit (result)
18
18
return result
@@ -32,6 +32,12 @@ function get_unit(x::Symbolic)
32
32
return symunits
33
33
elseif operation (x) isa Differential
34
34
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
35
41
elseif operation (x) isa Difference
36
42
return get_unit (arguments (x)[1 ]) / get_unit (operation (x). t) # TODO : make this same as Differential
37
43
elseif x isa Pow
@@ -40,7 +46,7 @@ function get_unit(x::Symbolic)
40
46
@assert expon isa Unitful. DimensionlessUnits
41
47
if base == unitless
42
48
unitless
43
- else
49
+ else
44
50
pargs[2 ] isa Number ? operation (x)(base, pargs[2 ]) : operation (x)(1 * base, pargs[2 ])
45
51
end
46
52
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)
60
66
terms[1 ] == unitless || throw (ValidationError (" , in $x , [$(terms[1 ]) ] is not dimensionless." ))
61
67
equivalent (terms[2 ],terms[3 ]) || throw (ValidationError (" , in $x , units [$(terms[2 ]) ] and [$(terms[3 ]) ] do not match." ))
62
68
return terms[2 ]
63
- elseif operation (x) == Symbolics. _mapreduce
69
+ elseif operation (x) == Symbolics. _mapreduce
64
70
if x. arguments[2 ] == +
65
71
get_unit (x. arguments[3 ])
66
72
else
@@ -77,7 +83,7 @@ function safe_get_unit(term, info)
77
83
try
78
84
side = get_unit (term)
79
85
catch err
80
- if err isa Unitful. DimensionError
86
+ if err isa Unitful. DimensionError
81
87
@warn (" $info : $(err. x) and $(err. y) are not dimensionally compatible." )
82
88
elseif err isa ValidationError
83
89
@warn (info* err. message)
@@ -112,7 +118,7 @@ function _validate(terms::Vector, labels::Vector{String}; info::String = "")
112
118
end
113
119
114
120
function validate (jump:: Union{ModelingToolkit.VariableRateJump, ModelingToolkit.ConstantRateJump} , t:: Symbolic ; info:: String = " " )
115
- newinfo = replace (info," eq." => " jump" )
121
+ newinfo = replace (info," eq." => " jump" )
116
122
_validate ([jump. rate, 1 / t], [" rate" , " 1/t" ], info = newinfo) && # Assuming the rate is per time units
117
123
validate (jump. affect!,info = newinfo)
118
124
end
0 commit comments