Python调用Gmsh重网格时出现“Error: no elements in volume 1”问题求助
问题
我正在使用Python的Gmsh模块,对经平滑算法处理后的.stl文件执行重网格操作。该算法对多数.stl文件有效,但部分文件无法完成3D重网格——网格生成时会出现面相交问题,最终提示Error: no elements in volume 1。
相关代码如下:
import gmsh import math import sys gmsh.initialize() gmsh.option.setNumber('Mesh.Algorithm3D', 4) gmsh.onelab.set("""[ { "type":"number", "name":"Parameters/Angle for surface detection", "values":[120], "min":20, "max":120, "step":1 }, { "type":"number", "name":"Parameters/Create surfaces guaranteed to be parametrizable", "values":[1], "choices":[0, 1] } ]""") gmsh.clear() name = 'filename' gmsh.merge(name) angle = gmsh.onelab.getNumber('Parameters/Angle for surface detection')[0] forceParametrizablePatches = gmsh.onelab.getNumber( 'Parameters/Create surfaces guaranteed to be parametrizable')[0] includeBoundary = False curveAngle = 180 gmsh.model.mesh.classifySurfaces(angle * math.pi / 180., includeBoundary, forceParametrizablePatches, curveAngle * math.pi / 180.) gmsh.model.mesh.createGeometry() s = gmsh.model.getEntities(2) l = gmsh.model.geo.addSurfaceLoop([e[1] for e in s]) gmsh.model.geo.addVolume([l]) gmsh.model.geo.synchronize() f = gmsh.model.mesh.field.add("MathEval") gmsh.model.mesh.field.setString(f, "F", "0.5") gmsh.model.mesh.field.setAsBackgroundMesh(f) v = gmsh.model.getEntities(3) gmsh.model.add_physical_group(3, [e[1] for e in v]) gmsh.model.mesh.generate() gmsh.write('Calcium_new.mesh') gmsh.finalize()
请问是否存在通用解决方案,能让所有几何模型正常处理,或在重网格过程中处理这类自相交问题?
解决方案
1. 预处理修复STL模型的自相交问题
STL文件的自相交是核心诱因,先做几何清理与修复:
- 调用Gmsh内置工具清理冗余:合并STL后,执行
gmsh.model.mesh.removeDuplicateNodes()和gmsh.model.mesh.removeDuplicateElements()清除重复节点与单元;开启gmsh.option.setNumber('Geometry.RepairSelfIntersections', 1)让Gmsh自动尝试修复自相交面。 - 调整曲面分类参数:降低
angle值(比如从120调到90),让曲面拆分更精细,减少合并后的相交概率;将includeBoundary设为True,确保边界曲线被正确识别,避免曲面拼接错误。
2. 调整3D网格生成策略
- 切换3D网格算法:当前使用的算法4(Frontal-Delaunay)对复杂几何适应性有限,可尝试算法1(Delaunay)或算法5(Frontal-Delaunay for Quads),添加代码:
gmsh.option.setNumber('Mesh.Algorithm3D', 1) - 启用容错参数:设置
gmsh.option.setNumber('Mesh.ToleranceInitialDelaunay', 1e-3)(根据模型尺寸调整阈值),放宽Delaunay三角化的容错度;开启gmsh.option.setNumber('Mesh.KeepOnlyVisibleEntities', 1),过滤内部无效几何实体。
3. 验证并修正几何拓扑
在生成体网格前,提前排查拓扑问题:
- 检查曲面环有效性:调用
gmsh.model.geo.checkSurfaceLoop(l),返回0表示曲面环闭合有效,非0则需检查曲面法向是否统一(Gmsh要求曲面环法向一致指向体外)。 - 手动调整曲面法向:若法向错乱,使用
gmsh.model.geo.reverseSurface(surf_id)反转单个曲面法向,确保曲面环方向统一。
4. 自适应网格尺寸约束
针对局部相交区域,用自适应尺寸细化网格降低相交概率:
- 替换固定背景场为基于曲面距离的自适应场:
f = gmsh.model.mesh.field.add("Distance") gmsh.model.mesh.field.setNumbers(f, "SurfacesList", [e[1] for e in s]) gmsh.model.mesh.field.setNumber(f, "Sampling", 100) gmsh.model.mesh.field.setAsBackgroundMesh(f)
内容的提问来源于stack exchange,提问作者Nicola Belpiede
相关产品推荐
相关产品推荐

