— 学习目的:尽快熟练掌握step-69,转化成果应用到旋流管道 —
Introduction
数值求解微分方程
高精度数值求解微分方程主要有三类:有限体积法、有限元法和有限差分法。
有限差分方法**(FDM)**是计算机数值模拟最早采用的方法,至今仍被广泛运用。该方法将求解域划分为差分网格,用有限个网格节点代替连续的求解域。有限差分法以Taylor级数展开等方法,把控制方程中的导数用网格节点上的函数值的差商代替进行离散,从而建立以网格节点上的值为未知数的代数方程组。该方法是一种直接将微分问题变为代数问题的近似数值解法,数学概念直观,表达简单,是发展较早且比较成熟的数值方法。
对于有限差分格式,从格式的精度来划分,有一阶格式、二阶格式和高阶格式。从差分的空间形式来考虑,可分为中心格式和逆风格式。考虑时间因子的影响,差分格式还可以分为显格式、隐格式、显隐交替格式等。目前常见的差分格式,主要是上述几种形式的组合,不同的组合构成不同的差分格式。差分方法主要适用于有结构网格,网格的步长一般根据实际地形的情况和柯朗稳定条件来决定。
构造差分的方法有多种形式,目前主要采用的是泰勒级数展开方法。其基本的差分表达式主要有三种形式:一阶向前差分、一阶向后差分、一阶中心差分和二阶中心差分等,其中前两种格式为一阶计算精度,后两种格式为二阶计算精度。通过对时间和空间这几种不同差分格式的组合,可以组合成不同的差分计算格式。
有限差分法的主要内容包括:如何根据问题的特点将定解区域作网格剖分;如何把原微分方程离散化为差分方程组以及如何解此代数方程组。此外为了保证计算过程的可行和计算结果的正确,还需从理论上分析差分方程组的性态,包括解的唯一性、存在性和差分格式的相容性、收敛性和稳定性。对于一个微分方程建立的各种差分格式,为了有实用意义,一个基本要求是它们能够任意逼近微分方程,这就是相容性要求。另外,一个差分格式是否有用,最终要看差分方程的精确解能否任意逼近微分方程的解,这就是收敛性的概念。此外,还有一个重要的概念必须考虑,即差分格式的稳定性。因为差分格式的计算过程是逐层推进的,在计算第n+1层的近似值时要用到第n层的近似值,直到与初始值有关。前面各层若有舍入误差,必然影响到后面各层的值,如果误差的影响越来越大,以致差分格式的精确解的面貌完全被掩盖,这种格式是不稳定的,相反如果误差的传播是可以控制的,就认为格式是稳定的。只有在这种情形,差分格式在实际计算中的近似解才可能任意逼近差分方程的精确解。关于差分格式的构造一般有以下3种方法。最常用的方法是数值微分法,比如用差商代替微商等。另一方法叫积分插值法,因为在实际问题中得出的微分方程常常反映物理上的某种守恒原理,一般可以通过积分形式来表示。此外还可以用待定系数法构造一些精度较高的差分格式。
有限元**方法**的基础是变分原理和加权余量法,其基本求解思想是把计算域划分为有限个互不重叠的单元,在每个单元内,选择一些合适的节点作为求解函数的插值点,将微分方程中的变量改写成由各变量或其导数的节点值与所选用的插值函数组成的线性表达式,借助于变分原理或加权余量法,将微分方程离散求解。采用不同的权函数和插值函数形式,便构成不同的有限元方法。
有限元方法最早应用于结构力学,后来随着计算机的发展慢慢用于流体力学的数值模拟。在有限元方法中,把计算域离散剖分为有限个互不重叠且相互连接的单元,在每个单元内选择基函数,用单元基函数的线形组合来逼近单元中的真解,整个计算域上总体的基函数可以看为由每个单元基函数组成的,则整个计算域内的解可以看作是由所有单元上的近似解构成。
常见的有限元计算方法是由变分法和加权余量法发展而来的里兹法和伽辽金法、最小二乘法等。根据所采用的权函数和插值函数的不同,有限元方法也分为多种计算格式。从权函数的选择来说,有配置法、矩量法、最小二乘法和伽辽金法,从计算单元网格的形状来划分,有三角形网格、四边形网格和多边形网格,从插值函数的精度来划分,又分为线性插值函数和高次插值函数等。不同的组合同样构成不同的有限元计算格式。对于权函数,伽辽金(Galerkin)法是将权函数取为逼近函数中的基函数;最小二乘法是令权函数等于余量本身,而内积的极小值则为对代求系数的平方误差最小;在配置法中,先在计算域内选取N个配置点。令近似解在选定的N个配置点上严格满足微分方程,即在配置点上令方程余量为0。插值函数一般由不同次幂的多项式组成,但也有采用三角函数或指数函数组成的乘积表示,但最常用的多项式插值函数。有限元插值函数分为两大类,一类只要求插值多项式本身在插值点取已知值,称为拉格朗日(Lagrange)多项式插值;另一种不仅要求插值多项式本身,还要求它的导数值在插值点取已知值,称为哈密特(Hermite)多项式插值。单元坐标有笛卡尔直角坐标系和无因次自然坐标,有对称和不对称等。常采用的无因次坐标是一种局部坐标系,它的定义取决于单元的几何形状,一维看作长度比,二维看作面积比,三维看作体积比。在二维有限元中,三角形单元应用的最早,近来四边形等参元的应用也越来越广。对于二维三角形和四边形电源单元,常采用的插值函数为有Lagrange插值直角坐标系中的线性插值函数及二阶或更高阶插值函数、面积坐标系中的线性插值函数、二阶或更高阶插值函数等。
对于有限元方法,其基本思路和解题步骤可归纳为:
(1)建立积分方程,根据变分原理或方程余量与权函数正交化原理,建立与微分方程初边值问题等价的积分表达式,这是有限元法的出发点。
(2)区域单元剖分,根据求解区域的形状及实际问题的物理特点,将区域剖分为若干相互连接、不重叠的单元。区域单元划分是采用有限元方法的前期准备工作,这部分工作量比较大,除了给计算单元和节点进行编号和确定相互之间的关系之外,还要表示节点的位置坐标,同时还需要列出自然边界和本质边界的节点序号和相应的边界值。
(3)确定单元基函数,根据单元中节点数目及对近似解精度的要求,选择满足一定插值条件的插值函数作为单元基函数。有限元方法中的基函数是在单元中选取的,由于各单元具有规则的几何形状,在选取基函数时可遵循一定的法则。
(4)单元分析:将各个单元中的求解函数用单元基函数的线性组合表达式进行逼近;再将近似函数代入积分方程,并对单元区域进行积分,可获得含有待定系数(即单元中各节点的参数值)的代数方程组,称为单元有限元方程。
(5)总体合成:在得出单元有限元方程之后,将区域中所有单元有限元方程按一定法则进行累加,形成总体有限元方程。
(6)边界条件的处理:一般边界条件有三种形式,分为本质边界条件(狄里克雷边界条件 )、自然边界条件(黎曼边界条件)、混合边界条件(柯西边界条件)。对于自然边界条件,一般在积分表达式中可自动得到满足。对于本质边界条件和混合边界条件,需按一定法则对总体有限元方程进行修正满足。
(7)解有限元方程:根据边界条件修正的总体有限元方程组,是含所有待定未知量的封闭方程组,采用适当的数值计算方法求解,可求得各节点的函数值。
有限体积法(**Finite Volume Method**)又称为控制体积法。其基本思路是:将计算区域划分为一系列不重复的控制体积,并使每个网格点周围有一个控制体积;将待解的微分方程对每一个控制体积积分,便得出一组离散方程。其中的未知数是网格点上的因变量的数值。为了求出控制体积的积分,必须假定值在网格点之间的变化规律,即假设值的分段的分布的分布剖面。从积分区域的选取方法看来,有限体积法属于加权剩余法中的子区域法;从未知解的近似方法看来,有限体积法属于采用局部近似的离散方法。简言之,子区域法属于有限体积发的基本方法。
有限体积法的基本思路易于理解,并能得出直接的物理解释。离散方程的物理意义,就是因变量在有限大小的控制体积中的守恒原理,如同微分方程表示因变量在无限小的控制体积中的守恒原理一样。限体积法得出的离散方程,要求因变量的积分守恒对任意一组控制体积都得到满足,对整个计算区域,自然也得到满足。这是有限体积法吸引人的优点。有一些离散方法,例如有限差分法,仅当网格极其细密时,离散方程才满足积分守恒;而有限体积法即使在粗网格情况下,也显示出准确的积分守恒。就离散方法而言,有限体积法可视作有限单元法和有限差分法的中间物。有限单元法必须假定值在网格点之间的变化规律(既插值函数),并将其作为近似解。有限差分法只考虑网格点上的数值而不考虑值在网格点之间如何变化。有限体积法只寻求的结点值,这与有限差分法相类似;但有限体积法在寻求控制体积的积分时,必须假定值在网格点之间的分布,这又与有限单元法相类似。在有限体积法中,插值函数只用于计算控制体积的积分,得出离散方程之后,便可忘掉插值函数;如果需要的话,可以对微分方程中不同的项采取不同的插值函数。
三者各有所长:
有限差分法:直观,理论成熟,精度可选。但是不规则区域处理繁琐,虽然网格生成可以使FDM应用于不规则区域,但是对区域的连续性等要求较严。使用FDM的好处在于易于编程,易于并行。
有限元方法:适合处理复杂区域,精度可选。缺憾在于内存和计算量巨大。并行不如FDM和FVM直观。不过FEM的并行是当前和将来应用的一个不错的方向。
有限容积法:适于流体计算,可以应用于不规则网格,适于并行。但是精度基本上只能是二阶了。FVM的优势正逐渐显现出来,FVM在应力应变,高频电磁场方面的特殊的优点正在被人重视。
接下来,展示以下Tam大神早年就用有限差分法干出来的结果1。
比较一下:
有限容积法和有限差分法:一个区别就是有限容积法的截差是不定的(跟取的相邻点有关,积分方法离散方程),而有限差分就可以直接知道截差(微分方法离散方程)。 有限容积法和有限差分法最本质的区别是,前者是根据积分方程推导出来的(即对每个控制体积分),后者直接根据微分方程推导出来,所以前者的精度不但取决于积分时的精度,还取决与对导数处理的精度,一般有限容积法总体的精度为二阶,因为积分的精度限制,当然有限容积法对于守恒型方程导出的离散方程可以保持守恒型;而后者直接由微分方程导出,不涉及积分过程,各种导数的微分借助Taylor展开,直接写出离散方程,当然不一定有守恒性,精度也和有限容积法不一样,一般有限差分法可以使精度更高一些。
当然二者有联系,有时导出的形式一样,但是概念上是不一样的。
至于有限容积法和有限元相比,有限元在复杂区域的适应性对有限容积是毫无优势可言的,至于有限容积的守恒性,物理概念明显的这些特点,有限元是没有的。目前有限容积在精度方面与有限元法有些差距。
有限元方法比有限差分优越的方面主要在能适应不规则区域,但是这只是指的是传统意义上的有限差分,现在发展的一些有限差分已经能适应不规则区域。对于椭圆型方程,如果区域规则,传统有限差分和有限元都能解,在求解效率,这里主要指编程负责度和收敛快慢、内存需要,肯定有限差分有优势。
有限元应用于声学计算
我的重心工作主要在于声学波动方程的求解,首先考虑最为基本的Helmholtz equation:
其中,双曲型微分方程封闭方程需要同时满足封闭的边界条件和初始条件:
有限元方法是求上述方成的弱解,即:
参考2,提出的四阶隐式时间差分算法,二阶显式leapfrog格式,可以有效控制误差。除此之外,离散Galerkin方法,有可以有效嫁接到自动加密网格3,小尺度的方程更加准确。
2. Finite Element θ-Schemes for the Acoustic Wave Equation. Advances in Applied Mathematics and Mechanics. April 2011 ↩
3. Wolfgang Bangerth and Rolf Rannacher. Finite element approximation of the acoustic wave equation: Error control and mesh adaptation. East–West J. Numer. Math., 7(4):263–282, 1999. ↩ ↩
初见deal.II
deal.II 是一个开源的有限元法求解器,支持大规模并行计算,自适应网格。采用C++编写,实现优雅。其文档完整丰富,文档共有三个级别,由浅入深:
- tutorial:一系列的教学程序,共有64步教学步骤,通过tutorial的学习可以对dealii有整体的认识。
- manual:对每个类以及相应的函数的介绍。适合用于查询类与函数的具体用法。
Modules:介绍了实现某一个功能需要用到的一系列类与函数,比如 Sparsity patterns 介绍了存储稀疏矩阵相关的内容。
What it is: A C++ software library supporting the creation of finite element codes and an open community of users and developers. (Learn more.)
Mission: To provide well-documented tools to build finite element codes for a broad variety of PDEs, from laptops to supercomputers.
Vision: To create an open, inclusive, participatory community providing users and developers with a state-of-the-art, comprehensive software library that constitutes the go-to solution for all finite element problems.
第一次看到这个库是接触到ASPECT , 用来仿真地壳热对流的,涉及到极为复杂的微分方程。就随便一些就是一堆方程4:
当时就领教了Deal-II 在求解复杂耦合方程的能力,C++结构化面向对象代码也使得其重用性极高。
Deal-ii 学习步骤
deal-ii 的学习由浅入深,都一系列教学程序,共有64步教学步骤,可以通过tutorial的学习对deall-ii有整体的认识。这里我的最终目的是走到可压缩欧拉方程的求解,因此,下面的代码解析会顺着setp-1—->setp-2—->setp-3—->setp-4—->setp-5—->setp-6—->setp-40—->setp-69的思路进行介绍。这些步骤的详细说明在官网上都有,这里参考Ghost Valley写的中文翻译。
- pi_BEM,dealii,deal2lkit的安装
- deal.II学习—Step-2
- deal.II学习—Step-3
- deal.II学习—Step-4
- deal.II学习—Step-5
- deal.II学习—Step-6