脚本式建模例子
脚本建模的语法网上较多,不做介绍,附一个例子,帮助快速入门。
//////////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”文件,显示模型如下:
然后点击菜单中的Mesh->3D 得到画好的网格:
网格的尺度由代码中的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、以及所有开源创作者开阔的胸怀和无私奉献的精神。