Quantity Class¶
Docstring¶
Represents a quantity with units |
|
Helper class for defining specific units for unit parsing. |
Initializing¶
A Quantity
object can represent most physical
quantities as it is based on elementary units:
length
mass
time
temperature
amount
electric current
light intensity
A Quantity
object can be created manually if one knows
the magnitude and the corresponding SI base units. Below we initialize a
volumetric flow rate to be 10 m3/s.
>>> from vunits.quantity import Quantity
>>> vol_flow_rate = Quantity(mag=10., m=3., s=-1)
However, the most convenient way to create Quantity
objects is by using from_units
.
>>> vol_flow_rate = Quantity.from_units(10., 'm3/s')
See the unit database for supported units.
Prefixes (such as ‘k’ for kilo or ‘m’ for milli) are
also supported. Units should be separated by spaces (‘ ‘) or forward slashes
(‘/’). Powers can be specified by appending a number with or without a
tilda (‘^’). Below, we show statements using from_units
that create the
same object as above.
>>> vol_flow_rate = Quantity.from_units(10., 'm^3 s-1')
>>> vol_flow_rate = Quantity.from_units(10000., 'cm^3/ms')
Unit Conversions¶
Unit conversions are all handled internally. After a
Quantity
object is created, you can specify any
equivalent unit by passing the desired unit as a string. For example, below we
convert vol_flow_rate
to ft3/hr.
>>> vol_flow_rate('ft3/min')
21188.802067018023
Units can be compounded as long as the net dimension is equivalent.
>>> vol_flow_rate('mile ft km/day')
1.7613672154617037
Converting the object to a string (using str
) will give the magnitude and
SI base units.
>>> str(vol_flow_rate)
'10.0 m^3 s^-1'
An error message will print out if the inputted units are not compatible with the dimensions.
>>> vol_flow_rate('kg/m3')
ValueError: Unit conversion not possible due to incompatibility between
object's units, 10.0 m^3 s^-1, and requested units, 1.0 m^-3 kg.
Calling the object without a desired unit set will return the magnitude in SI units.
>>> vol_flow_rate()
10.0
Using int
or float
will convert the magnitude to the corresponding type.
>>> int(vol_flow_rate)
10
>>> float(vol_flow_rate)
10.0
Operations¶
Quantity
objects support arithmetic (+, -, *, /,
**)
and logical operations (<, >, <=, >=, ==).
Addition and Subtraction¶
All unit conversions are done under the hood, allowing two
Quantity
to be added or subtracted. Below, we add two
volumetric rates.
>>> vol_rate1 = Quantity.from_units(1., 'mol/cm3/s')
>>> vol_rate2 = Quantity.from_units(7200., 'mol/cm3/hr') # 2 mol/cm3/s
>>> net_vol_rate = vol_rate1 + vol_rate2
>>> net_vol_rate('mol/cm3/s')
3.0
Addition and subtraction are only valid if the dimensions agree. Below, we try to add a surface rate to a volumetric rate and it throws an error.
>>> surf_rate = Quantity.from_units(1., 'mol/cm2/s')
>>> bad_sum = vol_rate1 + surf_rate
TypeError: Addition incompatible due to different units,
999999.9999999999 m^-3 s^-1 mol and 10000.0 m^-2 s^-1 mol.
Similarly, an error will be raised if simple numerical types are added to
Quantity
object with units.
>>> vol_flow_rate + 1.
TypeError: Addition incompatible due to different units,
999999.9999999999 m^-3 s^-1 mol and 1.
However, if the Quantity
object is dimensionless, no
error will be thrown but the result will be another
Quantity
object. Use ()
, float()
, or int()
to convert to the desired type.
>>> ratio = Quantity(0.5)
>>> # Adding a float to Quantity will return a Quantity object
>>> new_ratio = ratio + 0.2
<vunits.quantity.Quantity object at 0x000002DFCD2364A8>
>>> # Access the magnitude by calling object or using float
>>> new_ratio()
0.7
>>> float(new_ratio)
0.7
Multiplication and Division¶
Multiplying and dividing units will apply the appropriate operations to the
units. Below, we calculate the standard molar volume by importing constants
(which are also Quantity
objects).
>>> from vunits.constants import R, T0, P0
>>> # Standard temperature
>>> print(T0)
298.15 K
>>> # Standard pressure
>>> print(P0)
100000.0 m^-1.0 kg s^-2.0
>>> # Calculate standard molar volume
>>> V0 = R*T0/P0
>>> print(V0)
0.024789561893699998 m^3.0 mol^-1.0
Multiplying by simpler Python types (like float) will result in the magnitude
changing but remember that unless a unit set is called, it will return a
Quantity
object.
>>> str(100*V0)
'2.47895618937 m^3 mol^-1'
>>> 100*V0
<vunits.quantity.Quantity object at 0x000002DFCD276DD8>
Powers¶
Similarly to multiplying and dividing, the power operator (**) will handle unit conversions appropriately. Below we square the volumetric flow rate from the unit conversion section.
>>> str(vol_flow_rate**2)
'100.0 m^6 s^-2'
Logical¶
Most of the logical operations (<, >, <=, =>) will only return without errors if the units are equivalent.
>>> vol_rate1 > vol_rate2
False
>>> vol_rate1 < vol_rate2
True
>>> vol_rate1 >= vol_rate2
False
>>> vol_rate1 <= vol_rate2
True
>>> # Error raised for different types
>>> vol_rate1 > surf_rate
TypeError: Greater than operation incompatible due to different units,
999999.9999999999 m^-3 s^-1 mol and 10000.0 m^-2 s^-1 mol.
However, the equality operators (==, !=), will return never throw errors.
If both are Quantity
objects, the units and magnitude
are compared. A dimensionless Quantity
object can be
compared to elementary types (e.g. float). In this case, the magnitudes are
compared.
>>> vol_rate1 == vol_rate1
True
>>> # Different magnitudes result in False
>>> vol_rate1 == vol_rate2
False
>>> # Different units result in False
>>> vol_rate1 == surf_rate
False
>>> # Different types result in False
>>> vol_rate1 == 1.
False
>>> vol_rate1 != 1.
True
If the Quantity
object is dimensionless, logical
operators will compare the magnitude.
>>> # From previous section, ratio = Quantity(0.5)
>>> ratio > 0.6
False
>>> ratio < 0.6
True
>>> ratio == 0.6
False
>>> ratio == 0.5
True
>>> ratio != 0.6
True