基于FreeFEM++的有限元编程--1

1 FreeFEM++简介

FreeFEM是开源的有限元模拟系统,有法国利翁斯实验室、埃尔和玛丽居里大学共同开发,在世界范围内广泛使用[i]。VS Code插件商店中有专门针对FreeFEM++的插件方便代码编辑,其lanuch.json的配置如下:

{

    // Use IntelliSense to learn about possible attributes.

    // Hover to view descriptions of existing attributes.

    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387

    "version""0.2.0",

    "configurations": [

        {

            "name""(Windows) Launch",

            "type""cppvsdbg",

            "request""launch",

            "program""D:/Program Files (x86)/FreeFem++/FreeFem++.exe",

            "args": ["-f""${file}"],

            "stopAtEntry"false,

            "cwd""D:/Program Files (x86)/FreeFem++",

            "environment": [],

            "externalConsole"false

        }

    ]

}

 

使用Free FEM++进行有限元模拟包括以下几个步骤。

建模:从DFE的强形式到弱形式,必须知道如何用FreeFEM表示变分形式。

编码:在文本编辑器中用FreeFEM语言编写程序。

运行:通过命令行执行程序代码,比如FreeFem++  mycode.edp,其中mycode.edp为文本文件。

可视化:在mycode.edp文件中直接用plot关键词展示函数,在程序运行过程中显示图像,利用图形参数wait=1可以在每个显示图形的计算步暂停一下。在plot图形显示界面,切换“f”键显示图像的颜色充填或等值线,切换“v”控制是否显示色标。

调试:全局变量debug可以帮助调整程序,使wait=true或wait=false

比如下列程序代码,把debug改为true可以连续的显示图像

//除了内置的plot关键词显示结果,也可以保存问vtk格式,采用paraview等软件查看结果

load "iovtk"  //加载vtk模块,

 

bool debug = true;

 

border a(t=02.*pi){x=cos(t); y=sin(t); label=1;};

border b(t=02.*pi){x=0.3+0.3*cos(t);y=0.3*sin(t);label=2;};

plot(a(50)+b(-30), wait=debug);//plot the borders to see the intersection

//if debug == true, press Enter to continue

 

mesh Th = buildmesh(a(50)+b(-30));

plot(Th, wait=debug);//plot Th then press Enter

 

fespace Vh(Th, P2);

Vh f=sin(pi*x)*cos(pi*y);

Vh g=sin(pi*x+cos(pi*y));

 

plot(f, wait=debug);//plot the function f

plot(g, wait=debug);  //plot the function g

 

string vtkFileName="./test1.vtk";

// 需要添加场名称后处理时方可选择变量

savevtk(vtkFileName,Th,f,g,dataname ="Th f g");  

 

 

程序运行结果如下:

当border b(t=0, 2.*pi){x=0.8+0.3*cos(t);y=0.3*sin(t);label=2;};时边界a和边界b相交,无法根据两个边界剖分网格,后续执行失败。

border b(t=0, 2.*pi){x=0.3+0.3*cos(t);y=0.3*sin(t);label=2;};时边界a与边界b不相交,可以执行后续网格剖分和计算。

显示Th网格划分

函数f的计算结果

下图是用paraview显示的结果

函数g的计算结果

下图是用paraview的显示结果

 

2 基于实例的学习

2.1 从这里开始

对于给定的函数f(x,y),找到一个函数u(x,y)满足如下2个条件:

-Δu(x,y)=f(x,y) 对所有(x,y)在空间域Ω上成立

u(x,y)=0  对所有(x,y)在边界域上

内部函数u表示为

 

load "iovtk"  //载入模块

border C(t=0,2*pi) {x=cos(t);y=sin(t);};

int nmsh=60;

mesh Th = buildmesh(C(nmsh));

plot(Th, wait=true);

 

fespace Vh(Th,P1);

Vh u,v,fh;

func fx*y;

fh =f;

macro Grad(u) [dx(u),dy(u)] //

 

solve Poisson(u,v)=

    int2d(Th)(Grad(u)'*Grad(v))

   +int2d(Th)( f*v)

   +on(C,u=0);

plot(u,fill=1);

 

string outDir = "./";

string vtkFileName = outDir + "Poisson_mesh_" + nmsh + ".vtk";

// 需要添加场名称后处理时方可选择变量

savevtk(vtkFileName,Th,u,f,dataname ="u source");  

 

 

[i] https://freefem.org/

  • 8
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
对流方程是描述流体运动的方程,由Navier-Stokes方程组成,其中包含连续性方程和动量方程。在数值解中,常使用有限元法来求解对流方程。 在FreeFem++中,可以通过定义变量,设定边界条件和初始条件,以及使用有限元法来求解对流方程。 首先,需要定义变量和方程。假设我们要求解二维空间中的定常对流方程,可以如下定义: ``` real xc, yc; // 圆心坐标 real r; // 圆半径 int N; // 网格划分数 xc = 0.5; yc = 0.5; // 假设圆心坐标为(0.5, 0.5) r = 0.2; // 假设圆半径为0.2 N = 50; // 假设网格划分数为50 mesh Th = square(N,N); // 创建二维正方形网格 fespace Vh(Th, P1); // 定义函数空间Vh,使用P1元素 Vh u, v; // 定义速度场变量u和v Vh p; // 定义压力变量p u[] = 0; v[] = 0; // 设置速度初值为0 p[] = 0; // 设置压力初值为0 Vh Du, Dv; // 速度的梯度 Du[] = dx(u); Dv[] = dy(v); // 求速度的梯度 Vh Fh, Gh; // 定义对流项 Fh[] = u*Du; Gh[] = v*Dv; // 计算对流项 Vh L2, L3; // 定义边界项 L2[] = -Fh; L3[] = -Gh; // 计算边界项 Vh L1, L4; // 定义其他项 L1[] = div(u); L4[] = 0; // 计算其他项 // 定义方程 problem NS(u, v, p, (Du, Dv), {Fh, Gh}, {L1, L2, L3, L4}); ``` 然后,设定边界条件和初始条件。可以根据实际问题来设置边界条件和初始条件。 最后,使用有限元法求解对流方程,并输出结果。 ``` NS; // 使用有限元法求解方程 plot(u, wait=true); // 绘制速度场 plot(p, wait=true); // 绘制压力场 ``` 以上代码展示了如何在FreeFem++中使用有限元法求解二维定常对流方程,并输出结果。实际应用中,可以根据具体情况更改和调整代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oceanstonetree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值