LAMMPS 镍双晶与晶界建模
用Atomsk建立两种晶向,拼接周期双晶、处理重叠,再用GPU松弛并保留真实结构与能量。
阅读本篇目录
本篇跑通 Atomsk 定向建晶 → 拼接双晶 → 处理过近原子 → GPU 松弛 → 结构输出。采用 Ni 的 Σ5(310)[001] 对称倾斜晶界;所有结构和结果来自鸢算科技集群真实运行。下一篇继续提取面积归一化晶界能,并用 OVITO 检查取向。
1. 下载与建立模型#
python3 -m zipfile -e lammps-Ni-bicrystal-wave554-dcb5133a1057.zip Ni-bicrystal
cd Ni-bicrystal
bash build.sh
这一阶段在登录节点以一个 CPU 线程调用 Atomsk,再组装结构,不提交 GPU 松弛。
ls work/models
head -n 16 work/models/GB-shift0.0-prune1.4.data
2. 两种晶向与周期界面#
Ni 晶格常数取 a=3.52 Å,两个晶体的模拟坐标为:
| 晶粒 | x 轴晶向 | y 轴晶向 | z 轴晶向 |
|---|---|---|---|
| A | [1−30] | [310] | [001] |
| B | [130] | [−310] | [001] |
y 垂直于晶界,z 为公共 [001] 倾斜轴。考虑立方晶体对称等价后,理想最小错取向角为 36.86989765°;不能只把两个带符号基向量的几何夹角直接当作晶体错取向角。
脚本实际调用:
atomsk --create fcc 3.52 Ni orient [1-30] [310] [001] -duplicate 4 8 4 A.lmp
atomsk --create fcc 3.52 Ni orient [130] [-310] [001] -duplicate 4 8 4 B.lmp
Atomsk 采用该 FCC 晶向的最小正交周期,x、y 原生周期约为 5.56560868 Å。复制后每份完整定向晶体有 1280 原子,盒长为 22.26243473×44.52486946×14.08 Å。
组装时选择 A 的下半个 y 区域、B 的上半个 y 区域,使用三方向周期边界。因此不仅 y 中部有一个界面,y 的周期接缝还形成另一个界面;后面能量归一化要除以两份面积。
3. 相对平移和过近原子#
初始结构比较两种 B 晶粒的相对 x 平移:0、半个原生 x 周期,后者约为 2.78280434 Å。平移后按周期边界回卷,不改变晶胞。
随后检查跨晶粒原子间的最小镜像距离。对每个 A 原子,如果有距离小于指定阈值的 B 原子,就删除相应 B 原子,A 原子保留。本例比较 1.4 Å 和 1.8 Å 两个阈值。
这两个阈值在每一种平移下均删除相同的 32 个 B 原子,得到相同的 1248 原子数据文件。程序保留这个对照与别名,只对同一结构计算一次。不要把“四组输入参数”误当作四个独立晶界结构。
另外保留完整 A、B 两个完美周期晶体作为参考。最终是四个独立初始结构:完美 A、完美 B、两种平移的双晶。

图中仅投影 z 范围前 3.52 Å 的原子,以便看清排列。FCC 原子按最初所属晶粒标为蓝/橙,灰色为 OVITO PTM 的 Other 局部环境;这两种彩色是初始粒子来源标签,不是假定晶界不会发生局部重构。
4. 提交 GPU 松弛#
bash run.sh
完整对照需要 P100 和 V100 16G 两个分区权限。两份 Slurm 分配分别执行四个结构的松弛;每份用 1 GPU、2 个申请的 CPU 核心、1 MPI、1 OpenMP 线程。之后还有一个 V100 16G 作业,对相同 P100 末态做静态单点和能量差分。所有 GPU 计算都经普通账号 Slurm;排除 TC 分区成员与 V100 32G。
作业号保存在 work/SUBMISSIONS.json 与 work/CROSS-SUBMISSION.json。终端中断后先检查这些文件和 squeue,不要重复提交。新一轮完整计算使用新解压目录。
cat work/p100-GB-shift0.0-prune1.4/in.lmp
本例实际输入如下:
units metal
atom_style atomic
boundary p p p
read_data ../models/GB-shift0.0-prune1.4.data
pair_style eam
pair_coeff * * ../Ni_u3.eam
neighbor 2.0 bin
neigh_modify every 1 delay 0 check yes
compute e all pe/atom
compute Esum all reduce sum c_e
variable ff atom fx*fx+fy*fy+fz*fz
variable af atom sqrt(v_ff)
compute Fsum all reduce sum v_ff
compute Fmax all reduce max v_af
variable Fn equal sqrt(c_Fsum)
thermo 100
thermo_style custom step atoms pe c_Esum c_Fmax v_Fn lx ly lz vol pxx pyy pzz
thermo_modify norm no format float %.16g
dump di all custom 1 initial.dump id type x y z fx fy fz c_e
dump_modify di sort id format float %.16g
run 0
undump di
print "initial $(pe:%.16g) $(c_Fmax:%.16g) $(v_Fn:%.16g) $(vol:%.16g)" append properties.dat screen no
min_style cg
min_modify dmax 0.05
minimize 0 0.002 8000 80000
dump df all custom 1 final.dump id type x y z fx fy fz c_e
dump_modify df sort id format float %.16g
run 0
undump df
print "final $(pe:%.16g) $(c_Fmax:%.16g) $(v_Fn:%.16g) $(vol:%.16g)" append properties.dat screen no
write_data final.data nocoeff
使用 Ni_u3.eam 经典势,固定晶胞,仅优化原子位置。min_style cg 与 min_modify dmax 0.05 控制共轭梯度松弛,力范数目标 0.002 eV/Å,最多 8000 次迭代、80000 次能量/力计算。这里没有 MD,也没有有限温度自由能。
5. 查看松弛结果#
head -n 9 tables/bicrystal-energies.csv

标记点是原生日志实际保存的输出,连线只是连接这些稀疏采样点,不代表保存了每一次 CG 迭代。P100 两种平移分别降低约 11.099361、23.503879 eV,末态力范数约 0.001313、0.001919 eV/Å。两种初态最终非常接近,不应把起始能量较高直接理解为最终晶界一定更高能。
本例使用 Atomsk 0.13.1,GFortran 13.3;LAMMPS 30Sep2026,GCC 13.3、CUDA 12.8、OpenMPI 5.0.10、Kokkos 5.2.1。势函数来源为 Foiles 等的 Ni EAM,Phys. Rev. B 33, 7983 (1986)。这一小胞示例不等于完成了相对平移、原子密度、晶胞厚度和全部重构结构的搜索。
参考:Atomsk 双晶教程、定向建晶命令。