mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-23 19:45:34 -04:00
179 lines
4.5 KiB
Python
179 lines
4.5 KiB
Python
from math import pi
|
|
|
|
import numpy as np
|
|
import pytest
|
|
import openmc
|
|
import openmc.stats
|
|
|
|
|
|
def test_discrete():
|
|
x = [0.0, 1.0, 10.0]
|
|
p = [0.3, 0.2, 0.5]
|
|
d = openmc.stats.Discrete(x, p)
|
|
assert d.x == x
|
|
assert d.p == p
|
|
assert len(d) == len(x)
|
|
d.to_xml_element('distribution')
|
|
|
|
# Single point
|
|
d2 = openmc.stats.Discrete(1e6, 1.0)
|
|
assert d2.x == [1e6]
|
|
assert d2.p == [1.0]
|
|
assert len(d2) == 1
|
|
|
|
|
|
def test_uniform():
|
|
a, b = 10.0, 20.0
|
|
d = openmc.stats.Uniform(a, b)
|
|
assert d.a == a
|
|
assert d.b == b
|
|
assert len(d) == 2
|
|
|
|
t = d.to_tabular()
|
|
assert t.x == [a, b]
|
|
assert t.p == [1/(b-a), 1/(b-a)]
|
|
assert t.interpolation == 'histogram'
|
|
|
|
d.to_xml_element('distribution')
|
|
|
|
|
|
def test_maxwell():
|
|
theta = 1.2895e6
|
|
d = openmc.stats.Maxwell(theta)
|
|
assert d.theta == theta
|
|
assert len(d) == 1
|
|
d.to_xml_element('distribution')
|
|
|
|
|
|
def test_watt():
|
|
a, b = 0.965e6, 2.29e-6
|
|
d = openmc.stats.Watt(a, b)
|
|
assert d.a == a
|
|
assert d.b == b
|
|
assert len(d) == 2
|
|
d.to_xml_element('distribution')
|
|
|
|
|
|
def test_tabular():
|
|
x = [0.0, 5.0, 7.0]
|
|
p = [0.1, 0.2, 0.05]
|
|
d = openmc.stats.Tabular(x, p, 'linear-linear')
|
|
assert d.x == x
|
|
assert d.p == p
|
|
assert d.interpolation == 'linear-linear'
|
|
assert len(d) == len(x)
|
|
d.to_xml_element('distribution')
|
|
|
|
|
|
def test_legendre():
|
|
# Pu239 elastic scattering at 100 keV
|
|
coeffs = [1.000e+0, 1.536e-1, 1.772e-2, 5.945e-4, 3.497e-5, 1.881e-5]
|
|
d = openmc.stats.Legendre(coeffs)
|
|
assert d.coefficients == pytest.approx(coeffs)
|
|
assert len(d) == len(coeffs)
|
|
|
|
# Integrating distribution should yield one
|
|
mu = np.linspace(-1., 1., 1000)
|
|
assert np.trapz(d(mu), mu) == pytest.approx(1.0, rel=1e-4)
|
|
|
|
with pytest.raises(NotImplementedError):
|
|
d.to_xml_element('distribution')
|
|
|
|
|
|
def test_mixture():
|
|
d1 = openmc.stats.Uniform(0, 5)
|
|
d2 = openmc.stats.Uniform(3, 7)
|
|
p = [0.5, 0.5]
|
|
mix = openmc.stats.Mixture(p, [d1, d2])
|
|
assert mix.probability == p
|
|
assert mix.distribution == [d1, d2]
|
|
assert len(mix) == 4
|
|
|
|
with pytest.raises(NotImplementedError):
|
|
mix.to_xml_element('distribution')
|
|
|
|
|
|
def test_polar_azimuthal():
|
|
# default polar-azimuthal should be uniform in mu and phi
|
|
d = openmc.stats.PolarAzimuthal()
|
|
assert isinstance(d.mu, openmc.stats.Uniform)
|
|
assert d.mu.a == -1.
|
|
assert d.mu.b == 1.
|
|
assert isinstance(d.phi, openmc.stats.Uniform)
|
|
assert d.phi.a == 0.
|
|
assert d.phi.b == 2*pi
|
|
|
|
mu = openmc.stats.Discrete(1., 1.)
|
|
phi = openmc.stats.Discrete(0., 1.)
|
|
d = openmc.stats.PolarAzimuthal(mu, phi)
|
|
assert d.mu == mu
|
|
assert d.phi == phi
|
|
|
|
elem = d.to_xml_element()
|
|
assert elem.tag == 'angle'
|
|
assert elem.attrib['type'] == 'mu-phi'
|
|
assert elem.find('mu') is not None
|
|
assert elem.find('phi') is not None
|
|
|
|
|
|
def test_isotropic():
|
|
d = openmc.stats.Isotropic()
|
|
elem = d.to_xml_element()
|
|
assert elem.tag == 'angle'
|
|
assert elem.attrib['type'] == 'isotropic'
|
|
|
|
|
|
def test_monodirectional():
|
|
d = openmc.stats.Monodirectional((1., 0., 0.))
|
|
assert d.reference_uvw == pytest.approx((1., 0., 0.))
|
|
|
|
elem = d.to_xml_element()
|
|
assert elem.tag == 'angle'
|
|
assert elem.attrib['type'] == 'monodirectional'
|
|
|
|
|
|
def test_cartesian():
|
|
x = openmc.stats.Uniform(-10., 10.)
|
|
y = openmc.stats.Uniform(-10., 10.)
|
|
z = openmc.stats.Uniform(0., 20.)
|
|
d = openmc.stats.CartesianIndependent(x, y, z)
|
|
assert d.x == x
|
|
assert d.y == y
|
|
assert d.z == z
|
|
|
|
elem = d.to_xml_element()
|
|
assert elem.tag == 'space'
|
|
assert elem.attrib['type'] == 'cartesian'
|
|
assert elem.find('x') is not None
|
|
assert elem.find('y') is not None
|
|
|
|
|
|
def test_box():
|
|
lower_left = (-10., -10., -10.)
|
|
upper_right = (10., 10., 10.)
|
|
d = openmc.stats.Box(lower_left, upper_right)
|
|
assert d.lower_left == pytest.approx(lower_left)
|
|
assert d.upper_right == pytest.approx(upper_right)
|
|
assert not d.only_fissionable
|
|
|
|
elem = d.to_xml_element()
|
|
assert elem.tag == 'space'
|
|
assert elem.attrib['type'] == 'box'
|
|
assert elem.find('parameters') is not None
|
|
|
|
# only fissionable parameter
|
|
d2 = openmc.stats.Box(lower_left, upper_right, True)
|
|
assert d2.only_fissionable
|
|
elem = d2.to_xml_element()
|
|
assert elem.attrib['type'] == 'fission'
|
|
|
|
|
|
def test_point():
|
|
p = (-4., 2., 10.)
|
|
d = openmc.stats.Point(p)
|
|
assert d.xyz == pytest.approx(p)
|
|
|
|
elem = d.to_xml_element()
|
|
assert elem.tag == 'space'
|
|
assert elem.attrib['type'] == 'point'
|
|
assert elem.find('parameters') is not None
|