Copyright © 2017 Hans Petter Langtangen & Anders Logg
Creative Commons Attribution 4.0
This book is distributed under the terms of the Creative Commons Attribution 4.0
International License (http://creativecommons.org/licenses/by/4.0/), which permits use,
duplication, adaptation, distribution and reproduction in any medium or format, as long as
you give appropriate credit to the original author(s) and the source, provide a link to the
Creative Commons license and indicate if changes were made.
Edition 0.0
Chinese translation by Jiping Xin
Printed in Wuxi, China
3
本书简要介绍了有限元素基于流行的 FEniCS 软件库在 Python 中进行编程。FEniCS 可以
在 C++ 和 Python 中编程,但本教程专注于 Python 编程,因为这是最简单的并为初学者
提供最有效的方法。消化过后本教程中的示例,读者应该能够了解更多从 FEniCS 文档中可
以看到众多演示程序与软件和综合 FEniCS 书 Automated Solution of Differential Equations
by the Finite Element Method [FEniCS]。本教程是开幕式的进一步发展 [FEniCS] 中的章节。
我们感谢 Johan Hake,Kent-Andre Mardal 和 Kristian Valen-Sendstad 在准备第一个时候
进行许多有益的讨论本教程的版本为 FEniCS 书 [FEniCS]。我们是特别感谢 Douglas Arnold
非常有价值对文本早期版本的反馈。Øystein Sørensen 指出许多打字错误,并提供了许多有
用的意见。许多错误还有 Mauricio Angeles,IdaDrøsdal,Miroslav Kuchta,Hans Ekkehard
Plesser,Marie Rognes,Hans Joachim Scroll,Glenn Terje Lines,Simon Funke,Matthew
Moelter 和 Magne Nordaas。Ekkehard Ellmann 以及两位匿名评审员一系列建议和改进。特
别感谢 Benjamin Kehlet 为他所有的工作与 mshr 工具和快速实施我们对本教程的要求。
注释和更正可以报告为本书 Git 存储库的 emph issue:
https://github.com/hplgit/fenics-tutorial
Oslo and Smögen, November 2016
Hans Petter Langtangen, Anders Logg
5
1.1 FEniCS 项目
FEniCS 项目是针对的一个研究和软件项目创建自动计算的数学方法和软件数学建模。这意味
着创建简单,直观,高效,和用于求解偏微分方程的灵活软件 PDE 使用有限元法。FEniCS 最初
创建于 2003 年由研究人员合作开发世界各地的大学和研究机构数量。对于有关 FEniCS 的更
多信息和 FEniCS 的最新更新软件和本教程,请访问 FEniCS 网页 https://fenicsproject.org。
FEniCS 由许多构建块(软件组件)组成,一起形成 FEniCS 软件:DOLFIN [DOLFIN],
FFC [FFC],FIAT [FIAT],UFL [UFL_2014],mshr,和其他几个。有关概述,请参阅 [FEniCS]。
FENiCS 用户很少需要考虑这一点 FEniCS 的内部组织,但即使是临时用户也可以有时会遇
到各种 FEniCS 组件的名称,我们简要地说列出 FEniCS 中的组件及其主要角色。DOLFIN
是计算高性能的 C ++ 后端的 FEniCS。DOLFIN 实现数据结构,如网格,函数空间和函
数,计算密集型算法如有限元组合和网格细化,以及与线性代数解算器的接口和数据结构如
PETSc。DOLFIN 还实施了 FEniCS C ++ 和 Python 中的解决问题的环境。FFC 是代码
FEniCS(表单编译器)的一代引擎,负责从高级数学生成高效的 C ++ 代码抽象。FIAT 是
FEniCS 的有限元后端,负责生成有限元基函数,UFL 实现用户可以使用的抽象数学语言表
达变体问题,mshr 提供 FEniCS 网格生成功能。
1.2 你会学到什么
本教程的目标是演示如何应用有限元解决 FEniCS 中的 PDE。通过一系列例子,我们演示如
何:
• 求解线性 PDE(如泊松方程),
• 解决时间依赖型 PDEs(如热方程),
• 求解非线性 PDE,
• 解决时间依赖非线性 PDE 的系统。
6
Chapter 1. 预赛
7
重要话题涉及如何设定各种边界条件类型 (Dirichlet,Neumann,Robin),如何创建网格,如
何定义变量系数,如何与线性和非线性求解器,以及如何后处理和可视化解决方案。
我们还将讨论如何最好地构建 Python 代码 PDE 求解器,如何调试程序,以及如何利用
的测试框架。
1.3 使用本教程
插图的数学保持简单,更好地关注 FEniCS 功能和语法。这意味着我们大多使用 Poisson 方
程和时间依赖扩散方程作为模型问题,经常与输入数据调整,使我们得到一个非常简单的解
决方案可以通过任何标准有限的精确复制元素方法在均匀的结构化网格中。后一个属性大大
简化了实现的验证。我们偶尔会插入一个更为相关的实例来提醒读者从解决一个简单的模型
问题到一个 FEniCS 的挑战现实世界的问题往往相当短暂和容易。
使用 FEniCS 来解决 PDE 似乎需要一个彻底的理解有限的抽象数学框架元素方法以及
Python 编程方面的专业知识。不过,事实证明,很多用户都可以拿起来有限元素和 Python
编程的基本原理以及本教程。只需继续阅读并尝试例子。你会惊讶于用 PDE 来解决 PDE 的
容易程度 FENICS!
1.4 获取软件
使用本教程显然需要访问 FEniCS 软件。FEniCS 是一个复杂的软件库,本身和到期它对许
多依赖于最先进的开源科学的依赖软件库。手动构建 FEniCS 及其所有依赖项从源头可以成
为一项艰巨的任务。即使是知道的专家究竟如何配置和构建每个组件,一个完整的构建可以
字面上需要几个小时!除了软件的复杂性本身,还有一层额外的复杂性在多少不同种类的操
作系统 (Linux,Mac,Windows) 可能在用户的笔记本电脑或计算服务器上运行不同的要求
如何配置和构建软件。
因此,FEniCS 项目提供了预先构建的包安装方便,快捷,万无一失。
注意
(FEniCS 下载和安装) 在本教程中,我们强调安装的两个主要选项 FEniCS 软件:Docker
容器和 Ubuntu 软件包。当时 Docker 容器适用于所有操作系统,即 Ubuntu 软件包只
能在基于 Ubuntu 的系统上工作。注意内置的 FEniCS 虽然基本原理,目前情况并不
适用于 Docker 通过 Docker Jupyter 笔记本选项支持绘图。
FEniCS 也可以使用其他方法安装,包括 Conda 包装和建筑从源头。有关更多安装选
项和关于最简单和最佳安装选项的最新信息 FEniCS,查看官方 FEniCS 安装说明。这
些可以在那里找到
https://fenicsproject.org/download
注意
(FEniCS 版本:2016.2) FEniCS 版本标注为 2016.1,2016.2,2017.1 等,主要数字表示
发行年份次数是从 1 开始的计数器。发布次数每年变化不大,但通常可以预期每次 2–3
次年。本教程是为 FEniCS 准备和测试的版本 2016.2。
8
1.4. 获取软件
1.4.1 使用 Docker 容器进行安装
一个现代化的解决方案,挑战软件安装的多样化软件平台是使用所谓的容器。FEniCS 项目提
供定制容器,受控,一致和高性能的软件环境为 FEniCS 节目。FEniCS 容器工作同样好1 所
有操作系统,包括 Linux,Mac 和 Windows。
要使用 FEniCS 容器,您必须先安装 Docker 平台。Docker 安装很简单,可以使用说明书
在
https://www.docker.com
一旦你安装了 Docker,只需将以下行复制到终端窗口:
1
$ curl
- s https :// get . f e n i c s p r o j e c t . org | bash
Bash code
上面的命令将安装程序 fenicsproject 系统。此程序可让您轻松创建 FEniCS 会话(容器)
在您的系统:
1
$ f e n i c s p r o j e c t
run
Bash code
此命令有几个有用的选项,如轻松切换最新发布的 FEniCS 之间的最新开发版本还有很多。
要了解更多信息,请键入 fenicsproject help。FEniCS 可以也可以直接与 Docker 一起使用,
但这通常需要键入一个比较复杂的 Docker 命令,例如:
$ docker run - -rm - t i
/home/ f e n i c s /shared quay . io / f e n i c s p r o j e c t / stable : current
- c ” export TERM=xterm ; bash - i ” ’
-v ‘pwd ‘ : / home/ f e n i c s /shared -w
Bash code
’/ bin/bash - l
注意
(与 FEniCS 容器共享文件) 当您使用 fenicsproject run 运行 FEniCS 会话时,它会自动
共享您当前的工作目录(该目录使用 FEniCS 从中运行 fenicsproject 命令)会话。当
FEniCS 会话启动时,它会自动启动进入一个名为 shared 的目录,它将与之相同您的
主机系统上的当前工作目录。这意味着您可以轻松地编辑文件并在 FEniCS 会话中写
入数据文件将直接在您的主机系统上访问。它是建议您使用自己喜欢的编辑器编辑程
序 (如 Emacs 或 Vim),并使用 FEniCS 会话只能运行你的程序。
1.4.2 使用 Ubuntu 软件包进行安装
对于 Ubuntu GNU/Linux 用户,FEniCS 也可以轻松安装标准的 Ubuntu 软件包 manager
apt-get。只需复制以下内容线路进入终端窗口:
$ sudo add - apt - repository ppa : fenics - packages/ f e n i c s
$ sudo apt - get update
$ sudo apt - get
i n s t a l l
$ sudo apt - get dist - upgrade
f e n i c s
Bash code
1
2
3
1
2
3
4
1与 Linux 上运行 Docker 容器相比,运行在 Mac 和 Windows 上的 Docker 容器具有较小的性能开销。然
而,通过使用官方 FEniCS 容器附带的 FEniCS 的高度调优和优化版本,与在 Mac 或 Windows 上的源代码构
建 FEniCS 及其依赖相比,性能损失通常很小,并且经常得到补偿。