From 5783d57a3e0bdb1873ddd334c81c37f182c840d4 Mon Sep 17 00:00:00 2001 From: shimwell Date: Mon, 2 Feb 2026 12:08:10 +0100 Subject: [PATCH 1/3] adding 2nd um reader --- src/openmc2dolfinx/__init__.py | 4 +- src/openmc2dolfinx/core.py | 82 +++++++++++++++++++++++++++++++++- test/test_unstructured_mesh.py | 36 ++++++++++++++- 3 files changed, 118 insertions(+), 4 deletions(-) diff --git a/src/openmc2dolfinx/__init__.py b/src/openmc2dolfinx/__init__.py index afaa677..263b458 100644 --- a/src/openmc2dolfinx/__init__.py +++ b/src/openmc2dolfinx/__init__.py @@ -6,6 +6,6 @@ __version__ = "unknown" -from .core import StructuredGridReader, UnstructuredMeshReader +from .core import StructuredGridReader, UnstructuredMeshReader, VTKHDFUnstructuredMeshReader -__all__ = ["StructuredGridReader, UnstructuredMeshReader"] +__all__ = ["StructuredGridReader", "UnstructuredMeshReader", "VTKHDFUnstructuredMeshReader"] diff --git a/src/openmc2dolfinx/core.py b/src/openmc2dolfinx/core.py index dbc8373..c6e336a 100644 --- a/src/openmc2dolfinx/core.py +++ b/src/openmc2dolfinx/core.py @@ -8,7 +8,7 @@ import ufl from dolfinx.mesh import create_mesh -__all__ = ["StructuredGridReader", "UnstructuredMeshReader"] +__all__ = ["StructuredGridReader", "UnstructuredMeshReader", "VTKHDFUnstructuredMeshReader"] class OpenMC2dolfinx(pyvista.VTKDataSetReader): @@ -147,3 +147,83 @@ def cell_connectivity(self): if self._cell_connectivity is None: self.get_connectivity() return self._cell_connectivity + + +class VTKHDFUnstructuredMeshReader: + """ + VTKHDF Unstructured Mesh Reader + + Reads an OpenMC .vtkhdf results file with unstructured meshes and converts + the data into a dolfinx.fem.Function + + Args: + path: the path to the OpenMC .vtkhdf file + + Attributes: + data: the mesh and results from the OpenMC .vtkhdf file + dolfinx_mesh: the dolfinx mesh + + Example: + .. code-block:: python + reader = VTKHDFUnstructuredMeshReader("path/to/file.vtkhdf") + dolfinx_function = reader.create_dolfinx_function() + """ + + cell_type = "tetrahedron" + + def __init__(self, path: str): + self.path = path + self.data: pyvista.core.pointset.UnstructuredGrid | None = None + self.dolfinx_mesh: dolfinx.mesh.Mesh | None = None + + def read(self) -> pyvista.core.pointset.UnstructuredGrid: + """Reads the VTKHDF file using pyvista.""" + self.data = pyvista.read(self.path) + return self.data + + @property + def cell_connectivity(self) -> np.ndarray: + """Returns the cell connectivity for tetrahedra (VTK cell type 10).""" + if self.data is None: + self.read() + return self.data.cells_dict[10] + + def create_dolfinx_mesh(self): + """Creates the dolfinx mesh from the VTKHDF data.""" + if self.data is None: + self.read() + + degree = 1 + cell = ufl.Cell(self.cell_type) + mesh_element = basix.ufl.element( + "Lagrange", cell.cellname(), degree, shape=(3,) + ) + + mesh_ufl = ufl.Mesh(mesh_element) + self.dolfinx_mesh = create_mesh( + comm=MPI.COMM_WORLD, + cells=self.cell_connectivity, + x=self.data.points, + e=mesh_ufl, + ) + + def create_dolfinx_function(self, data: str = "mean") -> dolfinx.fem.Function: + """Converts VTKHDF cell data to a dolfinx Function. + + Arguments: + data: the name of the cell data array to extract (default: "mean") + + Returns: + dolfinx function with OpenMC results mapped + """ + if self.dolfinx_mesh is None: + self.create_dolfinx_mesh() + + function_space = dolfinx.fem.functionspace(self.dolfinx_mesh, ("DG", 0)) + u = dolfinx.fem.Function(function_space) + + u.x.array[:] = self.data.cell_data[data][ + self.dolfinx_mesh.topology.original_cell_index + ] + + return u diff --git a/test/test_unstructured_mesh.py b/test/test_unstructured_mesh.py index 26ae187..801eff0 100644 --- a/test/test_unstructured_mesh.py +++ b/test/test_unstructured_mesh.py @@ -5,7 +5,7 @@ from mpi4py import MPI import pytest -from openmc2dolfinx import UnstructuredMeshReader +from openmc2dolfinx import UnstructuredMeshReader, VTKHDFUnstructuredMeshReader @pytest.fixture @@ -96,3 +96,37 @@ def test_download_from_pyvista_examples(tmpdir): # export to vtk for visualisation writer = dolfinx.io.VTXWriter(MPI.COMM_WORLD, tmpdir + "/out.bp", u, "BP5") writer.write(t=0) + + +def test_vtkhdf_unstructured_mesh_reader(tmpdir, unstructured_mesh): + """Test VTKHDFUnstructuredMeshReader with VTKHDF format files.""" + # save to vtkhdf file + filename = str(tmpdir.join("test_mesh.vtkhdf")) + unstructured_mesh.save(filename) + + reader = VTKHDFUnstructuredMeshReader(filename) + dolfinx_function = reader.create_dolfinx_function() + + assert isinstance(dolfinx_function, fem.Function) + + +def test_vtkhdf_reader_with_pyvista_example(tmpdir): + """Test VTKHDFUnstructuredMeshReader with a larger example mesh.""" + # download an example tetmesh + filename = pv.examples.download_tetrahedron(load=False) + + grid = pv.read(filename) + grid.cell_data["mean"] = np.arange(grid.n_cells) + + # save as vtkhdf + vtkhdf_file = str(tmpdir.join("example.vtkhdf")) + grid.save(vtkhdf_file) + + # read the vtkhdf file + reader = VTKHDFUnstructuredMeshReader(vtkhdf_file) + + # make a dolfinx function + u = reader.create_dolfinx_function("mean") + + assert isinstance(u, fem.Function) + assert u.function_space.mesh.topology.dim == 3 From d316a082bd97a1553d6dbe44fa8f061d262595c9 Mon Sep 17 00:00:00 2001 From: shimwell Date: Mon, 2 Feb 2026 12:08:55 +0100 Subject: [PATCH 2/3] tally result adding --- test/tally.vtkhdf | Bin 0 -> 96680 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/tally.vtkhdf diff --git a/test/tally.vtkhdf b/test/tally.vtkhdf new file mode 100644 index 0000000000000000000000000000000000000000..ba1931bae36ebeb35b60cf7fc5d3cc07724a43f2 GIT binary patch literal 96680 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 F{{UL$U$FoH literal 0 HcmV?d00001 From b8477b112141584082ea393c3706e7c1cef823ab Mon Sep 17 00:00:00 2001 From: shimwell Date: Mon, 2 Feb 2026 12:10:10 +0100 Subject: [PATCH 3/3] updated test for hdf --- test/test_unstructured_mesh.py | 35 +++++++--------------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/test/test_unstructured_mesh.py b/test/test_unstructured_mesh.py index 801eff0..9ae62e0 100644 --- a/test/test_unstructured_mesh.py +++ b/test/test_unstructured_mesh.py @@ -98,35 +98,14 @@ def test_download_from_pyvista_examples(tmpdir): writer.write(t=0) -def test_vtkhdf_unstructured_mesh_reader(tmpdir, unstructured_mesh): - """Test VTKHDFUnstructuredMeshReader with VTKHDF format files.""" - # save to vtkhdf file - filename = str(tmpdir.join("test_mesh.vtkhdf")) - unstructured_mesh.save(filename) +def test_vtkhdf_unstructured_mesh_reader(): + """Test VTKHDFUnstructuredMeshReader with OpenMC VTKHDF tally file.""" + import pathlib + + vtkhdf_file = pathlib.Path(__file__).parent / "tally.vtkhdf" - reader = VTKHDFUnstructuredMeshReader(filename) + reader = VTKHDFUnstructuredMeshReader(str(vtkhdf_file)) dolfinx_function = reader.create_dolfinx_function() assert isinstance(dolfinx_function, fem.Function) - - -def test_vtkhdf_reader_with_pyvista_example(tmpdir): - """Test VTKHDFUnstructuredMeshReader with a larger example mesh.""" - # download an example tetmesh - filename = pv.examples.download_tetrahedron(load=False) - - grid = pv.read(filename) - grid.cell_data["mean"] = np.arange(grid.n_cells) - - # save as vtkhdf - vtkhdf_file = str(tmpdir.join("example.vtkhdf")) - grid.save(vtkhdf_file) - - # read the vtkhdf file - reader = VTKHDFUnstructuredMeshReader(vtkhdf_file) - - # make a dolfinx function - u = reader.create_dolfinx_function("mean") - - assert isinstance(u, fem.Function) - assert u.function_space.mesh.topology.dim == 3 + assert dolfinx_function.function_space.mesh.topology.dim == 3