xTB续算、输出隔离与外部驱动
实际演示xtbrestart复用、namespace、输出控制以及返回真实能量和完整梯度的driver接口。
阅读本篇目录
下载xTB操作、筛选和IFF完整输入与真实结果,保存为example.zip:
python3 -m zipfile -e example.zip .
cd xtb-operations-examples
bash results.sh
bash plot.sh
以上只读取参考数据并画图,不启动新计算。本组使用xTB6.7.1官方预编译x86_64程序,直接加载xtb/6.7.1模块,无需自己编译;实际运行每个进程使用1个CPU线程。完整输入在inputs/,原生文本结果在reference-results/,六份CSV在data/。独立提交模板为job.slurm,请在Slurm分配的资源中执行计算命令。
1. 单点续算需要真实的重启文件#
module load xtb/6.7.1
python3 run.py water-baseline
python3 run.py water-warm-restart
资料包先计算水分子的GFN2能量/梯度,再复制生成的xtbrestart进行下一次单点。核心命令:
xtb input.xyz --gfn 2 --restart --grad --json --parallel 1
相同结构下,本例续算与直接计算的能量、全部梯度一致到相应打印精度。--restart不会替你恢复MD的所有温度、速度或采样状态;更换模型/原子顺序时也不能随意沿用旧重启文件。
2. 用namespace隔离同一目录的输出#
python3 run.py water-namespace
ls work/water-namespace/sample.*
对应:
xtb input.xyz --gfn 2 --scc --namespace sample --json --parallel 1
本例输出sample.charges、sample.wbo、sample.xtbout.json和sample.xtbrestart,不再是无前缀的同名文件。不同任务仍建议用独立目录;namespace不能代替并发写文件管理。
--ceasefiles可减少不需要的文件,--define用于输入设置;本例--define正常结束却没有执行SCC总能计算,因此不能只看正常结束字样就把它算作电子计算。
python3 run.py water-suppressed
python3 run.py water-define
3. 外部driver怎么接能量和力#
父进程用:
xtb input.xyz --driver 'bash driver.sh' --grad --parallel 1
它写出xtbdriver.xyz,调用driver.sh,随后读取Turbomole格式的gradient。本例的完整脚本是:
#!/bin/bash
set -euo pipefail
mkdir -p native-engine
cp xtbdriver.xyz native-engine/input.xyz
(cd native-engine && xtb input.xyz --gfn 2 --grad --parallel 1 > engine.log 2>&1)
cp native-engine/gradient gradient
子目录内确实调用已有GFN2引擎计算,再把真实能量和完整梯度交回父进程,没有用解析假势替代。使用同一种方法是为了检查接口衔接,不能称为两个独立理论方法的准确性对比。
python3 run.py water-native-driver
cat data/restart-driver-comparison.csv

直接计算能量约−5.07054437565Eh,外部驱动约−5.07054437560Eh,差约5×10⁻¹¹Eh;返回的全部梯度分量在打印精度下一致。坐标、能量、梯度的单位分别是Bohr、Eh、Eh/Bohr,不能把Å坐标或相反符号的力直接写成梯度。
4. 给自己的工作流使用#
# Slurm资源内,依次运行可用小例
python3 run.py
# 读取自己刚生成的输出
python3 read.py work
脚本保留已存在目录,不会覆盖上一次未完成运行。--gmd和--siman在本二进制中均报无效runtyp,已作为版本边界保存;默认脚本跳过它们。接ORCA、TURBOMOLE或MOPAC时,还需分别准备真实软件、配置和格式,不能仅替换driver名字就假定可用。