The Quantity
Declaration
Declaration
In AIMMS, all units are uniquely coupled to declared quantities. For
each declared Quantity
you must specify an identifier together with
one or more of its attributes listed in
this table.
Attribute |
Value-type |
Mandatory |
---|---|---|
|
[unit-symbol] [=] [unit-expression] |
yes |
|
string |
|
|
unit-conversion-list |
|
|
comment string |
The BaseUnit
attribute
You must always specify a base unit for each quantity that you declare. Its value is either
an atomic unit symbol,
a unit expression, or
a compound unit symbol with unit expression.
A unit symbol can be any sequence of the characters a
-z
, the
digits 0
-9
, and the symbols _
, @
, &
, %
, |
,
as well as a currency symbol not starting with a digit, or one of the
special unit symbols 1
and -
. The latter two special unit
symbols allow you, for instance, to declare model identifiers without
unit, or to express unitless numerical data in terms of percentages.
Currency symbols
AIMMS supports the currency symbols as defined by the Unicode committee, see http://unicode.org/charts/PDF/U20A0.pdf.
Separate namespace
AIMMS stores unit symbols in namespaces separate but parallel to the identifier namespaces. Hence, you are free to choose unit symbols equal to the names of global identifiers within your model. Namespaces in AIMMS are discussed in full detail in Module Declaration and Attributes.
Backward compatibility
AIMMS 3.8 and older use only a singleton unit namespace which was a
potential cause of nameclashes when units with the same name are
declared from quantities or unit parameters declared in different
namespaces. In order to obtain the old behaviour one can make sure that
all units are declared within the global namespace or set the option
singleton_unit_namespace
to on
. This option can be found in the
backward compatibility category.
Example
The following example illustrates the three types of base units.
Quantity Length {
BaseUnit : {
m ! atomic unit
}
}
Quantity Time {
BaseUnit : {
s ! atomic unit
}
}
Quantity Velocity {
BaseUnit : {
m/s ! unit expression
}
}
Quantity Frequency {
BaseUnit : {
Hz = 1/s ! compound unit symbol with unit expression
}
}
The atomic unit symbols m
and s
are the base units for the
quantities Length
and Time
. The unit expression m/s
is the
base unit for the quantity Velocity
. The compound unit symbol
Hz
, defined by the unit expression 1/s
, is the base unit of the
quantity Frequency
.
Derived can be used as basic
The previous example strictly adheres to the SI standards, and, for
example, defines the base unit of the derived quantity Frequency
in
terms of the base unit of Time
. In general, this is not necessary.
If Time
is not used anywhere else in your model, you can just
provide the base unit Hz
for Frequency
without providing its
translation in SI base units. Frequency
then becomes a basic
quantity, and Hz
becomes an atomic base unit.
Unit expressions
The unit expressions that you can enter in the BaseUnit
attribute
can only consist of
unit symbols (base and/or related units),
constant factors,
the two operators
*
and/
,parentheses, and
the power operator
^
with integer exponent.
The common precedence order of the operators *
, /
and
^
is as described in Operator Precedence. Unit expressions
are discussed in full detail in Unit Expressions.
The Conversion
attribute
With the Conversion
attribute you can declare and define one or more
related unit symbols by specifying the (linear) transformation to the
associated base unit.
The conversion syntax is as follows.
Syntax
unit-conversion-list:
Unit conversion explained
A unit conversion must be defined using a linear expression of the form
\((\texttt{\#}\cdot a+b)\) where #
is a special token,
and the operator \(\cdot\) stands for either multiplication or
division. The coefficients \(a\) and \(b\) can be either
numerical constants or references to scalar parameters. An example in
which the use of scalar parameters is particularly convenient is the
conversion between currencies parameterized by a varying exchange rate.
Example
Quantity Length {
BaseUnit : m;
Conversions : {
km -> m : # -> # * 1000,
mile -> m : # -> # * 1609
}
}
Quantity Temperature {
BaseUnit : degC;
Conversions : degC -> degF : # -> # * 1.8 + 32;
}
Quantity Energy {
BaseUnit : J = kg * m^2 / s^2;
Conversions : {
kJ -> J : # -> # * 1000 ,
MJ -> J : # -> # * 1.0e6,
kWh -> J : # -> # * 3.6e6
}
}
Quantity Currency {
BaseUnit : US$;
Conversion : {
DM -> US$ : # -> # * ExchangeRate('DM') ,
DFl -> US$ : # -> # * ExchangeRate('DFl')
}
}
Quantity Unitless {
BaseUnit : 1;
Conversions : % -> 1 : # -> # / 100;
}