Source code for yt.frontends.open_pmd.misc
import numpy as np
from yt.utilities.logger import ytLogger as mylog
[docs]
def parse_unit_dimension(unit_dimension):
    r"""Transforms an openPMD unitDimension into a string.
    Parameters
    ----------
    unit_dimension : array_like
        integer array of length 7 with one entry for the dimensional component of every
        SI unit
        [0] length L,
        [1] mass M,
        [2] time T,
        [3] electric current I,
        [4] thermodynamic temperature theta,
        [5] amount of substance N,
        [6] luminous intensity J
    References
    ----------
    https://github.com/openPMD/openPMD-standard/blob/latest/STANDARD.md#unit-systems-and-dimensionality
    Returns
    -------
    str
    Examples
    --------
    >>> velocity = [1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0]
    >>> print(parse_unit_dimension(velocity))
    'm**1*s**-1'
    >>> magnetic_field = [0.0, 1.0, -2.0, -1.0, 0.0, 0.0, 0.0]
    >>> print(parse_unit_dimension(magnetic_field))
    'kg**1*s**-2*A**-1'
    """
    if len(unit_dimension) != 7:
        mylog.error("SI must have 7 base dimensions!")
    unit_dimension = np.asarray(unit_dimension, dtype="int64")
    dim = []
    si = ["m", "kg", "s", "A", "C", "mol", "cd"]
    for i in np.arange(7):
        if unit_dimension[i] != 0:
            dim.append(f"{si[i]}**{unit_dimension[i]}")
    return "*".join(dim) 
[docs]
def is_const_component(record_component):
    """Determines whether a group or dataset in the HDF5 file is constant.
    Parameters
    ----------
    record_component : h5py.Group or h5py.Dataset
    Returns
    -------
    bool
        True if constant, False otherwise
    References
    ----------
    .. https://github.com/openPMD/openPMD-standard/blob/latest/STANDARD.md,
       section 'Constant Record Components'
    """
    return "value" in record_component.attrs.keys() 
[docs]
def get_component(group, component_name, index=0, offset=None):
    """Grabs a dataset component from a group as a whole or sliced.
    Parameters
    ----------
    group : h5py.Group
    component_name : str
        relative path of the component in the group
    index : int, optional
        first entry along the first axis to read
    offset : int, optional
        number of entries to read
        if not supplied, every entry after index is returned
    Notes
    -----
    This scales every entry of the component with the respective "unitSI".
    Returns
    -------
    ndarray
        (N,) 1D in case of particle data
        (O,P,Q) 1D/2D/3D in case of mesh data
    """
    record_component = group[component_name]
    unit_si = record_component.attrs["unitSI"]
    if is_const_component(record_component):
        shape = np.asarray(record_component.attrs["shape"])
        if offset is None:
            shape[0] -= index
        else:
            shape[0] = offset
        # component is constant, craft an array by hand
        return np.full(shape, record_component.attrs["value"] * unit_si)
    else:
        if offset is not None:
            offset += index
        # component is a dataset, return it (possibly masked)
        return np.multiply(record_component[index:offset], unit_si)