一步一步学习使用Gmsh1简介下面我们讨论的是Gmsh所附带的例子。这些例子使用C和C++的方式进行了比较详细的注释,Gmsh的各种用法被逐渐引进来,我们从t1.geo开始1。为了使用Gmsh来运行这些例子,我们有两种方案(事实上,运行的方式根据操作系统的不同会有更多的不一样,我们假设您是在一个类UNIX操作系统的Shell中来运行)。第一种运行Gmsh的方式是交互式的图形界面方式,您只需要在命令行下键入$gmsh就可以了。软件会打开两个窗口:一个是图形窗口,其中有一个位于底部的状态条;另一个是菜单窗口,其中有一个菜单条和一些和上下文有关的按钮。您选择File-Open菜单,就能够去选择打开t1.geo这个文件。为了能够产生网格,您在Module菜单中选择Mesh,然后在上下文相关的按钮中选择您想要的维数,其中1D会在所有的线上分布网格、2D会将所有的表面上产生网格、3D会在所有的立体中产生网格。您再选择保存,就能够将获得的网格存储起来。您还可以在菜单中选择存储的形式。存储的文件的文件名一般是输入文件的主文件名加上和存储格式有关的扩展名。2另外一个交互式运行Gmsh的方法更加方便,您可以直接在命令行上加参数运行$gmsht1.geo34另一个运行Gmsh的模式是非交互的模式。在这种模式下,没有图形界面,所有的操作都是非交互的。比如您想对于第一个例子产生二维的网格,您可以敲入$gmsht1.geo-2如果您想基于一个已有的背景网格'bgmesh.pos'来产生出网格,您就可以使用$gmsht1.geo-2-bgm-bgmesh.pos5Gmsh能够同时读入好几个文件。第一个文件定义了这个项目,其他文件都被附加在其后。您可以使用File-Merge菜单来将这些文件合并到一起,当然,命令行也能做这件事情。这个功能对于后处理是有用的。比如,使用命令$gmsht1.geoview1.posview2.pos就能够将后处理视图'view1.pos'和'view2.pos'与第一个例子't1.geo'合并起来。在Post-Processing模块中,会出现两个按钮,分别叫做ascalarmap和avectormap。左键点击按钮就会看到相应的视图,右键点击则会出现该视图的选项。如果您希望对于一个视图的选项的修改能够应用到所有的视图上,选择'Applynextchangetoallviews'或者'Forcesameoptionsforallview'就可以了,这些功能在菜单Options-Post-proccessing中。6[1]这个说明中没有解释网格和后处理文件的格式。请在FORMATS文件中找到相应的内容。[2]几乎所有的交互式命令都有快捷键。您在菜单Help-Shortcuts可以看到这些快捷键都是什么。[3]扩展名.geo可以去掉。[4]虽然直接在输入文件中定义变量和点非常方便,如果您通过交互的方式来定义曲线、表面和立体会觉得更加方便。请在模块Geometry中根据上下文相关按钮来完成这样的操作。比如您想加入一条样条曲线,您可以选择下面的按钮序列:Elementary-Add-New-Spline。然后在图形窗口的状态条中就会被要求选择一系列的点,然后点击'e'完成选择(点击'q'取消)。当整个的交互式命令完成后,您打开的文件的尾部就会添加上一个字符串来描述这条曲线。[5]如果您想使用背景网格,请阅读'bgmesh.pos'中的注释。[6]所有的交互式输入的选项也都能够通过文本输入文件实现。所有的有效选项以及它们当前的值,能够使用选择菜单File-Saveas-Geometry-Gmshcurrentoptions来存储到文件中。直接点击状态条上的问号'?'也能达到同样的效果。如果您想将现在的选项保存起来作为缺省的偏好设置,以便将来启动Gmsh时使用,请使用Options-Saveoptionsnow菜单。例子1/***********************************************************************Gmshtutorial1**变量,基本实体,物理实体,背景网格**********************************************************************///Gmsh中所有几何体的描述使用是一种类似于C的语言。最简单的//构造这种语言的方法是affectation.//所有的命令都使用分号结尾。下面的行定义了一个叫做'lc'的变//量,并且设置其值为0.007:lc=0.007;//这个新创建的变量能够被用来定义一个Gmsh的基本实体:一个点//'Point'。一个点能够用四个数的表来表示,包括它的坐标x,y,z//以及一个特征长度用来指定该点处产生出来的网格尺度:Point(1)={0,0,0,9.e-1*lc};//网格尺度指的是网格中线段的长度、三角形的外接圆的半径和四面//体的外接球的半径。实际上的网格尺度的分布是使用的预先指定的//点上的特征尺度通过插值得到的。指定特征长度还有其他方法:比//如吸引子(参考t7.geo)和背景网格(参考bgmesh.pos)。//如同上面的这个定义,更加复杂的表达式也能够通过变量构造出来。//这里,上面的变量'lc'被乘上了常数9.e-1作为了上面定义这个//点的第四个参数。////下面的一般的语法规则能够应用到定义所有的几何实体上:////“如果一个数定义了一个新的实体,它就是放在一对小括号//中,如果一个数引用了一个以前定义的实体,那么它就是//放在一对花括号中。”////下面我们又定义了三个点:Point(2)={.1,0,0,lc};Point(3)={.1,.3,0,lc};Point(4)={0,.3,0,lc};//Gmsh中的第二种基本几何实体是曲线。直线是曲线中最简单的一//种。一条直线可以用一串点定义出来,比如下面的Line1是从//点1出发的,到点2截止:Line(1)={1,2};Line(2)={3,2};Line(3)={3,4};Line(4)={4,1};//第三种基本实体是曲面。为了使用上面的四条线定义一个简单的//矩形曲面,我们要先定义一个曲线闭环(lineloop)。一个曲线闭//环是一串连接着的线,每条线上都带着一个符号,用来表示这条//线的方向。LineLoop(5)={4,1,-2,3};//Thesurfaceisthendefinedasalistoflineloops(onlyone//here)://然后这个曲面就能够使用一系列的曲线闭环来定义了(这里只有//一个):PlaneSurface(6)={5};//这时候,Gmsh知道所有的关于怎么显示这个矩形曲面和布上网格//的信息。但是我们还需要提供对网格中不同的元素(包括点、线、//三角形)指定区域指标(regionnumber)。这可以通过定义物理实体//的方法实现。物理实体能够将网格中的元素分成组,给定一个区//域指标,并指定其定向。////比如,下面我们就将点1和点2组合到物理实体1中了:PhysicalPoint(1)={1,2};//从而,两个元素会被同时输出到输出文件中,并具有区域指标1。//对于曲线和曲面,也能这样指定相应的区域指标:PhysicalLine(10)={1,2,4};MySurface=100;PhysicalSurface(MySurface)={6};//所有的在剖分曲线1、2、4的时候产生的线元素都会被存储为区域//指标为10,所有在剖分曲面6时产生的三角形都具有区域指标100。////如果没有定义物理实体,网格中所有的元素都被直接存储为缺省的//定向,其区域指标为它们的基本区域指标。请参考FORMATS文件//了解网格和后处理的格式。例子2/***********************************************************************Gmshtutorial2**文件包含、几何变换、几何体推移、立体的几何实体和物理实体**********************************************************************///我们可以使用Include将第一个例子包含进来作为这里的基础:Includet1.geo;//为了能够从前面的t1.geo中建立更加复杂的几何体,有几个可能的方式。////我们可以先加入新的点、线、曲面,就象在t1.geo中做的那样:Point(5)={0,.4,0,lc};Line(5)={4,5};//我们还可以通过几何变换来移动、加入或者推移基本的几何实体。比如,//我们可以将点3向左移动0.05:Translate{-0.05,0,0}{Point{3};}//得到的这个点能够复制一个并沿着y轴移动0.1:Translate{0,0.1,0}{Duplicata{Point{3};}}//当然,移动、旋转和推移命令不光能够用在点上,也能够用在曲线和曲//面上。下面的命令就是将t1.geo中曲面6和一个新的曲面11沿着z//轴推出去'h':h=0.12;ExtrudeSurface{6,{0,0,h}};Line(7)={3,6};Line(8)={6,5};LineLoop(10)={5,-8,-7,3};PlaneSurface(11)={10};ExtrudeSurface{11,{0,0,h}};//所有的几何变换自动的会产生新的几何体,下面的命令允许手工指定//自动产生的点的特征长度:CharacteristicLength{6,22,2,3,16,12}=lc*2;//如果说变换工具对于产生复杂的几何体非常方便的话,有时候产生一个//和已有的几何实体相同的平面几何体也是非常有用的。这可以通过菜单//File-Saveas-Geometry-Gmshunrolledgeometry或者命令行////$gmsht2.geo-0////来实现。//立体是Gmsh中的第四种基本几何体。和先定义了闭环曲线再定义曲面//一样,我们现在需要先定义闭环曲面(sufaceloop)。下面的立体是一//个单连通的,没有洞的体(所以只需要一个闭环曲面来定义它):SurfaceLoop(145)={121,11,131,135,139,144};Volume(146)={145};SurfaceLoop(146)={121,6,109,113,117,122};Volume(147)={146};//我们定义下面的物理立体实体使得所有剖分得到的四面体具有区域指标1:PhysicalVolume(1)={146,147};//恭喜了!您现在已经得到了您的第一个无结构的三维四面体网格!例子3/***********************************************************************Gmshtutorial3**网格推移、选项**********************************************************************///我们还是先将例子1包含进来:Includet1.geo;//和't2.geo'中一样,我们也做一个沿着z骤的推移:h=0.1;//和't2.geo'中不同的是,我们不仅仅推移了几何体,而且推移了二维的//网格。命令还是相同的Extrude,但是通过设置层数(这里,我们有四层,//分别是8,4,2,1个单元深度),立体数(从9000到9003)以及相应//的高度为h/4来实现了网格的推移:ExtrudeSurface{6,{0,0,h}}{Layers{{8,4,2,1},{9000:9003},{0.25,0.5,0.75,1}};};//和用平移进行推移一样,我们也可以使用一个旋转来进行推移,