FEniCS项目

分类:开源CAE | 2026-10-02 改写
CAE visualization for fenics project theory - technical simulation diagram
FEniCS

理论:只写弱形式就能求解的机制

概述

🙋

FEniCS的用法和其他有限元软件有什么不同?

🎓

它不是从固定菜单中选择分析类型,而是自己写出要解方程的弱形式。例如泊松方程,乘以试函数v并分部积分后的式子,在Python中几乎按数学公式写成“a = inner(grad(u), grad(v))*dx”“L = f*v*dx”。FEniCS的形式编译器把它转换为单元计算代码,DOLFINx组装整体矩阵,用PETSc求解。新的本构关系或耦合问题只要写出弱形式就能马上试验,这是它的优势;但边界条件的给法或函数空间的选择出错时,可能不报错却给出错误答案。所以用已知解检验尤为重要。

泊松方程的弱形式

$$ \int_\Omega \nabla u\cdot\nabla v\,dx = \int_\Omega f\,v\,dx\quad \forall v,\qquad \texttt{a = inner(grad(u), grad(v))*dx},\quad \texttt{L = f*v*dx} $$

u为未知函数,v为试函数,f为右端项(热源等),Ω为求解域。右侧两行是在FEniCS(UFL)中的写法。

Coffee Break 随笔闲谈

诞生于北欧大学的项目

FEniCS于2003年前后由芝加哥大学和瑞典查尔姆斯理工大学等的研究人员发起,后来以挪威Simula研究所等为中心发展起来。2019年以后迁移到新的实现DOLFINx,为旧版(legacy DOLFIN)编写的教程代码可能无法直接运行,需要注意。

算例

表格来自独立Python/SciPy实现的P1三角形有限元参考计算,并非DOLFINx运行结果。单位正方形采用同向对角线划分、三点积分。节点达到机器精度只适用于这个特殊问题和网格,不保证一般P1网格或单元内部插值同样精确。

例1:教程解 u = 1 + x² + 2y²(线性单元,8×8网格)

f = −6、边界施加精确解时,此特殊均匀三角形网格的参考节点误差约1.6×10⁻¹⁵。但单元内部P1插值并不等于二次精确解,还应检查全域误差。

例2:sin(πx)sin(πy)的收敛(线性单元)

网格未知量L2误差节点最大误差L2阶数
8×8492.04×10⁻²1.27×10⁻²—
16×162255.20×10⁻³3.20×10⁻³1.97
32×329611.31×10⁻³8.03×10⁻⁴1.99

网格加倍时L2误差约降为1/4,符合线性单元理论的二阶收敛,未知量约增加为4倍。

🙋

例1误差几乎为零,例2却有误差。只做例1的检验不够吗?

🎓

不够。例1只在特定网格上节点吻合。应对非多项式问题加密网格,测量L2及梯度误差。光滑解、适当网格和积分下,P1通常L2约2阶、梯度约1阶;奇异性或正则性不足也会降低阶数,不一定是实现错误。DOLFINx使用fem.assemble_scalar与MPI归约计算范数,不应混同旧DOLFIN的errornorm。

入门流程

  1. 用conda或Docker安装DOLFINx,运行官方教程的泊松方程。
  2. 确认u = 1 + x² + 2y²的节点误差达到机器精度。
  3. 用非多项式解加密网格,测量误差阶数。
  4. 写出自己方程的弱形式,用同样方法借助制造解验证。
  5. 大问题用MPI并行,选择PETSc的求解器和预处理器。
Coffee Break 随笔闲谈

“教程代码跑不起来”

使用FEniCS最先容易碰到的问题是,网上很多代码示例是为旧版(legacy DOLFIN,到2019年为止)编写的。DOLFINx中网格生成、边界条件指定、函数空间构建和结果输出的方法都变了,旧版代码无法直接运行。以官方网站的DOLFINx教程和所用版本的演示程序为范本是捷径。

常见错误

错误与对策

错误后果对策
直接使用旧版代码报错无法运行以DOLFINx示例为范本
边界位置指定错误无报错地给出错误答案用已知解确认
精确解用低阶插值低估误差用高阶空间插值
只比较节点值漏掉单元错误用范数看阶数
大规模问题用直接法内存不足迭代法加预处理
🙋

我想了解相关内容。

常见问题

FEniCS是什么?

用有限元法求解偏微分方程的开源库集合。用UFL(统一形式语言)以接近数学公式的形式在Python中写出弱形式,形式编译器自动生成单元计算代码,由DOLFINx(当前版本)进行组装和求解。广泛用于新方程和耦合问题的原型开发以及研究和教学。

如何确认用FEniCS写的代码是否正确?

使用解析解或制造解,检查边界及全域误差和网格加密收敛阶。二次解的节点吻合是特殊网格的性质,不保证一般线性单元达到机器精度。

改用二次单元能好多少?

理论上函数值L2误差的阶数从2提高到3。在FEniCS中只需在函数空间定义中把阶数从1改为2即可切换。线性单元在32×32网格(961个未知量)时L2误差为1.3×10⁻³,二次单元往往在较粗的网格上就能达到同等或更高的精度,达到同样精度所需的未知量常常更少。

参考资料与检验范围

所列数值是基于文中假设的教学参考计算。资料用于理论和设置参考,不证明已在各软件中复现这些数值。工程决策须按实际条件验证。

关联模拟器

在本领域的交互式模拟器中体验理论

模拟器列表

相关分析领域

结构分析流体分析(CFD)热分析
本文评价
感谢您的反馈!
有帮助
更详细
报错
有帮助
0
更详细
0
报错
0