LAMMPS 专题

LAMMPS EOS与晶格体积实操

终端提取九点EOS、使用ASE拟合晶格与体积模量,独立检查能量导数和原生压力。

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

获得一组体积与能量后,可以用状态方程拟合平衡体积和体积模量。本篇直接使用前两篇的五个真实势模型,说明从原生文件到ASE拟合、检查拟合范围,再用独立差分对照压力的步骤。

下载五种势模型输入、冻结势文件、实际EOS和压力数据、ASE分析脚本,解压进入run.sh目录。

1 提交整套流程#

sbatch submit.slurm

模板申请核时P100分区1GPU1CPU,顺序完成五种势的普通EOS、三种EAM的GPU对照及五组普通路径压力差分。共有8个EOS后端运行、每个9个体积点,另有5个压力检查、每个3点,共87次固定结构能量与压力求值;按五个势模型工作流组织。

套餐用户用yskit生成所属分区脚本,在已分配资源中执行bash run.sh;不要在登录节点计算。多卡仅使用分配的CUDA可见设备和CPU亲和范围,每卡一个势模型工作流,每程序1MPI1OMP。已有work请重新解压。

LAMMPS30Sep2026、GNU C++13.3.0/C++17、Open MPI5.0.10、CUDA GPU包混合精度;分析ASE3.29.0。普通路径在同一P100节点运行,不是CPU专用节点的性能数据。inputs保存新输入、DATA为本例势文件、reference为实际原始输出、work为新计算。

2 先看原始文件与单位#

cat work/cases/eam-funcfl-cpu/eos.dat
cat work/cases/eam-fs-cpu/eos.dat

每行EOS后依次为常规格常数a、整盒体积V、整盒势能E、原生压力P和原子数N。metal单位下a为Å、V为ų、E为eV、P为bar;thermo_modify norm no表示没有按原子数归一化。

拟合前将V、E分别除以N。FCC每原子体积为a³/4、BCC为a³/2、金刚石为a³/8,用相应关系把拟合V₀换回常规晶胞格常数,不能把每原子体积直接开立方就当a。

3 用ASE完成拟合#

module load ase/3.29.0
python - <<'PY'
import numpy as np
from ase.eos import EquationOfState
from ase.units import GPa
t = np.loadtxt('work/cases/eam-funcfl-cpu/eos.dat', usecols=(1,2,3,4,5))
n = t[0,4]
v = t[:,1] / n
e = t[:,2] / n
eos = EquationOfState(v[2:7], e[2:7], eos='birchmurnaghan')
v0, e0, bulk = eos.fit()
print('V0 per atom / A^3:', v0)
print('FCC lattice a0 / A:', (4*v0)**(1/3))
print('B / GPa:', bulk/GPa)
PY

脚本取九点中的中央五点,即基准格常数±2%范围;本包分析还对全部九点另做拟合,保留两种结果与残差。要用自己的体系,先确认采样包住最低点,再选择合适范围和方程,不直接截取任意五行。

4 实际局部拟合结果#

势模型 元素/结构 局部拟合a₀/Å 局部拟合B/GPa 九点拟合B/GPa
eam-funcfl Ni/fcc 3.520001 180.4987 180.1922
eam-alloy Ni/fcc 3.519997 180.8931 181.7480
eam-fs Fe/bcc 2.855236 176.5702 169.7258
adp Al/fcc 4.049999 77.6742 77.9154
meam Si/diamond 5.431001 97.5623 97.3951

这些是当前势、当前结构、静态体积路径和所选拟合方程得到的参数,不是实验值,也没有包含温度或零点振动。九点与五点结果不同,尤其Fe例子的B对范围较敏感;后续应按所需精度细化体积点、检查残差和拟合方式。

左:同一数据的局部五点与九点体积模量;右:另行实际计算的能量差分压力误差

5 独立计算能量导数与压力#

压力应与固定原子缩放路径下的−dE/dV相符。本包在每种势基准格常数的0.99倍附近,再独立计算a−0.0001、a、a+0.0001Å三个点,使用两端整盒E与V构造差分,并和中心点原生virial压力比较。

一个完整压力控制输入为:

units metal
atom_style atomic
boundary p p p
lattice fcc 3.52
region box block 0 4 0 4 0 4
create_box 1 box
create_atoms 1 box
pair_style eam
pair_coeff * * ../DATA/Ni_u3.eam
neighbor 0.3 bin
thermo_style custom step atoms pe vol press
thermo_modify norm no format float %.16g
variable a index 3.4847 3.4848 3.4849
label scan
change_box all x final 0 $(4*v_a) y final 0 $(4*v_a) z final 0 $(4*v_a) remap units box
run 0
print "EOS ${a} $(vol:%.16g) $(pe:%.16g) $(press:%.16g) $(atoms:%.0f)" append eos.dat screen no
write_dump all custom atoms-${a}.dump id type x y z fx fy fz modify sort id format float %.16g
next a
jump SELF scan
cat work/cases/eam-funcfl-pressure/eos.dat
cat work/analysis/pressure-check.csv
势模型 原生压力/bar 能量差分压力/bar 差分−原生/bar
eam-funcfl 58029.468034 58029.482656 0.014621
eam-alloy 58112.670800 58112.684132 0.013333
eam-fs 45704.925423 45704.927537 0.002114
adp 23863.274058 23863.275268 0.001210
meam 31373.163374 31373.167513 0.004140

本例五组差值均小于0.02bar。分析用ASE的bar常数将eV/ų转换成bar;若只把GPa和bar混用,数值会相差10000倍。

这个导数检查针对原生能量与原生压力的一致性;状态方程拟合本身仍是近似。拟合曲线的压力导数不必在宽体积区间逐点精确等于原生压力,因此还要保留拟合残差和范围对照。

6 换成自己的模型#

先确定势文件、元素映射与初始结构,再在合理体积范围固定形状扫描;逐点检查原子数、实际体积和能量。采样包住最低点后,用ASE拟合并检查范围依赖。合金、缺陷或低对称模型通常还需要在固定晶胞下松弛内部原子,任意晶胞形状的优化则需要相应自由度,不能只沿本例的一个立方格常数扫描。

提取与重画#

module load ase/3.29.0
python analyze.py work
python plot_results.py work
python check_results.py work
cat work/analysis/eos-fits.csv
cat work/analysis/pressure-check.csv

eos-fits.csv包含局部五点与完整九点两种拟合的晶格常数、每原子体积、能量、体积模量和拟合残差;pressure-check.csv保存原生压力与独立能量差分。JSON还保存所有原始扫描值和GPU对照。查看本文数据时将work改成reference。

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

查看配图

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

100%查看原图 ↗