软件安装实战系列· 03
Ubuntu 22.04 + GCC/GFortran + OpenMPI + OpenBLAS + ScaLAPACK + FFTW(MPI)
从依赖库源码编译、VASP 三版本构建,到 VTST、VASPKIT 与集群验收
适用系统 | Ubuntu 22.04 LTS(Ubuntu 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 |
文章定位 | 可复现教程 + 工程化环境管理与故障排查 |
云算科技
高性能计算|科研服务|软件支持
版本:2026年7月
写在前面
使用 GNU 编译器安装 VASP,看起来比 Intel oneAPI 路线“更自由”:编译器、MPI、BLAS/LAPACK、ScaLAPACK 和 FFTW 都可以自行选择。但自由也意味着每一层依赖都要由安装者负责。一旦 OpenMPI 的底层编译器、ScaLAPACK 的 MPI wrapper、FFTW 的 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 路线:VASP、VTST、VASPKIT 分别是什么
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_std、vasp_gam、vasp_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 源码加入 NEB、dimer、优化器等扩展,需要复制源码并重新编译 |
vtstscripts | 否 | NEB 路径生成与分析脚本,加入 PATH 即可 |
VASPKIT | 否 | 读取或生成 POSCAR、POTCAR、KPOINTS、DOS/能带等文件,通常直接使用二进制包 |
赝势库 | 否 | 为每个计算目录生成 POTCAR,也可供 VASPKIT 调用 |
本文的核心原则是:编译依赖库全部来自同一条 GNU 工具链。OpenMPI 必须由 gcc/g++/gfortran 编译;ScaLAPACK 必须使用这套 OpenMPI 提供的 mpicc/mpif90;FFTW 的 MPI 接口也必须由同一套 OpenMPI 编译。
为什么不直接 apt install 一切 apt 安装并非不能使用,但系统库的版本、编译器和 MPI 实现未必与本文一致。为了让路径可控、便于复现和后续维护,本文把 OpenMPI、OpenBLAS、ScaLAPACK 与 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 |
目录规划不是形式工作 独立目录可以避免把系统库和自编译库混在一起,也便于同时保留原版 VASP、VTST 版 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 是整条依赖链的并行基础。后面的 ScaLAPACK、FFTW(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 应指向 gcc,mpif90 --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.h、fftw3-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 根目录应同时包含 arch、src、makefile,通常还会有 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 BLAS、ScaLAPACK 与 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_std、vasp_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_std、vasp_gam 和 vasp_ncl。如果机器环境已经反复验证,可尝试小规模并行编译,但一旦出现 Cannot open module file、base.mod、prec.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 |
为了让 VASP、VASPKIT 和 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 实际读取的是当前计算目录中的 POTCAR。VASP_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.include。VTST patch 的处理逻辑与编译器无关,但最终构建不能混入 Intel、AOCC 或另一套 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_PARS、LIBS 与 -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.用 which、mpif90 --show 和 echo 检查编译器、MPI 及四个 *_ROOT 路径。
21.确认依赖文件真实存在:libopenblas、libscalapack、libfftw3_mpi。
22.检查 makefile.include 是否仍引用 /usr/lib、系统库名或另一套 MPI。
23.删除 build/std、build/lib、build/parser 后单进程重编,不要只重复 make。
24.查看第一条真正的编译或链接错误,不要只看日志最后一行。
25.编译通过后执行 ldd 与最小 Si 算例,区分编译成功和运行成功。
保存成功配置 安装完成后应备份 makefile.include、构建日志、modulefile 和测试算例。日后迁移同型号节点、排查环境变化或重新编译 VTST 时,这些文件比重新回忆安装过程更可靠。 |
18. 一键安装脚本应该具备哪些能力
真正可靠的一键脚本,不是简单把几十条命令按顺序拼起来,而是要在每一层失败时给出明确原因,并保证重复执行不会破坏已有环境。
能力 | 应完成的工作 |
前置检查 | 确认 root/管理员权限、安装包、磁盘空间、编译器和 module 命令 |
路径隔离 | 统一使用 /opt/GNU,拒绝静默链接系统版 MPI/数学库 |
依赖验证 | 构建后检查 wrapper 后端、静态/动态库和头文件 |
配置生成 | 按实际路径生成 makefile.include 与 modulefile,并保留备份 |
可重复执行 | 清理指定构建目录,不误删合法源码包、赝势或其他编译器版本 |
日志管理 | 为每个依赖和 VASP 目标保存独立日志,标记失败步骤 |
普通用户验收 | 使用非 root 账户加载 module,运行 MPI 最小算例 |
扩展选项 | 允许选择原版、VTST、VASPKIT、赝势配置与 Slurm 模板 |
我们的脚本会把经过验证的路径关系、编译选项和排错条件固化下来,并可提供远程安装服务。远程部署时,用户或课题组仍需自行提供合法的 VASP 源码与赝势;我们负责环境检查、依赖构建、VASP 编译、扩展配置、modulefile、测试与交付文档。
19. 最终验收清单
层级 | 验收内容 |
GNU 环境 | mpicc/mpif90 来自 /opt/GNU/openmpi;mpif90 --show 的后端为 gfortran |
数学库 | OpenBLAS、ScaLAPACK、FFTW(MPI) 路径清晰,libfftw3_mpi 存在 |
VASP 原版 | vasp_std、vasp_gam、vasp_ncl 均存在且具有执行权限 |
动态库 | ldd 不出现 not found;运行时不加载意外的系统 MPI |
modulefile | 普通用户可 module load gnu/vasp-5.4.4,并找到正确可执行文件 |
实际算例 | Si 最小算例可并行运行并正常结束,OUTCAR/OSZICAR 完整 |
VTST(可选) | vasp_VTST、nebmake.pl 可找到,VTST 测试流程可启动 |
VASPKIT(可选) | 普通用户能启动并从合法赝势目录生成正确 POTCAR |
交付资料 | 保留配置、日志、modulefile、测试输入输出及使用说明 |
安装完成的标准 “make 没报错”只是中间状态。只有编译器与依赖路径正确、三个程序可调用、动态库完整、普通用户能加载环境,并通过一个实际 MPI 算例,才能认为 VASP 安装真正完成。 |
结语
GNU 路线最大的优势是开放、可控,也便于针对不同 CPU 平台继续优化;它的难点则在于依赖层级更多,任何一处 MPI 或数学库混用都可能把错误推迟到 VASP 的最终链接阶段。把目录规划、工具链一致性、modulefile 和实际算例验收做好,安装过程就不再是“反复试命令”,而是一套可以复现和交付的工程流程。
后续的软件安装实战系列还可以沿用同一套结构,继续介绍 VASP 的 AMD AOCC/AOCL 路线,以及 CP2K、LAMMPS、GROMACS、NAMD、OpenFOAM、Yambo、EPW 等科研软件的依赖规划、编译逻辑与集群交付。
对于不希望自行处理编译器、MPI、数学库、权限、Slurm 与多用户环境的用户,我们可基于合法软件包提供一键脚本或远程安装服务,并按“环境可加载、程序可运行、算例可验证、文档可交付”的标准完成部署。

夜雨聆风