開源軟件FREEFEM++,有限元(開源有限元軟件介紹)
#開源軟件# 。用有限元軟件Freefem 和工程作圖軟件 Tecplot 來完成有限元中偏微分方程求解。該有限元軟件只需要寫出有限元的變分形式,利用 自身的命令函數(shù),即可實(shí)現(xiàn) C 語言或者 Matlab 編制的數(shù)百行代碼的功能。FreeFem 軟件是一款數(shù)值求解偏微分方程的有限元軟件。它是一款免費(fèi)的軟件,完全可以直接在http://www.freefem.org這個(gè)網(wǎng)站上下載安裝包,并自帶教程。很容易通過教程編制 FreeFem 有限元程序來數(shù)值求解偏微分方程。FreeFem 不是一個(gè)工具包,而是一個(gè)完整的有限元產(chǎn)品,具有內(nèi)存需求少、計(jì)算速度快、易學(xué)好用、功能強(qiáng)大、應(yīng)用面廣等特點(diǎn)。
real m = 50; / / 設(shè)置網(wǎng)格尺度
meshTh=square(m,m);//生成一致網(wǎng)格 fespaceXh(Th,P2);//定義速度的有限元空間 fespaceMh(Th,P1);//定義壓力的有限元空間 Xhu1,u2,v1,v2,ooldu1,ooldu2;//聲明試探函數(shù)和檢驗(yàn)函數(shù)
Mhp,q;//聲明壓力的試探函數(shù)和檢驗(yàn)函數(shù)
realepsi=1e-6,TOL=1,n1;//定義相關(guān)的參
數(shù)
ofstreamout(“theFEforStokes.txt”);//定義計(jì)算結(jié)果輸出到的 TXT 文件
solveStokes([u1,u2,p],[v1,v2,q])=//定義偏微分方程,即變分形式
int2d( Th) ( dx ( u1 ) * dx ( v1 ) dy ( u1 ) * dy ( v1) dx( u2) * dx( v2) dy( u2) * dy( v2) / / a (u,v)
-p*(dx(v1) dy(v2))//b(v,p)
q*(dx(u1) dy(u2)))//b(u,q)
on(1,2,3,4,u1=0,u2=0) on(3,u1=1,u2
= 0) ; / / 定義邊界條件
plot([u1,u2],ps=“u1u2.eps”);
plot(p,ps=“p.eps”);//計(jì)算結(jié)果的可視化
這樣就完成了采用 FreeFem 軟件求解的全部過程。
使用該軟件進(jìn)行編程、數(shù)值求解偏微分方程時(shí),只需要寫出原偏微分方程的變分問題即可,無需進(jìn)行單元局部和總體的編號、單元?jiǎng)偠染仃嚭蛦卧奢d向量的計(jì)算、總剛度矩陣和總荷載向量的組成、有限元線性方程組的求解等具體過程。采用“fespaceXh (Th,P2)”和“fespaceMh(Th,P1)”這段語句就完成了有限元空間的定義,并且使用“int2d( Th) ”這個(gè)命令就實(shí)現(xiàn)了數(shù)值積分的功能。寥寥數(shù)行即完成了對Stokes方程第一類邊值問題的有限元求解。對比使用 C或者 Matlab編程需幾百行的代碼,F(xiàn)reeFem 程序大大節(jié)約了編程時(shí)間。
但是, FreeFem 自帶的畫圖命令plot,所顯示的圖形并不完善。左圖對速度的作圖已經(jīng)超出了邊框; 右圖壓力的結(jié)果表示也不豐滿。一種工程上的作圖軟件來克服 FreeFem 自帶畫圖功能的缺陷。
基于 Tecplot 的可視化顯示方法。主要是根據(jù)一個(gè)數(shù)據(jù)文件來實(shí)現(xiàn)
可視化操作,最終完成數(shù)值結(jié)果的工程作圖。在 Freefem 程序的后面增加以下代碼,使有限元數(shù)值結(jié)果輸出成一個(gè)數(shù)據(jù)文件。這里需要兩個(gè)文件,一個(gè)存儲壓力,另一個(gè)存速度數(shù)據(jù)。數(shù)據(jù)輸出代碼如下:
ofstreamffu(“UV_new.dat”);//定義速度的存
儲文件名
ofstreamffp(“P_new.dat”);//定義壓力的存
儲文件名
ffp<<“Variables=”<<“X”<<“,”<<
“Y”<<“,”<<“P”<<endl;//壓力結(jié)果及對應(yīng)
坐標(biāo)
ffp<<“Zone”<<“”<<“N=”<<Th.nv<
<“,”<<“E=”<<Th.nt<<“,”
<<“F=FEPOINT,ET=TRIANGLE”<<
endl;//輸出單元局部編碼和整體編碼的對應(yīng)關(guān)系ffu<<“Variables=”<<“X”<<“,”<<“Y”<<“,”<<“u”<<“,”<<“v”<<endl;
//速度結(jié)果及對應(yīng)坐標(biāo)
ffu<<“Zone”<<“”<<“N=”<<Th.nv<
<“,”<<“E=”<<Th.nt<<“,”
<<“F=FEPOINT,ET=TRIANGLE”<<
endl;
inti,j;
for(i=0;i<Th.nv;i )//具體輸出每個(gè)單元上的速度結(jié)果及對應(yīng)坐標(biāo)
{ffp<<Th(i).x<<“”<<Th(i).y<<“”
<<p(Th(i).x,Th(i).y)<<endl;
ffu<<Th(i).x<<“”<<Th(i).y<<“”
<<u1(Th(i).x,Th(i).y)<<“”<<u2(Th
(i).x,Th(i).y)<<endl;
}
for(i=0;i<Th.nt;i )//具體輸出每個(gè)單元的局部編碼
{for(j=0;j<3;j )
{ffu<<Th[i][j] 1<<“”;ffp<<Th[i][j] 1<<“”;
}
if(j==3)
{ffu<<endl;ffp<<endl;
}
}
這樣就得到了兩個(gè)數(shù)據(jù)件“UV_new.dat”和“P_new.dat”。再利用Tecplot做圖軟件,進(jìn)行一系列的可視化操作,就可以得到的有限元方法數(shù)值解。