乐于分享
好东西不私藏

VASP 5.4.4 GNU 编译安装指南

VASP 5.4.4 GNU 编译安装指南

软件安装实战系列· 03

Ubuntu 22.04 + GCC/GFortran + OpenMPI + OpenBLAS + ScaLAPACK + FFTW(MPI)

从依赖库源码编译、VASP 三版本构建,到 VTSTVASPKIT 与集群验收

适用系统

Ubuntu 22.04 LTSUbuntu 24.04 可参考,需按 GCC 版本排错)

目标版本

VASP 5.4.4;可选 VTST code 179 与 VASPKIT 1.5.x

编译路线

GNU + OpenMPI + OpenBLAS + ScaLAPACK + FFTW(MPI)

交付程序

vasp_std / vasp_gam / vasp_ncl;可选 vasp_VTST

文章定位

可复现教程 + 工程化环境管理与故障排查

云算科技

高性能计算|科研服务|软件支持

版本:20267

写在前面

使用 GNU 编译器安装 VASP,看起来比 Intel oneAPI 路线更自由:编译器、MPIBLAS/LAPACKScaLAPACK 和 FFTW 都可以自行选择。但自由也意味着每一层依赖都要由安装者负责。一旦 OpenMPI 的底层编译器、ScaLAPACK 的 MPI wrapperFFTW 的 MPI 支持或 VASP 的链接路径出现混用,最终报错往往会集中出现在 VASP 链接阶段,很难从最后一条错误直接判断根因。

这篇文章以 Ubuntu 22.04 和 VASP 5.4.4 为例,采用一条完全独立的 GNU 依赖链:GCC/GFortran → OpenMPI → OpenBLAS → ScaLAPACK → FFTW(MPI) → VASP。所有核心依赖统一安装到 /opt/GNU,不与 Ubuntu apt 提供的数学库混用。完成 VASP 原版后,文章还会介绍如何在不破坏原版源码的前提下扩展 VTST,并配置 VASPKIT

授权与合规说明

VASP 是商业授权软件。本文只讲安装方法,不转发 VASP 源码与赝势文件。

我们已经将依赖检查、源码解压、配置生成、编译日志、modulefile 创建和验收测试封装为一键安装脚本,也可通过远程方式完成服务器部署。本文仍然把关键原理与排错逻辑完整展开,目的是让读者不仅能够照做,也能判断一次安装是否真正可靠。

文章目录

1.先理解 GNU 路线:VASPVTSTVASPKIT 分别是什么

2.安装包与目录规划

3.安装基础工具和 Environment Modules

4.源码编译 OpenMPI 4.1.4

5.源码编译单线程 OpenBLAS

6.使用 GNU OpenMPI 编译 ScaLAPACK

7.编译支持 MPI 的 FFTW

8.创建并验证统一 GNU 环境 modulefile

9.准备 VASP 源码与 makefile.include

10.编译 vasp_stdvasp_gamvasp_ncl

11.安装目录、modulefile 与运行验收

12.赝势库与 Si 最小测试算例

13.可选扩展:VTST code 与 vtstscripts

14.可选扩展:VASPKIT

15.Slurm 作业脚本

16.高频报错与排查顺序

17.一键安装脚本应具备的能力

18.最终验收清单与服务说明

1. 先理解 GNU 路线:四类组件不要混为一谈

组件

是否参与 VASP 编译

作用与交付方式

VASP

真正执行第一性原理计算,由合法源码编译得到 vasp_std / vasp_gam / vasp_ncl

VTST code

 VASP 源码加入 NEBdimer、优化器等扩展,需要复制源码并重新编译

vtstscripts

NEB 路径生成与分析脚本,加入 PATH 即可

VASPKIT

读取或生成 POSCARPOTCARKPOINTSDOS/能带等文件,通常直接使用二进制包

赝势库

为每个计算目录生成 POTCAR,也可供 VASPKIT 调用

本文的核心原则是:编译依赖库全部来自同一条 GNU 工具链。OpenMPI 必须由 gcc/g++/gfortran 编译;ScaLAPACK 必须使用这套 OpenMPI 提供的 mpicc/mpif90FFTW 的 MPI 接口也必须由同一套 OpenMPI 编译。

为什么不直接 apt install 一切

apt 安装并非不能使用,但系统库的版本、编译器和 MPI 实现未必与本文一致。为了让路径可控、便于复现和后续维护,本文把 OpenMPIOpenBLASScaLAPACK 与 FFTW 独立安装到 /opt/GNU

2. 安装包与目录规划

2.1 推荐安装目录

/opt/software/ 源码包与二进制安装包/opt/GNU/openmpi/4.1.4/ # GNU 版 OpenMPI/opt/GNU/openblas/ 单线程 OpenBLAS/opt/GNU/scalapack/2.1.0/ # ScaLAPACK/opt/GNU/fftw/3.3.11/ # FFTW,启用 MPI/opt/GNU/vasp/5.4.4/ # VASP 原版最终目录/opt/GNU/vasp/5.4.4-vtst/ 可选:VASP + VTST/opt/vtst/vtstcode-179/ # VTST 编译补丁/opt/vtst/vtstscripts/ # VTST 辅助脚本/opt/vasp/potentials/ 合法赝势库/opt/vaspkit/ # VASPKIT/opt/modulefiles/gnu/ # GNU/VASP modulefile/opt/modulefiles/vaspkit/ # VASPKIT modulefile

2.2 建议准备的文件

openmpi-4.1.4.tar.gzOpenBLAS-0.3.32.tar.gzscalapack-2.1.0.tgzfftw-3.3.11.tar.gzvasp.5.4.4.tar.gz 由合法授权用户准备vtstcode-179.tgz 可选vtstscripts.tgz 可选potpaw_PBE.64.tgz 可选,由合法授权用户准备vaspkit.1.5.1.linux.x64.tar.gz 可选,按实际版本替换

sudo mkdir -p /opt/software /opt/GNU/vasp /opt/vtst /opt/vasp/potentials /opt/vaspkit /opt/modulefiles/gnu /opt/modulefiles/vaspkitls -lh /opt/software

目录规划不是形式工作

独立目录可以避免把系统库和自编译库混在一起,也便于同时保留原版 VASPVTST 版 VASP 和其他编译器版本。后续升级或回滚时,只需要切换 modulefile

3. 安装基础工具和 Environment Modules

sudo apt updatesudo apt install -y build-essential gcc g++ gfortran make cmake m4 perl wget curl tar gzip bzip2 xz-utils patch python3 python3-pip python3-numpy python3-scipy python3-matplotlib environment-modulessource /etc/profile.d/modules.shgcc --versiong++ --versiongfortran --versionmodule --version

Ubuntu 22.04 通常提供 GCC 11 系列。VASP 5.4.4 和部分旧版数学库源码早于现代 GCC,因此后续会用到 -fallow-argument-mismatch,以兼容新版 gfortran 对旧 Fortran 参数接口的严格检查。

4. 源码编译 GNU 版 OpenMPI 4.1.4

OpenMPI 是整条依赖链的并行基础。后面的 ScaLAPACKFFTW(MPI) 和 VASP 都必须使用这里生成的 wrapper

4.1 配置与安装

cd /opt/softwaretar -xzf openmpi-4.1.4.tar.gzcd openmpi-4.1.4CC=gcc CXX=g++ FC=gfortran ./configure --prefix=/opt/GNU/openmpi/4.1.4make -j"$(nproc)"sudo make install

如果服务器已经安装 Slurm,并明确需要 OpenMPI 在构建时识别 Slurm,可在 configure 中增加 --with-slurm。若检查失败,先去掉该参数完成 OpenMPI 主体安装。VASP 能否在 Slurm 中运行,最终还取决于集群实际采用 srun 还是 mpirun 以及 PMI/PMIx 配置。

4.2 检查 wrapper 的底层编译器

/opt/GNU/openmpi/4.1.4/bin/mpicc --version/opt/GNU/openmpi/4.1.4/bin/mpif90 --version/opt/GNU/openmpi/4.1.4/bin/mpirun --version/opt/GNU/openmpi/4.1.4/bin/mpicc --show/opt/GNU/openmpi/4.1.4/bin/mpif90 --show

必须确认

mpicc --show 应指向 gccmpif90 --show 应指向 gfortran。若 wrapper 后端不是这套 GNU 编译器,后续依赖库即使能编译,也可能在 VASP 链接或运行时出现 ABI 混用。

5. 源码编译单线程 OpenBLAS

OpenBLAS 同时提供 BLAS 与 LAPACK 接口。VASP 常见运行方式是 MPI 多进程并行,因此建议把 OpenBLAS 编译为单线程版本,并在运行时设置 OMP_NUM_THREADS=1,避免每个 MPI 进程再次启动数学库线程。

cd /opt/softwaretar -xzf OpenBLAS-0.3.32.tar.gzcd OpenBLAS-0.3.32make -j"$(nproc)" USE_THREAD=0sudo make PREFIX=/opt/GNU/openblas USE_THREAD=0 installls -lh /opt/GNU/openblas/libls -lh /opt/GNU/openblas/include

安装后应至少能看到 libopenblas.a 或 libopenblas.so。本文后续让 BLAS 和 LAPACK 都指向 OpenBLAS,是因为 OpenBLAS 已包含常用 LAPACK 接口。

不要分两次执行不同参数的 make

如果先 make USE_THREAD=0,随后又执行没有 USE_THREAD=0 的 make -j,可能重新按默认选项构建。为了保证设置一致,应把 USE_THREAD=0 写在实际并行编译命令中。

6. 使用 GNU OpenMPI 编译 ScaLAPACK

ScaLAPACK 提供分布式并行线性代数功能。这里最重要的不是能生成 libscalapack.a”,而是它必须使用上一节安装的 OpenMPI wrapper,并链接同一套 OpenBLAS

cd /opt/softwaretar -xzf scalapack-2.1.0.tgzcd scalapack-2.1.0cp SLmake.inc.example SLmake.incvim SLmake.inc

将关键变量设置为:

FC = /opt/GNU/openmpi/4.1.4/bin/mpif90 -fallow-argument-mismatchCC = /opt/GNU/openmpi/4.1.4/bin/mpiccBLASLIB = /opt/GNU/openblas/lib/libopenblas.aLAPACKLIB = /opt/GNU/openblas/lib/libopenblas.a

makels -lh libscalapack.asudo mkdir -p /opt/GNU/scalapack/2.1.0/libsudo cp libscalapack.a /opt/GNU/scalapack/2.1.0/lib/ls -lh /opt/GNU/scalapack/2.1.0/lib/libscalapack.a

为什么推荐普通 make

旧版 ScaLAPACK 的依赖顺序和生成规则不一定适合激进并行编译。依赖库通常只需编译一次,优先保证结果稳定,比节省几分钟更重要。

7. 编译支持 MPI 的 FFTW 3.3.11

FFTW 必须显式启用 --enable-mpi,并使用本文的 OpenMPI mpicc。只有普通 libfftw3 而没有 libfftw3_mpi,不能满足本文的 VASP FFTW(MPI) 链接配置。

cd /opt/softwaretar -xzf fftw-3.3.11.tar.gzcd fftw-3.3.11CC=/opt/GNU/openmpi/4.1.4/bin/mpicc ./configure --prefix=/opt/GNU/fftw/3.3.11 --enable-mpimake -j"$(nproc)"sudo make install

ls -lh /opt/GNU/fftw/3.3.11/libls -lh /opt/GNU/fftw/3.3.11/includels /opt/GNU/fftw/3.3.11/lib | grep fftw3_mpi

正常应能找到 fftw3.hfftw3-mpi.h,以及 libfftw3 和 libfftw3_mpi。若缺少 MPI 库,通常是 configure 没有成功启用 MPI,或者使用了错误的 mpicc

8. 创建并验证统一 GNU 环境 modulefile

到这里,四个底层组件已经安装完成。不要继续依赖大量临时 export 命令,建议把路径统一封装为 Environment Modules 文件。

sudo tee /opt/modulefiles/gnu/vasp-env >/dev/null <<'EOF'#%Module1.0proc ModulesHelp { } {puts stderr "GNU environment for VASP: GCC, OpenMPI, OpenBLAS, ScaLAPACK, FFTW(MPI)"}module-whatis "GNU VASP build/runtime environment"setenv GNU_ROOT /opt/GNUsetenv MPI_HOME /opt/GNU/openmpi/4.1.4prepend-path PATH /opt/GNU/openmpi/4.1.4/binprepend-path LD_LIBRARY_PATH /opt/GNU/openmpi/4.1.4/libprepend-path LIBRARY_PATH /opt/GNU/openmpi/4.1.4/libprepend-path MANPATH /opt/GNU/openmpi/4.1.4/share/mansetenv OPENBLAS_ROOT /opt/GNU/openblasprepend-path LD_LIBRARY_PATH /opt/GNU/openblas/libprepend-path LIBRARY_PATH /opt/GNU/openblas/libprepend-path CPATH /opt/GNU/openblas/includesetenv SCALAPACK_ROOT /opt/GNU/scalapack/2.1.0prepend-path LD_LIBRARY_PATH /opt/GNU/scalapack/2.1.0/libprepend-path LIBRARY_PATH /opt/GNU/scalapack/2.1.0/libsetenv FFTW_ROOT /opt/GNU/fftw/3.3.11prepend-path LD_LIBRARY_PATH /opt/GNU/fftw/3.3.11/libprepend-path LIBRARY_PATH /opt/GNU/fftw/3.3.11/libprepend-path CPATH /opt/GNU/fftw/3.3.11/includesetenv OMP_NUM_THREADS 1EOF

8.1 加载并检查

source /etc/profile.d/modules.shmodule purgemodule use /opt/modulefilesmodule load gnu/vasp-envwhich mpiccwhich mpif90mpif90 --showecho "$MPI_HOME"echo "$OPENBLAS_ROOT"echo "$SCALAPACK_ROOT"echo "$FFTW_ROOT"

检查项

期望结果

which mpicc / mpif90

/opt/GNU/openmpi/4.1.4/bin 下的 wrapper

mpif90 --show

底层为 gfortran,且没有其他 MPI 路径混入

OPENBLAS_ROOT

/opt/GNU/openblas

SCALAPACK_ROOT

/opt/GNU/scalapack/2.1.0

9. 准备 VASP 源码并定位真正的根目录

cd /opt/softwaretar -xzf vasp.5.4.4.tar.gzfind /opt/software -maxdepth 4 -type f -name makefilefind /opt/software -maxdepth 4 -type d -name arch

不同来源的源码压缩包可能解压成一层或两层同名目录。真正的 VASP 根目录应同时包含 archsrcmakefile,通常还会有 bin 和 build。后文假设路径为 /opt/software/vasp.5.4.4;如果你的实际路径不同,请统一替换。

cd /opt/software/vasp.5.4.4ls期望看到:arch src makefile ...

10. 配置 makefile.include:完整 GNU 依赖链

先复制最接近 GNU/Linux 的模板,再改成明确的绝对路径。绝对路径虽然不够灵活,却更适合安装阶段排除环境变量干扰。

cd /opt/software/vasp.5.4.4cp arch/makefile.include.linux_gnu makefile.includecp makefile.include makefile.include.originalvim makefile.include

10.1 路径、预处理与编译器

OPENMPI_ROOT = /opt/GNU/openmpi/4.1.4OPENBLAS_ROOT = /opt/GNU/openblasSCALAPACK_ROOT = /opt/GNU/scalapack/2.1.0FFTW_ROOT = /opt/GNU/fftw/3.3.11CPP_OPTIONS = -DHOST="LinuxGNU" \-DMPI -DMPI_BLOCK=8000 -Duse_collective \-DscaLAPACK -DCACHE_SIZE=4000 \-Davoidalloc -Dtbdyn -Dfock_dblbuf \-DLAPACK36CPP = gcc -E -P -C -w $(CPP_OPTIONS) $*$(FUFFIX) > $*$(SUFFIX)FC = $(OPENMPI_ROOT)/bin/mpif90FCL = $(OPENMPI_ROOT)/bin/mpif90FREE = -ffree-form -ffree-line-length-noneFFLAGS = -w -ffpe-summary=none -fallow-argument-mismatchOFLAG = -O2OFLAG_IN = $(OFLAG)DEBUG = -O0

-fallow-argument-mismatch 用于兼容现代 gfortran 对旧代码参数接口的检查;-DLAPACK36 用于适配较新的 LAPACK 接口,避免部分环境出现 dgegv_ 链接错误。

10.2 内部库、解析器与 include 路径

CPP_LIB = $(CPP)FC_LIB = $(FC)CC_LIB = gccCFLAGS_LIB = -OFFLAGS_LIB = -O1FREE_LIB = $(FREE)OBJECTS_LIB = linpack_double.o getshmem.oCXX_PARS = g++LIBS += parserINCS = -I$(FFTW_ROOT)/include

getshmem.o 用于提供 VASP 5.4.4 可能需要的共享内存符号;parser 与 -lstdc++ 用于 LOCPROJ 等解析功能。

10.3 BLASScaLAPACK 与 FFTW 链接

BLAS = $(OPENBLAS_ROOT)/lib/libopenblas.aLAPACK =SCALAPACK = $(SCALAPACK_ROOT)/lib/libscalapack.aFFTW_LIB = -L$(FFTW_ROOT)/lib -lfftw3_mpi -lfftw3LLIBS = -Lparser -lparser -lstdc++LLIBS += $(SCALAPACK) $(LAPACK) $(BLAS)LLIBS += $(FFTW_LIB)LLIBS += -lm -ldl -lpthreadOBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.oOBJECTS_O1 += fftw3d.o fftmpiw.o fftmpi.oOBJECTS_O2 += fft3dlib.o

这份配置刻意不使用什么

不使用 -lscalapack-openmpi,不从 /usr/include 查找 FFTW,也不链接 apt 安装的 OpenBLAS。所有核心路径都指向 /opt/GNU,目的是让编译环境可追踪、可复现。

11. 编译 vasp_stdvasp_gam 与 vasp_ncl

VASP 5.4.4 的 Fortran 模块依赖较敏感。尤其在较新的 GNU make 和多核服务器上,直接 make -j 可能出现某个 .mod 尚未生成就被其他源文件引用。本文优先采用单进程编译。

11.1 清理环境与旧构建

module purgemodule use /opt/modulefilesmodule load gnu/vasp-envcd /opt/software/vasp.5.4.4unset MAKEFLAGSmake veryclean 2>/dev/null || truerm -rf build/std build/gam build/ncl build/lib build/parserrm -f bin/vasp_std bin/vasp_gam bin/vasp_ncl

11.2 按顺序编译三个版本

make std -j1 2>&1 | tee build_std.logmake gam -j1 2>&1 | tee build_gam.logmake ncl -j1 2>&1 | tee build_ncl.logls -lh bin/

正常应看到 vasp_stdvasp_gam 和 vasp_ncl。如果机器环境已经反复验证,可尝试小规模并行编译,但一旦出现 Cannot open module filebase.modprec.mod 或 mpimy.mod 等错误,应立即清理并改回 -j1

不要用 make -j all 作为第一次尝试

三个目标建议分开编译并分别保留日志。这样某一版本失败时,可以准确判断是通用依赖问题,还是 gam/ncl 特有的编译问题。

12. 安装目录、modulefile 与运行验收

12.1 复制最终可执行文件

sudo mkdir -p /opt/GNU/vasp/5.4.4/binsudo cp bin/vasp_std /opt/GNU/vasp/5.4.4/bin/sudo cp bin/vasp_gam /opt/GNU/vasp/5.4.4/bin/sudo cp bin/vasp_ncl /opt/GNU/vasp/5.4.4/bin/sudo chmod 755 /opt/GNU/vasp/5.4.4/bin/vasp_*ldd /opt/GNU/vasp/5.4.4/bin/vasp_std | grep "not found" || echo "runtime libraries OK"

12.2 创建 VASP modulefile

sudo tee /opt/modulefiles/gnu/vasp-5.4.4 >/dev/null <<'EOF'#%Module1.0proc ModulesHelp { } {puts stderr "GNU VASP 5.4.4 original environment"}module-whatis "GNU VASP 5.4.4 with OpenMPI, OpenBLAS, ScaLAPACK, FFTW(MPI)"module load gnu/vasp-envconflict vaspsetenv VASP_ROOT /opt/GNU/vasp/5.4.4setenv VASP_PP_PATH /opt/vasp/potentialssetenv PMG_VASP_PSP_DIR /opt/vasp/potentialssetenv OMP_NUM_THREADS 1prepend-path PATH /opt/GNU/vasp/5.4.4/binEOF

module purgemodule use /opt/modulefilesmodule load gnu/vasp-5.4.4which vasp_stdwhich mpirunls -lh "$VASP_ROOT/bin"ldd "$VASP_ROOT/bin/vasp_std" | grep "not found" || echo OK

modulefile 只负责把正确的软件与依赖放进当前 shell,不建议把固定进程数的 mpirun”写成全局 alias。运行时的进程数应由用户命令或 Slurm 资源申请决定。

13. 赝势库与 Si 最小测试算例

13.1 配置合法赝势库

sudo mkdir -p /opt/vasp/potentialscd /opt/vasp/potentialssudo tar -xzf /opt/software/potpaw_PBE.64.tgzfind /opt/vasp/potentials -maxdepth 3 \( -name POTCAR -o -name POTCAR.Z \) | head

为了让 VASPVASPKIT 和 pymatgen 使用统一路径,可把实际 PBE 目录链接为 /opt/vasp/potentials/paw_pbe

sudo ln -sfn /opt/vasp/potentials/potpaw_PBE /opt/vasp/potentials/paw_pbefind /opt/vasp/potentials/paw_pbe -maxdepth 2 \( -name POTCAR -o -name POTCAR.Z \) | head

VASP 不会自动替你选择 POTCAR

VASP 实际读取的是当前计算目录中的 POTCARVASP_PP_PATH 只是便于脚本或前处理工具定位赝势库。多元素体系必须按照 POSCAR 的元素顺序依次拼接 POTCAR

13.2 创建 Si 测试输入

mkdir -p ~/vasp_test/Sicd ~/vasp_test/Sicat > INCAR <<'EOF'SYSTEM = Si GNU testENCUT = 300EDIFF = 1E-5ISMEAR = 0SIGMA = 0.05IBRION = -1NSW = 0EOFcat > POSCAR <<'EOF'Si5.430.0 0.5 0.50.5 0.0 0.50.5 0.5 0.0Si2Direct0.00 0.00 0.000.25 0.25 0.25EOF

cat > KPOINTS <<'EOF'Automatic mesh0Gamma4 4 40 0 0EOF未压缩 POTCARcat /opt/vasp/potentials/paw_pbe/Si/POTCAR > POTCAR若赝势为 POTCAR.Z,则使用:# zcat /opt/vasp/potentials/paw_pbe/Si/POTCAR.Z > POTCAR

13.3 运行与检查

module purgemodule use /opt/modulefilesmodule load gnu/vasp-5.4.4export OMP_NUM_THREADS=1mpirun -np 4 vasp_std > vasp.outtail -n 40 vasp.outgrep "Voluntary context switches" OUTCAR

编译成功、程序能启动,并不等于安装已经完整验收。最小算例能够同时验证 MPI 启动、动态库、POTCAR、输入文件读取、电子迭代和正常结束。正式交付时应至少保留一份成功算例及运行日志。

14. 可选扩展:安装 VTST code 与 vtstscripts

VTST code 不是一个独立可执行程序,而是需要加入 VASP 源码树并重新编译。为了保留稳定的原版 VASP,绝对不要直接在已经验证成功的原版源码目录上覆盖修改。

14.1 解压 code 与 scripts

sudo mkdir -p /opt/vtstcd /opt/softwaresudo tar -xzf vtstcode-179.tgz -C /opt/vtstsudo tar -xzf vtstscripts.tgz -C /opt/vtstfind /opt/vtst -maxdepth 3 -type f \( -name neb.F -o -name chain.F -o -name nebmake.pl \)sudo chmod +x /opt/vtst/vtstscripts/* 2>/dev/null || true

如果解压后的目录名不同,可建立稳定软链接 /opt/vtst/vtstcode-179 和 /opt/vtst/vtstscripts,后续 modulefile 不必随版本目录变化。

14.2 复制独立的 VTST 源码树

cd /opt/softwarecp -a vasp.5.4.4 vasp.5.4.4-vtstcd vasp.5.4.4-vtstmake veryclean 2>/dev/null || truerm -rf build/std build/gam build/ncl build/lib build/parserrm -f bin/vasp_std bin/vasp_gam bin/vasp_ncl bin/vasp_VTSTcp /opt/software/vasp.5.4.4/makefile.include ./makefile.includecp -n src/main.F src/main.F.originalcp -n src/.objects src/.objects.originalcp /opt/vtst/vtstcode-179/* src/

最关键的原则

VTST 版继续使用已经验证成功的 GNU makefile.includeVTST patch 的处理逻辑与编译器无关,但最终构建不能混入 IntelAOCC 或另一套 MPI 的配置。

14.3 修改 main.F 与 .objects

不同 VTST/VASP 组合的补丁细节可能略有差异。对本文版本,CHAIN_FORCE 调用通常需要加入 TSIF 参数:

CALL CHAIN_FORCE(T_INFO%NIONS,DYN%POSION,TOTEN,TIFOR, &TSIF,LATT_CUR%A,LATT_CUR%B,IO%IU6)

同时在 src/.objects 中把 VTST 对象文件放在 chain.o 之前,例如:

bfgs.o dynmat.o instanton.o lbfgs.o sd.o cg.o dimer.o bbm.o fire.o lanczos.o neb.o qm.o opt.o chain.o

修改完成后应通过 grep 检查,而不是凭肉眼假设复制成功:

grep -n "CHAIN_FORCE" -A2 -B2 src/main.Fgrep -n -E "bfgs.o|neb.o|dimer.o|chain.o" src/.objects

14.4 编译、命名与安装

module purgemodule use /opt/modulefilesmodule load gnu/vasp-envcd /opt/software/vasp.5.4.4-vtstmake veryclean 2>/dev/null || truerm -rf build/std build/gam build/ncl build/lib build/parsermake std -j1 2>&1 | tee build_vtst_std.logcp bin/vasp_std bin/vasp_VTSTchmod +x bin/vasp_VTSTsudo mkdir -p /opt/GNU/vasp/5.4.4-vtst/binsudo cp bin/vasp_VTST /opt/GNU/vasp/5.4.4-vtst/bin/sudo chmod 755 /opt/GNU/vasp/5.4.4-vtst/bin/vasp_VTST

vasp_VTST 只是为了让用户一眼区分原版 std”已经应用 VTST patch 的 std”VASP 的默认 Makefile 不会自动生成这个名字。

14.5 VTST modulefile

sudo tee /opt/modulefiles/gnu/vasp-5.4.4-vtst >/dev/null <<'EOF'#%Module1.0module-whatis "GNU VASP 5.4.4 + VTST"module load gnu/vasp-envconflict vaspsetenv VASP_ROOT /opt/GNU/vasp/5.4.4-vtstsetenv VTST_SCRIPTS /opt/vtst/vtstscriptssetenv VASP_PP_PATH /opt/vasp/potentialssetenv PMG_VASP_PSP_DIR /opt/vasp/potentialssetenv OMP_NUM_THREADS 1prepend-path PATH /opt/GNU/vasp/5.4.4-vtst/binprepend-path PATH /opt/vtst/vtstscriptsEOF

module purgemodule use /opt/modulefilesmodule load gnu/vasp-5.4.4-vtstwhich vasp_VTSTwhich nebmake.plldd "$VASP_ROOT/bin/vasp_VTST" | grep "not found" || echo OK

15. 可选扩展:安装与配置 VASPKIT

VASPKIT 通常直接使用 Linux x64 二进制包,不需要参与 VASP 编译。它与 VASP 的联系是输入输出文件和赝势目录,而不是动态链接。

sudo mkdir -p /opt/vaspkitcd /opt/softwaresudo tar -xzf vaspkit.1.5.1.linux.x64.tar.gz -C /opt/vaspkitsudo ln -sfn /opt/vaspkit/vaspkit.1.5.1 /opt/vaspkit/latestsudo chmod -R a+rX /opt/vaspkitsudo chmod 755 /opt/vaspkit/latest/bin/vaspkit/opt/vaspkit/latest/bin/vaspkit

15.1 最小全局配置

sudo tee /etc/vaspkit >/dev/null <<'EOF'VASP5 .TRUE.POTCAR_TYPE PBEPBE_PATH /opt/vasp/potentials/paw_pbePYTHON_BIN /usr/bin/python3PLOT_MATPLOTLIB .FALSE.VASPKIT_UTILITIES_PATH /opt/vaspkit/latest/utilitiesADVANCED_USER .TRUE.SET_FERMI_ENERGY_ZERO .TRUE.GAMMA_CENTERED .TRUE.SYMPREC 1E-5EOF

PBE_PATH 必须指向解压后的实际赝势目录,不能写成 potpaw_PBE.64.tgz 压缩包路径。普通用户若需要个性化设置,可以复制 /etc/vaspkit 到 ~/.vaspkit 后自行修改。

15.2 modulefile

sudo tee /opt/modulefiles/vaspkit/1.5.1 >/dev/null <<'EOF'#%Module1.0module-whatis "VASPKIT 1.5.1 for VASP pre/post-processing"setenv VASPKIT_HOME /opt/vaspkit/latestprepend-path PATH /opt/vaspkit/latest/binprepend-path PATH /opt/vaspkit/latest/utilitiesEOFmodule use /opt/modulefilesmodule load vaspkit/1.5.1which vaspkitvaspkit

普通用户也要测试

root 能启动 VASPKIT,不代表普通用户一定能读取 /etc/vaspkit、赝势目录和 utilities。最终验收应切换普通账户,实际生成一次 POTCAR,并用 grep TITEL 检查元素顺序。

16. Slurm 作业脚本示例

 Slurm 集群中,srun 与 mpirun 的选择取决于 OpenMPI 与集群 PMI/PMIx 的实际配置。不要在同一个命令中混用 srun 和 mpirun。下面给出优先使用 srun 的基础模板:

#!/bin/bash#SBATCH -J vasp-test#SBATCH -N 1#SBATCH -n 16#SBATCH -p compute#SBATCH -o vasp.out#SBATCH -e vasp.errmodule purgemodule use /opt/modulefilesmodule load gnu/vasp-5.4.4export OMP_NUM_THREADS=1ulimit -s unlimitedsrun /opt/GNU/vasp/5.4.4/bin/vasp_std

若集群已经验证使用 mpirun,则把最后一行改为:

mpirun -np "$SLURM_NTASKS" /opt/GNU/vasp/5.4.4/bin/vasp_std

VTST 任务只需加载 gnu/vasp-5.4.4-vtst,并把可执行文件替换为 vasp_VTST。提交前应确认申请的任务数、节点数和 MPI 启动参数与集群策略一致。

17. 高频报错与排查顺序

现象

常见根因

优先处理

Cannot open module file *.mod

VASP 并行 make 导致 Fortran 模块顺序错误

清理 build 后使用 make std -j1

undefined reference to getshmem_C

OBJECTS_LIB 缺少 getshmem.o 或共享内存配置不匹配

检查 OBJECTS_LIB;必要时移除 -Duse_shmem

undefined reference to parse_file_C

parser 没有正确编译或链接

检查 CXX_PARSLIBS 与 -lparser -lstdc++

undefined reference to dgegv_

LAPACK 接口兼容问题

确认 CPP_OPTIONS 包含 -DLAPACK36

cannot find -lscalapack-openmpi

仍在链接系统 apt 库名

改为 /opt/GNU/.../libscalapack.a 的绝对路径

cannot find -lfftw3_mpi

FFTW 未启用 MPI或路径错误

检查 libfftw3_mpi;用本文 mpicc 重新 configure

root 用户 mpirun 被拒绝

OpenMPI 的安全限制

使用普通用户;仅临时验收加 --allow-run-as-root

VTST 的 CHAIN_FORCE 参数错误

main.F 未正确 patch 或版本不匹配

检查 TSIF 与 VTST code/VASP 版本

VASPKIT 找不到 POTCAR

PBE_PATH 指向压缩包或错误目录

指向实际 paw_pbe 目录并检查权限

17.1 建议的排查顺序

19.先执行 module purge,再只加载 gnu/vasp-env,排除旧环境污染。

20. whichmpif90 --show 和 echo 检查编译器、MPI 及四个 *_ROOT 路径。

21.确认依赖文件真实存在:libopenblaslibscalapacklibfftw3_mpi

22.检查 makefile.include 是否仍引用 /usr/lib、系统库名或另一套 MPI

23.删除 build/stdbuild/libbuild/parser 后单进程重编,不要只重复 make

24.查看第一条真正的编译或链接错误,不要只看日志最后一行。

25.编译通过后执行 ldd 与最小 Si 算例,区分编译成功和运行成功。

保存成功配置

安装完成后应备份 makefile.include、构建日志、modulefile 和测试算例。日后迁移同型号节点、排查环境变化或重新编译 VTST 时,这些文件比重新回忆安装过程更可靠。

18. 一键安装脚本应该具备哪些能力

真正可靠的一键脚本,不是简单把几十条命令按顺序拼起来,而是要在每一层失败时给出明确原因,并保证重复执行不会破坏已有环境。

能力

应完成的工作

前置检查

确认 root/管理员权限、安装包、磁盘空间、编译器和 module 命令

路径隔离

统一使用 /opt/GNU,拒绝静默链接系统版 MPI/数学库

依赖验证

构建后检查 wrapper 后端、静态/动态库和头文件

配置生成

按实际路径生成 makefile.include 与 modulefile,并保留备份

可重复执行

清理指定构建目录,不误删合法源码包、赝势或其他编译器版本

日志管理

为每个依赖和 VASP 目标保存独立日志,标记失败步骤

普通用户验收

使用非 root 账户加载 module,运行 MPI 最小算例

扩展选项

允许选择原版、VTSTVASPKIT、赝势配置与 Slurm 模板

我们的脚本会把经过验证的路径关系、编译选项和排错条件固化下来,并可提供远程安装服务。远程部署时,用户或课题组仍需自行提供合法的 VASP 源码与赝势;我们负责环境检查、依赖构建、VASP 编译、扩展配置、modulefile、测试与交付文档。

19. 最终验收清单

层级

验收内容

GNU 环境

mpicc/mpif90 来自 /opt/GNU/openmpimpif90 --show 的后端为 gfortran

数学库

OpenBLASScaLAPACKFFTW(MPI) 路径清晰,libfftw3_mpi 存在

VASP 原版

vasp_stdvasp_gamvasp_ncl 均存在且具有执行权限

动态库

ldd 不出现 not found;运行时不加载意外的系统 MPI

modulefile

普通用户可 module load gnu/vasp-5.4.4,并找到正确可执行文件

实际算例

Si 最小算例可并行运行并正常结束,OUTCAR/OSZICAR 完整

VTST(可选)

vasp_VTSTnebmake.pl 可找到,VTST 测试流程可启动

VASPKIT(可选)

普通用户能启动并从合法赝势目录生成正确 POTCAR

交付资料

保留配置、日志、modulefile、测试输入输出及使用说明

安装完成的标准

“make 没报错只是中间状态。只有编译器与依赖路径正确、三个程序可调用、动态库完整、普通用户能加载环境,并通过一个实际 MPI 算例,才能认为 VASP 安装真正完成。

结语

GNU 路线最大的优势是开放、可控,也便于针对不同 CPU 平台继续优化;它的难点则在于依赖层级更多,任何一处 MPI 或数学库混用都可能把错误推迟到 VASP 的最终链接阶段。把目录规划、工具链一致性、modulefile 和实际算例验收做好,安装过程就不再是反复试命令,而是一套可以复现和交付的工程流程。

后续的软件安装实战系列还可以沿用同一套结构,继续介绍 VASP 的 AMD AOCC/AOCL 路线,以及 CP2KLAMMPSGROMACSNAMDOpenFOAMYamboEPW 等科研软件的依赖规划、编译逻辑与集群交付。

对于不希望自行处理编译器、MPI、数学库、权限、Slurm 与多用户环境的用户,我们可基于合法软件包提供一键脚本或远程安装服务,并按环境可加载、程序可运行、算例可验证、文档可交付的标准完成部署。