LAMMPS:DCD与XTC二进制轨迹
演示二进制轨迹的实际读取、单位转换、采样时间和原子顺序,比较DCD与XTC坐标精度。
阅读本篇目录
DCD 和 XTC 适合保存较长的坐标轨迹,但通常需要另外保留原子类型、编号对应和采样说明。本篇用同一份 Ni 实际轨迹比较这两种输出。
1. 解包、读取、画图#
下载完整输入、实际输出、读取脚本和绘图脚本,保存为 example.zip:
python3 -m zipfile -e example.zip .
cd lammps-dump-formats
bash read.sh
bash plot.sh
reference-results 是本例实际运行结果,analysis-read 是读取后生成的数据,figures 是可重新绘制的图片。单独下载的数据:LAMMPS-dump-roundtrip.csv、LAMMPS-gzip-sizes.csv。
本例使用 LAMMPS 30Sep2026。CPU 入口为 lammps/30Sep2026-8173m,Intel oneAPI 2024.2、Intel MPI、MKL,带 PLUMED 2.9.4。资料包的 CPU 模板申请一个 56 核节点,实际同时启动最多 2 个单线程 MPI 进程。
读取脚本先调用 MDAnalysis 2.9.0 解码二进制,再与原始文本轨迹逐帧比较。集群脚本已指定所需 Python 环境,无需改全局环境。

2. LAMMPS怎样输出#
在正常 MD 的 run 前加入其中一种:
dump d all dcd 200 trajectory.dcd
dump_modify d sort id
或:
dump d all xtc 200 trajectory.xtc
dump_modify d sort id
资料包给出了完整 dcd/in.lmp 和 xtc/in.lmp。重读转换仍使用 pair_style zero,不产生新的物理动力学。
cat inputs/dcd/in.lmp
cat inputs/xtc/in.lmp
bash submit.sh
# 作业完成后读取新结果
bash read.sh work-new analysis-read
3. 时间和长度单位怎样处理#
原始 metal 单位制中长度为 Å、时间为 ps。XTC 保存的是 nm,MDAnalysis 默认读取后转换为 Å;不要再乘一次 10。本例 XTC 最大坐标分量差约 0.0050032 Å,与其有损坐标存储尺度相符。
DCD 的本例最大坐标分量差约 9.52×10⁻⁷ Å。读取时我们明确提供 dt=0.2 ps,即 200×0.001 ps,得到 0、0.2、0.4 ps;这不表示仅靠 DCD 文件就恢复了原始绝对步数。
核心读取代码已包含在 read-binary.py:
from MDAnalysis.coordinates.DCD import DCDReader
from MDAnalysis.coordinates.XTC import XTCReader
with DCDReader('trajectory.dcd', dt=0.2) as frames:
for frame in frames:
print(frame.time, frame.positions.shape, frame.dimensions)
with XTCReader('trajectory.xtc') as frames:
for frame in frames:
print(frame.time, frame.positions.shape, frame.dimensions)
4. 晶胞原点和原子身份不能丢#
本例 DCD/XTC 可读取晶胞长度,但没有保留原 NPT 文本中的非零晶胞原点。长度相同不等于 xlo/ylo/zlo 相同。做空间分箱时应明确采用哪个原点,不能把“原点设为零”误当成所有坐标都已经平移。
二进制坐标行的原子含义要与拓扑文件一致。本例固定按 id 排序,2048 个原子、3 帧;若自己的模拟发生插入或删除原子,需重新考虑格式和工具支持范围。
cat analysis-read/BINARY-READERS.json
head -8 analysis-read/LAMMPS-dump-roundtrip.csv
本例没有用这 3 帧估算扩散系数;连续位移分析还需处理跨周期边界、时间间隔和足够长的统计采样。官方 dump 格式说明列出了相应输出选项。