
簡介新版 VASP 6.4.2 安裝包面向第一性原理計算研究者與材料模擬工程師用于解決特定版本 VASP 程序獲取及配套環(huán)境部署需求。壓縮包為 tgz 格式約 94.25MB共包含 2000 個文件。除程序本體外還有 380 個 shell 腳本、255 個 POSCAR、245 個 KPOINTS以及大量 INCAR 參考文件覆蓋 ACFDT、AEKLI、GW/BSE、RPA、HSE/PBE0 等功能模塊另有 XML 配置和 ml_ff 機器學(xué)習(xí)力場樣例方便不同計算任務(wù)對照使用。已有 279 人學(xué)習(xí)下載。通過該包可快速獲得完整目錄結(jié)構(gòu)和可復(fù)用輸入模板按需選擇相應(yīng)模塊開展結(jié)構(gòu)優(yōu)化、電子性質(zhì)、GW 修正或多體微擾等計算減少自行整理腳本與樣例的時間。1. 解壓后不是安裝包VASP 6.4.2 的真實形態(tài)與安裝前提拿到 vasp6.4.2 安裝包的第一反應(yīng)往往是解壓、看 README、然后期待 bin/ 里出現(xiàn)現(xiàn)成二進制?,F(xiàn)實會讓不少人栽跟頭目錄里是幾萬行 Fortran 源代碼編譯要自己完成能直接用的通常只有 docs 和 arch 模板。6.4.2 屬于 VASP 6.4.x 的補丁分支構(gòu)建方式沿用 6.x 的 makefile.include 驅(qū)動網(wǎng)上大量 5.4.4 時代的 configure 教程并不能照搬。這篇筆記寫給兩類人一類是剛拿到合法源碼、準(zhǔn)備在自己機器或集群上從零編譯的課題組學(xué)生另一類是集群管理員要把 std、gam、ncl 三種二進制一次性編好交給團隊使用。我會把依賴選型、makefile.include 修改、編譯驗證和五個高頻坑講透讓你裝完敢直接上生產(chǎn)計算。2. 依賴工具鏈與 makefile.includeVASP 6.4.2 編譯環(huán)境這樣搭2.1 編譯器與 MPI 組合先選對再動手VASP 6.4.2 的編譯鏈條里最早敲的不是 make而是花十分鐘決定三樣?xùn)|西Fortran 編譯器、MPI 實現(xiàn)、BLAS/LAPACK 數(shù)學(xué)庫。常見組合有兩套。第一套是 oneAPI 全家桶編譯器用 ifort 或新版 ifxMPI 用配套的 Intel MPI數(shù)學(xué)庫直接用 MKL第二套是 gfortran OpenMPI OpenBLAS 或自編譯 scalapack。兩套都能編出能用的 vasp_std但血淚經(jīng)驗是oneAPI 組合出現(xiàn)頻率最高、編譯參數(shù)最少、默認(rèn)性能也最好適合不想在環(huán)境上耗太久的用戶GCC 組合的優(yōu)勢是機器上往往已經(jīng)預(yù)裝省去環(huán)境變量沖突但 scalapack 要自己找版本對不上會在鏈接階段卡很久。版本選擇上編譯器盡量選較新的穩(wěn)定版。6.4.2 用到的 Fortran 特性比 5.4.4 新不少太老的 gfortran 4.x 甚至無法完成預(yù)處理8.x 在某些平臺也會因為 OpenMP 歸約寫法報尷尬的警告。用集群時先 module avail 看預(yù)裝清單優(yōu)先選“編譯器與 MPI 同源”的組合。gfortran 配 Intel MPI、ifort 配 OpenMPI 這種混搭不是不能跑但已經(jīng)屬于高風(fēng)險動作通常我不建議新手嘗試。我自己一般會在同一條 module load 語句里把編譯器、MPI、MKL 一起加載避免后加載的庫把 LD_LIBRARY_PATH 順序打亂。2.2 從 arch 模板生成 makefile.include第一次打開 vasp.6.4.2 源碼包建議先瀏覽目錄結(jié)構(gòu)不要急著改文件。按下面順序走一遍cd ~/apps/vasp.6.4.2 # 源碼根目錄路徑中不要帶空格 ls arch/ # 查看官方提供的編譯模板 cp arch/makefile.include.intel makefile.includearch 目錄存放的是官方按編譯器、MPI 類型區(qū)分的模板命名一般是 makefile.include.xxxx。復(fù)制而不是直接改 arch 里的文件是為了以后多版本并存時能隨時回退makefile.include 是在源碼根目錄生效的構(gòu)建系統(tǒng)讀的是這個名字。如果你的機器是 aarch64或者調(diào)度器和默認(rèn)模板不匹配arch 里可能沒有完全一致的模板那就把最接近的復(fù)制出來再按 2.3 節(jié)逐項改。注意VASP 6.x 在第一次 make 時才會解析 makefile.include所以語法錯誤要到編譯時才暴露改完先檢查一遍引號和續(xù)行符。2.3 需要按機器修改的五個關(guān)鍵變量改 makefile.include 之前先明確它到底在告訴構(gòu)建系統(tǒng)什么。下面是五個必查項其余官方宏大多可以保留默認(rèn)變量作用錯誤表現(xiàn)FCFortran 編譯器命令make 第一行報 command not foundFCL鏈接器命令通常還帶數(shù)學(xué)庫入口鏈接階段一堆 undefined referenceMKLROOTMKL 安裝前綴找不到 libmkl_intel_lp64.soLLIBS顯式鏈接的數(shù)學(xué)庫列表scalapack 相關(guān)符號缺失CPP_OPTIONS預(yù)處理宏集合并行特性沒編進去運行時不支持 KPAR以 oneAPI 工具鏈為例我經(jīng)常把 makefile.include 中這幾行改成如下形態(tài)# 以 Intel 工具鏈為模板按機器實際情況修改的片段 FC mpiifort FCL mpiifort -mkl MKLROOT /opt/install/oneapi/mkl/latest LLIBS -L$(MKLROOT)/lib/intel64 \ -lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64 \ -lmkl_intel_lp64 -lmkl_sequential -lmkl_core CPP_OPTIONS -DMPI -DscaLAPACK -Duse_collectiveLLIBS 里的順序不是擺設(shè)。Intel MKL 靜態(tài)鏈接時scalapack 要在 blacs 之前blacs 要在 MKL 基礎(chǔ)庫之前順序顛倒最常見的反應(yīng)是鏈接器報出幾十個 zheevd_、pdsyevd_ 之類的未定義符號。把 scalapack 和 blacs 留空也不是好主意某些雜化泛函路徑會調(diào)用并行對角化缺失庫的版本看似能編譯通過跑 HSE 時才在運行時炸掉。2.4 編譯前的一輪環(huán)境自檢環(huán)境檢查用下面四條命令比直接 make 更快定位問題source /opt/install/oneapi/setvars.sh # 路徑以實際集群為準(zhǔn) export MKLROOT$(ls -d /opt/install/oneapi/mkl/latest) which ifort mpiifort lscpu | grep CPU(s): # 決定 make -j 的并行度which 輸出必須是指向絕對路徑的可執(zhí)行文件如果返回“no found”說明工具鏈沒進 PATH后面 make 一定失敗。MKLROOT 則決定了 LLIBS 里 -L 能否命中環(huán)境變量缺失但 makefile.include 里寫死了絕對路徑時最容易被忽略。至于 make -j 的數(shù)值物理機通??梢杂煤诵臄?shù)減半到全核之間但登錄節(jié)點上不要直接打滿很多集群對登錄節(jié)點 CPU 占用有限制超了會被系統(tǒng)殺掉會話。檢查完環(huán)境再進入實際編譯。3. 用一條命令鏈編完 std、gam、nclVASP 6.4.2 最小編譯流程3.1 三種二進制產(chǎn)物的區(qū)別與選擇VASP 6.4.2 源碼包默認(rèn)可以編出三種 CPU 版二進制分別對應(yīng)三種計算場景。vasp_std 是標(biāo)準(zhǔn)版支持共線自旋極化、k 點并行、雜化泛函等絕大多數(shù)生產(chǎn)任務(wù)vasp_gam 是伽馬點專用版只能在布里淵區(qū)中心單 k 點下跑內(nèi)存占用和矩陣規(guī)模明顯更小適合大體系分子動力學(xué)vasp_ncl 是非共線版本處理自旋軌道耦合、非共線磁結(jié)構(gòu)這類必須用完整旋量波函數(shù)的場景。三者的關(guān)系和常見誤區(qū)是不少用戶以為 gam 更快所以跑什么體系都用它實際上只要 KPOINTS 文件里多于一個 k 點vasp_gam 就會拒絕執(zhí)行或給出錯誤結(jié)果gamma-only 的加速只對超大單胞有意義。生產(chǎn)環(huán)境我建議三個都編不需要“先編一個試試”因為編譯成本真的不高。3.2 標(biāo)準(zhǔn)版 vasp_std 的編譯與產(chǎn)物檢查確認(rèn) makefile.include 就位后編譯命令其實非常簡單make -j8 std # 并行度 8按核心數(shù)和負(fù)載調(diào)整 ls bin/ # 確認(rèn)出現(xiàn) vasp_std且文件大小在幾十 MB 量級如果是第一次編譯不要直接就 make all先只編 std。這樣可以把 makefile.include 的語法、編譯器路徑、數(shù)學(xué)庫鏈接三類問題集中暴露在最短的編譯周期里。std 編通之后再做 gam 和 nclmake -j8 gam make -j8 ncl其實 6.4.2 的構(gòu)建系統(tǒng)里 make all 相當(dāng)于 std gam ncl 一起編但新手先分別執(zhí)行更可控。每次成功執(zhí)行完bin/ 下會多出對應(yīng)二進制如果中途失敗去 build/ 目錄看最后一屏錯誤重點找“FC”“Linking”這些前后詞那才是真正有用的信息。常見情況是 bin/ 只有 vasp_std沒有 vasp_gam很多人以為編 gam 是另一套獨立源碼其實只是 makefile.include 里的預(yù)處理宏不同同一套源碼可以反復(fù)編譯不同目標(biāo)。3.3 編譯完成后的硅算例冒煙測試編譯完成不等于安裝完成跑一個最小算例確認(rèn)可執(zhí)行文件沒有隱藏問題。我常用 2 原子 Si 原胞做冒煙測試整件事在空目錄里做避免污染周期表數(shù)據(jù)。mkdir -p ~/vasp_smoke_test/si cd ~/vasp_smoke_test/si cat POSCAR EOF Si 2-atom cell 1.0 0.000 2.715 2.715 2.715 0.000 2.715 2.715 2.715 0.000 2 Direct 0.00 0.00 0.00 0.25 0.25 0.25 EOFPOSCAR 第一行是注釋第二行是縮放因子三到五行是晶格向量第七行寫原子數(shù)后面直接按分?jǐn)?shù)坐標(biāo)排列。這里用兩個原子的金剛石原胞ENCUT 不需要高。接著寫 INCAR 和 KPOINTScat INCAR EOF SYSTEM Si-smoke ISMEAR 0 SIGMA 0.05 ENCUT 300 PREC NORMAL EOF cat KPOINTS EOF K-Points 0 Monkhorst-Pack 4 4 4 0 0 0 EOFPOTCAR 需要從你平時維護的贗勢目錄里取 Si 的 PAW_PBE 文件復(fù)制到當(dāng)前目錄并命名為 POTCAR。然后調(diào)用 MPIRUN 啟動注意用絕對路徑指到剛編譯的二進制mpirun -np 8 ~/apps/vasp.6.4.2/bin/vasp_std run.out 21 grep free energy OUTCAR grep reached required accuracy OUTCARgrep 出 free energy 且有 reached required accuracy 字樣說明電子步收斂、離子步成功二進制基本可用。跑完順手記一個大致的 wall time后面換編譯器或調(diào) KPAR 時可以作為對比基準(zhǔn)。這個冒煙測試算例大約幾十秒遠(yuǎn)不值得省。3.4 深水區(qū)GPU 版構(gòu)建GPU 版 VASP 的價值在大體系 MD 和雜化泛函里非常明顯但 6.4.2 的 GPU 編譯屬于第二階段工作。GPU 版構(gòu)建不是在同一份 makefile.include 里加開關(guān)那么簡單典型做法是把 FC/FCL 換成支持 OpenACC 的編譯器并配置 CUDA 路徑然后執(zhí)行 make gpu。具體的宏名每個發(fā)布版本不完全一樣必須看包里隨附的 README。我的建議是先把 CPU 版 std/gam/ncl 全部跑通再回頭處理 GPU如果你所在單位根本沒有 NVIDIA A100/H100 這類算力GPU 版這一步可以直接跳過不會影響任何常規(guī)生產(chǎn)任務(wù)。4. VASP 6.4.2 安裝常見問題排查從編譯報錯到運行崩潰4.1 編譯器找不到、模板選錯與字面報錯現(xiàn)象執(zhí)行 make std 時終端第一行就出現(xiàn) ifort: command not found或者 /bin/sh: 1: mpif90: not found。原因編譯器或 MPI 環(huán)境變量沒有加載也就是沒有執(zhí)行 setvars.sh、module load 那一步還有一種是機器上只有 gfortran但 makefile.include 是從 makefile.include.intel 復(fù)制來的。解決要么加載 oneAPI 環(huán)境并重新打開同一個 shell 再編譯要么回到 2.2 節(jié)重新選 GCC 對應(yīng)模板。檢查順序是which ifort 無輸出再 which gfortran確認(rèn)機器到底裝了什么。模板選錯還有個典型癥狀編譯過程中出現(xiàn) unrecognized option -xHost這是 gcc/gfortran 不認(rèn) Intel 專屬優(yōu)化參數(shù)的標(biāo)志說明 makefile.include 與你實際的編譯器不匹配。4.2 鏈接階段 undefined reference 與數(shù)學(xué)庫順序現(xiàn)象編譯進行到 Linking 階段屏幕滾出大量 undefined reference tozheevd_、pdsyevd_ 或 scalapack 相關(guān)符號Stdout 最后提示 ld returned 1 exit status。原因makefile.include 中的 LLIBS 缺少 scalapack或者庫順序不對。Intel MKL 的靜態(tài)鏈接對順序極其敏感scalapack 必須出現(xiàn)在 blacs 之前blacs 必須出現(xiàn)在 MKL 基礎(chǔ)庫之前。解決返回 2.3 節(jié)把 LLIBS 寫成完整五件套不要自作聰明刪掉某個組件。刪掉 blacs 或 scalapack 的版本在編譯期看似輕快但運行期一旦調(diào)用并行對角化就翻車。4.3 裝好后一跑就段錯誤棧限制與動態(tài)庫污染現(xiàn)象運行 vasp_std 后幾秒甚至幾十秒進程異常退出日志最后一行類似 forrtl: severe (174): SIGSEGV或者直接 Segmentation fault。原因這類崩潰一半是棧大小限制尤其使用 OpenMP 線程庫時另一半是 LD_LIBRARY_PATH 里混入了多套 libmpi.so導(dǎo)致編譯時用的 MPI 與運行時加載的 MPI 不一致。解決先 ulimit -s unlimited 確認(rèn)棧限制再檢查 ldd 輸出中與 MPI 相關(guān)的庫來源是否唯一ulimit -s unlimited ldd ~/apps/vasp.6.4.2/bin/vasp_std | grep mpi如果 ldd 顯示的 libmpi.so 路徑與 which mpiifort 所在目錄不一致說明環(huán)境變量被后續(xù) module 覆蓋。重新打開一個干凈 shell只加載一套 MPI 再跑。段錯誤問題排查到這里還沒解決再考慮換編譯器優(yōu)化等級比如把 -O3 降成 -O2 復(fù)現(xiàn)一次排除編譯器越級優(yōu)化導(dǎo)致數(shù)值路徑異常。4.4 MPI 初始化失敗調(diào)度器綁定與作業(yè)腳本現(xiàn)象作業(yè)提交后立刻退出日志里出現(xiàn) ORTE was unable to bind to a reserved port或者 mpirun -np 在登錄節(jié)點上長時間掛起沒有輸出。原因在 SLURM 集群里直接調(diào)用 mpirunOpenMPI 等啟動器可能嘗試接管資源綁定與調(diào)度器產(chǎn)生沖突登錄節(jié)點上直接起多進程 MPI 還會觸發(fā)資源限制策略。解決在 sbatch 腳本里優(yōu)先用 srun 而不是 mpirun 啟動任務(wù)如果一定要 mpirun加參數(shù)跳過綁定#SBATCH --ntasks-per-node32 srun /apps/vasp/vasp.6.4.2/bin/vasp_std這里的關(guān)鍵不是命令行本身而是讓 MPI 進程數(shù)與調(diào)度器分配的槽位數(shù)嚴(yán)格一致。有人習(xí)慣在腳本里寫死 mpirun -np 64但節(jié)點只有 32 核結(jié)果就是綁定沖突或性能減半。4.5 結(jié)果與舊版本不一致版本差異還是編譯玄學(xué)現(xiàn)象同一份輸入文件用舊版 5.4.4 和剛裝好的 6.4.2 分別計算總能差幾毫電子伏或者結(jié)構(gòu)優(yōu)化收斂步數(shù)明顯不同。原因不一定是安裝失敗。6.4.2 在默認(rèn)算法、初始占據(jù)數(shù)處理、FFT 實現(xiàn)細(xì)節(jié)上都和 5.4.4 有差異數(shù)學(xué)庫換一個版本也會引入微小數(shù)值漂移。這是 DFT 軟件更替后的正常現(xiàn)象不是玄學(xué)。解決跨版本對比時INCAR 里統(tǒng)一顯式指定算法關(guān)鍵詞不要把默認(rèn)值留在暗處。ISMEAR、SIGMA、ALGO、IBRION、EDIFF 這幾個是必須寫全的。如果做到這一步數(shù)值仍有差異拿固定算例在兩種二進制下各跑三次檢查波動是否在 1 meV 以內(nèi)是則視為編譯正常。5. 驗證安裝并壓榨并行效率裝好的 VASP 6.4.2 怎么才算合格5.1 用固定算例做基準(zhǔn)回歸冒煙測試只是起點真正判斷安裝包可用要留下一組能反復(fù)對比的基準(zhǔn)記錄。我會固定一個 2x2x2 的超胞或者分子動力學(xué)短任務(wù)記錄三樣?xùn)|西能量數(shù)值、總耗時、最后一步電子步數(shù)。以后機器升級編譯器、改動 MKL 庫、換 MPI 實現(xiàn)時拿同一任務(wù)再跑一遍差值在 1 meV 內(nèi)且耗時沒有明顯回退才算環(huán)境沒有搞壞。這一步值得做成文檔哪怕只是一條 Markdown也能幫你和后來人省下大量“是不是安裝包壞了”的猜疑。5.2 并行參數(shù)快速檢查NPAR、NCORE、KPAR 與 OMP_NUM_THREADS運行 vasp_std 時環(huán)境變量 OMP_NUM_THREADS 默認(rèn)可能不輸出 1導(dǎo)致 MPI 與 OpenMP 線程互相搶核心這是 6.4.2 裝上后性能“莫名慢”的一個高頻原因。執(zhí)行前顯式導(dǎo)出export OMP_NUM_THREADS1 mpirun -np 32 /apps/vasp/vasp.6.4.2/bin/vasp_stdINCAR 里優(yōu)先調(diào)整 NCORE 而不是老教程里的 NPAR。起步建議 NCORE 等于每個計算節(jié)點的物理核心數(shù)KPAR 等于可并行 k 點數(shù)與 NCORE 配合后的合理值。KPAR 不能超過 KPOINTS 文件里 k 點總數(shù)否則 VASP 會直接報錯退出。觀察 OUTCAR 里的總耗時每次只改一個參數(shù)做對比并行參數(shù)調(diào)整是最容易“越調(diào)越慢”的環(huán)節(jié)一次只動一個變量是鐵律。5.3 結(jié)果檢查的習(xí)慣最后養(yǎng)成的習(xí)慣是新裝的 VASP 6.4.2頭三周內(nèi)任何生產(chǎn)任務(wù)都在提交腳本里加一行輸出能量和收斂情況的 grep跑完自動檢查 OUTCAR 末尾的 General timing 部分。某次我在一個新集群上裝完 6.4.2 就把舊任務(wù)全部重跑結(jié)果因為忘了設(shè)置 OMP_NUM_THREADS每個任務(wù)慢了近三成還以為是庫不對。那次之后我每次換環(huán)境都先用同一個基準(zhǔn)任務(wù)熱身確認(rèn)能量、耗時、收斂步數(shù)三條曲線都正常再放心交付給別人和后續(xù)計算。VASP 6.4.2 的安裝包本身不復(fù)雜復(fù)雜的是環(huán)境里的隱式變量把上面幾步做成習(xí)慣生產(chǎn)環(huán)境就能少碰大多數(shù)莫名其妙的翻車。希望這些經(jīng)驗?zāi)軒偷侥恪1疚倪€有配套的精品資源點擊獲取