OpenMC/tests/unit_tests/test_slice_data.py
Paul Romano 4f6a25e00a
Some checks are pending
Tests and Coverage / filter-changes (push) Waiting to run
Tests and Coverage / Python 3.13 (omp=n, mpi=n, dagmc=, libmesh=, event= (push) Blocked by required conditions
Tests and Coverage / Python 3.14 (omp=n, mpi=n, dagmc=, libmesh=, event= (push) Blocked by required conditions
Tests and Coverage / Python 3.14t (omp=n, mpi=n, dagmc=, libmesh=, event= (push) Blocked by required conditions
Tests and Coverage / Python 3.12 (omp=n, mpi=n, dagmc=n, libmesh=n, event=n (push) Blocked by required conditions
Tests and Coverage / Python 3.12 (omp=y, mpi=n, dagmc=n, libmesh=n, event=n (push) Blocked by required conditions
Tests and Coverage / Python 3.12 (omp=n, mpi=y, dagmc=n, libmesh=n, event=n (push) Blocked by required conditions
Tests and Coverage / Python 3.12 (omp=y, mpi=y, dagmc=n, libmesh=n, event=n (push) Blocked by required conditions
Tests and Coverage / Python 3.12 (omp=y, mpi=n, dagmc=, libmesh=y, event= (push) Blocked by required conditions
Tests and Coverage / Python 3.12 (omp=y, mpi=n, dagmc=, libmesh=, event=y (push) Blocked by required conditions
Tests and Coverage / Python 3.12 (omp=y, mpi=y, dagmc=y, libmesh=, event= (push) Blocked by required conditions
Tests and Coverage / Python 3.12 (omp=y, mpi=y, dagmc=, libmesh=y, event= (push) Blocked by required conditions
Tests and Coverage / coverage (push) Blocked by required conditions
Tests and Coverage / Check CI status (push) Blocked by required conditions
dockerhub-publish-develop / main (push) Waiting to run
dockerhub-publish-develop-dagmc-libmesh / main (push) Waiting to run
dockerhub-publish-develop-dagmc / main (push) Waiting to run
dockerhub-publish-develop-libmesh / main (push) Waiting to run
Introduce new C API function for slice plots (#3806)
2026-06-08 21:08:08 +00:00

168 lines
4.8 KiB
Python

import numpy as np
import openmc
from openmc.examples import pwr_pin_cell
def test_slice_data_basic(run_in_tmpdir):
"""Test basic slice_data functionality."""
model = pwr_pin_cell()
geom_data, prop_data = model.slice_data(
origin=(0, 0, 0),
width=(1.0, 1.0),
pixels=(100, 100),
basis='xy'
)
# Without filter, should have 3 fields
assert geom_data.shape == (100, 100, 3)
assert geom_data.dtype == np.int32
assert prop_data.shape == (100, 100, 2)
assert prop_data.dtype == np.float64
# Check we have valid geometry
assert np.any(geom_data[:, :, 0] >= 0) # Valid cell IDs
assert np.any(prop_data[:, :, 0] > 0) # Valid temperatures
def test_slice_data_no_properties(run_in_tmpdir):
"""Test slice_data without property data."""
model = pwr_pin_cell()
geom_data, prop_data = model.slice_data(
origin=(0, 0, 0),
width=(1.0, 1.0),
pixels=(50, 50),
include_properties=False
)
# Without filter, should have 3 fields
assert geom_data.shape == (50, 50, 3)
assert prop_data is None
def test_slice_data_with_filter(run_in_tmpdir):
"""Test slice_data with a cell filter."""
model = pwr_pin_cell()
cell_ids = [c.id for c in model.geometry.get_all_cells().values()]
cell_filter = openmc.CellFilter(cell_ids)
geom_data, _ = model.slice_data(
origin=(0, 0, 0),
width=(1.0, 1.0),
pixels=(50, 50),
filter=cell_filter,
include_properties=False
)
# With filter, should have 4 fields
assert geom_data.shape == (50, 50, 4)
# Filter bin index should be populated where cells exist
filter_bins = geom_data[:, :, 3]
valid_cells = geom_data[:, :, 0] >= 0
assert np.any(filter_bins[valid_cells] >= 0)
def test_slice_data_overlaps(run_in_tmpdir):
"""Test slice_data with overlap detection."""
model = pwr_pin_cell()
geom_data, _ = model.slice_data(
origin=(0, 0, 0),
width=(1.0, 1.0),
pixels=(50, 50),
show_overlaps=True,
include_properties=False
)
# Without filter, should have 3 fields
assert geom_data.shape == (50, 50, 3)
# Check for overlap markers (-3) if any exist
# Note: This test may pass without finding overlaps if geometry is correct
def test_slice_data_overlaps_with_filter(run_in_tmpdir):
"""Test that overlaps don't overwrite filter bin data."""
model = pwr_pin_cell()
cell_ids = [c.id for c in model.geometry.get_all_cells().values()]
cell_filter = openmc.CellFilter(cell_ids)
geom_data, _ = model.slice_data(
origin=(0, 0, 0),
width=(1.0, 1.0),
pixels=(50, 50),
filter=cell_filter,
show_overlaps=True,
include_properties=False
)
assert geom_data.shape == (50, 50, 4)
# If any overlaps exist, verify filter bin is still valid (not -3)
overlap_pixels = geom_data[:, :, 0] == -3
if np.any(overlap_pixels):
# Filter bins at overlap locations should NOT be -3
filter_bins_at_overlaps = geom_data[overlap_pixels, 3]
assert not np.all(filter_bins_at_overlaps == -3), \
"Filter bins should be preserved even where overlaps are detected"
def test_slice_data_different_bases(run_in_tmpdir):
"""Test slice_data with different basis planes."""
model = pwr_pin_cell()
for basis in ['xy', 'xz', 'yz']:
geom_data, prop_data = model.slice_data(
origin=(0, 0, 0),
width=(1.0, 1.0),
pixels=(25, 25),
basis=basis
)
assert geom_data.shape == (25, 25, 3)
assert prop_data.shape == (25, 25, 2)
def test_slice_data_oriented_spans(run_in_tmpdir):
"""Test slice_data with oriented span vectors."""
model = pwr_pin_cell()
geom_data, prop_data = model.slice_data(
origin=(0, 0, 0),
u_span=(1.0, 0.0, 0.0),
v_span=(0.0, 0.0, 1.0),
pixels=(25, 25)
)
assert geom_data.shape == (25, 25, 3)
assert prop_data.shape == (25, 25, 2)
def test_slice_data_level(run_in_tmpdir):
"""Test slice_data with specific universe level."""
model = pwr_pin_cell()
geom_data, _ = model.slice_data(
origin=(0, 0, 0),
width=(1.0, 1.0),
pixels=(50, 50),
level=0, # Root universe only
include_properties=False
)
assert geom_data.shape == (50, 50, 3)
def test_id_map_reverted(run_in_tmpdir):
"""Test that id_map returns 3D array without filter support."""
model = pwr_pin_cell()
id_data = model.id_map(
origin=(0, 0, 0),
width=(1.0, 1.0),
pixels=(50, 50),
basis='xy'
)
# Should have 3 fields (cell_id, cell_instance, material_id)
assert id_data.shape == (50, 50, 3)
assert id_data.dtype == np.int32
# Check valid data
assert np.any(id_data[:, :, 0] >= 0) # Valid cell IDs