Gmsh 是一个强大的三维有限元网格生成器,具有内置的 CAD 引擎和后处理功能。虽然 Gmsh 提供了丰富的图形用户界面(GUI)和
.geo
脚本语言来创建几何模型和生成网格,但在某些复杂场景下,这些工具可能无法完全满足我们的建模需求。为了应对这些挑战,Gmsh 还提供了强大的 Python API,允许用户通过编写脚本进行更加灵活和高效的几何建模和网格生成。本文将通过一个简单的例子,介绍如何使用 Gmsh 的 Python API 创建几何模型、生成网格并保存结果。
安装和运行 Gmsh
作为独立应用程序使用
Gmsh 可以作为一个独立的应用程序使用,可以通过以下几种方式进行控制:
图形用户界面(GUI):通过 Gmsh 的图形用户界面进行操作。
命令行接口:通过命令行参数控制 Gmsh。
.geo 脚本文件:编写
.geo
脚本文件来定义几何模型和网格生成过程。ONELAB 接口:通过 Unix 或 TCP/IP 套接字与 Gmsh 应用程序进行交互。
二进制版本的 Gmsh 应用程序可以在Gmsh 官方网站(参考资料[1])下载,适用于 Windows、Linux 和 macOS 系统。此外,一些 Linux 发行版也提供了 Gmsh 应用程序。如需从源代码编译 Gmsh 应用程序,请参阅官方文档中的编译指南。
作为库使用
Gmsh 不仅可以作为独立应用程序使用,还可以作为库嵌入外部代码中。Gmsh 提供了 C++、C、Python、Julia 和 Fortran 的 API。二进制软件开发工具包(SDK)包含动态 Gmsh 库及其关联的头文件和模块文件,可以从Gmsh 官方网站(参考资料[1])下载,适用于 Windows、Linux 和 macOS 系统。
Python 用户可以使用以下命令安装 Gmsh:
pip install --upgrade gmsh
这将下载二进制 SDK 并将文件安装到适当的系统目录中。一些 Linux 发行版也提供了 Gmsh SDK。如需从源代码编译动态 Gmsh 库,请参阅官方文档中的编译指南。
示例代码
1.导入必要的模块
首先,导入 Gmsh 的 Python API 模块和系统模块:
import gmsh
import sys
2.初始化 Gmsh
在使用任何 Gmsh API 函数之前,必须先初始化 Gmsh:
gmsh.initialize()
3.添加模型
接下来,添加一个名为 "t1" 的新模型。如果未显式调用 gmsh.model.add()
,Gmsh 会自动创建一个无名模型:
gmsh.model.add("t1")
4.创建几何实体
4.1 创建点
使用 gmsh.model.geo.addPoint()
函数创建四个点。前三个参数是点的坐标 (x, y, z)
,第四个参数是目标网格大小 lc
,最后一个参数是点的标签(唯一正整数)。如果没有提供标签,Gmsh 会自动分配一个标签并返回:
lc = 1e-2
gmsh.model.geo.addPoint(0, 0, 0, lc, 1)
gmsh.model.geo.addPoint(.1, 0, 0, lc, 2)
gmsh.model.geo.addPoint(.1, .3, 0, lc, 3)
p4 = gmsh.model.geo.addPoint(0, .3, 0, lc)
4.2 创建直线
使用 gmsh.model.geo.addLine()
函数创建四条直线。前两个参数是直线的起点和终点的标签,第三个参数是直线的标签(唯一正整数):
gmsh.model.geo.addLine(1, 2, 1)
gmsh.model.geo.addLine(3, 2, 2)
gmsh.model.geo.addLine(3, p4, 3)
gmsh.model.geo.addLine(4, 1, p4)
4.3 创建曲线环
使用 gmsh.model.geo.addCurveLoop()
函数创建一个曲线环。参数是一个包含曲线标签的列表,负号表示曲线的方向相反:
gmsh.model.geo.addCurveLoop([4, 1, -2, 3], 1)
4.4 创建平面
使用 gmsh.model.geo.addPlaneSurface()
函数创建一个平面表面。参数是一个包含曲线环标签的列表:
gmsh.model.geo.addPlaneSurface([1], 1)
5. 同步几何数据
同步几何数据,使几何实体可用于网格生成和其他操作:
gmsh.model.geo.synchronize()
当使用 Gmsh 的 Python API 创建几何实体(如点、线、面等)时,这些操作实际上是构建了一个内部的数据结构。然而,这些数据结构在内存中并没有立即被 Gmsh 的核心引擎所识别和处理。gmsh.model.geo.synchronize()
函数的作用就是将这些内部数据结构同步到 Gmsh 的核心引擎中,使其能够被进一步使用。
6. 创建物理组
物理组用于将几何实体分组,以便在输出文件中更容易管理和识别。创建物理组的函数是 gmsh.model.addPhysicalGroup()
:
gmsh.model.addPhysicalGroup(1, [1, 2, 4], 5)
gmsh.model.addPhysicalGroup(2, [1], name="My surface")
7. 生成网格
生成二维网格:
gmsh.model.mesh.generate(2)
8. 保存网格文件
将生成的网格保存到文件 t1.msh
中:
gmsh.write("t1.msh")
9. 可选:强制保存所有元素
如果希望保存所有网格元素(无论是否属于物理组),可以设置 Mesh.SaveAll
选项为 1:
# gmsh.option.setNumber("Mesh.SaveAll", 1)
10. 可选:保存不同格式的网格文件
可以保存不同格式的网格文件,例如 UNV 格式,或者指定 MSH 文件的版本:
# gmsh.write("t1.unv")
# gmsh.option.setNumber("Mesh.MshFileVersion", x)
11. 显示模型
如果命令行参数中没有 -nopopup
,则运行 Gmsh 的图形用户界面显示模型:
if '-nopopup' not in sys.argv:
gmsh.fltk.run()
12. 结束 Gmsh
结束 Gmsh,释放资源:
gmsh.finalize()
上面的代码保存为一个文件,执行完该脚本后,出现gmsh的程序界面:
总结
通过上述步骤,我们成功使用 Gmsh 的 Python API 创建了一个简单的几何模型,生成了网格,并将其保存到文件中。Gmsh 的 Python API 提供了丰富的功能,使得几何建模和网格生成变得更加灵活和高效。更多详细信息请参考 Gmsh 的官方文档。
参考资料
[1]https://gmsh.info/#Download
[2]https://gmsh.info/dev/doc/texinfo/gmsh.html#t1
推荐阅读