如何用Gmsh生成环形圆盘的规则四边形网格?
如何用Gmsh生成环形圆盘的结构化四边形网格
已实现的矩形四边形网格
我已成功使用Gmsh生成矩形的四边形网格,代码如下:
import gmsh import sys gmsh.initialize() gmsh.model.add("t1") lc = 1e-2 p1 = gmsh.model.geo.addPoint(0, 0, 0, lc, 1) p2 = gmsh.model.geo.addPoint(0.02, 0, 0, lc, 2) p3 = gmsh.model.geo.addPoint(0.02, 0.02, 0, lc, 3) p4 = gmsh.model.geo.addPoint(0, 0.02, 0, lc, 4) gmsh.model.geo.addLine(p1, p2, 1) gmsh.model.geo.addLine(p2, p3, 2) gmsh.model.geo.addLine(p3, p4, 3) gmsh.model.geo.addLine(p4, p1, 4) gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.synchronize() gmsh.option.setNumber("Mesh.MeshSizeMin", 0.001) gmsh.option.setNumber("Mesh.MeshSizeMax", 0.003) gmsh.model.mesh.setAlgorithm(2,1,8) gmsh.model.mesh.generate(2) gmsh.model.mesh.recombine() gmsh.write("rect.stl") if '-nopopup' not in sys.argv: gmsh.fltk.run() gmsh.finalize()
生成的网格效果:
目标网格效果
我想要生成如下所示的结构化圆盘四边形网格:
当前尝试的问题
我尝试用四分之一圆盘生成网格,但得到的是不规则网格,代码如下:
import gmsh import sys gmsh.initialize() gmsh.model.add("t1") lc = 1e-2 p1 = gmsh.model.geo.addPoint(0, 0, 0, lc, 1) p2 = gmsh.model.geo.addPoint(0.02, 0, 0, lc, 3) p3 = gmsh.model.geo.addPoint(0, 0.02, 0, lc, 2) p4 = gmsh.model.geo.addPoint(0, 0.01, 0, lc, 5) p5 = gmsh.model.geo.addPoint(0.01, 0, 0, lc, 4) p6 = gmsh.model.geo.addPoint(-0.02, 0, 0, lc, 6) p7 = gmsh.model.geo.addPoint(-0.01, 0, 0, lc, 7) p8 = gmsh.model.geo.addPoint(0, -0.02, 0, lc, 8) p9 = gmsh.model.geo.addPoint(0, -0.01, 0, lc, 9) gmsh.model.geo.addCircleArc(p2, p1, p3, 1) gmsh.model.geo.addLine(p3, p4, 2) gmsh.model.geo.addCircleArc(p4, p1, p5, 3) gmsh.model.geo.addLine(p5, p2, 4) gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.synchronize() gmsh.option.setNumber("Mesh.MeshSizeMin", 0.001) gmsh.model.option.setNumber("Mesh.MeshSizeMax", 0.003) gmsh.model.mesh.setAlgorithm(2,1,8) gmsh.model.mesh.generate(2) gmsh.model.mesh.recombine() gmsh.write("disc.stl") if '-nopopup' not in sys.argv: gmsh.fltk.run() gmsh.finalize()
生成的不规则网格效果:
解决方案
要生成目标中的结构化四边形网格,核心是保证边界曲线的节点划分对齐,使用Gmsh的Transfinite方法定义结构化网格。修改后的代码如下:
import gmsh import sys gmsh.initialize() gmsh.model.add("structured_disc") # 参数设置 inner_radius = 0.01 outer_radius = 0.02 angle_start = 0 angle_end = 90 # 四分之一圆盘 lc = 1e-2 radial_divs = 2 # 径向划分段数 angular_divs = 4 # 周向划分段数 # 创建点 p_center = gmsh.model.geo.addPoint(0, 0, 0, lc, 1) p_outer_start = gmsh.model.geo.addPoint(outer_radius, 0, 0, lc, 2) p_outer_end = gmsh.model.geo.addPoint(0, outer_radius, 0, lc, 3) p_inner_start = gmsh.model.geo.addPoint(inner_radius, 0, 0, lc, 4) p_inner_end = gmsh.model.geo.addPoint(0, inner_radius, 0, lc, 5) # 创建曲线 # 外圆弧 outer_arc = gmsh.model.geo.addCircleArc(p_outer_start, p_center, p_outer_end, 1) # 径向线(外端到内端) radial_end = gmsh.model.geo.addLine(p_outer_end, p_inner_end, 2) # 内圆弧 inner_arc = gmsh.model.geo.addCircleArc(p_inner_end, p_center, p_inner_start, 3) # 径向线(内端到外端) radial_start = gmsh.model.geo.addLine(p_inner_start, p_outer_start, 4) # 创建曲线环和平面 curve_loop = gmsh.model.geo.addCurveLoop([outer_arc, radial_end, inner_arc, radial_start], 1) surface = gmsh.model.geo.addPlaneSurface([curve_loop], 1) # 设置Transfinite划分,确保每条曲线的节点数一致 gmsh.model.geo.mesh.setTransfiniteCurve(outer_arc, angular_divs + 1) gmsh.model.geo.mesh.setTransfiniteCurve(radial_end, radial_divs + 1) gmsh.model.geo.mesh.setTransfiniteCurve(inner_arc, angular_divs + 1) gmsh.model.geo.mesh.setTransfiniteCurve(radial_start, radial_divs + 1) # 设置结构化曲面网格,使用四边形 gmsh.model.geo.mesh.setTransfiniteSurface(surface, "Left", [p_outer_start, p_outer_end, p_inner_end, p_inner_start]) gmsh.model.geo.synchronize() # 生成网格 gmsh.model.mesh.generate(2) # 保存并显示 gmsh.write("structured_disc.stl") if '-nopopup' not in sys.argv: gmsh.fltk.run() gmsh.finalize()
关键说明:
- Transfinite Curve:为每条边界曲线设置相同的节点数(段数+1),保证网格节点对齐,避免不规则三角化后重组的混乱。
- Transfinite Surface:指定曲面的结构化网格生成方式,通过"Left"算法直接生成四边形网格,无需额外调用
recombine()。 - 参数化定义:将半径、角度、划分段数设为变量,方便快速调整网格密度和几何尺寸。
内容的提问来源于stack exchange,提问作者H.H
相关产品推荐
相关产品推荐

