mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-25 04:25:29 -04:00
86 lines
2.8 KiB
Python
86 lines
2.8 KiB
Python
import numpy as np
|
|
from pathlib import Path
|
|
|
|
import openmc
|
|
import openmc.lib
|
|
|
|
import pytest
|
|
|
|
pytestmark = pytest.mark.skipif(
|
|
not openmc.lib._dagmc_enabled(),
|
|
reason="DAGMC CAD geometry is not enabled.")
|
|
|
|
|
|
@pytest.fixture
|
|
def broken_dagmc_model(request):
|
|
openmc.reset_auto_ids()
|
|
model = openmc.Model()
|
|
|
|
### MATERIALS ###
|
|
fuel = openmc.Material(name='no-void fuel')
|
|
fuel.set_density('g/cc', 10.29769)
|
|
fuel.add_nuclide('U233', 1.0)
|
|
|
|
cladding = openmc.Material(name='clad')
|
|
cladding.set_density('g/cc', 6.55)
|
|
cladding.add_nuclide('Zr90', 1.0)
|
|
|
|
h1 = openmc.Material(name='water')
|
|
h1.set_density('g/cc', 0.75)
|
|
h1.add_nuclide('H1', 1.0)
|
|
|
|
model.materials = openmc.Materials([fuel, cladding, h1])
|
|
|
|
### GEOMETRY ###
|
|
# create the DAGMC universe using a model that has many triangles
|
|
# removed
|
|
dagmc_file = Path(request.fspath).parent / "broken_model.h5m"
|
|
pincell_univ = openmc.DAGMCUniverse(filename=dagmc_file, auto_geom_ids=True)
|
|
|
|
# create a 2 x 2 lattice using the DAGMC pincell
|
|
pitch = np.asarray((24.0, 24.0))
|
|
lattice = openmc.RectLattice()
|
|
lattice.pitch = pitch
|
|
lattice.universes = [[pincell_univ] * 2] * 2
|
|
lattice.lower_left = -pitch
|
|
|
|
# clip the DAGMC geometry at +/- 10 cm w/ CSG planes
|
|
rpp = openmc.model.RectangularParallelepiped(
|
|
-pitch[0], pitch[0], -pitch[1], pitch[1], -10.0, 10.0, boundary_type='reflective')
|
|
bounding_cell = openmc.Cell(fill=lattice, region=-rpp)
|
|
|
|
model.geometry = openmc.Geometry(root=[bounding_cell])
|
|
|
|
# settings
|
|
model.settings.particles = 100
|
|
model.settings.batches = 10
|
|
model.settings.inactive = 2
|
|
model.settings.output = {'summary': False}
|
|
|
|
# Limit max particle events to prevent particles from getting stuck in the
|
|
# implicit complement of the non-root DAGMC universe.
|
|
model.settings.max_particle_events = 100
|
|
|
|
model.export_to_xml()
|
|
|
|
return model
|
|
|
|
|
|
@pytest.mark.skip(reason="Test causes CI to hang intermittently")
|
|
def test_lost_particles(run_in_tmpdir, broken_dagmc_model):
|
|
broken_dagmc_model.export_to_xml()
|
|
# ensure that particles will be lost when cell intersections can't be found
|
|
# due to the removed triangles in this model
|
|
with pytest.raises(RuntimeError, match='Maximum number of lost particles has been reached.'):
|
|
openmc.run()
|
|
|
|
# run this again, but with the dagmc universe as the root unvierse
|
|
# to ensure that lost particles are still caught in this case
|
|
for univ in broken_dagmc_model.geometry.get_all_universes().values():
|
|
if isinstance(univ, openmc.DAGMCUniverse):
|
|
broken_dagmc_model.geometry.root_universe = univ
|
|
break
|
|
|
|
broken_dagmc_model.export_to_xml()
|
|
with pytest.raises(RuntimeError, match='Maximum number of lost particles has been reached.'):
|
|
openmc.run()
|