Source code for toughio.meshmaker._voxelize

import numpy as np

from ._structured_grid import structured_grid

__all__ = [
    "voxelize",
]


[docs]def voxelize(points, origin, layer=False, material="dfalt"): """ Generate a 3D non-uniform structured grid from cloud points. Input points must form a non-uniform structured grid. Parameters ---------- points : array_like Cooordinates of points. origin : array_like Origin point coordinate. layer : bool, optional, default False If `True`, mesh will be generated by layers. material : str, optional, default 'dfalt' Default material name. Returns ------- toughio.Mesh Output non-uniform structured mesh. """ def voronoi1d(x, x0, xstr): """1D Voronoi tessellation.""" if x.size > 1: x = np.sort(x) if x0 >= x[0]: raise ValueError( f"{xstr}-coordinate of origin must be lower than {x[0]:.3f}, got {x0:.3f}" ) vor = [x0] for xx in x: vor.append(2 * xx - vor[-1]) else: vor = [x0, x0 + 1.0] return vor if not isinstance(points, (list, tuple, np.ndarray)): raise TypeError() if np.ndim(points) != 2: raise ValueError() x, y, z = np.transpose(points) x = np.unique(x) y = np.unique(y) z = np.unique(z) if x.size * y.size * z.size != len(points): raise ValueError("Input points do not form a structured grid.") x0, y0, z0 = origin x = voronoi1d(x, x0, "x") y = voronoi1d(y, y0, "y") z = voronoi1d(z, z0, "z") dx = np.diff(x) dy = np.diff(y) dz = np.diff(z) mesh = structured_grid(dx, dy, dz, origin=origin, layer=layer, material=material) return mesh