CFOUR程序的編譯和使用方法簡介
1 前言
CFOUR程序的全稱是Coupled-Cluster techniques for Computational Chemistry。它是由ACESII-MAB程序改名而來,而ACESII-MAB程序是ACESII程序的一個分支,ACESII (Advanced Concepts in Electronic Structure)是從1990年代初開始開發的從頭算程序,特別適合微擾和耦合簇的大規模并行計算。
CFOUR繼承了ACESII的大部分特征,是一個以做耦合簇見長的從頭算程序,同時也支持HF、微擾、CI、QCI計算,但是不支持DFT。CFOUR的耦合簇最高能做到CCSDT,并且在這樣的級別下還能支持二階解析導數,相比之下,常用的Gaussian計算能量只支持到CCSD(T),而其一階解析導數最高只支持到CCSD。CFOUR做耦合簇的效率號稱很高,CCSD(T)計算對于高對稱性體系比Gaussian快2、3倍是有的,結果相符也很好,但是無對稱性體系下卻并不總比Gaussian09快。CFOUR對GIMIC, MRCC, DIRAC, NEWTON-X程序提供了接口,利用GIMIC可以分析感應電流密度,借助MRCC可以做無窮高階耦合簇,DIRAC是著名的能支持四分量相對論計算的程序,NEWTON-X是一個BO近似下做分子動力學的程序。
CFOUR可以執行多種任務計算多種屬性,比如單點、幾何優化,尋找過渡態,算激發態(EOM-CC),算紅外、拉曼、NMR、g張量、靜態/含頻極化率和超極化率等。
CFOUR是免費開源的程序,但是獲得它相對麻煩點,必須在其主頁http://www.cfour.de上下載授權表,簽字后通過傳真或者實體郵件發給開發者。為方便大家我也傳在了這里:/usr/uploads/file/20150609/20150609182404_74068.tar.gz。
CFOUR比ACESII相對來說更user-friendly一些(盡管仍遠稱不上user-friendly),容易編譯,而ACESII包括后來的ACESIII則都是面向開發者的程序,一般用戶編譯使用起來極其艱苦。不過CFOUR終究還是面向有一定量化經驗的用戶,不適合初學者,手冊寫得粗糙晦澀簡陋,很多地方讓人糊涂,且只有在線版手冊,給新用戶入門帶來些麻煩,可以去http://www.qtp.ufl.edu/ACES/index.shtml下載一份ACESII的pdf版手冊在必要時作為參考,寫得更為詳細。
CFOUR在線手冊地址:http://slater.chemie.uni-mainz.de/cfour/index.php?n=Main.Manual
CFOUR關鍵詞一覽:http://slater.chemie.uni-mainz.de/cfour/index.php?n=Main.ListOfKeywordsInAlphabeticalOrder
CFOUR輸出文件介紹:http://slater.chemie.uni-mainz.de/cfour/index.php?n=Main.FileStructure
CFOUR單點計算支持的方法一覽:
R/U/ROHF,TCSCF
MP2/3/4
CC2/3
CCD, CCSD, CCSD+T, CCSD(T), CCSDT, CCSDT-n (n=1-4), Brueckner-CCD (B-CCD), B-CCD(T), Orbital-optimized CC (OO-CC)
CID, CISD
QCISD, QCISD(T)
CFOUR一階解析梯度支持的方法一覽:
HF-SCF,TCSCF
MP2/3/4
CC2/3
QCISD,QCISD(T)
CCD, CCSD, CCSD(T), CCSDT-n (n=1-4), CCSDT
CFOUR二階解析梯度支持的方法一覽:
HF-SCF (RHF, UHF, ROHF)
MP2/3/4 (RHF, UHF)
CCD, CCSD, CCSD(T) (RHF, UHF)
CCSDT-n (n=1-4), CCSDT (RHF)
總的來說,CFOUR的最主要用處有三:獲得很高精度的能量、結構或密度;更快地做耦合簇計算;與GIMIC相連接分析感應電流(將在其它帖子專門介紹)
2 編譯方法
CFOUR支持MPI并行(OpenMPI、lammpi、mpich2都可以),支持MKL庫,并可以通過MKL庫的多線程模式來實現并行。編譯時可以根據情況掛上不同選項,網站上給了一些例子(http://slater.chemie.uni-mainz.de/cfour/index.php?n=Main.Examples),但是很凌亂,這里給出最常用的64bit Linux平臺下的串行和并行版本編譯方法。CFOUR的代碼兼容性比較好,不同Linux發行版本下,用gfortran和ifort都能順利編譯。寡人用的是RHEL6U1+mpich2 1.4.1p1+ifort 12.1環境,intel i7-2630QM。12分鐘可以編譯完畢。
注意,如果你用的是ifort 12.x,由于其bug,在下面的步驟中執行./configure產生make.config文件后,要將make.config中的-O3都改為-O2才能執行下一步,不這樣將優化等級適當調低的話編譯到中途可能卡主。如果是gfortran或者老版本ifort,比如ifort 10,則不存在這個問題。
串行版本的最簡單的編譯方式:
1 解壓CFOUR源代碼包,進入其目錄,假設為/sob/cfour_v1
2 運行./configure FC=ifort (沒裝ifort就改成FC=gfortran)
3 make。編譯出的文件會在bin目錄下
4 將export PATH=$PATH:/sob/cfour_v1/bin加入到當前用戶的.bashrc文件中,輸入bash命令或重新啟動控制臺使之生效。
并行版本+mpich2+MKL+GIMIC程序的接口的編譯:
1 把ifort 12.1(連帶著安裝包內含的MKL)安裝到默認路徑
2 安裝mpich2到默認路徑。也就是解壓后運行./configure FC=ifort,然后make,然后make install。將127.0.0.1 ltwd ltwd加到/etc/hosts最后,ltwd代表當前實際主機名。
3 export MKLPATH=/opt/intel/mkl/lib/intel64 (如果是老版本ifort,默認的MKL路徑可能不一樣,根據實際情況調整)
4 解壓CFOUR源代碼包,進入其目錄,假設為/sob/cfour_v1
5 將下面這一串作為一整行復制到控制臺中執行。由于這里加了--enable-gimic,因此會編譯出xcpdens程序,這是給GIMIC用的,和GIMIC包里自帶的xcpdens其實是完全一樣的。
./configure FC=ifort MPIFC=mpif90 --enable-gimic --with-blas="$MKLPATH/libmkl_solver_ilp64.a -Wl,--start-group $MKLPATH/libmkl_intel_ilp64.a $MKLPATH/libmkl_intel_thread.a $MKLPATH/libmkl_core.a -Wl,--end-group -openmp -lpthread" --enable-mpi=mpich --with-mpirun="mpirun -np \$CFOUR_NUM_CORES" --with-exenodes="mpirun -np \$CFOUR_NUM_CORES"
5 make
6 將export PATH=$PATH:/sob/cfour_v1/bin加入到當前用戶的.bashrc文件中,輸入bash命令或重新啟動控制臺使之生效。
3 使用方法
CFOUR的輸入文件必須命名為ZMAT。運行前要將CFOUR目錄下basis文件夾里的GENBAS基組文件拷到ZMAT所在目錄下,如果用贗勢,也要把basis文件夾里的ECPDATA文件拷到那里。然后在ZMAT所在目錄下輸入xcfour即可開始運算。運行過程信息輸出到屏幕上,同時還會在當前目錄下產生一大堆文件,如果之后要算新任務,應該把它們刪掉。
如果用的是按上面方法編譯的并行+MKL版,運行前需要先設定兩個環境變量,比如有8個CPU核心時可以這么設
export CFOUR_NUM_CORES=4
export MKL_NUM_THREADS=2
這里CFOUR_NUM_CORES設定的是MPI并行時啟用多少個進程,設為n的話那么內存及硬盤的開銷就會約為之前的n倍。MKL_NUM_THREADS設定的是每個MPI進程中在調用MKL數學庫時啟用多少個線程,這并不會增加資源消耗。上面的例子,運行時總共就會有4*2=8個線程并行。由于程序中利用MKL庫的部分是有限的,所以靠MKL_NUM_THREADS并行明顯不如用CFOUR_NUM_CORES并行程度充分,對于四核機子,通常這兩個參數為4/1時比1/4的時候要快很多。然而,由于做較大的后HF計算時總是要頻繁、大量讀寫硬盤,進程太多就會使硬盤I/O速度成為嚴重的瓶頸,反倒會拖慢速度,而且還大幅增加了硬盤使用量,所以,4/1時常不如2/2的時候快。這兩個參數怎么設效率最高,應當在自己條件下實際測試一下。
MPI并行運算時依然是直接輸入xcfour即可,不要在前面自己寫mpirun -np x,因為程序會自動把它加上去。
CFOUR支持MPI并行的功能主要是耦合簇計算,必須在輸入文件中包含CC_PROGRAM=ECC和ABCDTYPE=AOBASIS關鍵詞才行(即便不并行,帶上它們也比默認情況算得更快)。
對于不支持MPI并行的任務,如MP2,如果想達到并行化,就只能靠MKL_NUM_THREADS來實現。也就是說,此時要用串行版本來計算,且在編譯串行版本的./configure這一步后面加上這一串以利用MKL:--with-blas="$MKLPATH/libmkl_solver_ilp64.a -Wl,--start-group $MKLPATH/libmkl_intel_ilp64.a $MKLPATH/libmkl_intel_thread.a $MKLPATH/libmkl_core.a -Wl,--end-group -openmp -lpthread"
假設有n個核,就設export MKL_NUM_THREADS=n
4 輸入文件格式
典型的輸入文件格式為
Water CC-LR/DZP at experimental equilibrium geometry
O
H 1 R
H 1 R 2 A
R=0.958
A=104.5
*CFOUR(CALC=CCSD,BASIS=DZP,EXCITE=EOMEE)
%excite*
1
1
1 5 0 6 0 1.0
[空行]
第一行是注釋,接下來是分子坐標(默認為埃),元素名必須頂頭寫。*CFOUR()里面是關鍵詞,顯然,CALC和BASIS就是指方法和基組。最后一部分是特殊任務才要輸入的(這里是對EOM-CCSD算激發態任務的設定)。
每行不得超過80個字符,然而關鍵詞那行經常會超過這要求,此時可以分多行寫,例如
*CFOUR(CALC=HF,BASIS=cc-pVDZ,PROP=NMR,SYMMETRY=ON
CC_PROGRAM=ECC,ABCDTYPE=AOBASIS)
注意換行處末尾不加逗號,而且要有個空格。因此上面SYMMETRY=ON后面跟著個空格,不要忽略。
如果想優化結構,不需要專門寫關鍵詞,將相應的變量上打星號即可,如
O
H 1 R*
H 1 R* 2 A*
5 常用關鍵詞
此程序很多關鍵詞都平時用不上,或者不需要修改,這里我總結出最常用的關鍵詞的主要含義,建議過目一遍,具體信息還要去查閱在線手冊,在日后新版本很多參數可能都會變名字。注意CFOUR程序做后HF時默認是不凍芯的。
EMORY=xxx將可用內存設為xxx,默認單位為INTEGERWORDS。對于32/64bit平臺分別乘以4/8就是KB。用MEM_UNIT可以將單位改為kB, MB, GB, TB
ECP=ON:使用贗勢
CHARGE:體系的電荷
MULTIPLICITY:體系的自旋多重度
COORDINATES:控制體系的坐標描述。默認的INTERNAL是內坐標,CARTESIAN可以用笛卡爾坐標,但是不能做幾何優化。XYZ2INT是提供內坐標連接關系但使用笛卡爾坐標描述位置。
SCF_CONV=N:密度矩陣最大變化小于10^-N就停了。默認為7
SCF_DAMPING:設500有益于解決SCF不收斂
SCF_MAXCYC:SCF最大迭代次數,默認150
SCF_EXTRAPOLATION:是否用DIIS,默認為ON
SPHERICAL:默認的ON是用球諧型高斯函數,OFF用笛卡爾型
SUBGROUP:默認使用最高階的阿貝爾點群對稱性。C1就相當于SYMMETRY=OFF
PRINT=1:可以比默認的0輸出更多細節信息
GEO_METHOD=TS:找過渡態
GEO_CONV=N:設定優化收斂限為N Hartree/bohr
GEO_MAXCYC:最大優化步數,默認為50
GEO_MAXSTEP:設幾何優化的最大步長為millbohr。默認300
EVAL_HESS=N:每隔N個優化步算一次精確Hessian,默認為從不,也就是用準牛頓法
EXCITE:設定EOM-CC/LR-CC的處理類型,默認為NONE,EOMEE是計算激發態,EOMIP是計算離子化態,EOMEA是計算electron-attached態
ABCDTYPE=AOBASIS:建議對最高至CCSD(T)的各種計算都加上,可以加快速度。默認是=0 (STANDARD)
XFIELD,YFIELD,ZFIELD:XYZ方向加電場
PROPS=FIRST_ORDER:計算一階屬性(多極矩,相對論校正,電場梯度,自旋密度,Mulliken電荷);SECOND_ORDER計算靜態可極化率;DYNAMICAL;計算含頻可極化率;NMR:計算NMR;HYPERPOL:計算靜態超極化率;DYN_HYP計算含頻率超極化率
RAMAN_INT=1:算拉曼
RELATIVISTIC:設定相對論校正
DBOC=1:做diagonal Born-Oppenheimer對能量的校正
VIBRATION=ANALYTIC:用解析二階導數計算諧振頻率
CC_PROGRAM:控制做CC的程序,默認是VCC,對于CCSD, CCSD+T, CCSD(T), closed-shell CCSDT-n, CC3 和CCSDT,建議設為ECC來加快速度
FROZEN_CORE:CFOUR默認在post-HF中不凍芯。如果設為ON,則內核軌道在post-HF過程中都被凍結。如果想設定具體哪些被凍,則用DROPMO來設定
DROPMO:如果輸入比如1>10-55-58>64,就代表1,2,3,4,5,6,7,8,9,10,55,58,59,60,61,62,63軌道都被凍結
FROZEN_VIRT:默認為OFF,如果設為ON,高于指定能量的虛軌道將不被考慮
HFSTABILITY:ON代表做SCF波函數穩定性測試
REFERENCE:RHF、UHF、ROHF、TCSCF(Two-configureational SCF)
RESTART_CC=1:重啟CC計算
CC_CONV=N:CC收斂標準為系數最大改變值小于10^-N。默認為7。實際上此時能量變化遠小于1D-7了,想節省時間的話可以事先停了
附1:BASIS關鍵詞可用的參數(對大小寫敏感)
STO-3G
3-21G
4-31G
6-31G
6-31G*
6-31G**
6-311G
6-311G*
6-311G**
DZ
DZP
TZ
TZP
TZ2P
PVDZ
PVTZ
PVQZ
PV5Z
PV6Z
PCVDZ
PCVTZ
PCVQZ
PCV5Z
PCV6Z
AUG-PVDZ
AUG-PVTZ
AUG-PVTZ
AUG-PVQZ
AUG-PV5Z
AUG-PV6Z
D-AUG-PVDZ
D-AUG-PVTZ
D-AUG-PVQZ
D-AUG-PV5Z
D-AUG-PV6Z
cc-pVDZ
cc-pVTZ
cc-pVQZ
cc-pV5Z
cc-pV6Z
cc-pCVDZ
cc-pCVTZ
cc-pCVQZ
cc-pCV5Z
cc-pCV6Z
PWCVDZ
PWCVTZ
PWCVQZ
PWCV5Z
PWCV6Z
PwCVDZ
PwCVTZ
PwCVQZ
PwCV5Z
PwCV6Z
svp
dzp
tzp
tzp2p
qz2p
pz3d2f
13s9p4d3f
WMR
ANO0
ANO1
ANO2
EVEN_TEMPERED
附2:CALC關鍵詞可用的設定(還有些關鍵詞比如FCI、CC4、CCSDTQPH等都需要外掛MRCC才能實現)
SCF (or HF)
MBPT(2) (or MP2)
MBPT(3) (or MP3)
SDQ-MBPT(4) (or SDQ-MP4)
MBPT(4) (or MP4)
CCD
CCSD
CCSD(T)
CCSDT-1
CCSDT-1b
CCSDT-2
CCSDT-3
CCSDT-4
CCSDT
CC2
CC3
QCISD
QCISD(T)
CID
CISD
UCC(4)
B-CCD