Gmsh简介

Gmsh is a free 3D finite element mesh generator with a built-in CAD engine and post-processor. Its design goal is to provide a fast, light and user-friendly meshing tool with parametric input and advanced visualization capabilities. Gmsh is built around four modules: geometry, mesh, solver and post-processing. The specification of any input to these modules is done either interactively using the graphical user interface, in ASCII text files using Gmsh’s own scripting language (.geo files), or using the C++, Python or C API.

—- www.gmsh.info/

Gmsh 是一个开源的具有内置 CAD 引擎和后期处理子的三维有限元网格生成器. 它的目的是提供一个快速的, 轻量级的, 用户友好的网格工具, 并且具有参数化输入和后期可视化能力. 目前 Gmsh 具有四个模块: 几何模块, 网格模块, 解子模块和后期处理模块, 且所有模块的使用都可以通过两种方式: 命令行和 GUI. 有限元网格生成工具有很多种, 比如MeshGen, Hypermesh, 以及一个 MATLAB 小工具 DistMesh, 等等. 可选择性很多, 但很多时候把时间浪费在学习工具的使用上面是不明智的, 工具有一个就够了. 还有一个更实际的问题, 作为一个没有固定收入的学生来说, 一个开源免费实用的软件是多么重要!

Gmsh主页 http://gmsh.info/, 有 Linux, Mac 和 Windows 版本可用, 并且在下载的安装包的 tutorial 目录包含一个介绍关键概念和一些实例的教程.

Gmsh是三维网格生成器, 所以三维空间里的点, 线, 面, 体都被看作网格里的单元, 例如可以通过如下语句定义一个点元:

Point(1) = {0.0, 0.0, 0.0, lc2};

如果仅仅是这样的话, 在之后生成的 .msh 文件中是不会把这个点看作网格中的一个物理单元记录下它的数据的, 即在保存的 .msh 文件中不会在数据块 $Elements $EndElements 里出现该点信息. 不过我们可以通过如下语句把这个点元升级为一个物理点元:

Physical Point(1) = {1};

那么数据块 $Elements $EndElements 中就会多出如下该点(作为一个点元出现)的信息:

$Elements
1 15 2 1 1 1
****
$EndElements

关于单元和物理实体的区别, 以及引入物理实体这个概念的好处在官方手册 6.2 节 http://gmsh.info/doc/texinfo/gmsh.html 有比较详细的描述.

一个简单的例子

 /*********************************************************** 
* Gmsh Example 1
* Uniform or non-uniform triangular on [0,1]×[0,1] 
***********************************************************/ 
// Define new variables `lc', ‘lc2’:
lc = 0.5;
lc2 = 0.5; // lc,lc2 - Control size of elements around points

// Define Gmsh's simplest `elementary entity', a `Point', consisting of 
// three coordinates (X, Y and Z), and a characteristic length (lc) that 
// sets the target element size at the point:

Point(1) = {0.0, 0.0, 0.0, lc2};
Point(2) = { 1.0, 0.0, 0.0, lc}; // Define new points 
Point(3) = { 1.0, 1.0, 0.0, lc};
Point(4) = {0.0, 1.0, 0.0, lc};

// Curves are Gmsh's second type of elementery entities, and straight 
// lines are the simplest. The following command defines a straight 
// line 1, starting at point 1 and ends at point 2:
Line(1) = {1, 2};
Line(2) = {2, 3}; 
Line(3) = {3, 4}; 
Line(4) = {4, 1};

// The third elementary entity is the surface. To define a surface,
// square in this script, a line loop has first to be defined.
// A line loop is a list of connected lines, a sign(+/-) being
// associated with each line (depending on the orientation of the line): 
Line Loop(5) = {1,2,3,4};

// We can then define the surface as a list of line loops Plane Surface(6) = {5};
// Define a physical entity, all the triangular elements (all other
// points, lines will not, unless states them as physical entities)
// resulting from the discretization of surface 1 will be saved in .msh file. 
Physical Surface(1) = {6} ;

生成的网格 .msh 文件如下:

$MeshFormat
2.2 0 8
$EndMeshFormat
$Nodes
13
1 0 0 0
2 1 0 0
3 1 1 0
4 0 1 0
5 0.499999999998694 0 0
6 1 0.499999999998694 0
7 0.5000000000020591 1 0
8 0 0.5000000000020591 0
9 0.5 0.5 0
10 0.2500000000010295 0.7500000000010295 0
11 0.7500000000005148 0.7499999999996735 0
12 0.749999999999432 0.249999999999432 0
13 0.2499999999989704 0.2500000000010296 0
$EndNodes
$Elements
16
1 2 2 1 6 13 10 8
2 2 2 1 6 9 10 13
3 2 2 1 6 4 10 7
4 2 2 1 6 1 13 8
5 2 2 1 6 3 11 6
6 2 2 1 6 2 12 5
7 2 2 1 6 7 10 9
8 2 2 1 6 7 9 11
9 2 2 1 6 6 11 9
10 2 2 1 6 5 9 13
11 2 2 1 6 5 12 9
12 2 2 1 6 6 9 12
13 2 2 1 6 1 5 13
14 2 2 1 6 2 6 12
15 2 2 1 6 4 8 10
16 2 2 1 6 3 7 11
$EndElements
  • 节点数据存储在 $Nodes $EndNodes, 每一行存储的信息依次为(节点编号, 三维坐标: x, y, z);
  • 单元数值存储在 $Elements $EndElements, 每一行的第一列为三角单元编号, 最后三列为对应的三个节点, 其它列的意义具体可以查看 Gmsh 的帮助文档.

发表评论

电子邮件地址不会被公开。 必填项已用*标注