【开源有限元网格工具Gmsh】使用 Gmsh的Python API 进行几何建模和网格生成

文摘   2024-11-02 10:37   广西  

Gmsh 是一个强大的三维有限元网格生成器,具有内置的 CAD 引擎和后处理功能。虽然 Gmsh 提供了丰富的图形用户界面(GUI)和 .geo 脚本语言来创建几何模型和生成网格,但在某些复杂场景下,这些工具可能无法完全满足我们的建模需求。为了应对这些挑战,Gmsh 还提供了强大的 Python API,允许用户通过编写脚本进行更加灵活和高效的几何建模和网格生成。本文将通过一个简单的例子,介绍如何使用 Gmsh 的 Python API 创建几何模型、生成网格并保存结果


安装和运行 Gmsh

作为独立应用程序使用

Gmsh 可以作为一个独立的应用程序使用,可以通过以下几种方式进行控制:

  1. 图形用户界面(GUI):通过 Gmsh 的图形用户界面进行操作。

  2. 命令行接口:通过命令行参数控制 Gmsh。

  3. .geo 脚本文件:编写 .geo 脚本文件来定义几何模型和网格生成过程。

  4. 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的程序界面

执行建模脚本,未加-nopopup参数可得到图中的用户界面图形

总结

通过上述步骤,我们成功使用 Gmsh 的 Python API 创建了一个简单的几何模型,生成了网格,并将其保存到文件中。Gmsh 的 Python API 提供了丰富的功能,使得几何建模和网格生成变得更加灵活和高效。更多详细信息请参考 Gmsh 的官方文档。

参考资料

[1]https://gmsh.info/#Download
[2]https://gmsh.info/dev/doc/texinfo/gmsh.html#t1

推荐阅读


挨踢的土木佬
一名学习编程的土木佬,计算固体力学,以第一/通讯作者身份在IJNME、IJSS、力学学报、振动工程学报等权威期刊发表论文若干。热衷分享Python编程、数据处理和数值分析(含有限元)新知,不定期更新文章与笔记。
 最新文章