dpdata读取多种电子结构程序输出
实操FHI-aims、OpenMX、SIESTA、PWmat、Quantum ESPRESSO与CP2K输出,检查帧序、能量、力和维里。
阅读本篇目录
计算输出转成训练数据时,重要的不是文件扩展名,而是坐标、能量、力属于同一帧,且程序版本确实输出了需要的字段。本篇以固定来源样本演示读取,ABACUS部分使用已有集群实算数据。
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 FHI-aims:单点与多步输出#
bash run.sh fhi-scf
bash run.sh fhi-md
import dpdata
scf = dpdata.LabeledSystem('samples/fhi_aims/out_scf', fmt='fhi_aims/scf')
md = dpdata.LabeledSystem('samples/fhi_aims/out_md', fmt='fhi_aims/md')
print(len(scf), len(md))
print(md.data.keys())
样本分别得到1帧和3帧。只读取需要的步,先看energies、forces实际形状;日志里没有应力时不要构造零维里。
3 OpenMX:保留同一前缀的输入和轨迹#
bash run.sh openmx-methane
s = dpdata.LabeledSystem('samples/openmx/Methane', fmt='openmx/md')
print(len(s), s.get_natoms())
这里传的是前缀,目录中保留Methane.dat和Methane.md,读取到200帧甲烷数据。只复制一个.md文件并改名,可能使元素或输入信息不匹配。格式样本的轨迹长度不代表已达到统计收敛。
4 SIESTA与PWmat#
bash run.sh siesta-scf
bash run.sh siesta-md
bash run.sh pwmat-md
siesta = dpdata.LabeledSystem('samples/siesta/aimd/output', fmt='siesta/aimd_output')
pwmat = dpdata.LabeledSystem('samples/pwmat/MOVEMENT', fmt='pwmat/movement')
print(len(siesta), len(pwmat))
本例分别为5帧与992帧;PWmat的movement、mlmd等别名共享实现。不要把结构文件atom.config当作含能量与力的MOVEMENT。
5 Quantum ESPRESSO:PW单点与CP轨迹#
bash run.sh qe-pw
bash run.sh qe-cp
pw = dpdata.LabeledSystem('samples/qe.scf/01.out', fmt='qe/pw/scf')
cp = dpdata.LabeledSystem('samples/qe.traj/oh-md', fmt='qe/cp/traj')
print(pw['energies'][0], len(cp))
PW样本原输出为−16.15090531 Ry,读取后约−219.744261 eV;这个量是该样本的总能量,不是每原子能量。CP前缀需要对应.in/.pos/.for/.evp等文件,本例得到2个匹配帧。输入输出有共同步号才可以配对;不能独立排序四个文件后假定首行总是同一时刻。
6 VASP、CP2K与ABACUS#
bash run.sh vasp-outcar
bash run.sh vasp-xml
bash run.sh cp2k-scf
bash run.sh cp2k-md
bash run.sh abacus-scf
bash run.sh abacus-relax
bash run.sh abacus-md
当前样本的CP2K单点1帧、AIMD30帧;ABACUS Si单点1帧、MoS₂优化2帧、Al短MD81帧。ABACUS日志打印位数与完整逐步STRU的精度差别、维里单位和显式几何恢复,见ABACUS标签教程。本包直接展示原生读取,未隐藏替换几何或补齐标签。
7 导出前最后看三个地方#
import numpy as np
s = pw
print('frames:', len(s), 'atoms:', s.get_natoms())
print('energy shape:', s['energies'].shape)
if 'forces' in s.data and np.size(s.data['forces']):
print('force shape:', s['forces'].shape)
else:
raise RuntimeError('源输出没有可用的力,不能生成带力训练标签')
s.to('deepmd/npy', 'qe-training-data', prec=np.float64)
dpdata常用统一单位为能量eV、长度Å、力eV/Å、维里eV。应力不是维里,交换数据时还要核对应力符号和体积因子。不同赝势、基组、电子温度或能量零点的数据,不因为转换成功就适合混合训练。
样本出处见官方固定提交;转换结果和源样本分别保留,便于回查。
图表数据与重新绘图#
bash plot.sh
图件保存在plots/,原数值另存于附件reference-data/。直接下载:AMBER-energy.csv、DFTB-NH3-geometry-forces.csv、Gaussian-CH4-trajectory.csv、Si9-reference.csv。