OpenMC/tests/unit_tests/test_universe.py
GuySten 04bee9c49f
Check that Surface IDs are at least 1 (#3772)
Co-authored-by: Paul Romano <paul.k.romano@gmail.com>
2026-02-06 18:44:16 +00:00

263 lines
7.7 KiB
Python

from pathlib import Path
import lxml.etree as ET
import numpy as np
import openmc
import pytest
from tests.unit_tests import assert_unbounded
def test_basic():
c1 = openmc.Cell()
c2 = openmc.Cell()
c3 = openmc.Cell()
u = openmc.Universe(name='cool', cells=(c1, c2, c3))
assert u.name == 'cool'
cells = set(u.cells.values())
assert not (cells ^ {c1, c2, c3})
# Test __repr__
repr(u)
with pytest.raises(TypeError):
u.add_cell(openmc.Material())
with pytest.raises(TypeError):
u.add_cells(c1)
u.remove_cell(c3)
cells = set(u.cells.values())
assert not (cells ^ {c1, c2})
u.clear_cells()
assert not set(u.cells)
def test_bounding_box():
cyl1 = openmc.ZCylinder(r=1.0)
cyl2 = openmc.ZCylinder(r=2.0)
c1 = openmc.Cell(region=-cyl1)
c2 = openmc.Cell(region=+cyl1 & -cyl2)
u = openmc.Universe(cells=[c1, c2])
ll, ur = u.bounding_box
assert ll == pytest.approx((-2., -2., -np.inf))
assert ur == pytest.approx((2., 2., np.inf))
u = openmc.Universe()
assert_unbounded(u)
def test_id():
openmc.Universe(universe_id=0)
with pytest.raises(ValueError):
openmc.Universe(universe_id=-1)
def test_plot(run_in_tmpdir, sphere_model):
# model with -inf and inf in the bounding box
pincell = openmc.examples.pwr_pin_cell()
materials = pincell.materials
mat_colors = {
materials[0]: (200, 1, 1),
materials[1]: "gray",
materials[2]: "limegreen"
}
for basis in ('xy', 'yz', 'xz'):
plot = pincell.geometry.root_universe.plot(
colors=mat_colors,
color_by="material",
legend=True,
pixels=(10, 10),
basis=basis,
outline=True,
axis_units='m'
)
assert plot.xaxis.get_label().get_text() == f'{basis[0]} [m]'
assert plot.yaxis.get_label().get_text() == f'{basis[1]} [m]'
# model with no inf values in bounding box
m = sphere_model.materials[0]
univ = sphere_model.geometry.root_universe
colors = {m: 'limegreen'}
for basis in ('xy', 'yz', 'xz'):
plot = univ.plot(
colors=colors,
color_by="cell",
legend=False,
pixels=100,
basis=basis,
outline=False
)
assert plot.xaxis.get_label().get_text() == f'{basis[0]} [cm]'
assert plot.yaxis.get_label().get_text() == f'{basis[1]} [cm]'
msg = "Must pass 'colors' dictionary if you are adding a legend via legend=True."
# This plot call should fail as legend is True but colors is None
with pytest.raises(ValueError, match=msg):
univ.plot(
color_by="cell",
legend=True,
pixels=100,
)
# Close plots to avoid warning
import matplotlib.pyplot as plt
plt.close('all')
def test_mg_plot(run_in_tmpdir):
# Create a simple universe with macroscopic data
h2o_data = openmc.Macroscopic('LWTR')
water = openmc.Material(name='Water')
water.set_density('macro', 1.0)
water.add_macroscopic(h2o_data)
sph = openmc.Sphere(r=10, boundary_type="vacuum")
cell = openmc.Cell(region=-sph, fill=water)
univ = openmc.Universe(cells=[cell])
# Create MGXS library and export to HDF5
groups = openmc.mgxs.EnergyGroups([1e-5, 20.0e6])
h2o_xsdata = openmc.XSdata('LWTR', groups)
h2o_xsdata.order = 0
h2o_xsdata.set_total([1.0])
h2o_xsdata.set_absorption([0.5])
scatter_matrix = np.array([[[0.5]]])
scatter_matrix = np.rollaxis(scatter_matrix, 0, 3)
h2o_xsdata.set_scatter_matrix(scatter_matrix)
mg_library = openmc.MGXSLibrary(groups)
mg_library.add_xsdatas([h2o_xsdata])
mgxs_path = Path.cwd() / 'mgxs.h5'
mg_library.export_to_hdf5(mgxs_path)
# Set MG cross sections in config and plot
with openmc.config.patch('mg_cross_sections', mgxs_path):
univ.plot(width=(200, 200), basis='yz', color_by='cell')
univ.plot(width=(200, 200), basis='yz', color_by='material')
with pytest.raises(RuntimeError):
univ.plot(width=(200, 200), basis='yz', color_by='cell')
# Close plots to avoid warning
import matplotlib.pyplot as plt
plt.close('all')
def test_get_nuclides(uo2):
c = openmc.Cell(fill=uo2)
univ = openmc.Universe(cells=[c])
nucs = univ.get_nuclides()
assert nucs == ['U235', 'O16']
def test_cells():
cells = [openmc.Cell() for i in range(5)]
cells2 = [openmc.Cell() for i in range(3)]
cells[0].fill = openmc.Universe(cells=cells2)
u = openmc.Universe(cells=cells)
assert not (set(u.cells.values()) ^ set(cells))
all_cells = set(u.get_all_cells().values())
assert not (all_cells ^ set(cells + cells2))
def test_get_all_materials(cell_with_lattice):
cells, mats, univ, lattice = cell_with_lattice
test_mats = set(univ.get_all_materials().values())
assert not (test_mats ^ set(mats))
def test_get_all_universes():
c1 = openmc.Cell()
u1 = openmc.Universe(cells=[c1])
c2 = openmc.Cell()
u2 = openmc.Universe(cells=[c2])
c3 = openmc.Cell(fill=u1)
c4 = openmc.Cell(fill=u2)
u3 = openmc.DAGMCUniverse(filename="")
c5 = openmc.Cell(fill=u3)
u4 = openmc.Universe(cells=[c3, c4, c5])
univs = set(u4.get_all_universes().values())
assert not (univs ^ {u1, u2, u3})
def test_clone():
c1 = openmc.Cell(cell_id=1)
c1.region = -openmc.ZCylinder(r=1.0)
c2 = openmc.Cell(cell_id=2)
c2.fill = openmc.Material()
c3 = openmc.Cell()
u1 = openmc.Universe(name='cool', cells=(c1, c2, c3))
u1.volume = 1.
u2 = u1.clone()
assert u2.name == u1.name
assert u2.cells != u1.cells
assert u2.get_all_materials() != u1.get_all_materials()
assert u2.volume == u1.volume
u2 = u1.clone(clone_materials=False)
assert u2.get_all_materials() == u1.get_all_materials()
u3 = u1.clone(clone_regions=False)
assert next(iter(u3.cells.values())).region ==\
next(iter(u1.cells.values())).region
# Change attributes, make sure clone stays intact
u1.volume = 2.
u1.name = "different name"
assert u3.volume != u1.volume
assert u3.name != u1.name
# Test cloning a DAGMC universe
dagmc_u = openmc.DAGMCUniverse(filename="", name="DAGMC universe")
dagmc_u.volume = 1.
dagmc_u.auto_geom_ids = True
dagmc_u.auto_mat_ids = True
dagmc_u1 = dagmc_u.clone()
assert dagmc_u1.name == dagmc_u.name
assert dagmc_u1.volume == dagmc_u.volume
assert dagmc_u1.auto_geom_ids == dagmc_u.auto_geom_ids
assert dagmc_u1.auto_mat_ids == dagmc_u.auto_mat_ids
# Change attributes, check the clone remained intact
dagmc_u.name = "another name"
dagmc_u.auto_geom_ids = False
dagmc_u.auto_mat_ids = False
dagmc_u.volume = 2.
assert dagmc_u1.name != dagmc_u.name
assert dagmc_u1.volume != dagmc_u.volume
assert dagmc_u1.auto_geom_ids != dagmc_u.auto_geom_ids
assert dagmc_u1.auto_mat_ids != dagmc_u.auto_mat_ids
def test_create_xml(cell_with_lattice):
cells = [openmc.Cell() for i in range(5)]
u = openmc.Universe(cells=cells)
geom = ET.Element('geom')
u.create_xml_subelement(geom)
cell_elems = geom.findall('cell')
assert len(cell_elems) == len(cells)
assert all(c.get('universe') == str(u.id) for c in cell_elems)
assert not (set(c.get('id') for c in cell_elems) ^
set(str(c.id) for c in cells))
def test_get_nuclide_densities():
surf = openmc.Sphere()
material = openmc.Material()
material.add_elements_from_formula("H2O")
material.set_density("g/cm3", 1)
cell = openmc.Cell(region=-surf, fill=material)
universe = openmc.Universe(cells=[cell])
with pytest.raises(RuntimeError):
universe.get_nuclide_densities()