Mesh a saddle bracket for a structural analysis#

Summary: This example demonstrates how to mesh a thin solid with hexahedral and prism cells.

Objective#

This example creates a mainly hexahedral mesh on a thin solid volume.

Thin volume hexahedral mesh.

Procedure#

  1. Launch Ansys Prime Server.

  2. Import the CAD geometry.

  3. Quad surface mesh the source face.

  4. Surface mesh the remaining unmeshed TopoFaces with tri surface mesh.

  5. Delete the topology.

  6. Define volume meshing controls to use thin volume meshing.

  7. Volume mesh with hexahedral and prism cells.

  8. Write a CDB file for use in the APDL solver.

  9. Exit the PyPrimeMesh session.

Launch Ansys Prime Server#

Import all necessary modules. Launch an instance of Ansys Prime Server. Connect the PyPrimeMesh client and get the model.

import os
import tempfile

import ansys.meshing.prime as prime
from ansys.meshing.prime.graphics import PrimePlotter

prime_client = prime.launch_prime()
model = prime_client.model

mesh_util = prime.lucid.Mesh(model)
Using Ansys Prime Server from container ansys-prime-server-8

Import geometry#

Download the saddle bracket geometry (FMD) file exported by SpaceClaim. Import the geometry and display all.

# For Windows OS users, scdoc is also available:
# saddle_bracket = prime.examples.download_saddle_bracket_scdoc()

saddle_bracket = prime.examples.download_saddle_bracket_fmd()

mesh_util.read(file_name=saddle_bracket)

print(model)

display = PrimePlotter()
display.plot(model)
display.show()
07 saddle bracket
Part Summary:

Part Name: saddle_bracket
Part ID: 2
    42 Topo Edges
    17 Topo Faces
    1 Topo Volumes

    0 Edge Zones
        Edge Zone Name(s) : []
    0 Face Zones
        Face Zone Name(s) : []
    1 Volume Zones
        Volume Zone Name(s) : [solid]

    12 Label(s)
        Names: [hole1, hole2, hole3, round_group1, round_group2, round_group4, round_group5, round_group6, round_group7, round_group8, source_thin, target_thin]

    Bounding box (-27.3636 -0.62 -21.923)
                 (46.7236 27.82 7.62845)

Quad mesh source faces#

Mesh the source faces for the thin volume control with quads.

scope = prime.lucid.SurfaceScope(
    part_expression="*",
    entity_expression="source_thin",
    scope_evaluation_type=prime.ScopeEvaluationType.LABELS,
)

mesh_util.surface_mesh(
    scope=scope,
    min_size=2.0,
    generate_quads=True,
)

display = PrimePlotter()
display.plot(model, update=True)
display.show()
07 saddle bracket

Surface mesh unmeshed faces#

Mesh unmeshed faces with tri surface mesh. Tri surface mesh on the target and side faces is used to show more clearly that the result of the thin volume control is a hex mesh that is imprinted up to the side faces. All quads could be used for the surface mesh to simplify the process.

part = model.parts[0]

all_faces = part.get_topo_faces()
meshed_faces = part.get_topo_faces_of_label_name_pattern(
    label_name_pattern="source_thin",
    name_pattern_params=prime.NamePatternParams(model),
)

unmeshed_faces = [face for face in all_faces if face not in meshed_faces]

part.add_labels_on_topo_entities(
    labels=["unmeshed_faces"],
    topo_entities=unmeshed_faces,
)

scope = prime.lucid.SurfaceScope(
    part_expression="*",
    entity_expression="unmeshed_faces",
    scope_evaluation_type=prime.ScopeEvaluationType.LABELS,
)

mesh_util.surface_mesh(
    scope=scope,
    min_size=2.0,
)

display = PrimePlotter()
display.plot(model, update=True)
display.show()
07 saddle bracket

Delete topology#

Delete topology to leave only the surface mesh. This is necessary for the thin volume control to be used.

part.delete_topo_entities(
    prime.DeleteTopoEntitiesParams(
        model=model,
        delete_geom_zonelets=True,
        delete_mesh_zonelets=False,
    )
)
<ansys.meshing.prime.autogen.partstructs.DeleteTopoEntitiesResults object at 0x7f039882bd90>

Define volume meshing controls#

Define volume meshing controls to use thin volume meshing. Specify source and target faces for the thin volume using imported labels. Set the number of layers of cells through the thickness of the thin solid to be 4. To create a fully hexahedral and prism mesh the side faces must be imprinted on the side faces. If needed, a buffer region at the sides of the volume can be defined where the volume fill type used for the volume mesh parameters is used to infill. This is useful on more complex geometries, where it provides more robustness of the method. To create a buffer region set imprint_sides to False and specify how many rings of cells to ignore at the sides using n_ignore_rings.

auto_mesh_params = prime.AutoMeshParams(model=model)
thin_vol_ctrls_ids = []
thin_vol_ctrl = model.control_data.create_thin_volume_control()

thin_vol_ctrl.set_source_scope(
    prime.ScopeDefinition(
        model=model,
        label_expression="source_thin",
    )
)

thin_vol_ctrl.set_target_scope(
    prime.ScopeDefinition(
        model=model,
        label_expression="target_thin",
    )
)

thin_params = prime.ThinVolumeMeshParams(
    model=model,
    n_layers=4,
    imprint_sides=True,
)

thin_vol_ctrl.set_thin_volume_mesh_params(thin_volume_mesh_params=thin_params)
thin_vol_ctrls_ids.append(thin_vol_ctrl.id)
auto_mesh_params.thin_volume_control_ids = thin_vol_ctrls_ids
auto_mesh_params.volume_fill_type = prime.VolumeFillType.TET

Generate volume mesh#

Volume mesh to obtain hexahedral and prism mesh. Print mesh summary. Display volume mesh.

volume_mesh = prime.AutoMesh(model=model)
result_vol = volume_mesh.mesh(part_id=part.id, automesh_params=auto_mesh_params)
print(part.get_summary(prime.PartSummaryParams(model)))

display = PrimePlotter()
display.plot(model, update=True)
display.show()
07 saddle bracket
message :
Part Name: saddle_bracket
Part ID: 2
    42 Edge Zonelets
    17 Face Zonelets
    1 Cell Zonelets

    0 Edge Zones
        Edge Zone Name(s) : []
    0 Face Zones
        Face Zone Name(s) : []
    1 Volume Zones
        Volume Zone Name(s) : [solid]

    13 Label(s)
        Names: [hole1, hole2, hole3, round_group1, round_group2, round_group4, round_group5, round_group6, round_group7, round_group8, source_thin, target_thin, unmeshed_faces]

    Bounding box (-27.3636 -0.62 -21.923)
                 (46.7236 27.82 7.62845)

    Mesh Summary:
        4640 Nodes
        0 Poly Faces
        2266 Quad Faces
        26 Tri Faces
        2292 Faces
        0 Poly Cells
        3180 Hex Cells
        52 Prism Cells
        0 Pyramid Cells
        0 Tet Cells
        3232 Cells

n_topo_edges :  0
n_topo_faces :  0
n_topo_volumes :  0
n_edge_zonelets :  42
n_face_zonelets :  17
n_cell_zonelets :  1
n_edge_zones :  0
n_face_zones :  0
n_volume_zones :  1
n_labels :  13
n_nodes :  4640
n_faces :  2292
n_cells :  3232
n_tri_faces :  26
n_poly_faces :  0
n_quad_faces :  2266
n_second_order_tri_faces :  0
n_second_order_quad_faces :  0
n_tet_cells :  0
n_pyra_cells :  0
n_prism_cells :  52
n_poly_cells :  0
n_hex_cells :  3180
n_second_order_tet_cells :  0
n_second_order_pyra_cells :  0
n_second_order_prism_cells :  0
n_second_order_hex_cells :  0
n_unmeshed_topo_faces :  0

Write mesh#

Write a CDB file for use in the MAPDL solver.

with tempfile.TemporaryDirectory() as temp_folder:
    mesh_file = os.path.join(temp_folder, "saddle_bracket.cdb")
    mesh_util.write(mesh_file)
    assert os.path.exists(mesh_file)
    print("\nExported file:\n", mesh_file)
This get_abaqus_simulation_data is a beta API. The behavior and implementation may change in future.
/home/runner/work/pyprimemesh/pyprimemesh/.venv/lib/python3.10/site-packages/ansys/meshing/prime/core/fileio.py:336: PrimeRuntimeWarning: Export of a zonelet skipped while exporting a label as element component. Disable the parameter enable_face_based_labels in ExportMapdlCdbParams to export the label as node component.
  result = super().export_mapdl_cdb(temp_file_name, params)

Exported file:
 /tmp/tmpv227hbcd/saddle_bracket.cdb

Exit PyPrimeMesh#

prime_client.exit()

Total running time of the script: (0 minutes 32.924 seconds)

Gallery generated by Sphinx-Gallery