开源软件FREEFEM++,有限元(开源有限元软件介绍)
#开源软件# 。用有限元软件Freefem 和工程作图软件 Tecplot 来完成有限元中偏微分方程求解。该有限元软件只需要写出有限元的变分形式,利用 自身的命令函数,即可实现 C 语言或者 Matlab 编制的数百行代码的功能。FreeFem 软件是一款数值求解偏微分方程的有限元软件。它是一款免费的软件,完全可以直接在http://www.freefem.org这个网站上下载安装包,并自带教程。很容易通过教程编制 FreeFem 有限元程序来数值求解偏微分方程。FreeFem 不是一个工具包,而是一个完整的有限元产品,具有内存需求少、计算速度快、易学好用、功能强大、应用面广等特点。
real m = 50; / / 设置网格尺度
meshTh=square(m,m);//生成一致网格 fespaceXh(Th,P2);//定义速度的有限元空间 fespaceMh(Th,P1);//定义压力的有限元空间 Xhu1,u2,v1,v2,ooldu1,ooldu2;//声明试探函数和检验函数
Mhp,q;//声明压力的试探函数和检验函数
realepsi=1e-6,TOL=1,n1;//定义相关的参
数
ofstreamout(“theFEforStokes.txt”);//定义计算结果输出到的 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”);//计算结果的可视化
这样就完成了采用 FreeFem 软件求解的全部过程。
使用该软件进行编程、数值求解偏微分方程时,只需要写出原偏微分方程的变分问题即可,无需进行单元局部和总体的编号、单元刚度矩阵和单元荷载向量的计算、总刚度矩阵和总荷载向量的组成、有限元线性方程组的求解等具体过程。采用“fespaceXh (Th,P2)”和“fespaceMh(Th,P1)”这段语句就完成了有限元空间的定义,并且使用“int2d( Th) ”这个命令就实现了数值积分的功能。寥寥数行即完成了对Stokes方程第一类边值问题的有限元求解。对比使用 C或者 Matlab编程需几百行的代码,FreeFem 程序大大节约了编程时间。
但是, FreeFem 自带的画图命令plot,所显示的图形并不完善。左图对速度的作图已经超出了边框; 右图压力的结果表示也不丰满。一种工程上的作图软件来克服 FreeFem 自带画图功能的缺陷。
基于 Tecplot 的可视化显示方法。主要是根据一个数据文件来实现
可视化操作,最终完成数值结果的工程作图。在 Freefem 程序的后面增加以下代码,使有限元数值结果输出成一个数据文件。这里需要两个文件,一个存储压力,另一个存速度数据。数据输出代码如下:
ofstreamffu(“UV_new.dat”);//定义速度的存
储文件名
ofstreamffp(“P_new.dat”);//定义压力的存
储文件名
ffp<<“Variables=”<<“X”<<“,”<<
“Y”<<“,”<<“P”<<endl;//压力结果及对应
坐标
ffp<<“Zone”<<“”<<“N=”<<Th.nv<
<“,”<<“E=”<<Th.nt<<“,”
<<“F=FEPOINT,ET=TRIANGLE”<<
endl;//输出单元局部编码和整体编码的对应关系ffu<<“Variables=”<<“X”<<“,”<<“Y”<<“,”<<“u”<<“,”<<“v”<<endl;
//速度结果及对应坐标
ffu<<“Zone”<<“”<<“N=”<<Th.nv<
<“,”<<“E=”<<Th.nt<<“,”
<<“F=FEPOINT,ET=TRIANGLE”<<
endl;
inti,j;
for(i=0;i<Th.nv;i )//具体输出每个单元上的速度结果及对应坐标
{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 )//具体输出每个单元的局部编码
{for(j=0;j<3;j )
{ffu<<Th[i][j] 1<<“”;ffp<<Th[i][j] 1<<“”;
}
if(j==3)
{ffu<<endl;ffp<<endl;
}
}
这样就得到了两个数据件“UV_new.dat”和“P_new.dat”。再利用Tecplot做图软件,进行一系列的可视化操作,就可以得到的有限元方法数值解。