Merge branch 'openmc-dev:develop' into tracks_to_vtk_on_object

This commit is contained in:
Jonathan Shimwell 2022-08-15 08:36:48 +01:00 committed by GitHub
commit 239fc8d9c5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 111 additions and 47 deletions

View file

@ -2,7 +2,7 @@ from abc import ABC, abstractmethod
from collections import OrderedDict
from collections.abc import Iterable
from copy import deepcopy
from numbers import Real
from numbers import Integral, Real
from pathlib import Path
from tempfile import TemporaryDirectory
from xml.etree import ElementTree as ET
@ -678,7 +678,7 @@ class DAGMCUniverse(UniverseBase):
@filename.setter
def filename(self, val):
cv.check_type('DAGMC filename', val, str)
cv.check_type('DAGMC filename', val, (Path, str))
self._filename = val
@property
@ -720,10 +720,10 @@ class DAGMCUniverse(UniverseBase):
dagmc_element.set('auto_geom_ids', 'true')
if self.auto_mat_ids:
dagmc_element.set('auto_mat_ids', 'true')
dagmc_element.set('filename', self.filename)
dagmc_element.set('filename', str(self.filename))
xml_element.append(dagmc_element)
def bounding_region(self, bounded_type='box', boundary_type='vacuum'):
def bounding_region(self, bounded_type='box', boundary_type='vacuum', starting_id=10000):
"""Creates a either a spherical or box shaped bounding region around
the DAGMC geometry.
Parameters
@ -736,6 +736,10 @@ class DAGMCUniverse(UniverseBase):
Boundary condition that defines the behavior for particles hitting
the surface. Defaults to vacuum boundary condition. Passed into the
surface construction.
starting_id : int
Starting ID of the surface(s) used in the region. For bounded_type
'box', the next 5 IDs will also be used. Defaults to 10000 to reduce
the chance of an overlap of surface IDs with the DAGMC geometry.
Returns
-------
openmc.Region
@ -744,19 +748,20 @@ class DAGMCUniverse(UniverseBase):
check_type('boundary type', boundary_type, str)
check_value('boundary type', boundary_type, _BOUNDARY_TYPES)
check_type('starting surface id', starting_id, Integral)
check_type('bounded type', bounded_type, str)
check_value('bounded type', bounded_type, ('box', 'sphere'))
bounding_box = self.bounding_box
bbox = self.bounding_box
if bounded_type == 'sphere':
import math
bounding_box_center = (bounding_box[0] + bounding_box[1])/2
radius = math.dist(bounding_box[0], bounding_box[1])
bbox_center = (bbox[0] + bbox[1])/2
radius = np.linalg.norm(np.asarray(bbox))
bounding_surface = openmc.Sphere(
x0=bounding_box_center[0],
y0=bounding_box_center[1],
z0=bounding_box_center[2],
surface_id=starting_id,
x0=bbox_center[0],
y0=bbox_center[1],
z0=bbox_center[2],
boundary_type=boundary_type,
r=radius,
)
@ -765,14 +770,19 @@ class DAGMCUniverse(UniverseBase):
if bounded_type == 'box':
# defines plane surfaces for all six faces of the bounding box
lower_x = openmc.XPlane(bounding_box[0][0], boundary_type=boundary_type)
upper_x = openmc.XPlane(bounding_box[1][0], boundary_type=boundary_type)
lower_y = openmc.YPlane(bounding_box[0][1], boundary_type=boundary_type)
upper_y = openmc.YPlane(bounding_box[1][1], boundary_type=boundary_type)
lower_z = openmc.ZPlane(bounding_box[0][2], boundary_type=boundary_type)
upper_z = openmc.ZPlane(bounding_box[1][2], boundary_type=boundary_type)
lower_x = openmc.XPlane(bbox[0][0], surface_id=starting_id)
upper_x = openmc.XPlane(bbox[1][0], surface_id=starting_id+1)
lower_y = openmc.YPlane(bbox[0][1], surface_id=starting_id+2)
upper_y = openmc.YPlane(bbox[1][1], surface_id=starting_id+3)
lower_z = openmc.ZPlane(bbox[0][2], surface_id=starting_id+4)
upper_z = openmc.ZPlane(bbox[1][2], surface_id=starting_id+5)
return +lower_x & -upper_x & +lower_y & -upper_y & +lower_z & -upper_z
region = +lower_x & -upper_x & +lower_y & -upper_y & +lower_z & -upper_z
for surface in region.get_surfaces().values():
surface.boundary_type = boundary_type
return region
def bounded_universe(self, bounding_cell_id=10000, **kwargs):
"""Returns an openmc.Universe filled with this DAGMCUniverse and bounded
@ -783,7 +793,7 @@ class DAGMCUniverse(UniverseBase):
Parameters
----------
bounding_cell_id : int
The cell ID number to use for the bounding cell, defaults to 1000 to reduce
The cell ID number to use for the bounding cell, defaults to 10000 to reduce
the chance of overlapping ID numbers with the DAGMC geometry.
Returns
@ -791,7 +801,6 @@ class DAGMCUniverse(UniverseBase):
openmc.Universe
Universe instance
"""
bounding_cell = openmc.Cell(fill=self, cell_id=bounding_cell_id, region=self.bounding_region(**kwargs))
return openmc.Universe(cells=[bounding_cell])

View file

@ -1,6 +1,7 @@
import openmc
import openmc.lib
from pathlib import Path
import pytest
from tests.testing_harness import PyAPITestHarness
@ -27,7 +28,7 @@ def model():
model.settings.dagmc = True
# geometry
dag_univ = openmc.DAGMCUniverse("dagmc.h5m")
dag_univ = openmc.DAGMCUniverse(Path("dagmc.h5m"))
model.geometry = openmc.Geometry(dag_univ)
# tally

View file

@ -1,6 +1,6 @@
<?xml version='1.0' encoding='utf-8'?>
<geometry>
<cell fill="12" id="13" region="22 -23 24 -25 26 -27" universe="13" />
<cell fill="12" id="13" region="9 -10 11 -12 13 -14" universe="13" />
<dagmc_universe auto_geom_ids="true" filename="dagmc.h5m" id="9" />
<lattice id="12">
<pitch>24.0 24.0</pitch>
@ -10,12 +10,12 @@
9 9
9 9 </universes>
</lattice>
<surface boundary="reflective" coeffs="-24.0" id="22" name="left" type="x-plane" />
<surface boundary="reflective" coeffs="24.0" id="23" name="right" type="x-plane" />
<surface boundary="reflective" coeffs="-24.0" id="24" name="front" type="y-plane" />
<surface boundary="reflective" coeffs="24.0" id="25" name="back" type="y-plane" />
<surface boundary="reflective" coeffs="-10.0" id="26" name="bottom" type="z-plane" />
<surface boundary="reflective" coeffs="10.0" id="27" name="top" type="z-plane" />
<surface boundary="reflective" coeffs="-24.0" id="9" name="left" type="x-plane" />
<surface boundary="reflective" coeffs="24.0" id="10" name="right" type="x-plane" />
<surface boundary="reflective" coeffs="-24.0" id="11" name="front" type="y-plane" />
<surface boundary="reflective" coeffs="24.0" id="12" name="back" type="y-plane" />
<surface boundary="reflective" coeffs="-10.0" id="13" name="bottom" type="z-plane" />
<surface boundary="reflective" coeffs="10.0" id="14" name="top" type="z-plane" />
</geometry>
<?xml version='1.0' encoding='utf-8'?>
<materials>

View file

@ -53,25 +53,6 @@ class DAGMCUniverseTest(PyAPITestHarness):
# assigns the bound_dag_geometry to the model to test the type checks in model.Geometry setter
model.Geometry = bound_pincell_geometry
# checks that the bounding box is calculated correctly
bounding_box = pincell_univ.bounding_box
assert bounding_box[0].tolist() == [-25., -25., -25.]
assert bounding_box[1].tolist() == [25., 25., 25.]
# checks that the bounding region is six surfaces each with a vacuum boundary type
b_region = pincell_univ.bounding_region(bounded_type='box', boundary_type='vacuum')
assert isinstance(b_region, openmc.Region)
assert len(b_region.get_surfaces()) == 6
for surface in list(b_region.get_surfaces().values()):
assert surface.boundary_type == 'vacuum'
# checks that the bounding region is a single surface with a reflective boundary type
b_region = pincell_univ.bounding_region(bounded_type='sphere', boundary_type='reflective')
assert isinstance(b_region, openmc.Region)
assert len(b_region.get_surfaces()) == 1
for surface in list(b_region.get_surfaces().values()):
assert surface.boundary_type == 'reflective'
# create a 2 x 2 lattice using the DAGMC pincell
pitch = np.asarray((24.0, 24.0))
lattice = openmc.RectLattice()

View file

@ -0,0 +1,73 @@
import openmc
import pytest
from pathlib import Path
def test_bounding_box(request):
"""Checks that the DAGMCUniverse.bounding_box returns the correct values"""
u = openmc.DAGMCUniverse(Path(request.fspath).parent / "dagmc.h5m")
ll, ur = u.bounding_box
assert ll == pytest.approx((-25.0, -25.0, -25))
assert ur == pytest.approx((25.0, 25.0, 25))
def test_bounding_region(request):
"""Checks that the DAGMCUniverse.bounding_region() returns a region with
correct surfaces and boundary types"""
u = openmc.DAGMCUniverse(Path(request.fspath).parent / "dagmc.h5m")
region = u.bounding_region() # should default to bounded_type='box'
assert isinstance(region, openmc.Region)
assert len(region) == 6
assert region[0].surface.type == "x-plane"
assert region[1].surface.type == "x-plane"
assert region[2].surface.type == "y-plane"
assert region[3].surface.type == "y-plane"
assert region[4].surface.type == "z-plane"
assert region[5].surface.type == "z-plane"
assert region[0].surface.boundary_type == "vacuum"
assert region[1].surface.boundary_type == "vacuum"
assert region[2].surface.boundary_type == "vacuum"
assert region[3].surface.boundary_type == "vacuum"
assert region[4].surface.boundary_type == "vacuum"
assert region[5].surface.boundary_type == "vacuum"
region = u.bounding_region(bounded_type="sphere", boundary_type="reflective")
assert isinstance(region, openmc.Region)
assert isinstance(region, openmc.Halfspace)
assert region.surface.type == "sphere"
assert region.surface.boundary_type == "reflective"
def test_bounded_universe(request):
"""Checks that the DAGMCUniverse.bounded_universe() returns a
openmc.Universe with correct surface ids and cell ids"""
u = openmc.DAGMCUniverse(Path(request.fspath).parent / "dagmc.h5m")
# bounded with defaults
bu = u.bounded_universe()
cells = list(bu.get_all_cells().items())
assert isinstance(bu, openmc.Universe)
assert len(cells) == 1
assert cells[0][0] == 10000 # default bounding_cell_id is 10000
assert cells[0][1].id == 10000 # default bounding_cell_id is 10000
surfaces = list(cells[0][1].region.get_surfaces().items())
assert len(surfaces) == 6
assert surfaces[0][1].id == 10000
# bounded with non defaults
bu = u.bounded_universe(bounding_cell_id=42, bounded_type="sphere", starting_id=43)
cells = list(bu.get_all_cells().items())
assert isinstance(bu, openmc.Universe)
assert len(cells) == 1
assert cells[0][0] == 42 # default bounding_cell_id is 10000
assert cells[0][1].id == 42 # default bounding_cell_id is 10000
surfaces = list(cells[0][1].region.get_surfaces().items())
assert surfaces[0][1].type == "sphere"
assert surfaces[0][1].id == 43