OpenMC/tests/unit_tests/test_surface.py
2018-02-05 07:35:18 -06:00

259 lines
6.1 KiB
Python

import numpy as np
import openmc
import pytest
def assert_infinite_bb(s):
ll, ur = (-s).bounding_box
assert np.all(np.isinf(ll))
assert np.all(np.isinf(ur))
ll, ur = (+s).bounding_box
assert np.all(np.isinf(ll))
assert np.all(np.isinf(ur))
def test_plane():
s = openmc.Plane(A=1, B=2, C=-1, D=3, name='my plane')
assert s.a == 1
assert s.b == 2
assert s.c == -1
assert s.d == 3
assert s.boundary_type == 'transmission'
assert s.name == 'my plane'
assert s.type == 'plane'
# Generic planes don't have well-defined bounding boxes
assert_infinite_bb(s)
# evaluate method
x, y, z = (4, 3, 6)
assert s.evaluate((x, y, z)) == pytest.approx(s.a*x + s.b*y + s.c*z - s.d)
# Make sure repr works
repr(s)
def test_xplane():
s = openmc.XPlane(x0=3., boundary_type='reflective')
assert s.x0 == 3.
assert s.boundary_type == 'reflective'
# Check bounding box
ll, ur = (+s).bounding_box
assert ll == pytest.approx((3., -np.inf, -np.inf))
assert np.all(np.isinf(ur))
ll, ur = (-s).bounding_box
assert ur == pytest.approx((3., np.inf, np.inf))
assert np.all(np.isinf(ll))
# __contains__ on associated half-spaces
assert (5, 0, 0) in +s
assert (5, 0, 0) not in -s
assert (-2, 1, 10) in -s
assert (-2, 1, 10) not in +s
# evaluate method
assert s.evaluate((5., 0., 0.)) == pytest.approx(2.)
# Make sure repr works
repr(s)
def test_yplane():
s = openmc.YPlane(y0=3.)
assert s.y0 == 3.
# Check bounding box
ll, ur = (+s).bounding_box
assert ll == pytest.approx((-np.inf, 3., -np.inf))
assert np.all(np.isinf(ur))
ll, ur = s.bounding_box('-')
assert ur == pytest.approx((np.inf, 3., np.inf))
assert np.all(np.isinf(ll))
# __contains__ on associated half-spaces
assert (0, 5, 0) in +s
assert (0, 5, 0) not in -s
assert (-2, 1, 10) in -s
assert (-2, 1, 10) not in +s
# evaluate method
assert s.evaluate((0., 0., 0.)) == pytest.approx(-3.)
def test_zplane():
s = openmc.ZPlane(z0=3.)
assert s.z0 == 3.
# Check bounding box
ll, ur = (+s).bounding_box
assert ll == pytest.approx((-np.inf, -np.inf, 3.))
assert np.all(np.isinf(ur))
ll, ur = (-s).bounding_box
assert ur == pytest.approx((np.inf, np.inf, 3.))
assert np.all(np.isinf(ll))
# __contains__ on associated half-spaces
assert (0, 0, 5) in +s
assert (0, 0, 5) not in -s
assert (-2, 1, -10) in -s
assert (-2, 1, -10) not in +s
# evaluate method
assert s.evaluate((0., 0., 10.)) == pytest.approx(7.)
# Make sure repr works
repr(s)
def test_xcylinder():
y, z, r = 3, 5, 2
s = openmc.XCylinder(y0=y, z0=z, R=r)
assert s.y0 == y
assert s.z0 == z
assert s.r == r
# Check bounding box
ll, ur = (+s).bounding_box
assert np.all(np.isinf(ll))
assert np.all(np.isinf(ur))
ll, ur = (-s).bounding_box
assert ll == pytest.approx((-np.inf, y-r, z-r))
assert ur == pytest.approx((np.inf, y+r, z+r))
# evaluate method
assert s.evaluate((0, y, z)) == pytest.approx(-r**2)
# Make sure repr works
repr(s)
def test_periodic():
x = openmc.XPlane(boundary_type='periodic')
y = openmc.YPlane(boundary_type='periodic')
x.periodic_surface = y
assert y.periodic_surface == x
with pytest.raises(TypeError):
x.periodic_surface = openmc.Sphere()
def test_ycylinder():
x, z, r = 3, 5, 2
s = openmc.YCylinder(x0=x, z0=z, R=r)
assert s.x0 == x
assert s.z0 == z
assert s.r == r
# Check bounding box
ll, ur = (+s).bounding_box
assert np.all(np.isinf(ll))
assert np.all(np.isinf(ur))
ll, ur = (-s).bounding_box
assert ll == pytest.approx((x-r, -np.inf, z-r))
assert ur == pytest.approx((x+r, np.inf, z+r))
# evaluate method
assert s.evaluate((x, 0, z)) == pytest.approx(-r**2)
def test_zcylinder():
x, y, r = 3, 5, 2
s = openmc.ZCylinder(x0=x, y0=y, R=r)
assert s.x0 == x
assert s.y0 == y
assert s.r == r
# Check bounding box
ll, ur = (+s).bounding_box
assert np.all(np.isinf(ll))
assert np.all(np.isinf(ur))
ll, ur = (-s).bounding_box
assert ll == pytest.approx((x-r, y-r, -np.inf))
assert ur == pytest.approx((x+r, y+r, np.inf))
# evaluate method
assert s.evaluate((x, y, 0)) == pytest.approx(-r**2)
# Make sure repr works
repr(s)
def test_sphere():
x, y, z, r = -3, 5, 6, 2
s = openmc.Sphere(x0=x, y0=y, z0=z, R=r)
assert s.x0 == x
assert s.y0 == y
assert s.z0 == z
assert s.r == r
# Check bounding box
ll, ur = (+s).bounding_box
assert np.all(np.isinf(ll))
assert np.all(np.isinf(ur))
ll, ur = (-s).bounding_box
assert ll == pytest.approx((x-r, y-r, z-r))
assert ur == pytest.approx((x+r, y+r, z+r))
# evaluate method
assert s.evaluate((x, y, z)) == pytest.approx(-r**2)
# Make sure repr works
repr(s)
def cone_common(apex, r2, cls):
x, y, z = apex
s = cls(x0=x, y0=y, z0=z, R2=r2)
assert s.x0 == x
assert s.y0 == y
assert s.z0 == z
assert s.r2 == r2
# Check bounding box
assert_infinite_bb(s)
# evaluate method -- should be zero at apex
assert s.evaluate((x, y, z)) == pytest.approx(0.0)
# Make sure repr works
repr(s)
def test_xcone():
apex = (10, 0, 0)
r2 = 4
cone_common(apex, r2, openmc.XCone)
def test_ycone():
apex = (10, 0, 0)
r2 = 4
cone_common(apex, r2, openmc.YCone)
def test_zcone():
apex = (10, 0, 0)
r2 = 4
cone_common(apex, r2, openmc.ZCone)
def test_quadric():
# Make a sphere from a quadric
r = 10.0
coeffs = {'a': 1, 'b': 1, 'c': 1, 'k': -r**2}
s = openmc.Quadric(**coeffs)
assert s.a == coeffs['a']
assert s.b == coeffs['b']
assert s.c == coeffs['c']
assert s.k == coeffs['k']
# All other coeffs should be zero
for coeff in ('d', 'e', 'f', 'g', 'h', 'j'):
assert getattr(s, coeff) == 0.0
# Check bounding box
assert_infinite_bb(s)
# evaluate method
assert s.evaluate((0., 0., 0.)) == pytest.approx(coeffs['k'])
assert s.evaluate((1., 1., 1.)) == pytest.approx(3 + coeffs['k'])