Merge pull request #2217 from shimwell/adding_from_bounding_box_to_RegularMesh

added bbox class method to regular mesh
This commit is contained in:
Paul Romano 2022-09-15 06:50:20 -05:00 committed by GitHub
commit 6834e29092
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
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_domain(
cls,
domain,
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
----------
domain : {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(
"domain",
domain,
(openmc.Cell, openmc.Region, openmc.Universe, openmc.Geometry),
)
mesh = cls(mesh_id, name)
mesh.lower_left = domain.bounding_box[0]
mesh.upper_right = domain.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_reg_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_domain(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_reg_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_domain(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_reg_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_domain(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_reg_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_domain(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_domain("vacuum energy")