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)