Split a mesh#

MAPDL LSDYNA Fluent CFX

This tutorial shows how to split a mesh on a given property.

There are two approaches to accomplish this goal:

Download tutorial as Python script Download tutorial as Jupyter notebook

Define the mesh#

The mesh object in DPF is a MeshedRegion. You can obtain a MeshedRegion by creating your own from scratch or by getting it from a result file. For more information check the Create a mesh from scratch and Get a mesh from a result file tutorials.

For this tutorial, we get a MeshedRegion from a result file. You can use one available in the Examples module. For more information see the Get a mesh from a result file tutorial.

# Import the ``ansys.dpf.core`` module
from ansys.dpf import core as dpf
# Import the examples module
from ansys.dpf.core import examples
# Import the operators module
from ansys.dpf.core import operators as ops

# Define the result file path
result_file_path_1 = examples.find_multishells_rst()
# Create the model
model_1 = dpf.Model(data_sources=result_file_path_1)
# Get the mesh
meshed_region_1 = model_1.metadata.meshed_region
# Import the ``ansys.dpf.core`` module
from ansys.dpf import core as dpf
# Import the examples module
from ansys.dpf.core import examples
# Import the operators module
from ansys.dpf.core import operators as ops

# Define the result file path
result_file_path_2 = examples.download_d3plot_beam()
# Create the DataSources object
ds_2 = dpf.DataSources()
ds_2.set_result_file_path(filepath=result_file_path_2[0], key="d3plot")
ds_2.add_file_path(filepath=result_file_path_2[3], key="actunits")
# Create the model
model_2 = dpf.Model(data_sources=ds_2)
# Get the mesh
meshed_region_2 = model_2.metadata.meshed_region
# Import the ``ansys.dpf.core`` module
from ansys.dpf import core as dpf
# Import the examples module
from ansys.dpf.core import examples
# Import the operators module
from ansys.dpf.core import operators as ops

# Define the result file path
result_file_path_3 = examples.download_fluent_axial_comp()["flprj"]
# Create the model
model_3 = dpf.Model(data_sources=result_file_path_3)
# Get the mesh
meshed_region_3 = model_3.metadata.meshed_region
# Import the ``ansys.dpf.core`` module
from ansys.dpf import core as dpf
# Import the examples module
from ansys.dpf.core import examples
# Import the operators module
from ansys.dpf.core import operators as ops

# Define the result file path
result_file_path_4 = examples.download_cfx_mixing_elbow()
# Create the model
model_4 = dpf.Model(data_sources=result_file_path_4)
# Get the mesh
meshed_region_4 = model_4.metadata.meshed_region

First approach#

This approach consists in splitting an already existing MeshedRegion based on a given property. To accomplish that end, you must use the split_mesh operator. Currently you can split a mesh by material or eltype.

The split mesh parts are stored in the DPF collection called MeshesContainer, where they are ordered by labels. When you use the split_mesh operator, each split mesh part has two different labels:

  • A “body” label

  • A label with the property used to split the mesh

Here, we split the MeshedRegion by material.

# Split the mesh by material
meshes_11 = ops.mesh.split_mesh(mesh=meshed_region_1, property="mat").eval()

# Print the meshes
print(meshes_11)
DPF  Meshes Container
  with 12 mesh(es)
  defined on labels: body mat 

  with:
  - mesh 0 {mat:  2, body:  1, } with 5072 nodes and 3086 elements.
  - mesh 1 {mat:  3, body:  2, } with 135 nodes and 112 elements.
  - mesh 2 {mat:  5, body:  3, } with 104 nodes and 34 elements.
  - mesh 3 {mat:  7, body:  4, } with 218 nodes and 105 elements.
  - mesh 4 {mat:  11, body:  5, } with 71 nodes and 22 elements.
  - mesh 5 {mat:  4, body:  6, } with 90 nodes and 70 elements.
  - mesh 6 {mat:  6, body:  7, } with 104 nodes and 34 elements.
  - mesh 7 {mat:  8, body:  8, } with 218 nodes and 105 elements.
  - mesh 8 {mat:  12, body:  9, } with 71 nodes and 22 elements.
  - mesh 9 {mat:  9, body:  10, } with 327 nodes and 165 elements.
  - mesh 10 {mat:  1, body:  11, } with 1782 nodes and 300 elements.
  - mesh 11 {mat:  10, body:  12, } with 327 nodes and 165 elements.

# Split the mesh by material
meshes_21 = ops.mesh.split_mesh(mesh=meshed_region_2, property="mat").eval()

# Print the meshes
print(meshes_21)
DPF  Meshes Container
  with 2 mesh(es)
  defined on labels: body mat 

  with:
  - mesh 0 {mat:  2, body:  1, } with 1651 nodes and 1512 elements.
  - mesh 1 {mat:  1, body:  2, } with 289 nodes and 544 elements.

# Split the mesh by material
meshes_31 = ops.mesh.split_mesh(mesh=meshed_region_3, property="mat").eval()

# Print the meshes
print(meshes_31)
DPF  Meshes Container
  with 1 mesh(es)
  defined on labels: body mat 

  with:
  - mesh 0 {mat:  -1, body:  1, } with 16660 nodes and 13856 elements.

# Split the mesh by material
meshes_41 = ops.mesh.split_mesh(mesh=meshed_region_4, property="mat").eval()
# Print the meshes
print(meshes_41)
DPF  Meshes Container
  with 1 mesh(es)
  defined on labels: body mat 

  with:
  - mesh 0 {mat:  -1, body:  1, } with 6219 nodes and 15695 elements.

Second approach#

This approach consists in splitting the Scoping of a given MeshedRegion based on a given property and then creating a new MeshedRegion for each split Scoping.

To accomplish this goal you must follow these steps:

  1. Use the split_on_property_type operator to split the mesh Scoping.

    This operator splits a Scoping on a given property (elshape and/or material, since 2025R1 it supports any scalar property field name contained in the mesh property fields). The split Scoping is stored in the DPF collection called ScopingsContainer, where they are ordered by labels. In this case, you get labels with the property used to split the Scoping.

  2. Create the split MeshedRegion objects using the from_scopings operator for the Scoping of interest.

    The split parts are stored in the DPF collection called MeshesContainer where they are also ordered by labels. These labels are corresponding to the “mat” labels gotten with the split_on_property_type operator.

Here, we split the mesh scoping by material and create a MeshedRegion for all the split Scoping in the ScopingsContainer.

# Define the scoping split by material
split_scoping_1 = ops.scoping.split_on_property_type(mesh=meshed_region_1, label1="mat").eval()
# Get the split meshes
meshes_12 = ops.mesh.from_scopings(scopings_container=split_scoping_1, mesh=meshed_region_1).eval()
# Print the meshes
print(meshes_12)
DPF  Meshes Container
  with 12 mesh(es)
  defined on labels: mat 

  with:
  - mesh 0 {mat:  2, } with 5072 nodes and 3086 elements.
  - mesh 1 {mat:  3, } with 135 nodes and 112 elements.
  - mesh 2 {mat:  5, } with 104 nodes and 34 elements.
  - mesh 3 {mat:  7, } with 218 nodes and 105 elements.
  - mesh 4 {mat:  11, } with 71 nodes and 22 elements.
  - mesh 5 {mat:  4, } with 90 nodes and 70 elements.
  - mesh 6 {mat:  6, } with 104 nodes and 34 elements.
  - mesh 7 {mat:  8, } with 218 nodes and 105 elements.
  - mesh 8 {mat:  12, } with 71 nodes and 22 elements.
  - mesh 9 {mat:  9, } with 327 nodes and 165 elements.
  - mesh 10 {mat:  1, } with 1782 nodes and 300 elements.
  - mesh 11 {mat:  10, } with 327 nodes and 165 elements.

# Define the scoping split by material
split_scoping_2 = ops.scoping.split_on_property_type(mesh=meshed_region_2, label1="mat").eval()
# Get the split meshes
meshes_22 = ops.mesh.from_scopings(scopings_container=split_scoping_2, mesh=meshed_region_2).eval()
# Print the meshes
print(meshes_22)
DPF  Meshes Container
  with 2 mesh(es)
  defined on labels: mat 

  with:
  - mesh 0 {mat:  2, } with 1651 nodes and 1512 elements.
  - mesh 1 {mat:  1, } with 289 nodes and 544 elements.

# Define the scoping split by material
split_scoping_3 = ops.scoping.split_on_property_type(mesh=meshed_region_3, label1="mat").eval()
# Get the split meshes
meshes_32 = ops.mesh.from_scopings(scopings_container=split_scoping_3, mesh=meshed_region_3).eval()
# Print the meshes
print(meshes_32)
DPF  Meshes Container
  with 1 mesh(es)
  defined on labels: mat 

  with:
  - mesh 0 {mat:  -1, } with 16660 nodes and 13856 elements.

# Define the scoping split by material
split_scoping_4 = ops.scoping.split_on_property_type(mesh=meshed_region_4, label1="mat").eval()
# Get the split meshes
meshes_42 = ops.mesh.from_scopings(scopings_container=split_scoping_4, mesh=meshed_region_4).eval()
# Print the meshes
print(meshes_42)
DPF  Meshes Container
  with 1 mesh(es)
  defined on labels: mat 

  with:
  - mesh 0 {mat:  -1, } with 6219 nodes and 15695 elements.