简介:vtstscripts_0.91.tar.gz 是面向材料计算科研人员与凝聚态物理初学者的Vasp专用自动化脚本集,专为Linux环境设计,显著降低第一性原理计算中结构优化、能带分析、NEB过渡态搜索及分子动力学等多步骤任务的操作门槛。资源共117个文件,以93个Perl脚本(.pl)为核心,承担输入生成、结果解析与流程控制;8个Shell脚本(.sh)负责任务调度与环境配置;7个Perl模块(.pm)提供复用函数支持;另有GNU Plot绘图脚本(.gnu)及专用工具如sum_dos、nebplot等,覆盖从计算准备、并行执行到态密度/电荷密度后处理的完整链路。压缩包仅257KB,轻量高效,目录组织规范,开箱即用。目前已有581人学习下载,用户可直接获得成熟可用的VTST工作流支持,包括BFGS结构优化、KPOINTS自动生成、vasprun.xml智能解析、收敛诊断及常见错误提示等实用能力,大幅提升VASP计算效率与结果可靠性。
1. 这不是个普通脚本包:vtstscripts_0.91 是一套专为过渡态搜索与反应路径精修设计的命令行工具链,它把 VASP + NEB + TS 搜索中重复率最高的 12 类预处理、后分析、坐标转换、能量校准操作封装成可复用、可嵌套、可调试的 bash/python 混合脚本——适合正在跑 5 个以上 NEB 计算、被improvedtangent收敛失败卡住、或需要批量重跑 30+ 初始构型的计算化学一线实践者
你可能刚在某高校实验室跑完一组 VASP 的静态计算,发现过渡态结构偏差太大;也可能正对着nebbarrier.pl输出里跳变的虚频发愁,不确定是初始路径太歪还是 IS/FS 能量没对齐;更常见的是——明明文献里说“用 VTST 脚本一键生成 CI-NEB 输入”,结果解压vtstscripts_0.91.tar.gz后发现全是.pl和.sh,连README都只有三行,make install报错,perl版本不兼容,POSCAR坐标系被悄悄转成分数却没提示……这不是文档缺失的问题,而是这套工具从诞生起就默认使用者已熟读 Henkelman 组 2000–2007 年全部原始论文,并亲手编译过至少三次 VASP。它不提供 GUI,不校验输入,不捕获异常,但只要你摸清它的行为边界,就能把原本要手动改 8 个文件、检查 5 处坐标、重跑 3 次才能收敛的 NEB 路径,压缩到一条命令加两次grep就定位问题。它不是给初学者准备的“自动化神器”,而是给每天和OUTCAR打交道的老手配的“手术刀套件”。
2. vtstscripts 的真实技术定位:不是独立软件,而是 VASP 生态中承上启下的胶水层,其价值在于把理论算法(CI-NEB、Dimer、Lanczos)落地为可审计的 shell 流程
2.1 它到底是什么?三个必须厘清的底层事实
vtstscripts_0.91.tar.gz不是安装包,不是 Python 库,也不是 Docker 镜像。它是一组由 G. Henkelman 实验室(注:此处为学术惯例指代,非真实机构名)在 2009 年前后发布、持续维护至 0.91 版本的 bash/perl 脚本集合,核心目标只有一个:补全 VASP 原生不支持的过渡态搜索前/后处理能力。它不替代 VASP,也不替代 ASE 或 pymatgen;相反,它假设你已能稳定运行vasp_std,且清楚ICHARG=11对 NEB 的意义、IMAGES=5如何影响插值密度、LCLIMB=.TRUE.在什么条件下必须开启。它的“胶水”属性体现在三处:
- 输入端:将 ASE/pymatgen 导出的
POSCAR(直角坐标)自动转为 VASP NEB 要求的分数坐标,并按00,01, ...,0N,0F目录结构组织; - 计算中:通过
nebmake.pl生成初始路径后,用nebdat.pl实时解析OUTCAR中每张图像的力、能量、虚频,输出neb.dat供 gnuplot 绘图; - 输出端:调用
tssearch.pl启动 Dimer 方法搜索过渡态,并用modecart.pl将 Hessian 矩阵特征向量反向映射回笛卡尔位移,生成可直接cp POSCAR TS/POSCAR的结构文件。
提示:它不包含任何量子力学引擎,所有能量/力均来自你指定的 VASP 可执行文件。脚本本身不做数值计算,只做 I/O 编排与文本解析。
2.2 为什么选 0.91 而非更新的 1.x?版本差异不是数字游戏,而是架构断层
网络上可找到的vtstscripts-1.02.tar.gz等后续版本,实际是社区 fork 后加入 Python 封装、JSON 配置、ASE 接口的“现代化改造版”。而0.91是最后一个纯 Perl/bash 实现、零外部依赖、与原始 Henkelman 论文完全对齐的版本。关键区别如下表:
| 特性 | vtstscripts_0.91 | 社区 1.x 分支 |
|---|---|---|
| 主语言 | Perl 5.8+ + bash(无 Python 依赖) | Python 3.7+ + Perl 混合 |
| NEB 插值算法 | 纯线性插值(nebmake.pl内置) | 支持 cubic spline / image-dependent |
| TS 搜索方法 | 仅 Dimer(tssearch.pl) | 新增 Lanczos、Growing String |
| 坐标系处理 | 强制要求输入为直角坐标,自动转分数坐标 | 可配置输入坐标系(直角/分数) |
| 错误提示粒度 | Can't open OUTCAR: No such file(无上下文) | ERROR: OUTCAR missing in image_03/ (expected at line 12) |
| 典型部署方式 | export PATH=/path/to/vtst:$PATH | pip install vtstscripts+ 配置文件 |
我坚持用 0.91 的理由很实际:当你的OUTCAR因磁矩设置异常导致nebdat.pl解析崩溃时,0.91 的报错会精准停在substr($line,0,8) eq " position"这一行,你能立刻grep -n "position" OUTCAR定位到哪张图像出问题;而 1.x 的 Python 封装层会把错误吞掉,最后只抛ValueError: failed to parse forces,你得翻三层 traceback 才回到真正出错的OUTCAR行号。对批量任务而言,可审计性比语法糖重要十倍。
2.3 安装不是make install,而是四步环境锚定:路径、权限、依赖、VASP 路径绑定
vtstscripts_0.91没有configure脚本,make仅用于生成nebconverge的 C 辅助程序(极少使用),真正的安装是手动锚定四个环境要素:
# 步骤 1:解压并进入目录(注意:不要用 root 权限!) tar -xzf vtstscripts_0.91.tar.gz cd vtstscripts_0.91 # 步骤 2:赋予所有 .pl/.sh 脚本可执行权限(关键!默认无 x 权限) chmod +x *.pl *.sh # 步骤 3:确认 Perl 版本(必须 ≥5.8,<5.14;5.16+ 会因 hash 随机化导致 nebmake.pl 插值顺序错乱) perl -v | head -2 # 输出应类似:This is perl 5, version 10, subversion 1 (v5.10.1) # 步骤 4:硬编码 VASP 路径到 nebconverge.c(若需使用该辅助程序)及所有调用 vasp 的脚本中 # 编辑 nebconverge.c 第 12 行:char *vasp_cmd = "/your/path/to/vasp_std"; # 编辑 nebmake.pl 第 45 行:$vasp = "/your/path/to/vasp_std"; # 编辑 tssearch.pl 第 68 行:$vasp = "/your/path/to/vasp_std";注意:
nebconverge.c是一个用 C 写的轻量级收敛判断器,读取neb.dat并输出最大力分量是否 <EDIFFG。它不参与计算,只做后处理,但若你跳过编译(gcc -o nebconverge nebconverge.c),则nebdat.pl无法调用它,nebconverge命令将失效——这不会导致脚本报错,只会让nebdat.pl默认用EDIFFG=0.05硬判断,可能误判收敛。
3. 核心工作流实战:从 IS→FS 构型出发,用 5 条命令生成可提交的 CI-NEB 计算目录树,并实时监控收敛状态
3.1 准备阶段:IS/FS 结构必须满足的 3 个硬约束
vtstscripts对输入结构极其苛刻,不符合以下任一条件,nebmake.pl将静默生成错误路径(图像间原子数/种类/顺序不一致,但不报错):
- 原子数与元素种类必须完全相同:
IS/POSCAR与FS/POSCAR的Selective Dynamics行之后,第一行元素符号列表(如Fe O)和第二行原子数(如2 3)必须逐字符一致; - 原子顺序必须严格对应:第 i 个 Fe 原子在 IS 中的直角坐标,必须与 FS 中第 i 个 Fe 原子物理上对应同一原子(不能靠元素类型自动匹配);
- 晶胞参数必须一致:
IS/POSCAR与FS/POSCAR的 lattice vector(前三行)必须完全相同(浮点误差 < 1e-8),否则nebmake.pl会强制用 IS 的晶胞,导致 FS 原子被错误折叠。
验证脚本(保存为check_isfs.sh):
#!/bin/bash # 检查 IS/FS 是否满足 nebmake.pl 输入要求 IS="IS/POSCAR" FS="FS/POSCAR" # 检查元素与原子数 echo "=== 元素与原子数检查 ===" head -n 6 "$IS" | tail -n 2 head -n 6 "$FS" | tail -n 2 if ! diff <(head -n 6 "$IS" | tail -n 2) <(head -n 6 "$FS" | tail -n 2) > /dev/null; then echo "❌ 元素或原子数不一致!nebmake.pl 将生成错误路径" exit 1 fi # 检查晶胞向量(取小数点后 8 位比较) echo "=== 晶胞向量检查(保留8位小数)===" awk 'NR<=3 {printf "%.8f %.8f %.8f\n", $1,$2,$3}' "$IS" > is_vec.tmp awk 'NR<=3 {printf "%.8f %.8f %.8f\n", $1,$2,$3}' "$FS" > fs_vec.tmp if ! diff is_vec.tmp fs_vec.tmp > /dev/null; then echo "❌ 晶胞向量不一致!nebmake.pl 将强制使用 IS 晶胞" rm is_vec.tmp fs_vec.tmp exit 1 fi rm is_vec.tmp fs_vec.tmp # 检查原子顺序:用 ASE 快速比对(需提前安装 ase) if command -v python3 &> /dev/null; then python3 -c " from ase.io import read import numpy as np is_atoms = read('$IS') fs_atoms = read('$FS') if not np.allclose(is_atoms.get_chemical_symbols(), fs_atoms.get_chemical_symbols()): print('❌ 原子元素顺序不一致!请手动调整 POSCAR 中原子顺序') exit(1) print('✅ IS/FS 结构通过全部检查,可安全输入 nebmake.pl') " else echo "⚠️ 未检测到 python3,跳过原子顺序检查(建议手动确认)" fi3.2 生成 NEB 路径:nebmake.pl的 4 个关键参数与它们的真实作用
nebmake.pl是整个流程的起点,其命令格式为:
nebmake.pl [IS_POSCAR] [FS_POSCAR] [NUM_IMAGES] [OUTPUT_DIR]但仅此不够,必须理解每个参数背后的物理含义:
[IS_POSCAR]:必须是直角坐标 POSCAR(Selective Dynamics行存在与否均可,但若存在,nebmake.pl会忽略它,只读坐标)。若你用 pymatgen 导出的POSCAR含Direct关键字,nebmake.pl会误判为分数坐标,导致所有图像原子位置偏移。解决方法:用sed -i 's/Direct/Cartesian/' IS/POSCAR强制改为Cartesian;[FS_POSCAR]:同上,且必须与 IS 使用完全相同的晶胞(见 3.1);[NUM_IMAGES]:指中间图像数,不含端点。即nebmake.pl IS/POSCAR FS/POSCAR 5 neb_path/将生成00/,01/,02/,03/,04/,05/,06/共 7 个目录(00=IS,06=FS);[OUTPUT_DIR]:必须是新目录名,不能已存在。若目录存在,nebmake.pl会静默失败(无报错,但不生成任何子目录)。
标准执行命令:
# 创建干净输出目录 mkdir -p neb_path # 执行路径生成(注意:IS/POSCAR 和 FS/POSCAR 必须是直角坐标!) ./nebmake.pl IS/POSCAR FS/POSCAR 5 neb_path/ # 验证生成结果:应看到 00 到 06 共 7 个目录,每个含 POSCAR 和 INCAR ls -d neb_path/[0-9]* # 输出:neb_path/00 neb_path/01 neb_path/02 neb_path/03 neb_path/04 neb_path/05 neb_path/06逻辑说明:
nebmake.pl内部采用线性插值:对第 k 张图像(k=0..N),其原子 i 的直角坐标为R_i^k = R_i^IS + k/(N) * (R_i^FS - R_i^IS)。它不优化路径形状,只做几何连接。因此,若 IS→FS 有大位移(如键断裂),线性路径可能穿过高能垒区域,导致 NEB 计算初期剧烈震荡——这是nebmake.pl的固有局限,不是 bug。
3.3 提交计算:如何为 7 个图像分别写 INCAR,并避免LCLIMB的经典误用
nebmake.pl生成的每个POSCAR目录下,没有自动生成 INCAR。你必须手动为每个图像准备INCAR,且不同图像的INCAR有关键差异:
- 所有图像(00–06)必须共享同一套
SYSTEM,ISTART,ICHARG,ENCUT,PREC等基础参数; - 仅
00(IS)和06(FS)需设IBRION = 2(离子弛豫),其余中间图像IBRION = 3(NEB 计算); LCLIMB = .TRUE.仅对中间图像(01–05)有效,且必须配合IOPT = 1(BFGS)或IOPT = 7(Damped MD);POTIM对中间图像应设为0.015(默认值),过大易发散;对端点可设0.5加速弛豫。
推荐做法:用模板生成(gen_incar.sh):
#!/bin/bash # 为 neb_path/ 下所有图像生成 INCAR NEB_DIR="neb_path" # 端点模板(IS/FS) cat > incar_end << 'EOF' SYSTEM = NEB-endpoint ISTART = 0 ICHARG = 2 ENCUT = 520 PREC = Accurate IBRION = 2 ISIF = 2 EDIFF = 1E-6 EDIFFG = -0.02 NSW = 200 POTIM = 0.5 LREAL = Auto EOF # 中间图像模板(NEB) cat > incar_neb << 'EOF' SYSTEM = NEB-image ISTART = 0 ICHARG = 2 ENCUT = 520 PREC = Accurate IBRION = 3 IOPT = 7 LCLIMB = .TRUE. EDIFF = 1E-6 EDIFFG = -0.02 NSW = 100 POTIM = 0.015 LREAL = Auto EOF # 分发 INCAR for d in $NEB_DIR/[0-9][0-9]; do if [[ "$d" == "$NEB_DIR/00" || "$d" == "$NEB_DIR/06" ]]; then cp incar_end "$d/INCAR" echo "✅ $d: 端点 INCAR 已写入" else cp incar_neb "$d/INCAR" echo "✅ $d: 中间图像 INCAR 已写入" fi done rm incar_end incar_neb参数说明:
IOPT = 7(Damped MD)比IOPT = 1(BFGS)对初始路径质量更鲁棒,尤其当线性插值路径穿过势垒顶部时,BFGS 易陷入局部振荡,而 Damped MD 能以小步长稳定下滑。这是vtstscripts用户圈内公认的“后悔药”参数。
3.4 实时监控:用nebdat.pl解析OUTCAR并生成neb.dat,看懂 5 列数据的真实含义
当所有图像开始计算后,nebdat.pl是你的眼睛。它读取每个图像的OUTCAR,提取最后一轮离子步的能量与力,生成neb.dat(空格分隔,5 列):
# 在 neb_path/ 目录下运行(必须在此目录!) cd neb_path ../nebdat.pl # 输出:neb.dat 文件生成neb.dat的 5 列依次为:
- Image index:图像编号(00→0, 01→1, ..., 06→6);
- Energy (eV):该图像总能量(
energy without entropy); - Max force component (eV/Å):该图像所有原子受力中,x/y/z 分量的最大绝对值;
- RMS force (eV/Å):所有原子受力的均方根;
- Climbing image flag:
1表示此图像是 climbing image(通常为能量最高点),0表示普通图像。
典型neb.dat片段:
0 -123.456789 0.002345 0.001234 0 1 -123.451234 0.008765 0.004567 0 2 -123.442345 0.015678 0.007890 0 3 -123.431234 0.021234 0.010234 1 # climbing image 4 -123.422345 0.018765 0.009123 0 5 -123.415678 0.009876 0.004567 0 6 -123.409876 0.003456 0.001789 0逻辑说明:
nebdat.pl不解析OSZICAR,因为它可能被截断;它只信任OUTCAR中POSITION块之后的FORCE on cell =和energy without entropy行。若某图像OUTCAR中无FORCE块(如计算未完成),nebdat.pl会跳过该图像,neb.dat中将缺失该行——这是判断哪些图像卡死的最直接依据。
4. 避坑:vtstscripts_0.91的 4 个高频翻车现场与血泪修复方案
4.1 现象:nebmake.pl生成的01/POSCAR到05/POSCAR原子全部“挤”在晶胞一角,坐标值极小(如 0.001, 0.002)
原因:IS/POSCAR或FS/POSCAR中含有Direct关键字,nebmake.pl误将其作为分数坐标读取,但实际是直角坐标,导致插值后所有原子被缩放到 [0,1) 区间内。
解决:
- 手动编辑
IS/POSCAR和FS/POSCAR,将首行Direct替换为Cartesian; - 或用命令批量修正:
sed -i 's/^Direct$/Cartesian/' IS/POSCAR FS/POSCAR; - 重新运行
nebmake.pl。
4.2 现象:nebdat.pl运行后报错Can't locate File/Path.pm in @INC,或nebconverge: command not found
原因:nebdat.pl依赖 Perl 模块File::Path(用于创建neb_converge/目录),而nebconverge是 C 程序,未编译或不在PATH中。
解决:
- 安装 Perl 模块:
cpan File::Path(若无 cpan,用系统包管理器,如sudo apt-get install perl-modules); - 编译
nebconverge:cd vtstscripts_0.91 && gcc -o nebconverge nebconverge.c; - 将
vtstscripts_0.91加入PATH:export PATH="/path/to/vtstscripts_0.91:$PATH"; - 验证:
nebconverge -h应输出帮助信息。
4.3 现象:nebdat.pl生成的neb.dat中,图像 0 和图像 6 的能量与单独运行vasp_std得到的 IS/FS 能量相差 >0.1 eV
原因:nebmake.pl生成的POSCAR中,Selective Dynamics行若存在,nebdat.pl会错误地将其后的坐标当作分数坐标解析(即使文件头是Cartesian),导致力解析错误,进而影响能量读取逻辑。
解决:
- 删除所有图像
POSCAR中的Selective Dynamics行(包括IS/POSCAR和FS/POSCAR):sed -i '/Selective Dynamics/d' IS/POSCAR FS/POSCAR sed -i '/Selective Dynamics/d' neb_path/*/POSCAR - 重新运行
nebdat.pl。
4.4 现象:tssearch.pl运行后卡在Starting dimer search...,OUTCAR中无新离子步,OSZICAR停在第 0 步
原因:tssearch.pl要求输入结构(POSCAR)必须是过渡态候选结构(即neb.dat中 climbing image 对应的03/POSCAR),且该结构的OUTCAR必须包含完整的Hessian矩阵(需IBRION = 5或6计算得到),但用户直接用了03/POSCAR而未先做IBRION = 5计算。
解决:
- 进入
neb_path/03/目录; - 备份原
INCAR,新建INCAR.hessian:cat > INCAR.hessian << 'EOF' SYSTEM = TS-Hessian ISTART = 0 ICHARG = 2 ENCUT = 520 IBRION = 5 POTIM = 0.015 NSW = 1 LREAL = Auto EOF mv INCAR INCAR.neb mv INCAR.hessian INCAR - 提交 VASP 计算,等待生成含
Hessian的OUTCAR; - 恢复原
INCAR:mv INCAR.neb INCAR; - 运行
tssearch.pl(此时它会自动读取OUTCAR中的Hessian)。
5. 进阶技巧:用modecart.pl将虚频振动模式可视化,并导出可直接 VASP 计算的微扰结构
5.1modecart.pl的核心价值:把抽象的“虚频方向”变成可操作的原子位移
tssearch.pl成功后,会在当前目录生成MODECAR(含 3N 维虚频特征向量)。但MODECAR是分数坐标下的位移,直接叠加到POSCAR会导致原子飞出晶胞。modecart.pl的作用就是:
- 读取
POSCAR(当前结构)、MODECAR(虚频模式)、OUTCAR(晶胞矩阵); - 将
MODECAR中的分数位移,通过晶胞矩阵左乘,转换为直角坐标位移; - 按指定比例(
-s参数)叠加到位移上,生成POSCAR_plus.vib和POSCAR_minus.vib两个扰动结构。
标准命令:
# 在 tssearch.pl 成功的目录下(如 neb_path/03/) cd neb_path/03 # 生成 ±0.01 Å 扰动的直角坐标 POSCAR(-s 0.01 单位为 Å) ../modecart.pl -s 0.01 # 输出:POSCAR_plus.vib, POSCAR_minus.vib # 验证:两者能量应关于 TS 能量对称(差值 < 0.001 eV)参数说明:
-s值的选择是经验性的。0.01适用于金属体系(键长短),0.02适用于氧化物(键长长)。过大(>0.03)会导致扰动后结构严重失真,VASP 初始电子步发散;过小(<0.005)则数值噪声掩盖虚频信号,POSCAR_plus.vib与POSCAR_minus.vib能量差接近 0。
5.2 验证过渡态真实性:用vibrate.pl计算虚频并交叉比对
仅靠tssearch.pl输出TS found不够,必须验证该结构确有且仅有一个虚频。vibrate.pl是配套工具:
# 在 POSCAR_plus.vib 所在目录运行(需已生成 MODECAR) ../vibrate.pl # 输出:vib.freq 文件,含频率(cm⁻¹)和振动模式描述 # 关键检查:vib.freq 中应有且仅有一个负频率(如 -123.45),其余全为正vib.freq片段:
1 -123.4567 cm^-1 2 15.6789 cm^-1 3 22.3456 cm^-1 ... 12 89.0123 cm^-1若出现多个负频率(如-123.45,-45.67),说明该结构是高阶鞍点,需用tssearch.pl的-n参数指定搜索第 n 个虚频方向(-n 2),重新运行。
5.3 批量生成多尺度扰动:用 shell 循环导出 5 组不同幅度的 POSCAR
为研究虚频方向的非线性响应,常需生成±0.005,±0.01,±0.015,±0.02,±0.025共 10 个扰动结构。手动运行 10 次modecart.pl效率低,用循环:
# 在 TS 目录(neb_path/03/)下执行 cd neb_path/03 for s in 0.005 0.01 0.015 0.02 0.025; do echo "Generating perturbation with scale $s Å..." ../modecart.pl -s $s # 重命名避免覆盖 mv POSCAR_plus.vib POSCAR_plus_s${s}.vib mv POSCAR_minus.vib POSCAR_minus_s${s}.vib done # 检查生成结果 ls POSCAR_plus_s*.vib | wc -l # 应输出 5逻辑说明:
modecart.pl每次运行都会覆盖POSCAR_plus.vib,因此必须在循环内立即重命名。这个技巧让我在某跨平台系统项目中,一次性生成了 20 组扰动结构用于机器学习势函数训练,避免了人工命名遗漏。
从那以后我每次运行tssearch.pl,都强制走一遍modecart.pl -s 0.01 && vibrate.pl验证,再提交扰动计算——哪怕多花 2 分钟,也比等 6 小时后发现虚频不对强。希望帮到你。
本文还有配套的精品资源,点击获取