dpdata专题

dpdata读取分子量化与AMBER数据

读取Gaussian、ORCA、Psi4、DFTB+、SQM和AMBER真实格式样本,区分梯度、力、能量与非周期占位晶胞。

更新于 2026-11-11约 5 分钟阅读按任务与环境选择适用配置
阅读本篇目录

分子量化常输出原子单位的能量和梯度,分子动力学则可能将坐标、力、能量分开保存。不能把梯度直接当作力,也不能把打印的非周期占位晶胞当成真实盒子。本篇用原始格式样本演示完整读取;样本来自固定提交的dpdata官方示例,在集群实际进行解析与转换。

1 下载和运行#

下载格式实例包,保存为dpdata-formats.zip。

python3 -m zipfile -e dpdata-formats.zip .
cd dpdata-formats
bash run.sh

最后一条列出示例名,选中一个再运行,例如bash run.sh qe-cp。脚本调用集群现有Python 3.11环境中的dpdata 1.1.0、NumPy等依赖,只读取、转换数据,不启动原计算程序。需要批作业时可用sbatch job.slurm qe-cp,只申请1个CPU。输出保存在results/。

2 Gaussian:日志、fchk与MD#

bash run.sh gaussian-log
bash run.sh gaussian-fchk
bash run.sh gaussian-md
import dpdata
ch4 = dpdata.LabeledSystem('samples/gaussian/methane.gaussianlog', fmt='gaussian/log')
water = dpdata.LabeledSystem('samples/gaussian/waterfreq.gaussianfchk', fmt='gaussian/fchk')
md = dpdata.LabeledSystem('samples/gaussian/aimd_gaussian_CH4_output', fmt='gaussian/md')
print(len(ch4), len(water), len(md))
print(ch4['energies'][0])

分别为1、1、22帧。CH₄样本读取能量约−1102.714589869 eV,5个原子;这是给定方法与结构的总能量。gaussian/log默认单点读取与gaussian/md多步读取用途不同,不能以构造对象成功推断已经读完所有优化/MD步。

Gaussian甲烷样本的22帧电子能量和最大力分量

图中是电子能量相对首帧的变化,不包含离子动能,不用来判断NVE总能守恒或温度是否平衡。

3 ORCA与Psi4:梯度已经转换为力#

bash run.sh orca-molecule
bash run.sh psi4-molecule
orca = dpdata.LabeledSystem('samples/orca/orca.spout', fmt='orca/spout')
psi = dpdata.LabeledSystem('samples/psi4/psi4.out', fmt='psi4/out')
print(orca['forces'].shape, psi['forces'].shape)

两个例子各1帧。Psi4原输出总能为−79.8685493165660603 Hartree,dpdata读取后转换为eV;力为负梯度,单位eV/Å。不要再对dpdata结果额外乘一次Hartree→eV,也不要再反一次符号。

4 DFTB+:输入和输出成对#

bash run.sh dftb-NH3
nh3 = dpdata.LabeledSystem(
    ('samples/dftbplus/dftb_pin.hsd', 'samples/dftbplus/detailed.out'),
    fmt='dftbplus',
)
print(nh3['energies'][0], nh3['forces'][0])

本例NH₃含4个原子,原生detailed.out的总能为−3.2963983884 Hartree,约−89.6996 eV。读取使用较多有效数字的原子单位值;日志右侧只打印四位小数的eV值存在舍入差,不人为改成完全相等。

DFTB+氨分子格式样本的几何与原子力方向

箭头共用一个缩放系数,仅用于显示方向和相对大小;CSV保留真实eV/Å数值。原始样本为非平衡几何,较长的N—H距离按原数据保留,不用作优化平衡键长;该图不是新完成的集群DFTB计算。

5 SQM:有坐标不代表有力#

bash run.sh sqm-molecule
sqm = dpdata.LabeledSystem('samples/amber/sqm_forces.out', fmt='sqm/out')
print(sqm.get_natoms(), sqm['forces'].shape)

本例40原子,源文件确实含梯度,才可以得到力标签。只包含几何的SQM输出应按System读取;不要给不存在的力补零。

6 AMBER:四类文件缺一不可#

bash run.sh amber-md
amber = dpdata.LabeledSystem('samples/amber/02_Heat', fmt='amber/md')
print(len(amber), amber.get_natoms())

例子按共同前缀读取拓扑.parm7、坐标.nc、力.mdfrc、能量.mden,得到10帧、1912个原子。默认类型表保留AMBER力场类型(如CT、HW),它们不是化学元素;准备元素型机器学习数据时应显式转换成元素符号,见下面的命令。这里的能量是势能,不含离子动能;dpdata将相应AMBER单位转为统一eV与eV/Å。把不同任务的同名文件放在一起,即使帧数相同,也不代表数据配对正确。

# 这里的1912来自本例拓扑,其他体系先用get_natoms()读取原子数。
elements = dpdata.LabeledSystem(
    'samples/amber/02_Heat', fmt='amber/md',
    use_element_symbols=list(range(amber.get_natoms())),
)
print(elements['atom_names'])

转换类型后仍应核对原子顺序和对应坐标/力不变,不按元素重新排列单个数组。

AMBER格式样本实际读取的10帧势能

7 非周期数据的晶胞占位#

print(ch4.data.get('nopbc', False))
ch4.to('deepmd/npy', 'ch4-data')
back = dpdata.LabeledSystem('ch4-data', fmt='deepmd/npy')
print(back.data.get('nopbc', False))

本例保持nopbc=True,坐标、能量和力在双精度导出读回后保持;读回端可能使用100 Å的占位晶胞,原始分子日志则为零晶胞。这个变化不表示分子体积膨胀,也不应计算密度或用晶胞占位值换算压力。周期性、物理盒子和标签要分别核对。

继续看对象、混合体系与键图。样本出处见官方固定提交,所用日志与输入可在包内直接检查。

图表数据与重新绘图#

bash plot.sh

图件保存在plots/,原数值另存于附件reference-data/。直接下载:AMBER-energy.csv、DFTB-NH3-geometry-forces.csv、Gaussian-CH4-trajectory.csv、Si9-reference.csv。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗