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