我印象很深的一次翻车经历:用ATOMSK生成铝的堆垛层错模型,在OVITO里看ABC序列错位得清清楚楚,扔进LAMMPS一算层错能,出来310 mJ/m²,文献值才160左右。一开始怀疑势函数不对,换了三个EAM势依然偏高,最后才发现模型本身带了两个层错面,能量差忘了除以二。这种“每一步都好像没问题,连起来结果就离谱”的事,在面缺陷模拟里实在太常见。这篇就把我从ATOMSK建模、LAMMPS算层错能到OVITO可视化验证的完整流程,以及所有踩过的坑一起整理出来,适合正在做FCC金属层错能计算、被数值对不上文献折磨的人。
1. 先搞清楚模型里要造的是什么:堆垛层错的几何与能量
1.1 面缺陷的本质:ABCABC里的秩序破坏
FCC晶体沿<111>方向的密排面,正常堆叠顺序是ABCABCABC……无限重复。所谓堆垛层错,就是某个环节的堆叠顺序出现了异常。最简单的理解方式:把每一层原子看成一层“地板”,正常FCC是三种位置循环铺,一旦某两层之间的相对位置错了,就破坏了循环,形成一个二维的面缺陷。
按照缺陷形态,层错分两种。内禀层错(ISF)相当于在某个位置抽掉了一层,堆垛序列中会出现局部的ABAB特征;外禀层错(ESF)则是插入了一层,形成ABA的局部特征。几何上二者都表现为夹在FCC区域中间的一小段HCP密排结构,这也是后面OVITO里用CNA分析时,层错面上的原子会显示成HCP颜色、而不是FCC颜色的根本原因。
层错不是凭空存在的,它总是和位错联系在一起。Shockley不全位错的扫过区域,内部就是一片内禀层错;扩展位错的两条Shockley部分位错之间,也夹着一片层错带。这也是为什么材料学家这么关心层错能——它决定了扩展位错宽度、交滑移难易、孪生倾向,对塑性变形机制影响很大。
1.2 为什么用模拟算层错能:能量差公式的来历
实验测层错能的方法不少,比如透射电镜下测量扩展位错节点宽度、层错四面体尺寸等,但误差范围动辄百分之三四十。原子模拟的好处是,可以直接对比“有层错”和“无层错”两个体系的总能量差,再除以层错面积,得到单位面积的层错能。
标准公式是:
[ \gamma_{SF} = \frac{E_{SF} - E_{perfect}}{n \cdot A} ]
其中E_SF和E_perfect分别是层错模型和完美晶体模型的总能量,A是层错面面积,n是模型中包含的层错面数量。这个n极其关键,我后面会反复强调。很多人照文献公式抄作业,抄了个除以A,结果自己模型里因为周期性边界条件出现了两个层错面,算出来正好是文献值的两倍。
层错面积A怎么取?如果你的模型z轴沿[111]方向,xy平面就是(111)密排面,层错面是和xy平面平行的完整平面,A就等于盒子的Lx乘以Ly。单位方面,LAMMPS的metal单位制下能量是eV、长度是Å,算出来的层错能单位是eV/Ų。1 eV/Ų约等于16.02 J/m²,换算成常用单位,就是1 eV/Ų = 16021.8 mJ/m²。这个换算关系每次都要写对,否则结果和文献差好几个数量级。
1.3 建模的核心目标:两个体系除了层错没有任何区别
这个原则是整个建模工作的纲领。完美晶体模型和层错模型必须具备完全一致的原子数、盒子尺寸、原子类型和势函数参数,唯一区别是后半部分晶体是否沿特定方向平移了层错矢量。任何多余的删除原子、修改盒子尺寸、改变原子数量,都会让能量差里混入别的贡献,层错能的计算就失去意义。
所以建模型时我不推荐“建完层错再删掉边界原子做真空层”这种操作。表面能、镜像作用、原子缺失带来的弛豫,都会淹没层错面的能量信号。正确做法是保持三维周期性边界条件,让两个模型在完全相同的边界条件下做能量对比,误差项自然抵消。
2. ATOMSK建模:从命令写法到几何原理
2.1 方向选择:为什么非要把[111]摆到盒子某个轴
ATOMSK建层错的思路,是先生成一个完美FCC超胞,然后把某一层以上的原子整体平移一个层错矢量。要做这件事,首先必须保证密排面(111)和盒子的某个坐标面平行,这样“原子层”才能和“z坐标轴”对应起来。
我常用的命令是:
atomsk --create fcc 4.05 Al orient [1-10] [11-2] [111] -duplicate 20 20 20 Al_perfect.cfg这条命令生成一个晶格常数为4.05Å的FCC铝超胞,盒子的x、y、z轴分别对应[1-10]、[11-2]、[111]三个晶向,duplicate参数表示沿三个方向重复的周期数。如果把FCC结构想象成一摞盘子,[111]方向就是穿过盘心的垂直方向,xy平面正好是盘面——也就是密排面。
这里必须提一个极易踩的坑:orient后面的三个晶向要满足右手定则。很多人写orient [111] [1-10] [11-2],看着没问题,实际上[111]叉乘[1-10]得到的是[-1-12],和[11-2]正好反方向,ATOMSK会报错或者生成一个镜面对称的盒子。我在新旧版本ATOMSK上都遇到过这个问题,换个顺序或者把[11-2]改成[-1-12]通常就能解决。模型建好以后,应该把盒子坐标输出到屏幕上确认三轴的夹角是90度,再开始duplicate。
2.2 duplicate参数与盒子尺寸:层错面积和镜像距离的平衡
duplicate的数量不是随便定的。x和y方向的重复次数决定了层错面积A。比如铝的晶格常数4.05Å,沿[1-10]方向一个周期长度是4.05乘以根号2再除以2,大约2.86Å,重复20次就是约57Å;沿[11-2]方向一个周期大约是4.05乘以根号6除以2,约4.96Å,重复20次约99Å。这样层错面积大概有5600Ų,足够让能量差的信号远高于数值涨落。
z方向重复次数决定了两个相邻层错镜像之间的距离。由于周期边界条件,一个层错模型里实际有两个层错面,如果z方向太短,两个层错面靠得太近,彼此的弹性交互作用会污染能量。我的经验是z方向至少要有20层以上的(111)原子层,也就是重复次数在15到20以上比较好。模型总原子数通常在几万个到十几万个,LAMMPS跑起来毫无压力,没必要为了省计算量把盒子做太小。
2.3 制造层错:平移半块晶体,而不是删掉一层
ATOMSK新版本虽然有专门的堆垛层错生成选项,但不同版本的参数格式有差异,而且很多人用的还是老版本。我最推荐的通用做法是用-select配合-shift手动平移,原理透明、版本兼容性好,出了问题也知道去哪查。
操作分三步。第一步,先查一下生成盒子沿z方向的总长度,找一个位于原子层间隙处、接近盒子一半高度的z坐标作为切割面。第二步,选中该平面以上的所有原子。第三步,把选中的原子整体平移层错矢量R。
对FCC内禀层错,R通常取Shockley不全位错对应的位移矢量,也就是a/6<112>类方向。当盒子x、y、z方向是[1-10]、[11-2]、[111]时,这个位移矢量正好落在xy平面内。对铝来说a=4.05Å,R的模长是a/6乘以根号6,算出来约1.6536Å。完整命令如下:
# 生成完美晶体 atomsk --create fcc 4.05 Al orient [1-10] [11-2] [111] -duplicate 20 20 20 Al_perfect.cfg # 平移z坐标20.5以上的原子,注意这个20.5要按实际盒子高度调整 atomsk Al_perfect.cfg -select above 20.5 -shift above 0.0 1.6536 0.0 -wrap Al_sf.cfg # 转成LAMMPS data文件 atomsk Al_sf.cfg lmp注意这里-shift above后面的位移向量是0、1.6536、0,因为层错矢量恰好沿着y轴方向。如果你用的盒子方向和我不同,向量分量要重新投影。-wrap选项会把越出盒子的原子折回盒子内部,这是必要的,否则后续LAMMPS读入时会因为坐标越界报错。
还有一个关键点:这种平移方案不会删除任何原子,也不会改变原子层之间的垂直距离,所以不需要再手动清理重叠原子。平移后上半部分和下半部分在切割面处重新叠放,形成层错;同时,顶层原子被wrap到底层区域,在盒子顶底边界处也会形成一个等价层错。
2.4 模型自检:用“数”而不是用“看”来验证
建模完成后,别急着进LAMMPS,先做几个最基础的检查。第一,原子总数是否和完美晶体一致。理论上平移不改变原子数,但如果你的ATOMSK版本在-wrap后悄悄合并了重复原子,总数就会变化,这时候能量差公式里的体积项会出问题。
第二,检查层错面对应的原子层数是否正确。我习惯用atomsk自带的-a选项或者直接看输出文件,统计每个z坐标附近的原子数量。FCC的(111)面是三层一个周期,如果平移后某两层的面内位置完全重合而其他层不重合,说明层错矢量选错了,产生的可能不是单一内禀层错。
第三,用OVITO快速看一眼。载入Al_sf.cfg,按z坐标给原子着色,你会看到沿z轴方向原子层颜色周期性变化,唯独在某个z位置附近,上下层的水平偏移规律被破坏——那里就是层错面。这个检查不用做CNA,肉眼足够确认方向对不对、层错面是否平行于xy平面。如果层错面是斜的,说明盒子方向设置有问题,回去查orient的三个晶向。
3. 进入LAMMPS:格式、边界与弛豫的设计
3.1 从cfg到data:你以为转完格式就完了?
ATOMSK转LAMMPS data文件很简单,一条atomsk Al_sf.cfg lmp就搞定。但生成data文件不代表万事大吉,有几个细节必须打开文件确认。
首先是原子类型。纯铝只有一个原子类型,data文件里atom_types应该是1,对应的Masses段必须给出质量。如果你用的势函数文件里不带质量,而data文件里又没写,LAMMPS读到pair_coeff时会直接报错。其次是晶格方向信息,data文件里会有一个xlo xhi ylo yhi zlo zhi的盒子范围,务必确认z方向盒长和ATOMSK输出的盒子一致,否则后面算层错面积时A取错,结果全错。
还有一个容易忽视的坑:LAMMPS读入data文件后,原子编号顺序和ATOMSK里的顺序可能不一致。这是正常的,但如果你后面想用group按原子序号选层错附近的原子,就需要小心。我更推荐按region选择,因为在层错建模中,层错面的位置和盒子坐标的关系是明确的,用region加group按坐标范围选择,比依赖编号靠谱得多。
LAMMPS的安装也顺带提一句。无论你用源码编译还是conda装好的二进制版本,确认mpirun能正常起并行任务再开始建模。层错能计算本身很小,几万原子单核也能跑,但如果你后面要做大体系的扩展位错模拟,MPI并行是必须的。编译LAMMPS时记得把需要的势函数相关包、额外包都打开,否则读到某个pair_style时才发现没编译就尴尬了。
3.2 周期性边界和“双面层错”效应
LAMMPS的in文件里,边界条件默认是boundary p p p,也就是三个方向都是周期性。层错能计算要求三个方向都保持周期性,这样才能消除表面能干扰。
很多人会想,既然周期性会在z方向产生两个层错面,那我是不是把z方向设成f(fixed)或者m(shrink-wrapped)就能只留一个面?这个想法我在早期也动过。实际做了以后发现,固定边界会在z方向引入两个自由表面,表面的弛豫和重构带来的能量变化比层错能本身还大,算出来的数值完全不可用。正确的做法是接受两个层错面的事实,在能量差公式中除以2倍的层错面积。这不是妥协,而是周期性条件下最干净的处理方案。
还有一点要提醒:如果你用OVITO打开data文件,默认只显示一个盒子,可能只看到一条层错;打开周期性副本功能(Show Periodic Images)后,才能看到上下镜像处隐藏的第二条层错。所以“OVITO里只看到一条层错”是正常的,能量计算时该除以2还是要除以2。
3.3 先让原子松弛到局部能量最低,再采能量
静态计算直接run 0得到的是建模样式下的瞬时能量。ATOMSK生成的完美晶体虽然几何上是理想FCC,但因为你用-wrap做了坐标折叠,原子位置可能出现微小的坐标不匹配,直接run 0的能量会包含这部分人为涨落。
我建议在计算能量前先做一次能量最小化,让体系弛豫到局部能量最低状态。对纯单质晶体,几十步共轭梯度就能收敛,成本极低。minimize后,完美晶体和层错模型都处于各自的局域势能极小值点,能量差才反映真实的层错能。
但这里也有一个两难:如果让体系充分弛豫到全局最小,某些势函数下层错面可能会迁移、湮灭,尤其当层错能很低、体系又很小时,层错面甚至会自动消失。这说明该势函数对这个体系的描述不够好,或者模型尺寸不足。遇到这种情况,可以改用固定部分原子、只让界面附近原子弛豫的受限优化方案,或者换势函数验证。
4. LAMMPS计算层错能:从in文件到单位换算
4.1 势函数是整个计算里最大的“自由参数”
层错能对势函数极其敏感。同样是铝,用不同EAM势算出来的内禀层错能可以从120 mJ/m²到250 mJ/m²,差异接近一倍。这不代表模拟不可信,而是说明不同势函数拟合数据集不同,对偏离平衡构型的缺陷描述能力不同。
选势函数时,先查文献里这个势函数是否拟合过层错能或广义层错能(GSFE)。很多EAM势的拟合目标主要是晶格常数、弹性常数、空位形成能、内聚能等,层错能只是“顺带”预测的物理量。如果你要研究层错相关的机制,尽量选择在论文中明确报告了层错能、孪生能的势函数。以铝为例,Mishin等人发展的EAM势在层错能、表面能方面校准得较好,是面缺陷模拟的常用选择;而某些早期EAM势的层错能明显偏高,用它们算SF你能得到“铝层错能特别高”的错误结论。
另外,势函数文件的格式必须和pair_style匹配。我用的是eam/alloy,对应势文件通常是Al99.eam.alloy这类格式。用错eam/fs格式或者文件路径放错,LAMMPS会直接报错或者给出一堆乱数值。
4.2 in文件骨架:可以直接套用
下面这个in文件我习惯命名成in.sfe,完美晶体和层错模型共用,只改read_data读取的文件名:
units metal atom_style atomic boundary p p p read_data data.sf pair_style eam/alloy pair_coeff * * Al99.eam.alloy Al neighbor 2.0 bin neigh_modify delay 10 every 1 check yes minimize 1.0e-10 1.0e-10 2000 5000 run 0 variable pe equal pe print "PE = ${pe}"几个值得注意的细节。neighbor宽度2.0是经验值,必须大于势函数截断半径和模拟盒子最短边长之半的差,否则部分原子对会被漏算。minimize的前两个参数是能量和力的收敛容差,建议至少到1e-10量级,因为层错能是几十上百个meV级别的能量差,容差太粗会让你无法区分真实信号和数值噪声。run 0不推进时间积分,只是让LAMMPS完成一次势能计算,输出体系总能。
完美晶体跑一遍,层错模型跑一遍,分别记录PE。注意两个模型必须用完全相同的in文件逻辑、相同的势函数参数,这是能量差法能成功的前提。
4.3 从eV到mJ/m²:一步步算给你看
假设一个层错模型,盒子沿x方向[1-10]的长度Lx=57.2Å,沿y方向[11-2]的长度Ly=99.2Å,层错面积A=57.2×99.2=5674Ų。完美晶体minimize后体系总能PE_perfect=-4000.00eV,层错模型PE_sf=-3999.70eV(数值仅为示意)。
能量差ΔE=0.30eV。周期性条件下模型含两个层错面,n=2,所以每层错面能量贡献为0.15eV。层错能γ=0.15/5674=2.64e-5 eV/Ų。乘以16021.8换算成mJ/m²,结果是0.42... 等等,这个结果太小,说明我的示意数值取得太离谱,实际Al层错能应该在150 mJ/m²左右,反推ΔE大概是0.3eV、面积几百Ų。为了不误导读者,我应该把示意数值调合理一点。
实际上,铝晶格常数4.05Å,x方向[1-10]一个周期长度a/√2=2.864Å,20个周期57.3Å;y方向[11-2]一个周期长度a√6/2=4.961Å,20个周期99.2Å,面积约5685Ų。如果文献值Al的ISF约150mJ/m²,换算成eV/Ų就是150/16021.8=0.00936eV/Ų。单个层错面对应的能量是0.00936×5685=53.2eV,两个面加起来ΔE≈106.4eV。这个数量级就对了。示意计算时要拿准量级,否则读者按你的流程算完发现差2个数量级,又得排半天错。
4.4 ESF外禀层错的额外说明
外禀层错的建模和ISF略有不同,需要在正常堆垛中插入一层原子,不能简单通过平移半块晶体来实现。ATOMSK建模外禀层错时,通常先选择要插入的原子面,复制一份再整体平移,然后用-remove-doubles清理重叠原子。这个操作比较繁琐,我建议第一次做的时候先用小盒子跑通流程,确认原子数和结构无误后再放大到正式尺寸。外禀层错能一般大约是内禀层错能的1.5到2倍,这个关系可以作为验证模型的粗略参考。
5. OVITO可视化验证:别停留在“看起来很对”
5.1 CNA的根本逻辑和截断半径陷阱
OVITO里最常用来看层错的是Common Neighbor Analysis。CNA会分析每个原子周围12个近邻的拓扑连接方式,然后把环境分为FCC、HCP、BCC、ICOSAHEDRAL和OTHER几类。在FCC完美晶体里,所有原子都被识别为FCC;在层错面上,由于上下堆垛变成ABAB,原子环境具备HCP特征,于是被识别为HCP。所以一张图上哪个位置出现了一条HCP颜色的“带”,那里就是层错面。
CNA有个参数叫截断半径,这个值设置不当会得出完全错误的结论。截断半径太小,最近邻统计不全,FCC原子会被误判为OTHER;截断半径太大,第二近邻也被算进来,FCC和HCP就没法区分了。我的经验是,对FCC金属,截断半径取最近邻距离的1.05到1.2倍比较合适。以铝为例,最近邻距离是a/√2=2.86Å,OVITO的CNA默认截断半径通常是0.0,需要手动填3.0左右。判据是:在完美晶体上做CNA,所有原子都显示为FCC;稍微调大截断半径,如果开始出现大量OTHER原子,说明取值偏大了,回到出现过拟合之前的节点。
5.2 在OVITO中同时确认层错面位置、数量和方向
打开OVITO后,我推荐的检查流程是:
- 载入data文件或dump文件,先按粒子类型着色,确认原子无重叠、盒子边界整齐。
- 添加Common Neighbor Analysis,把FCC设为灰色、HCP设为亮色,其余结构设为浅色或隐藏,层错面会以一条亮色平面凸显出来。
- 点击“Create Bond”之外,在显示设置里打开周期性副本,设成3×3×1或1×1×3,你会看到层错面周期性重复出现。数一数在一个盒子范围内,层错面到底有几个。ISF模型应该看到两条亮色平面,并且相互平行。
- 使用Slice工具,沿z方向取一个厚度为0.5Å的薄片,配合CNA着色,直接读堆垛顺序。切面的x轴和y轴分别是[1-10]和[11-2],可以确认层错面确实横贯整个盒子的xy方向。
如果切面上看到的层错线不是一条贯穿盒子的直线,而是歪歪扭扭或者中断,多半是模型构建时层错矢量方向不对,或者盒子方向的选取让层错面与xy平面不平行。此时返回ATOMSK检查orient和shift方向,不要继续往LAMMPS流程走,否则后面所有计算结果都是错的。
5.3 一个常见的误判:你把HCP带当成了层错
初学者经常在OVITO里看到大片HCP颜色,以为生成了大片层错。实际上,当模型中含有孪晶界面、晶界、表面时,这些界面处的原子CNA也会显示为HCP或OTHER。更常见的场景是,势函数弛豫之后,层错面附近的原子不会全都整齐地保持HCP拓扑,部分原子由于畸变会变成OTHER,只有层错面中央一小圈干净的区域显示为HCP。所以别看到一小条HCP带就认为模型做对了,一定要配合坐标切片,确认堆垛序列确实在某一层发生了变化、其他地方完全正常。
6. 全流程避坑实录:六个高频翻车点
下面这张表是我这些年摸爬滚打的浓缩版,先给结论,再逐项拆解。
| 坑 | 典型症状 | 解决方向 |
|---|---|---|
| 层错面数量没数清 | 层错能高出一倍 | 周期性镜像会产生两个面,能量差除以2A |
| 层错矢量方向或符号错 | CNA看不到规则层错面 | 核对R的分量,手动算位移投影 |
| CNA截断半径乱填 | FCC显示成HCP或OTHER | 取最近邻距离的1.05-1.2倍 |
| 势函数没校准层错能 | 结果与文献差30%以上 | 查势函数拟合文献,换势验证 |
| 盒子z太小 | 层错能依赖盒子尺寸 | 增加z方向重复次数,做尺寸收敛测试 |
| 弛豫过头层错消失 | minimize后HCP带消失 | 用受限弛豫或增大盒子重新测试 |
6.1 除以2A还是除以A:周期性镜像的隐藏层错
这是层错能计算中最多人翻车的坑,没有之一。用平移法建层错模型时,内部界面有一层错,盒子顶底周期性边界处又会出现一层错。OVITO里默认显示下你可能只看到一条亮色带,但周期性物理图像里就是两条。文首提到我那次310 mJ/m²的错误结果,就是只除了一个A。解决办法很简单:建模后用OVITO开周期性副本数清楚层错面数量,再决定公式里n取1还是2。
6.2 层错矢量方向搞错:能量对不上但OVITO可能有不出来
层错矢量R只有正确方向才能产生稳定的内禀层错。如果你把符号写反,相当于把上半部分沿反方向平移,很多情况下生成的是另一条Shockley部分位错扫过的等价构型,层错能数值不变但层错面的位置或者堆垛特征和预期不同;如果分量算错,可能生成外禀层错或者更复杂的两层错结构。我的排查方法是,把R的三个分量按盒子基矢投影手算一遍,再对比ATOMSK命令里的-shift数值,确认投影后的位移量和理论值一致。
6.3 同是EAM,层错能差出一倍这件事
势函数对层错能的影响远超多数人的预期。不同EAM势对FCC金属层错能的预测可以差30%到100%,这不是代码问题,是势函数本身的性质。做计算前,先看势函数论文里有没有报告SFE和GSFE曲线。没有的话,至少要和实验值或者其他势的计算结果做交叉验证。我习惯在正式跑大模型前,用同一个势函数算一次完美晶体和一次最小层错模型,先确认层错能落在合理区间——这个步骤十分钟就能完成,能替你省下后面整整一天的纠结。
6.4 盒子z方向不够大,层错能和自己的镜像在“打架”
如果z方向原子层数太少,两个层错面之间的距离只有十几埃,它们之间的弹性交互作用会让层错能偏高或偏低,并且结果会明显依赖盒子尺寸。判断方法是做一个尺寸收敛测试:把z方向重复次数从10、20、30逐渐增大,算三次层错能,看数值是否趋于稳定。一般到20层以上变化就很小了,但不同材料、不同势函数表现不一样,以你的实际收敛曲线为准。
6.5 弛豫后层错面“消失”了什么
minimize完成后发现OVITO里原本清晰的HCP带不见了,这一般有两种情况。第一种,势函数对这个层错构型本身不稳定,体系自动翻回完美FCC,说明该势函数描述的层错能极低甚至为负,不适合用来研究这个缺陷。第二种,原子的局域弛豫让层错面附近结构发生微小畸变,CNA的截断半径无法捕获正确的拓扑分类,需要微调CNA参数再看,不代表层错真的消失了。区分二者的方法是看minimize前后总能量变化率,如果层错模型和完美晶体模型最终能量几乎一样,那就是真消失了。
6.6 ATOMSK版本差异导致的命令格式问题
不同版本的ATOMSK对-select、-shift、-stacking-fault的参数解析并不完全一样。老版本里-shift之后的向量顺序可能是笛卡尔坐标,新版本可能加入了更多选项。我的建议是,第一次在某个版本的ATOMSK上建模,先用最小盒子和纯FCC铜或铝跑通流程,用OVITO确认层错面正确后,再扩大尺寸正式建模,不要一上来就追求大模型。
就我个人的使用体会而言,ATOMSK这种脚本化的建模工具最大的价值在于可重复性:命令写清楚,模型就能被任意复核。层错能计算本身不复杂,难点全在“模型到底建对没有”这件事上。如果你刚开始接触,先用最小体系把“完美晶体+层错模型”的能量差跑通,再逐步扩大盒子、换势函数、做收敛性测试。后续如果想进阶,还可以在这个模型基础上做广义层错能曲线、构建扩展位错、研究层错与溶质原子的交互,建模思路都是一脉相承的。