diff --git a/examples/04-Fluid-Examples/00-explore-fluid-simulation.py b/examples/04-Fluid-Examples/00-explore-fluid-simulation.py index c3f72c83e..086acebd7 100644 --- a/examples/04-Fluid-Examples/00-explore-fluid-simulation.py +++ b/examples/04-Fluid-Examples/00-explore-fluid-simulation.py @@ -49,6 +49,26 @@ # Check the available phases print(simulation.phases) +############################################################################### +# Extract the mesh +# ---------------- +############################################################################### +# Extract the full mesh +print(simulation.mesh) +simulation.mesh.plot() +############################################################################### +# Extract the mesh for a given zone by its ID +cell_zone_mesh = simulation.zone_mesh(zone=2) +print(cell_zone_mesh) +cell_zone_mesh.plot() +# or by its name +cell_zone_mesh = simulation.zone_mesh(zone="heater") + +face_zone_mesh = simulation.zone_mesh(zone=9) +print(face_zone_mesh) +face_zone_mesh.plot() +face_zone_mesh = simulation.zone_mesh(zone="outflow") + ############################################################################### # Extract a result diff --git a/src/ansys/dpf/post/fluid_simulation.py b/src/ansys/dpf/post/fluid_simulation.py index c1cbf73e3..e09e34290 100644 --- a/src/ansys/dpf/post/fluid_simulation.py +++ b/src/ansys/dpf/post/fluid_simulation.py @@ -13,6 +13,7 @@ from ansys.dpf import core as dpf from ansys.dpf.post import locations from ansys.dpf.post.dataframe import DataFrame +from ansys.dpf.post.mesh import Mesh from ansys.dpf.post.mesh_info import FluidMeshInfo from ansys.dpf.post.phase import PhasesDict from ansys.dpf.post.result_workflows._component_helper import ( @@ -187,6 +188,28 @@ def mesh_info(self) -> FluidMeshInfo: self._mesh_info = FluidMeshInfo(self._model.metadata.mesh_info) return self._mesh_info + def zone_mesh(self, zone: Union[int, str]) -> Mesh: + """Return the mesh of the given zone (ID or name).""" + if isinstance(zone, int): + if zone not in self.cell_zones.keys(): + if zone not in self.face_zones.keys(): + raise ValueError(f"'{zone}' is not a valid zone ID.") + elif isinstance(zone, str): + zone_id_found = None + for zone_id, zone_name in self.cell_zones.items(): + if zone == zone_name: + zone_id_found = zone_id + if zone_id_found is None: + for zone_id, zone_name in self.face_zones.items(): + if zone == zone_name: + zone_id_found = zone_id + if zone_id_found is None: + raise ValueError(f"'{zone}' is not a valid zone name.") + zone = int(zone_id_found) + mesh_provider = self._model.metadata.mesh_provider + mesh_provider.inputs.region_scoping(zone) + return Mesh(mesh_provider.eval()) + @property def cell_zones(self) -> dict: """Return a dictionary of the cell zones in the simulation.""" diff --git a/tests/test_fluid_simulation.py b/tests/test_fluid_simulation.py index 4a5e60c39..68c2114af 100644 --- a/tests/test_fluid_simulation.py +++ b/tests/test_fluid_simulation.py @@ -473,3 +473,32 @@ def test_plot_result_on_zones(self, fluent_simulation): qualifiers={"zone": list(fluent_simulation.face_zones.keys())} ) temperature.plot() + + def test_fluid_simulation_zone_mesh(self, fluent_simulation): + # Cell zone mesh + cell_zone_mesh = fluent_simulation.zone_mesh(zone=13) + assert cell_zone_mesh.num_elements == 6080 + assert cell_zone_mesh.num_nodes == 7293 + assert cell_zone_mesh.num_faces == 19388 + # by name + cell_zone_mesh = fluent_simulation.zone_mesh(zone="fluid-rotor") + assert cell_zone_mesh.num_elements == 6080 + assert cell_zone_mesh.num_nodes == 7293 + assert cell_zone_mesh.num_faces == 19388 + + # Face zone mesh + face_zone_mesh = fluent_simulation.zone_mesh(zone=4) + assert face_zone_mesh.num_elements == 0 + assert face_zone_mesh.num_nodes == 429 + assert face_zone_mesh.num_faces == 380 + # by name + face_zone_mesh = fluent_simulation.zone_mesh(zone="rotor-shroud") + assert face_zone_mesh.num_elements == 0 + assert face_zone_mesh.num_nodes == 429 + assert face_zone_mesh.num_faces == 380 + + # raise + with pytest.raises(ValueError, match="is not a valid zone name"): + _ = fluent_simulation.zone_mesh(zone="test") + with pytest.raises(ValueError, match="is not a valid zone ID"): + _ = fluent_simulation.zone_mesh(zone=999)