mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-26 05:05:30 -04:00
Co-authored-by: Patrick Shriwise <pshriwise@gmail.com> Co-authored-by: Paul Romano <paul.k.romano@gmail.com>
107 lines
No EOL
3 KiB
Python
107 lines
No EOL
3 KiB
Python
from pathlib import Path
|
|
|
|
import openmc
|
|
import openmc.lib
|
|
|
|
import h5py
|
|
import numpy as np
|
|
import pytest
|
|
|
|
from tests.testing_harness import PyAPITestHarness, config
|
|
|
|
pytestmark = pytest.mark.skipif(
|
|
not openmc.lib._dagmc_enabled(),
|
|
reason="DAGMC CAD geometry is not enabled.")
|
|
|
|
@pytest.fixture
|
|
def model():
|
|
openmc.reset_auto_ids()
|
|
|
|
model = openmc.Model()
|
|
|
|
# settings
|
|
model.settings.batches = 5
|
|
model.settings.inactive = 0
|
|
model.settings.particles = 100
|
|
|
|
source_box = openmc.stats.Box([-4, -4, -4],
|
|
[ 4, 4, 4])
|
|
source = openmc.IndependentSource(space=source_box)
|
|
|
|
model.settings.source = source
|
|
|
|
# geometry
|
|
dag_univ = openmc.DAGMCUniverse(Path("dagmc.h5m"))
|
|
model.geometry = openmc.Geometry(dag_univ)
|
|
|
|
# tally
|
|
tally = openmc.Tally()
|
|
tally.scores = ['total']
|
|
tally.filters = [openmc.CellFilter(1)]
|
|
model.tallies = [tally]
|
|
|
|
# materials
|
|
u235 = openmc.Material(name="no-void fuel")
|
|
u235.add_nuclide('U235', 1.0, 'ao')
|
|
u235.set_density('g/cc', 11)
|
|
u235.id = 40
|
|
|
|
water = openmc.Material(name="water")
|
|
water.add_nuclide('H1', 2.0, 'ao')
|
|
water.add_nuclide('O16', 1.0, 'ao')
|
|
water.set_density('g/cc', 1.0)
|
|
water.add_s_alpha_beta('c_H_in_H2O')
|
|
water.id = 41
|
|
|
|
mats = openmc.Materials([u235, water])
|
|
model.materials = mats
|
|
|
|
return model
|
|
|
|
|
|
def test_missing_material_id(model):
|
|
# remove the last material, which is identified by ID in the DAGMC file
|
|
model.materials = model.materials[:-1]
|
|
with pytest.raises(RuntimeError) as exec_info:
|
|
model.run()
|
|
exp_error_msg = "Material with name/ID '41' not found for volume (cell) 3"
|
|
assert exp_error_msg in str(exec_info.value)
|
|
|
|
|
|
def test_missing_material_name(model):
|
|
# remove the first material, which is identified by name in the DAGMC file
|
|
model.materials = model.materials[1:]
|
|
with pytest.raises(RuntimeError) as exec_info:
|
|
model.run()
|
|
exp_error_msg = "Material with name/ID 'no-void fuel' not found for volume (cell) 1"
|
|
assert exp_error_msg in str(exec_info.value)
|
|
|
|
|
|
def test_surf_source(model):
|
|
# create a surface source read on this model to ensure
|
|
# particles are being generated correctly
|
|
n = 100
|
|
model.settings.surf_source_write = {'surface_ids': [1], 'max_particles': n}
|
|
|
|
# If running in MPI mode, setup proper keyword arguments for run()
|
|
kwargs = {'openmc_exec': config['exe']}
|
|
if config['mpi']:
|
|
kwargs['mpi_args'] = [config['mpiexec'], '-n', config['mpi_np']]
|
|
model.run(**kwargs)
|
|
|
|
with h5py.File('surface_source.h5') as fh:
|
|
assert fh.attrs['filetype'] == b'source'
|
|
arr = fh['source_bank'][...]
|
|
expected_size = n * int(config['mpi_np']) if config['mpi'] else n
|
|
assert arr.size == expected_size
|
|
|
|
# check that all particles are on surface 1 (radius = 7)
|
|
xs = arr[:]['r']['x']
|
|
ys = arr[:]['r']['y']
|
|
rad = np.sqrt(xs**2 + ys**2)
|
|
assert np.allclose(rad, 7.0)
|
|
|
|
|
|
def test_dagmc(model):
|
|
harness = PyAPITestHarness('statepoint.5.h5', model)
|
|
harness.main() |