戰(zhàn):平面波程序安裝與計(jì)算避坑指南)
簡介CASTEP-19.11.tar.gz 是一款基于密度泛函理論的第一性原理量子力學(xué)計(jì)算軟件包 CASTEP 的 19.11 版本面向計(jì)算材料學(xué)、固體物理、化學(xué)催化等科研與工程領(lǐng)域用于模擬晶體與表面體系的電子結(jié)構(gòu)、能帶分布、聲子振動(dòng)、電荷密度以及化學(xué)反應(yīng)路徑等關(guān)鍵性質(zhì)。整個(gè)壓縮包包含 4542 個(gè)文件約 20.12MB文件組成以 param 和 cell 計(jì)算輸入、C 與 Fortran 源碼、Python 腳本、cif 結(jié)構(gòu)文件、usp/recpot 贗勢文件、mk 和 makefile 編譯腳本以及 tex/readme/pdf 文檔為主并附帶了編譯指南、示例算例與若干結(jié)構(gòu)/結(jié)果轉(zhuǎn)換工具目錄結(jié)構(gòu)較清晰便于按模塊檢索和編譯安裝。已有 1595 人學(xué)習(xí)下載。通過這一壓縮包可取得 CASTEP 19.11 完整源碼、示例輸入文件、文檔及編譯配置自帶聲子、能帶與幾何優(yōu)化等示例能夠幫助較快上手晶體結(jié)構(gòu)優(yōu)化、能帶計(jì)算、頻率分析、電荷密度分析等典型任務(wù)源碼也體現(xiàn)了并行算法、自洽場迭代與贗勢庫的改進(jìn)便于深入理解 DFT 實(shí)現(xiàn)并開展二次開發(fā)。1. CASTEP 19.11源碼包為什么值得自己編譯這份平面波計(jì)算程序手里有臺(tái)工作站想算某二維半導(dǎo)體材料的電子結(jié)構(gòu)結(jié)果課題組里的商業(yè)程序授權(quán)到期續(xù)費(fèi)流程走了半個(gè)月還沒批下來。把一個(gè)CASTEP 19.11源碼包拿過來自己編譯幾乎是唯一不打斷研究節(jié)奏的路子。CASTEP以平面波基組和贗勢著稱晶體、表面、界面這類周期體系的幾何優(yōu)化、能帶、態(tài)密度、彈性常數(shù)都能算19.11的內(nèi)置贗勢庫和CMake構(gòu)建流程對(duì)新手也算友好。適合的人有Linux基礎(chǔ)、知道一點(diǎn)Fortran編譯概念、想把計(jì)算環(huán)境完全握在自己手里的從業(yè)者與研究生。下文不聊泛泛的概念直接按我實(shí)際拆包、編譯、跑任務(wù)的順序來寫坑都給你標(biāo)出來。2. CASTEP的計(jì)算邏輯平面波展開、超軟贗勢與SCF循環(huán)2.1 平面波基組與能量截?cái)嗟奈锢碇庇XCASTEP這類平面波程序與常見的局域軌道程序最大的區(qū)別在基組。晶體具有周期性勢場滿足平移對(duì)稱性根據(jù)Bloch定理波函數(shù)可以寫成周期函數(shù)與平面波因子的乘積把周期部分再展開成平面波最終每個(gè)k點(diǎn)上的波函數(shù)就是一組平面波的疊加。平面波基組不需要人為指定原子軌道它像傅里葉級(jí)數(shù)一樣把實(shí)空間里變化很快的波函數(shù)用越來越細(xì)的頻率去逼近。這個(gè)性質(zhì)帶來的好處是只要基組取得夠大計(jì)算結(jié)果可以系統(tǒng)性地逼近真實(shí)解不像局域軌道方法那樣依賴基組函數(shù)的選擇經(jīng)驗(yàn)?;M大小由動(dòng)能截?cái)鄥?shù)cut_off_energy決定。平面波的動(dòng)能與波矢平方成正比程序只保留動(dòng)能小于該截?cái)嘀档钠矫娌?。Ecut越大波函數(shù)展開越充分結(jié)果越接近收斂值但計(jì)算量也越大。基組數(shù)量大致與體系體積和Ecut的1.5次方成正比體積翻倍時(shí)計(jì)算量不會(huì)只翻倍。我見過不少人在2×2×2超胞上耗掉幾周時(shí)間其實(shí)就是低估了基組數(shù)量隨體積的膨脹速度。CASTEP里常用超軟贗勢這個(gè)組合下Ecut一般落在300到700 eV之間比PAW類程序動(dòng)輒上500 eV的習(xí)慣要溫和一些但也不代表你可以直接把別的程序的截?cái)嗄苷瞻徇^來。還有個(gè)容易忽略的點(diǎn)是k點(diǎn)網(wǎng)格與Ecut的耦合。Ecut決定每個(gè)k點(diǎn)上的平面波數(shù)量k點(diǎn)網(wǎng)格決定布里淵區(qū)采樣的密度。兩者相互獨(dú)立但都影響總能量精度。初學(xué)者常犯的毛病是只調(diào)Ecut不調(diào)k點(diǎn)結(jié)果換了網(wǎng)格發(fā)現(xiàn)能量跳了50 meV還以為程序出了問題。實(shí)際上結(jié)構(gòu)優(yōu)化時(shí)力與應(yīng)力的收斂對(duì)k點(diǎn)密度比對(duì)Ecut更敏感尤其是含有金屬鍵或存在電荷密度變化劇烈的體系。判斷一個(gè)設(shè)置是否合理唯一標(biāo)準(zhǔn)是同時(shí)加大Ecut和k點(diǎn)密度看目標(biāo)量的變化是否低于你設(shè)定的閾值。提示平面波程序的收斂測試是短板但也是必做項(xiàng)。省掉這一步后面所有結(jié)果的可靠性都要打問號(hào)。2.2 內(nèi)置OTFG贗勢庫與贗勢的選取贗勢在這里不是可有可無的選項(xiàng)而是決定計(jì)算成本與精度的核心組件。芯區(qū)電子的波函數(shù)振蕩劇烈直接用全電子平面波展開需要極大的Ecut。贗勢的思想是把芯區(qū)電子凍結(jié)用一個(gè)平滑的等效勢代替原子實(shí)只讓價(jià)電子參與自洽計(jì)算。CASTEP 19.11內(nèi)置了on-the-fly generated贗勢庫OTFG這是它比早期版本省心的地方不需要像VASP那樣為每個(gè)元素單獨(dú)找POTCAR文件也不需要像一些老代碼那樣手工下載.usp文件所有常用元素的贗勢參數(shù)在編譯時(shí)已經(jīng)打進(jìn)程序里了。在輸入文件里聲明贗勢的方式也很直接在cell文件里寫一行species_pot塊指定元素名和泛函類型。比如要算硅寫法是Si: PBE程序會(huì)在運(yùn)行時(shí)從內(nèi)置庫中即時(shí)生成對(duì)應(yīng)的超軟贗勢。這里有個(gè)細(xì)節(jié)值得注意OTFG贗勢庫里同一元素在不同泛函類別下是不同的贗勢Si: LDA和Si: PBE對(duì)應(yīng)兩套完全不同的生成參數(shù)用錯(cuò)泛函不會(huì)報(bào)錯(cuò)但結(jié)果會(huì)系統(tǒng)地偏離PBE參考數(shù)據(jù)。所以選定xc_functional時(shí)一定要回頭核對(duì)cell文件里每個(gè)物種的贗勢字符串保持兩者一致。與VASP的POTCAR機(jī)制相比CASTEP的OTFG贗勢對(duì)新手更友好但也有邊界它能生成的元素類型和泛函版本取決于源碼包自帶的贗勢庫版本不是所有元素都支持所有泛函。比如某些稀土元素在舊版贗勢庫里只有LDA版本這時(shí)你要么降低泛函要求要么換外部贗勢文件。判據(jù)很簡單跑任務(wù)時(shí)如果程序報(bào)Unidentified species或在贗勢生成階段直接退出優(yōu)先懷疑元素與泛函的組合不存在而不是懷疑Cell文件寫錯(cuò)。2.3 SCF循環(huán)與幾何優(yōu)化的兩層迭代關(guān)系CASTEP的計(jì)算任務(wù)可以理解成兩層循環(huán)。內(nèi)層是電子步也就是自洽場SCF迭代給定原子位置求解Kohn-Sham方程得到新的電荷密度再把新密度代回去重新構(gòu)建哈密頓量直到輸入輸出密度之差小于收斂閾值。這個(gè)過程的收斂速度取決于體系性質(zhì)與混合方案。金屬體系費(fèi)米面附近占據(jù)數(shù)突變直接迭代很容易震蕩絕緣體和半導(dǎo)體相對(duì)溫順默認(rèn)的混合參數(shù)往往就能收斂。19.11里常見的混合方法有密度混合與Kerr-Pulay混合前者適用于大多數(shù)情況后者在電荷密度振蕩時(shí)更穩(wěn)。外層是離子步也就是幾何優(yōu)化。每移動(dòng)一次原子位置都要完整跑完一次SCF。CASTEP里幾何優(yōu)化默認(rèn)的算法是BFGS它利用一階導(dǎo)數(shù)原子力和二階導(dǎo)數(shù)信息Hessian來預(yù)測下一步的原子位移。BFGS在接近極小點(diǎn)時(shí)收斂很快但如果初始結(jié)構(gòu)遠(yuǎn)離平衡或者力場里有某些自由度耦合嚴(yán)重也會(huì)出現(xiàn)震蕩甚至發(fā)散。此時(shí)調(diào)整opt_strategy參數(shù)犧牲一點(diǎn)速度換取更穩(wěn)的步長控制往往是比加大Ecut更有效的做法。收斂判據(jù)是另一個(gè)經(jīng)常被忽視的地方。CASTEP的幾何優(yōu)化有三個(gè)獨(dú)立的收斂條件能量收斂、力的收斂和應(yīng)力的收斂三者要同時(shí)滿足才算收斂。默認(rèn)的閾值偏寬松適合粗篩如果要拿結(jié)果去算彈性常數(shù)或聲子力閾值至少要壓到0.01 eV/?以下應(yīng)力閾值也相應(yīng)收緊。下表是我常用的參考值實(shí)際值按你的精度需求調(diào)整。參數(shù)默認(rèn)參考值高精度建議opt_energy_convergence1e-5 eV/atom1e-6 eV/atomopt_force_convergence0.05 eV/?0.005 eV/?opt_stress_convergence0.1 GPa0.01 GPa還有個(gè)時(shí)間上的直覺SCF次數(shù)與幾何優(yōu)化步數(shù)是兩個(gè)不同量級(jí)的開銷。一次SCF通常幾十個(gè)電子步一次幾何優(yōu)化幾十個(gè)離子步所以一個(gè)完整優(yōu)化任務(wù)要跑幾千次電子步。如果某一步SCF遲遲不收斂問題往往出在最內(nèi)層的混合參數(shù)上而不是外層結(jié)構(gòu)。我一般會(huì)先跑單點(diǎn)能task: single point energy把SCF調(diào)穩(wěn)再提交幾何優(yōu)化這能省掉大量反復(fù)試錯(cuò)的時(shí)間。3. 從源碼到可執(zhí)行文件CMake配置、編譯命令與依賴清單3.1 編譯前環(huán)境檢查CASTEP 19.11是Fortran程序并行版本依賴MPI數(shù)學(xué)庫依賴BLAS/LAPACK或Intel MKL。常見的組合有兩套Intel oneAPI環(huán)境下的ifort加MKL加Intel MPI性能最好編譯最順gfortran加OpenBLAS加OpenMPI純開源免費(fèi)好裝性能略低。對(duì)大多數(shù)計(jì)算任務(wù)來說這兩套的差距在10%以內(nèi)沒必要為了幾個(gè)百分點(diǎn)的性能去折騰閉源工具鏈。真正影響選擇的是你工作站上已有的CUDA、Python等環(huán)境避免多套編譯器混用導(dǎo)致庫沖突。拿到源碼包后先別急著建build目錄把環(huán)境檢查一遍。需要確認(rèn)三件事編譯器能正常調(diào)用MPI的mpirun能找到CMake版本不低于3.12。CASTEP 19.11整個(gè)構(gòu)建流程已經(jīng)切到CMake老教程里那個(gè)configure腳本早就沒了照著舊帖子的步驟做只會(huì)卡在第一句。敲下面三條命令輸出正常再往下走ifort --version mpirun --version cmake --version邏輯說明第一條確認(rèn)Fortran主編譯器第二條確認(rèn)MPI運(yùn)行時(shí)第三條確認(rèn)構(gòu)建系統(tǒng)版本。參數(shù)說明如果你的機(jī)器上裝的是gfortran第一條換成gfortran --version即可如果有多個(gè)MPI版本用which mpirun確認(rèn)當(dāng)前生效的是哪個(gè)避免CMAKE撿到一套、運(yùn)行時(shí)又去調(diào)另一套。3.2 用Intel oneAPI編譯的完整命令I(lǐng)ntel工具鏈安裝好之后記得先source一下環(huán)境變量否則終端里找不到ifort和mkl。以當(dāng)前最常見的oneAPI安裝位置為例先加載環(huán)境再開始構(gòu)建source /opt/intel/oneapi/setvars.sh cd CASTEP-19.11 mkdir build cd build cmake -DCMAKE_Fortran_COMPILERifort \ -DCMAKE_C_COMPILERicx \ -DCMAKE_Fortran_FLAGS-O2 \ -DCASTEP_BUILD_TYPErelease \ .. make -j8 castep.mpi邏輯說明source那一步把Intel編譯器和MKL庫的路徑注入PATH與LD_LIBRARY_PATHmkdir和cd把構(gòu)建產(chǎn)物與源碼分開保持源碼目錄干凈cmake根據(jù)你指定的編譯器生成Makefilemake只構(gòu)建castep.mpi這個(gè)并行可執(zhí)行文件避免把文檔、工具等無關(guān)目標(biāo)也編譯一遍。參數(shù)說明-DCMAKE_Fortran_COMPILER指定Fortran編譯器CASTEP的核心代碼全是Fortran這個(gè)選項(xiàng)直接決定能不能過編譯-DCASTEP_BUILD_TYPErelease控制優(yōu)化等級(jí)release模式會(huì)加上自動(dòng)向量化等優(yōu)化debug模式一般只在排查段錯(cuò)誤時(shí)用-j8對(duì)應(yīng)你的CPU物理核數(shù)核數(shù)多的機(jī)器可以加大并發(fā)。這里有個(gè)容易被忽略的細(xì)節(jié)C編譯器選項(xiàng)也要給因?yàn)椴糠忠蕾噹焓荂寫的。很多人在這一步翻車只指定了Fortran編譯器CMake的默認(rèn)C編譯器是gcc結(jié)果MKL的接口庫和gcc編譯的C代碼在鏈接階段報(bào)一堆未定義符號(hào)。解決方式就是我上面寫的把C編譯器也指向Intel的icx與MKL保持同源。3.3 用gfortran與OpenBLAS的備選路線沒有Intel工具鏈時(shí)gfortran路線更省心。Ubuntu系系統(tǒng)上OpenBLAS和OpenMPI都可以用包管理器直接裝。構(gòu)建命令稍有不同關(guān)鍵是讓CMake找到BLAS和LAPACK的實(shí)現(xiàn)sudo apt install gfortran libopenblas-dev libopenmpi-dev cmake cd CASTEP-19.11 mkdir build cd build cmake -DCMAKE_Fortran_COMPILERgfortran \ -DCMAKE_C_COMPILERgcc \ -DCMAKE_Fortran_FLAGS-O2 \ -DCASTEP_BUILD_TYPErelease \ -DBLAS_LIBRARIES/usr/lib/x86_64-linux-gnu/libopenblas.so \ -DLAPACK_LIBRARIES/usr/lib/x86_64-linux-gnu/libopenblas.so \ .. make -j8 castep.mpi邏輯說明apt那行把Fortran編譯器、OpenBLAS數(shù)學(xué)庫和OpenMPI并行庫一次裝齊后面cmake的選項(xiàng)里BLAS和LAPACK都指向OpenBLAS的共享庫因?yàn)镺penBLAS同時(shí)實(shí)現(xiàn)了兩套接口不需要再單獨(dú)裝LAPACK。參數(shù)說明如果系統(tǒng)里OpenBLAS的路徑不在上述位置用find /usr -name libopenblas.so查一下再把路徑換掉。這條路線最常出現(xiàn)的問題不是編譯而是運(yùn)行時(shí)OpenMPI找不到宿主。原因是OpenMPI默認(rèn)通過ssh啟動(dòng)遠(yuǎn)程進(jìn)程而工作站上往往沒配好ssh免密登錄。解決辦法是把mpirun加上--allow-run-as-root或者把mpirun換成本地模式比如mpirun -np 4 --allow-run-as-root ./bin/castep.mpi這個(gè)參數(shù)說明-np指定進(jìn)程數(shù)--allow-run-as-root允許以root身份運(yùn)行。真實(shí)集群上不需要這個(gè)選項(xiàng)但在本地容器環(huán)境里幾乎是必修課。3.4 驗(yàn)證編譯產(chǎn)物版本號(hào)與最小測試編譯完成后先看版本號(hào)再跑一個(gè)最小任務(wù)。版本號(hào)能驗(yàn)證鏈接是否完整最小任務(wù)則驗(yàn)證數(shù)值結(jié)果沒有被編譯器優(yōu)化破壞。命令很簡單./bin/castep.mpi --version正常情況下會(huì)輸出CASTEP的版本號(hào)和編譯選項(xiàng)比如MPI支持、MKL版本、內(nèi)置贗勢庫的生成日期。如果這一步輸出了段錯(cuò)誤或非法指令通常是編譯優(yōu)化選項(xiàng)與CPU指令集不匹配把CMAKE_Fortran_FLAGS里的-O2改成-O1再重編。如果--version正常但跑任務(wù)時(shí)結(jié)果明顯異常先懷疑是不是不同編譯器混用導(dǎo)致運(yùn)行時(shí)庫沖突用ldd檢查一下可執(zhí)行文件鏈接的庫ldd ./bin/castep.mpi | grep -E mkl|mpi|blas邏輯說明ldd列出可執(zhí)行文件運(yùn)行時(shí)依賴的共享庫過濾出數(shù)學(xué)庫與MPI庫確認(rèn)它們都指向同一個(gè)工具鏈。參數(shù)說明這里沒有任何需要改的參數(shù)純粹是診斷手段。我在一臺(tái)工作站上遇到過ifort編譯成功、運(yùn)行時(shí)卻去調(diào)了系統(tǒng)自帶的libgfortran導(dǎo)致輸入輸出文件里全是亂碼的情況就是靠這條命令定位的。4. 跑第一個(gè)計(jì)算任務(wù)cell與param輸入文件詳解4.1 cell文件結(jié)構(gòu)、贗勢與k點(diǎn)網(wǎng)格CASTEP每個(gè)計(jì)算任務(wù)需要兩個(gè)輸入文件分別以.cell和.param為后綴。cell文件描述物理體系晶格、原子位置、贗勢聲明、k點(diǎn)網(wǎng)格與對(duì)稱性param文件描述計(jì)算任務(wù)要算什么、用哪種泛函、收斂到什么程度。兩者職責(zé)清晰分開維護(hù)比寫進(jìn)一個(gè)文件更靈活。一個(gè)硅原胞的cell文件長這樣%BLOCK LATTICE_CART 2.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 %ENDBLOCK LATTICE_CART %BLOCK POSITIONS_FRAC Si 0.00 0.00 0.00 Si 0.25 0.25 0.25 %ENDBLOCK POSITIONS_FRAC %BLOCK SPECIES_POT Si: PBE %ENDBLOCK SPECIES_POT KPOINT_MP_GRID 4 4 4 KPOINT_MP_OFFSET 0.0 0.0 0.0 SYMMETRY_GENERATE邏輯說明LATTICE_CART用笛卡爾坐標(biāo)給出晶格矢量這里的2.0是晶格常數(shù)的數(shù)值占位實(shí)際使用要換成你材料的晶格參數(shù)POSITIONS_FRAC給出原子分?jǐn)?shù)坐標(biāo)硅是金剛石結(jié)構(gòu)兩個(gè)原子分別坐在(0,0,0)和(1/4,1/4,1/4)SPECIES_POT聲明贗勢Si: PBE表示用PBE泛函對(duì)應(yīng)的OTFG超軟贗勢KPOINT_MP_GRID定義Monkhorst-Pack網(wǎng)格為4×4×4SYMMETRY_GENERATE讓程序自動(dòng)分析空間群。參數(shù)說明分?jǐn)?shù)坐標(biāo)必須與晶格矢量匹配單位是晶格矢量的倍數(shù)不是埃k點(diǎn)偏移量一般取0但如果計(jì)算帶隙或能帶有時(shí)需要人為微調(diào)offset打破對(duì)稱性。贗勢是這里面最不能抄錯(cuò)的部分。元素的化學(xué)符號(hào)必須與周期表一致大小寫敏感Si和si是不同的字符串。泛函標(biāo)識(shí)要與param文件里的xc_functional一致用的PBE就都寫PBE用的RPBE就都寫RPBE混寫的結(jié)果是程序直接在贗勢生成階段退出連SCF都進(jìn)不去。4.2 param文件任務(wù)類型與收斂控制param文件決定計(jì)算任務(wù)的行為。同樣是上面那個(gè)硅原胞可以做單點(diǎn)能、幾何優(yōu)化、能帶計(jì)算區(qū)別全在param里。一個(gè)幾何優(yōu)化任務(wù)的典型param文件TASK : GEOMETRY OPTIMISATION XC_FUNCTIONAL : PBE CUT_OFF_ENERGY : 400 eV FINE_GRID_SCALE : 4.0 OPT_STRATEGY : SPEED OPT_ENERGY_CONVERGENCE : 1.0e-6 OPT_FORCE_CONVERGENCE : 0.01 OPT_STRESS_CONVERGENCE : 0.02 SMEARING_SCHEME : GAUSSIAN SMEARING_WIDTH : 0.1 eV MAX_SCF_CYCLES : 100邏輯說明TASK指定任務(wù)類型幾何優(yōu)化對(duì)應(yīng)GEOMETRY OPTIMISATIONXC_FUNCTIONAL選定交換關(guān)聯(lián)泛函必須與cell里贗勢字符串的泛函一致CUT_OFF_ENERGY設(shè)400 eV對(duì)硅的OTFG贗勢來說已經(jīng)接近收斂FINE_GRID_SCALE控制電荷密度網(wǎng)格的倍率4.0是常見默認(rèn)OPT_STRATEGY選擇SPEED讓BFGS算法的步長試探更激進(jìn)三個(gè)OPT收斂參數(shù)分別對(duì)應(yīng)能量、力與應(yīng)力的閾值SMEARING_SCHEME和SMEARING_WIDTH是給金屬體系準(zhǔn)備的硅是半導(dǎo)體這里不設(shè)也能算但設(shè)了可以避免費(fèi)米面附近的迭代震蕩MAX_SCF_CYCLES是單次SCF的最大電子步數(shù)。參數(shù)說明CUT_OFF_ENERGY的單位是eV這個(gè)值不是越大越好超過系統(tǒng)收斂值之后純粹浪費(fèi)機(jī)時(shí)SMEARING_WIDTH對(duì)半導(dǎo)體的影響可能比想象中大太大會(huì)人為展寬帶邊算帶隙時(shí)要格外小心。關(guān)于OPT_STRATEGY這里有個(gè)容易踩的認(rèn)知偏差。SPEED和ACCURACY并不影響物理精度只影響B(tài)FGS步長試探策略的激進(jìn)程度。SPEED會(huì)在結(jié)構(gòu)遠(yuǎn)離極小點(diǎn)時(shí)走大步收斂快但偶爾震蕩ACCURACY步長保守適合初始結(jié)構(gòu)很差、原子坐標(biāo)明顯不合理的體系。我自己習(xí)慣先用SPEED粗篩再讀結(jié)果看對(duì)稱性有沒有被破壞。4.3 從結(jié)構(gòu)優(yōu)化到能帶計(jì)算多一步固定框架幾何優(yōu)化拿到最低能量結(jié)構(gòu)后算能帶是下一步最常見需求。能帶計(jì)算的param文件與優(yōu)化相比變化主要在任務(wù)類型和少量參數(shù)上。保持cell文件不變param改成TASK : BAND STRUCTURE XC_FUNCTIONAL : PBE CUT_OFF_ENERGY : 400 eV FINE_GRID_SCALE : 4.0 SMEARING_SCHEME : GAUSSIAN SMEARING_WIDTH : 0.1 eV BS_WRITE_EIGENVALUES : true BS_NBANDS : 20 BS_MAX_PATH_NODES : 30 BS_SELECTED_PATH : G X W K L U W L K關(guān)鍵差異在三個(gè)BS參數(shù)BS_NBANDS確定要輸出的能帶數(shù)數(shù)值太小會(huì)把高能導(dǎo)帶截?cái)嗟鬊S_MAX_PATH_NODES控制高對(duì)稱點(diǎn)之間的插值密度BS_SELECTED_PATH是把布里淵區(qū)高對(duì)稱點(diǎn)串成路徑。路徑的寫法有講究硅的常規(guī)路徑是G-X-W-K-L-U-W-L-K你需要確認(rèn)這些高對(duì)稱點(diǎn)在當(dāng)前晶格類型下確實(shí)存在程序輸出文件會(huì)列出自動(dòng)識(shí)別的對(duì)稱點(diǎn)與坐標(biāo)。BS_WRITE_EIGENVALUES打開后程序會(huì)把每條能帶的本征值寫到.bands文件供后處理腳本讀取。能帶計(jì)算通常在優(yōu)化后的結(jié)構(gòu)上進(jìn)行。不要跳過TASK : GEOMETRY OPTIMISATION直接用原始實(shí)驗(yàn)結(jié)構(gòu)算能帶實(shí)驗(yàn)晶格常數(shù)與理論優(yōu)化的晶格常數(shù)之間有零點(diǎn)幾個(gè)百分點(diǎn)的偏差對(duì)帶隙的影響在0.1到0.2 eV量級(jí)對(duì)某些窄帶隙材料甚至?xí)?dǎo)致定性錯(cuò)誤。我一般按這個(gè)流程走先幾何優(yōu)化再在優(yōu)化結(jié)構(gòu)上做一次與cell文件完全相同的單點(diǎn)能最后把單點(diǎn)能任務(wù)改成能帶計(jì)算提交。三次任務(wù)前后銜接結(jié)構(gòu)一模一樣只是算的東西從構(gòu)型松弛變成了電子結(jié)構(gòu)。輸出文件方面主輸出文件是.castep后綴的文本包含SCF各步的能量、原子力、壓力張量以及最終收斂信息。.bands文件是純文本的能帶數(shù)據(jù)每行對(duì)應(yīng)一個(gè)k點(diǎn)和一條能帶的本征值。你要是只關(guān)心帶隙直接在.castep文件里搜band gap即可程序會(huì)打印出價(jià)帶頂與導(dǎo)帶底的本征值插值結(jié)果。要注意的是CASTEP報(bào)告的帶隙是理論帶隙與實(shí)驗(yàn)光學(xué)帶隙有系統(tǒng)偏差PBE泛函通常低估0.3到0.5 eV這在解釋結(jié)果時(shí)要寫進(jìn)文章里。5. 避坑與常見問題編譯失敗與計(jì)算翻車的五條踩坑記錄5.1 編譯時(shí)MKL鏈接失敗報(bào)錯(cuò)編號(hào)#10106現(xiàn)象cmake配置通過make時(shí)輸出大量形如ifort: error #10106的錯(cuò)誤提示找不到MKL頭文件或庫文件。解決路徑翻config日志發(fā)現(xiàn)CMAKE在找MKL時(shí)選到了錯(cuò)誤的庫路徑把vml、pthread之類的系統(tǒng)庫混了進(jìn)來。原因Intel編譯器環(huán)境沒有正確加載或者setvars.sh腳本和構(gòu)建進(jìn)程不在同一個(gè)shell會(huì)話中。我見過有人把source寫進(jìn)腳本但腳本以bash方式執(zhí)行環(huán)境變量進(jìn)不了當(dāng)前終端也見過在容器里編譯宿主機(jī)與容器里的oneAPI路徑不一致。解決編譯前在同一個(gè)終端里手工執(zhí)行source并做一次驗(yàn)證source /opt/intel/oneapi/setvars.sh echo $MKLROOT邏輯說明第一行加載oneAPI所有組件路徑第二行確認(rèn)MKL的環(huán)境變量已經(jīng)注入。參數(shù)說明如果echo輸出為空說明setvars.sh沒生效換用絕對(duì)路徑source。之后重新刪除build目錄再走一遍cmake讓CMake緩存里失效的MKL路徑全部刷新不要在舊build目錄里憋著。5.2 結(jié)構(gòu)優(yōu)化能量震蕩不收斂現(xiàn)象幾何優(yōu)化任務(wù)跑到第20步左右能量不再單調(diào)下降開始在某個(gè)值附近上下波動(dòng)原子力始終達(dá)不到設(shè)定閾值。日志里能看到SCF每步都收斂但外層離子步像踩了彈簧。原因最常見的情況是初始結(jié)構(gòu)與真實(shí)極值點(diǎn)相差太遠(yuǎn)BFGS的Hessian初始近似與實(shí)際差太多導(dǎo)致步長過大。另一個(gè)高頻原因是固定體積優(yōu)化task里加上strain控制時(shí)應(yīng)力張量存在符號(hào)錯(cuò)誤程序在能量面上來回跳。解決先跑一次task: single point energy確認(rèn)當(dāng)前結(jié)構(gòu)的能量在合理范圍內(nèi)再用opt_strategy: accuracy重跑。如果還震蕩把結(jié)構(gòu)用分子動(dòng)力學(xué)粗篩一遍再優(yōu)化或者手動(dòng)檢查原子間距離排除過度接近造成的排斥。這個(gè)問題的本質(zhì)是優(yōu)化算法對(duì)初始點(diǎn)的敏感性不是參數(shù)或程序的缺陷。5.3 并行核心數(shù)增加速度反而下降現(xiàn)象同一任務(wù)4核跑3小時(shí)改成16核后變成5小時(shí)好像同步檢查點(diǎn)等網(wǎng)絡(luò)開銷比計(jì)算本身還慢。在.castep文件里還會(huì)看到每個(gè)SCF步的輸出時(shí)間戳間隔不規(guī)律。原因小體系下k點(diǎn)數(shù)量少并行切分到不同進(jìn)程后每個(gè)進(jìn)程承擔(dān)的k點(diǎn)太少通信開銷蓋過了計(jì)算收益。程序作業(yè)規(guī)模小時(shí)并行效率天然上不去。解決先用單核跑一遍日志確認(rèn)SCF耗時(shí)再用mpirun -np 4、-np 8、-np 16各跑一遍記錄總耗時(shí)找出拐點(diǎn)。經(jīng)驗(yàn)法則是每個(gè)進(jìn)程至少分配到4到8個(gè)k點(diǎn)否則并行就是懲罰。我一般先看.kpoints輸出里實(shí)際生成的k點(diǎn)總數(shù)再反推合適的進(jìn)程數(shù)。5.4 贗勢報(bào)錯(cuò)Unidentified species現(xiàn)象提交任務(wù)后程序在初始階段退出錯(cuò)誤信息里出現(xiàn)Unidentified species或Could not generate pseudopotential字樣有時(shí)還會(huì)附上元素名。原因cell文件species_pot塊里寫的字符串與內(nèi)置贗勢庫不匹配。常見的情況是元素符號(hào)大小寫錯(cuò)了或者泛函標(biāo)識(shí)拼寫不對(duì)比如把PBE寫成了pbe、把RPBE寫成了PBEsol。解決打開cell文件核對(duì)species_pot塊的寫法元素符號(hào)首字母大寫、第二個(gè)字母小寫泛函名稱與param文件里的xc_functional一致。如果確認(rèn)無誤用castep.mpi --help或程序自帶工具列出內(nèi)置贗勢庫支持的元素與泛函組合對(duì)照著改。這個(gè)報(bào)錯(cuò)的好處是它足夠早不會(huì)浪費(fèi)SCF的機(jī)時(shí)。5.5 能帶路徑錯(cuò)亂畫出來的帶結(jié)構(gòu)斷斷續(xù)續(xù)現(xiàn)象能帶計(jì)算正常結(jié)束但后處理畫圖時(shí)高對(duì)稱點(diǎn)之間的連線錯(cuò)亂出現(xiàn)交叉的斜線或斷裂的譜線k點(diǎn)間距明顯不均勻。原因BS_SELECTED_PATH里的高對(duì)稱點(diǎn)順序與程序自動(dòng)識(shí)別的對(duì)稱性不一致或者symmetry_generate生成的群操作改變了布里淵區(qū)路徑的定義。另一種常見情況是cell文件的晶格矢量定義與symmetry分析模塊默認(rèn)的約定不匹配導(dǎo)致高對(duì)稱點(diǎn)坐標(biāo)錯(cuò)位。解決先把BS_SELECTED_PATH參數(shù)注釋掉讓程序按默認(rèn)路徑生成一次再對(duì)照.castep輸出文件里列出的高對(duì)稱點(diǎn)名稱手動(dòng)修正路徑。注意有些空間群的高對(duì)稱點(diǎn)有多個(gè)等價(jià)表示路徑里必須用程序輸出的那套符號(hào)。從那以后我每次做能帶都先跑一次默認(rèn)路徑確認(rèn)對(duì)稱點(diǎn)名稱無誤再改成自定義路徑。6. 進(jìn)階習(xí)慣用腳本做贗勢收斂測試與并行效率驗(yàn)證對(duì)任何一個(gè)新接觸的體系我不會(huì)直接拿默認(rèn)參數(shù)跑正事而是先做一組短計(jì)算把截?cái)嗄芎蚹點(diǎn)網(wǎng)格的收斂性摸清楚。這個(gè)習(xí)慣幫我避開了很多后期返工的麻煩。下面這個(gè)腳本循環(huán)跑不同Ecut的單點(diǎn)能把所有能量匯總到一個(gè)文件里for ecut in 300 350 400 450 500 550 600; do sed s/CUT_OFF_ENERGY : 400 eV/CUT_OFF_ENERGY : ${ecut} eV/ base.param run.param mpirun -np 8 ./bin/castep.mpi si.cell /dev/null 21 grep Final energy si.castep | tail -1 ecut_sweep.txt echo Ecut ${ecut} done ecut_sweep.txt done邏輯說明sed把模板param文件里的截?cái)嗄茏侄翁鎿Q成當(dāng)前循環(huán)值每次計(jì)算都覆蓋寫入同一個(gè)castep文件因此每個(gè)Ecut的最終能量用tail取最后一行主任務(wù)的stdout丟到/dev/null只看程序退出狀態(tài)。參數(shù)說明Ecut的采樣點(diǎn)要先粗后細(xì)300到600 eV間隔50 eV已經(jīng)能看出收斂趨勢如果600 eV與550 eV的能量差還在5 meV以上繼續(xù)加大上限重跑一輪。判斷收斂的標(biāo)準(zhǔn)是能量變化進(jìn)入你想要的精度范圍通常1到2 meV/atom就足夠做結(jié)構(gòu)分析了。k點(diǎn)網(wǎng)格的收斂測試同理把KPOINT_MP_GRID從2改到3、4、5、6對(duì)比總能變化。兩個(gè)維度都測完正式任務(wù)的Ecut和k點(diǎn)網(wǎng)格就定下來了后續(xù)所有計(jì)算都用同一套基準(zhǔn)結(jié)果之間才有可比性。并行效率驗(yàn)證則更直接同一個(gè)結(jié)構(gòu)分別用2、4、8、16核跑同一個(gè)單點(diǎn)能記錄每輪的總耗時(shí)。你會(huì)發(fā)現(xiàn)小體系4核以后提速幾乎為零大體系16核還能繼續(xù)吃。這兩組測試加在一起就是我接手一個(gè)陌生體系時(shí)的固定開場動(dòng)作。這里還得提一個(gè)細(xì)節(jié)就是從.castep文件里提取能量時(shí)用grep Final energy會(huì)把帶隙信息也帶出來因?yàn)閹赌且恍幸埠琫nergy字樣。我一般用grep Total energy corrected來鎖定最終總能的輸出行這行對(duì)應(yīng)經(jīng)過基組修正后的能量做收斂曲線更平滑。從那以后我每次拿到一個(gè)新材料體系都強(qiáng)制走一遍Ecut與k點(diǎn)的雙掃描把結(jié)果貼進(jìn)實(shí)驗(yàn)記錄本再開始正式計(jì)算。這個(gè)習(xí)慣幫我擋掉了至少三次因?yàn)閰?shù)未收斂得出的錯(cuò)誤結(jié)論。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取