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

Gmsh Python API多边形挤压网格生成报错:No elements in volume 1

Gmsh Python API网格生成问题:共面挤压体网格失败

我用Gmsh的Python API处理多个几何形状,将问题简化为两个位于不同平面的多边形的最小复现示例,坐标定义如下:

# polygon spans (x, y, zs[0])
xy1 = [(0.0, 504.0), (247.0, 504.0), (247.0, 496.0), (0.0, 496.0), (0.0, 504.0)]
zs1 = [0, 50]

xy2 = [(0.0, 396.0), (0.0, 496.0), (0.0, 504.0), (247.0, 504.0), (285.0, 504.0), (285.0, 496.0), (285.0, 396.0), (285.0, 388.0), (247.0, 388.0), (0.0, 388.0), (0.0, 396.0)]
zs2 = [50, 100]

坐标去重处理

为避免节点重复,我先将坐标投影到有限网格,代码如下:

coord_labels = {}

def get_coord_label(xyz):
    if xyz not in coord_labels:
        coord_labels[xyz] = gmsh.model.geo.add_point(*xyz)
    return coord_labels[xyz]

pts1 = [get_coord_label((x,y,zs1[0])) for (x,y) in xy1]
pts2 = [get_coord_label((x,y,zs2[0])) for (x,y) in xy2]

生成的Gmsh点标签唯一:

pts1
>>> [1, 2, 3, 4, 1]

pts2
>>> [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 5]

挤压生成多面体

接下来我将这些多边形沿(0,0,1)方向挤压成跨越zs[0]到zs[1]的多面体,代码如下:

def extrude(pts, dz):
    lines = [gmsh.model.geo.add_line(pts[i], pts[i+1]) for i in range(len(pts)-1)]
    face = gmsh.model.geo.add_plane_surface([gmsh.model.geo.add_curve_loop(lines, reorient=True)])
    objs = gmsh.model.geo.extrude([(2,face)], 0,0, dz)

extrude(pts1, zs1[1] - zs1[0])
extrude(pts2, zs2[1] - zs2[0])

运行同步和显示代码后,生成的多面体显示正常:

gmsh.model.geo.synchronize()
gmsh.fltk.run()

挤压生成的多面体显示效果

其中下方右下的体由xy1生成,其z=50的顶面与xy2挤压体的部分底面重合。但调用网格生成代码:

gmsh.model.mesh.generate()

时抛出异常:

No elements in volume 1

疑问与需求

我推测问题在于Gmsh的extrusion函数为xy1生成z=zs1[1]面内的新点,这些点未被自动识别为与z=zs2[0]共面,但不确定原因及解决方法。此外,我认为当前挤压多边形的流程过于繁琐,想了解操作中的错误之处。

注:我的应用场景中,部分相邻体需要合并为单个网格体,其余则需保留分隔面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:20:30