added bbox class method to regular mesh

This commit is contained in:
Jonathan Shimwell 2022-09-09 14:47:11 +01:00
parent aea5628819
commit 1cfbd67659
2 changed files with 107 additions and 0 deletions

View file

@ -279,6 +279,7 @@ class StructuredMesh(MeshBase):
return vtk_grid
class RegularMesh(StructuredMesh):
"""A regular Cartesian mesh in one, two, or three dimensions
@ -509,6 +510,49 @@ class RegularMesh(StructuredMesh):
return mesh
@classmethod
def from_bounding_box(
cls,
bounding_box,
dimension=[100, 100, 100],
mesh_id=None,
name=''
):
"""Create mesh from an existing openmc cell, region, universe or
geometry by making use of the objects bounding box property.
Parameters
----------
bounding_box : {openmc.Cell, openmc.Region, openmc.Universe, openmc.Geometry}
The object passed in will be used as a template for this mesh. The
bounding_box of the property of the object passed will be used to
set the lower_left and upper_right of the mesh instance
dimension : Iterable of int
The number of mesh cells in each direction.
mesh_id : int
Unique identifier for the mesh
name : str
Name of the mesh
Returns
-------
openmc.RegularMesh
RegularMesh instance
"""
cv.check_type(
"bounding_box",
bounding_box,
(openmc.Cell, openmc.Region, openmc.Universe, openmc.Geometry),
)
mesh = cls(mesh_id, name)
mesh.lower_left = bounding_box.bounding_box[0]
mesh.upper_right = bounding_box.bounding_box[1]
mesh.dimension = dimension
return mesh
def to_xml_element(self):
"""Return XML representation of the mesh

View file

@ -0,0 +1,63 @@
import numpy as np
import openmc
import pytest
def test_mesh_from_cell():
"""Tests a RegularMesh can be made from a Cell and the specified dimensions
are propagated through. Cell is not centralized"""
surface = openmc.Sphere(r=10, x0=2, y0=3, z0=5)
cell = openmc.Cell(region=-surface)
mesh = openmc.RegularMesh.from_bounding_box(cell, dimension=[7, 11, 13])
assert isinstance(mesh, openmc.RegularMesh)
assert np.array_equal(mesh.dimension, (7, 11, 13))
assert np.array_equal(mesh.lower_left, cell.bounding_box[0])
assert np.array_equal(mesh.upper_right, cell.bounding_box[1])
def test_mesh_from_region():
"""Tests a RegularMesh can be made from a Region and the default dimensions
are propagated through. Region is not centralized"""
surface = openmc.Sphere(r=1, x0=-5, y0=-3, z0=-2)
region = -surface
mesh = openmc.RegularMesh.from_bounding_box(region)
assert isinstance(mesh, openmc.RegularMesh)
assert np.array_equal(mesh.dimension, (100, 100, 100)) # default values
assert np.array_equal(mesh.lower_left, region.bounding_box[0])
assert np.array_equal(mesh.upper_right, region.bounding_box[1])
def test_mesh_from_universe():
"""Tests a RegularMesh can be made from a Universe and the default dimensions
are propagated through. Universe is centralized"""
surface = openmc.Sphere(r=42)
cell = openmc.Cell(region=-surface)
universe = openmc.Universe(cells=[cell])
mesh = openmc.RegularMesh.from_bounding_box(universe)
assert isinstance(mesh, openmc.RegularMesh)
assert np.array_equal(mesh.dimension, (100, 100, 100)) # default values
assert np.array_equal(mesh.lower_left, universe.bounding_box[0])
assert np.array_equal(mesh.upper_right, universe.bounding_box[1])
def test_mesh_from_geometry():
"""Tests a RegularMesh can be made from a Geometry and the default dimensions
are propagated through. Geometry is centralized"""
surface = openmc.Sphere(r=42)
cell = openmc.Cell(region=-surface)
universe = openmc.Universe(cells=[cell])
geometry = openmc.Geometry(universe)
mesh = openmc.RegularMesh.from_bounding_box(geometry)
assert isinstance(mesh, openmc.RegularMesh)
assert np.array_equal(mesh.dimension, (100, 100, 100)) # default values
assert np.array_equal(mesh.lower_left, geometry.bounding_box[0])
assert np.array_equal(mesh.upper_right, geometry.bounding_box[1])
def test_error_from_unsupported_object():
with pytest.raises(TypeError):
openmc.RegularMesh.from_bounding_box("vacuum energy")