在超算/計算叢集中編譯和安裝OpenFOAM-5.x
安裝的準備
現在OpenFOAM已經更新到了第十版,之所以安裝5版本,是因為我個人現在做CFD-DEM耦合的工作,CFDEM耦合軟體支援的OpenFOAM就是5.x版本。不管是哪一個版本,安裝過程和準備檔案是基本一致的。
安裝過程主要參考如下部落格和帖子:
https://www.cfd-china.com/topic/4296/一種叢集非root使用者編譯openfoam的方法-基於centos7
https://blog.csdn.net/weixin_41734903/article/details/105125214
https://blog.csdn.net/weixin_42230462/article/details/115555172
檔案清單
採用編譯安裝方式,首要就是準備好OpenFOAM的原始碼,這個通過git clone或者下載官網上的原始碼壓縮包就可以了。
git clone git://github.com/OpenFOAM/OpenFOAM-5.x.git
git clone git://github.com/OpenFOAM/ThirdParty-5.x.git
由於在計算叢集(超算)中,個人使用者是沒有安裝底層庫的許可權的,且叢集不連線外網,需要使用者自己將一些必要的庫準備好,然後傳上去。超算平臺和大型計算平臺主要採用CentOS7系統,接下來的操作都以該系統為例。
如果自己不清楚自己的系統版本,可以用uname -a命令檢視系統版本,lsb_release -a可以檢視屬於什麼作業系統。
首先需要在自己的個人電腦上面安裝一個與叢集上系統一致的本地Linux虛擬機器,個人可以使用VMware workstation play免費建立虛擬機器。虛擬機器的安裝過程比較簡單,不再贅述。
在本地虛擬上,首先換源,換成國內源,下載軟體速度快。然後安裝yum-utils包,用來下載必須的依賴庫。
su root #在本地虛擬機器上輸入密碼,切換成為root使用者
yum -y install yum-utils
然後下載OpenFOAM的依賴庫,比較關鍵的有:binutils、boost、bison、flex、glibc、hwloc、m4、libtool、zlib,cmake這幾個庫的安裝方式一致,以binutils為例:
cd ~/ mkdir packages #建立一個資料夾統一存放這些庫 cd packages && mkdir binutils #在packages下面建立一個資料夾存放binutils庫 yumdownloader binutils #下載這個庫的軟體包 #如果所有的庫都按照這個順序下載好了,可以先打包上傳到叢集中 #接下來就是解壓庫,然後將路徑加入到bashrc,這裡還是先在本地虛擬機器操作,成功安裝這些庫,然後再在超算上實現一次 cd binutils rpm2cpio binutils-2.27-44.base.el7_9.1.x86_64.rpm | cpio -idvm #解壓包,然後可以在binutils資料夾下面發現多出一個usr資料夾 vim ~/.bashrc export PATH=$PATH:$HOME/packages/binutils/usr/bin #將庫檔案目錄加入到系統目錄中,至此,這個庫已經裝好了 #重複以上步驟,依次安裝所有的庫,現在本地安裝通過,再在超算上重複操作。保持兩者一致性。
這裡有一個值得一說的點,由於CentOS7預設的gcc版本是4.85,剛好符號OpenFOAM-5.x安裝要求,我並沒有再安裝gcc,gcc版本太舊或者太新都會導致編譯出錯。
然後是安裝openmpi,從安裝角度,這個是OpenFOAM最推薦使用的並行庫,且叢集中,最好只有這個並行庫,mpich可能會和openmpi起衝突。如果使用intelmpi,會在AMD核心叢集上存在相容性問題。如果叢集中安裝了別的並行庫,最好先解除安裝掉。檢查OpenFOAM-5.x使用的是openmpi2.1版本,從Openmpi官網上下載原始碼,在本地和叢集中都保留一份。
cd ~/
mkdir openmpi #建立openmpi的安裝路徑
cd OpenFOAM
cd Third-party-5.x/ #最好將openmpi原始碼解壓到此資料夾下,因為可能會有一些找不到檔案的錯誤
tar -zxvf openmpi-2.1.1.tar.gz #解壓openmpi的原始碼
cd openmpi-2.1.1/
./configure --prefix=/home/username/openmpi/ #配置openmpi
make && make install #耐心等待安裝完成
username是自己的賬戶名,不是就打一個"username"就可以了
如果在openmpi編譯過程中,出現了“**** -l和-lr之間沒有空格”這個編譯錯誤,是openmpi的一個bug,將配置語句改成
./configure --prefix=/home/username/openmpi --with-ucx=/usr
就可以正常編譯,然後沒有錯誤以後,將openmpi的路徑加入到系統路徑中:
vim ~/.bashrc
export PATH=$PATH:$HOME/openmpi/bin
export LD_LIBRARY_PATH=/home/username/openmpi/lib:$LD_LIBRARY_PATH
source ~/.bashrc #讓配置檔案生效
如果沒有報錯,可以執行一下mpicc或者which mpicc,如果沒有出現mpicc not found這樣的錯誤,並且顯示了mpicc的路徑就是安裝成功了。
編譯OpenFOAM-5.x
到這裡,我個人建議,是本地虛擬機器和計算叢集都執行一樣的操作,保持一致性。這樣也方便以後自己程式的除錯,至於還有一個作用,在文末可以看到。
首先,需要將OpenFOAM的環境說明寫入系統.bashrc檔案裡面:
source $HOME/OpenFOAM/OpenFOAM-5.x/etc/bashrc WM_LABEL_SIZE=64 WM_COMPILER_TYPE=system WM_COMPILER=Gcc WM_MPLIB=OPENMPI
如果沒有報錯,說明可以正式編譯OpenFOAM了,先進入到Third-party下面:
./Allclean
./Allwmake -j4
#如果在叢集上,可以用更多核心編譯,速度會變快 srun -c64 ./Allwmake -j64
如果編譯順利通過,可以編譯OpenFOAM:
cd ~/OpenFOAM/OpenFOAM-5.x
./Allwmake -j4 #耗時數小時
#同理如果在叢集上,可以用更多核心編譯,速度會變快 srun -c64 ./Allwmake -j64
如果沒有報錯,可以執行一下blockMesh,如果看到出現OpenFOAM的標誌,就是安裝成功了
可能遇到的錯誤
目前我遇到的錯誤,絕大多數情況都是找不到mpi.h,這個是由於openmpi沒有配置好。如果按照文中的步驟,最後能看到mpi的環境成功配置應該就沒有問題。
其次,找不到*.h或者.c大部分是因為缺少依賴庫。例如我一開始在本地虛擬機器安裝了glibc,libtool庫,但是叢集中沒有,編譯一直不過,這個時候建議首先檢查依賴庫。
最後一個,如果Third-party能夠成功編譯,基本上OpenFOAM也能順利編譯,如果最後實在是編譯不過,也找不到原因。可以將本地編譯好的Thirdparty打包上傳到叢集再解壓,然後再重新編譯,這也是為什麼要保持本地虛擬機器和叢集,作業系統以及安裝操作一致性的原因。因為本地虛擬機器,許可權和上網可控,但是叢集都不行,本地的編譯出現問題較容易解決。
最後看一下我自己的.bashrc檔案