PyGmsh超限网格异常:如何实现指定矩形网格?
解决PyGmsh跨矩形Transfinite网格配对问题
核心解决要点
- 两个矩形的共享边界必须配置完全一致的超限节点参数,这是保证界面网格对齐的核心
- 手动为配对的平行曲线(比如两个矩形的左右侧边、上下侧边)设置相同的节点数,以此模拟geo文件中批量设置超限曲线的效果
- 设置Transfinite Surface时,统一顶点顺序和网格生成方向,避免启用recombine后出现界面扭曲
具体实现代码
import pygmsh with pygmsh.geo.Geometry() as geom: # 创建两个上下堆叠的矩形,共享中间的水平边 rect_lower = geom.add_rectangle([0, 0, 0], 10, 5) # 下方矩形:x从0到10,y从0到5 rect_upper = geom.add_rectangle([0, 5, 0], 10, 5) # 上方矩形:x从0到10,y从5到10 # -------------------------- # 1. 配置共享边的超限参数(只需设置一次) # 下方矩形的顶部边 = 上方矩形的底部边,设x方向11个节点(对应10个单元) geom.set_transfinite_curve(rect_lower.curves[2], 11, progression=1.0) # -------------------------- # 2. 配对设置垂直曲线(y方向):独立设置节点数 # 左侧边组:下方矩形左侧边设6个节点,上方矩形左侧边设7个节点 geom.set_transfinite_curve(rect_lower.curves[3], 6, progression=1.0) geom.set_transfinite_curve(rect_upper.curves[3], 7, progression=1.0) # 右侧边组:和左侧边节点数一一对应,保证y方向网格均匀 geom.set_transfinite_curve(rect_lower.curves[1], 6, progression=1.0) geom.set_transfinite_curve(rect_upper.curves[1], 7, progression=1.0) # -------------------------- # 3. 配置水平曲线(x方向):所有非共享水平边节点数统一 geom.set_transfinite_curve(rect_lower.curves[0], 11, progression=1.0) # 下方矩形底部边 geom.set_transfinite_curve(rect_upper.curves[2], 11, progression=1.0) # 上方矩形顶部边 # -------------------------- # 4. 设置Transfinite Surface,统一生成方向 # 用"Left"选项指定网格生成基准,保证两个矩形的网格方向一致 geom.set_transfinite_surface(rect_lower.surface, "Left", [rect_lower.curves[0], rect_lower.curves[1], rect_lower.curves[2], rect_lower.curves[3]]) geom.set_transfinite_surface(rect_upper.surface, "Left", [rect_upper.curves[0], rect_upper.curves[1], rect_upper.curves[2], rect_upper.curves[3]]) # -------------------------- # 5. 启用重组生成四边形网格 geom.recombine() # 生成并保存网格 mesh = geom.generate_mesh() mesh.write("aligned_rect_mesh.msh")
关键注意事项
- 曲线配对一致性:所有x方向的平行曲线(水平边)必须设置相同的节点数,确保x方向网格完全对齐;y方向的平行曲线(垂直边)可独立设置节点数,满足需求
- 共享边仅配置一次:不要重复设置共享边界的超限参数,避免节点配置冲突
- 曲面生成方向统一:设置Transfinite Surface时指定相同的基准选项(如"Left"),保证两个矩形的网格生成方向一致,这是避免recombine后界面扭曲的关键
内容的提问来源于stack exchange,提问作者Nick Brady
相关产品推荐
相关产品推荐

