Calorine专题

Calorine读取GPUMD数据与qNEP响应

列出15个GPUMD读写入口,用真实输出说明能量归一化、速度单位、qNEP和极化时间导数。

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

下载模型、真实数据、完整脚本与参考图片。相关教程:偶极与极化率 · 红外与拉曼谱 · NEP89微调 · 模型编辑 · GPUMD数据读写 · 完整接口索引

1 准备与运行#

先解压并重画已经完成的参考结果:

unzip calorine-response-workflows-wave266-*.zip
cd calorine-response-workflows-wave266
bash run.sh

六张参考图在figures,CSV在analysis。若要自己重新计算,在新解压目录以普通账号执行:

bash prepare.sh
bash calculate.sh
bash status.sh

calculate通过Slurm分配一张P100,自动完成本包所有计算;新结果在work,参考图与新算结果分开。已提交时继续查看status,不要删除记录重复提交。结束后:

cat work/COMPLETE.json
ls work/analysis

本例环境为Calorine 4.0、Python 3.11、GPUMD 5.9.1;GPUMD采用GCC 13.3/CUDA 12.9系列环境。可以用module show calorine/4.0和module show gpumd/5.9.1-p100查看当前模块。下面的Python片段在计算完成后的work目录执行;MD和训练由calculate提交。

2 15个读写函数#

资料包native-reader-data保存集群已经完成的真实输出。自己新算的分子、MCMD和dpdt输出会替换到work/Reader-API/native,历史热输运样本保留来源。

函数 输入或用途
read_thermo thermo.out:温度、能量、应力、晶胞
read_hac hac.out:热流相关及积分热导
read_kappa kappa.out:HNEMD热导分量
read_msd msd.out:均方位移
read_sdc sdc.out:速度相关与自扩散积分
read_viscosity viscosity.out:应力相关与黏度积分
read_shc shc.out:返回相关函数、频谱两个DataFrame
read_dipole dipole.out:偶极时间序列
read_polarizability polarizability.out:六个独立张量分量
read_dpdt dpdt.out:dP/dt与积分P
read_mcmd mcmd.out:MC接受比例及适用的组分信息
read_runfile / write_runfile run.in参数列表读写
read_xyz / write_xyz GPUMD结构、质量、速度、分组

3 先看列名,再导出#

cd work
python - <<'CALORINE_READERS'
from calorine.gpumd import read_thermo, read_shc, read_mcmd
root = 'Reader-API/native/'
df = read_thermo(root+'thermo.out', normalize=False)
print(df.columns)
print(df.head())
df.to_csv('my-thermo.csv', index=False)
corr, spec = read_shc(root+'shc.out')
corr.to_csv('my-SHC-correlation.csv', index=False)
spec.to_csv('my-SHC-spectrum.csv', index=False)
print(read_mcmd(root+'mcmd.out').head())
CALORINE_READERS

thermo能量可明确选择总量或每原子量;温度和压力不再按原子数除一次。本例分子极化率模型的标签是整个分子的ų,dump_polarizability保存整体预测,读取使用normalize=False。只有确实需要每原子量时才按3除;不要看到num_atoms就自动归一化。nep预测文件的每原子输出约定与MD的dump文件也要分开看。

历史HAC样本是512原子Si、300 K,晶胞边长21.724 Å;get_rtc_from_hac示例用同一体积和温度作矩形积分。它与原生程序的积分离散方式可能不同,短样本不代表收敛热导。

使用同一HAC样本的实际晶胞与300 K输入,核心积分命令是:

import numpy as np
from ase.io import read
from calorine.gpumd import read_hac
from calorine.tools import get_rtc_from_hac
h = read_hac('Reader-API/native/hac.out',
             exclude_currents=False, exclude_in_out=False)
V = read('Reader-API/native/HAC-model.xyz').get_volume()
dt = float(h.time.iloc[1] - h.time.iloc[0])
kx = get_rtc_from_hac(h.jjx_tot.to_numpy(), V=V, T=300, dt=dt)
np.savetxt('my-running-kappa.csv', np.c_[h.time, kx],
           delimiter=',', header='time_ps,kappa_W_mK', comments='')

4 速度与分组的读写#

read_xyz把GPUMD的Å/fs转换成ASE速度。当前接口会同时保留旧vel数组;再次写入前去掉重复表示,ASE的momenta仍在:

from calorine.gpumd import read_xyz, write_xyz
a = read_xyz('Reader-API/native/model.xyz')
a.arrays.pop('vel', None)
write_xyz('my-model.xyz', a, groupings=[[[0],[1,2]]])

这只修改自己的Atoms对象,不会删除输入文件。参考脚本同时比较了位置、速度和分组,避免把Å/fs与ASE内部单位混用。

5 qNEP的边界与长程设置#

qNEP的这里两类模型需要周期性边界;孤立分子的非周期设置不能直接套用。CPU/GPU精细数值比较要使用相同长程求和方式:GPU默认PPPM 1 Å网格与CPU的Ewald不能当成同一设置。本例显式添加:

kspace ewald
time_step 0.1
ensemble nve
compute_dpdt 5
dump_thermo 5
dump_xyz 5 movie.xyz precision double velocity charge bec force
run 200

这是本包Slurm作业中自动运行的20 fs示例,40个输出时刻。盒子是24 Å周期立方体,不是液态水采样。带速度快照的thermo应力包含动能项,与CPUNEP纯构型应力比较时需分清二者;原始速度不会因为再写一个很小的velocity参数就自动消失。

相同长程算法的对照与实际qNEP极化导数

6 dpdt.out里的P是什么意思#

read_dpdt返回time,单位ps;dPx/dPy/dPz单位eÅ/fs。P列由BEC×速度从零开始按采样步长积分,不能当成绝对sum(q*r)。本包直接用每帧真实输出的BEC和速度重新收缩、积分,与原生列对照。

head -n 9 work/qNEP-dpdt/dpdt.out
cat work/qNEP-dpdt/RESULTS.json
ls work/Reader-API/*.csv

参考Calorine GPUMD读写接口。

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

查看配图

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

100%查看原图 ↗