VTST轨迹抽帧与结构动画
用真实H2约束轨迹,演示XDATCAR单帧和连续抽帧、XYZ转换、文件拆分及旧脚本格式要求。
阅读本篇目录
VASP的XDATCAR保存结构序列。先把所需帧转换成可直接检查的结构,再考虑速度、扩散等后续分析。本例复用鸢算科技集群已完成的H₂约束动力学:200个保存帧,原始时间步0.5 fs,H–H约束距离0.80 Å。
1. 先看实际结构#
下载完整输入、原生输出、CSV与绘图脚本,保存为example.zip:
python3 -m zipfile -e example.zip .
cd vtst-real-trajectory-tools
module load ase/3.29.0
bash read.sh
bash plot.sh
这一步读取本包保存的数据,在analysis-read/生成结果表、在figures/生成图片。新运行后处理时使用bash run.sh,输出写入新建的work-new/;它不运行VASP,也不提交新作业。

图右画的是距离减去0.80 Å之后的微小偏差,单位为微Å,避免把坐标输出舍入误差看成明显伸缩。图左是实际保存坐标,不是重新计算的运动。
后处理使用VTST scripts1040、系统Perl5.38;Python图由ASE3.29.0环境中的NumPy和Matplotlib生成。原轨迹的VASP输入与续算方法见约束轨迹与续算。
2. 抽取第100帧#
在本包根目录建立分析副本:
module load vtstscripts/1040
mkdir snapshots
cp inputs/POSCAR-selective-direct snapshots/POSCAR
cp inputs/XDATCAR snapshots/
cd snapshots
xdat2pos.pl 1 100
cat POSCAR100.out
本机1040版使用1 帧号表示单帧;不是把帧号单独写在命令后。第100帧是第100条保存记录,不应直接理解为100 fs。
本例给旧提取器准备的结构头为:
H
1
10 0 0
0 10 0
0 0 10
H
2
Selective dynamics
Direct
0.5 0.5 0.46 T T T
0.5 0.5 0.54 T T T
这是同一个初态的显式Selective dynamics + Direct表示,T T T允许原子移动。旧提取器依赖这一类头布局;不要把原始Cartesian文件只改一行标签就当成Direct坐标。自己的结构需要先做真正的坐标转换,并保留固定原子的约束标记。
3. 连续抽取并得到小动画#
继续在snapshots/运行:
xdat2pos.pl 0 1 4
ls POSCAR1.out POSCAR2.out POSCAR3.out POSCAR4.out movie.xyz
head -n 8 movie.xyz
0 1 4表示第1到第4帧,包含两个端点。程序产生四个POSCAR,并通过随包的CON/XYZ转换工具组合成四帧movie.xyz。本例四帧XYZ坐标与原XDATCAR逐项一致。
4. 按帧拆分XYZ#
两个原子的每帧XYZ占4行:原子数、注释、两个原子坐标。四帧文件共16行,在第9行切开,就得到各两帧:
csplit --quiet --prefix=part- movie.xyz 9
wc -l part-00 part-01
本例两个文件各8行。换成N个原子时,每帧占N+2行;不要在一帧中间截断。当前旧版splitmovie.pl调用外部命令的重定向方式在本环境不兼容,本篇使用实际运行过的csplit命令。
5. 转换完整轨迹#
回到资料包根目录,再建立单独副本,避免覆盖刚才的四帧动画:
cd ..
mkdir full-movie
cp inputs/POSCAR-selective-direct full-movie/POSCAR
cp inputs/XDATCAR inputs/OUTCAR full-movie/
cd full-movie
xdat2xyz.pl
head -n 8 movie.xyz
本例得到200帧、每帧两个H原子的XYZ。该脚本还会尝试从OUTCAR提取能量与力注释;本例约束MD输出没有它所查找的FORCES: max atom, RMS摘要,所以FORCE:为空。空注释不表示物理受力为零,结构坐标仍可独立使用。
完整实例由bash run.sh自动完成上述后处理,并保留各步骤的独立目录。然后可执行:
python -B read.py work-new analysis-new
python -B plot.py analysis-new figures-new
下一步见相邻帧速度与单位。工具用途可参阅VTST官方脚本说明。