写在前面:2012年翻阅某电磁仿真手册时看到一句话,说HFSS之所以能保证工业级精度的秘诀在于网格剖分,当时真理解不了。后来出国两年,以矩量法为基础深入学习计算电磁后,才体会到这句话的真谛,为此这里给大家推荐一个仿真建模的利器,Gmsh,简约但不简单的开源软件。如果精力允许,希望大家尽可能亲自建模离散,再导入商业软件进行仿真,绝对磨刀不误砍柴工! Gmsh是一款有限元网格生成器,包含预处理、求解和后处理三大模块,分别对应于几何建模、网格优化和结果展示三项功能。 打个简单比方,张三准备建一个房子,首先将轮廓线画出来(几何建模),然后计算用多少块转(离散网格),最后再贴瓷砖或刷墙(效果展示)。 下面结合个人经验介绍如何快速入门,假设Gmsh已经下载到本地(http://www./下载,无需安装,点击exe直接运行),找到gmsh.exe和help文件,再快速翻看demos和tutorial两个文件夹。 入门第一步,运行tutorial文件夹example1通过file→open打开t1.geo,出现一个方框。 在导航栏mesh选项下级目录找到2D,点击后方框被离散化,变成了一个网格。 至此,一个简单的长方形贴片被离散化处理,操作基本完成,下面我们看看gmsh是怎样通过脚本建模的。 采用记事本打开t1.geo文件(俗称脚本script),发现罗里吧嗦的一大堆,其实我们需要了解其中四类语句就行了,它们分别是定义参数、点、线、面的命令,如下: 定义参数 lc = 1e-2; 定义点 Point(1) = {0, 0, 0, lc}; 定义线段 Line(1) = {1,2} ; 定义闭合线段Line Loop(5) = {4,1,-2,3} ; 定义面Plane Surface(6) = {5} ; 不难看出gmsh参数化建模的流程:通过参数定义点的属性,连接相应的点构成线段,再连接一系列线段构成封闭的面。 值得指出的是,定义点需要四个变量,前三个是坐标,第四个是用来定义网格剖分疏密的参数,详情请参考脚本注释(//开始,或者/* */之间的内容)。 Gmsh看似简单,其实功能十分强大(通过284页的help文件介绍就知道它有多复杂)。这里介绍几个最为实用的选项设置: (1)菜单tool-》Options选项 Visibility 选项卡里Geometry和Mesh里Visibility包含了点、线、面的显示参数,操作操作看看视图会有什么变化。 (2)菜单tool-》Options选项 一键默认 当你设置参数没有变化,也找不出原因时,恢复默认设置是有效的选择。 (3)菜单tool-》Options选项 脚本重载与编辑 gmsh支持前台和后台双重操作,也就是说,用户可以在后台编辑脚本,然后通过导航栏Geometry下面的Reload重新加载,相应视图会自动更新;用户也可以在前台通过鼠标建模(选点、连线、取面等),对应的命令语句会自动写入对应脚本文件(点击导航栏Geometry下面的Edit file就能自动打开脚本文件,可以非常直观的学习脚本命令,我就是这样入门的)。当然用户也可以混合操作。注意一个细节,gmsh在General选项里面定义了文本编辑软件,如果是windows可以选用记事本,linux可以选用gedit,需要修改时再上网搜索,这里就不啰嗦了。 至此,第一个例子已经介绍完毕,总结一下,我们学习了:
可能有人要问,tutorial文件夹里面还有十几个例子怎么办,学还是不学?如果你还是处于入门阶段,那么剩余的例子没必要学习,可以打开看个新鲜,但是真正研究起来很容易让你望而生畏,因为gmsh能做的事情实在超过你的想象,而我们的需求可能只是全部功能的1%,所以适可而止的保持好奇心。下面,我们开始自己脚踏实地的新建第一个例子。 入门第二步,新建一个例子10个点、17条线、8个面构成一个最简单的房子,脚本代码如下: // mesh parameters lc = 1e-1; // 10 points Point(1) = {-1, -1, 0, lc}; Point(2) = {1, -1, 0, lc}; Point(3) = {1, 1, 0, lc}; Point(4) = {-1, 1, 0, lc}; Point(5) = {-1, -1, 1, lc}; Point(6) = {1, -1, 1, lc}; Point(7) = {1, 1, 1, lc}; Point(8) = {-1, 1, 1, lc}; Point(9) = {-1, 0, 1.5, lc}; Point(10) = {1, 0, 1.5, lc}; // 17 lines Line(1) = {1, 2}; Line(2) = {2, 3}; Line(3) = {3, 4}; Line(4) = {4, 1}; Line(5) = {5, 6}; Line(6) = {6, 7}; Line(7) = {7, 8}; Line(8) = {8, 5}; Line(9) = {10, 6}; Line(10) = {10, 7}; Line(11) = {8, 9}; Line(12) = {9, 5}; Line(13) = {10, 9}; Line(14) = {7, 3}; Line(15) = {8, 4}; Line(16) = {6, 2}; Line(17) = {5, 1}; // 8 faces without bottom Line Loop(18) = {6, 14, -2, -16}; Plane Surface(19) = {18}; Line Loop(20) = {7, 15, -3, -14}; Plane Surface(21) = {20}; Line Loop(22) = {8, 17, -4, -15}; Plane Surface(23) = {22}; Line Loop(24) = {5, 16, -1, -17}; Plane Surface(25) = {24}; Line Loop(26) = {10, -6, -9}; Plane Surface(27) = {26}; Line Loop(28) = {10, 7, 11, -13}; Plane Surface(29) = {28}; Line Loop(30) = {13, 12, 5, -9}; Plane Surface(31) = {30}; Line Loop(32) = {8, -12, -11}; Plane Surface(33) = {32}; 下图是房子的几何外形,对应的点已在图中标出。 点击Mesh-》2D按照默认设置进行离散,得到三角形网格,但是我们想要四边形网格。 修改选项卡设置,合并所有三角形网格,得到四边形网格。 网格是四边形的,但是不够整齐,怎么办? 再次修改选项卡,换一个mesh求解算法。 这次比上次整齐多了,可是网格太密了,适当调稀疏点。 修改mesh参数lc为0.3,效果基本满意。 入门第三步,再接再厉,积累学习通过前面的两个例子,相信大家对Gmsh已经有了基本的掌握,其实入门真的不难,不是吗?基于上述基本技巧,常用建模需求基本可以满足,但是如此强大的软件只学到这里,实在可惜。所以,两点建议:
最后,祝大家Gmsh学得开心,用的顺心。 |
|