Source code for eradiate.kernel.gridvolume
"""
Volume data file I/O helpers.
"""
from __future__ import annotations
import mitsuba as mi
import numpy as np
import xarray as xr
from ..typing import PathLike
[docs]
def write_binary_grid3d(filename: PathLike, values: np.ndarray | xr.DataArray) -> None:
"""
Write volume data to a binary file so that a ``gridvolume`` kernel plugin
can be instantiated with that file.
Parameters
----------
filename : path-like
File name.
values : ndarray or DataArray
Data array to output to the volume data file. This array must have 3 or
4 dimensions (x, y, z, spectrum). If the array is 3-dimensional, it will
automatically be assumed to have only one spectral channel.
"""
if isinstance(values, xr.DataArray):
values = values.values
if not isinstance(values, np.ndarray):
raise TypeError(
f"unsupported data type {type(values)} "
f"(expected numpy array or xarray DataArray)"
)
if values.ndim not in {3, 4}:
raise ValueError(
f"'values' must have 3 or 4 dimensions " f"(got shape {values.shape})"
)
mi.VolumeGrid(values.astype(np.float32)).write(str(filename))
[docs]
def read_binary_grid3d(filename: PathLike) -> np.ndarray:
"""
Reads a volume data binary file.
Parameters
----------
filename : path-like
File name.
Returns
-------
ndarray
Values.
"""
return np.array(mi.VolumeGrid(str(filename)))