DOLFIN:C++/Python有限元库》概述/接口【翻译】

DOLFIN:C++/Python有限元库》概述/接口【翻译】

2021-01-06
| 科学计算 | | FEniCS , 有限元法 , 偏微分方程 | Comment 评论

章节目录

DOLFIN是一个用作FEniCS主要用户接口的C++/Python库。 在本章中,我们将回顾DOLFIN的功能。 我们还将详细讨论DOLFIN某些关键特性的实现。 有关DOLFIN的设计和实现的一般讨论,请参见Logg and Wells(2010)。

10·1 概述

FEniCS的大部分功能是DOLFIN一部分实现的。 它为基于偏微分方程的模型提供了一个问题解决环境,并实现了FEniCS功能的核心部分,包括计算网格和有限元组装的数据结构和算法。 为了提供简单一致的用户接口,DOLFIN封装了其他FEniCS组件和外部软件的功能,并处理了这些组件之间的通信。

图10.1概述了FEniCS组件与外部软件之间的关系。 如图所示的软件地图显示了在C++或Python中在DOLFIN用户接口之上的用户应用实现。 用户应用也可以使用FEniCS Apps开发,FEniCS Apps是在FEniCS / DOLFIN之上实现的一组求解器。 DOLFIN本身既是用户接口,又是FEniCS的核心组件。 用户程序,FEniCS的其他核心组件和外部软件之间的所有通信都通过包装层进行路由,这些包装层是DOLFIN用户接口的一部分。 特别地,将UFL形式语言(第17章)表示的变分形式传递给形式编译器FFC(第11章)或SFC(第15章)以生成UFC代码(第16章),然后被DOLFIN用来组装线性系统。 对于FFC,代码生成取决于有限单元后端FIAT(第13章),即时编译实用程序Instant(第14章)和可选的优化后端FErari(第12章)。 最后,DOLFIN提供的绘图功能由Viper实现。 DOLFIN C++接口的用户可能会遇到这种通信,要求用户可通过在命令行上调用形式编译器从UFL形式文件显式地生成UFC代码。

DOLFIN也依赖于外部软件来实现重要功能,例如线性代数库PETSc,Trilinos,uBLAS和MTL4,以及网格剖分库ParMETIS和SCOTCH(Pellegrini)。

0236.jpg

图10.1 DOLFIN充当FEniCS的主要用户接口,并处理FEniCS的各个组件与外部软件之间的通信。 实线表示依赖关系,虚线表示数据流。

10·2 用户接口

DOLFIN提供了两个用户接口。 一个接口被实现为传统的C++库,另一个接口被实现为标准的Python模块。 这两个接口几乎相同,但是在某些情况下,C++或Python的特定语言功能要求接口有所不同。 尤其是,Python接口通过使用运行时(即时)代码生成,增加了自动化程度。 下面,我们对DOLFIN的两个用户接口的设计和实现进行评论。

10·2·1 C++接口

DOLFIN C++接口被设计为标准的面向对象的C++库。 它提供了诸如Matrix,Vector,Mesh,FiniteElement,FunctionSpace和Function的类,这些类为有限元计算的重要概念建模(请参见图10.2)。 它还提供了少量的自由函数(不是类的成员函数的函数),特别是组装和求解,可以与DOLFIN类对象一起使用以实现有限元求解器。 该接口被设计为尽可能简单,并且不影响通用性。 包装外部软件时,将提供一个简单且一致的用户接口,以允许快速开发求解器而无需处理外部库接口中的差异。 但是,DOLFIN旨在与外部软件灵活地进行交互。 特别是在DOLFIN为外部库提供包装器的情况下,例如Matrix和Vector类,它们包装了线性代数库(例如PETSc和Trilinos)中的数据结构,高级用户可以在必要时访问基础数据结构以便使用包装了外部库中的本地功能。

0237.jpg

图10.2 DOLFIN的一些最重要的组件和类的示意图。 箭头指示依赖性。

为了使用DOLFIN C++接口求解偏微分方程,用户必须使用UFL形式语言表达有限元变分问题。 就是通过将形式输入到单独的.ufl文件中并使用形式编译器编译这些文件以生成符合UFC的C++代码来完成的。 然后可以将生成的代码包含在DOLFIN C++程序中。 我们在10.3节中回到这个问题。

为了在C++中使用DOLFIN,用户需要包括DOLFIN C++库中的一个或多个头文件。 在最简单的情况下,其中包括头文件dolfin.h,该头文件又包括所有其他DOLFIN头文件:

// C++ code

#include <dolfin.h>

using namespace dolfin;

int main()
{
    return 0;
}

10·2·2 Python接口

在过去的十年中,Python已成为快速开发用于科学计算的仿真代码的有吸引力的选择。 Python带来了高级脚本语言的优点,面向对象语言的优势以及大量用于数值计算的库。

DOLFIN Python接口的大部分是使用SWIG从C++接口自动生成的(Beazley,1996; SWIG)。 由于C++和Python接口的功能都是作为DOLFIN C++库的一部分实现的,因此对于大多数操作,通过C++和Python接口,DOLFIN同样有效。

DOLFIN Python接口提供了一些C++接口无法提供的功能。 特别是,将UFL形式语言无缝集成到Python接口中,并且在运行时自动处理代码生成。 要从Python使用DOLFIN,用户需要从DOLFIN Python模块导入功能。 在最简单的情况下,其中Python模块中的dolfin包括了所有功能:

# Python code

from dolfin import *

章节目录