ANSYS fluent進行流體計算時,計算機內存和可計算的最大網格數有什麼關係?

內存和網格數的故事


我是學計算機開發和CAE的,目前在「模擬在線」做CAE分析師工作,我的經驗可能更適合回答你的問題,需要結合計算機和有限元求解器來回答你的問題:

一個網格就是一個節點,一個節點有6個自由度且對應一個方程,這個方程有6個未知數(即6自由度),現在64位app系統的數值大都為雙精度,即每個變數8位元組,那麼數量存儲要6x8=48位元組,方程表達式本身應該是個對象,該對象本身估計佔據128位元組(主要用於存儲函數公式等,每個函數指針8位元組估算,約10個函數-通過動量守恆質量守恆能量守恆等方法建立的),那麼一個對象一共需要128+48=176位元組。

那麼一百萬網格,至少需要內潤是100,10000X176=168MB

但這個是沒有計算時,靜態情況下需要的內存,一旦進入求解階段,會產生更多的內存需求。

比如,每個函數運算過程估計要重新建立多個存儲變數,而且,有限元方程在求解過程,直到最後才消除所有未知數,中間基本不會有方程先被完全求解出來,意味著這100萬方程一直必須駐留內存,隨著求解的進行,中間結果的駐留內存會越來越多。

根據具體經驗,這個增長倍數大概是20倍,即168x20=3.3GB,即100萬節點,最終需要的內存大約是4GB,加上求解器本身內存和操作系統內存,100萬網格時你的內存至少是在8G,否則很難進行運算。

具體內存,跟求解器的類型有關,即求解的演算法決定。

隨著數學和計算科學的發展,人類對求解大規模方程的領域一直在尋求更好的理論和實踐,數學理論和並行計算,兩者缺一不可。

現在計算機的並行運算能力突飛猛進,一個GPU就能產生1個Tflops的雙精度浮點運算,但是數學和計算機科學怎麼有效利用這個並行計算能力,就是ansys、Abaqus那些公司每天都在研究的事情了。


如果變數數不是很多的話,1百萬網格大約1-5個G的內存吧。。取決於你有多少求解的變數了。。。。。 理論上最有效率的應該是每個CPU核心分擔大約數萬個網格點。。。如果你是8核的電腦。。。網格超過一百萬之後效率其實很低的。。。


列個明細帳:

典型的Fluent計算:三維。兩方程湍流模型。非結構網格。二階有限體積法。

以下估算僅為所需內存量的下界,實際上還有limiter和AMG之類的內存開銷,暫時不管之。

每一個網格需要保存的量:

本網格編號:1個整數。

幾何坐標:3個浮點數。

網格體積:1個浮點數。

網格界面面積:4到6個浮點數。取決於網格類型。下同。

網格界面法向:12到18個浮點數。

相鄰網格編號:4到6個整數。

物理量:7個浮點數。

隱式計算的小矩陣:7*7=49個浮點數。

可能還有遺漏。

注意32位計算機的內存上限是4Gb。實際上能算的網格量只有幾百萬。所以一般不推薦32位版本 。


http://www.cfd-online.com/Forums/fluent/115642-fluent-mesh-dependent-memory-requirements.html

這裡說每一百萬網格用3-4GB內存;

http://www.cfd-online.com/Forums/fluent/85582-fluent-parallel-memory-usage.html

這裡說每一百萬網格1GB內存,但是二樓說他還用了 swap memory,不知道指的是不是硬碟的交換內存,如果是的話可能會大大影響速度,因為硬碟讀取速度遠慢於內存。

為什麼其他人說了一大堆也沒給出題主答案?我相信題主應該是知道你們說的網格越多消耗資源越大,他想要的應該是定量的結果。


好吧, 我發現我實在太懶了, 本來想寫一個很長的答案, 不過覺得真的寫完可能要花小半個月了....所以, 我決定寫一個短小的答案.

(本文將假設受眾對PDE和數值方法有所了解, 對所涉及的內容不做基礎科普)

首先, 據我所知, FLUENT 是使用有限體積法(finite volume method)來離散Navier-Stokes方程的, 什麼是有限體積法呢, 讓我們利用一個有限微元上的質量和動量的改變來展開。

mass conservation: intop_{Omega}frac{partial 
ho}{partial t}dV+intop_{partial Omega}
ho ucdot hat{n}dA = 0

上式的意思是說, 我們觀察一個微小的體積元, 在這個小微元里, 密度的改變率, 等於單位時間內伴隨著速度流進微元的物質和單位時間內流出微元的物質的率. 這兩個的和, 應該為0

我們再考慮 動量守恆 :

momentum conservation

intop_{Omega}frac{partialleft(
ho u
ight)}{partial t}dV + intop_{partialOmega}left(
ho u
ight)ucdothat{n}dA+intop_{partialOmega}left( 	au cdot hat{n}
ight)dA = intop_{partialOmega}-left(phat{n}
ight)dA

改變率 流通量 擴散 施加的壓力

如果說我們把空間離散成一個個的小方格

並在小格子的中心記錄壓力的數值, 在小格子的面上面記錄速度的數值, 我們假設這一個格子足夠小, 小到在裡頭的壓力值是可以以中心的值來代替的, 那麼, 以上的質量守恆式就能寫成

frac{u_{i+frac{1}{2},j} - u_{i-frac{1}{2}},j}{Delta x} + frac{v_{i,j+frac{1}{2}} - v_{i,j-frac{1}{2}} }{Delta x}  = 0 ;

意思是從這個小格子的每一個「面」 上單位時間內流入和流出的量是互相抵消掉的。 (因為流體不可壓, 所以每個小格子里的質量既不會增多也不會減少)

同樣的, 我們用這種方法來重寫那個連續的動量守恆式, 那麼對於一個動量
ho u_{i+frac{1}{2},j}, 我們有


hofrac{u_{i+frac{1}{2},j}^{n+1}-u_{i+frac{1}{2},j}^{n}}{Delta t}h^{2} + 
sum_{faces}left(
ho u
ight)V_{f}h+p_{i+1,j}-p_{i-1,j}=muDelta u_{i+frac{1}{2},j}h^{2}

改變率 流通,非線性 壓力差 擴散/粘性摩擦

對於不可壓流來說, 我們通過一個額外的壓力泊松方程把壓力和速度聯繫起來, 這個方法又叫做投影法(projection method), 因為我們需要u^{n+1} 滿足


abla cdot u^{n+1} = 0

而在完成了顯式的流通量(還有隱式格式, 這裡不展開討論) 和半隱式格式, 半顯示格式的擴散項計算後, 我們有

frac{u^{n+1}-	ilde{u}^n}{Delta t} = -frac{1}{
ho}
abla p

其中	ilde{u} 是那個中間步驟得到的數據.

對兩邊同時做
ablacdot 操作, 我們得到了


abla^{2}p = -
ho
ablacdot 	ilde{u}

這個時候, 如果我們對於每一個小格子i,j, 計算出
abla cdot 	ilde{u} _{i,j}, 並且離散化Delta p _i,_j我們就可以立出一個關於p_{i,j}的線性方程組.

Ap = b

解得壓力之後, 我們就能得到我們想要的, 無散的速度場.

u^{n+1} = u^n - Delta t 
abla p

對於二維情況來說, 矩陣A通常是這樣的

當然, 這只是很小的一個矩陣, 實際應用中, 我們需要把一塊數值模擬的區域分成很多很多小格子, 拿一個1米x1米的區域來說, 如果你想要計算出每一個厘米的細節, 你就需要分成 100x100個小格子, 而這些小格子里的信息, 必須全部存在計算機內存中. 如果是三維的情況的話, 1米x1米x1米 你想要得到每個立方厘米的細節, 你就得分成100x100x100個小格子, 這些小格子裡頭存儲著壓力, 速度等的數值的信息, 而矩陣A的數據量需要 未知量^2(平方) , 就是說, 如果你有10000個未知量的話, 矩陣A的a_ij的數量就是100,000,000, 如果你有1,000,000(三位情況)個未知量的話, 矩陣A就根本存不下! 所以說, 現實情況中求解Ap=b的演算法通常由迭代法或者多重網格法並結合係數矩陣數據結構來完成(超過本篇範圍, 不展開討論).

除了這種簡單的把區域分成小格子的情況外, 有限體積法真正超越有限差分法的優勢在於他可以處理各種非結構化網格, 比如這些:

在使用非結構化網格的時候, 我們有需要額外的存儲空間來保存網格的點線面之間的鄰接關係的數據結構. 所以說, 這也就不難理解, 為什麼你的網格分得越細, 所需要使用的計算機內存就越大了.


內存越大網格數越多,因為在迭代時,每個格點本質上是數據點,這些數據都要存到內存里


以我個人電腦的經歷,在以前32位系統,限制了最大內存,無論怎麼在虛擬內存上下功夫,網格數過百萬,計算起來非常耗時。

目前,使用的工作站,64位系統,隨著內存的擴大至32G,可以處理千萬級別的網格。時長勉強能夠接受。

1400w網格,穩態計算 3小時計算了1000步


暫時用爪機回答,以後補充。我以前的東西就用ansys做的,自學了很久。它使用的是有限元的分析方法,講造型的面積(體積)根據你所想達到的精度網格化,當時我用自己的筆記本做,出來的結果真是令人辛酸,超出了置信區間,以至於覺得我的方法不正確,那會計算機性能都比較差,心想自己幾十頁微分方程和矩陣搭建的模型可能泡湯。最後去了一個國家級實驗室的小型機里跑了一下,才基本達到預期的結果,從這個小事我想告訴題主ansys是個吃內存的貨,要想得到精確結果和較快運算速度還是找個好的平台。現在ansys出的模塊可以分散式運算了,一般是做流體力學和精密機械、爆炸力學。


內存太小 就算勉強畫完網格 開始運算基本電腦就廢了。


內存是網格總數的限制,網格越多結果越精確


簡單的說,內存不足的話網格劃分都不成啊(例如用普通家用機劃分100萬網格的悲劇TT)


內存越大,能計算的網格數量越大。CPU越強,計算速度越快。內存不夠就會反過來限制計算速度。基本就是,內存達標即可,CPU越強越好。


最慢的是CPU訪問內存數據的時間。


取決於變數數,一般認為每一百萬網格用3-4GB內存;


放心,限制你運算的是你的CPU


推薦閱讀:

TAG:流體力學 | 計算流體力學CFD | fluent | 計算機輔助工程CAE | ANSYS |