有限元网格开源软件GMSH基础

脚本式建模例子
脚本建模的语法网上较多,不做介绍,附一个例子,帮助快速入门。
//////////dimensions of three cylinders
r1=21.09;
l1=27;
r2=15;
l2=4.68;
r3=27;
l3=20;
lc=10;
///////////////////////////////////////////////////////////////////////////
Point(0)={.0,.0,.0,lc};//////// ///局部坐标原点1
Point(1)={r1,.0,.0,lc};
Point(2)={.0,r1,.0,lc};
Point(3)={-r1,.0,.0,lc};
Point(4)={.0,-r1,.0,lc};
Circle(11)={1,0,2};
Circle(12)={2,0,3};
Circle(13)={3,0,4};
Circle(14)={4,0,1};
Line Loop(30)={11,12,13,14}; //环线编号从200开始
Transfinite Line{30}= 100;
Plane Surface(40) = {30}; //面的编号从300开始
Extrude {0.0,.0,l1}{
Surface{40};
}
////////////////////////////////////////////////////////////////////////
Point(10)={.0,.0,l1,lc}; /// ///局部坐标原点2
////////////////////////////////////////////////////////////////////////
Point(50)={r2,.0,l1,lc};
Point(51)={.0,r2,l1,lc};
Point(52)={-r2,.0,l1,lc};
Point(53)={.0,-r2,l1,lc};

 Circle(60)={50,10,51};
 Circle(61)={51,10,52};
 Circle(62)={52,10,53};
 Circle(63)={53,10,50};
 Line Loop(64)={60,61,62,63}; //环线编号从200开始
 Plane Surface(70) = {64};
 Extrude {0,0,l2}{
 Surface{70}; 
 }
 //////////////////////////////////////////////////////////////////////
 Point(80)={0.0,0.0,31.68,lc};   ///局部坐标原点3
 ///////////////////////////////////////////////////////
 Point(100)={r3,.0,l1+l2,lc};
 Point(101)={.0,r3,l1+l2,lc};
 Point(102)={-r3,.0,l1+l2,lc};
 Point(103)={.0,-r3,l1+l2,lc};
 Circle(110)={100,80,101};
 Circle(111)={101,80,102};
 Circle(112)={102,80,103};
 Circle(113)={103,80,100};
  Line Loop(120)={110,111,112,113};
  Plane Surface(121) = {120};
  Extrude {0,0,l3}{
  Surface{121}; 
}

在Gmsh中Ctrl+O 打开“.geo”文件,显示模型如下:
有限元网格开源软件GMSH基础_第1张图片

然后点击菜单中的Mesh->3D 得到画好的网格:
有限元网格开源软件GMSH基础_第2张图片
网格的尺度由代码中的lc变量调整。然后点击菜单栏中的Mesh->Save,就可以自动将画好的网格文件保存为“.msh”文件,文件的格式细心者观察一下大概就知道结构。附一段用于格式化处理的Python程序:

#coding=gbk
def main():
    path='C://Users/Administrator/Desktop/gmshWindows_gr/gmshWindows_gr/'
    fn='MyMode.msh'
    f=open(path+fn)
    rows=f.readlines()
    care=['Nodes','Elements']
    myNodes=[]
    myNodes_file=open(path+'MyMesh/myNodes.txt','w+')
    myElements=[]
    myElements_file=open(path+'MyMesh/myElements.txt','w+')
    myMeshFormat=[]
    myMeshFormat_file=open(path+'MyMesh/myMeshFormat.txt','w+')
    stack=[]
    for row in rows:
         row=row.strip()
         if '$' in row:
             if match(stack,str.lower(row)): 
                 stack.pop()
             else:
                 stack.append(row)
         else:
             fun=stack[-1][1:]
             eval(fun+'(my'+fun+',row,my'+fun+'_file)')
def match(stack,e):
    if not stack:
          return False
    else:
         mat=str.lower(stack[-1])
         if  mat[0]+'end'+mat[1:]==e: # match
              return True
         else:
              return False
def MeshFormat(MeshFormat,row,f):
    pass
def Nodes(Nodes,row,f):
    Nodes.append(row)
    print(row)
    f.write(row+'\n')
def Elements(Elements,row,f):
    Elements.append(row)
    print(row)
    row=row[:].split(' ')
    if len(row)>2 and int(row[1])==4:
        f.write(row[5]+'\t'+row[6]+'\t'+row[7]+'\t'+row[8]+'\n')


if __name__=='__main__':
        main()

在程序中设置好要读取的网格文件路径,运行完成会自动将节点文件和网格单元文件保存。
得到网格之后就可以计算,画图了,MATLAB画图的程序有时间会补充上来。基本的一套由开源软件画网格的流程就这样。
最后,GMSH还是非常强大的,是目前最小的开源画网格的成熟软件,其脚本建模还有很多非常强大的功能,非常钦佩GMSH Designer、以及所有开源创作者开阔的胸怀和无私奉献的精神。

你可能感兴趣的:(GMSH)