簡介
Nek5000 1 是一個開源的軟體,用來跑流體動力學的模擬, 包含不可壓縮流體(incompressible Navior-Stokes)、和熱傳導的耦合、紊流模型、低馬赫數可壓縮流體的近似解、磁流體等。
主要的特點如下:
- 開源:就是不用錢,程式碼公開,有錯大家抓。
- 使用『譜元素法』2,能在相同的計算資源下達到較高的精度。數值格式誤差的低耗散性相對提昇了對紊流的解析度。
- 可擴展性(Scalaility):平行運算效率很好,一直延伸到百萬個MPI執行序3。 因此獲得一些大獎 1999 Gordon Bell prize4、2016 R&D1005。
- 可攜性(Portability):簡單的編譯環境及同樣的程式設定可以在筆電、伺服器、超級電腦上運行。
- GPU版本參見NekRS6。
命名、起源
在1980年代,隨著譜元素法的理論發展,開始有人研發相對應的程式。NEKTON 2.0是當時(1986-1997)第一個使用譜元素法並支援三維空間和分散式記憶體的軟體,主要開發者為Paul Fischer, Lee Ho, and Einar Rønquist。 後來Fluent上市商轉,將其放入旗下的一個套件(Fluent 後來併入到Ansys下),為了保持軟體的開源性以便學術研究,Paul以Nek5000為名把程式獨立出來,雖然掛在美國Argonne國家實驗室名下,但版權為BSD開源。『5000』據說是當時取名時有一個檔名有這個數字。 現在tools底下的prenek跟postnek(用於網格的建立及簡易的後處理)就是NEKTON那個時候發展的。
程式架構
1990年代至今(2023),Nek5000已經有三十多年的歷史。 大部分程式碼基於Fortran 77 7, 底層的MPI訊息交換以及”Coarse Grid Solver”8 用C語言或是呼叫其他資料庫。
程式碼編譯環境相對簡單,因此能輕易在不同平台運行。
入門門檻稍微有點高,使用界面不像商業軟體可以在圖形視窗按幾個按鈕就能跑出結果, Nek5000的界面多半是文字檔,直接接到主程式碼。 好處是自由度很大,可以調整幾何形狀、邊界條件、以及做一些統計量分析等後處理, 甚至可以直接編寫客製化的模型,或是用Nek的平行架構解其他微分方程,衍生出NekCEM、NekLBM等程式。 但相對地,進階使用者多半需要知道一些平行化後的資料結構,會簡單的MPI通信,要會寫一些Fortran程式, 牽扯到微分積分時還得理解數值方法。 雖然解的問題專注於『特定範圍下』的流體動力學,但拆解下來後,是一個跨領域的程式。
這也體現科學計算、高效能計算的性質。 從應用問題、PDE數學建模、PDE穩定性分析、數值格式設計、穩定性收歛性、數值線性代數預處理及求解、離散網格的建立及優化、平行計算、到資料後處理,如統計量分析、視覺化等。 如同其他高效能數值計算程式,Nek5000使用的數值方法太多了,要精通所有的方法,一個phd應該不太夠。 但是經過長期的發展及除錯,這些方法漸漸地變成標準,這些『state-of-art』程式碼已經有教科書的地位 尤其Fortran 77其實滿接近數學式,有著『wysiwyg9』的特性,讀程式碼的過程中,往往能學到發現一些數值計算的觀念。
常用檔案
一個完整的Nek5000 case通常要在一個資料夾下包含這些檔案:
SIZE
大部分的向量變數會宣告為靜態記憶體配置,所以一些跟大小有關的變數像是 二維或三維 (ldim
),多項式階數和格子點數 (lx1
),元素個數(上界)(lelg
)等 會在這邊先宣告成常數,編譯的時候就以此修改相關的變數大小。<casename>.usr
: user file
主要的設定檔,像是邊界值,初始場值等等。
Nek5000會在特定地點呼叫相關的函序(subroutine),所以這邊的自由度很高。 可以在這裡修改網格跟幾何形狀,或是做一些後處理(post processing),分析紊流的統計量等。<casename>.par
: parameters file
給定一些常用的參數像是 timestep size, number of iteration, Reynolds number等。 par file不需要參與編譯,因此這邊能快速微調程式的參數<casename>.re2
:
為二進制檔案(binary file)以節省記憶體,儲存幾何形狀、網格、邊界條件、曲邊的定義<casename>.ma2
:
包含元素的連接性(connectivity)及元素的分配,前者告訴程式哪些元素是彼此相連的, 後者盡可能平均分配元素到各個處理器且透過圖(graph)的分割演算法減少處理器之間的資料傳輸。 這個檔案可以用genmap
從<caename>.re2
生成,也可以用parRSB
讓程式碼在執行時連帶處理
資源
現有的網站、論壇大多都是英文。 我會再找時間慢慢寫相關的中文入門說明。
GitHub:主程式碼
NekExamples:範例
Nek Documentation:使用說明,有一些簡單的範例可以跟著做
Nek5000 Gallery:一些使用者跑過的模擬動畫,這邊挑一個嵌入
Nek5000 User Group:Google Group的論壇形式讓大家討論跟問問題
Nek5000 mail list:這個已經過時,沒在用了,但仍然可以挖到以前的問題跟解答。
Spectral Element Method (SEM) 是一種用高階多項式為基底的有限元素法,元素採用曲邊化的長方形(或立方體)(quad / hex elements) ↩
P. F. Fischer, K. Heisey, and M. Min. “Scaling Limits for PDE-Based Simulation (Invited)”. AIAA Aviation. American Institute of Aeronautics and Astronautics, jun 2015. doi:10.2514/6.2015-3049 ↩
R&D100 Argonne News 11/08/16 ↩
現在新的Fortran編譯器都支援Fortran 90,向上兼容F77 ↩
這邊的Coarse Grid指的是一階多項式的網格,可以想像是把原本高階網格投影到2x2的網格(三維就是2x2x2)。 ↩
所見即所得,取自”What you see is what you get”縮寫。通常指使用者界面能直觀產生相對應的結果而不須透過額外的指令翻譯,如現在常見的圖像化文字編輯器。 ↩