NepTrain用ABACUS计算能量力标签
Si2与Si8真实PW单点,逐步操作INPUT、KPT、标签与F能量和virial转换。
阅读本篇目录
本篇演示用 NepTrain 2.2.0 调用 ABACUS 3.10.1,为Si₂和Si₈构型计算单点能量、力与virial,再整理成带有清楚单位和能量定义的extxyz数据。它与 VASP自动补标 是两个后端例子,不能只因文件格式相同就把标签混入同一训练集。
1 准备输入并提交#
unzip neptrain-python-abacus-wave270*.zip
cd neptrain-python-abacus-wave270
bash run.sh
cat inputs/INPUT
sbatch job.slurm
bash run.sh 先查看参考值并重画图,不运行DFT。job.slurm 调用 full.sh,依次完成 Python例子 → 结构抽取 → ABACUS单点 → 读取标签 → 统一F能量定义 → 画图。需要自己的体系时,在新的解压目录修改结构、赝势和INPUT,再提交,保留每次的原始输入与输出。
环境为 gpumdkit/1.5.8 中的 Python3.11、NepTrain2.2.0、ASE3.29.0;ABACUS使用 Intel oneAPI 2024.2 / Intel MPI 2021.13 的CPU版。当前Python环境缺少外部ASE-ABACUS接口,附件已固定官方接口源码提交 65bdad3493fea002180cdc73664d688a2087a99b,仅本项目进程加载,不修改公共环境或用户旧配置。
脚本内调用的安装版参数相当于:
NepTrain dft inputs/Si2-Si8.xyz --abacus --in inputs/INPUT --ka 12,12,12 -n 8 --directory work/abacus/cache --out work/abacus/labels.xyz
这段用于说明参数含义;含项目接口加载和原生执行配置的可运行入口是上面的 sbatch job.slurm。不要绕过附件的 bootstrap.py 直接在未配置外部接口的环境复制长命令。
2 结构与赝势如何准备#
附件的 abacus_case.py 从自有真实Si参考构型中各取一个Si₂和Si₈,移除旧计算器与旧DFT标签,写出 inputs/Si2-Si8.xyz。几何保持原样,再交给ABACUS实际单点计算。
head -n 5 inputs/Si2-Si8.xyz
ls inputs/*.upf
cat work/abacus/cache/1-Si2/STRU
cat work/abacus/cache/1-Si2/KPT
平面波示例使用公开的 Si_ONCV_PBE-1.0.upf,保留文件原版权和引用说明。安装版从当前计算目录扫描小写 .upf 文件,并按文件中 element="Si" 配对元素;换元素时需要相应赝势。LCAO还需要匹配的 .orb 轨道及相应INPUT设置,本例 只计算PW,不把LCAO当作已运行结果。
本例Si₂的结构输入可由如下数值描述:
cell (Angstrom)
0.00000000 2.73675869 2.73675869
2.73675869 0.00000000 2.73675869
2.73675869 2.73675869 0.00000000
Cartesian positions (Angstrom)
Si 2.78311541 2.76222541 5.40578490
Si 1.35917330 1.36421416 1.34867854
部分原子在基本晶胞之外,周期边界下仍是同一个几何;检查原子距离时要用最小镜像。更换构型后先检查短键、体积、元素和周期边界,再进行补标。
3 INPUT与K点设置#
INPUT_PARAMETERS
calculation scf
suffix ABACUS
ntype 1
basis_type pw
device cpu
precision double
ks_solver cg
ecutwfc 60
scf_thr 1e-8
scf_nmax 150
symmetry 0
cal_force 1
cal_stress 1
smearing_method gauss
smearing_sigma 0.003675
mixing_beta 0.3
out_chg 0
out_wfc_pw 0
这是固定晶胞、固定原子位置的SCF标签,不进行结构优化。ecutwfc=60 单位 Ry,约816.34eV,不能直接与VASP中相同数值的ENCUT比较。scf_thr=1e-8 是ABACUS电子收敛设置,不等同于VASP的EDIFF参数定义。需要能量、力和应力标签时保留 cal_force=1、cal_stress=1。
安装版 --ka 用晶格矢量长度的Å数计算 ceil(ka/a) 等三个整数,因此 --ka 12,12,12 不是12×12×12网格。本例实际Si₂写出:
K_POINTS
0
Gamma
4 4 4 0 0 0
Si₈是3×3×3。运行后应查看生成的KPT确认真正使用的采样。本例用于展示补标流程,没有把这两个网格称作材料性质的收敛设置。
4 先找原始输出,再读标签#
cat work/abacus/cache/1-Si2/INPUT
cat work/abacus/cache/1-Si2/KPT
rg 'convergence|FINAL_ETOT' work/abacus/cache/1-Si2/OUT.ABACUS/running_scf.log
head -n 4 work/abacus/labels.xyz
cat analysis/neptrain-abacus-labels.csv
原生运行成功、电子收敛和结构标签数量是三件事。附件保留每个单点的原生输出与退出码,并检查最终确实有两帧Si₂/Si₈,避免某个结构出错后得到不完整数据却直接训练。
实际结果如下,能量为每构型总量:
| 结构 | 原子数 | 体积 ų | 原生F eV | 最大力分量 eV/Å |
|---|---|---|---|---|
| Si2 | 2 | 40.995814 | -214.265701665 | 0.69908399 |
| Si8 | 8 | 161.377109 | -857.612506400 | 1.27239809 |

力对照包含两个结构的全部30个笛卡尔分量。原始数据在 neptrain-abacus-forces.csv 和 neptrain-abacus-virial.csv;使用另一个原生输出读取器逐项对照,力最大差约4.5×10⁻⁹ eV/Å、virial最大差约1.3×10⁻⁸ eV,主要来自extxyz保留位数。
5 F、内能E、零展宽外推能要分清#
有限展宽下,原生日志同时有 E_KohnSham、E_entropy(-TS) 和 E_KS(sigma->0)。固定的外部ASE接口默认 energy 为:
raw_ASE_energy = native_F - E_entropy(-TS)
也就是这里的内能E。它既不是F,也不是零展宽外推能。Si₂实际值:
native F -214.265701664551 eV
E_entropy(-TS) -0.000088447500 eV
raw ASE internal E -214.265613212500 eV
E_KS(sigma->0) -214.265657440800 eV
小差别仍要统一定义,尤其不应把不同后端的默认 energy 不加说明地混合。附件保留 work/abacus/labels.xyz 原始输出,再由 analyze.py 从同一次原生SCF结果导出:
head -n 4 analysis/abacus-labels-F.xyz
cat analysis/neptrain-abacus-labels.csv
analysis/abacus-labels-F.xyz 明确使用原生自由能F,保留相同几何、力、virial,并在每帧标注 energy_definition。这一转换不重新计算SCF。有限展宽下的原生力对应F曲面;若你的研究选择其他能量定义,应在全部训练数据中保持一致并评估展宽影响。

纵轴是相对F的每构型 meV,不是绝对能量或预测误差。
6 应力、virial与压力怎么转换#
import numpy as np
from ase.io import read
a = read('analysis/abacus-labels-F.xyz', 0)
W = np.asarray(a.info['virial']).reshape(3, 3)
pressure_GPa = W / a.get_volume() * 160.21766208
ase_stress_eV_A3 = -W / a.get_volume()
此处extxyz virial 是每构型 总eV,不是每原子;ABACUS原生日志的压力张量采用压缩为正,ASE stress采用相反符号。不要再乘一次原子数,也不要把kbar直接当GPa。它与 CPU NEP计算器的mean_virial 返回定义不同:后者默认每原子,需要乘N。
7 怎样换成自己的训练数据#
先确定同一套元素、赝势、交换关联、截断能、K点与展宽规则,再批量计算。检查原生SCF与输出帧数,统一能量定义和virial单位,另保留验证集和独立测试集。两个演示构型只是标签流程例子,不是足够覆盖Si相空间的训练集。
本例ABACUS数据与原VASP/PAW数据使用不同赝势和绝对能量参考,因此没有加入原来的VASP模型训练。即便都称PBE、单位都是eV,也不能直接拼接;选择ABACUS后端训练时,应重新建立标准一致的数据集。LCAO、其他元素、磁性、SOC与当前上游新增工作流字段,也不能由这个PW非磁Si例子推定已覆盖。