基于实体拆分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
相关产品推荐
相关产品推荐

