ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

VASPKIT 配置与 VASP 输入检查:从赝势到能带避坑

VASPKIT 配置与 VASP 输入检查:从赝势到能带避坑

简介:这是一份面向材料计算与催化研究初学者的VASPKIT中文手册,聚焦VASP计算的预处理与后处理流程,帮助不熟悉第三方脚本的用户快速上手这一轻量工具。手册围绕输入文件生成与格式检查、结构对称性分析展开,并延伸到能带计算(PBE与HSE06)、分波与局域态密度、热力学量校正、差分电荷密度绘制、NEB路径生成与虚频校正、能带反折叠、3D能带与费米面计算,以及VASP2BoltzTraP接口等模块,还附带用户自定义界面与菜单功能说明,可作为日常查阅的操作索引。资源为1个PDF文件,压缩包约2.37MB,篇幅紧凑便于随查随用。目前已有3576人学习下载,适合材料科学与计算物理方向的研究生、科研人员按需检索具体功能的参数设置与处理思路。

1. VASPKIT 的价值不在「省事」:一个 5 MB 二进制为什么能拦下作废的计算

VASPKIT 中文手册里最容易被跳过的一节,是功能 109「检查所有 VASP 文件」。多数人默认 VASP 会自己发现错误,事实恰恰相反:拿石墨烯的结构配上氢的赝势照样能跑,跑到收敛也不报错,最后整条能带都是废的。这个 5 MB 的 Fortran 二进制,真正的作用不是让计算变快,而是把「提交之前就已经错了」这件事拦在门口。它覆盖的是 VASP 预-后处理的整条链路:INCAR/KPOINTS/POTCAR 的生成与格式纠正、高对称路径、态密度投影、能带反折叠,以及 3D 能带、费米面这类不画出来就看不懂的数据形态。搞懂它为什么这么切分,比记住菜单号有用得多。

2. ~/.vaspkit 配置:为什么工具的「性格」要写在文件里而不是命令行

VASPKIT 的交互非常轻:启动、给一个数字、回车。但真正的决策全部压在~/.vaspkit这一个文本文件里。这个设计不是偷懒,而是分工:环境相关的东西(VASP 是 4.x 还是 5.x、赝势库放在哪、默认泛函是 PBE 还是 LDA)几乎不变,任务相关的东西(这次算能带还是算 NEB)每次都变。把前者固化进配置文件,菜单才可能保持两层数字就能走完。

2.1 环境变量与可执行权限:第一次跑不起来的两个真实原因

配置的第一步是把模板复制到用户目录,这一步决定了后续所有功能能不能找到赝势。模板文件里每个键都有注释,改完下次启动生效,不需要重装。

# 把配置模板复制到用户家目录,之后所有任务都读这一份 cp -f how_to_set_environment_variable ~/.vaspkit vi ~/.vaspkit # 把 bin 目录挂进 PATH,之后任意目录下敲 vaspkit 都能起来 echo 'export PATH=/home/vaspkit.0.72/bin/:$PATH' >> ~/.bashrc source ~/.bashrc # 从压缩包解出来的二进制默认没有执行位,这一步漏了就是 Permission denied chmod u+x /home/vaspkit.0.72/bin/vaspkit

上面的路径要换成自己解压后bin目录的绝对路径。第三行是踩坑率最高的一条:压缩包解压后保留的权限位往往不含x,报错Permission denied时不用怀疑别的地方。另一个高频报错是version 'GLIBC_2.14' not found,这不是配置问题,是二进制编译时链接的运行库版本高于本机,硬升级系统库风险很大,通常的做法是换一个针对低版本环境编译的二进制。

2.2 四组开关:VASP5、赝势路径、泛函类型、推荐赝势

配置文件里真正影响结果的是这四组:

VASP5 .TRUE. # .FALSE. 表示 POSCAR 第 6 行不写元素名(VASP 4.x 格式) GGA_PATH '~/POTCAR/GGA' # GGA 赝势库目录 PBE_PATH '~/POTCAR/PBE' # PBE 赝势库目录 LDA_PATH '~/POTCAR/LDA' # LDA 赝势库目录 POTCAR_TYPE PBE # 三选一:PBE / GGA / LDA GW_POTCAR .FALSE. # 是否使用 GW 专用赝势 RECOMMENDED_POTCAR .TRUE. # 是否按官方推荐规则挑后缀 MINI_INCAR .FALSE. # 是否只写精简版 INCAR SET_FERMI_ENERGY_ZERO .TRUE. # 后处理时是否把费米能平移到 0 SET_INCAR_WRITE_MODE OVERRIDE # OVERRIDE / APPEND / BACK-UP-OLD / BACK-UP-NEW

VASP5这一项要特别注意:它不只影响生成,也影响读取。4.x 格式的 POSCAR 第六行没有元素名,程序只能靠 POTCAR 里的顺序去猜元素;一旦猜错,后面所有跟元素相关的操作(按元素投影、按元素求和)都会错位。POTCAR_TYPE和三个路径是联动的——选了 PBE 却把PBE_PATH指到一个空目录,表现是生成 POTCAR 时静默失败或者写出半截文件。

RECOMMENDED_POTCAR决定的是后缀策略。打开时,程序按官方的推荐表给每个元素挑一个最稳妥的赝势;关掉时,默认落到不带后缀的那一档,价电子数最少、截断能最低、算得最快。这个取舍在 3.2 节会展开讲,因为它直接关系到 Bader 电荷分析能不能做。

2.3 SET_INCAR_WRITE_MODE:覆盖、追加、备份三种写法的适用场景

这一项是全文最容易被忽略、又最容易造成不可逆损失的一行。四种模式的语义差别很大:

取值行为适用场景
OVERRIDE直接覆盖已有 INCAR全新任务目录,没有手调参数
APPEND新内容追加到原 INCAR 末尾已有基础参数,只想补几行
BACK-UP-OLD原文件改名备份,再写新文件有手调参数但想对比新旧模板
BACK-UP-NEW新内容写到INCAR.new,原文件不动保守做法,人工 diff 后自己合并

默认的OVERRIDE是最危险的一档。INCAR 模板只负责那些「通用且安全」的参数,而 DFT+U 的 U 值、NEB 的IMAGES、磁性体系的MAGMOM、LDIPOL这类东西模板根本不可能替你填,它们必然是手工加的。一次覆盖,之前所有手工调整全部清零,而 VASP 不会因此报错——它会用一套合理的默认值把任务跑完,结果和你预期差一个量级。血泪经验的结论很简单:只要目录里已经存在手工编辑过的 INCAR,就把这一项改成BACK-UP-OLD或BACK-UP-NEW。MINI_INCAR是另一个方向的选择,打开后只写必需参数,其余交给 VASP 默认,适合快速试探,不适合需要复现的生产计算。

3. 输入文件生成:K 点步长与赝势后缀背后的物理

功能 1 把 K 点、POTCAR、INCAR 的生成整合在一起,看起来只是省了几次手写,实际解决的是两个很容易做错的量化问题:K 点密度到底取多少,赝势后缀到底取哪个。

3.1 KPOINTS 与倒空间步长:ka≈kb≈kc 为什么在非正交体系里失效

常见做法是让「K 点数 × 对应晶格常数」在各个方向上都大于某个经验值,比如 20 Å。这个准则在立方晶系里没问题,但在六方、单斜、三斜体系里会翻车,因为倒格矢长度和晶格常数并不成反比关系——倒格矢 b_i = 2π(a_j × a_k)/V,晶格常数的相对大小和倒格矢的相对长短可以完全不同向。

VASPKIT 的做法换了个坐标系:不数 K 点,而是规定倒空间里的采样步长。给一个以 2π/Å 为单位的 resolution,程序先算出三个倒格矢的长度,再逐个方向除以这个步长取整:

N_i = max(1, round(|b_i| / δ)) # b_i 为第 i 个倒格矢,δ 为用户输入的 resolution

菜单里给出的经验区间是:0.06~0.04 偏粗,0.04~0.03 中等,0.02~0.01 精细,输入 0 则退化为 Gamma-Only。一般 0.04 已经够用。程序算出来的输出长这样:

K-Mesh Generated with KP-Resolved Value : 0.0400 Gamma 9 9 5 0.0 0.0 0.0

第一行说明用的是 Gamma 中心网格(不包含以原点为中心的偏移),第二行是三个方向的 K 点数,第三行是偏移量,全 0 表示 Gamma 中心。九、九、五这种极不整齐的数字正是步长法的特征:它在保证三个方向倒空间步长相等,而不是保证三个方向的点数成比例。对于六方体系,这正是想要的——沿 c 方向的倒格矢通常短得多,硬套 ka≈kb≈kc 会让 c 方向严重欠采样。

同一个功能在写 KPOINTS 的同时会顺手把 POTCAR 拼出来,前提是~/.vaspkit里的赝势路径是对的。输出里那句Written POTCAR File with the Recommended Potential!表示程序按推荐表挑的后缀;想自己指定,就走功能 104,逐个元素输入想要的赝势名(例如给 Zn 指定Zn_pv),目录里没有这个文件会要求重输。

截断能这一环经常被误解。模板生成的 INCAR 里ENCUT那一行往往是注释掉的,此时 VASP 自动取 POTCAR 里所有元素ENMAX的最大值。晶格优化任务(LR 模板)默认给PREC = High,VASP 会把这个最大值再乘 1.3。这个自动放大在早期很方便,但现在更推荐的做法是显式写PREC = Accurate并手工给一个ENCUT——理由是同一批计算之间截断能必须完全一致,靠自动推导很容易在换赝势之后悄悄变了数值,两次计算就不可比了。查看各元素ENMAX的办法很直接:

# 从 POTCAR 中提取每个元素的推荐截断能,用来人工设定统一的 ENCUT grep ENMAX POTCAR

输出的每一行对应一个元素,取其中最大值作为下限。手工设定的ENCUT只要大于这个下限就以手工值为准,小于则会触发 VASP 的警告甚至错误。

3.2 POTCAR 后缀:_pv、_sv、_d、_h 各自改变了什么

POTCAR 库里的同一个元素往往有多个版本,差别在于把多少个内层电子划进价电子。不带后缀的是标准版,_pv把 p 半芯态也算作价电子,_sv对应 s 半芯态,_d对应 d 半芯态,_h则是针对短键二聚体做过特殊处理的版本。

物理上,这么做的理由是:某些体系里次外层电子确实参与了成键,当成芯态处理会带来系统性偏差。代价是价电子数变多,平面波基组需要的截断能上升,计算量随之明显增大。所以这不是「越贵越好」的选择题,而是要针对具体分析目标:

  • 做 Bader 电荷分析时,用带_pv或_sv的赝势通常是必要的,因为电荷划分依赖价电子密度的空间分布细节;
  • 体系里存在 O₂、CO、N₂ 这类短键二聚体时,官方建议改用_h系列的 C、O、N、F、P、S、Cl;
  • 其余情况下用不带后缀的版本更划算。

实践中更稳的做法是拿两种赝势各算一遍你关心的那个量(比如吸附能、带隙),差异在误差范围内就用便宜的。反过来,直接默认用贵的那一档,等于平白多花几倍机时。

3.3 功能 108 与 109:把格式问题挡在提交之前

109 做两件事:格式纠正和元素比对。

格式纠正针对的是制表符和换行符。从数据库或表格软件导出的 POSCAR,字段之间可能是\t而不是空格,VASP 的读取逻辑遇到制表符会把它当成字符串的一部分,结果就是只读出了第一个元素、后面的全丢。表现非常直观:任务刚启动就报类型数量不一致,ERROR: the type information is not consistent with the number of types。同样的问题也会出现在 INCAR 里,而 Windows 下编辑过的文件还多一层 CRLF 换行的问题,报错位置会显得完全莫名其妙。109 会把这类字符统一成标准格式。

元素比对针对的是更隐蔽的一类错误:POSCAR 第六行的元素顺序和 POTCAR 里的顺序不一致。VASP 不做这个检查,它按位置对应,所以「结构是碳、赝势是氢」也能一路跑完并正常收敛,只是结果毫无意义。109 的输出会明确指出不一致:

All Files Needed Exist. Element type in POSCAR may be not corresponding to POTCAR POTCAR:Zn_pv POSCAR:Zn

这里Zn_pv与Zn的差异是后缀不同,属于可接受的情况;如果两边元素符号本身不同,就必须回头修。108 是把整条流水线串起来:先设 INCAR、再给 K 点密度生成 KPOINTS 和 POTCAR、最后自动调 109 检查。它对应的原则可以概括成一句话——提交之前先过一遍检查。

4. 能带与态密度:高对称路径是怎么来的,投影又是怎么加的

能带计算和普通自洽计算最大的区别在 KPOINTS:不能撒网格,必须沿着第一布里渊区内的一条或几条高对称路径取点。这一步传统上要去在线工具或商业软件里查高对称点坐标,再写脚本插值,换一个晶系就得重来一遍。

4.1 KPATH.in 与 PRIMCELL.vasp:路径只对原胞成立

功能 3 用一套与主流在线工具一致的对称性分析算法,自动找出晶体所属空间群和对应的高对称点,输出建议路径。使用 3D bulk 分支后,目录里会多出两个文件:KPATH.in和PRIMCELL.vasp。

KPATH.in的格式是这样的:

GAMMA X U|K GAMMA L W X 40 0.0000 0.0000 0.0000 0.5000 0.0000 0.5000 ...

第一行是路径上各高对称点的顺序,|表示路径在这里断开成两段独立区间;第二行的 40 是每一小段内部插值的 K 点数,这是最该关注的参数——默认值算不动时直接改小,不必怀疑别的地方;后面的行是高对称点在倒空间的坐标。

关键约束在PRIMCELL.vasp:高对称路径的定义只对原胞(primitive cell)成立。如果手里是惯用胞或者超胞,用它生成路径再算能带,得到的图在折叠关系上是错的。正确做法是把PRIMCELL.vasp换名成 POSCAR,用这个原胞重新做一遍结构优化和自洽,再算能带。这条规则不理解清楚,很容易出现「能带图看着挺像那么回事,但和文献对不上」的情况。

另外要注意适用范围:这套路径生成目前不支持三斜晶系,遇到三斜体系还是要回到外部工具;输出里的提示也建议拿在线工具交叉验证一遍,尤其是低对称体系。

4.2 HSE06 的路径采样:为什么杂化泛函不能直接套 PBE 的 KPOINTS

PBE 能带只要在高对称路径上取点,因为路径上的本征值只依赖该点的波函数。杂化泛函不一样:交换项里包含对全布里渊区的积分,需要一套足够密的均匀网格来算屏蔽,然后再在路径点上求解。直接把 PBE 的路径 KPOINTS 拿去做 HSE06,轻则收敛极慢,重则结果不可信。

新版支持的是沿不同 K 路径做均匀 K 点采样的方式,把路径计算和均匀采样这两件事在流程上分开处理。对使用者来说,实质差别在于:同一套 POSCAR,PBE 和 HSE06 需要各自生成 KPOINTS,不能复用。PBE 会低估带隙,HSE06 能修正这一点,但代价是机时成倍上升,所以常规流程是先 PBE 优化结构、拿到路径,再用 HSE06 只算路径上的点。

4.3 PDOS 投影求和:112 到 115 四层功能分别在加什么

VASP 输出的投影数据是按「每个原子 × 每个轨道」展开的。想知道某个吸附位点的 d 带中心,或者某个元素整体贡献了多少态,都得自己做加法。四个功能号对应四种加法粒度:

  • 112:指定一个或多个原子,输出这些原子的投影态密度;
  • 113:按元素聚合,一次拿到每种元素的总投影;
  • 114:对选定原子的投影做求和,得到「这几个原子作为一个整体」的曲线;
  • 115:原子和轨道双重限定后再求和,比如「Fe 的 d 轨道 + O 的 p 轨道」放在一起看杂化。

同样的四层结构也平行地存在于投影能带里(212/213/214/215 系列对应不同的投影方式)。这套编号逻辑值得记一下,因为它体现了设计者的意图:把「选谁」和「加什么」拆成两个独立维度,组合起来就覆盖了绝大多数分析需求,而不用为每种组合单独做一个菜单项。

这里有一类容易出错的细节:f 轨道参与投影时,轨道索引的排布和 d 轨道不同,早期版本在 f 轨道上有过提取错误,修复之后仍然建议对含镧系锕系的体系先拿一个简单例子验证一遍投影结果的总态密度是否与总 DOS 吻合。自旋极化计算中的带隙判定也踩过坑——上下自旋要分别找带顶和带底再取全局极值,直接取某一条自旋的差值会得到错误的带隙。

# 用投影数据做一次简单自检:把各分波相加,看是否逼近总态密度 awk 'NR>6 {tot+=$2; pdos+=$3+$4+$5} END {printf "total=%.4f sum_pd=%.4f\n", tot, pdos}' DOSCAR

这段 awk 的假设是 DOSCAR 第 2 列为总态密度、第 3 到 5 列为各分波列,实际列序随LORBIT设置变化,用之前先用head看一眼表头。逻辑说明:把总列和分波列分别累加,如果两者量级差得远,说明投影设置有误(常见原因是LORBIT没开或者RWIGS半径不合适),此时后面所有分波分析都没有意义。

5. 排查:五个让计算结果彻底作废的坑

5.1 POSCAR 里混进制表符,任务刚启动就失败

现象:提交后立刻退出,日志里写ERROR: the type information is not consistent with the number of types,看起来像是元素行写错了。

原因:文件来自数据库导出或表格软件,分隔符是\t。VASP 的字符串解析遇到制表符会连带把它读进元素名,导致后面的元素全部丢失。这个问题不限于 POSCAR,INCAR 同样会中招。

解决:跑一遍功能 109 做格式纠正,或者用sed -i 's/\t/ /g' POSCAR INCAR手工替换。养成习惯:任何外部来源的结构文件,进目录第一件事就是过一遍 109。

5.2 POSCAR 与 POTCAR 元素顺序不一致,跑得通但结果全错

现象:任务正常收敛,能量、力、能带都正常输出,但和同类体系对比时数值明显不对。

原因:VASP 按位置对应元素,不做符号校验。POSCAR 第六行写C而 POTCAR 里是H,它照样把氢的赝势套在碳的坐标上算完。

解决:功能 109 会打印POTCAR:和POSCAR:两行做对照,元素符号不一致就必须重做。手工指定赝势后(功能 104)尤其要复查一次,因为顺序是按输入顺序拼的。这是少数几个「不报错但结果废掉」的场景,也是最值得写进检查清单的一条。

5.3 在超胞上生成能带路径,折叠关系全错

现象:能带图形状和文献对不上,高对称点位置也有偏移,或者路径里的点数量和预期不符。

原因:路径生成针对原胞。手里是超胞或惯用胞时,倒空间已经被折叠,按它算出来的路径不是原始布里渊区里的那条。

解决:用生成出来的PRIMCELL.vasp替换 POSCAR 重新计算;如果研究对象本身必须是超胞(比如掺杂、缺陷、表面重构),那就不要指望普通能带,改用能带反折叠(功能 28),把超胞的能带按原胞的倒格矢展开回原始布里渊区。反折叠支持 DFT、杂化泛函和 Meta-GGA 级别,不含 GW。

5.4 后端赝势选错,Bader 分析没法做

现象:Bader 电荷划分出来的电荷数和形式价电子数对不上,或者划分过程直接失败。

原因:用了不带后缀的标准赝势,半芯态被划进芯电荷,价电子密度的空间分布不足以支撑划分。

解决:换成带_pv或_sv的赝势重算。注意换赝势之后ENMAX会变,ENCUT要跟着调整,且要把之前所有依赖截断能的结果重跑一遍,不能新旧混用。

5.5 二进制跑不起来,报错指向运行库或权限

现象:version 'GLIBC_2.14' not found或Permission denied。

原因:前者是本机运行库版本低于编译环境;后者是解压后丢了执行位。

解决:权限问题一句chmod u+x就够;运行库问题不建议动系统库,直接换一个针对低版本环境编译的二进制。这类问题在集群上尤其常见——登录节点能跑、计算节点跑不了,往往是两边的系统镜像版本不同,提交前先在计算节点上试一次。

6. 设计取舍:为什么它主动放弃了「做全」

把整个手册读下来,会发现 VASPKIT 有一条很清晰的边界:它只做「计算之前」和「计算之后」两端的翻译工作,绝不介入求解本身,也基本不做可视化。这个取舍值得单独想一想。

先看它放弃了什么。定位上,它是个命令行菜单工具,输入输出全是文本,画图和渲染交给外部工具;不自带图形界面,也就放弃了让新用户「点着用」的可能。实现上,用 Fortran 写成几乎不依赖外部库的静态风格二进制,体积压在 5 MB 量级,免安装、免编译,代价是很难像 Python 生态那样让用户写插件扩展。交互上,菜单号即 API——101、102、109、28 这些数字一旦发布就基本不能改,好处是脚本可以稳定调用,坏处是新用户必须翻手册才知道 507 是虚频校正。

再看它换回了什么。第一是可移植性,一个 5 MB 的二进制扔到任何 Linux 环境都能跑,不需要 conda、不需要编译链、不需要联网,这在超算环境里价值极高。第二是稳定性,功能不随第三方库版本漂移,同一份输入两年后得到同样的输出。第三是「不替你做物理判断」——它能自动检查格式、自动比对元素、自动按步长算 K 点,但它不会替你决定 U 值、不会自动调ENCUT、不会猜你要不要用_h赝势,所有物理参数都摆在那里等人填。这种克制看起来不够智能,实际上是负责任:物理参数一旦被自动填错,错误会被埋在结果里,比报错危险得多。

想验证这套设计的边界是否可靠,有个成本很低的方法:拿一个你已经算过、结果明确的体系,从零开始完整走一遍 108 到 109,对比生成的文件和你原来手工写的差在哪。差异清单本身就是最好的说明书——它告诉你在哪些环节 vaspkit 已经替你想过了,哪些环节必须自己负责。进阶方向可以顺着两条线走:一条是能带反折叠和 3D 能带这类需要重新理解数据结构的分析,另一条是用户自定义界面(功能 74)暴露出来的扩展点,适合想把它嵌进自己流水线的人。

从那以后我每次提交任务前都强制走一遍 108,哪怕是改一行 INCAR 的小任务——因为踩过太多次「跑完了才发现结构文件是错的」的坑,重算的机时远比检查的几秒钟贵。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进