ALAMODE专题

ALAMODE高阶力常数:从原子力拟合三阶与四阶项

用Si64真实GPU原子力,演示位移生成、提力、NORDER与NBODY设置、三阶四阶拟合及新结果接入。

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

谐波教程主要拟合二阶力常数。如果希望继续研究非谐效应,需要增加三阶、四阶等项。本页用同一个 Si64经典Stillinger–Weber(SW)势模型 演示完整操作;它不是DFT硅的实算结果,也不代表已经算出了热导率或自洽声子。

1. 先理解这次算什么#

设置 本例内容
结构 金刚石Si,2×2×2常规晶胞,共64原子,a=5.43Å
参考原子力 LAMMPS双精度Kokkos,P100与V100 16G实际运行
位移数据 32个随机方向组,每组3个位移幅度、正负配对,共192个快照
拟合数据 24个方向组;另外8个方向组独立留出
对比模型 仅FC2、FC2+FC3、FC2+FC3+FC4

另外的平衡参考与硬件对照使原始计算共有200个静态力条件;它们服务于同一个高阶力常数工作流,不是200种不同性质。

实际Si64位移结构与数据设置

幅度0.005、0.015、0.03Å指所有原子笛卡尔分量的均方根位移,不是每个原子的最大位移。生成时去除整体平移,随机种子固定为20261105188。图中位移放大5倍便于看清,计算仍使用原始幅度。

2. 下载后先复现已完成的数据#

下载高阶力常数输入、原子力、脚本与结果(ZIP)。在新目录解压:

unzip alamode-higher-order-wave188-*.zip -d alamode-highorder
cd alamode-highorder
cat README.md

进入已分配且支持AVX-512的CPU环境后运行:

module load alamode/1.5.0
bash run.sh

脚本按顺序重建位移结构、调用原生提力工具核对单位、运行ALM拟合、提取验证结果和画图。默认使用附件里真实计算过的原子力,不自动提交GPU作业。结果分别保存在 generated-model/、extracted/、fit/、analysis/、figures/;参考数据保留在 reference/。

3. 位移与原子力怎样准备#

本例位移由ASE根据固定种子生成,可单独执行:

module load alamode/1.5.0
python make-displacements.py
ls generated-model/p100

该命令是默认 run.sh 的第一步;已有 generated-model/ 时会保留目录并停止,重复操作请用新解压目录。它会逐字节核对200个参考结构,不能在只改结构、不改位移元数据的情况下继续套用旧数据。

实际LAMMPS原子力输入为:

package kokkos neigh half
newton on
units metal
atom_style atomic/kk
boundary p p p
read_data structure.lmp
mass 1 28.0855
pair_style sw/kk
pair_coeff * * Si.sw Si
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
dump f all custom 1 force.dump id xu yu zu fx fy fz
dump_modify f sort id format float %24.17e
thermo 1
thermo_style custom step atoms pe press fmax
run 0

run 0 只计算给定结构的力,不做分子动力学,也不优化掉人为位移。units metal 的力单位为eV/Å;dump_modify ... %24.17e 保留足够数值精度。

要重新计算,先在根目录生成P100批次工作目录:

python3 new-case.py p100
cd work/p100
sbatch run.sh
squeue -u "$USER"

回到附件根目录,对V100批次重复:

python3 new-case.py v100
cd work/v100
sbatch run.sh

两批都完成后,回到根目录接入新力结果:

bash run-new.sh

它检查新输出与配套模型输入,将全部结果写入独立 new-workflow/ 再拟合和画图。原 force-cases/ 参考结果保持不动;一个批次尚未结束时,不要先把部分数据当成完整训练集。

4. 提取位移和力,注意单位#

默认脚本调用:

python extract-forces.py
head extracted/DFSET_native

其中使用ALAMODE自己的 extract.py;单个文件的等价操作示例为:

python /public/software/alamode/1.5.0/8173m/tools/extract.py \
  --LAMMPS model/Si64.lammps --unit Rydberg \
  force-cases/p100/d00-a005-p/force.dump > DFSET_one

ALM读取的位移单位为Bohr,力为Ry/Bohr。脚本将原生提取结果与原始dump独立对比;extracted/DFSET_native保留原生文本。拟合的数据文件由原始dump做完整精度单位转换,避免提取器文本输出的小数截断。

这里保留正负位移各自的原始力,不像谐波示例那样只取反对称部分。 正负力的偶次分量也含有三阶能量项的信息,全部丢掉会影响高阶拟合。

5. NORDER、NBODY与截断半径#

目标 NORDER 最高能量项
谐波 1 二阶FC2
加入三阶 2 三阶FC3
加入四阶 3 四阶FC4

本例四阶模型使用:

&interaction
 NORDER = 3
 NBODY = 2 3 3
/
&cutoff
 Si-Si 8.5 8.5 8.5
/

NBODY限制各阶项里不同原子的体数,不等于Taylor多项式阶数。SW势本身最多含三体相互作用,所以本例四阶项仍允许最多3个不同原子;DFT材料不能直接照抄这个限制。

截断单位是Bohr,8.5Bohr约4.50Å。本例邻近Si–Si键及邻居之间的间距落在这个范围内。换材料、超胞或相互作用模型后,应重新检查范围、数据量和留出误差。

下面是实际四阶全训练输入,完整晶胞与原子位置也包含在内:

展开查看完整fit.in
&general
 PREFIX = si64_highorder
 FCSYM_BASIS = C
 HESSIAN = 1
 MODE = optimize
 NAT = 64; NKD = 1
 KD = Si
/
&interaction
 NORDER = 3
 NBODY = 2 3 3
/
&cell
 20.5224257265890415
 1 0 0
 0 1 0
 0 0 1
/
&cutoff
 Si-Si 8.5 8.5 8.5
/
&position
1 0.0000000000000000 0.0000000000000000 0.0000000000000000
1 0.1250000000000000 0.1250000000000000 0.1250000000000000
1 0.0000000000000000 0.2500000000000000 0.2500000000000000
1 0.1250000000000000 0.3750000000000000 0.3750000000000000
1 0.2500000000000000 0.0000000000000000 0.2500000000000000
1 0.3750000000000000 0.1250000000000000 0.3750000000000000
1 0.2500000000000000 0.2500000000000000 0.0000000000000000
1 0.3750000000000000 0.3750000000000000 0.1250000000000000
1 0.0000000000000000 0.0000000000000000 0.5000000000000000
1 0.1250000000000000 0.1250000000000000 0.6250000000000000
1 0.0000000000000000 0.2500000000000000 0.7500000000000000
1 0.1250000000000000 0.3750000000000000 0.8750000000000000
1 0.2500000000000000 0.0000000000000000 0.7500000000000000
1 0.3750000000000000 0.1250000000000000 0.8750000000000000
1 0.2500000000000000 0.2500000000000000 0.5000000000000000
1 0.3750000000000000 0.3750000000000000 0.6250000000000000
1 0.0000000000000000 0.5000000000000000 0.0000000000000000
1 0.1250000000000000 0.6250000000000000 0.1250000000000000
1 0.0000000000000000 0.7500000000000000 0.2500000000000000
1 0.1250000000000000 0.8750000000000000 0.3750000000000000
1 0.2500000000000000 0.5000000000000000 0.2500000000000000
1 0.3750000000000000 0.6250000000000000 0.3750000000000000
1 0.2500000000000000 0.7500000000000000 0.0000000000000000
1 0.3750000000000000 0.8750000000000000 0.1250000000000000
1 0.0000000000000000 0.5000000000000000 0.5000000000000000
1 0.1250000000000000 0.6250000000000000 0.6250000000000000
1 0.0000000000000000 0.7500000000000000 0.7500000000000000
1 0.1250000000000000 0.8750000000000000 0.8750000000000000
1 0.2500000000000000 0.5000000000000000 0.7500000000000000
1 0.3750000000000000 0.6250000000000000 0.8750000000000000
1 0.2500000000000000 0.7500000000000000 0.5000000000000000
1 0.3750000000000000 0.8750000000000000 0.6250000000000000
1 0.5000000000000000 0.0000000000000000 0.0000000000000000
1 0.6250000000000000 0.1250000000000000 0.1250000000000000
1 0.5000000000000000 0.2500000000000000 0.2500000000000000
1 0.6250000000000000 0.3750000000000000 0.3750000000000000
1 0.7500000000000000 0.0000000000000000 0.2500000000000000
1 0.8750000000000000 0.1250000000000000 0.3750000000000000
1 0.7500000000000000 0.2500000000000000 0.0000000000000000
1 0.8750000000000000 0.3750000000000000 0.1250000000000000
1 0.5000000000000000 0.0000000000000000 0.5000000000000000
1 0.6250000000000000 0.1250000000000000 0.6250000000000000
1 0.5000000000000000 0.2500000000000000 0.7500000000000000
1 0.6250000000000000 0.3750000000000000 0.8750000000000000
1 0.7500000000000000 0.0000000000000000 0.7500000000000000
1 0.8750000000000000 0.1250000000000000 0.8750000000000000
1 0.7500000000000000 0.2500000000000000 0.5000000000000000
1 0.8750000000000000 0.3750000000000000 0.6250000000000000
1 0.5000000000000000 0.5000000000000000 0.0000000000000000
1 0.6250000000000000 0.6250000000000000 0.1250000000000000
1 0.5000000000000000 0.7500000000000000 0.2500000000000000
1 0.6250000000000000 0.8750000000000000 0.3750000000000000
1 0.7500000000000000 0.5000000000000000 0.2500000000000000
1 0.8750000000000000 0.6250000000000000 0.3750000000000000
1 0.7500000000000000 0.7500000000000000 0.0000000000000000
1 0.8750000000000000 0.8750000000000000 0.1250000000000000
1 0.5000000000000000 0.5000000000000000 0.5000000000000000
1 0.6250000000000000 0.6250000000000000 0.6250000000000000
1 0.5000000000000000 0.7500000000000000 0.7500000000000000
1 0.6250000000000000 0.8750000000000000 0.8750000000000000
1 0.7500000000000000 0.5000000000000000 0.7500000000000000
1 0.8750000000000000 0.6250000000000000 0.8750000000000000
1 0.7500000000000000 0.7500000000000000 0.5000000000000000
1 0.8750000000000000 0.8750000000000000 0.6250000000000000
/

&optimize
 DFSET = DFSET_train
 LMODEL = ols
 ICONST = 11
 NDATA = 144
/

FCSYM_BASIS=C使用笛卡尔基底,ICONST=11施加平移约束。本例采用OLS,脚本一共生成三个阶数、全训练及三折组合的12个原生拟合目录。

6. 查看力常数输出#

cd fit/order3-full
ls si64_highorder.xml si64_highorder.fcs si64_highorder.hessian
grep 'Number of free' fit.log

.xml供ANPHON后续计算读取;.fcs保留力常数条目;.hessian是二阶Hessian矩阵,不是四阶张量。怎样判断模型是否学到了未参与拟合的数据,继续看分组交叉验证与留出检查。

ALAMODE 1.5.0采用Intel oneAPI 2024.2、Intel MPI和MKL,当前CPU构建包含AVX-512;参考原子力采用LAMMPS 30Sep2026、Kokkos 5.2.1、CUDA 12.8双精度路径。Python结构与分析操作使用现有ASE环境。官方高阶力常数教程、ALM输入说明

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

查看配图

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

100%查看原图 ↗