LAMMPS 合金组成与元素映射
Cu–Ni实际输入、type与元素映射反转、五种组成、GPU/Kokkos和ASE结构导出。
阅读本篇目录
下载完整输入、势文件、实际结果与绘图脚本,在一个新目录解压后,先查看已有结果:
bash run.sh
得到 analysis/ 和 figures/。重新计算时先核对 submit.slurm 的分区适合自己的账户,然后:
sbatch submit.slurm
模板申请1个CPU核、1个P100,顺序计算76个小体系条件,再分析自己的结果。直接运行 bash run.sh compute 或文中的 lmp 命令时,必须已经处于分配好的计算资源中。已有 work/analysis/figures 时请另解压一份;只有 work 而没有分析/图目录时可用 bash run.sh analyze 继续后处理。
本例使用LAMMPS 30Sep2026,GCC 13.3、OpenMPI 5.0.10、CUDA 12.8;GPU包Mixed Precision,Kokkos 5.2.1双精度。已链接PLUMED 2.9.4,本文没有施加偏置。后处理使用ASE 3.29环境的NumPy与Matplotlib。普通CPU计算路径在同一P100计算资源上完成,不是Intel Xeon 8173M性能测试。
1. 先明确原子类型与元素#
pair_coeff 中的元素名按LAMMPS类型编号依次排列。下面的 Ni Cu 表示type 1是Ni、type 2是Cu;势文件头部自己的元素排列不要求与类型编号相同。
本例用FCC常规晶胞沿三方向各重复3次,共108原子,固定晶格常数3.57 Å。前54个原子ID替换为Cu,其余54个为Ni。这样可以精确检查组成和元素映射,它是按ID确定的有序有限结构,不是随机合金采样。

2. Cu–Ni完整输入#
inputs/cuni-composition-0p5-cpu/in.lammps:
newton on
units metal
atom_style atomic
boundary p p p
lattice fcc 3.57
region box block 0 3 0 3 0 3
create_box 2 box
create_atoms 1 box
group copper id <= 54
set group copper type 2
pair_style eam/alloy
pair_coeff * * potentials/CuNi.eam.alloy Ni Cu
neighbor 0.5 bin
neigh_modify every 1 delay 0 check yes
compute pea all pe/atom
compute pesum all reduce sum c_pea
thermo 1
thermo_style custom step atoms pe vol press c_pesum
thermo_modify norm no format float %.16g
run 0
write_dump all custom final.dump id type mass x y z fx fy fz c_pea modify sort id format float %.16g
print "$(pe:%.16g) $(vol:%.16g) $(press:%.16g) $(c_pesum:%.16g)" file energy.dat screen no
group copper id <= 54 选中54个原子,再通过 set group copper type 2 指定Cu。run 0只评价当前结构的能量、力和压力,不推进MD,因此没有积分fix的提示在这里是正常的。thermo_modify norm no 保留全胞能量;除以108才是每原子能量。
先完成本篇开头的整套提交最方便。需要单独运行这份输入时,在已经分配好的计算资源中执行:
module purge
module load lammps/30Sep2026-p100-gpu
cd inputs/cuni-composition-0p5-cpu
cp -r ../../potentials .
lmp -in in.lammps
cat energy.dat
energy.dat四列依次为全胞势能eV、体积ų、压力bar、逐原子势能求和eV。输入里的势文件路径相对当前计算目录,不要只复制 in.lammps 却漏掉 potentials/。
3. 更改编号时必须同步更改映射#
下载包中的 inputs/cuni-mapping-0-cpu/in.lammps 重新建立同一个物理结构,然后交换类型编号:
group oldone type 1
group oldtwo type 2
set group oldone type 2
set group oldtwo type 1
pair_style eam/alloy
pair_coeff * * potentials/CuNi.eam.alloy Cu Ni
现在type 1为Cu,type 2为Ni。两个组先定义再交换,避免第二次操作把已经改过类型的原子一起选进去。元素实际位置与质量保持原样,只改变编号;本例两份普通路径输入得到相同的能量、力与压力。只交换 Ni Cu 而不交换原子类型,会更改真实的元素分布。
势文件自带质量为Ni 58.689、Cu 63.546,程序按元素映射读取;不要把原子质量和编号随意对换。
4. 五种组成的实际结果#
所有组成都保持相同的3.57 Å晶胞,不做原子或晶胞优化。以下端元参照也取自同一个晶胞:
ΔE = E(x) − [(1−x)E(Ni) + xE(Cu)],所有能量按每原子表示。
| Cu原子分数 | Cu/Ni原子数 | 势能 eV/atom | 同胞端元参照差 meV/atom |
|---|---|---|---|
| 0.00 | 0/108 | -4.43930914 | 0.00000 |
| 0.25 | 27/81 | -4.18498987 | 27.64196 |
| 0.50 | 54/54 | -3.94873625 | 37.21827 |
| 0.75 | 81/27 | -3.73101151 | 28.26570 |
| 1.00 | 108/0 | -3.53259990 | 0.00000 |

这条曲线只说明在给定势、坐标和固定晶胞下怎么整理组成数据。端元没有各自充分松弛,也没有构型/振动熵,不能直接称为平衡混合焓、混合自由能或相图。正式物性计算应先选择合适相、结构优化方式和构型采样方案。
在包根目录查看生成的表格:
head analysis/composition.csv
head analysis/backend-errors.csv
5. GPU/Kokkos怎么选#
Cu–Ni的 eam/alloy 在本例分别实际使用普通路径、eam/alloy/gpu和eam/alloy/kk。GPU包输入配套 package gpu 1 neigh no、newton off;Kokkos配套原子样式和积分器。不要只给所有命令机械地加相同后缀。完整输入都在 inputs/,整套脚本自动切换模块。
6. 用ASE导出可视化结构#
回到包根目录,读取已有的50%Cu原生dump并输出扩展XYZ:
module purge
module load ase/3.29.0
python - <<'PY'
from ase.io import read, write
a = read('reference/cases/cuni-composition-0p5-cpu/final.dump',
format='lammps-dump-text', specorder=['Ni', 'Cu'])
write('alloy-export.xyz', a)
print(a.get_chemical_formula(), len(a))
PY
本例得到 Cu54Ni54 108。specorder按该份输入的类型顺序填写;对编号反转的case要改成 ['Cu', 'Ni']。重算后的结构从自己的 work/cases/ 读取,不要仍指向已有 reference/。导出的XYZ可交给OVITO等工具查看。
继续查看ADP与MEAM的Kokkos实操和能量、力与压力的独立检查。三种EAM文件格式的区别见已有格式教程。LAMMPS官方EAM命令及下载包势文件头保留具体作者和引用。