dpdata专题

dpdata结构格式转换实操

实际转换Si结构到POSCAR、LAMMPS、GRO、STRU、PWmat、XYZ和pymatgen,说明标签、周期性与文本精度。

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

本篇从实际Si计算数据取出第一帧,转换为常见结构格式。该帧有2个Si,原始晶胞体积约40.89273 ų。目标是把结构正确交给下一个工具;转换后的结构文件不自动带有原有能量、力或virial标签。

1 下载与运行#

下载格式转换实操包,保存为dpdata-formats.zip:

python3 -m zipfile -e dpdata-formats.zip .
cd dpdata-format-workflows
bash setup.sh
bash run.sh
bash verify.sh
bash plot.sh

本例使用Python 3.11.16、dpdata 1.1.0及已有ASE、pymatgen依赖,CPU单线程即可。results/含实际生成的结构和标签存储文件。标签数据的选择和往返误差见标签存储与格式精度。

2 在终端转换自己的结构文件#

source env.sh
"$YS_PY" - <<'PYCODE'
from pathlib import Path
import dpdata
from ase.io import write
s = dpdata.LabeledSystem('inputs/si-nine', fmt='deepmd/npy')
frame = s.sub_system(0)
out = Path('my-structures')
out.mkdir()
frame.to('vasp/poscar', str(out / 'POSCAR'))
frame.to('lammps/lmp', str(out / 'si.lmp'))
frame.to('lammps/dump', str(out / 'si.dump'))
frame.to('xyz', str(out / 'si.xyz'))
frame.to('abacus/stru', str(out / 'STRU'), pp_file=['Si.upf'])
frame.to('pwmat/atom.config', str(out / 'atom.config'))
# ASE从原始完整晶胞写GRO,再由dpdata读取
atom = frame.to('ase/structure')[0]
write(out / 'si.gro', atom, format='gromacs')
# pymatgen结构对象不需要先写入文件
structure = frame.to('pymatgen/structure')[0]
back = dpdata.System(structure, fmt='pymatgen/structure')
print('pymatgen atoms=', back.get_natoms())
print('original labels:', sorted(frame.data.keys()))
PYCODE
ls my-structures

sub_system(0)使用从0开始的第一帧,避免把9帧数据误认为一个单结构。上面的Si.upf仅指定STRU中的文件名;用于ABACUS新计算时,应换成实际采用的赝势,并另行配置INPUT和KPT。

输出 实际保留内容 后续使用要点
POSCAR 元素、原子位置、晶胞 适合继续准备VASP输入
LAMMPS data/dump 原子类型、位置、晶胞 读回时给出真实type_map
GRO 位置、盒;具有文本精度限制 本例用ASE写出以保留更多盒参数位数
ABACUS STRU 元素、位置、晶胞等结构字段 赝势文件名和新计算设置要另配
PWmat atom.config 元素、位置、晶胞 不含原有DFT能量与力标签
普通XYZ 元素与笛卡尔位置 本例不保留周期晶胞与标签
pymatgen Structure 周期结构对象 对象转换不自动带入原标签

真实Si结构与GRO晶胞精度对比

左图来自原始晶胞和真实原子坐标。右图比较晶胞向量内积矩阵的变化,单位Ų,用来观察盒形状精度;它不是原子位移,不能把该数值直接当作Å。

3 为什么GRO需要注意精度#

本环境的dpdata默认GRO写入器将盒参数保留为三位nm。这组Si小晶胞的内积矩阵最大变化约0.0223247 Ų;采用ASE从原始晶胞写GRO后,降为约0.0001656 Ų。

但GRO原子坐标仍有文本舍入:本例周期等价坐标最大分量变化约0.003676 Å,最短镜像原子间距变化约0.003254 Å。因此,使用GRO是为了与GROMACS结构格式衔接;需要高精度保存晶胞和标签时,可选择POSCAR、HDF5或NumPy等合适格式。不要先写成低精度GRO,再期待转换器恢复已丢失的小数位。

4 读回来,检查类型、帧数和标签#

source env.sh
"$YS_PY" - <<'PYCODE'
import dpdata
files = [('vasp/poscar', 'my-structures/POSCAR', {}),
         ('lammps/lmp', 'my-structures/si.lmp', {'type_map': ['Si']}),
         ('lammps/dump', 'my-structures/si.dump', {'type_map': ['Si']}),
         ('gromacs/gro', 'my-structures/si.gro', {}),
         ('xyz', 'my-structures/si.xyz', {}),
         ('abacus/stru', 'my-structures/STRU', {}),
         ('pwmat/atom.config', 'my-structures/atom.config', {})]
for fmt, path, options in files:
    t = dpdata.System(path, fmt=fmt, **options)
    print(fmt, 'frames=', len(t), 'atoms=', t.get_natoms(),
          'elements=', t['atom_names'],
          'nopbc=', t.data.get('nopbc', False))
    print('energy present=', 'energies' in t.data)
PYCODE
bash plot.sh --reference

回读得到每文件1帧、2个Si,结构交换文件没有补造能量、力和virial。普通XYZ在本例按非周期结构读取;若以后把它转成周期晶体输入,必须补回真实晶胞,不能把缺省盒当作原晶胞。

程序除了核对元素、原子数和帧数,还比较晶胞形状、周期等价位置与最短镜像距离,允许合法的周期平移。对更复杂的晶胞或多元素数据,还应核对原子类型顺序;LAMMPS的数字类型不能靠猜测对应元素。

更多格式、只读与只写接口见dpdata格式文档。本篇操作以安装的1.1.0和随包完整脚本为准;对应软件重新计算出的标签,需按新的方法和单位重新检查,不能把旧标签自动附到新计算上。

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

查看配图

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

100%查看原图 ↗