You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于实体拆分STL曲面,用Python Gmsh构建OpenFOAM的3D网格

问题

作为Gmsh新手,我有一个已拆分为实体的闭合STL曲面,需要用Python Gmsh库构建四面体/六面体3D网格,同时根据STL中的实体创建对应OpenFOAM边界条件补丁的命名选择。我尝试了以下代码,但不确定是否需要用gmsh.model.mesh.createTopology(),而且不想用classifySurfaces(因为它会按角度分类曲面),求可行的实现方法。

gmsh.initialize()

input_file = r"geometry\geom_tut1\geom.stl"
gmsh.merge(input_file)
gmsh.model.mesh.createGeometry()
gmsh.model.geo.removeAllDuplicates()
loop = gmsh.model.geo.addSurfaceLoop([e[1] for e in gmsh.model.getEntities(2)])
gmsh.model.geo.addVolume([loop])
gmsh.model.geo.synchronize()
gmsh.option.setNumber("Mesh.Algorithm", 5)
gmsh.option.setNumber("Mesh.Algorithm3D", 10)
gmsh.option.setNumber("Mesh.MeshSizeMin", 0.0001)
gmsh.option.setNumber("Mesh.MeshSizeMax", 0.001)
gmsh.model.mesh.generate(3)
解决方案

1. 关于createTopology()的使用

你不需要调用gmsh.model.mesh.createTopology(),gmsh.model.mesh.createGeometry()已经完成了STL的拓扑重建,后续的gmsh.model.geo.synchronize()也完成了几何与拓扑的同步,现有代码的流程无需额外添加该函数。

2. 保留STL原始实体分组并创建OpenFOAM命名补丁

由于你的STL已按实体拆分,可直接通过Gmsh的STL实体接口关联原始分组,避免使用classifySurfaces。核心思路是遍历STL原始实体,为每个实体对应的曲面创建物理组,物理组名称将直接作为OpenFOAM的补丁名称。

修改后的代码示例:

import gmsh

gmsh.initialize()
gmsh.option.setNumber("General.Terminal", 1)  # 启用终端输出便于调试

input_file = r"geometry\geom_tut1\geom.stl"
gmsh.merge(input_file)

# 处理STL几何并去重
gmsh.model.mesh.createGeometry()
gmsh.model.geo.removeAllDuplicates()
gmsh.model.geo.synchronize()

# 获取STL文件中所有拆分的原始实体
stl_entities = gmsh.model.getSTLEntities()

# 为每个STL实体创建对应OpenFOAM补丁的物理组
# 此处补丁名称需根据你的实体数量和实际需求调整
patch_names = ["inlet", "outlet", "wall", "symmetry"]
for idx, stl_ent in enumerate(stl_entities):
    # 获取当前STL实体对应的所有曲面ID
    surf_ids = gmsh.model.getSTLEntitySurfaces(stl_ent[0], stl_ent[1])
    # 创建物理组并设置名称
    phys_tag = idx + 1
    gmsh.model.addPhysicalGroup(2, surf_ids, phys_tag)
    gmsh.model.setPhysicalName(2, phys_tag, patch_names[idx])

# 创建闭合曲面环与体
all_surf_ids = [e[1] for e in gmsh.model.getEntities(2)]
surface_loop = gmsh.model.geo.addSurfaceLoop(all_surf_ids)
volume = gmsh.model.geo.addVolume([surface_loop])
gmsh.model.geo.synchronize()

# 配置网格参数
gmsh.option.setNumber("Mesh.Algorithm", 5)  # 2D Delaunay算法
gmsh.option.setNumber("Mesh.Algorithm3D", 10)  # 3D Frontal-Delaunay四面体算法
# 若需六面体网格:需先将STL曲面重构为NURBS,再使用Mesh.Algorithm3D=4,但复杂STL不推荐
gmsh.option.setNumber("Mesh.MeshSizeMin", 0.0001)
gmsh.option.setNumber("Mesh.MeshSizeMax", 0.001)

# 生成3D网格并保存为OpenFOAM兼容格式
gmsh.model.mesh.generate(3)
gmsh.write("case.msh")

gmsh.finalize()

关键说明

  • gmsh.model.getSTLEntities()可直接获取STL中拆分的原始实体,每个实体对应一组曲面,精准匹配你需要的OpenFOAM补丁分组,完全替代classifySurfaces的角度分类逻辑。
  • 物理组名称会被OpenFOAM识别为补丁名称,需与后续算例的边界条件配置文件保持一致。
  • 六面体网格对曲面质量要求高,复杂STL建议优先使用四面体网格;若必须生成六面体,需先通过gmsh.model.mesh.createGeometry()完成曲面拟合重构,再切换对应网格算法。

内容的提问来源于stack exchange,提问作者IzaeDA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:43:12