Phonopy ALM力常数拟合实操
用真实Si位移—力标签运行ALM二阶拟合,核对原子对应并与同条件symfc结果比较。
阅读本篇目录
下载拟合、声子与短SSCHA操作包。在已分配的CPU资源中,以普通账号解压到新目录:
unzip phonopy-optional-alm-mlp-sscha-wave246.zip -d phonopy-optional
cd phonopy-optional
bash setup.sh
bash run.sh
setup.sh按包内实际使用的Linux x86_64版本清单创建个人.env,不修改公共模块;需要联网下载conda-forge包和足够的个人目录空间。run.sh依次拟合ALM及多项式势,计算势函数声子,运行两组短SSCHA,再提取数据和画图。计算均使用1个CPU线程,不需要GPU;结果放在fit/、native/、analysis/、figures/,已有结果目录不覆盖。
可选环境使用Phonopy4.8.3、pypolymlp0.22.1、symfc1.7.3、Python3.11.18、NumPy2.4.6;由conda-forge预编译包组成,实际C/C++运行库libgcc/libstdcxx为16.2.0。ALM的conda包版本为2.0.0_dev.2,Python元数据显示1.2.0;这里的ALM是ttadano/ALM力常数拟合库,不要安装PyPI中同名的金融建模ALM0.0.1。绘图另用集群phonopy/4.8.3模块中的Matplotlib。
本例复用实际Si位移—力数据:Si16,晶格常数5.43 Å,共65个构型,其中48个训练、8个验证、8个独立测试以及1个平衡参考。标签来自此前集群实际运行的GPUMD5.9.1 Si NEP势计算,不是DFT标签。固定原子序、位移和数据划分,测试集不参与拟合或选参数。模型输出中的dataset_type: vasp是库的默认格式字段,不改变本例标签来源。
1 把位移—力数组交给Phonopy#
cat fit/ALM-METRICS.json
head -n 12 fit/alm/FORCE_CONSTANTS
fit.py先按周期坐标将数据集原子映射到Phonopy超胞,位移和力同时换序。再使用48个训练构型写出fit/alm/phonopy_params.yaml,其中是type-2完整位移—力数据集:
phonon.dataset = {
"displacements": train_displacements,
"forces": train_forces,
}
phonon.save("phonopy_params.yaml",
settings={"force_sets": True, "displacements": True})
两组数组形状均为(48,16,3)。位移是笛卡尔Å,力为eV/Å。不能直接把分数坐标位移作为Å,也不能只换结构原子序而不换力的原子序。
2 运行原生ALM拟合#
需要单独重做ALM时,复制输入到一个新目录。下面使用与脚本相同的选项:
mkdir manual-alm
cp fit/alm/phonopy_params.yaml manual-alm/
cd manual-alm
../.env/bin/phonopy phonopy_params.yaml \
--fc-calc alm --fc-calc-opt 'cutoff=4.2' \
--no-fc-symmetry --full-fc --writefc \
--qpoints '0.25 0 0'
cd ..
本例截断4.2 Å,拟合二阶力常数,FORCE_CONSTANTS形状为16×16×3×3,单位eV/Ų。--no-fc-symmetry关闭Phonopy拟合后的额外对称投影;ALM自身使用的晶体对称性和约束仍生效。
**要让--fc-calc alm真正用于回归,应提供type-2随机位移数组。**传统type-1单原子有限位移数据走传统力常数重建流程,不应仅凭命令里出现ALM参数就认为已调用ALM。
本例与此前相同48个训练构型、相同4.2 Å范围的symfc二阶结果一致。它们都使用同一份输入标签,没有新增受力计算。
3 用独立构型检查力预测#
程序使用F=−Φu从导出的力常数独立重建力,再与原标签比较:
| 数据集 | 构型数 | 力RMSE/eV·Å⁻¹ |
|---|---|---|
| 训练 | 48 | 0.08761220 |
| 验证 | 8 | 0.05405662 |
| 独立测试 | 8 | 0.05233676 |

误差没有因为程序结束而自动消失。这里是二阶谐模型、有限相互作用范围与有限位移标签的比较;更大位移上的非谐力不一定能由二阶模型表达。图中多项式势采用5.0 Å和不同模型形式,差别不应解释为ALM或symfc求解器本身的精度排名。