淺談CFD學習之路

close-up photo of calm water

CAE專欄的第一篇文章就先來聊聊我對CFD學習的看法吧!CFD是Computational Fluid Dynamics的縮寫,中文名稱為計算流體力學。顧名思義就是運用電腦來求解流體力學的問題,對CFD有點概念的人都應該知道流體統御方程式為偏微分方程,目前大多數偏微分方程尚未有解析解,因此才以數值方法來求解流體問題。

本文預設給已對CFD有些概念的讀者看,非相關領域者有些疑惑是正常的喔!在後續系列文章中,主廚也會更為全面地介紹CFD這個主題。

今天主要聊的是我個人學習CFD的想法。當然,每個人適合的學習方法不同,能夠以這個為基礎調整,或者是找出適合自己的學習心法。

釐清CFD學習方向

從計算流體力學的名稱可知CFD包含兩個部分,分別是數值方法流體力學。這兩大類又可以再往下細分,好比說數值方法中包含離散方式與求解演算法等等,流體力學則是講述流體的基本現象與力學概念,如果還有其他考量,比如燃燒、化學反應等等,涉及的學科就會更加廣泛。綜上所述,學習計算流體力學就是學習這些數值方法以及求解對象

首先,初入CFD的新手要先釐清自己的學習取向究竟是CFD本身還是應用CFD來解決流體問題。如果是研究CFD本身,那你學習數值方法的比重自然要提高;反過來說,若你本身是應用CFD解決特定流體問題,數值方法的比重也許會較前者來的低一些,但這不代表學習數值方法不重要,若是不懂你用的工具,沒辦法針對不同問題套用合適數值方法,最後結果很可能是Garbage in, garbage out。

打個比方而言,如果要求解流場中不同尺度的渦流,LES模型會比RANS模型來的更適合一些。又或者是採用一階迎風差分格式(First-order upwind scheme)雖然求解較為穩定,但會有假擴散(False diffusion)的問題。無論學習取向是CFD本身或是應用CFD來解決問題,數值方法與相關流體知識都是缺一不可,但學習取向的不同會影響到學習比重的分配

CFD數值方法的學習

前面提到不管是什麼學習方向,學習數值方法都是必要的。以目前商業主流而言,求解流體問題一般都是用有限體積法(Finite volume method),以主廚讀過的CFD書籍來看,這些書本的編排方式大致如下:

  1. 數學理論回顧:不同種類的PDE特性、向量微積分、矩陣操作等等
  2. 統御方程式(Governing equations)介紹:流體力學簡介與相關統御方程式推導
  3. 離散格式介紹:網格劃分、方程式離散格式與性質探討
  4. 求解演算法介紹:常運用於數值流力求解的演算法介紹,如SIMPLE、PISO等等。

除此之外,書本中也會提到邊界條件、紊流模型或者是源項(Source term)的處理等等。從上面歸納來看,我們不難發現CFD的學習與數學脫不了關係,如果想成為CFD的專家,這些學習也是你我都得面對的。話雖如此,我們依然可以選擇定性學習或是定量學習

看到這兒,您可能會有些疑惑,定性學習與定量學習的差異是什麼呢?

數值方法的定性學習

所謂的定性學習就是對數值方法有定性上的了解,好比說用來判斷網格品質的aspect ratio、skewness分別代表什麼;又或者是紊流模型k-ε、SST的差異與使用時機等等。對於使用CFD商業軟體的學習者來說,也許不用熟悉背後數學理論,但要能選擇適當模型或算法來求解問題,才能確保模擬結果準確並更快達到收斂。

數值方法的定量學習

至於定量學習是對數值方法有定量上的理解,熟悉離散格式與演算法的數學算法與邏輯,或是不同物理模型背後的方程式,這部分就像是武功內力一樣,當你從定性理解來到定量理解的階段後,能夠清楚知道軟體上每個操作對數學式子的影響,看待CFD也會有不同的感受。

CFD模擬對象的學習

數值方法在CFD裡面扮演著求解工具的角色,既然是求解工具,勢必會有求解對象的存在。

試想一下,如果今天要求解包含電化學反應的流體問題,卻對電化學一竅不通,這樣還能做出合理的假設與邊界條件設定嗎?所以運用CFD解決問題時,必須對求解對象有一定程度了解。同樣地,這部分也分為定性理解與定量理解。

模擬對象的定性學習

對於模擬對象的定性理解關係到怎麼設定模擬目標、邊界條件的處理、物理模型的選用等等。打個比方來說,如果今天求解旋轉機械的問題,那你可能要知道風扇的性能評估指標,不同風扇具有怎樣不同的特性,套用什麼物理模型才能求解旋轉機械。簡而言之,對這個流體機械有定性上的了解,才能合理設置完整的模擬流程。

模擬對象的定量學習

而模擬對象定量理解又分成數值解與解析解,數值解的部分主要是理解每個物理模型或邊界條件對應的數學式,相較於數值解,解析解多半更容易查看變數間的關係,便於事前評估或事後驗證,建立工程上的直覺。

CFD學習象限圖
圖1 CFD學習象限圖

CFD學習資源分享

前面主要是幫大家釐清學習取向,不過會進來看這篇文章的你肯定也想知道有哪些學習資源可以參考,因此主廚幫大家歸納幾個不同面向的CFD學習資源,希望能給各位CFDer一些參考。

  1. Computational Fluid Dynamics, John D. Anderson:基於有限差分法來介紹CFD理論,適合初學者
  2. The Finite Volume Method in Computational Fluid Dynamics – An Advanced Introduction with OpenFOAM and Matlab:基於有限體積法來介紹CFD理論,書內有OpenFOAM部分程式碼解說
  3. CFD NINJA :ANSYS教學頻道,手把手教你模擬設定
  4. Ansys How To Videos:ANSYS教學頻道,手把手教你模擬設定
  5. CFD Python: 12 steps to Navier-Stokes:Prof. Barba的教學網頁,透過12道Python數值算例,最後帶你實現Cavity flow與Channel flow等經典算例求解
  6. Finite Difference Computing with PDEs: A Modern Software Approach:基於有限差分法來介紹數值方法並用Python實現書內數值方法,適合對數值分析程式有興趣的讀者
  7. 各家商業軟體的Manual:原廠訓練資料或manual是個不錯的參考資料,但需要一些CFD理論基礎
  8. 數值分析開放式課程:國內的話有台大黃美嬌教授與政大曾正男教授的課程,適合習慣以授課方式來學習的對象
  9. CFD Online Discussion Forums:討論CFD的論壇,內有各種疑難雜症的討論

CFD學習歷程分享

由於有讀者詢問主廚學習CFD的心路歷程與方法,因此2022/2/12於《淺談CFD學習之路》本文新增此段落,希望個人經驗分享能夠達到拋磚引玉的效果。

主廚最早是從商業軟體開始接觸CFD,除了看網路教材以外,也有買些介紹CFD軟體的書來看,初學者階段主要是熟悉軟體操作與設定,雖然對部分設定與邊界條件有些概念,但對求解算法一竅不通,這時只求模擬收斂。

而為了讓模擬順利收斂,也會嘗試不同設定對求解的影響或是到CFD Online Discussion Forum看看各路大神的想法,試著歸納每個設定與算法的意義與特性。這個階段主要是定性上的學習並應用CFD了解流體現象

隨著經手案例增加,模擬準確性也漸漸受到考驗,也有很大一部分是我對模擬結果沒有把握,這時才開始主動學習CFD理論,學習途徑不外乎就是修課或讀書,雖然在定性學習的階段也會被動接收CFD理論,但通常只是看個感覺而已。一段時間的累積後,對於CFD理論也有基本理解,這個階段主要是定量上的學習,對於模擬設定有更深刻的認知,也比較能從數學上的角度來理解模擬設定

再來就是商業軟體漸漸無法滿足研究或是開發上的需求,除了再次加強CFD基礎以外,也開始寫些程式來求解特定問題。這個階段同樣是定量學習,但會更深入求解過程的實踐與細節,釐清自己思考上的盲點,對於算法有更深刻的認知。

雖然每個過程都只用了幾句話帶過,但從起初只求模擬收斂到後來發展數值分析程式求解特定問題,每個階段都花費不少時間,而從定性到定量的過渡期更是需要耐心,有一位好老師或一本好書固然重要,但主廚認為學習心態才是根本,面對過渡期的心態有底下幾個重點:

從定性到定量需要大量思考

定性描述可以幫助我們快速理解不同方法的特性,不太需要深入思考就能吸收這些結果。但CFD定量上的學習伴隨大量數學,要理解這些數學表達與計算邏輯,需要耐心思考與反芻,所以請做好這方面的心理準備!

從定性到定量需要多方學習

在思考與反芻的過程中,通常都會遇到學習上的盲點,無論怎麼讀就是讀不通,如果身邊有人可以請教,不妨試著討論看看。如果沒有這樣的對象,可以從不同資料來理解同一個學習對象。比如說這本書的方程式推導不管看了幾次都無法理解,也許原先那本書在推導過程省略的觀念恰巧是你卡關的盲點,這時可以看看其他書本如何推導,補上不足的那塊拼圖。

從定性到定量需要循序漸進

CFD是一門綜合學科,除了流體力學以外,也涉及到偏微分方程與線性代數等學科,複雜難懂的數學令人退避三舍,但這些複雜的數學表達也是由基本觀念建立起來,這也是為什麼教科書開頭會有個介紹CFD常用數學的章節。

所以學習CFD的心態必須要循序漸進,如果一開始就想處理複雜的流體計算問題,還沒做之前就先放棄一半了。所以哪怕是跟流體毫無關聯也沒關係,先從簡單的數值分析案例開始,至少執行過程中遇到問題比較有頭緒,而基本的數值分析觀念對於後續學習其他學科或是計算流體力學會更有幫助。

目標/需求導向的學習模式

最後一點則是目標導向的學習模式,有個目標或需求會讓你的學習方向更加明確,更容易判斷學習項目的必要性與先後順序。以修課這件事情來講,在沒有目標的情況下可能聽起來有懂就好,但如果目標是寫個簡單的求解器,你就會判斷這些內容需不需要深入理解,如果需要的話,那我要如何把這些內容拿來實踐求解器的哪個部分,你的目標會決定你的思考深度

而當目標涵蓋範圍太廣的時候,需要將一個目標切成好幾個小目標,循序漸進完成各個小目標,也就是前面第三點說的。沒辦法一次到位就分成好幾次,沒有硬功夫就下功夫鑽研,累積久了自然就有功夫

主廚結語

主廚下了個淺談CFD學習之路的標題,是因為CFD有著太多需要學習的東西。若您從事學術研究或前端開發的話,可能會遇到商業軟體無法滿足需求或是研究上需要驗證數值算法的狀況,這時需要對CFD有更深入的定量了解,才能撰寫程式來解決更深入的難題。若您在業界從事CFD模擬的話,如何處理複雜的幾何模型,快速得到模擬結果,也許才是您當下模擬的重點。

CFD的學習是條漫漫長路,主廚自己也還在學習路上,這些經驗與看法不見得完全適用在你身上,但希望一點經驗分享能夠幫助到同樣學習CFD的你。

6 thoughts on “淺談CFD學習之路”

  1. 你好!我目前是用OpenFoam正在進行流體分析的碩士生,但流體力學裡面的數學式,已讓我從大學困擾到現在,看完您的各篇文章,想請問科技大大,在那麼多的微分方程(偏微分方程)中,我大多是死記下來,亂流模型 等等的 也大多是死背,想請問科技大大,如何有效對於方程式有更深的理解,以及如何加強數值解析的部分呢?謝謝科技大大

    1. 嗨!先謝謝你看過我這些文章!

      關於如何對方程式有更深的理解,這些PDE說穿了都是用來描述物理現象,方程式中的每一項都有著對應的物理意義。舉例來說,NS方程用來描述流體的動量守恆,如果知道這點的話,就可以猜到NS方程的組成項與受力相關,而流體受力又與慣性力、黏性力、壓力等等有關,所以在NS方程可以找到描述這些受力的項,以物理意義去理解的話就不太需要死背。

      而加強數值解析的部分,除了看書以外,寫些數值分析的程式會對你在這方面的學習更有幫助,事實上CFD的涵蓋範圍很廣,從離散格式、矩陣求解、一直到演算法等等,每個部份都有很多東西,如果目的是學習數值解析的話,建議先從簡單的案例開始,好比一維常微分方程該如何離散,不同離散格式下的求解表現有何差異,這些案例不見得與物理有很深的連結,但可以讓你比較好掌握不同解析方法的特性。

      另外再補充一下,無論是偏微分方程的理解或是數值解析的加強,也可以多聽聽不同的人對同一件事物的解釋,好比NS方程的推導雖然大同小異,但每個人都會用自己的方式詮釋推導過程,也許看著我網站上的文章理解了50%,但另外一本書的解釋又讓你的理解程度從50%到70%。從不同的角度切入,再加上自身的學習與思考,長時間下來就會有一套自己的體悟。

      以上是我的小小分享,一起加油!

      1. 感謝F大的 建議,
        其實我做模流到現在,一直以來都是用教程的案例去做一些改變, 裡面一些比較深的離散格式、矩陣求解、等等我還是一知半解, 離可以寫出具有新創性的論文可能還有一段距離, 簡單來說,我目前還是在”定性學習” 的過程 . 例如為什麼要離散? 離散又是什麼 我都還不識很清楚. 想請問F大 如果要進階到定量學習, 也就是對F大文章所說的熟悉離散格式與演算法的數學算法與邏輯, 除了F大推薦的英文書, 寫些數值分析的程式, 能否請F大分享一些 F大學習的方法以及心路歷程, 感激不盡.
        順帶提一下我的目前的狀況, 目前我能自己從一些既有的案例中, 套用其數值解析方法, 並且畫出一些簡單圖形, 如管子 並對其進行管內流的分析, 也就是說 我能自行設定邊界條件,以及套用何種演算法, 但接下去的數值方法的與數學我是相當薄弱的.
        感謝F大的回覆, 我會繼續加油!

        1. 嗨,感謝你的提問。為了更完整地回覆你的疑問,我在文章中新增CFD學習歷程分享的段落,同時增加幾個學習資源以供參考,如果有時間的話可以讀一讀喔!

  2. 感謝版主無私分享CFD的學習之路, 我們是兆水科技, CFD的專業軟體代理商, 也希望能貢獻一點所學幫助想學習的人. 以下為我們技術主管許博士的影片, 有興趣的話可以看一下https://www.youtube.com/watch?v=eevkistzt_I

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。