Unit Systems (gala.units
)¶
Introduction¶
This module contains a class for handling systems of units, and provides a few pre-defined unit systems that are useful for galactic dynamics.
For the examples below, I assume the following imports have already been executed:
>>> import astropy.units as u
>>> import numpy as np
>>> from gala.units import UnitSystem
Unit Systems¶
A unit system is defined by a set of base units that specify length, time, mass,
and angle units. A UnitSystem
object is created by passing in
units with (at least) these four required physical types:
>>> usys = UnitSystem(u.cm, u.millisecond, u.degree, u.gram)
>>> usys
<UnitSystem (cm, ms, g, deg)>
Astropy Quantity
objects can be decomposed into this
unit system using decompose()
:
>>> a = 15 * u.km/u.s
>>> a.decompose(usys)
<Quantity 1500. cm / ms>
UnitSystem
objects can also act as a dictionary to look up a unit
for a given physical type. For example, if we want to know what a ‘velocity’
unit is in a given unit system, pass the key 'speed'
or 'velocity'
:
>>> usys['speed']
Unit("cm / ms")
This works for the base unit physical types and for more complex physical types:
>>> usys['length']
Unit("cm")
>>> usys['pressure']
Unit("g / (cm ms2)")
In Astropy version 4.3 and later, units from UnitSystem
objects
can also be retrieved by passing in Astropy PhysicalType
instances as keys,
for example:
>>> ptype = u.get_physical_type('length')**2 / u.get_physical_type('time')
>>> usys[ptype]
Unit("cm2 / ms")
Creating unit systems with scaled base units¶
It is sometimes useful to construct a unit system with base units that are
scaled versions of units. For example, you may want to create a unit system with
the base units (10 kpc, 200 Myr, 1000 Msun). To construct a
UnitSystem
with scaled base units, pass in
Quantity
objects. For example:
>>> usys = UnitSystem(10 * u.kpc, 200 * u.Myr, 1000 * u.Msun, u.radian)
>>> usys
<UnitSystem (10.0 kpc, 200.0 Myr, 1000.0 solMass, rad)>
>>> q = 15.7 * u.kpc
>>> q.decompose(usys)
<Quantity 1.57 10.0 kpc>
Or, to create a unit system in which G=1, given length and mass units:
>>> from astropy.constants import G
>>> L_unit = 1 * u.kpc
>>> M_unit = 1e6 * u.Msun
>>> T_unit = np.sqrt((L_unit**3) / (G * M_unit))
>>> usys = UnitSystem(L_unit, M_unit, T_unit.to(u.Myr), u.radian)
>>> np.round(usys.get_constant('G'), 5)
1.0
Custom display units¶
It is sometimes useful to have default display units for physical types that are not simple compositions of base units. For example, for kinematics within the Milky Way, a common base unit system consists of (kpc, Myr, Msun), but velocities are often expressed or displayed in km/s. To change the default display unit of a composite unit, specify the preferred unit on creation:
>>> usys = UnitSystem(u.kpc, u.Myr, u.radian, u.Msun)
>>> usys2 = UnitSystem(u.kpc, u.Myr, u.radian, u.Msun, u.km/u.s)
>>> usys['velocity'], usys2['velocity']
(Unit("kpc / Myr"), Unit("km / s"))
For unit systems with specified composite units (e.g., usys2
above),
the Astropy decompose()
method will fail because
it only uses the base units:
>>> q = 150 * u.pc/u.Myr
>>> q.decompose(usys2)
<Quantity 0.15 kpc / Myr>
Because we specified a unit for quantities with a physical type = ‘velocity’, we
can instead use the decompose
method of the
UnitSystem
object to retrieve the object in the desired display
unit:
>>> usys2.decompose(q)
<Quantity 146.66883325 km / s>
API¶
gala.units Module¶
Classes¶
|
Represents a system of units. |
Represents a system of units. |