GPUMDkit专题

GPUMDkit 与 LAMMPS 的原生格式转换

实际转换正交/斜晶胞、Ni轨迹与水坐标,核对元素映射、速度单位和LAMMPS读入。

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

下载模型、实际数据与操作资料包。解压进入目录,inputs / conversion-inputs 是输入,reference 保存集群参考结果。每次运行在 work 建立新目录,结果位置写入 LAST-RUN.txt。耗时预测和 GPU 对照请在分配好的计算资源内执行。

两个转换方向用什么工具#

本篇分别演示 POSCAR → LAMMPS data 和 LAMMPS dump → extxyz。前者原生脚本使用 OVITO,后者使用 ASE;不要因为前者需要 OVITO,就认为后者也需要安装它。

资料包包含四个实际操作流程:64 原子 Si 结构、250 原子 PbTe 斜晶胞、2048 原子 Ni 的 41 帧真实轨迹、2652 原子水盒坐标输出的一帧。Si 是明确构造的建模输入,PbTe 和 LAMMPS 输出来自既有公开教学资料。转换过程没有重新运行这些 MD。

真实PbTe结构在两种文件中的元素和晶胞

1. 一次运行所有转换#

bash run.sh conversions
cat LAST-RUN.txt

脚本会使用各自需要的独立 Python,检查原子数、元素、晶胞、坐标和速度;再用 LAMMPS 读回生成的 data。输出在新的工作目录,不修改原输入。

2. POSCAR 转 LAMMPS data#

集群 GPUMDkit 与 OVITO 的 Python 环境分别维护。手动运行原生转换脚本时,先加载工具路径,再切换到 OVITO 的 Python:

module purge
module load gpumdkit/1.5.8 ovito/3.16.1
mkdir my-poscar-conversion
cp conversion-inputs/Si-POSCAR conversion-inputs/PbTe-POSCAR my-poscar-conversion/
cd my-poscar-conversion

python "$GPUMDkit_path/Scripts/format_conversion/pos2lmp.py" \
  Si-POSCAR Si.data
python "$GPUMDkit_path/Scripts/format_conversion/pos2lmp.py" \
  PbTe-POSCAR PbTe.data

这里直接运行随 GPUMDkit 提供的原生脚本,使用 OVITO 3.16.1;不把两个环境的依赖混装。默认公共 gpumdkit.sh 包装器固定使用自身 Python,所以本篇不通过它临时切换 OVITO。

查看结果:

head -n 18 PbTe.data

本次原生输出采用 general triclinic 写法:

250 atoms
2 atom types

0.0 16.42598 16.42598 avec
16.42598 0.0 16.42598 bvec
16.42598 16.42598 0.0 cvec
0.0 0.0 0.0 abc origin

质量与类型为 Pb、Te,坐标采用 Å。转换会生成结构与质量信息,不会自动选择势函数或产生 pair_coeff 参数。

想自己构造包内 Si 输入,可在 GPUMDkit 环境运行:

from ase.build import bulk
from ase.io import write
atoms = bulk('Si', 'diamond', a=5.43, cubic=True).repeat((2, 2, 2))
write('Si-POSCAR', atoms, format='vasp', sort=True, direct=True)

3. 用 LAMMPS 实际读回#

使用本篇已核对的 LAMMPS 30Sep2026 模块:

module purge
module load lammps/30Sep2026-p100-gpu
cat > read.in <<'EOF'
units metal
atom_style atomic
read_data PbTe.data
write_data roundtrip.data
EOF
lmp -in read.in

这里只读写结构,不运行带势函数的动力学。两份 data 都已实际读入,原子数分别为 64、250。不要为了适配某个旧格式而手删斜晶胞矢量。

4. LAMMPS dump 转 extxyz#

回到资料包根目录,使用 GPUMDkit 自身环境:

module purge
module load gpumdkit/1.5.8
mkdir my-ni
cp conversion-inputs/ni.dump my-ni/
cd my-ni
gpumdkit.sh -lmp2exyz ni.dump Ni

输出 dump.xyz,保留 41 帧、每帧 2048 原子。Ni 轨迹来自 units metal 的 300 K 教学 NPT 过程,时间步 0.001 ps,输出每 200 步一帧,生产段为 8 ps;这里转换的是现有文件,不再跑一次 MD。

完成 Ni 转换后先返回上一层。水坐标输出含两个类型,按原输入的 type 1 = O,type 2 = H:

cd ..
mkdir my-water
cp conversion-inputs/water.dump my-water/
cd my-water
gpumdkit.sh -lmp2exyz water.dump O H

以上命令均应从包内相应工作位置操作;Ni、water 使用各自独立目录。输出同名 dump.xyz,所以不要在同一目录连续转换并覆盖前一次结果。

元素列表按 LAMMPS 类型编号给出,不能按自己习惯交换 O、H 顺序。少给一个元素会报类型超出映射范围;带 mass 列时也仍按 type 字段决定映射。

5. 速度、动量与单位#

Ni 输入有 vx vy vz。本例命令沿用 ASE 的 metal 单位读取默认值:LAMMPS 速度为 Å/ps;写入 extxyz 时由 ASE 用 momenta 保存对应动量。换成真实元素质量后,要保持同一速度,而不是保留错误质量对应的动量。

当前集群入口已经处理这种质量变换。本次 41 帧独立核对的最大坐标舍入误差约 5×10⁻⁹ Å;速度在 ASE 单位下的最大误差小于 1×10⁻⁷。带显式 Ni 质量列的控制文件也得到一致速度。

如果自己的轨迹用 units real 并含速度,不要沿用默认单位。可以显式使用 ASE,再按实际类型映射读入:

from ase.io import read, write
frames = read('dump.lammpstrj', format='lammps-dump-text', index=':',
              specorder=['O', 'H'], units='real')
write('converted.xyz', frames, format='extxyz')

这段是不同单位输入的操作方式;资料包还用真实 Ni 第一帧按单位换算后的副本检查了显式 real 读取。包内完整 Ni 轨迹使用 metal;水这一帧只有坐标,没有速度。坐标轨迹不会自动带上原模拟能量、力或 virial,若要制作训练集,需要另外核对并导入对应标签。

四组转换的原子规模与坐标核对

6. 最后查看哪些输出#

bash run.sh plots

完整运行目录中,conversions 保存原生输出,CONVERSION-VALIDATION.json 记录坐标/元素对照,lammps-read-control 保存 LAMMPS 读写结果。结构转换的更多方向见格式与标签转换,并注意区别“几何互转”与“带能量/力的数据集转换”。

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

查看配图

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

100%查看原图 ↗