1. 为什么 2024 年重装 VASP 6.3.2 会卡在编译这一步
如果你在 2023 年跟着老教程装过 VASP 6.3.2,2024 年再照做大概率会在make all阶段翻车。原因不复杂:Intel 在 2024 版 OneAPI 里把编译器前端从icc/icpc换成了icx/icpx,ifort虽然还在但默认行为有调整,MKL 里fftw3xf的接口目录也挪了位置。老makefile.include里写死的CC_LIB = icc会直接报 command not found,或者链接阶段找不到libmkl_blacs_intelmpi_ilp64.so.2。
这篇是续篇,假设你已经装好了 Ubuntu(物理机或 WSL2 都行)、装好了 2024 版 Intel OneAPI 的 Base Toolkit 和 HPC Toolkit、也拿到了vasp.6.3.2.tgz。我要交付的是三样东西:一份能直接复制的makefile.include骨架、一组环境变量配置、以及一次完整的运行测试验证动作。目标很明确——让你确认编译出来的vasp_std真的能跑,而不是编译完就扔那儿。
适合谁看:已经装完基础环境、卡在编译或运行测试环节的科研用户。如果你连 OneAPI 都还没装,先去把 Base Toolkit 和 HPC Toolkit 装完再回来,那部分不是本篇重点。
先说结论:2024 版 OneAPI 下 VASP 6.3.2 能编过,但需要改三处——编译器变量、FFTW 接口路径、以及运行时的动态库路径。下面按顺序来。
2. 编译前的环境确认与 TaoToken 前置说明
在动makefile.include之前,先确认 OneAPI 环境变量能正常加载。这一步很多人跳过,结果后面报错找不到icx,又回头查半天。
source /opt/intel/oneapi/setvars.sh which icx which icpx which ifort which mpirun echo $MKLROOT四条which都要返回具体路径,MKLROOT要指向/opt/intel/oneapi/mkl/2024.x。如果mpirun没返回,说明 HPC Toolkit 的 MPI 没进 PATH,后面单独处理。
这里插一句关于 TaoToken 的位置。VASP 编译本身是纯本地计算,不依赖任何在线服务。但编译过程中如果遇到报错想快速查资料、或者想把 INCAR 参数、KPOINTS 设置拿去和模型对话确认,可以用 TaoToken 的模型对话入口做辅助排查。它的 API 地址是 https://taotoken.net/api ,模型对话 deep link 是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model_chat 。注意这是辅助查资料用的,不是编译依赖,别搞混。
如果你后面要长期跑 VASP 任务、写脚本做批量提交,或者用 Agent 类工具管理计算流程,可以看 Coding Plan: https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding_plan 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc ,API Keys 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api_keys 。这些是给后续工作流用的,编译阶段用不上。
回到编译。确认环境没问题后,先编译 MKL 的 FFTW 接口,这是 2024 版最容易踩的坑。
3. 可复制的 makefile.include 骨架与 FFTW 接口编译
3.1 先编 libintel64
2024 版 OneAPI 的fftw3xf目录变了,老教程里的路径找不到。实际位置在:
/opt/intel/oneapi/mkl/2024.0/share/mkl/interfaces/fftw3xf如果你的 OneAPI 装在 home 目录下,就是~/intel/oneapi/mkl/2024.0/share/mkl/interfaces/fftw3xf。cd 进去之后:
cd /opt/intel/oneapi/mkl/2024.0/share/mkl/interfaces/fftw3xf source /opt/intel/oneapi/setvars.sh make libintel64成功后当前目录会出现libfftw3xf_intel.a。这个文件后面链接要用,记下路径。
3.2 解压与复制模板
tar -zxvf vasp.6.3.2.tgz cd vasp.6.3.2 cp arch/makefile.include.intel makefile.include3.3 修改 makefile.include
用 vim 打开makefile.include,重点改这几处。2024 版必须把icc/icpc换成icx/icpx:
# 预编译头与编译器 CPP_OPTIONS = -DHOST=\"LinuxIFC\" -DMPI -DMPI_BLOCK=8000 -Duse_collective \ -DscaLAPACK -Duse_shmem -DNGZhalf -DCACHE_SIZE=4000 \ -Davoidalloc -Duse_bse_te -Dtbdyn -Dfock_dblbuf CPP = icpx -E -P -C -w FC = mpif90 -m64 -I/opt/intel/oneapi/mkl/2024.0/include/fftw FCL = mpif90 -m64 -I/opt/intel/oneapi/mkl/2024.0/include/fftw # 关键:2024 版用 icx/icpx CC_LIB = icx CXX_PARS = icpx # 链接库 MKL_PATH = /opt/intel/oneapi/mkl/2024.0/lib/intel64 BLAS = -L$(MKL_PATH) -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core LAPACK = -L$(MKL_PATH) -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core BLACS = -L$(MKL_PATH) -lmkl_blacs_intelmpi_lp64 SCALAPACK = -L$(MKL_PATH) -lmkl_scalapack_lp64 # FFTW 接口指向刚编出来的 .a FFTW = /opt/intel/oneapi/mkl/2024.0/share/mkl/interfaces/fftw3xf/libfftw3xf_intel.a # 链接选项 LIB = -L$(MKL_PATH) -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core \ -lmkl_blacs_intelmpi_lp64 -lmkl_scalapack_lp64 -lpthread -lm注意FFTW那一行,直接指向你刚编出来的.a文件绝对路径,比用-lfftw3xf_intel更稳,避免链接器找不到。
3.4 编译
source /opt/intel/oneapi/setvars.sh make all正常耗时 20 到 40 分钟,取决于机器。如果两分钟就结束,基本可以判定编译失败或跳过了大部分目标,去bin/目录看有没有vasp_std。
编译完成后:
ls bin/ # 应该看到 vasp_std vasp_gam vasp_ncl4. 运行测试:用 benchmark 验证 vasp_std 可用
编译产物存在不等于能跑。必须做一次真实计算验证。
4.1 准备测试目录
mkdir -p ~/vasp_workfile cd ~/vasp_workfile # 把 benchmark 测试包放进来,解压 tar -zxvf vasp_workfile.tar.gz cd benchmark.Hg目录里会有IN-short和IN-long,分别是短任务和长任务的 INCAR。先用短的:
mv IN-short INCAR4.2 配置运行环境
在~/.bashrc末尾追加,解决mpirun和动态库找不到的问题:
export PATH=$PATH:/opt/intel/oneapi/mpi/2021.11/bin export PATH=$PATH:/opt/intel/oneapi/mkl/2024.0/lib export PATH=$PATH:$HOME/vasp.6.3.2/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/oneapi/mkl/2024.0/lib/intel64然后:
source ~/.bashrc4.3 执行测试
mpirun -np 2 vasp_std用 2 个核心跑。跑完后检查OUTCAR:
grep "General timing" OUTCAR grep "reached required accuracy" OUTCAR tail -20 OUTCAR如果看到General timing and accounting informations for this run且没有Error字样,说明编译产物可用。OSZICAR里应该有能量收敛的迭代记录。
4.4 成功标志对照
| 检查项 | 正常表现 | 异常表现 |
|---|---|---|
| OUTCAR 末尾 | 有 timing 信息 | 中途中断无 timing |
| OSZICAR | 有电子步迭代 | 空文件或报错 |
| 进程退出码 | 0 | 非 0 |
| 运行时长 | 数分钟 | 秒退 |
5. 本篇常见错误排查
5.1 mpirun not found
普通用户调用mpirun报找不到,原因是 MPI 的 bin 目录没进 PATH。确认路径:
ls /opt/intel/oneapi/mpi/2021.11/bin/mpirun然后在~/.bashrc加:
export PATH=$PATH:/opt/intel/oneapi/mpi/2021.11/bin source ~/.bashrc5.2 libmkl_blacs_intelmpi_ilp64.so.2 未找到
运行时报这个,说明动态库路径没配。该文件在/opt/intel/oneapi/mkl/2024.0/lib/intel64。在~/.bashrc加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/oneapi/mkl/2024.0/lib/intel64注意是LD_LIBRARY_PATH不是PATH,这两个别写混。
5.3 vasp_std not found
编译产物在vasp.6.3.2/bin/下,但该目录没进 PATH。加:
export PATH=$PATH:$HOME/vasp.6.3.2/bin如果你把 VASP 装在别的位置,换成实际路径。
5.4 编译报 icc command not found
说明makefile.include里还留着CC_LIB = icc。2024 版 OneAPI 已移除 icc,改成icx。同理CXX_PARS改成icpx。
5.5 链接阶段报 fftw3xf 相关 undefined reference
FFTW变量没指向正确的.a文件。回到 3.1 确认libfftw3xf_intel.a生成位置,把绝对路径写进makefile.include。
5.6 运行测试秒退
先看OUTCAR最后几行,通常是 POTCAR 路径不对或 INCAR 参数不兼容。benchmark 包里的 INCAR 是配好 POTCAR 的,确认POTCAR文件存在且元素顺序和POSCAR一致。
6. 后续工作流与接入入口
编译和测试跑通之后,日常用 VASP 更多是批量提交、参数扫描、结果整理。这部分如果想让模型辅助生成提交脚本、解析 OUTCAR、或者做 INCAR 参数对比,可以用 TaoToken 的模型对话: https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model_chat 。API 接入地址是 https://taotoken.net/api ,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc 。
如果你要长期做计算流程自动化、写 Agent 管理任务队列,Coding Plan 更适合: https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding_plan 。API Keys 在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api_keys 管理。
最后提醒一个实测经验:WSL2 下跑 VASP,mpirun -np的核心数不要超过 WSL 分配的逻辑核数,否则会卡在 MPI 初始化。物理机同理,-np超过物理核数性能反而下降。跑 benchmark 用 2 核验证功能就够,正式计算再按机器配置调。