這是協作翻譯的第四章,翻譯完感覺挺有意思的,分享給大家一起看看。
4.更新OpenFOAM版本
4.1 版本管理
OpenFOAM以兩種不同的方式分發。一種方式是使用Git倉庫下載的倉庫版本。倉庫版本的版本號由附加的x標記,例如 OpenFOAM2.1.x。該版本會經常更新,并在某種程度上是開發版本。這個版本的更改和更新發布很快,但是,此版本中出現錯誤的可能性也更大。由于此發行版經常更新,因此在一個系統上安裝的2.1.x版本的內容和另一個系統上安裝的2.1.x版本可能會不同。因此,每個安裝都有附加的信息來標記不同版本的OpenFOAM。版本號隨附一個哈希碼,以唯一地標識倉庫版本的各個內部版本,請參見列表9。每當更新并重新編譯OpenFOAM時,此哈希碼都會更改。如果內部版本相同,則兩個OpenFOAM安裝處于相同級別。
Build : 2.1. x -9 d344f6ac6af
列表 9: 倉庫版本的完整版本標識
除了倉庫版之外,還有軟件包版本。與倉庫版本相比,這些更新的間隔時間更長。軟件包發行版的版本號不包含x,例如OpenFOAM 2.1.1。與倉庫版相反,所有相同版本號的安裝都是相同的。由于發行周期較長,因此認為發行包不太容易出現軟件錯誤。
這些軟件版本有幾種不同的類型。這些是針對廣泛使用的Linux發行版(Ubuntu,SuSE和Fedora)的預編譯軟件包,也是一個源碼包。可以將源代碼包安裝在可編譯源代碼的任何系統上(通常是運行Linux的各種計算機,例如高性能計算集群,甚至運行其他操作系統的計算機)。例如Mac OSX甚至是Windows).
4.2 檢查更新
如果從倉庫版本安裝了OpenFOAM,則更新非常簡單。要更新OpenFOAM時,只需使用Git來檢查是否有更新的源文件。在終端中切換到OpenFOAM安裝的根目錄,然后執行git pull。
如果倉庫中有較新的文件,Git會下載它們并顯示已更改文件的摘要。如列表10所示。
user@host :~$ cd $FOAM_INST_DIR
user@host :~/ OpenFOAM$ cd OpenFOAM -2.1. x
user@host :~/ OpenFOAM / OpenFOAM -2.1. x$ git pull
remote : Counting objects : 67 , done .
remote : Compressing objects : 100% (13/13) , done .
remote : Total 44 ( delta 32) , reused 43 ( delta 31)
Unpacking objects : 100% (44/44) , done .
From git :// github . com / OpenFOAM / OpenFOAM -2.1. x
72 f00f7 ..21 ed37f master -> origin / master
Updating 72 f00f7 ..21 ed37f
Fast - forward
.../ extrude / extrudeToRegionMesh / createShellMesh .C | 10 +-
.../ extrude / extrudeToRegionMesh / createShellMesh .H | 7 +-
.../ extrudeToRegionMesh / extrudeToRegionMesh .C | 157 ++++++++ - - - - -
.../ Templates / KinematicCloud / KinematicCloud .H | 6 +-
.../ Templates / KinematicCloud / KinematicCloudI .H | 7 +
.../ baseClasses / kinematicCloud / kinematicCloud . H | 47 ++++++ -
6 files changed , 193 insertions (+) , 41 deletions ( -)
列表 10: 有可用的更新
如果OpenFOAM是最新的,則Git也將輸出相應的消息,如列表11:
user@host :~/ OpenFOAM / OpenFOAM -2.1. x$ git pull
Already up -to - date .
列表 11: OpenFOAM是最新的
4.3 僅檢查更新
如果您只想檢查更新而沒有實際進行更新,則可以使用特殊選項來調用Git(請參見列表12和13)。在這種情況下,Git僅檢查倉庫并顯示其發現的結果,而不會實際進行任何更改。負責此操作的選項是--dry-run。注意,這里調用了git fetch而不是git pull。git pull調用git fetch下載遠程文件,然后調用git merge將檢索到的文件與本地文件合并。因此,檢查更新實際上是通過git fetch完成的。
user@host :~$ cd OpenFOAM / OpenFOAM -2.0. x/
user@host :~/ OpenFOAM / OpenFOAM -2.0. x$ git fetch --dry - run -v
remote : Counting objects : 189 , done .
remote : Compressing objects : 100% (57/57) , done .
remote : Total 120 ( delta 89) , reused 93 ( delta 62)
Receiving objects : 100% (120/120) , 17.05 KiB , done .
Resolving deltas : 100% (89/89) , completed with 56 local objects .
From git :// github . com / OpenFOAM / OpenFOAM -2.0. x
5 ae2802 ..97 cf67d master -> origin / master
user@host :~/ OpenFOAM / OpenFOAM -2.0. x$
列表 12: 僅檢查更新–可用更新
user@host :~$ cd OpenFOAM / OpenFOAM -2.1. x/
user@host :~/ OpenFOAM / OpenFOAM -2.1. x$ git fetch --dry - run -v
From git :// github . com / OpenFOAM / OpenFOAM -2.1. x
= [ up to date ] master -> origin / master
user@host :~/ OpenFOAM / OpenFOAM -2.1. x$
列表 13: 僅檢查更新–最新
4.4 安裝更新
在通過git pull下載更新后,需要編譯更改的源文件才能更新可執行文件。這與安裝OpenFOAM時所執行的方法相同。只需調用./Allwmake進行編譯。該腳本可以識別更改,因此不會再次編譯未更改的文件。因此,更新后進行編譯所需的時間少于安裝OpenFOAM時所需的時間。
4.4.1 工作流程
清單14顯示了更新現有OpenFOAM安裝所需的命令。但這僅適用于倉庫版本(例如OpenFOAM-2.1.x)的更新。點版本(OpenFOAM的版本號中沒有x)的更新方式與倉庫版本的更新方式不同。為簡單起見,可以將Point Release(OpenFOAM-2.1.0→OpenFOAM-2.1.1)的更新視為全新安裝,請參見第3.6節。
將清單14中的前兩個命令更改為OpenFOAM安裝目錄。然后,通過調用git pull下載最新的源文件。
wclean all這一句可以省略。但是,如果編譯以某些錯誤結束,則此命令通常可以解決問題,請參見第4.5.2節。最后一條語句會編譯源文件。如果以前未調用wclean all,則僅編譯發生更改的文件。如果調用了wclean all,則將編譯所有內容。這可能將花費更長的時間。
如果有足夠的時間進行更新(例如整夜),則應在編譯之前調用wclean all。在大多數情況下,這將確保更新源的成功編譯。
cd $FOAM_INST_DIR
cd OpenFOAM -2.1. x
git pull
wclean all (可以省略)
./ Allwmake
列表 14: 更新現有的OpenFOAM安裝的完整的工作流程
4.4.2 問題排查
如果編譯報告了一些錯誤,則再次調用./Allwmake會很有幫助。這大大減少了成功操作的輸出(譯者注:成功編譯的源文件將不再顯示,只會在出錯的位置顯示錯誤信息),因此更容易找到編譯器的實際錯誤消息。
4.5 更新問題
4.5.1 缺少安裝包
如果對操作系統進行了升級,則可能會發生確實安裝包的情況,這意味著在更新過程中已刪除了一些相關的軟件包(例如,如果需要這些軟件包來編譯OpenFOAM,但操作系統“認為”這些軟件包不是必需的)。因此,如果在操作系統升級后重新編譯OpenFOAM失敗,則可能是缺少軟件包的原因。
4.5.2 庫的更新
庫更新后,必須重新編譯它們。否則,求解器將調用尚未編譯的庫函數。為了避免此問題,必須重新編譯相應的庫。
wclean all
列表 15: 使用wclean準備重新編譯
一個更暴力的方式是重新編譯整個OpenFOAM,而不是重新編譯更新的庫。
4.5.3 更新的源無法編譯
在某些情況下,例如當源文件的組織發生變化時,源文件將無法立即編譯。又或者,如果有其他未知原因導致無法編譯源代碼,則可以選擇完全重新編譯OpenFOAM。盡管編譯OpenFOAM需要花費時間,但與跟蹤所有錯誤相比,這可能花費的時間更少。
要重新編譯OpenFOAM,需要重置源。有一個簡單的命令可以解決此問題,而不是刪除OpenFOAM并重新安裝。如列表16所示:
git clean - dfx
列表 16: 使用git重置源
列表16中列出的命令使Git擦除沒有跟蹤的所有文件。這意味著所有不屬于git-repository的文件都將被刪除。在這種情況下,將重置為OpenFOAM的官方git倉庫版本。git clean從當前目錄開始遞歸刪除所有不受版本控制的文件。選項-d表示還刪除了未跟蹤的文件夾。
執行列表16中的命令后,必須按照3.3節中的說明重新編譯源。
4.5.4 自有代碼無法運行
更新您的OpenFOAM的倉庫版本會產生有趣的效果。當OpenFOAM的庫更新時,它們的實現可能會更改。即使更新的代碼與先前的代碼完全兼容,更新后的編譯庫看起來也可能不同。因此,即使更新保持了代碼的兼容性,更新也可能破壞二進制兼容性。因此,需要在基礎OpenFOAM安裝更新之后重新編譯您自己的代碼。
更新OpenFOAM之后加載丟失了二進制兼容性的庫時會導致分段錯誤。發生這種情況是因為我們自己的求解器在啟動時會動態加載所需的OpenFOAM庫,但是庫更新之后該庫某些對象的內存布局已更改了。
有關此主題的更多信息,請參見以下資源:
https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B
https://en.wikipedia.org/wiki/Binary_code_compatibility
https://en.wikipedia.org/wiki/Source_code_compatibility
失去二進制兼容性不會在每次更新后發生,并且并非在每個庫中都發生。因此,在更新以及成功使用其他自己創建的求解器和庫的很長一段時間之后,您可能才會遇到此類問題。因此,用戶可能無法立即清楚這些問題的根源。如果您的代碼突然由于沒有原因的無法正常運行了,請重新編譯并查看會發生什么。