NepTrain专题

NepTrain用ABACUS计算能量力标签

Si2与Si8真实PW单点,逐步操作INPUT、KPT、标签与F能量和virial转换。

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

本篇演示用 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

两个真实ABACUS单点的力与总virial独立读取对照

力对照包含两个结构的全部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曲面;若你的研究选择其他能量定义,应在全部训练数据中保持一致并评估展宽影响。

同一次SCF中自由能F、零展宽外推能与ASE默认内能的差别

纵轴是相对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例子推定已覆盖。

资料:ABACUS官方ASE接口说明、外部接口源码、NepTrain安装版。

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

查看配图

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

100%查看原图 ↗