在Niagara中基于LBM优化流体性能(上)

之前一直就对流体感兴趣,可是每次把官方的示例拖到场景中,我那可怜的2060显卡的帧数就从80多降到40多,实在提不起干劲去做,做了又能用上吗?这样的借口让我始终不去研究它。近段时间,在各种机缘巧合之下,我决定还是去啃这个流体,也从中收获到了很多。
本篇文章主要从以下两个方面着手。首先介绍Lattice-Boltzmann method(简称LBM,格子玻尔兹曼)的入门知识以及一些流体的零零碎碎。而后介绍官方的流体示例,就是那个点开一看很长的一个发射器。刚开始看见是真的被吓住了,但其实看下来后也还好,只不过需要花时间罢了。我打算用通俗易懂的方法去讲解,难免会遇到一些错误或疏忽,希望大家多多提提意见。不多废话了,直接开始正文吧!

从细菌的游动、毛细血管中的血液流动、喷墨打印再到早晨的露珠、风力发电的叶片甚至到大气海洋的流动。从微米到千米,横跨接近10多个数量级的长度。这些物体的运动规律都可以用Navier-Stokes(简称NS)方程来描述。
NS方程是二阶非线性偏微分方程,极其难求解,到现在为止,也只有几十个特解,分别对应某种简单的流动。如果对偏微分,梯度算子,还有一些杂七杂八的数学知识不太清楚的话。推荐一个UP主,3Blue1Brown(3Blue1Brown的个人空间_哔哩哔哩_bilibili)。这里并不打算去深入探讨NS方程。我们这里要介绍的是另一种求解流体的方法LBM。
数学公式太难打了,后面还是用图片吧~~~。LBM方法是处于宏观与微观之间的一种控制方程,就是我不管流体中每一个分子的去向,太多了嘛,算不过来。我只管一定范围内分子的运动规律,这个范围内的分子可能朝向四面八方的速度乱飞。我们只对朝那个方向飞的概率感兴趣。给出分布函数的概念,即在某个时刻,某个位置上,这个
速度上有多少分子。

这些PPT来源于Timm Kruger教授居家作了一个标题为“Introduction to the Lattice-Boltzman Method for Hydrodynamics”的讲座,B站就有搬运的。
上面这张PPT我们需要了解两点,分布函数具有归一化的特点。这点我们好理解,在一个系统里面,分子无论如何运动,它的数量是不变的。提高温度,温度在微观上表现为分子运动的剧烈程度,也只是分布函数的图像会发生改变。对空间所有方向上的积分,简单理解就是把所有速度方向上的分子数全部算出来,得到分子密度
。一开始我对这里要有疑问,只是把所有的分子数目算出来就是密度了?后来想想也有道理,我们常规的密度定义是质量与体积之比。这里单位体积中分子数越多,意味着分子密度越大。好像有些道理,与质量联系起来,无非差一个分子质量,总之先这样理解吧。然后乘以对应的
速度,得到分子动量。

将分布函数对时间求导,然后数学变化,得到上面的式子。等式右边那个叫做碰撞算子,为什么引用这玩意,因为这玩意太复杂了,管它三七二十一先用个符号表示下。一般不为0。有人可能好奇,为啥一般不为0。流体一般都会随着时间流动,流动分子间就会相互碰撞,所以一般不为0。正是因为有碰撞这一过程,分布函数才会不断的改变。

在BGK模型中,碰撞算子可以这样表示,即流体从某一状态恢复到平衡状态所用的时间。是我们熟悉的弛豫时间,弛豫时间(relaxation time)是指一个物理系统在受到扰动后,从非平衡态恢复到平衡态所需的时间。这就和物体的粘度系数联系上了,我们设想一下把瓶子中的液体倒过来,蜂蜜和水恢复到平稳状态所用的时间是不一样的。

接下来考虑离散化,啥叫离散化了。其实这个还是最好理解的,就是把时间、空间看成一个一个的。在游戏中,我们常常提到分辨率,这就是对空间的离散。帧率,DeltaTime,以及蓝图中的Tick都是对时间的一种离散体现。而在物理学中,时间的最小单位可能是普朗克时间,10的负44次方,一看后面这么多小数就知道实验很难直接观测,扯远了。我们还需要对速度离散,不可能测量所有方向上的速度。所以就有DNQM模型,D2Q9模型指的是二维平面,分子有九个不同的速度方向可以跑。上面的图是D3Q19大家可以数一数,其中粒子不移动也算作一个可能的速度方向。
这里就可以看出官方为了性能有多大程度的优化了,在官方示例中,三维空间只考虑上下左右前后和不移动七个方向上的自由度,即D3Q7模型,可谓是丧心病狂。别人二维都有9个方向的自由度,从这里开始,后面的边界条件我也一样摆乱,要咋简单就咋简单。反正特效嘛,好看就行。交互嘛,有那种感觉就行。至于交互的准确性,那不是游戏该考虑的事。等硬件水平再提升一个次元再说吧。


注意下面两个离散化的求和公式,之后要用到的。这是将介观与宏观联系起来的一组式子。对分布函数求和得到密度,分布函数与即速度方向求和得到流体动量。


随后进行一系列的推导后得到BGK模型下的LBM方程,我们注意到物体的粘度和声速有关,这个一开始我也是特别疑惑,和声音也有关系嘛。后面查了一些资料,给出自己一个浅显的理解,流体一般我们研究对象是空气与液体,而声音在固液气(介质中)中传播速度也不同。对于空气动力学这一分支尤为明显,当火箭或者导弹达到很高的高度后,空气变得十分稀薄,以至于可以忽略流体的影响。这个时候无论研究流体还是声速都没有太大意义了,这个边界一般称作卡门线(Kármán line)。平衡分布函数是由麦克斯韦-玻尔兹曼分布得来的,这个我们直接拿结论用吧,如果想知道怎么推导过来的,应该涉及到统计力学,感兴趣可以深入研究下。

便于计算,需要把这一方程分为两部分,一个是碰撞部,一个是迁移部。这一部分是比较难理解的,举一个不那么形象恰当的例子吧,主要理解这个思想,一个兵兵球砸在墙壁后反弹。很简单,但是在砸在墙壁的一瞬间,我们将其分为三部分。第一部分,兵兵球以一定速度砸在墙壁。第二部分,兵兵球形变。第三部分由于兵兵球形变需要恢复原状,我们可以根据兵兵球形变的程度推测在下一个时间,兵兵球所处的位置。如果觉得还是难以理解,可以看看之后这部分怎么在程序中实现的,那样可以加深理解。不断重复迁移碰撞,就实现流体的移动了。
接下来简单谈谈LBM的优点,最大的优点就是快!NS方程需要求解泊松方程,就是那个倒三角还来个2次方的家伙。之后可以看看官方为了求这个用了多大的计算量。而LBM方程就不用求解了,非常舒服。还可以并行化计算,也比较容易计算复杂几何体。
那么古尔丹,代价是什么。一大堆,只能模拟小马赫数,可压缩性问题啊等等。这个又关我特效什么事呢,咱只要好看就行了,帅就完事了。但如果做仿真的话,还是建议多多深入研究,我就只能到这里了。
接下来就是边界条件了,边界条件又是啥?这里问下AI吧,我给出GPT的回答。
流体力学的边界条件是指在流体中的边界处,需要满足一定的物理条件,以保证流体中的速度、压强、密度等物理量的连续性和稳定性。下面是流体力学中常见的边界条件:
无滑动边界条件:在流体与固体边界相接触处,流体与固体表面的速度相同。这个条件通常用于描述固体表面的粗糙程度较高的情况。
无渗透边界条件:在流体与固体边界相接触处,固体表面不允许有流体渗透。这个条件通常用于描述固体表面不渗透的情况。
自由表面边界条件:在流体中存在自由表面的情况下,自由表面处的压强和重力相平衡,同时自由表面处的速度沿法向方向为零。
入口/出口边界条件:在流体的入口和出口处,通常需要指定流体的速度、密度、压强等物理量。这些物理量可以由外部条件或者实验测量得到。
对称边界条件:在流体中存在对称性的情况下,可以使用对称边界条件来描述流体的性质。例如,可以假设流体在对称面上的速度和压强相等。
周期性边界条件:在流体中存在周期性结构的情况下,可以使用周期性边界条件来模拟流体的行为。例如,在计算流体在管道中的流动时,可以使用周期性边界条件来模拟管道的周期性结构。
以上是流体力学中常见的边界条件,实际应用中还可能存在其他特殊情况,需要根据具体问题选择恰当的边界条件。
教授提到,截止到2019年,已经有200多种边界条件的点击。反正很多就是的。这里介绍比较简单好理解的边界条件之一,就是当遇到边界时,从哪里来回哪里去。他还提到一种浸入边界法,有点复杂,这里不再赘述了。啊,我的处理是好像直接等于0就完事了,没办法性能不够。