構(gòu)優(yōu)化入門:輸入文件、Linux命令與報(bào)錯排查)
帶過幾屆新人之后我發(fā)現(xiàn) VASP 入門卡人的地方往往不是密度泛函理論本身而是四個輸入文件的格式、一堆英文報(bào)錯以及 Linux 命令行帶來的那種無處下手的陌生感。很多人理論課聽得頭頭是道真讓他把結(jié)構(gòu)優(yōu)化跑起來光是 POSCAR 該寫 Direct 還是 Cartesian 就能折騰一下午。這篇東西就是寫給這類人的對 VASP 和 Linux 都還處在入門階段想先把一套能跑通、能復(fù)現(xiàn)、能看懂結(jié)果的最小流程走下來。我會以一個完整的簡單結(jié)構(gòu)優(yōu)化為例把建模、寫輸入、提交作業(yè)、監(jiān)控收斂、判讀結(jié)果這條鏈路走一遍同時把過程中真正會用到的 Linux 命令單獨(dú)拎出來講清楚??赐曛竽銘?yīng)該能做到兩件事知道每個參數(shù)為什么這么選以及能把同樣的流程套到自己手上的體系上。1. 先把VASP在算什么搞清楚別急著敲命令1.1 結(jié)構(gòu)優(yōu)化本質(zhì)上是在找最舒服的姿勢你可以把一個晶體或分子想象成一堆小球原子核之間連著彈簧電子云帶來的相互作用。小球擺放的位置不同整個系統(tǒng)的總能量就不同這個位置—能量的對應(yīng)關(guān)系就是勢能面。結(jié)構(gòu)優(yōu)化干的事情就是在這張高低起伏的地形圖上找一個局部最低點(diǎn)能量對每一個原子坐標(biāo)的導(dǎo)數(shù)也就是受力都接近零系統(tǒng)就站住了。難點(diǎn)在于這張地形圖沒法解析地寫出來只能用密度泛函理論在每一個給定構(gòu)型下數(shù)值求解電子的基態(tài)得到總能量和每個原子上的力。VASP 做的就是這件事給定結(jié)構(gòu)算出能量和力然后優(yōu)化器根據(jù)這些力把原子往低處挪一點(diǎn)再算一次反復(fù)迭代。所以一次結(jié)構(gòu)優(yōu)化不是一個計(jì)算而是幾十上百次自洽計(jì)算的串聯(lián)。理解這一點(diǎn)很關(guān)鍵它解釋了后面很多現(xiàn)象為什么優(yōu)化比單點(diǎn)慢一個數(shù)量級為什么初始結(jié)構(gòu)太離譜會直接崩掉為什么收斂判據(jù)設(shè)置得過嚴(yán)會讓任務(wù)永遠(yuǎn)跑不完。另一個必須建立的直覺是局部最低點(diǎn)不等于全局最低點(diǎn)。你給一個初始構(gòu)型VASP 只會帶你滑到離它最近的那個坑里。所以做摻雜、做缺陷、做表面吸附的時候初始構(gòu)型怎么擺這件事對最終結(jié)果的物理意義影響極大這在后面第 4 節(jié)會具體講。1.2 VASP能算什么、不能算什么VASP 是基于平面波基組和贗勢主要是 PAW 方法的周期性體系計(jì)算程序。它天然適合的場合是三維周期性晶體、二維材料加真空層、一維納米管、以及加了足夠真空層之后的分子和團(tuán)簇。典型能力包括幾何結(jié)構(gòu)弛豫、靜態(tài)總能、電子態(tài)密度、能帶結(jié)構(gòu)、電荷密度分析、過渡態(tài)搜索NEB 方法、從頭算分子動力學(xué)、以及通過有限位移法計(jì)算聲子譜。它不擅長的東西也要心里有數(shù)。強(qiáng)關(guān)聯(lián)體系比如部分過渡金屬氧化物、稀土化合物用普通 DFT 會給出明顯偏差需要加 Hubbard U 或者換雜化泛函代價陡增。大體系的長時間動力學(xué)、以及真正意義上的電子激發(fā)態(tài)需要 GW 或 BSE 那一套對入門階段來說不是該碰的方向。范德華作用主導(dǎo)的體系層狀材料、分子晶體默認(rèn)泛函描述很差必須選帶色散校正的版本比如 PBE-D3 或 optB86b-vdW 這類贗勢和 INCAR 都要相應(yīng)調(diào)整。入門階段建議把范圍收窄只做周期性晶體或加真空層的二維材料先用 PBE 泛函把完整流程跑通再考慮往泛函和方法的深處走。1.3 三個最容易走偏的念頭第一個念頭是參數(shù)越貴越靠譜。有人一上來就把 ENCUT 設(shè)到 800、k 點(diǎn)鋪到 12×12×12結(jié)果一個簡單的硅晶胞優(yōu)化跑了兩天還沒收斂。參數(shù)和精度之間確實(shí)是正相關(guān)但存在收益遞減的拐點(diǎn)過了拐點(diǎn)只是白燒機(jī)時。第 3 節(jié)會給出一個可操作的收斂測試方法。第二個念頭是不查文獻(xiàn)直接開跑。哪怕是做最常見的二氧化鈦銳鈦礦也有一堆現(xiàn)成的、被同行驗(yàn)證過的參數(shù)組合。把別人論文里的計(jì)算細(xì)節(jié)部分抄下來做起點(diǎn)比你自己從零摸索快得多也更不容易出系統(tǒng)性錯誤。真正需要自己判斷的是你這個具體體系的特殊之處。第三個念頭是把 Linux 當(dāng)成 Windows 用。Linux 下的工作方式是用命令行組織文件、用腳本批量提交、用文本文件記錄一切。如果你一直想著找圖形界面點(diǎn)鼠標(biāo)會處處別扭。反過來一旦適應(yīng)了這套邏輯你會發(fā)現(xiàn)批量處理幾十個計(jì)算任務(wù)反而比點(diǎn)鼠標(biāo)輕松得多。下一節(jié)就把這套邏輯拆開講。2. Linux不是攔路虎把常用操作壓成一張清單2.1 目錄、文件與編輯日常點(diǎn)得最多的十來?xiàng)l命令先說清楚 Linux 文件系統(tǒng)的組織結(jié)構(gòu)。它是一棵以/為根的倒立樹沒有 Windows 那樣的盤符概念。你的個人目錄一般叫/home/你的用戶名登錄之后默認(rèn)就在這兒命令行提示符里的~就是它的簡寫。VASP 的計(jì)算目錄建議單獨(dú)建在工作區(qū)比如/home/你的用戶名/vasp/job001一個任務(wù)一個目錄互不干擾。下面這張表是我給新人整理的起步清單覆蓋日常九成以上的操作。目的命令寫法說明看當(dāng)前在哪pwd迷路時先敲這個列出文件ls -lh-h讓文件大小變成人類可讀的 M/G進(jìn)目錄cd vasp/job001支持 Tab 鍵自動補(bǔ)全多用返回上一級cd ..兩個點(diǎn)代表父目錄回上一次的目錄cd -在兩個目錄間來回切很省事建目錄mkdir -p vasp/job001-p一次性建多層不報(bào)錯復(fù)制cp POSCAR POSCAR.bak目錄要加-r改名或移動mv CONTCAR POSCAR覆蓋前先備份刪除rm POSCAR.bakrm -rf極度危險(xiǎn)刪之前先ls確認(rèn)看文件內(nèi)容less OUTCAR空格翻頁q退出/關(guān)鍵詞搜索看開頭幾行head -n 20 KPOINTS檢查文件有沒有寫壞看結(jié)尾幾行tail -n 30 OUTCAR看任務(wù)有沒有正常結(jié)束實(shí)時跟蹤tail -f OSZICAR邊跑邊看CtrlC只退出查看不殺程序搜索內(nèi)容grep reached required accuracy OUTCAR判斷是否收斂的常用手段數(shù)行數(shù)wc -l POSCAR快速核對坐標(biāo)行數(shù)對不對編輯文件這一步是新人最容易慌的地方。我的建議是先用nano上手nano INCAR打開直接打字編輯CtrlO保存、回車確認(rèn)CtrlX退出沒有模式概念不會卡在奇怪的狀態(tài)里。等你順手了再換vim。vim的坑在于它默認(rèn)處于普通模式你打字會觸發(fā)各種快捷鍵得先按i進(jìn)入插入模式才能輸入寫完按Esc回到普通模式輸入:wq保存退出:q!不保存強(qiáng)退。dd刪整行g(shù)g跳到文件頭G跳到文件尾/文字向下搜索。有一條習(xí)慣請務(wù)必養(yǎng)成改任何輸入文件之前先cp INCAR INCAR.bak。VASP 計(jì)算動輒幾小時到幾天因?yàn)楦腻e一個文件白跑一夜的滋味不好受。2.2 作業(yè)運(yùn)行時真正用得上的狀態(tài)查看計(jì)算提交出去以后你需要知道它是在正常推進(jìn)、卡住了、還是已經(jīng)死了。這里有幾個層次的工具。最直接的是看輸出文件的增長。ls -lh觀察 OUTCAR 的大小正常情況下它應(yīng)該每隔一段時間變大如果十分鐘都沒動多半是出問題了。tail -f OSZICAR會實(shí)時刷出每一步的迭代信息你會看到一列行每行以DAV:或RMM:開頭后面是電子步的迭代次數(shù)再后面是E能量。能量平穩(wěn)下降說明自洽在正常收斂能量上下抖動很大或者反復(fù)震蕩說明參數(shù)有問題。進(jìn)程層面top或htop可以看 CPU 占用。如果 VASP 在跑你會看到若干vasp_std或vasp_gam進(jìn)程占著接近 100% 的 CPU。ps aux | grep vasp打印出所有相關(guān)進(jìn)程和它們的進(jìn)程號PID。確認(rèn)某個任務(wù)確實(shí)死了用kill -9 PID強(qiáng)殺先殺最前面的那個主進(jìn)程。集群環(huán)境通常還有隊(duì)列系統(tǒng)squeue看排隊(duì)與運(yùn)行狀態(tài)scancel 任務(wù)號取消任務(wù)qstat是另一套系統(tǒng)的對應(yīng)命令。磁盤空間也是要盯的。VASP 默認(rèn)會寫 CHGCAR 和 WAVECAR后者動輒幾十上百 GB。du -sh *看當(dāng)前目錄各文件大小的匯總df -h看整個分區(qū)還剩多少。作業(yè)目錄寫滿會導(dǎo)致計(jì)算中途失敗而且報(bào)錯信息往往不明顯。一個實(shí)用技巧在 INCAR 里設(shè)置LWAVE .FALSE.和LCHARG .FALSE.除非你確實(shí)需要波函數(shù)和電荷密度做后續(xù)分析否則能省下大量磁盤空間。2.3 文件傳輸、解壓與環(huán)境配置本地建模、服務(wù)器計(jì)算、結(jié)果取回這條鏈路里文件傳輸是剛需。scp是最基本的工具從本地傳到服務(wù)器是scp POSCAR 用戶名服務(wù)器地址:/home/用戶名/vasp/job001/從服務(wù)器拉回來則是把兩個路徑調(diào)換位置。rsync -avP 源目錄 目標(biāo)目錄更適合大批量文件它支持?jǐn)帱c(diǎn)續(xù)傳-P還能顯示進(jìn)度條傳幾百 MB 的 OUTCAR 時體驗(yàn)好很多。壓縮包處理也是高頻操作。tar -czvf 打包名.tar.gz 目錄名打成 gzip 壓縮包tar -xzvf 包名.tar.gz解開。unzip 包名.zip解 zip 文件如果解開的中文文件名變成亂碼加編碼參數(shù)unzip -O CP936 包名.zip通常能解決已經(jīng)解錯的文件可以用convmv -f GBK -t UTF-8 -r --notest 目錄名批量轉(zhuǎn)換文件名編碼。核心原因就是壓縮包的編碼和系統(tǒng)默認(rèn)編碼不一致理解這一點(diǎn)比死記命令有用。環(huán)境變量這塊新手最需要搞明白的是PATH。你在命令行敲vasp_std之所以能直接運(yùn)行是因?yàn)樗诘哪夸洷患舆M(jìn)了PATH。查看用echo $PATH臨時添加用export PATH$PATH:/你的/vasp/bin但這種方式關(guān)掉終端就失效。要永久生效就寫進(jìn)~/.bashrc然后source ~/.bashrc讓它立即生效。如果你用的是集群通常還有模塊系統(tǒng)module avail列出可用軟件module load vasp/6.4.0加載指定版本這是最干凈的做法不用自己維護(hù) PATH。順帶說一句發(fā)行版選擇。新手做計(jì)算建議直接用 Ubuntu 或 Rocky Linux 這類生態(tài)成熟、社區(qū)資料多的系統(tǒng)出問題好搜。國產(chǎn)發(fā)行版如 openEuler 在服務(wù)器場景也常見基礎(chǔ)命令完全一致上手沒有額外門檻。至于那些偏安全測試方向的發(fā)行版雖然也能裝編譯器跑計(jì)算但默認(rèn)配置和軟件源與計(jì)算場景差異較大入門階段沒必要給自己加難度。3. 四個輸入文件逐個拆開POSCAR、KPOINTS、INCAR、POTCAR3.1 POSCAR結(jié)構(gòu)文件的書寫規(guī)則與坑POSCAR 描述算什么結(jié)構(gòu)是整個計(jì)算的骨架。它的格式分幾大塊我按順序說。第一行是注釋行隨便寫什么都行通常寫體系名比如TiO2 anatase。第二行是統(tǒng)一的縮放因子一般是晶格常數(shù)的數(shù)值后面三行晶格矢量會自動乘上它。這個設(shè)計(jì)的好處是你換縮放因子就能整體縮放晶胞但坑也在這里如果你的晶格矢量本身就已經(jīng)是埃為單位的實(shí)際數(shù)值縮放因子就寫1.0千萬別再乘一遍。接下來三行是三個晶格矢量按 a、b、c 順序各一行每行三個數(shù)。然后是元素符號行這一行是 VASP 5 之后新增的按順序列出體系里出現(xiàn)的元素比如Ti O。如果你的 VASP 版本較老需要兼容可以省略這行但后面的 POTCAR 拼接順序就完全靠人工記容易出錯建議還是寫上。再下一行是每種元素的原子個數(shù)順序必須和元素符號行嚴(yán)格對應(yīng)。再往下有兩種坐標(biāo)模式Direct表示分?jǐn)?shù)坐標(biāo)相對于晶格矢量Cartesian表示笛卡爾坐標(biāo)單位由縮放因子決定。做晶體計(jì)算絕大多數(shù)情況用Direct因?yàn)榉謹(jǐn)?shù)坐標(biāo)在改變晶胞參數(shù)時不會失效。選定模式后面可以跟Selective dynamics開啟選擇性弛豫在每行坐標(biāo)后面加三個T或F控制該原子三個方向是否移動做表面吸附時固定底層原子就靠這個。高頻坑位一坐標(biāo)行數(shù)必須等于原子個數(shù)之和。多一行少一行VASP 會報(bào)讀取錯誤或者靜默地把結(jié)構(gòu)讀錯。寫完用wc -l POSCAR核對一下總行數(shù)再數(shù)一數(shù)坐標(biāo)塊的起始行號。高頻坑位二Direct和Cartesian拼寫必須完全正確大小寫不敏感但拼錯了就退化成默認(rèn)行為。3.2 KPOINTSk點(diǎn)網(wǎng)格怎么定才不算浪費(fèi)機(jī)時KPOINTS 控制布里淵區(qū)采樣的密度。周期性體系的電子波函數(shù)在倒空間里也是周期性的只需要在第一布里淵區(qū)內(nèi)采樣但連續(xù)積分沒法直接算只能用有限個 k 點(diǎn)求和近似。k 點(diǎn)越密能量越接近真實(shí)值代價也越大所以這是一個典型的精度與成本權(quán)衡。最簡單的寫法是自動網(wǎng)格模式Automatic mesh 0 Gamma 6 6 6 0.0 0.0 0.0第一行是注釋第二行的0表示讓 VASP 根據(jù)第三行的方式自動生成第三行Gamma表示以 Gamma 點(diǎn)為中心的網(wǎng)格也可以寫M用 Monkhorst-Pack 方案或者G作為 Gamma 的別名。第四行是三個方向的網(wǎng)格數(shù)第五行是網(wǎng)格的偏移量一般寫0 0 0。怎么定這個網(wǎng)格數(shù)一個實(shí)用的經(jīng)驗(yàn)方法是做收斂測試從 2×2×2 開始依次試 4×4×4、6×6×6、8×8×8把每個設(shè)置下的總能量除以原子數(shù)得到每原子能量畫出來看能量什么時候基本不變。通常每原子能量變化小于 1 meV 就可以認(rèn)為收斂了。對于晶格常數(shù)較大的體系比如層狀材料或加了真空層的二維材料沿真空方向的 k 點(diǎn)取 1 就夠因?yàn)槟莻€方向沒有色散。六方晶系有個特殊考慮倒空間的六方格子有對稱性用 Gamma 為中心的網(wǎng)格采樣效率更高所以第三行寫Gamma。而立方晶系用 Monkhorst-Pack 或 Gamma 差別不大。另外先做結(jié)構(gòu)優(yōu)化時 k 點(diǎn)可以取得比最終態(tài)密度計(jì)算更稀疏一些優(yōu)化完之后用一個密網(wǎng)格做靜態(tài)計(jì)算取精確能量和電荷密度這是標(biāo)準(zhǔn)的兩步走。一個快速判斷網(wǎng)格夠不夠的小技巧看 OUTCAR 中給出的不可約 k 點(diǎn)數(shù)量。如果只有一兩個說明網(wǎng)格太稀如果幾十上百個可能過密了。入門體系一般落在十幾個到幾十個的區(qū)間。3.3 INCAR結(jié)構(gòu)優(yōu)化要用到的標(biāo)簽逐條解釋INCAR 是最需要理解的一份文件因?yàn)閰?shù)都在這里。下面這份是結(jié)構(gòu)優(yōu)化的常用配置我逐條講理由。Global Parameters ISTART 0 ICHARG 2 PREC Accurate ENCUT 500 EDIFF 1E-5 EDIFFG -0.01 NSW 200 IBRION 2 ISIF 3 ISMEAR 0 SIGMA 0.05 LREAL Auto LWAVE .FALSE. LCHARG .FALSE. NCORE 4ISTART 0表示從頭開始不讀已有的 WAVECAR。第一次跑或者改了結(jié)構(gòu)就必須這么設(shè)。ICHARG 2表示從原子電荷密度疊加起步做自洽這是結(jié)構(gòu)優(yōu)化的常規(guī)設(shè)置做非自洽能帶計(jì)算時才改成 11用已收斂的電荷密度。PREC Accurate控制實(shí)空間格點(diǎn)和 FFT 網(wǎng)格的密度結(jié)構(gòu)優(yōu)化階段建議就用這一檔比 Normal 更穩(wěn)代價可以接受。ENCUT是平面波截?cái)嗄軟Q定了基組的大小。它的選取有一個明確依據(jù)POTCAR 文件里每種元素都帶一個ENMAX值取所有元素中最大的那個乘以 1.3 到 1.5再向上取整到 50 的倍數(shù)就是合適的 ENCUT。比如 Si 的 ENMAX 是 245 eV乘 1.3 約 318取整到 350 就夠??梢杂胓rep ENMAX POTCAR把所有的 ENMAX 一次性列出來。設(shè)得比這個值低會導(dǎo)致基組不完備能量和力都不準(zhǔn)設(shè)得高則白白增加計(jì)算量。EDIFF是電子步自洽收斂判據(jù)1E-5是結(jié)構(gòu)優(yōu)化的穩(wěn)妥值。EDIFFG是離子步收斂判據(jù)這個有個關(guān)鍵細(xì)節(jié)負(fù)值表示用受力判據(jù)單位是 eV/?正值表示用能量差判據(jù)。結(jié)構(gòu)優(yōu)化幾乎都用負(fù)值-0.01意味著所有原子上的最大力小于 0.01 eV/? 時停止。想更嚴(yán)格就用-0.005但注意每縮小一半需要的離子步可能翻倍。NSW 200是最大離子步數(shù)超了就停在當(dāng)前構(gòu)型。這個值給大一點(diǎn)沒壞處收斂了會自動停。IBRION 2用的是共軛梯度算法結(jié)構(gòu)優(yōu)化最常用。IBRION 1是準(zhǔn)牛頓方法收斂快但對初始結(jié)構(gòu)敏感容易在早期崩掉。入門建議 2。ISIF 3同時優(yōu)化原子位置、晶胞形狀和體積。這是全弛豫。如果你已經(jīng)知道晶胞參數(shù)、只想弛豫原子位置用ISIF 2。這個順序很重要不確定晶胞參數(shù)的體系建議先用 ISIF 2 讓原子在給定晶胞里站好位再切到 ISIF 3 放開晶胞比一上來就 ISIF 3 穩(wěn)定得多能顯著降低早期報(bào)錯的概率。ISMEAR和SIGMA處理費(fèi)米面附近的占據(jù)。金屬體系用ISMEAR 1配SIGMA 0.1半導(dǎo)體和絕緣體用ISMEAR 0配SIGMA 0.05做精確能量和態(tài)密度時用ISMEAR -5四面體方法。選錯會出現(xiàn)能量不準(zhǔn)甚至自洽不收斂的情況。LREAL Auto控制投影算符是在實(shí)空間還是倒空間計(jì)算。原子數(shù)超過 20 個的體系建議Auto小體系用.FALSE.。設(shè)錯會讓計(jì)算變慢或者報(bào)內(nèi)存相關(guān)的錯誤。NCORE是并行參數(shù)表示每個軌道上分幾個核。經(jīng)驗(yàn)做法是取單節(jié)點(diǎn)核數(shù)的平方根比如 32 核節(jié)點(diǎn)取 NCORE 4 或 8。這個值調(diào)得好能明顯加速調(diào)不好會拖慢。3.4 POTCAR贗勢順序與生成方式POTCAR 包含每種元素的贗勢數(shù)據(jù)決定了計(jì)算用什么近似的原子核—電子相互作用。它的生成邏輯是按 POSCAR 里的元素順序把對應(yīng)的單個 POTCAR 文件拼起來。假設(shè)體系是 SiPOTCAR 庫在/opt/potpaw_PBE/那么cat /opt/potpaw_PBE/Si/POTCAR POTCAR如果是二氧化鈦POSCAR 里元素順序是Ti O那么cat /opt/potpaw_PBE/Ti/POTCAR /opt/potpaw_PBE/O/POTCAR POTCAR順序必須和 POSCAR 的元素符號行一模一樣順序顛倒就是一個完全錯誤的結(jié)果而且 VASP 不會報(bào)錯它會默默算完。這是最陰險(xiǎn)的一類錯誤檢查方法是把grep VRHFIN POTCAR的輸出和 POSCAR 的元素行對照一遍。贗勢版本的選擇也有講究。同一個元素在同一套庫里往往有多個版本比如Ti、Ti_pv、Ti_sv后綴代表把多少半芯態(tài)電子當(dāng)作價電子處理。_pv和_sv精度更高但更貴。入門階段用默認(rèn)的無后綴版本就行除非你的體系涉及這些半芯態(tài)。整套計(jì)算里所有元素必須來自同一套庫比如都用 PBE 庫混用不同泛函的贗勢會得到?jīng)]有物理意義的結(jié)果。每次新建計(jì)算目錄都重新拼一次 POTCAR不要從別的目錄cp過來。不同體系的元素和順序大概率不一樣復(fù)制粘貼是最常見的低級錯誤來源。4. 一次完整的結(jié)構(gòu)優(yōu)化實(shí)操從建模到拿到CONTCAR4.1 建模與前處理坐標(biāo)從哪來坐標(biāo)來源無非三類。晶體結(jié)構(gòu)可以從數(shù)據(jù)庫直接拿標(biāo)準(zhǔn)的 CIF 文件這類文件里已經(jīng)包含了晶格參數(shù)和原子位置可靠性高。也可以用 Materials Studio、VESTA 這類可視化軟件搭模型MS 里畫完導(dǎo)出成 CIF 或者直接生成 POSCAR。第三種是自己按文獻(xiàn)里的晶格參數(shù)手工寫 POSCAR適合結(jié)構(gòu)簡單、參數(shù)明確的體系。拿到結(jié)構(gòu)之后有一個容易踩的坑值得單獨(dú)說摻雜或者對稱性降低的體系在 MS 里處理時軟件有時候會提示是否要 make P1。原因是 MS 默認(rèn)按對稱性存儲結(jié)構(gòu)你做等價位置替換或者局部畸變之后對稱性信息可能和實(shí)際結(jié)構(gòu)不符導(dǎo)出時如果不降為 P1也就是不加對稱性約束的原始表示VASP 讀到的結(jié)構(gòu)可能被它自帶的對稱性識別邏輯糾正回去導(dǎo)致你的摻雜原子位置變了。穩(wěn)妥做法是導(dǎo)出前確認(rèn)結(jié)構(gòu)已經(jīng)按 P1 展開或者干脆檢查導(dǎo)出的 POSCAR 中原子坐標(biāo)是否和你設(shè)定的完全一致。導(dǎo)出后我會做一步耐心的核對用 VESTA 打開 POSCAR 看一眼。VESTA 可以直接讀 POSCAR檢查原子位置有沒有明顯重疊、晶胞框是否合理、有沒有原子跑到晶胞外面。這一步花兩分鐘能擋掉后面幾小時的無效計(jì)算。如果肉眼看到兩個原子距離明顯小于正常鍵長那就是建模時出錯了直接重新弄。4.2 目錄搭建與文件生成的具體命令流程落到命令上大概是這樣。先建工作目錄mkdir -p ~/vasp/tio2_opt cd ~/vasp/tio2_opt把本地導(dǎo)出的 POSCAR 傳上來本地終端執(zhí)行scp POSCAR 用戶名服務(wù)器地址:~/vasp/tio2_opt/生成 POTCARcat /opt/potpaw_PBE/Ti/POTCAR /opt/potpaw_PBE/O/POTCAR POTCAR grep ENMAX POTCAR看 ENMAX 的輸出取最大值乘以 1.3 向上取整寫進(jìn) INCAR 的 ENCUT。寫 KPOINTSAutomatic mesh 0 Gamma 6 6 6 0.0 0.0 0.0寫 INCAR用前面 3.3 節(jié)那份配置把 ENCUT 換成剛算出來的值。四個文件齊了之后做一次完整性自檢ls -lh應(yīng)該看到 INCAR、POSCAR、KPOINTS、POTCAR 四個文件grep VRHFIN POTCAR的元素順序和 POSCAR 第五行對照head -n 8 POSCAR檢查前幾行格式。這一步做完再提交能避免絕大多數(shù)跑了幾分鐘就退出的情況。提交方式看你的環(huán)境。單機(jī)直接mpirun -np 16 vasp_std out.log 注意加放后臺前面的輸出重定向到日志文件。集群用提交腳本比如 Slurm 環(huán)境下寫一個sub.sh#!/bin/bash #SBATCH --job-nametio2_opt #SBATCH --nodes1 #SBATCH --ntasks-per-node32 #SBATCH --time72:00:00 #SBATCH --outputslurm.out module load vasp/6.4.0 mpirun -np 32 vasp_std然后sbatch sub.sh提交。節(jié)點(diǎn)數(shù)和核數(shù)要和你實(shí)際的機(jī)器匹配寫多了會排隊(duì)很久或者直接報(bào)錯。4.3 提交、監(jiān)控與收斂判讀提交之后隔十幾分鐘看一次tail -f OSZICAR。你會看到這樣的輸出每個離子步有幾行電子步迭代以DAV:開頭后面是迭代次數(shù)和能量然后一行匯總格式類似1 F -.xxxxxE02 E0 -.xxxxxE02 d E ...。F是自由能E0是外推到零展寬的能量兩者在小 SIGMA 下差別很小。判斷優(yōu)化是否在正常推進(jìn)看兩件事一是每個離子步的能量是否總體下降中間偶爾上升是正常的共軛梯度算法本來就會試探方向二是每行的d E也就是相鄰離子步的能量差它應(yīng)該逐步變小。如果能量在幾十步里反復(fù)大幅震蕩說明結(jié)構(gòu)有問題或者參數(shù)不合適。收斂的標(biāo)志是在 OUTCAR 里搜到這一句grep reached required accuracy OUTCAR出現(xiàn)這行說明力已經(jīng)小于 EDIFFG 設(shè)定的閾值優(yōu)化正常結(jié)束。同時 OSZICAR 的最后一行會顯示最大的力。如果沒出現(xiàn)這行但離子步數(shù)達(dá)到了 NSW說明沒收斂需要看看是結(jié)構(gòu)還在緩慢改善那就加大 NSW還是卡住了那就要改參數(shù)或檢查結(jié)構(gòu)。優(yōu)化結(jié)束后CONTCAR就是新的結(jié)構(gòu)文件。用 VESTA 打開對比一下 POSCAR 和 CONTCAR直觀看看原子移動了多少、晶胞有沒有明顯變形。如果某個原子跑了很遠(yuǎn)比如超過 1 ?要警惕是不是初始位置有嚴(yán)重問題。同時看 OUTCAR 里最終的能量和最大受力grep energy without entropy OUTCAR | tail -n 1 grep reached required accuracy OUTCAR tail -n 20 OUTCAR4.4 后處理與下一步結(jié)構(gòu)優(yōu)化本身只是起點(diǎn)。拿到收斂的 CONTCAR 之后常見后續(xù)有幾種把 CONTCAR 復(fù)制成 POSCAR做一次更高精度的靜態(tài)計(jì)算用更密的 k 點(diǎn)和ISMEAR -5得到準(zhǔn)確的總能量和電荷密度用于比較不同構(gòu)型的相對穩(wěn)定性或者用它做能帶、態(tài)密度計(jì)算或者把優(yōu)化好的結(jié)構(gòu)當(dāng)作下一步缺陷、吸附或過渡態(tài)搜索的初始構(gòu)型。做這些后續(xù)計(jì)算時有個反復(fù)被強(qiáng)調(diào)的原則優(yōu)化用的參數(shù)和最終取能量的參數(shù)可以不同但同一組比較對象之間的參數(shù)必須完全一致。比如你要比較三種摻雜構(gòu)型哪個更穩(wěn)定它們的 ENCUT、k 點(diǎn)、ISMEAR、SIGMA、贗勢版本必須一模一樣否則能量差里混進(jìn)了參數(shù)差結(jié)論就是錯的。還有一點(diǎn)結(jié)構(gòu)優(yōu)化完成不等于結(jié)果可用。摻雜或缺陷體系的優(yōu)化結(jié)果需要做對稱性檢查優(yōu)化后的結(jié)構(gòu)是否還保持你預(yù)期的對稱性有沒有滑到一個對稱性更低但物理上不合理的構(gòu)型。這需要用可視化工具認(rèn)真比對光看能量數(shù)字是看不出來的。5. 踩坑實(shí)錄報(bào)錯信息與參數(shù)設(shè)置速查5.1 高頻報(bào)錯對照表這部分是我自己和新人們踩過的坑里最常出現(xiàn)的幾類整理成表方便對照。報(bào)錯信息常見原因處理方式POSCAR: NIONS相關(guān)讀取錯誤坐標(biāo)行數(shù)與元素原子數(shù)不符核對 POSCAR 坐標(biāo)塊行數(shù)Error EDDDAV: Call to ZHEGV failed初始磁矩不合理、原子重疊、ALGO 不適配檢查結(jié)構(gòu)加ALGO Normal磁性體系設(shè) MAGMOMZBRENT: fatal error in bracketing初始結(jié)構(gòu)太差能量極小點(diǎn)找不到先用 ISIF 2 小步優(yōu)化再放開晶胞internal error in subroutine SGRCON對稱性識別失敗設(shè)ISYM 0關(guān)閉對稱性或調(diào)SYMPRECLAPACK: Routine ZPOTRF failed內(nèi)存分配或并行參數(shù)問題調(diào)小 NCORE減少核數(shù)檢查內(nèi)存Sub-Space-Matrix is not hermitian in DAV并行通信或初始波函數(shù)問題改ALGO All或Normal重啟任務(wù)very long vectors或原子距離過近警告結(jié)構(gòu)存在嚴(yán)重重疊回建模步驟重新檢查坐標(biāo)計(jì)算正常啟動但立刻退出缺少 POTCAR 或路徑錯誤ls -lh確認(rèn)四個文件都在DENTET: cant reach specified precisionk 點(diǎn)太少或 ISMEAR 不合適加密 k 點(diǎn)調(diào)整 ISMEAR 與 SIGMA關(guān)于EDDDAV這個報(bào)錯值得多說兩句因?yàn)樗畛3霈F(xiàn)也最容易讓人不知所措。我遇到的情況里排第一的原因是磁性體系的初始磁矩沒有設(shè)置。比如含鐵的氧化物如果不寫ISPIN 2和MAGMOMVASP 會按非磁性處理自洽過程中容易出現(xiàn)數(shù)值問題。第二常見的原因是初始結(jié)構(gòu)里兩個原子貼得太近局部電子密度異常。第三是 ALGO 的默認(rèn)值在某些體系上不穩(wěn)健改成ALGO Normal之后問題就消失了。5.2 參數(shù)設(shè)置上容易翻車的地方ISIF 3一上來就用是新人最常犯的錯誤。它的含義是同時放開晶胞和原子搜索空間最大。如果初始結(jié)構(gòu)本身質(zhì)量不高優(yōu)化器在早期很容易走到一個畸變很大的中間構(gòu)型上然后卡住或者報(bào)錯。我的做法固定為兩段式先ISIF 2跑一輪讓它把原子位置理順檢查 CONTCAR 有沒有異常再復(fù)制成 POSCAR 用ISIF 3跑第二輪。多花一輪時間但成功率高得多。ISMEAR用在金屬體系上設(shè)成 0會導(dǎo)致收斂極慢甚至不收斂。金屬的費(fèi)米面附近有大量態(tài)需要展寬方法來平滑占據(jù)ISMEAR 1配SIGMA 0.1是標(biāo)配。反過來半導(dǎo)體上用ISMEAR 1配大 SIGMA 會讓能量不準(zhǔn)確。判斷體系是不是金屬看有沒有未填滿的 d 軌道、有沒有明顯的帶隙預(yù)期。ENCUT設(shè)得過低是個隱蔽的坑因?yàn)樗粫?bào)錯只會讓你得到的能量和力系統(tǒng)性偏移。可以用一個簡單的自檢把 ENCUT 提高 30%重跑一次單點(diǎn)看總能量變化多少。如果每原子變化超過幾個 meV說明原來設(shè)低了。這個測試對每個新體系的第一次計(jì)算都值得做。一個常被忽略的細(xì)節(jié)EDIFFG設(shè)為正值時用的是能量判據(jù)單位是 eV。有人從別人的 INCAR 里抄來EDIFFG 0.001以為是力判據(jù)實(shí)際上是要求相鄰離子步能量差小于 0.001 eV這個條件往往比力判據(jù)嚴(yán)格得多導(dǎo)致優(yōu)化跑了幾百步還停不下來。結(jié)構(gòu)優(yōu)化默認(rèn)用負(fù)值。5.3 一些能省時間的習(xí)慣第一個習(xí)慣建一個模板目錄。把跑通過的 INCAR、KPOINTS、提交腳本放在~/vasp/template/里新任務(wù)只需要改體系相關(guān)的幾行其余照抄。這樣能避免每次都重新回憶參數(shù)的寫法也降低手誤概率。第二個習(xí)慣每個任務(wù)目錄用有意義的命名比如tio2_anatase_opt01、tio2_vacancy_O_opt02而不是test、test2、new。跑了幾十個任務(wù)之后你會感謝自己當(dāng)初命名的耐心。配合一個notes.md記錄每個目錄對應(yīng)的參數(shù)改動和結(jié)論回頭查非??臁5谌齻€習(xí)慣善用grep做結(jié)果提取。VASP 的 OUTCAR 動輒幾萬行手翻是不現(xiàn)實(shí)的。常用組合包括grep free energy TOTEN OUTCAR | tail -n 5看最后幾步的能量grep reached required accuracy OUTCAR查是否收斂grep Total CPU time used OUTCAR看總耗時。寫一個兩行的 shell 腳本把常用的幾條合并起來每次任務(wù)結(jié)束跑一下比一條條敲高效得多。第四個習(xí)慣別在同一個終端里長時間掛著tail -f。有時候輸出會一直刷看著很安心但實(shí)際占著終端什么也干不了。用tail -n 50 OSZICAR定期看一眼就夠了或者把監(jiān)控頻率降到十幾分鐘一次。6. 關(guān)于學(xué)習(xí)節(jié)奏的一點(diǎn)個人體會我見過太多人在入門階段被要學(xué)的東西太多這件事壓住密度泛函理論、Linux、VASP 參數(shù)、集群操作、后處理腳本每一樣單看都不簡單。但實(shí)際上這些東西的優(yōu)先級差別很大。理論部分可以在跑計(jì)算的過程中慢慢補(bǔ)你不需要先看完一本固體物理教材才能開始Linux 會用到的命令其實(shí)就那么幾十條用一個記一個完全來得及真正需要一開始就建立起正確直覺的是結(jié)構(gòu)優(yōu)化是一個迭代搜索過程這件事以及輸入文件之間的信息必須嚴(yán)格一致這類原則。我自己的路徑是先照著別人的算例完整復(fù)現(xiàn)一遍遇到每個不懂的參數(shù)就去查手冊把整條鏈路走通之后再回頭理解每一步的物理。這樣走下來知識是掛在具體經(jīng)驗(yàn)上的比從頭啃理論要牢固。等你把第一個體系從頭到尾跑完包括中間踩的那幾個坑你會發(fā)現(xiàn)第二個體系、第三個體系的速度會快得超出預(yù)期。真正花時間的永遠(yuǎn)是從零到跑通一次這一段。最后分享一個小技巧第一次跑起來之后把所有輸入文件連同 OUTCAR 里用來描述計(jì)算設(shè)置的區(qū)塊一起存檔標(biāo)注清楚參數(shù)和對應(yīng)的結(jié)果。等你半年后回頭看或者被人問這個體系當(dāng)時是怎么算的這份存檔就是最省事的答案。