在Niagara中基于LBM優(yōu)化流體性能(上)

????????之前一直就對流體感興趣,可是每次把官方的示例拖到場景中,我那可憐的2060顯卡的幀數(shù)就從80多降到40多,實在提不起干勁去做,做了又能用上嗎?這樣的借口讓我始終不去研究它。近段時間,在各種機緣巧合之下,我決定還是去啃這個流體,也從中收獲到了很多。
????????本篇文章主要從以下兩個方面著手。首先介紹Lattice-Boltzmann method(簡稱LBM,格子玻爾茲曼)的入門知識以及一些流體的零零碎碎。而后介紹官方的流體示例,就是那個點開一看很長的一個發(fā)射器。剛開始看見是真的被嚇住了,但其實看下來后也還好,只不過需要花時間罷了。我打算用通俗易懂的方法去講解,難免會遇到一些錯誤或疏忽,希望大家多多提提意見。不多廢話了,直接開始正文吧!

????????從細菌的游動、毛細血管中的血液流動、噴墨打印再到早晨的露珠、風力發(fā)電的葉片甚至到大氣海洋的流動。從微米到千米,橫跨接近10多個數(shù)量級的長度。這些物體的運動規(guī)律都可以用Navier-Stokes(簡稱NS)方程來描述。
????????????????????????
????????NS方程是二階非線性偏微分方程,極其難求解,到現(xiàn)在為止,也只有幾十個特解,分別對應(yīng)某種簡單的流動。如果對偏微分,梯度算子,還有一些雜七雜八的數(shù)學知識不太清楚的話。推薦一個UP主,3Blue1Brown(3Blue1Brown的個人空間_嗶哩嗶哩_bilibili)。這里并不打算去深入探討NS方程。我們這里要介紹的是另一種求解流體的方法LBM。
????????數(shù)學公式太難打了,后面還是用圖片吧~~~。LBM方法是處于宏觀與微觀之間的一種控制方程,就是我不管流體中每一個分子的去向,太多了嘛,算不過來。我只管一定范圍內(nèi)分子的運動規(guī)律,這個范圍內(nèi)的分子可能朝向四面八方的速度亂飛。我們只對朝那個方向飛的概率感興趣。給出分布函數(shù)的概念,即在某個時刻,某個位置上,這個
速度上有多少分子。
???

?????????這些PPT來源于Timm Kruger教授居家作了一個標題為“Introduction to the Lattice-Boltzman Method for Hydrodynamics”的講座,B站就有搬運的。
???????上面這張PPT我們需要了解兩點,分布函數(shù)具有歸一化的特點。這點我們好理解,在一個系統(tǒng)里面,分子無論如何運動,它的數(shù)量是不變的。提高溫度,溫度在微觀上表現(xiàn)為分子運動的劇烈程度,也只是分布函數(shù)的圖像會發(fā)生改變。對空間所有方向上的積分,簡單理解就是把所有速度方向上的分子數(shù)全部算出來,得到分子密度
。一開始我對這里要有疑問,只是把所有的分子數(shù)目算出來就是密度了?后來想想也有道理,我們常規(guī)的密度定義是質(zhì)量與體積之比。這里單位體積中分子數(shù)越多,意味著分子密度越大。好像有些道理,與質(zhì)量聯(lián)系起來,無非差一個分子質(zhì)量,總之先這樣理解吧。然后乘以對應(yīng)的
速度,得到分子動量。

????????將分布函數(shù)對時間求導,然后數(shù)學變化,得到上面的式子。等式右邊那個叫做碰撞算子,為什么引用這玩意,因為這玩意太復(fù)雜了,管它三七二十一先用個符號表示下。一般不為0。有人可能好奇,為啥一般不為0。流體一般都會隨著時間流動,流動分子間就會相互碰撞,所以一般不為0。正是因為有碰撞這一過程,分布函數(shù)才會不斷的改變。? ??

????????在BGK模型中,碰撞算子可以這樣表示,即流體從某一狀態(tài)恢復(fù)到平衡狀態(tài)所用的時間。是我們熟悉的弛豫時間,弛豫時間(relaxation time)是指一個物理系統(tǒng)在受到擾動后,從非平衡態(tài)恢復(fù)到平衡態(tài)所需的時間。這就和物體的粘度系數(shù)聯(lián)系上了,我們設(shè)想一下把瓶子中的液體倒過來,蜂蜜和水恢復(fù)到平穩(wěn)狀態(tài)所用的時間是不一樣的。

????? ? 接下來考慮離散化,啥叫離散化了。其實這個還是最好理解的,就是把時間、空間看成一個一個的。在游戲中,我們常常提到分辨率,這就是對空間的離散。幀率,DeltaTime,以及藍圖中的Tick都是對時間的一種離散體現(xiàn)。而在物理學中,時間的最小單位可能是普朗克時間,10的負44次方,一看后面這么多小數(shù)就知道實驗很難直接觀測,扯遠了。我們還需要對速度離散,不可能測量所有方向上的速度。所以就有DNQM模型,D2Q9模型指的是二維平面,分子有九個不同的速度方向可以跑。上面的圖是D3Q19大家可以數(shù)一數(shù),其中粒子不移動也算作一個可能的速度方向。
????????這里就可以看出官方為了性能有多大程度的優(yōu)化了,在官方示例中,三維空間只考慮上下左右前后和不移動七個方向上的自由度,即D3Q7模型,可謂是喪心病狂。別人二維都有9個方向的自由度,從這里開始,后面的邊界條件我也一樣擺亂,要咋簡單就咋簡單。反正特效嘛,好看就行。交互嘛,有那種感覺就行。至于交互的準確性,那不是游戲該考慮的事。等硬件水平再提升一個次元再說吧。


????????注意下面兩個離散化的求和公式,之后要用到的。這是將介觀與宏觀聯(lián)系起來的一組式子。對分布函數(shù)求和得到密度,分布函數(shù)與即速度方向求和得到流體動量。


????????隨后進行一系列的推導后得到BGK模型下的LBM方程,我們注意到物體的粘度和聲速有關(guān),這個一開始我也是特別疑惑,和聲音也有關(guān)系嘛。后面查了一些資料,給出自己一個淺顯的理解,流體一般我們研究對象是空氣與液體,而聲音在固液氣(介質(zhì)中)中傳播速度也不同。對于空氣動力學這一分支尤為明顯,當火箭或者導彈達到很高的高度后,空氣變得十分稀薄,以至于可以忽略流體的影響。這個時候無論研究流體還是聲速都沒有太大意義了,這個邊界一般稱作卡門線(Kármán line)。平衡分布函數(shù)是由麥克斯韋-玻爾茲曼分布得來的,這個我們直接拿結(jié)論用吧,如果想知道怎么推導過來的,應(yīng)該涉及到統(tǒng)計力學,感興趣可以深入研究下。

????????便于計算,需要把這一方程分為兩部分,一個是碰撞部,一個是遷移部。這一部分是比較難理解的,舉一個不那么形象恰當?shù)睦影桑饕斫膺@個思想,一個兵兵球砸在墻壁后反彈。很簡單,但是在砸在墻壁的一瞬間,我們將其分為三部分。第一部分,兵兵球以一定速度砸在墻壁。第二部分,兵兵球形變。第三部分由于兵兵球形變需要恢復(fù)原狀,我們可以根據(jù)兵兵球形變的程度推測在下一個時間,兵兵球所處的位置。如果覺得還是難以理解,可以看看之后這部分怎么在程序中實現(xiàn)的,那樣可以加深理解。不斷重復(fù)遷移碰撞,就實現(xiàn)流體的移動了。
????????接下來簡單談?wù)凩BM的優(yōu)點,最大的優(yōu)點就是快!NS方程需要求解泊松方程,就是那個倒三角還來個2次方的家伙。之后可以看看官方為了求這個用了多大的計算量。而LBM方程就不用求解了,非常舒服。還可以并行化計算,也比較容易計算復(fù)雜幾何體。
????????那么古爾丹,代價是什么。一大堆,只能模擬小馬赫數(shù),可壓縮性問題啊等等。這個又關(guān)我特效什么事呢,咱只要好看就行了,帥就完事了。但如果做仿真的話,還是建議多多深入研究,我就只能到這里了。
????????接下來就是邊界條件了,邊界條件又是啥?這里問下AI吧,我給出GPT的回答。
????????流體力學的邊界條件是指在流體中的邊界處,需要滿足一定的物理條件,以保證流體中的速度、壓強、密度等物理量的連續(xù)性和穩(wěn)定性。下面是流體力學中常見的邊界條件:
無滑動邊界條件:在流體與固體邊界相接觸處,流體與固體表面的速度相同。這個條件通常用于描述固體表面的粗糙程度較高的情況。
無滲透邊界條件:在流體與固體邊界相接觸處,固體表面不允許有流體滲透。這個條件通常用于描述固體表面不滲透的情況。
自由表面邊界條件:在流體中存在自由表面的情況下,自由表面處的壓強和重力相平衡,同時自由表面處的速度沿法向方向為零。
入口/出口邊界條件:在流體的入口和出口處,通常需要指定流體的速度、密度、壓強等物理量。這些物理量可以由外部條件或者實驗測量得到。
對稱邊界條件:在流體中存在對稱性的情況下,可以使用對稱邊界條件來描述流體的性質(zhì)。例如,可以假設(shè)流體在對稱面上的速度和壓強相等。
周期性邊界條件:在流體中存在周期性結(jié)構(gòu)的情況下,可以使用周期性邊界條件來模擬流體的行為。例如,在計算流體在管道中的流動時,可以使用周期性邊界條件來模擬管道的周期性結(jié)構(gòu)。
????????以上是流體力學中常見的邊界條件,實際應(yīng)用中還可能存在其他特殊情況,需要根據(jù)具體問題選擇恰當?shù)倪吔鐥l件。
????????教授提到,截止到2019年,已經(jīng)有200多種邊界條件的點擊。反正很多就是的。這里介紹比較簡單好理解的邊界條件之一,就是當遇到邊界時,從哪里來回哪里去。他還提到一種浸入邊界法,有點復(fù)雜,這里不再贅述了。啊,我的處理是好像直接等于0就完事了,沒辦法性能不夠。