Source code for yt.units
from unyt.array import (
loadtxt,
savetxt,
unyt_array,
unyt_quantity,
)
from unyt.unit_object import Unit, define_unit # NOQA: F401
from unyt.unit_registry import UnitRegistry # NOQA: Ffg401
from unyt.unit_systems import UnitSystem # NOQA: F401
from yt.units.physical_constants import *
from yt.units.physical_constants import _ConstantContainer
from yt.units.unit_symbols import *
from yt.units.unit_symbols import _SymbolContainer
from yt.utilities.exceptions import YTArrayTooLargeToDisplay
from yt.units._numpy_wrapper_functions import (
uconcatenate,
ucross,
udot,
uhstack,
uintersect1d,
unorm,
ustack,
uunion1d,
uvstack,
)
YTArray = unyt_array
YTQuantity = unyt_quantity
[docs]
class UnitContainer:
"""A container for units and constants to associate with a dataset
This object is usually accessed on a Dataset instance via ``ds.units``.
Parameters
----------
registry : UnitRegistry instance
A unit registry to associate with units and constants accessed
on this object.
Example
-------
>>> ds = yt.load("IsolatedGalaxy/galaxy0030/galaxy0030")
>>> code_mass = ds.units.code_mass
>>> (12 * code_mass).to("Msun")
unyt_quantity(4.89719136e+11, 'Msun')
>>> code_mass.registry is ds.unit_registry
True
>>> ds.units.newtons_constant
unyt_quantity(6.67384e-08, 'cm**3/(g*s**2)')
"""
def __init__(self, registry):
self.unit_symbols = _SymbolContainer(registry)
self.physical_constants = _ConstantContainer(registry)
def __dir__(self):
all_dir = self.unit_symbols.__dir__() + self.physical_constants.__dir__()
all_dir += object.__dir__(self)
return list(set(all_dir))
def __getattr__(self, item):
pc = self.physical_constants
us = self.unit_symbols
ret = getattr(us, item, None) or getattr(pc, item, None)
if not ret:
raise AttributeError(item)
return ret
[docs]
def display_ytarray(arr):
r"""
Display a YTArray in a Jupyter widget that enables unit switching.
The array returned by this function is read-only, and only works with
arrays of size 3 or lower.
Parameters
----------
arr : YTArray
The Array to display; must be of size 3 or lower.
Examples
--------
>>> ds = yt.load("IsolatedGalaxy/galaxy0030/galaxy0030")
>>> display_ytarray(ds.domain_width)
"""
if arr.size > 3:
raise YTArrayTooLargeToDisplay(arr.size, 3)
import ipywidgets
unit_registry = arr.units.registry
equiv = unit_registry.list_same_dimensions(arr.units)
dropdown = ipywidgets.Dropdown(options=sorted(equiv), value=str(arr.units))
def arr_updater(arr, texts):
def _value_updater(change):
arr2 = arr.in_units(change["new"])
if arr2.shape == ():
arr2 = [arr2]
for v, t in zip(arr2, texts):
t.value = str(v.value)
return _value_updater
if arr.shape == ():
arr_iter = [arr]
else:
arr_iter = arr
texts = [ipywidgets.Text(value=str(_.value), disabled=True) for _ in arr_iter]
dropdown.observe(arr_updater(arr, texts), names="value")
return ipywidgets.HBox(texts + [dropdown])
def _wrap_display_ytarray(arr):
from IPython.core.display import display
display(display_ytarray(arr))