用ATOMSK+LAMMPS+OVITO构建FCC堆垛层错模型并计算层错能全流程
做分子动力学模拟这几年我最大的体会是真正卡住你的往往不是LAMMPS那几行in文件而是模型本身到底建没建对。尤其是“堆垛层错”这种听起来很基础的结构真到了要自己搭一个出来的时候一堆细节问题全冒出来了。坐标平移错了、周期边界忘了考虑、势函数文件路径写错、OVITO里CNA死活识别不出层错每一步都能让你白忙好几天。这篇文章我就用最常见的FCC金属Al当例子完整走一遍“ATOMSK建模 → LAMMPS算层错能 → OVITO可视化”的流程把我在实际测试中踩过的坑和验证过可行的做法都写出来。你可以把这些命令当成一份能直接改改参数就用的模板尤其适合刚开始做MD模拟、被堆垛层错和位错模拟卡住的朋友。1. 写在前面堆垛层错模型为什么值得花时间搭1.1 层错不是“缺陷”而是理解塑性变形的钥匙要理解堆垛层错得先习惯FCC晶体的语言。完美FCC结构沿密排面的堆垛顺序是ABCABCABC循环每个字母代表一层原子在水平方向上的投影位置。一旦这个顺序被打破比如某几层变成了ABAB或者出现了ABCA C AB这样局部错排就形成了堆垛层错。你可能觉得这就是个“原子排错了”的小事但它在材料学里的地位非常高。层错能SFE直接决定了位错能不能顺利分解成两个不全位错中间夹一片层错带。层错能低位错容易分解、层错带就宽材料更容易加工硬化层错能高位错倾向于以全位错形式滑移交滑移容易材料塑性表现完全不同。像铜的层错能大概几十mJ/m²铝的高一些一百多mJ/m²这几十上百mJ/m²的差别就能带来很不一样的力学响应。实验上测层错能又难又间接很多时候依赖透射电镜统计层错宽度误差很大。所以原子模拟就成了一个重要的标定手段——而做原子模拟第一步就是要把含层错的模型搭出来。1.2 为什么用ATOMSK而不是手动改坐标早期我做这个结构时试过直接在文本编辑器里改坐标文件那简直是灾难。一个稍微像样的模型动辄几千个原子你要在(111)面中间精确找到某一层再把上面所有原子整体平移一个不全位错的伯格斯矢量手算改坐标不仅效率低还极其容易出边界错误。ATOMSK就是干这个的。它是一款开源原子建模工具一条命令就能生成完美晶体、位错、晶界、孪晶界、自定义缺陷等常见结构还内置了格式转换、移动、剪切、旋转、复制拼接等一系列操作。相比手动改坐标ATOMSK的优势在于结构生成基于晶格对称性不会出现手误导致的原子坐标偏差支持脚本化批处理改参数重新生成特别方便可以直接导出LAMMPS data、CFG、XYZ、POSCAR等格式省去人工转格式的麻烦。当然它也不是万能的。比如“只把上半部分原子平移一个特定矢量”这种操作ATOMSK没有一条专门命令直接帮你搞定需要拆成“切、移、拼”几步来做。这篇文章的流程也正是围绕这个思路展开的。1.3 全流程需要哪些工具整个流程用到三件套缺一不可ATOMSK负责从零构建完美晶体和含层错模型输出LAMMPS可读的数据文件LAMMPS负责能量计算用共轭梯度最小化得到完美晶体和层错模型的平衡总能然后算出层错能OVITO负责把模型和计算结果可视化用CNA公共近邻分析等手段直接看出层错面的位置、检查模型是否正确。这三个工具全是免费开源的HPC集群上基本都有自己装也不难。我下面的所有操作都是基于Linux环境Windows用户可以先装WSL或者虚拟机再照做思路一样。2. ATOMSK建模从零生成一个FCC堆垛层错模型2.1 ATOMSK安装与基础语法ATOMSK安装不复杂从官网下载源码解压后在源码目录里make all就好。它依赖gfortran编译器如果缺了就先装一下。装完后直接在终端敲atomsk能看到一堆帮助信息就说明成功。基础语法是atomsk 输入文件或创建选项 处理选项 输出文件比如创建一个晶格常数4.05 Å的FCC铝单胞输出为CFG格式atomsk --create fcc 4.05 Al Al_unit.cfg这个命令会生成一个标准的FCC单胞要是直接拿去用那盒子太小完全不够看。所以我们通常要配合-duplicate扩大尺寸配合-orient调整晶向。2.2 创建完美FCC晶体并正确取向量化层错模型算的是(111)面之间的堆叠关系所以最好让模拟盒子的z轴方向正好沿着[111]晶向这样一层一层的(111)面就沿着z轴堆上去后续切层和平移都直观得多。我们要保证x、y、z三个方向尽量正交避免生成非正交盒子给LAMMPS计算带来麻烦。我实际测试下来推荐下面这一组晶向组合x方向取[11-2]y方向取[1-10]z方向取[111]。这三个方向两两正交生成的盒子是正交盒。对应的ATOMSK命令是atomsk --create fcc 4.05 Al -duplicate 4 4 12 -orient [11-2] [1-10] [111] Al_perfect.cfg这条命令拆开解释--create fcc 4.05 Al创建FCC铝晶格常数4.05 Å-duplicate 4 4 12沿x、y、z方向各复制4、4、12个晶胞-orient [11-2] [1-10] [111]把这三个晶向分别对齐到x、y、z轴。生成后可以用OVITO打开Al_perfect.cfg确认盒子沿z方向是[111]取向。如果看不到明显的ABCABC层状结构多半是斜率方向没写对回头检查一下。z方向复制12个晶胞够不够我建议至少让z方向高度达到30~40 Å以上。因为层错能计算时要避免两个层错面之间的弹性相互作用模型太薄结果会受影响。如果你用4×4×12铝的晶格常数4.05 Åz方向高度大约是4.05×√3×12 ≈ 84 Å算是比较充裕了。x、y分别是4×4.05×√6/2 ≈ 19.8 Å和4×4.05×√2/2 ≈ 11.5 Å这个面积拿来算层错能也够用。2.3 用“切、移、拼”三步构造层错ATOMSK没有现成的“make stacking fault”命令但可以拆成三个基础操作先切、再移、最后拼。这也是我目前用下来最稳定可控的做法。第一步切把完美晶体沿z方向某个(111)原子层切一刀分成上下两部分。ATOMSK的-cut命令可以按z坐标切割。假设模型的zlo到zhi范围大概是0到84 Å我们选在中间附近切比如z42 Åatomsk Al_perfect.cfg -cut above z 42.0 Al_above.cfg atomsk Al_perfect.cfg -cut below z 42.0 Al_below.cfg这一步要注意切割位置不能正好落在某个原子层上最好落在两个(111)原子层的间隙处。你先在OVITO里打开完美晶体看z轴方向上原子层的位置分布找个原子层的空隙中间下刀。如果切歪了后面平移后会有一堆原子互相挤压最小化时容易不收敛。第二步移对上半部分整体施加一个Shockley不全位错的伯格斯矢量。FCC中Shockley部分位错的伯格斯矢量是a/6 112因为我们的x轴正好沿[11-2]方向所以只需要在x方向平移atomsk Al_above.cfg -shift x 1.653 Al_above_shifted.cfg这个1.653 Å怎么来的我们算一下FCC中a/6[11-2]的模长等于a/√6代入a4.05 Å得到4.05/2.449 ≈ 1.653 Å。这个平移量正好把一个完整的FCC层错矢量走完。注意方向别搞反了。平移方向反了会得到另一个方向的层错矢量虽然从能量上可能差不多但和你要研究的滑移体系不一致后面分析时会出问题。第三步拼把平移后的上半部分和下半部分重新合并成一个模型然后做周期边界处理atomsk --merge 2 Al_below.cfg Al_above_shifted.cfg Al_SF_raw.cfg atomsk Al_SF_raw.cfg -wrap Al_SF.cfg--merge会把两个文件的原子合到一起。合并后上半部分平移了1.653 Å有可能有原子在x方向跑出盒子边界-wrap的作用就是把跑出去的原子按照周期性边界条件卷回盒子内。这样我们就得到了一个含层错的模型。这个模型里其实有两个层错面下半部分底部和上半部分顶部在周期边界下又构成了一个“反向”的层错所以底下算能量时要面对“两个层错面”这个事实。2.4 建模后必须做的检查模型建完之后千万别急着扔进LAMMPS。先花两分钟自查第一原子总数。用ATOMSK转成data文件后看原子数是不是和完美晶体完全一样。如果少原子或者多原子整个计算就没意义了。第二看盒子尺寸。完美晶体和层错模型的盒子尺寸应该完全一致只是内部原子坐标有差异。如果盒子变了说明你的平移操作影响了晶胞参数后面算层错能会直接被污染。第三用OVITO打开Al_SF.cfg沿z轴方向逐层看堆垛顺序。正常情况下你会看到某处ABC顺序中断变成局部的ABAB或其他错排。这一步“眼见为实”比任何脚本检查都直观。3. LAMMPS计算把层错能算出来3.1 势函数选择与前期准备层错能计算对势函数很敏感。不同的EAM势算出来的铝层错能可以差出几十mJ/m²所以参考文献时一定要注明自己用了哪一套势。Al最常用的是Mendelev等人开发的EAM合金势Al_mm.eam.alloy也有不少人用Mishin势。我习惯用NIST数据库里下载的势文件路径稳定参数说明清楚。把data文件和势文件放在同一个工作目录准备好一个标准LAMMPS输入脚本。以units metal为例能量单位是eV。3.2 LAMMPS in文件完整写法下面是我实际在用的层错能计算in文件直接拷贝改名就能用# in.sfe units metal boundary p p p atom_style atomic read_data Al_SF.lmp pair_style eam/alloy pair_coeff * * Al_mm.eam.alloy Al neighbor 0.3 bin neigh_modify delay 10 every 1 check yes thermo 100 thermo_style custom step pe lx ly lz press minimize 1.0e-12 1.0e-12 1000 100000 run 0几个关键点说明boundary p p p三个方向都用周期性边界这样层错模型在x方向平移了1.653 Å后依然满足周期性不需要额外处理表面。minimize后面四个参数分别是能量公差、力公差、最大迭代次数、最大力计算次数。1.0e-12这个精度对层错能计算足够了。run 0的意思是“不继续跑分子动力学只停在最小化之后”方便在log文件里读取最终能量。准备好两个输入文件一个用Al_perfect.cfg转成的data文件一个用Al_SF.cfg转成的data文件。可以先跑完美晶体再跑层错模型记录各自的平衡总能。3.3 层错能计算公式与单位换算完美模型最小化后的总能记为E_perfect层错模型记为E_SF。由于我们用“切、移、拼”的方法构造层错模型中包含了两个层错面一个在切的位置另一个在周期边界等效位置因此层错能公式是γ (E_SF - E_perfect) / (2 × A)这里A Lx × Ly也就是层错面的面积。如果只构造了一个层错面分母就不需要乘2。很多人第一次算的时候容易在这里搞混算出来的结果偏一半或者多一倍回头检查模型里到底有几个层错面就行。LAMMPS里输出的能量单位是eV面积单位是Ų所以层错能的直接单位是eV/Ų。文献里更常用mJ/m²换算关系如下1 eV/Ų 16020 mJ/m²所以在LAMMPS里如果算出0.01 eV/Ų的层错能对应的就是约160 mJ/m²正好落在铝层错能常见范围内。我建议在计算时就用eV/Ų做中间量最后展示时再转成mJ/m²免得过程中被单位搞晕。3.4 边界条件与收敛性细节层错能计算看着只有一行公式真正落地时坑不少。最常见的问题是最小化不收敛。如果你把原子平移之后直接丢进LAMMPS个别原子之间距离太近会导致受力非常大minimize会报错或者收敛极慢。解决办法有几种一是把minimize的迭代次数调大二是先限制原子移动距离做几轮弛豫三是在最小化之前先跑一小段NVT高温弛豫让局部应力释放掉再最小化。我通常直接调大迭代次数如果还不行就检查模型的原子重叠情况——多半是切割位置没选好或者平移量写错。另一个细节是压应力修正。周期性边界下模型在x方向平移后盒子尺寸没变但原子在x方向有整体剪切位移这会导致体系内部存在一个剪切应力。严格来说算层错能应该用“零应力”的模型让盒子在松弛状态下达到平衡。不过对常规FCC金属层错能计算盒子尺寸固定、只做原子位置最小化得到的数值和文献对比已经够用。如果想要更精确可以用fix box/relax命令把x方向压应力解除但那样处理起来更复杂初学者不建议一上来就搞。4. OVITO可视化让模型和结果看得见4.1 导入结构文件模型建完、算完之后OVITO是你最好的检查工具。LAMMPS输出的dump文件OVITO可以直接拖进去打开。如果只有data文件也可以直接加载OVITO会自动识别盒子和原子坐标。OVITO现在的版本是3.x界面比老版本干净很多支持Python脚本做批量渲染很方便。我只用它的图形界面已经能满足绝大多数需求。4.2 用CNA识别层错结构打开模型之后默认看到的就是一堆球。要直观看出层错面在哪你得让OVITO帮你“分类”原子类型。操作方法在右侧面板点击“Add modification”选择“Common Neighbor Analysis”CNA。CNA会判断每个原子的局部晶体结构类型。对FCC铝晶体来说完美位置显示FCC默认绿色层错区域因为局部出现ABAB堆垛会被识别成HCP默认红色如果还有别的界面、位错核心或其他缺陷会显示为“Other”默认白色或灰色。看到中间有一条红色原子带那就是你的堆垛层错面。这里有个关键参数cutoff。CNA需要判断哪些原子是“邻居”这个判断半径的大小直接影响结果。OVITO默认的“Automatic”模式通常能找到合理值但不保证每次都准。如果打开后完美区域到处是Other大概率是cutoff设小了如果连远原子都被当成邻居cutoff设大了又会把结构搞得很模糊。对铝这种晶格常数4.05 Å的材料cutoff在3.2~3.8 Å范围内通常没问题我习惯先自动算一次再手动微调看效果。4.3 用Slice切面看清楚层错位置原子模型是三维的层错面夹在原子层之间有时候从表面看不太出来。你可以在OVITO里加一个“Slice”modification切一片薄的截面出来看。具体操作Add modification → Slice设置cutting plane的方向为z轴厚度设成3~5 Å。这样就能看到某一层附近的原子排布。再配合CNA颜色层错面的位置一目了然。另外一个常用技巧是在CNA的基础上叠加“Color Coding”modification按z坐标染色这样能看到层错面在z方向的精确位置。两个modification组合使用基本上可以准确判断层错面离底面的距离后续如果要继续做位错分析、统计层错宽度这个信息很有用。4.4 位错分析可选如果你不只是想看层错面还想提取位错线可以用OVITO的DXADislocation Extraction Algorithm模块。DXA会先在模型里识别出位错缺陷区域然后提取位错线、位错类型和伯格斯矢量。不过DXA用起来有几个前提。一是模型要足够大边界太大或表面区域太多会让识别出很多伪位错二是DXA通常要配合“删除表面原子”来用不然表面原子会被当成位错核心处理。一开始接触堆垛层错的读者我建议先跳过DXA直接用CNA看到层错带就能满足大多数需求。4.5 渲染做一张能放进组会PPT的图模拟计算最后总得给别人看。OVITO渲染需要注意几个点粒子显示大小默认的粒子半径太小看起来稀疏。在“Particles”显示设置里把相对粒子尺寸调到0.3~0.5原子之间会连成比较致密的结构观感好很多。背景白纸背景更适合打印和投屏浅灰色也很有质感。可以在“Viewport”里设置背景颜色。光照角度用系统自带的光照一般够用必要时调整方向光让原子立体感更强。输出分辨率渲染视图时把图像尺寸调到1920×1080以上并用透视相机角度导出的PNG图放到PPT里不糊。保存OVITO状态文件.ovito是个好习惯过几天想再调视角、换配色不用重新操作一遍流程。5. 常见问题与排查技巧实录5.1 建模阶段的典型报错问题一生成的盒子不是正交的LAMMPS read_data时报tilt因子。原因通常是-orient指定的三个晶向没有保持正交关系。FCC里三个正交方向很好找比如[11-2]、[1-10]、[111]别随便用[100]、[010]、[001]再指望盒子能按你想象的取向。如果确实需要非正交盒子LAMMPS也能处理triclinic box但层错能计算的面积计算会复杂一些初期不建议。问题二平移之后原子重叠特别严重。检查平移矢量的大小。很多教程直接给1.653 Å但这是基于晶格常数4.05 Å的铝。如果你的体系是铜a3.615那平移量就是3.615/√6≈1.476 Å照抄铝的参数必然出问题。问题三合并之后原子数对不上。--merge不会自动去除重叠原子如果上下两部分有原子间距太近你会在OVITO里看到两个原子几乎重叠在一起。这时候要回头检查切割位置是不是正好在两个原子层的间隙别切在原子层中间。5.2 LAMMPS计算阶段的常见问题问题一minimize迭代几千步还不收敛。优先检查是不是初始模型原子间距太小。可以在LAMMPS里加上thermo 1看能量变化趋势如果能量在某个量级反复振荡降不下去大概率是局部原子重叠。用OVITO打开模型放大找到那对原子就能定位问题。问题二层错能算出来是负的或者小到不真实。这种情况下先别怀疑势函数先检查两个模型是不是同一个势文件、同一个盒子尺寸、同一个原子数。很多时候是完美晶体的数据文件里混入了杂质原子或者势文件路径写错导致LAMMPS没有正确读取。问题三算出来的层错能和文献对不上。不同势函数预测的层错能差别很大。Al的Mendelev势和Mishin势给出的层错能可以差20%以上这个不用惊讶。先确认你用的势文件版本再去文献里找同样势函数的数据对比。如果用的是这个教程提到的Al_mm.eam.alloy层错能结果大约在100~160 mJ/m²范围都算正常。5.3 OVITO分析阶段的常见问题问题一CNA出来的全是Other看不到FCC和HCP。多半是cutoff设小了。铝的第一近邻距离是2.86 Åcutoff至少要大于这个值建议从3.5左右开始调。如果调到4.0以上还是杂乱那可能是模型本身有问题比如原子坐标单位错误或者原子重叠严重。问题二CNA能看到FCC和HCP但层错带看起来断断续续。这很正常层错面本身可能贯穿整个盒子但由于渲染时粒子大小太小看起来像断开的。把粒子显示尺寸调大或者用Slice切面看就能看到连续的层错面。问题三OVITO打不开LAMMPS data文件。大概率是data文件格式问题。LAMMPS data文件对header的格式要求比较严格比如“atoms”前面必须有数字xlo/xhi后面不能有多余字符。用ATOMSK生成的data文件一般没问题如果是手动修改过的建议先用文本编辑器仔细检查。5.4 问题排查速查表现象可能原因解决思路ATOMSK生成的盒子不是正交盒orient方向选择不当换用[11-2]、[1-10]、[111]组合平移后原子重叠平移量计算错误确认a/√6的数值核对晶格常数LAMMPS最小化不收敛初始原子重叠、力太大检查模型调大迭代次数或先低温弛豫层错能为负两个模型不对应检查原子数、盒子、势函数一致性OVITO的CNA全是Othercutoff设置错误从3.5 Å开始手动调试层错带显示不连续渲染粒子尺寸太小调大粒子显示大小配合Slice查看5.5 我的个人经验总结跑完这一整套流程我最想强调的是“建模阶段多花10分钟计算阶段少折腾10小时”。特别是ATOMSK切割位置的选择和周期边界的处理都是可以在OVITO里用眼睛确认的事不要偷懒跳过。另外层错能计算是一个很典型的“差量计算”两个模型的总能都很大差值却很小所以对势函数精度、收敛精度、模型一致性都很敏感。每次换一个原子种类、换一个势函数都要重新确认一遍基本参数别指望一套流程通吃所有材料。后续如果你想把这个模型进一步扩展可以试试在层错面上引入位错源或者用这个层错模型去研究位错穿越层错的机制也可以直接换用不同晶格常数的合金成分做一组层错能随成分变化的曲线。ATOMSK建模的能力远比这篇文章里展示的要多关键是先把最基础的“切、移、拼”这一套练熟。