格子玻尔兹曼机(Lattice Boltzmann Method)系列2:LBM在不可压缩流动下的核心算法

教材

格子玻尔兹曼方法大概出现在上世纪八九十年代,在流体领域的普及大概也就只是在00年前后才开始,算是一门很新的研究方向。尽管出现得晚,但是到现在已经可以听到“LBM/SPH已死”类似的说法,“LBM已死”这样的说法显然是站不住脚的,但是也侧面反应了除传统有限体积法以外,其他新的偏微分方程求解器的局限性都是对于应用普及化的一个很大限制。尤其是SPH算法,CFD领域的工作实在是极其稀少,因为拥有算得快和精度低这样的特征,更多地实际上是在发图形学的工作。

回到这篇文章的主题:介绍格子玻尔兹曼的算法。首先是挑选一本好的教材。因为LBM出现得比较晚,所以并不推荐去看那本中文教材,写得并不好。很多的学科都有类似的特征,比如小波变换,也是出现在上世纪八九十年代的产物,同样在市面上找不到一本好的教材。所以在在这里推荐的是一本英文教材:Michael C. Sukop & Daniel T. Thorne, Jr: 《Lattice Boltzmann Modeling, An introduction for Geoscientists and Engineers》,在Springer网站上有,所以如果所在单位或者学校买了Springer数据库的版权的话,可以直接在上面找。
格子玻尔兹曼机(Lattice Boltzmann Method)系列2:LBM在不可压缩流动下的核心算法_第1张图片
推荐这本教材的一个很重要的原因是可读性,由于是英文教材,所以面对密密麻麻的单词,任英语水平再怎么好的人,总是会觉得烦。这本书的字写得不是很密,很清晰,而且遣词造句都用的是十分简单的单词和语法,读起来反而比中文更加清爽。

上面推荐的这本教材实际上是入门级的,如果对LBM已经有了足够的了解的话,这本教材是没有看的必要的。但是如果对LBM一无所知的话,这本教材会是一本十分合适的入门读物。

接下来推荐的是一本进阶级的LBM教材:黄海波 & 陆夕云:《Multiphase Lattice Boltzmann Methods: Theory and Application》。院士出品,必属精品,是一本在LBM多相流动方向不可多得的好教材。
格子玻尔兹曼机(Lattice Boltzmann Method)系列2:LBM在不可压缩流动下的核心算法_第2张图片
这本书在Wiley数据库可以找得到,如果有买他们的版权的话可以直接在该数据库下载。

算法简述

正式开始这篇文章的核心内容:介绍LBM的算法。

在此之前,需要搞懂的是,LBM究竟算是粒子法,还是网格法?从上一篇博文的推导引入了粒子碰撞的角度来说,似乎可以算是粒子法,然而在实际写代码的时候,却会发现这本质上还是一个网格法的写法。

我倾向于认为LBM实际上是一种有网格方法。
格子玻尔兹曼机(Lattice Boltzmann Method)系列2:LBM在不可压缩流动下的核心算法_第3张图片
上图来源于我推荐的第一本教材的第四章,是二维情况下的D2Q9模型。在LBM中有许许多多的模型,比如在二维情况下的D2Q7模型和D2Q9模型,或是三维情况下的D3Q15模型和D3Q19模型。一般来说,在二维情况下,都是直接选择D2Q9模型。三维情况下选择D3Q15模型的人还是不少的,尽管如此,建议还是尽量选择D3Q19模型。
格子玻尔兹曼机(Lattice Boltzmann Method)系列2:LBM在不可压缩流动下的核心算法_第4张图片
上图来源于我推荐的第二本教材。从a-b,分别对应于D2Q7模型,D2Q9模型,D2Q15模型和D3Q19模型。这里的D显然指代的是维度(Dimension),而Q则指代了该粒子处的分布函数一共有几个方向。

以D2Q9为例,在图中,我们只能看到上、下、左、右、左上、右上、右下、左下一共8个方向,剩下的一个方向被称作e0,是由自己指向自己的零向量方向。不同的模型对应于不同的方向向量:
在D2Q9模型中的方向向量:
D2Q9模型方向向量
在D3Q19模型中的方向向量:
D3Q19模型的方向向量
每一个方向向量都指向了对应的邻接粒子,分布函数的信息都是依赖这些方向向量的连接进行传输的。

Step0.进行初始化

任何CFD算法的第一步都是进行相应的初始化。以下不做特别说明,均将以D2Q9为例展开说明。

首先需要定义一个格子玻尔兹曼盒子的网格长度方向数目Lx和宽度方向数目Ly,于是得到了(Lx - 1)(Ly - 1)个粒子。这里提醒新手们一个十分重要的地方,就是网格的边界处不要放真实粒子。如果在边界处也放置了真实粒子的话,很显然,我们可以达到内存的最大化利用,得到(Lx + 1)(Ly + 1)个粒子。但是如果需要在这个代码为基础进行接触角模拟设置的话,需要在边界处留下一层ghost area,而这一层ghost area已经被事先放置了真实粒子,这就会导致上千行的代码还需要重头改一遍,麻烦不说,还很容易出错。如果确定自己对于ghost area没有需求的话,当然这一部分就没有必要在意。

我们现在得到了(Lx - 1)*(Ly - 1)个粒子,需要在每个粒子上都设置对应的密度,速度,受力,状态,分布函数,辅助分布函数和平衡分布函数。其中密度,受力和初始速度都可以由自己的需求进行相应的设置,状态即该位置处是流体点还是固体点。

分布函数、辅助分布函数和平衡分布函数在初始化阶段都会被设置为相同的值:
平衡分布函数公式
这个公式本质上是平衡分布函数的算法,只是在初始化时,将分布函数和辅助分布函数都设置为了与平衡分布函数相同。其中e是已经介绍的方向向量,而u是粒子速度。

c是格子声速。但是尽管拥有这样的名称,这个格子声速与《空气动力学》中的声速毫无关联。在LBM中,c = dx / dt,即空间步长与时间步长的比值。一般来说会被设置为1。

w是各个方向向量的权重,在不同的维度和模型下,拥有不同的参数:比如在D2Q9模型中,e0方向上的权重为4/9,e1-e4方向上的权重为1/9,而e5-e8方向上的权重为1/36。可以看到,权重具有归一化的性质,同时方向向量的长度越长,所占权重就越小。

在D3Q19模型中,长度为零的方向向量权重为1/3,长度为1的方向向量权重为1/18,其他方向向量权重为1/36.

无论是D2Q9模型还是D3Q19模型,权重都是在满足质量守恒与动量守恒和归一化三大条件下推出来的,有兴趣的同学可以做一下重新推导或者是正确性验证。

1.Streaming process

在格子玻尔兹曼方法中,粒子碰撞过程被划分为Streaming和Collision两部分,原始的方程为:
原始方程
该方程被拆分为了Streaming和Collision两部分,这里的c向量是格子声速与方向向量进行数乘的结果。
Streaming:
Streaming part
Collision:
Collision part
算法的第一步就是进行这个Streaming过程,即每个粒子都将自己的分布函数沿着相应的方向向量传给邻接的粒子。考虑到如果其中一个粒子的分布函数直接扩散到邻接的粒子上,该粒子原本的分布函数信息就会丢失,所以一般的过程是将分布函数信息传播到一一对应的辅助分布函数数组中,完成之后再将其原原本本的复制回去。这也是为什么在初始化时有要求一个辅助分布函数,这个解决方法十分直观,但是绝对不是一个最优解。然而考虑到在并行化过程中可能会遇到的困难,实际上这是一个十分省心省力的算法。

2.边界条件计算

边界条件的内容比较多,会留到下一篇博文中进行详述。

3.宏观量计算

在这一步,会需要每个粒子经过Streaming过程更新迭代步之后,根据自身新的分布函数,进行密度,速度和力的宏观量计算。
格子玻尔兹曼机(Lattice Boltzmann Method)系列2:LBM在不可压缩流动下的核心算法_第5张图片
上图是D3Q19模型下,密度的计算方法,即所有的分布函数直接进行加和。方法源于上一篇博文中的积分结果。
格子玻尔兹曼机(Lattice Boltzmann Method)系列2:LBM在不可压缩流动下的核心算法_第6张图片
同样这里有速度的计算方法,也是来源于上一篇博文中的积分结果。

注意在这里,因为量纲的原因,需要将方向向量e向量点乘上格子声速得到c向量。

4.Collision process

在这一步执行碰撞方程中的collision步:Collision part,实际上,在上一步“宏观量计算”中计算得到的受力如重力或表面张力,都会在这里被耦合进入,方程被更新为:
Collision part
即在原方程的基础上增加了源项S,做CFD的同学,尤其是研究过有限体积方法的,对于源项一定不陌生。在这里,源项可以简单地等价为“力项”,上一步计算得到的力,在这一步中直接扔进源项即可。

这里碰撞项需要计算的平衡分布函数,在一开始就有提及:平衡分布函数公式。

最后是更新时间步 t = t + dt,然后计算程序是否收敛,如果收敛则计算完毕,跳出迭代,否则迭代回到第一步。

总结

这一篇文章主要是推荐了基本LBM的教材,讲了LBM的核心算法。由于篇幅限制,而且边界条件的种类也比较多,在这篇博文中没有讲边界条件的计算。在下一篇文章中会完整地将边界条件的各种算法整理出来。

你可能感兴趣的:(格子玻尔兹曼机(Lattice Boltzmann Method)系列2:LBM在不可压缩流动下的核心算法)