From 7b37870331117c33015dca342d9a9dbb0bb3fa67 Mon Sep 17 00:00:00 2001 From: jhdark Date: Tue, 3 Mar 2026 11:51:46 -0500 Subject: [PATCH 1/3] new options for cell or point data --- src/foam2dolfinx/open_foam_reader.py | 51 ++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/src/foam2dolfinx/open_foam_reader.py b/src/foam2dolfinx/open_foam_reader.py index a17b938..2b4fbac 100644 --- a/src/foam2dolfinx/open_foam_reader.py +++ b/src/foam2dolfinx/open_foam_reader.py @@ -176,7 +176,9 @@ def _create_dolfinx_mesh(self, subdomain: str | None = "default"): ) # Create dolfinx Mesh - mesh_ufl = ufl.Mesh(self.mesh_vector_element) + mesh_ufl = ufl.Mesh( + basix.ufl.element("Lagrange", cell.cellname(), degree, shape=(3,)) + ) self.dolfinx_meshes_dict[subdomain] = create_mesh( comm=MPI.COMM_WORLD, cells=self.connectivities_dict[subdomain], @@ -184,7 +186,7 @@ def _create_dolfinx_mesh(self, subdomain: str | None = "default"): e=mesh_ufl, ) - def create_dolfinx_function( + def create_dolfinx_function_with_cell_data( self, t: float, name: str = "U", subdomain: str | None = "default" ) -> dolfinx.fem.Function: """Creates a dolfinx.fem.Function from the OpenFOAM file. @@ -208,6 +210,50 @@ def create_dolfinx_function( mesh = self.dolfinx_meshes_dict[subdomain] + if name == "U": + element = basix.ufl.element("DG", mesh.topology.cell_name(), 0, shape=(3,)) + else: + element = basix.ufl.element("DG", mesh.topology.cell_name(), 0, shape=()) + + function_space = dolfinx.fem.functionspace(mesh, element) + u = dolfinx.fem.Function(function_space) + + # Assign values in OF_mesh to dolfinx_mesh + assert hasattr(self.OF_meshes_dict[subdomain], "cell_data") + u.x.array[:] = ( + self.OF_meshes_dict[subdomain] + .cell_data[name][mesh.topology.original_cell_index] + .flatten() + ) + + return u + + def create_dolfinx_function_with_point_data( + self, t: float, name: str = "U", subdomain: str | None = "default" + ) -> dolfinx.fem.Function: + """Creates a dolfinx.fem.Function from the OpenFOAM file. + + Args: + t: timestamp of the data to read + name: Name of the field in the OpenFOAM file, defaults to "U" for velocity + subdomain: Name of the subdmain in the OpenFOAM file, from which a field is + extracted + + Returns: + the dolfinx function + """ + + assert hasattr(self.OF_meshes_dict[subdomain], "point_data") + + # read the OpenFOAM data in the filename provided + self._read_with_pyvista(t=t, subdomain=subdomain) + + # create the dolfinx mesh + if subdomain not in self.dolfinx_meshes_dict: + self._create_dolfinx_mesh(subdomain=subdomain) + + mesh = self.dolfinx_meshes_dict[subdomain] + if name == "U": element = self.mesh_vector_element else: @@ -239,7 +285,6 @@ def create_dolfinx_function( ][cell_indices, vertex_positions] # Assign values in OF_mesh to dolfinx_mesh - assert hasattr(self.OF_meshes_dict[subdomain], "point_data") u.x.array[:] = ( self.OF_meshes_dict[subdomain].point_data[name][vertex_map].flatten() ) From 773279b3f6e97bf381e6454fbaedb4cee1fc37fa Mon Sep 17 00:00:00 2001 From: jhdark Date: Tue, 3 Mar 2026 11:54:21 -0500 Subject: [PATCH 2/3] move test --- src/foam2dolfinx/open_foam_reader.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/foam2dolfinx/open_foam_reader.py b/src/foam2dolfinx/open_foam_reader.py index 2b4fbac..66e9cd9 100644 --- a/src/foam2dolfinx/open_foam_reader.py +++ b/src/foam2dolfinx/open_foam_reader.py @@ -243,8 +243,6 @@ def create_dolfinx_function_with_point_data( the dolfinx function """ - assert hasattr(self.OF_meshes_dict[subdomain], "point_data") - # read the OpenFOAM data in the filename provided self._read_with_pyvista(t=t, subdomain=subdomain) @@ -285,6 +283,7 @@ def create_dolfinx_function_with_point_data( ][cell_indices, vertex_positions] # Assign values in OF_mesh to dolfinx_mesh + assert hasattr(self.OF_meshes_dict[subdomain], "point_data") u.x.array[:] = ( self.OF_meshes_dict[subdomain].point_data[name][vertex_map].flatten() ) From 5d87990b108792a58b9f8c1fb14cc41ad361c721 Mon Sep 17 00:00:00 2001 From: jhdark Date: Tue, 3 Mar 2026 11:54:30 -0500 Subject: [PATCH 3/3] update tests --- test/test_example.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/test/test_example.py b/test/test_example.py index cd4f24d..1231ab5 100644 --- a/test/test_example.py +++ b/test/test_example.py @@ -1,13 +1,15 @@ -from foam2dolfinx import OpenFOAMReader -import dolfinx -from pyvista import examples import zipfile from pathlib import Path +import dolfinx +from pyvista import examples + +from foam2dolfinx import OpenFOAMReader + def test_reading_and_writing_cavity_example(): my_of_reader = OpenFOAMReader(filename=examples.download_cavity(load=False)) - vel = my_of_reader.create_dolfinx_function(t=2.5) + vel = my_of_reader.create_dolfinx_function_with_point_data(t=2.5) assert isinstance(vel, dolfinx.fem.Function) @@ -28,8 +30,8 @@ def test_baby_example(tmpdir): # read the .foam file my_of_reader = OpenFOAMReader(filename=str(foam_file), cell_type=10) - vel = my_of_reader.create_dolfinx_function(t=time, name="U") - T = my_of_reader.create_dolfinx_function(t=time, name="T") + vel = my_of_reader.create_dolfinx_function_with_point_data(t=time, name="U") + T = my_of_reader.create_dolfinx_function_with_point_data(t=time, name="T") assert isinstance(vel, dolfinx.fem.Function) assert isinstance(T, dolfinx.fem.Function) @@ -51,9 +53,9 @@ def test_hot_room(tmpdir): # read the .foam file my_of_reader = OpenFOAMReader(filename=str(foam_file), cell_type=12) - vel = my_of_reader.create_dolfinx_function(t=time, name="U") - T = my_of_reader.create_dolfinx_function(t=time, name="T") - nut = my_of_reader.create_dolfinx_function(t=time, name="nut") + vel = my_of_reader.create_dolfinx_function_with_point_data(t=time, name="U") + T = my_of_reader.create_dolfinx_function_with_point_data(t=time, name="T") + nut = my_of_reader.create_dolfinx_function_with_point_data(t=time, name="nut") assert isinstance(vel, dolfinx.fem.Function) assert isinstance(T, dolfinx.fem.Function)