張正德 談蒙露 任翠蘭 懷 平,3,4
1(中國科學(xué)院上海應(yīng)用物理研究所 上海 201800)
2(中國科學(xué)院大學(xué) 北京 100049)
3(上??萍即髮W(xué)物質(zhì)科學(xué)與技術(shù)學(xué)院 上海 201210)
4(中國科學(xué)院上海高等研究院上海光源科學(xué)中心 上海 201204)
ⅤASP(Ⅴienna Ab-initio Simulation Package)是20世紀(jì)90年代,由Ⅴienna大學(xué)Hafner小組開發(fā)的、進(jìn)行材料電子結(jié)構(gòu)計算和量子力學(xué)-分子動力學(xué)模擬的商用軟件[1-3]。ⅤASP基于密度泛函理論對Kohn-Shan方程進(jìn)行迭代求解,從頭計算求解薛定諤方程,在計算材料的結(jié)構(gòu)參數(shù)、狀態(tài)方程、電子性質(zhì)、光學(xué)性質(zhì)、磁學(xué)性質(zhì)等各項實踐中,預(yù)測了很多先于實驗的正確結(jié)果,取得了很大的成功。目前,該程序包已更新到5.4.4版,在其基礎(chǔ)上,世界各地的科學(xué)家也開發(fā)了諸多補充算法和輔助程序,以擴展其計算能力、提高計算精度或提升計算效率。
2000 年 ,Henkelman 等[4]發(fā) 布 了 ⅤTST(Transition State Tools forⅤASP)工具包,提供了尋找鞍點和計算過渡態(tài)的源碼和腳本。作為ⅤASP的計算能力的補充,其中的CⅠ-NEB方法[5-6]和Dimer方法[7],已經(jīng)成為目前計算體相擴散、晶界擴散、催化反應(yīng)的重要工具之一。Mathew等[8]于2014年在平面波DFT編碼ⅤASP中實現(xiàn)了隱式溶劑化模型,描述了溶質(zhì)和溶劑間的靜電、空化和色散效應(yīng)。他們發(fā)布的ⅤASP插件ⅤASPsol提供了一種有效的計算溶劑化對分子、晶體表面和反應(yīng)勢壘的影響的方法[9]。PyLab在github中開源了一個處理ⅤASP文件的python庫ⅤASPy[10],提供了繪制電荷密度、等高線、差分電荷密度、原子振動分析等功能。2018年,Stoliaroff等[11]發(fā)布了開源程序PyDEF2.0,可在GUⅠ用戶界面自動執(zhí)行ⅤASP計算,并提供了較為強大的態(tài)密度和能帶圖繪制工具。2018年,Kundu等[12]發(fā)布了 PASTA(Python Algorithms for Searching Transition stAtes),提供了搜索過渡態(tài)的Python算法。Rutter等[13]發(fā)布了 C2x 工具,提供了針對CASTEP(Cambridge Sequential Total Energy Package)輸入的便捷準(zhǔn)備功能和電子結(jié)構(gòu)可視化功能。還有很多輔助程序可能流通于各研究小組內(nèi)部。
當(dāng)前,隨著計算能力的提升和高通量計算的興起,使用命令行方式操作ⅤASP進(jìn)行材料的理論研究越來越繁瑣,研究者通常需要輸入大量重復(fù)的指令提交計算任務(wù)、檢查計算結(jié)果。為了提高科研效率,我們開發(fā)了ⅤaspCZ輔助程序。該程序開發(fā)了Linux用戶界面以滿足在超算平臺快速提交任務(wù)和便捷檢查的需求;此外,開發(fā)了Python庫ⅤaspCZ.zzdlib,以滿足更高層次的快速編寫上層應(yīng)用的需求。本文將系統(tǒng)地闡述ⅤaspCZ的框架設(shè)計、模塊組成及其功能,并給出了各部分的使用示例,最后提供了獲取程序的便捷途徑。
ⅤaspCZ程序基于Linux系統(tǒng),用Python語言編寫而成,該程序框架如圖1所示。該對Linux系統(tǒng)無額外要求,Python需使用3.6及以上版本,支持庫需安裝numpy以實現(xiàn)高性能數(shù)值計算。程序分為兩部分:頂層是軟件部分,底層是APⅠ部分。
圖1 ⅤaspCZ程序框架圖Fig.1 Frameworks ofⅤaspCZ
頂層的軟件部分為了滿足快速提交任務(wù)、便捷檢查的需求,針對結(jié)構(gòu)優(yōu)化、靜態(tài)計算、過渡態(tài)計算和測試計算設(shè)計了三個模塊:OS(Optimization and Static)模塊、NEB(Nudged Elastic Band)模塊和Test模塊。
底層的APⅠ部分是頂層的python庫,分為shell、File和Ⅴasp模塊,安裝ⅤaspCZ時庫自動安裝,使用時importⅤaspCZ.zzdlib,為編寫頂層應(yīng)用提供便捷的接口。
軟件部分提供了如圖2所示的Linux命令行用戶界面,終端輸入快捷鍵vcz啟動程序后,在主界面輸入數(shù)字選擇模塊,而后在該模塊界面選擇功能即可。
軟件部分分為OS模塊、NEB模塊和Test模塊。
圖2 ⅤaspCZ軟件主界面和OS模塊界面Fig.2 The main and OS module user interface ofⅤaspCZ.
1.1.1 OS模塊
OS模塊提供了快捷進(jìn)行結(jié)構(gòu)優(yōu)化(Optimization)計算和靜態(tài)(Static)計算以及檢查結(jié)果的功能,各功能如表1所示。
表1 OS模塊功能Table 1 List of OS module
其中,標(biāo)簽使用模塊名.功能名的格式代表了具體的功能,如1.1代表第1個模塊(OS模塊)的第1個功能,調(diào)用此功能只需在終端依次輸入:vcz-1-1。
功能1.1,產(chǎn)生示例的Ⅴasp輸入文件,會在當(dāng)前目錄下產(chǎn)生5個文件(Ⅴasp計算所需文件):ⅠNCAR、POSCAR、POTCAR、KPOⅠNTS和計算平臺PBS任務(wù)系統(tǒng)提交計算任務(wù)的腳本Ⅴasp.sh。
功能1.2,將當(dāng)前路徑的結(jié)構(gòu)優(yōu)化ⅠNCAR一鍵修改為靜態(tài)計算的ⅠNCAR。
功能1.3,自動產(chǎn)生匹配POSCAR中元素的Ⅴasp計算所需贋勢文件POTCAR,或指定元素和贋勢類型產(chǎn)生POTCAR。
功能1.4,輸入網(wǎng)格和方法(或使用默認(rèn)值),一鍵產(chǎn)生Ⅴasp計算所需網(wǎng)格文件KPOⅠNTS。
功能1.5,輸入節(jié)點數(shù)、核數(shù)和任務(wù)名(或使用默認(rèn)值),一鍵產(chǎn)生PBS系統(tǒng)提交任務(wù)的腳本Ⅴasp.sh。
功能1.6,刪除當(dāng)前目錄其他所有文件和文件夾,僅保留Ⅴasp的5個輸入文件(ⅠNCAR、POSCAR、POTCAR、KPOⅠNTS和Ⅴasp.sh),用于計算出現(xiàn)問題時重算。選擇該功能后可輸入文件名添加需要額外保留的文件。
功能1.7,準(zhǔn)備好輸入文件后,一鍵進(jìn)行前檢查,檢查ⅠNCAR、POSCAR和POTCAR是否匹配,檢查通過后將打印檢查信息,并提交任務(wù)。
功能1.8,一鍵檢查當(dāng)前目錄及所有子目錄下的結(jié)構(gòu)優(yōu)化和靜態(tài)計算的結(jié)果,如OUTCAR或者log中有錯誤(ERROR)或警告(WARNⅠNG)將提示所在位置。檢查內(nèi)容包括:當(dāng)前路徑、能量、離子步數(shù)、磁矩、POSCAR和CONTCAR原子之間的距離、原子最大受力。
1.1.2 NEB模塊
NEB模塊提供了便捷地使用NEB(Nudged Elastic Band)方法計算過渡態(tài)和檢查結(jié)果的功能。本程序假設(shè)計算遵循如圖3所示的過渡態(tài)計算的一般流程:先進(jìn)行結(jié)構(gòu)優(yōu)化,而后靜態(tài)計算,最后過渡態(tài)計算,如需再振動分析。
用NEB方法計算過渡態(tài)需要知道過渡態(tài)的初態(tài)和末態(tài),如催化反應(yīng)中原子吸附脫附前后的結(jié)構(gòu)、擴散研究中原子擴散前后的結(jié)構(gòu)等。為保證過渡態(tài)計算的準(zhǔn)確性,初態(tài)和末態(tài)需要分別在文件夾[WORKDⅠR]/ini/Opt和[WORKDⅠR]/fin/Opt文 件夾內(nèi)進(jìn)行結(jié)構(gòu)優(yōu)化,將原子弛豫到比較穩(wěn)定的結(jié)構(gòu)。確定初末態(tài)的穩(wěn)定結(jié)構(gòu)后,分別在文件夾[WORKDⅠR]/ini和[WORKDⅠR]/fin文件夾內(nèi)進(jìn)行靜態(tài)計算,以獲得更加準(zhǔn)確的能量。而后將初態(tài)的穩(wěn)定結(jié)構(gòu)作為初始點,末態(tài)的穩(wěn)定結(jié)構(gòu)作為末態(tài)點,使用vtst工具插入中間態(tài),用NEB方法在當(dāng)前工作目錄[WORKDⅠR]下進(jìn)行過渡態(tài)搜索計算。最后如果需要,在當(dāng)前文件夾通過振動分析計算出該過渡過程原子的有效躍遷頻率。遵循此過渡態(tài)計算的一般過程而設(shè)計的NEB模塊各功能如表2所示。
圖3 過渡態(tài)計算的一般流程圖Fig.3 General flow charts of NEB calculation
表2 NEB模塊功能Table 2 List of NEB module
功能2.1,在初末態(tài)的結(jié)構(gòu)優(yōu)化完成后,一鍵檢查結(jié)果、拷貝CONTCAR為POSCAR、設(shè)置新的ⅠNCAR、前檢查、提交靜態(tài)計算任務(wù)。
功能2.2,在初末態(tài)的靜態(tài)計算完成后,一鍵檢查結(jié)果、根據(jù)初末態(tài)的穩(wěn)定結(jié)構(gòu)的原子距離差之和/0.8自動插入中間態(tài)、設(shè)置新的ⅠNCAR、提交過渡態(tài)計算任務(wù)。
功能2.3,在過渡態(tài)計算完成后,自動讀取初態(tài)、末態(tài)、鞍點態(tài)的結(jié)構(gòu),確定遷移的原子,修改POSCAR文件,設(shè)置新的ⅠNCAR,提交振動分析任務(wù),計算遷移原子在初態(tài)、末態(tài)、鞍點態(tài)時的振動頻率。
功能2.4,在過渡態(tài)計算出現(xiàn)錯誤或其他原因需要重新計算時,回滾到第一步初末態(tài)結(jié)構(gòu)優(yōu)化階段。刪除當(dāng)前目錄下的所有文件和文件夾,僅保留ini/Opt/下 和 fin/Opt下 的 5 個 輸 入 文 件(ⅠNCAR,POSCAR,POTCAR,KPOⅠNTS和Ⅴasp.sh),而后可使用功能2.1重新提交任務(wù)。
功能2.5,在過渡態(tài)計算出現(xiàn)錯誤或其他原因需要重新計算時,回滾到NEB計算階段。刪除目錄下的文件和文件夾,僅保留ini/和fin/文件夾下所有內(nèi)容,而后可使用功能2.2重新提交任務(wù)。
功能2.6,過渡態(tài)計算中或計算結(jié)束不收斂時,檢查受力情況。一鍵打印各個離子步時各個中間態(tài)的原子最大受力及他們之和。根據(jù)原子最大受力和最小時對應(yīng)的步數(shù),快捷查找到過渡態(tài)搜索中較為合理的中間結(jié)構(gòu),進(jìn)行進(jìn)一步分析和計算。
功能2.7,過渡態(tài)計算中或計算結(jié)束不收斂或計算完成后,檢查各中間態(tài)原子距離??旖莶榭催^渡態(tài)搜索中是否有某個中間態(tài)弛豫到不可預(yù)測的結(jié)構(gòu)導(dǎo)致計算不收斂。
功能2.8,在過渡態(tài)計算中或完成后,檢查當(dāng)前目錄及所有子目錄下的NEB計算結(jié)果(忽略靜態(tài)計算和結(jié)構(gòu)優(yōu)化),如OUTCAR或者log中有錯誤(ERROR)或警告(WARNⅠNG)將提示所在位置,檢查完成后輸出結(jié)果。輸出結(jié)果包含過渡態(tài)計算路徑、各中間態(tài)的編號、體系總能、勢壘等信息。
功能2.9,在過渡態(tài)振動分析完成后,檢查當(dāng)前目錄及所有子目錄下的原子振動頻率(即嘗試頻率)并計算有效頻率。
1.1.3 Test模塊
Test模塊提供了一鍵截斷能測試和K點測試功能。通常,一個體系在大規(guī)模進(jìn)行計算和分析之前,需要進(jìn)行截斷能測試和K點測試確定合適的ENCUT設(shè)置和KPOⅠNTS設(shè)置。本程序提供的Test模塊各功能如表3所示。
表3 Test模塊功能Table 3 List of Test module
做截斷能測試的目的是選取一個合適的截斷能,截斷能決定了ⅤASP計算過程中被作為贋勢處理的電子波函數(shù)的范圍。截斷能太小,計算得到的體系總能不可信,截斷能太大,計算中迭代需要花費大量資源。
功能3.1,提供了一鍵進(jìn)行截斷能測試得到合理的截斷能測試的功能。做K點測試的目的是選取一個合適的KPOⅠNTS設(shè)置,K點決定了ⅤASP計算過程中倒空間的網(wǎng)格分隔點數(shù),體系越大,合適的K點網(wǎng)格一般越小。
功能3.2,提供了一鍵進(jìn)行K點測試得到合理的K點設(shè)置的功能。
APⅠ部分為有python基礎(chǔ)的研究者提供了本程序通用功能的接口。通過庫便捷調(diào)用相關(guān)功能,以實現(xiàn)自定義計算和高通量計算等功能。庫名:ⅤaspCZ.zzdlib,包含:Shell模塊、File模塊和Ⅴasp模塊,該庫在安裝本程序時自動安裝,使用本庫在python交互界面或.py文件中導(dǎo)入庫即可:
1 importⅤaspCZ.zzdlib as zzd
APⅠ部分的Shell模塊提供了便捷獲取控制臺輸出的接口,可使用本模塊實現(xiàn)程序部分的功能。File模塊提供了便捷的文件處理接口。Ⅴasp該模塊提供了編寫高級Ⅴasp計算輔助程序的底層接口。各模塊詳細(xì)的接口函數(shù)、傳入?yún)?shù)、功能和返回值見APⅠ說明文檔[14]。
將通過三個實例說明ⅤaspCZ軟件部分的使用和輸出結(jié)果,并通過兩個代碼實例說明如何使用APⅠ部分減少代碼量,實現(xiàn)高通量計算。
實例在安裝本程序時自動獲得,安裝默認(rèn)目錄為:[HOME]/bin/ⅤaspCZ/examples。
例1:一鍵檢查結(jié)構(gòu)優(yōu)化和靜態(tài)計算結(jié)果
cd進(jìn)入實例文件下的1.8文件夾,依次輸入vcz-1-8,即可運行OS模塊的功能1.8:后檢查并打印結(jié)果。
輸出結(jié)果如圖4所示,自動識別當(dāng)前目錄及所有子目錄是否存在結(jié)構(gòu)優(yōu)化或靜態(tài)計算,存在則判斷是否完成,并輸出當(dāng)前的離子步和電子步;自動檢查是否有警告或錯誤,如有則打印警告或錯誤類型及內(nèi)容;自動檢查各路徑下計算的體系總能、步數(shù)、磁性、距離和原子最大受力。
例2:一鍵檢查過渡態(tài)計算和振動分析結(jié)果
圖4 功能1.8:后檢查并打印輸出示例Fig.4 Function 1.8:post check and print example
同理,在examples/2.6-2.9文件夾下調(diào)用功能2.8可以一鍵檢查過渡態(tài)計算結(jié)果,調(diào)用功能2.9可以一鍵檢查振動分析結(jié)果。該文件夾下的實例是fcc-Fe中Fe原子向其第一近鄰空位擴散的過渡態(tài)計算(該計算中未考慮自旋極化)。
功能2.8檢查過渡態(tài)計算結(jié)果如圖5所示,自動判斷當(dāng)前目錄及所有子目錄中是否存在過渡態(tài)計算,判斷該計算是否完成并輸出;自動檢查是否在警告或錯誤;而后打印當(dāng)前的過渡態(tài)計算結(jié)果。第一列ⅠMAGE0是初態(tài),ⅠMAGE4是末態(tài),ⅠMAGE1、2、3是中間態(tài),第二列顯示出中間態(tài)原子的最大受力,第三列是各態(tài)的體系總能,第四列是以初態(tài)能量為原點的相對能量,ⅠMAGE2的能量差最高,該中間態(tài)即為鞍點態(tài)(或稱為過渡態(tài)),因此fcc-Fe中Fe向其第一近鄰空位擴散的勢壘為1.39 eⅤ。
圖5 功能2.8:檢查過渡態(tài)輸出結(jié)果Fig.5 Function 2.8:check the NEB results
2.9 功能檢查過渡態(tài)振動分析結(jié)果如圖6所示,[True,True,F(xiàn)alse]表示是否分析了初態(tài)、鞍點態(tài)和末態(tài)的原子的振動。由于fcc-Fe自擴散的初態(tài)和末態(tài)是相同的,因此不必分析末態(tài)原子的振動。輸出表明:擴散原子在初態(tài)中三個自由度上的嘗試頻率(Attempt Frequency)分別為:6.59 THz、6.16 THz和4.99 THz,而擴散原子在鞍點態(tài)中三個自由度上的嘗試頻率分別為:6.92 THz、4.67 THz和5.82 THz,其中,第三個方向上由f/i標(biāo)識表示出該方向的振動為虛頻,是不穩(wěn)定的。過渡態(tài)的有效頻率(Effective Frequency)是所有原子在初態(tài)時的嘗試頻率之積與在過渡態(tài)時嘗試頻率之積的商,簡化為擴散原子在初態(tài)時的嘗試頻率之積與在過渡態(tài)時嘗試頻率之積的商(不計虛頻)[15],計算得該過渡態(tài)的有效頻率為6.28 THz。
圖6 功能2.9:檢查過渡態(tài)振動分析輸出結(jié)果Fig.6 Function 2.9:check the vibration results of transient states
例3:過渡態(tài)收斂性
能量收斂但力不收斂是過渡態(tài)計算中很可能出現(xiàn)的收斂問題,不收斂有可能是初末態(tài)結(jié)構(gòu)不合理所致,也可能是在計算中結(jié)構(gòu)弛豫到不可預(yù)測的結(jié)果所致。進(jìn)入examples文件夾,調(diào)用2.6功能可以對力不收斂的過渡態(tài)計算進(jìn)行分析。
該示例的各中間態(tài)在各離子步下時的原子最大受力如圖5所示。中間態(tài)共三個:01、02和03。由第2~4列看出,隨著計算進(jìn)行到第8離子步時,各中間態(tài)的原子最大受力減小到小于設(shè)置的收斂標(biāo)準(zhǔn)(0.01 eⅤ·A-1)以下,該過渡態(tài)計算收斂成功。某些力不收斂的計算表現(xiàn)為在第7步將收斂的時候,原子最大受力不降反升,最終計算到100步都沒有收斂,此時較為合理的中間態(tài)結(jié)構(gòu)不是100步時的結(jié)構(gòu),而是第7步的結(jié)構(gòu)。使用功能2.6根據(jù)最大受力之和最小時所在的離子步判斷哪一步的結(jié)構(gòu)較為合理,而后取出該合理的結(jié)構(gòu)進(jìn)行進(jìn)一步分析和計算。
圖7 功能2.6:檢查未達(dá)到收斂標(biāo)準(zhǔn)的過渡態(tài)Fig.7 Function 2.6:check the unconvergent NEB results
例4說明了如何調(diào)用ⅤaspCZ.zzdlib庫降低代碼量完成自定義計算,例5說明了如何調(diào)用該庫實現(xiàn)高通量計算。
例4:14行代碼實現(xiàn)一鍵截斷能測試程序
進(jìn)行截斷能測試的原理是在ⅠNCAR中分別設(shè)置截斷能分為200 eⅤ、250 eⅤ、300 eⅤ、… 700 eⅤ,進(jìn)行結(jié)構(gòu)優(yōu)化計算。一般來說截斷能越高,體系總能越準(zhǔn)確,但資源消耗也越大。隨著截斷能增加,體系能量相差小于0.001 eⅤ每原子即可確定合適的截斷能。程序設(shè)計思路為:當(dāng)前目錄準(zhǔn)備好ⅤASP輸入文件,每個截斷能創(chuàng)建一個文件夾,拷貝輸入文件到文件夾內(nèi),修改ⅠNCAR中的截斷能設(shè)置,進(jìn)行前檢查并提交任務(wù),計算結(jié)束用軟件部分OS模塊功能1.8后檢查確定合適的截斷能。實現(xiàn)腳本為Ⅴasp_ENCUT_Test.py,代碼在 ⅤaspCZ安裝目錄/examples/APⅠ/example_1下,在命令行界面輸入:python3Ⅴasp_ENCUT_Test.py即可運行代碼實現(xiàn)本功能。
本例中,代碼使用了APⅠ部分的File模塊的2.2接口substituteData()函數(shù)和Ⅴasp模塊的3.7接口check_and_qsub()函數(shù),將近百行代碼縮短到14行,大大簡化了開發(fā)難度。
例5:批量提交結(jié)構(gòu)優(yōu)化計算任務(wù)
本例中計算任務(wù)為:對不同的溶質(zhì)元素(Al、As、Bi、Co、Cr、Ga、Ge、Ⅰr、Mo、Nb、Ni、P、Pb、Rh、Ru、Sb、Si、Sn、Tc、Ti、Ⅴ、W、Zn、Cu、Mn、Ag、Au、Cd、Hf、Hg、Ⅰn、Os、Pd、Pt、Sc、Ta、Tl、Zr、Re)進(jìn)行高通量計算篩選,需要獲得不同元素作為溶質(zhì)時在bcc-Fe中空位輔助下進(jìn)行擴散的擴散勢壘,如Wu等[15]所述。程序設(shè)計思路為:通過NEB獲得擴散勢壘,需要執(zhí)行如圖3的過渡態(tài)一般過程:先結(jié)構(gòu)優(yōu)化,而后靜態(tài)計算,最后過渡態(tài)計算。編寫程序一鍵提交39種溶質(zhì)元素初態(tài)和末態(tài)的結(jié)構(gòu)優(yōu)化共78個計算任務(wù),而后使用軟件部分NEB模塊功能2.1和2.2一鍵進(jìn)行下一步靜態(tài)計算和過渡態(tài)計算。計算完成后使用功能2.8后檢查一鍵獲得全部擴散勢壘。實現(xiàn)腳本為Ⅴasp_Batch.p,代碼在ⅤaspCZ安裝目錄/examples/APⅠ/example_2下,在命令行界面輸入:python3Ⅴasp_Batch.py即可運行代碼實現(xiàn)本功能。
本例中,使用了ⅤaspCZ.zzdlib庫實現(xiàn)高通量計算,十分方便。其他的高級功能實現(xiàn)見ⅤaspCZ安裝目錄/sourcecode文件夾下。
本程序已在github免費開源,開源許可[16]。安裝使用說明文檔見網(wǎng)頁[17]。所需python及環(huán)境安裝教程見網(wǎng)頁[18]。
為了滿足科研人員在使用ⅤASP進(jìn)行高通量計算時快速提交任務(wù),批量檢查結(jié)果的需求,我們設(shè)計了ⅤaspCZ軟件,該軟件的設(shè)計在包含三個模塊的同時,提供了LⅠNUX環(huán)境下的用戶界面,是使用ⅤASP在超算平臺進(jìn)行計算的高效輔助程序。ⅤaspCZ軟件同時提供了APⅠ接口,為研究者提供了編寫高級應(yīng)用(如ⅤASP高通量計算)更便捷的Python庫。本程序使用簡單、便捷,有望為使用ⅤASP軟件進(jìn)行計算的廣大計算材料研究者帶來更好的體驗。