mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-21 14:35:27 -04:00
159 lines
No EOL
5.4 KiB
Python
159 lines
No EOL
5.4 KiB
Python
from math import pi
|
|
|
|
import openmc
|
|
import openmc.lib
|
|
import openmc.stats
|
|
import numpy as np
|
|
import pytest
|
|
from pytest import approx
|
|
|
|
|
|
def test_source():
|
|
space = openmc.stats.Point()
|
|
energy = openmc.stats.Discrete([1.0e6], [1.0])
|
|
angle = openmc.stats.Isotropic()
|
|
|
|
src = openmc.IndependentSource(space=space, angle=angle, energy=energy)
|
|
assert src.space == space
|
|
assert src.angle == angle
|
|
assert src.energy == energy
|
|
|
|
elem = src.to_xml_element()
|
|
assert 'strength' in elem.attrib
|
|
assert elem.find('space') is not None
|
|
assert elem.find('angle') is not None
|
|
assert elem.find('energy') is not None
|
|
|
|
src = openmc.IndependentSource.from_xml_element(elem)
|
|
assert isinstance(src.angle, openmc.stats.Isotropic)
|
|
assert src.space.xyz == [0.0, 0.0, 0.0]
|
|
assert src.energy.x == [1.0e6]
|
|
assert src.energy.p == [1.0]
|
|
assert src.strength == 1.0
|
|
|
|
|
|
def test_spherical_uniform():
|
|
r_outer = 2.0
|
|
r_inner = 1.0
|
|
thetas = (0.0, pi/2)
|
|
phis = (0.0, pi)
|
|
origin = (0.0, 1.0, 2.0)
|
|
|
|
sph_indep_function = openmc.stats.spherical_uniform(r_outer,
|
|
r_inner,
|
|
thetas,
|
|
phis,
|
|
origin)
|
|
|
|
assert isinstance(sph_indep_function, openmc.stats.SphericalIndependent)
|
|
|
|
|
|
def test_source_file():
|
|
filename = 'source.h5'
|
|
src = openmc.FileSource(path=filename)
|
|
assert src.path == filename
|
|
|
|
elem = src.to_xml_element()
|
|
assert 'strength' in elem.attrib
|
|
assert 'file' in elem.attrib
|
|
|
|
|
|
def test_source_dlopen():
|
|
library = './libsource.so'
|
|
src = openmc.CompiledSource(library=library)
|
|
assert src.library == library
|
|
|
|
elem = src.to_xml_element()
|
|
assert 'library' in elem.attrib
|
|
|
|
|
|
def test_source_xml_roundtrip():
|
|
# Create a source and write to an XML element
|
|
space = openmc.stats.Box([-5., -5., -5.], [5., 5., 5.])
|
|
energy = openmc.stats.Discrete([1.0e6, 2.0e6, 5.0e6], [0.3, 0.5, 0.2])
|
|
angle = openmc.stats.PolarAzimuthal(
|
|
mu=openmc.stats.Uniform(0., 1.),
|
|
phi=openmc.stats.Uniform(0., 2*pi),
|
|
reference_uvw=(0., 1., 0.)
|
|
)
|
|
src = openmc.IndependentSource(
|
|
space=space, angle=angle, energy=energy,
|
|
particle='photon', strength=100.0
|
|
)
|
|
elem = src.to_xml_element()
|
|
|
|
# Read from XML element and make sure data is preserved
|
|
new_src = openmc.IndependentSource.from_xml_element(elem)
|
|
assert isinstance(new_src.space, openmc.stats.Box)
|
|
np.testing.assert_allclose(new_src.space.lower_left, src.space.lower_left)
|
|
np.testing.assert_allclose(new_src.space.upper_right, src.space.upper_right)
|
|
assert isinstance(new_src.energy, openmc.stats.Discrete)
|
|
np.testing.assert_allclose(new_src.energy.x, src.energy.x)
|
|
np.testing.assert_allclose(new_src.energy.p, src.energy.p)
|
|
assert isinstance(new_src.angle, openmc.stats.PolarAzimuthal)
|
|
assert new_src.angle.mu.a == src.angle.mu.a
|
|
assert new_src.angle.mu.b == src.angle.mu.b
|
|
assert new_src.angle.phi.a == src.angle.phi.a
|
|
assert new_src.angle.phi.b == src.angle.phi.b
|
|
np.testing.assert_allclose(new_src.angle.reference_uvw, src.angle.reference_uvw)
|
|
assert new_src.particle == src.particle
|
|
assert new_src.strength == approx(src.strength)
|
|
|
|
|
|
def test_rejection(run_in_tmpdir):
|
|
# Model with two spheres inside a box
|
|
mat = openmc.Material()
|
|
mat.add_nuclide('H1', 1.0)
|
|
sph1 = openmc.Sphere(x0=3, r=1.0)
|
|
sph2 = openmc.Sphere(x0=-3, r=1.0)
|
|
cube = openmc.model.RectangularParallelepiped(
|
|
-5., 5., -5., 5., -5., 5., boundary_type='reflective'
|
|
)
|
|
cell1 = openmc.Cell(fill=mat, region=-sph1)
|
|
cell2 = openmc.Cell(fill=mat, region=-sph2)
|
|
non_source_region = +sph1 & +sph2 & -cube
|
|
cell3 = openmc.Cell(region=non_source_region)
|
|
model = openmc.Model()
|
|
model.geometry = openmc.Geometry([cell1, cell2, cell3])
|
|
model.settings.particles = 100
|
|
model.settings.batches = 10
|
|
model.settings.run_mode = 'fixed source'
|
|
|
|
# Set up a box source with rejection on the spherical cell
|
|
space = openmc.stats.Box(*cell3.bounding_box)
|
|
model.settings.source = openmc.IndependentSource(space=space, domains=[cell1, cell2])
|
|
|
|
# Load up model via openmc.lib and sample source
|
|
model.export_to_xml()
|
|
openmc.lib.init()
|
|
particles = openmc.lib.sample_external_source(1000)
|
|
|
|
# Make sure that all sampled sources are within one of the spheres
|
|
joint_region = cell1.region | cell2.region
|
|
for p in particles:
|
|
assert p.r in joint_region
|
|
assert p.r not in non_source_region
|
|
|
|
openmc.lib.finalize()
|
|
|
|
|
|
def test_exceptions():
|
|
|
|
with pytest.raises(AttributeError, match=r'Please use the FileSource class'):
|
|
s = openmc.IndependentSource()
|
|
s.file = 'my_file'
|
|
|
|
with pytest.raises(AttributeError, match=r'Please use the CompiledSource class'):
|
|
s = openmc.IndependentSource()
|
|
s.library = 'my_library'
|
|
|
|
with pytest.raises(AttributeError, match=r'Please use the CompiledSource class'):
|
|
s = openmc.IndependentSource()
|
|
s.parameters = 'my_params'
|
|
|
|
with pytest.warns(FutureWarning, match=r'in favor of \'IndependentSource\''):
|
|
s = openmc.Source()
|
|
|
|
with pytest.raises(AttributeError, match=r'has no attribute \'frisbee\''):
|
|
s = openmc.IndependentSource()
|
|
s.frisbee |