Source code for turbo_moc.meshing.inspection
"""Compact slices and worst-cell subsets extracted from the actual volume."""
import numpy as np
[docs]
def load_grid(directory):
import pyvista as pv
with np.load(directory / "volume_data.npz", allow_pickle=False) as data:
packed, kinds, tags = [], [], []
for kind, width, vtk_type in ((5, 8, 12), (6, 6, 13)):
name = f"cells_{kind}"
if name not in data:
continue
cells = data[name]
packed.append(np.column_stack((np.full(len(cells), width), cells)).ravel())
kinds.append(np.full(len(cells), vtk_type, dtype=np.uint8))
tags.append(data[f"tags_{kind}"])
grid = pv.UnstructuredGrid(np.concatenate(packed), np.concatenate(kinds), data["xyz"])
grid.cell_data["cell_id"] = np.concatenate(tags)
for metric in ("skewness", "orthogonality", "aspect_ratio"):
grid.cell_data[metric] = data[metric]
return grid
[docs]
def inspect_mesh(directory, mode, axis="Z", fraction=0.5, metric="skewness"):
"""Return drawing data plus an explanation of the exact inspection basis."""
if mode not in ("slice", "worst"):
return None
grid = load_grid(directory)
if mode == "slice":
index = {"X": 0, "Y": 1, "Z": 2}[axis]
origin = np.asarray(grid.center)
lo, hi = grid.bounds[2 * index:2 * index + 2]
origin[index] = lo + float(fraction) * (hi - lo)
normal = np.eye(3)[index]
surface = grid.slice(normal=normal, origin=origin)
note = f"Physical {axis} = {origin[index]:.4g} mm plane; actual volume-cell intersections."
else:
values = grid.cell_data[metric]
rank = np.argsort(values)
if metric != "orthogonality":
rank = rank[::-1]
chosen = rank[:10]
surface = grid.extract_cells(chosen).extract_surface()
ids = grid.cell_data["cell_id"][chosen].tolist()
note = f"Ten worst cells by {metric}; original Gmsh IDs: {ids}."
return {"surfaces": {"inspection": {"points": surface.points.ravel().tolist(),
"polys": surface.faces.tolist()}},
"note": note, "mode": mode}