量子化學程序Dalton的編譯方法和運行方式簡介
量子化學程序Dalton的編譯方法和運行方式簡介
文/Sobereva@北京科音 2019-Feb-11
開源免費的量子化學程序Dalton(http://daltonprogram.org)雖然用起來比較復雜,對新手很不友好,但由于其擅長計算響應性質,是其它程序難以取代的,所以它有著獨特的地位。本文介紹怎么安裝Dalton,也簡單介紹一下怎么運行。本文說的Dalton都指的是Dalton suite中1983年開始發展的那個Dalton程序,而非Dalton suite中從Dalton分化出來的線性標度版Dalton(LSDalton)。
1 Dalton的編譯
下文的安裝過程對于Dalton2018.1是適用的,對最新或更老版本不一定適用。筆者的操作系統為CentOS 7.2 64bit,CentOS是最適合計算服務器用的Linux操作系統,下文的編譯過程對于其它系統不一定適用,請隨機應變。筆者用的是root用戶。
本文假定讀者已經在機子里裝了Intel Parallel Studio XE 2019 Update 1中的Intel Fortran編譯器、Intel C/C++編譯器、Intel MKL數學庫和Intel MPI庫。如果不會裝的話,參看《VASP最簡單的安裝方法》(http://www.shanxitv.org/455)里的說明和視頻演示,本文不再累述。
PS:原則上,Dalton用gfortran/gcc+OpenMPI也可以編譯,但不建議如此,畢竟這樣編譯出的代碼比用ifort/icc慢,而且筆者發現起碼對于2019-Feb-10下載的最新的Dalton,gfortran由于與個別文件的語法兼容性問題編譯不過去。
1.1 安裝cmake 3.x
如果在你用的系統里輸入cmake --version顯示的是3.x版本,而且編譯Dalton的過程沒有提示cmake版本太低,那就可以略過此步。由于CentOS 7.2自帶的cmake是2.8的,而Dalton 2018要求3.x版本,因此先得裝更新的cmake。
在聯網的情況下運行以下命令
yum install cmake3
mv /usr/bin/cmake /usr/bin/cmake2
ln -s /usr/bin/cmake3 /usr/bin/cmake
這里把自帶的cmake 2.8備份為cmake2,而把新裝的cmake3做了一個符號鏈接,這樣試圖調用cmake的程序就用的是cmake 3.x版了。
1.2 下載Dalton
在Linux的命令行下運行:
git clone --recursive https://gitlab.com/dalton/dalton.git
就會把最新版本Dalton下載到當前目錄下作為dalton目錄。這個“最新版本”體現了開發者迄今對dalton所做的所有最新的改動。然后手動將此目錄改名為dalton_src。
注意,不要自行去https://gitlab.com/dalton/dalton點擊download下載壓縮包,因為Dalton的gitlab項目上的external目錄的內容里包含外部project,直接下載的壓縮包里面是沒有那些project的文件的,只有用上面這種方式才能完整下載。之后你可以把這個下載的目錄壓縮后保留起來,便于以后用或者給其他人用。
1.3 編譯Dalton的MPI并行版
Dalton主要是靠MPI并行的。由于當前機子里已經有了Intel MPI,所以就不用再額外裝MPI庫了。MPI版Dalton應當鏈接串行版MKL庫。
下面的過程將把Dalton安裝到/sob/dalton目錄下。依次運行
cd dalton_src
./setup --fc=mpiifort --cc=mpiicc --cxx=mpiicpc --mkl=sequential --prefix=/sob
cd build
make install -j
Intel 36核機子下2分鐘就編譯完畢了。此時出現了/sob/dalton目錄,里面包含了可執行文件和相關文件,總共占80MB左右。(在vmware虛擬機下用-j可能會在編譯中途卡住,去掉-j以串行方式編譯,得花大約半個小時)
把以下內容加入到用戶目錄下的.bashrc:
export PATH=$PATH:/sob/dalton
export DALTON_TMPDIR=/sob (之后臨時文件默認都將產生在/sob/DALTON_scratch_root目錄下)
export DALTON_LAUNCHER="mpirun -np 36" (-np后面設的是默認情況下運行用的并行進程數)
重新進入終端,以使以上語句生效。現在就可以通過輸入dalton命令來運行了。
在dalton_src/build目錄下運行ctest命令進行測試,Dalton 2018.1版總共約500個測試,在筆者的Intel 36核機子上并行執行總共花了不到半個小時。有些測試項目可能會提示Failed,但也別太擔心,一般來說只要編譯成功,出現Failed并不是編譯有問題,而更可能是開發者提供的參考文件有問題或者測試項目本身有問題(比如有的功能不支持MPI并行),想一探究竟的話可以去Dalton的臨時文件目錄下找failed的項目的輸出文件,看到底是怎么回事。
1.4 編譯Dalton的串行+MKL并行版(以下簡稱MKL并行版)
Dalton的有些功能并不支持MPI并行,比如耦合簇計算功能。使用這些功能時如果你用的是MPI并行版Dalton,那并行進程數只能設為1,或者使用Dalton的串行版。由于Dalton所調用的Intel MKL數學庫在運行的時候是支持OpenMP方式并行的,因此對于Dalton的不支持MPI并行的功能,你若在計算的時候想利用多核提升速度,可以編譯Dalton的串行版但是鏈接并行版本的MKL庫。下面來編譯一下這種版本。
先把之前編譯出來的Dalton MPI并行版的目錄改個名免得被覆蓋掉,比如叫dalton_MPI。然后進入dalton_src目錄,把之前的build目錄刪掉,然后運行
./setup --fc=ifort --cc=icc --cxx=icpc --mkl=parallel --prefix=/sob
cd build
make install -j
在.bashrc里把export DALTON_LAUNCHER="mpirun -np 36"前面加上#注釋掉,再加入export OMP_NUM_THREADS=36來讓MKL庫默認通過36線程并行,之后重新進入終端使設置生效。
通過MKL實現并行可以跑所有任務,而通過MPI實現并行只能跑支持MPI并行的任務。凡是能用MPI并行的任務建議用MPI并行版來跑,耗時一般比用MKL并行版更低,畢竟Dalton里調用MKL數學庫的代碼本身就是很有限的,但也不排除有反例,可以實測一下。
所有前述編譯都完成,而且測試也都完成后,dalton_src目錄就沒用了,可以刪了。另外值得提醒的是,時間長了可能在Dalton的臨時文件目錄里積攢很多老舊臨時文件,記得時不時清一清。
2 Dalton的運行
2.1 運行格式
一般情況需要一個.dal文件,內含計算任務的說明;還需要一個.mol文件,內含分子結構、基組定義。
一般運行的格式:dalton [選項] [.dal] [.mol]
例如,dalton DFT1 H2O代表用DFT1.dal里定義的設置和任務去算H2O.mol里的體系。
運行完畢后在當前目錄下的出現的"dal名_mol名.out"是輸出文件(dal和mol名相同時只包含一次名字)。同時還產生同名的.tar.gz文件,這個壓縮包內含運行期間輸出的各種零碎文件,其中molden.inp就是.molden輸入文件,可以用筆者開發的Multiwfn程序(http://www.shanxitv.org/multiwfn)直接載入此文件做各種波函數分析、觀看結構和軌道(主功能0)。相關常識看《Multiwfn入門tips》(http://www.shanxitv.org/167)、《使用Multiwfn觀看分子軌道》(http://www.shanxitv.org/269)。
運算期間不會在屏幕上顯示運算過程細節信息。如果運算期間要監控運算過程,可以隨時查看這個文件的內容:$DALTON_TMPDIR/DALTON_scratch_用戶名/dal名_mol名_pid號/DALTON.OUT。也可以用tail -f [文件名]的做法來實時把此文件里最新寫入的信息同步輸出到屏幕上便于監控。
2.2 常用選項
直接輸入dalton命令就可以查看能夠接的選項,這里說幾個常用的。
-N 36:代表用36個MPI進程進行并行運算,僅對于MPI并行版Dalton有意義。如果沒用此選項,就會用DALTON_LAUNCHER環境變量里設的核數來并行計算
-omp 36:代表通過MKL以OpenMP方式并行時用36個線程并行運算,僅對于MKL并行版有意義。如果沒用此選項,就會用OMP_NUM_THREADS環境變量指定的線程數
-mb 1200:設定當前計算用1200MB內存。默認用的最大內存量也可以用WRKMEM環境變量來設,單位與此相同。注意對于MPI版,這個設的是每個MPI進程的內存上限量,而非所有進程的總和
-noarch:不讓當前任務產生.tar.gz文件
-nobackup:不備份以前的輸出文件。默認情況下如果之前有同名的輸出文件存在,會在后面加上數字作為后綴來備份
-ow:計算過程產生的輸出文件"dal名_mol名.out"直接輸出到當前目錄。默認情況下在運算過程中輸出文件被輸出到前述DALTON_TMPDIR定義的目錄里,算完之后才自動挪到當前目錄
-o [文件名]:直接指定輸出文件名字,而且運算過程中就直接產生
Dalton運行時用的命令"dalton"實際上是dalton目錄下面的一個bash腳本,用來設定運行環境,并調用實際可執行文件dalton.x。這類似于GAMESS的rungms腳本。如果想把一些選項設為默認的,可以在dalton腳本中修改70行開始的位置(此位置是對于Dalton 2018.1的而言)的一些參數。比如想把nobackup、noarch、ow作為默認啟用的選項,就把opt_nobackup、opt_noarch都設為1,把opto設為2。稍微讀一下此腳本就知道為什么這么設了。
如果MPI并行版和MKL并行版在平時研究中都用得著,MKL并行版放在了/sob/dalton目錄,MPI并行版放在了/sob/dalton_MPI目錄,為了能方便地同時使用,建議在.bashrc里既不設DALTON_LAUNCHER也不設OMP_NUM_THREADS,但是加一句alias daltonmpi='/sob/dalton_MPI/dalton'。此時就可以這樣運行了:
36核跑MKL并行版:dalton -omp 36 love live
36核跑MPI并行版:daltonmpi -N 36 love live
2.3 輸入文件簡介與簡單例子
首先注意幾點:
Dalton對基組的大小寫敏感,比如aug-cc-pVDZ不能寫為aug-cc-pvdz。
Dalton主要用來計算閉殼層的基態,因此多數情況下并不需要給出自旋多重度,默認就是1。
Dalton默認對所有基組都用球諧函數。
Dalton默認是不凍核的。
.dal里可以用#或!進行注釋。
下面是一個CCSD(T)單點計算的dal文件例子:
**DALTON INPUT //**是主選項
.RUN WAVE FUNCTIONS //.后面代表設定。RUN后面設的是要干什么、調用什么模塊
**WAVE FUNCTIONS
.CC //耦合簇波函數
*CC INPUT //對CC計算進行進一步設定
.CC(T)
**END OF INPUT
下面是一個B3LYP下優化任務的dal文件例子。注意Dalton默認的B3LYP的定義與Gaussian不同,B3LYPg代表使用與Gaussian相同的定義:
**DALTON INPUT
.OPTIMIZE
**WAVE FUNCTIONS
.DFT
B3LYPg
**END OF INPUT
下面是一個甲酰胺的mol文件例子:
ATOMBASIS //代表每個原子分別設定基組。如果這里寫BASIS,然后下面再加一行6-31G*,則說明所有原子都用這個基組,每類原子里的Basis=6-31G*就不要再寫了
test molecule //標題行,內容任意,必須有
Generated by Multiwfn //同上
Atomtypes=4 Angstrom Nosymmetry charge=0 //關鍵詞順序隨意,大小寫敏感。可以只寫前三個字符。當前設置說明體系里包含四類原子,坐標單位是埃,不用對稱性,是電中性
Charge=1.0 Atoms=3 Basis=6-31G* //此類原子的實際核電荷數、原子數、基組
H1 -0.45438149 1.43099761 0.00000000 //原子名可隨意定義,程序不檢查
H2 -0.64184099 -1.52402451 0.00000000
H3 -1.92375124 -0.35013241 0.00000000
Charge=6.0 Atoms=1 Basis=6-31G*
C1 0.00000000 0.41905994 0.00000000
Charge=7.0 Atoms=1 Basis=6-31G*
N1 -0.94010085 -0.56081903 0.00000000
Charge=8.0 Atoms=1 Basis=6-31G*
O1 1.20008496 0.23181661 0.00000000
上面設的Atomtypes指的不是元素種類,而是原子類型。比如O3,是C2v點群,雖然只有一種元素,但是有兩種非等價的氧,故Atomtypes=2。如果懶得考慮這個,直接用Nosymmetry,這樣Atomtypes就直接對應元素數了。
基組庫目錄(dalton\basis)下的基組都可以用basis或atombasis來使用,基組名就是基組文件名字。贗勢都在basis/ecp_data里,可以通過ECP=xxx來使用。比如可以Basis=stuttgart_rlc_ecp ECP=stuttgart_rlc_ecp,因為無論是這個基組名還是這個贗勢名都在basis和basis/ecp_data里有同名文件。
由于Dalton的.mol文件格式定義得很麻煩,得一類一類定義,因此不好從結構文件或其它量化程序的輸入/輸出文件里直接粘過去,因此最好的做法就是用Multiwfn產生Dalton的輸入文件。啟動Multiwfn后,載入任意一個含有結構信息的Multiwfn支持的格式,比如gjf、wfn、fch、molden、pdb、xyz、mol等,然后依次輸入
100 //主功能100
2 //導出文件
19 //導出Dalton的輸入文件
idol.dal //導出的.dal的文件名。不需要產生它的話這一步直接按回車
master.mol //導出的.mol文件名
此時當前下就有了idol.dal和master.mol。這個.dal文件對應B3LYP單點計算。.mol文件包含此體系結構,并且對應使用6-31G*基組、不利用對稱性的情況。之后大家根據實際計算要求對這兩個文件進行修改即可,比手動從頭寫它們方便多了。