DeePMD电荷与自旋布居分析
读取原生逐原子输出,换算Mulliken电荷并检查电子总数、闭壳层条件与训练设置的影响。
阅读本篇目录
完成闭壳层训练后,不要只看一个训练损失。先看每个原子的两通道布居,再检查分子电子数、电荷和自旋布居。参考数据与图片程序已打包。
1 生成图片和参考表#
bash plot.sh
六张实际结构和数据图生成到 figures/。
head -n 6 tables/population-results.csv
这是提供的原始参考结果。自己的新训练结果在 tables-new/population-results.csv,字段包括布居RMSE、电荷RMSE、α/β总电子数误差、分子总电荷误差和原子自旋布居差。
2 读取本轮实际输出#
head -n 8 new-work/p100-population/lcurve.out
P100模型文件在 new-work/p100-population/;使用V100时目录前缀改为 v100-。保存下来的检查点是神经网络权重,和Gaussian的CHK不是同一种文件。
cat new-work/API-p100-gpu/METRICS.json
同目录的 predictions.npz 保留原生布居、真实标签、换算电荷以及刚体变换的输出;CPU对照在 API-p100-cpu/。
程序使用的原生调用是:
from deepmd.infer.deep_population import DeepPopulation
model = DeepPopulation("frozen_model.pth")
population = model.eval(coordinates, None, [0, 1, 1, 1])[0]
alpha = population[:, :, 0]
beta = population[:, :, 1]
charge = nuclear_charge - alpha - beta
返回形状为(帧数,4,2),原子顺序仍为N、H1、H2、H3;None 表示非周期输入。本例全电子核电荷数组是 [7,1,1,1]。
3 检查总数与闭壳层条件#
对每一帧分别计算Σnα、Σnβ,应接近5;分子总电荷为Σq,应接近0;每个原子nα−nβ应满足当前闭壳层条件。

左图和中图由初始化前后的原生检查点预测得到:总布居保持不变,两通道差变为零。右图是完成额外训练后的实际分子电子数,α与β重合;本次每通道最大电子数误差约0.00501,分子总电荷最大偏差约0.01002 e,不能将它写成严格电中性。
同一权重的CPU/GPU、旋转、平移与相同H原子交换结果一致到数值精度。这里的检查针对当前原子布居模型,不能由此推出真实材料磁性或电子密度响应。
4 比较训练设置#

这个小例子对比了默认3000步、提高自旋项权重、继续训练至12000步,以及RHF对称起点后的额外3000步。各自实际输入保存在 reference/comparison-inputs/ 和 reference/inputs/,数值表在 reference/TRAINING-COMPARISON.json。
只提高某一项权重,可能同时影响电荷误差和总电子数;多训练一些步,也不等于自动满足物理约束。应结合标签定义、体系电子态与模型设定检查各项输出。同一小测试集在这段设置比较中被多次查看,本图是教学对比,不是未参与选择的盲测结果。 用于自己的科研体系时应另留独立测试数据。
本例只学习NH₃小范围几何的RHF Mulliken布居,不提供能量和原子力,不能直接替代MD势函数。开壳层、磁性、带电体系或其他布居方法,需要对应的真实标签与合适模型条件。接口定义见DeePMD3.2原生DeepPopulation实现。