使用Gmsh画非均匀网格

Gmsh简介

Gmsh是一款开源的三维非结构有限元网格生成软件. 它内置了前后处理的模块以及高阶网格生成工具. Gmsh有图形和脚本两种模式,用户可以快速生成简单的有限元网格. Gmsh是高精度格式求解器最常用的前处理软件.

使用Gmsh时, 用户首先定义几何模型, 然后Gmsh将自动生成网格, 最后用户可以根据需要选择分区等后处理功能. Gmsh的几何生成和其他常用的CAD软件类似, 都是先由点生成线, 再到面, 最后生成体. 有了几何模型之后, 下一步是可以利用Gmsh的选项生成非结构的网格. 最后是后处理的阶段. 所有这些操作都是可以通过脚本实现.

下面以几个简单例子说明Gmsh脚本的编写

例子

均匀网格

均匀网格是一个最简单的例子. 下面是一个区域为正方形均匀网格. 脚本代码如下:
    xmin = -0.5;                                 
    xmax = 0.5;                                  
    ymin = 0;                                    
    ymax = 1;                                    
    NX = 16;                                     
    NY = 16;                                     
    Point (1) = {xmin, ymin, 0};//设置点         
    Point (2) = {xmax, ymin, 0};                 
    Point (3) = {xmax, ymax, 0};                 
    Point (4) = {xmin, ymax, 0};                 

    Line (1) = {1,2};//连线                      
    Line (2) = {2,3};                            
    Line (3) = {3,4};                            
    Line (4) = {4,1};                                                                     
    Transfinite Line {1,-3} = NX+1;//在线上布置点
    Transfinite Line {2,-4} = NY+1;              

    Line Loop (1) = {1,2,3,4};//将封闭的线连成面 
    Plane Surface (1) = {1};//生成面             

    Transfinite Surface {1};//网格生成           
    Recombine Surface {1};//得到结构       
Gmsh脚本语言的语言和C语言类似. 脚本的内容也是按照定义几何, 生成网格, 后处理等步骤编写的. 本例中, 区域是边长为1的正方形. 每个边上有16个点. 最终生成256个四边形网格. 

非均匀网格

上边是最简单的Gmsh网格生成例子, 几何都是通过自己定义得到的. 这在几何比较简单的时候是可行的, 如果几何非常复杂, 使用这种方式将非常繁琐. Gmsh提供了Extrude的功能, 使编写脚本的效率提高.下面的代码的功能和上面的是一样的.
    N = 16; 
    Point(1) = {-0.5, 0, 0, 0.1};
    line[] = Extrude {1, 0, 0.} {
    Point{1}; Layers{N+1};
    };
    Physical Line(1) = {line[1]};
    surface[] = Extrude {0, 1, 0} {
    Line{line[1]}; Layers{N+1}; Recombine;
    };
现在的脚本,看起来比较简单.
下面一个例子是一个非均匀的例子, 比较复杂.
    N = 1; // INPUT N=p+1
    lc = Pi/nl;
    Point(1) = {-0.5, 0, 0, lc};
    ny = 16;
    r = 1.2^(N/2);
    h0 = 0.5*(1-r)/(1-r^(ny/2));
    h=0.;
    For i In {0:(ny-2)/2}
    h += h0*r^i;
    y[i] = h;
    y[ny-i-2] = 1-h;
    EndFor
    y[ny/2-1] = 0.5;
    y[ny-1] = 1.;
    For i In {0:ny-1}
    layer[i] = 1;
    EndFor
    line[] = Extrude {1, 0, 0.} {
    Point{1}; Layers{ layer[], y[]};
    };

    Physical Line(1) = {line[1]};
    surface[] = Extrude {0.0,1.0,0.0} {
    Line{line[1]}; Layers{ layer[], y[] };Recombine;
    };

你可能感兴趣的:(Gmsh)