diff --git a/openmc/mesh.py b/openmc/mesh.py index 8ac4b15946..a4c50a6084 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -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 diff --git a/tests/unit_tests/test_mesh_from_domain.py b/tests/unit_tests/test_mesh_from_domain.py new file mode 100644 index 0000000000..ce27288adf --- /dev/null +++ b/tests/unit_tests/test_mesh_from_domain.py @@ -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")