排查

VASP 常见报错对照手册

按你看到的错误原文查。每条给三件事:这句话在说什么、为什么会出现、怎么改。能用一条命令确认的,我把命令写出来。

本页只是三本之一。全部条目(VASP 24 条、Gaussian 19 条、LAMMPS 16 条)汇总在 报错速查页,可以拿日志里那行字直接找。

用法:在终端里 grep -i error OUTCAR 或直接搜日志里的关键字,然后在本页按 Ctrl+F 粘进报错的前半句。症状对不上时,先看 算得慢的八项排查;机器规格够不够,看 内存估算器。

编译与链接

Error in opening the compiled module file

在说什么 编译器读不到或读到了过期的 .mod 接口文件。

为什么 改过源码、换过编译器版本、或之前编译中断过,src 目录里残留了旧模块。

怎么改 先 make clean 再 make all;如果还报,手工删掉 src 下所有 .mod 文件重编。不要只删中间目录。

undefined reference to `dgemm_'(或 zgemm_、daxpy_)

在说什么 链接阶段找不到 BLAS 里的函数实现。

为什么 库没链上,或链接顺序不对——静态链接时库必须放在目标文件之后,且依赖关系要从下层往上写。

怎么改 确认 ldconfig -p | grep blas 有实现;在 Makefile.include 里把 BLAS/LAPACK 放到 LIBM 之前、所有 .o 之后。

cannot find -lopenblas(或 -lfftw3、-lhdf5)

在说什么 链接器在默认搜索路径里找不到这个库。

为什么 库装在了非标准路径(如 /opt),或只装了运行时包没装开发包。

怎么改 装开发包(apt install libopenblas-dev / dnf install openblas-devel);非标准路径用 -L/opt/某路径/lib 加进 LDFLAGS。

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object

在说什么 用非位置无关的方式编译了要装进共享库的代码。

为什么 缺少 -fPIC,或链接时把静态对象混进了 .so。

怎么改 在 FLAGS/FFLAGS 里加 -fPIC 后 make clean && make all。

gfortran: error: unrecognized command line option '-mkl'

在说什么 用 GNU 编译器传了 Intel 专用的选项。

为什么 Makefile.include 是照 Intel 版本抄的,但用的是 gfortran;或者反过来。

怎么改 整套工具链必须一致:Intel 编译器配 Intel MKL 与 Intel MPI,gfortran 配 OpenBLAS 与 OpenMPI。混搭时换一份对应的 Makefile.include 模板。

数值与几何

LAPACK: Routine ZPOTRF failed! 1

在说什么 电子步计算里出现非正定的矩阵,多半是几何本身有问题。

为什么 两个原子靠得太近(重叠),或初始结构的对称性/坐标写错;也可能是 POSCAR 与 POTCAR 的元素顺序对不上。

怎么改 先看最短键长:任意两个原子间距 < 0.5 Å 基本就能确定;用可视化工具打开 CONTCAR 看一眼。修法是把结构先粗松弛一遍(POTIM=0.2, ISIF=2),或修正重叠原子。

ZBRENT: fatal: unable to find root

在说什么 离子步在能量面插值时找不到根。

为什么 POTIM 太大一步跨过了势垒;或初始结构离平衡位置太远;能量面本身不平滑。

怎么改 POTIM 降到 0.2~0.3,IBRION 保持 2;仍失败就先用共轭梯度(IBRION=1)走几步再切回。

Error EDDDAV: Call to ZHEGV failed

在说什么  Davidson 对角化失败,电子步走不下去。

为什么 常见三因:初始磁矩设置不当(MAGMOM 与该体系差太远)、结构重叠、ALGO=Fast/VeryFast 太激进。

怎么改 先换 ALGO=Normal 重跑;再把 AMIX=0.2、BMIX=0.0001 加上;磁性体系把 MAGMOM 设成合理的初值(如过渡金属 2~5 μB)。

BRMIX: very serious problems the old and new charge densities are not consistent

在说什么 电荷密度混合振荡,两次迭代差太多。

为什么 混合参数太激进,或体系本身接近简并(金属、强关联)。

怎么改 退化到保守设置:ALGO=Normal、AMIX=0.2、BMIX=0.0001、NELMDL=-6;金属体系可以先用 ISMEAR=1、SIGMA=0.2 跑稳再收紧。

sub-space matrix is not hermitian

在说什么 子空间矩阵失去了厄米性,通常来自并行分组或数值噪声。

为什么 KPAR/NCORE 的分组方式与 k 点分配冲突;极少见的情况是硬件(内存位翻转)。

怎么改 把 NCORE=1、KPAR=1 重跑同一算例。若正常,说明是并行配置问题,再逐步加回并行参数定位。

internal error in subroutine SGRCON(或 space group not found)

在说什么 对称性识别失败。

为什么 POSCAR 坐标的数值精度不够,导致本该等价的原子被判成不等价。

怎么改 提高 POSCAR 坐标位数(至少 10 位小数);或直接 ISYM=0 关掉对称性(代价是慢一些,但不会再因对称性失败)。

WARNING: DENTET: can't reach specified precision

在说什么 四面体法(ISMEAR=-5)的积分精度不够。

为什么 k 点网格太稀,或体系里有近简并能级。

怎么改 加大 k 网格;或改 ISMEAR=0 配 SIGMA=0.05。注意 ISMEAR=-5 也不能用于有离子步的计算。

Error reading WAVECAR / WAVECAR: inconsistent

在说什么 续算时波函数文件损坏或与当前设置不匹配。

为什么 上次任务被 kill 或磁盘写满,留下截断的文件;或 ENCUT/体系/核数变了。

怎么改 删掉 WAVECAR 用 ISTART=0 从头算;要续算就必须保证 ENCUT、体系、NBANDS 完全一致。

The number of bands (NBANDS) is not enough

在说什么 能带数不够容纳所有被占据态。

为什么 金属体系、加 U、或有未占据态需要时,默认 NBANDS 不够。

怎么改 NBANDS 提高 20~30%,金属体系再多给一些;用 grep NBANDS OUTCAR 看实际用了多少。

资源与并行

进程直接消失,日志没有报错,dmesg 里出现 Killed process ... (vasp)

在说什么 被内核 OOM killer 杀了——不是 VASP 的问题,是内存不够。

为什么 内存估小了。平面波 DFT 的内存随原子数、k 点数、NBANDS 增长,常见低估 3~4 倍。

怎么改 用 dmesg | grep -i "killed process" 确认;按 0.5~1 GB/原子估,或用站内的内存估算器重算;临时缓解可减 k 点并行、调 NCORE。

forrtl: severe (41): insufficient virtual memory(或 malloc failed)

在说什么 进程申请内存失败。

为什么 实际内存不够,或 ulimit 的栈/虚拟内存限制太低(常见于用 shell 脚本提交任务、没继承登录环境的 limits)。

怎么改 先 ulimit -s unlimited;再把任务提交脚本里补上同样的设置;硬件不够就换更大的规格。

No space left on device

在说什么 磁盘写满。

为什么 WAVECAR/CHGCAR 每步都写,几百原子体系一个 WAVECAR 就能几十 GB;scratch 目录放在系统盘上时尤其容易爆。

怎么改 关掉不必要的输出:LWAVE = .FALSE.、LCHARG = .FALSE.;scratch 挂到数据盘(df -h /scratch 确认)。

mpirun: command not found(或 mpif90 与 mpirun 版本不一致)

在说什么 MPI 环境没加载,或混用了两套 MPI。

为什么 VASP 用 OpenMPI 编译,运行时却调了 Intel MPI 的 mpirun(或反之)。

怎么改 which mpirun mpif90 看两者是否同一前缀;用 mpirun --version 与 mpif90 -show 交叉确认。

There are not enough slots available in the system

在说什么 申请的进程数超过了可用核数。

为什么 -np 写大了;或跨节点时没给 hostfile/机器列表,OpenMPI 只看到本机。

怎么改 按实际核数写 -np;跨节点用 --hostfile 或 --map-by node;单机超订(不推荐)才用 --oversubscribe。

多节点任务卡死、几十分钟没有一行输出

在说什么 跨节点通信没有真正建立起来。

为什么 NSIM/KPAR 的分组跨了节点;或节点间内网带宽不足;或节点上有一台已经挂了。

怎么改 跨节点时不要开 NSIM,KPAR 设成等于节点数或 1;先用 mpirun -np 2 hostname 验证两节点能通信,再跑真任务。

收敛与结果异常

电子步跑满 NELM 仍未收敛(OUTCAR 里没有 "aborting loop because EDIFF is reached")

在说什么 自洽迭代在限定步数内没收住。

为什么 初始电荷太差、混合参数不合适、体系接近简并、或 NELM 太小。

怎么改 NELM 提到 200;试 ALGO=Damped + AMIX=0.2 + BMIX=0.0001;金属先用 ISMEAR=1 起。

离子步力一直震荡、不判收敛

在说什么 几何优化在平衡位置附近来回摆。

为什么 EDIFFG 定得太严(比如 -0.001)、用了 ISMEAR=-5、或 POTIM 太大。

怎么改 EDIFFG 放到 -0.02(力判据);确认 ISMEAR 不是 -5;POTIM 0.3~0.5;这一步通常能立刻收敛。

续算后能量整体跳变、元素顺序不对劲

在说什么 POTCAR 的元素顺序与 POSCAR 不一致。

为什么 CONTCAR 里的元素顺序可能与原 POSCAR 相同,但拼 POTCAR 时顺序搞错了(尤其是有掺杂、替换原子的体系)。

怎么改 head -7 POSCAR 与 grep VRHFIN POTCAR 逐行对照,顺序必须完全一致;每次续算都核对一次。

能带/态密度算出来能隙明显不对

在说什么 非自洽步骤的设置与自洽步骤不一致。

为什么 ENCUT、k 点、ISMEAR 在两步之间被改了;或静态计算的 CHGCAR 来自不同结构。

怎么改 两步的 ENCUT/POTCAR/结构必须完全一致,只改 ISTART=1、ICHARG=11 与 k 点路径。

本页内容依据 VASP 官方 wiki 对各类报错的说明与常见原因,结合实操经验整理。不同版本(5.4 / 6.x)报错文本略有差异,请以你日志里的原文为准。

三条通用排错顺序

上面 24 条如果都对不上,按这个顺序走,能滤掉九成问题:

① 先看是"算错了"还是"算不动了"——进程还在跑但结果怪,属于数值问题;进程消失或卡死,属于资源与并行问题。
② 把并行降级重跑一次——NCORE=1、KPAR=1、单节点。如果降级后正常,问题在并行配置而不是物理设置。
③ 把体系缩小到 8 个原子再跑一次——小体系能过、大体系不能过,就是内存或标度问题。

配套阅读:核数与内存怎么定、从零编译 VASP、INCAR 检查器(先排除参数写错,再看报错)。