openfoam安装中出现allmake error_深入理解 OpenFOAM 环境与编译过程
深入理解 OpenFOAM 環(huán)境變量與編譯
操作系統(tǒng)選擇
由于 OpenFOAM 在 Linux 平臺開發(fā)和測試,在非 Linux 平臺無法直接對軟件進(jìn)行編譯和安裝,所以在非 Linux 平臺上最簡便方法是使用 docker 容器運(yùn)行 OpenFOAM。下面主要介紹在 Linux 平臺上 OpenFOAM 源程序編譯安裝過程。
環(huán)境變量
在 OpenFOAM 編譯和運(yùn)行時,需要設(shè)置多個環(huán)境變量。在源程序路徑 ${FOAM_DIR}/etc 下,腳本文件 bashrc 包含了軟件編譯和運(yùn)行所需的所有環(huán)境變量的設(shè)置,可以直接通過 source 命令加載。
為什么要用 source 命令?在 OpenFOAM 中,bashrc 其實(shí)是一個 shell 腳本,這個腳本里定義了所需的環(huán)境變量。在 Linux 環(huán)境中,執(zhí)行 shell 腳本有多種形式。以 bash 腳本為例,首先可以通過新開啟一個 shell 并在新的環(huán)境中運(yùn)行腳本,這種方式可以用 bash 命令執(zhí)行此腳本,或者在腳本第一行添加 #!/bin/bash 說明執(zhí)行腳本的程序,隨后添加執(zhí)行權(quán)限后直接執(zhí)行此腳本。$ bash ${FOAM_DIR}/etc/bashrc # bash 命令執(zhí)行 $ ${FOAM_DIR}/etc/bashrc # 直接執(zhí)行
這兩種方法執(zhí)行效果是相同的,當(dāng)新的 shell 運(yùn)行腳本完畢后再返回當(dāng)前環(huán)境,此時當(dāng)前 shell 的工作環(huán)境是未變的,也就是說執(zhí)行完畢后是無法看到 bashrc 腳本內(nèi)定義的環(huán)境變量。
另外一種方式就是在當(dāng)前 shell 環(huán)境中執(zhí)行此腳本,這時在腳本名前使用 . 或者 source 命令,如下所示。$ . ${FOAM_DIR}/etc/bashrc # 使用 . 執(zhí)行 $ source ${FOAM_DIR}/etc/bashrc # 使用 source 命令執(zhí)行
此時腳本內(nèi)定義的變量或所做的修改都會直接添加到當(dāng)前 shell 環(huán)境內(nèi),這種方式才是正確加載 OpenFOAM 環(huán)境變量方法。
在 bashrc 腳本中定義了多個變量,按照編譯、運(yùn)行和第三方函數(shù)庫相關(guān)可以分為三類。
2. 與運(yùn)行相關(guān)的 FOAM_XXX 變量
FOAM_SOLVERS=$HOME/OpenFOAM/OpenFOAM-1.6.x/applications/solvers FOAM_APPBIN=$HOME/OpenFOAM/OpenFOAM-1.6.x/applications/bin/linux64GccDPOpt FOAM_TUTORIALS=$HOME/OpenFOAM/OpenFOAM-1.6.x/tutorials FOAM_JOB_DIR=$HOME/OpenFOAM/jobControl FOAM_LIB=$HOME/OpenFOAM/OpenFOAM-1.6.x/lib FOAM_SITE_APPBIN=$HOME/OpenFOAM/site/1.6.x/bin/linux64GccDPOpt FOAM_MPI_LIBBIN=$HOME/OpenFOAM/OpenFOAM-1.6.x/lib/linux64GccDPOpt/openmpi-1.3.3 FOAM_APP=$HOME/OpenFOAM/OpenFOAM-1.6.x/applications FOAM_SITE_LIBBIN=$HOME/OpenFOAM/site/1.6.x/lib/linux64GccDPOpt FOAM_SRC=$HOME/OpenFOAM/OpenFOAM-1.6.x/src FOAM_SIGFPE= FOAM_UTILITIES=$HOME/OpenFOAM/OpenFOAM-1.6.x/applications/utilities FOAM_USER_LIBBIN=$WM_PROJECT_USER_DIR/lib/linux64GccDPOpt FOAM_INST_DIR=$HOME/OpenFOAM FOAM_LIBBIN=$HOME/OpenFOAM/OpenFOAM-1.6.x/lib/linux64GccDPOpt FOAM_RUN=$WM_PROJECT_USER_DIR/run FOAM_USER_APPBIN=$WM_PROJECT_USER_DIR/applications/bin/linux64GccDPOpt3. 第三方庫相關(guān)變量
MPI_ARCH_PATH=$HOME/OpenFOAM/ThirdParty-1.6.x/openmpi-1.3.3/platforms/linux64GccDPOpt ParaView_INST_DIR=$HOME/OpenFOAM/ThirdParty-1.6.x/paraview-3.6.1 OPAL_PREFIX=$HOME/OpenFOAM/ThirdParty-1.6.x/openmpi-1.3.3/platforms/linux64GccDPOpt ParaView_DIR=$HOME/OpenFOAM/ThirdParty-1.6.x/paraview-3.6.1/platforms/linux64Gcc PARAVIEW_DIR=/opt/packages/Paraview3 ParaView_VERSION=3.6.1 MPI_HOME=$HOME/OpenFOAM/ThirdParty-1.6.x/openmpi-1.3.3在正確設(shè)置上述環(huán)境變量后,即可對 OpenFOAM 源程序進(jìn)行編譯,并運(yùn)行對應(yīng)的求解器和工具。
編譯系統(tǒng)
在大型程序編譯與安裝過程中,通常使用 make 和 cmake 等工具構(gòu)建。在 OpenFOAM 中,使用的是 wmake 腳本進(jìn)行編譯,所在位置為 ${FOAM_DIR}/wmake/wmake。 查看此腳本可以發(fā)現(xiàn),其編譯是基于 make 修改,但是提供了針對 OpenFOAM 不同模塊更靈活的特性,具體可參考網(wǎng)站^1013。
wmake 編譯
在 Linux 平臺編譯軟件時,通常需要給定一些編譯和優(yōu)化參數(shù)。在使用 wmake 編譯時,編譯腳本會則根據(jù)環(huán)境變量會加載對應(yīng)的參數(shù)設(shè)置腳本進(jìn)行編譯。
在 OpenFOAM 中,編譯參數(shù)設(shè)置文件所在路徑為 ${FOAM_DIR}/wmake/rules/<Rules>,其中 <Rules> 成為編譯規(guī)則,與環(huán)境變量中定義的編譯平臺、架構(gòu)、編譯器設(shè)置有關(guān)。 編譯規(guī)則的定義在腳本 ${FOAM_DIR}/wmake/rules/General/general 中,查看腳本最后幾行
$ tail -n 20 ${FOAM_DIR}/wmake/rules/General/general COMPILER_TYPE = $(shell echo $(WM_COMPILER) | tr -d [:digit:]) DEFAULT_RULES = $(WM_DIR)/rules/$(WM_ARCH)$(COMPILER_TYPE) RULES = $(WM_DIR)/rules/$(WM_ARCH)$(WM_COMPILER) WMAKE_BIN = $(WM_DIR)/platforms/$(WM_ARCH)$(WM_COMPILER)......include $(DEFAULT_RULES)/general include $(DEFAULT_RULES)/c++ sinclude $(RULES)/general sinclude $(RULES)/c++ include $(GENERAL_RULES)/transform其中 DEFAULT_RULES 和 RULES 為定義的兩個編譯規(guī)則變量,可以看出編譯規(guī)則名稱由平臺 $(WM_ARCH) 和編譯器 $(WM_COMPILER) 組成。 DEFAULT_RULES 和 RULES 變量的區(qū)別主要在于,前者中刪除了 WM_COMPILER 中包含的所有數(shù)字,而默認(rèn)加載的是 DEFAULT_RULES 路徑下編譯設(shè)置文件。 為了保證在定義規(guī)則時能夠添加數(shù)字,可以修改 DEFAULT_RULES,使其與 RULES 定義完全相同。 在加載腳本指令中,#sinclude 為 OpenFOAM 自定義的宏指令。與 #include 主要區(qū)別在于,當(dāng)加載文件不存在時不會報(bào)錯并退出^1312。
當(dāng)使用某個編譯規(guī)則編譯完成后,生成中間文件 *.o 的路徑為 ${FOAM}/build/$(DEFAULT_RULES),而可執(zhí)行程序的路徑為 ${FOAM}/platforam/<makeRule>。 這些路徑的定義都包含在了環(huán)境配置文件 ${FOAM}/etc/bashrc 中 ,并且還將可執(zhí)行程序路徑自動添加到 PATH 變量內(nèi),從而可以直接運(yùn)行 OpenFOAM 工具和求解器。
由于 wmake 是基于 make 命令實(shí)現(xiàn)的,因此其也具有自動推導(dǎo)功能。當(dāng)對某個特定源程序文件進(jìn)行修改后,wmake 只會重新編譯包含與此文件相關(guān)的模塊。
wmake 使用
1. 編譯文件結(jié)構(gòu)
在使用 make 編譯源程序時,需要在 makefile 中指定編譯指令,并提供引用的頭文件和動態(tài)鏈接庫位置。當(dāng)使用 wmake 腳本時,則僅按照一定規(guī)則配置說明文件即可。
在 OpenFOAM 每個模塊內(nèi),源程序文件后綴為 .C,頭文件后綴為 .H。為了提供編譯所需的信息,在文件夾內(nèi)必須同時包含 Make 文件夾,內(nèi)含 files 和 options 兩個設(shè)置文件。以 icoFoam 求解器為例,其編譯文件結(jié)構(gòu)為
icoFoam ├── createFields.H ├── icoFoam.C └── Make├── files└── options在 files 文件內(nèi),包含了進(jìn)行編譯程序全路徑和名字(EXE 變量)。關(guān)于安裝路徑可以提供兩種形式,一個是標(biāo)準(zhǔn)路徑,編譯好的求解器儲存在 $FOAM_APPBIN,也可以保存在用戶自己的路徑 $FOAM_USER_APPBIN 中。在 icoFoam 求解器中,配置文件files 內(nèi)容如下所示,其中 EXE 變量說明了需編譯生成可執(zhí)行程序,當(dāng)目標(biāo)為動態(tài)鏈接庫時使用 LIB 變量。
$ cat icoFoam/Make/files icoFoam.CEXE = $(FOAM_APPBIN)/icoFoamoptions 文件內(nèi)指定了模塊需要連接的頭文件和鏈接庫,其中頭文件使用 EXE_INC 和 -I 關(guān)鍵字進(jìn)行指定,而連接庫則需要用 EXE_LIBS 和 -L/-l 等指定。在 icoFoam 求解器中 options 文件的內(nèi)容為
$ cat icoFoam/Make/options EXE_INC = -I$(LIB_SRC)/finiteVolume/lnInclude -I$(LIB_SRC)/meshTools/lnIncludeEXE_LIBS = -lfiniteVolume -lmeshTools2. 模塊編譯
在 OpenFOAM 中,對特定模塊編譯時,需要進(jìn)入模塊上一層目錄下,使用 wmake + <模塊名> 進(jìn)行編譯。在 wmake 命令運(yùn)行時,可以通過增加 -j 參數(shù)可以啟用并行編譯指令。當(dāng)需要對 OpenFOAM 全部代碼進(jìn)行編譯時,可以直接運(yùn)行源程序目錄下 Allwmake 腳本。
當(dāng)需要刪除特定求解器和動態(tài)庫時運(yùn)行 wclean 命令,若需將全部求解器和動態(tài)庫,加 -all 參數(shù)。
自定義編譯規(guī)則:Intel-2019
在本節(jié)中,將定義一個新的編譯規(guī)則,設(shè)置采用 intel 2019.5.281 版本編譯器和 MPI 函數(shù)庫進(jìn)行編譯,并對編譯設(shè)置文件進(jìn)行相應(yīng)修改。
為了在編譯后,能夠通過加載單獨(dú)的 bashrc 腳本來使用不同的 OpenFOAM 可執(zhí)行程序,可以復(fù)制一份 bashrc 文件的拷貝 bashrc-intel-19,并在此文件中修改 WM_COMPILER=Intel-19。此時自定義編譯規(guī)則名為 linux64Intel-19。
在使用默認(rèn)參數(shù)對 OpenFOAM 編譯后,生成可執(zhí)行程序使用的是 SSE 指令集。隨著新一代 CPU 開始提供浮點(diǎn)性能更高的 AVX 系列指令集,可以通過修改編譯參數(shù),使求解器使用 AVX 指令集。
這時,需要在新的編譯配置文件中進(jìn)行修改。為此,復(fù)制目錄 ${FOAM_DIR}/wmake/rules/linux64Icc,并將目錄名稱修改為 ${FOAM_DIR}/wmake/rules/linux64Intel-19 作為編譯規(guī)則配置文件。 在此目錄下 c 和 c++ 兩個文件包含了編譯器的基本設(shè)置,在Opt、Debug、Prof等后綴的對應(yīng)文件內(nèi),定義了不同優(yōu)化設(shè)置 WM_COMPILE_OPTION 時使用的參數(shù)。 為使用 Intel 2019.5.281 版本編譯器,可以修改 c和 c++ 文件中 CC 變量的值為 icc 和 icpc。為了省去在編譯時指定對應(yīng)的 MPI 頭文件和動態(tài)鏈接庫的位置,也可以直接用 mpiicc 和 mpiicpc 分別作為 C/C++ 程序編譯器。 在對第三方函數(shù)庫進(jìn)行編譯時,使用的編譯器由 WM_CC 和 WM_CXX 變量提供,因此還需要在配置文件 bashrc-intel-19 中,添加這兩個變量的定義。
$ echo 'export WM_CC=icc' >> ${FOAM_DIR}/etc/bashrc-intel-19 $ echo 'export WM_CC=icpc' >> ${FOAM_DIR}/etc/bashrc-intel-19設(shè)置完畢后,加載新的環(huán)境配置文件 ${FOAM_DIR}/etc/bashrc-intel-19,再運(yùn)行Allwmake 腳本,即可生成按照自定義規(guī)則編譯的二進(jìn)制程序。
總結(jié)
以上是生活随笔為你收集整理的openfoam安装中出现allmake error_深入理解 OpenFOAM 环境与编译过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python自动化测试视频教程_精品系列
- 下一篇: python网络编程视频教程_Java网