ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

VESTA-LAMMPS-OVITO实战:分子动力学模拟中的弗伦克尔缺陷与位错环分析

VESTA-LAMMPS-OVITO实战:分子动力学模拟中的弗伦克尔缺陷与位错环分析 做辐照损伤分子动力学模拟的人十有八九都经历过这个瞬间级联碰撞跑完了LAMMPS输出了一大堆dump文件你打开OVITO面对几万个原子一时不知道从哪下手。这篇实战记录就是来讲清楚这件事的——如何用VESTA搭好完美晶格让LAMMPS跑出构型再让OVITO帮你从构型里把弗伦克尔缺陷和位错环一个一个找出来。我把整个链路里的关键步骤、参数设置和我踩过的坑都写在这里适合刚开始接触辐照损伤模拟的研究生也适合已经跑了一段时间MD、但总在缺陷分析阶段卡住的同行。核心流程可以浓缩成一句话VESTA准备好“干净”的晶格分子动力学计算产生“脏”的缺陷构型OVITO负责把“脏”的部分定量化——到底是哪些格点空了、哪些间隙位置多了原子、这些多出来的原子是否已经聚集成位错环。下面一个个讲。1. 为什么要在分子动力学模拟里找弗伦克尔缺陷和位错环1.1 弗伦克尔缺陷辐照损伤最直接的信号在辐照环境下入射粒子与晶格原子发生碰撞产生初级碰撞原子PKAPKA又引发一连串碰撞形成级联碰撞。级联结束后大量原子回到格点位置但总有一部分原子停在了非格点位置。每留下一个间隙原子就必然留下一个空位这就是一个弗伦克尔缺陷对。分子动力学模拟里空位数量和间隙原子数量是衡量辐照损伤程度的最基本指标几乎所有辐照损伤文章都要给这个数。很多人以为找弗伦克尔缺陷就是“数一下有问题的原子”实际操作远比想象复杂。因为在高温下原子一直在热振动原子坐标是抖动的你不能简单地把“偏离格点超过一定距离”的原子判为缺陷。OVITO里的Wigner-Seitz分析能自动处理这个问题它不依赖绝对坐标偏移而是依赖拓扑占位来判断用起来比手动找可靠得多。1.2 从点缺陷到位错环性能退化的结构根源单个弗伦克尔缺陷的影响其实有限真正让材料力学性能发生质变的是缺陷团簇和位错环。间隙原子在高温下扩散聚集在特定晶面上形成闭合的位错环空位聚集后也能形成空位型位错环。位错环会缠结位错、阻碍位错滑移直接导致辐照硬化甚至诱发脆化。所以在辐照损伤模拟中除了统计缺陷数量还要回答几个更复杂的问题缺陷是否团簇化位错环在哪一层晶面上伯氏矢量是什么方向环尺寸有多大这些问题靠肉眼看几乎不可能解决需要OVITO的DXA位错提取算法来做几何拓扑分析。1.3 VESTA、LAMMPS、OVITO的分工与配合这三款软件的职责可以概括为VESTA负责提供初始晶体结构是建模端LAMMPS负责运行分子动力学计算是计算端OVITO负责可视化和定量缺陷分析是分析端。流程上通常是VESTA建模导出POSCAR通过Atomsk转成LAMMPS data文件LAMMPS跑完输出dump轨迹文件最后OVITO加载dump文件做WS缺陷分析和DXA位错分析。这种“建模—计算—分析”三段式流程是材料辐照损伤模拟的典型套路。VESTA的强项是结构构建和对称性处理OVITO的强项是算法化缺陷识别两者各有专攻配合起来几乎覆盖了整个可视化和分析需求。如果你只用VESTA画漂亮图不用它做预处理其实有点浪费。软件主要职责输入输出VESTA建晶胞、建超胞、导出结构晶格参数、原子坐标POSCAR等结构文件LAMMPS分子动力学计算data文件、势函数dump轨迹文件OVITO缺陷分析、位错分析dump轨迹文件缺陷数、位错环、伯氏矢量2. VESTA建模实操从完美晶格到LAMMPS2.1 安装与基本操作要点先说说VESTA本身。VESTA是一款对学术用户友好且免费的晶体结构可视化和建模软件支持Windows、macOS和Linux官网下载安装后就能用。安装上基本没有坑唯一提醒的是有些Linux发行版的图形界面库比如libGL、libXrender需要提前装好否则双击打不开窗口。遇到这类问题在终端里根据报错信息补齐依赖库就行。VESTA的核心概念有三个结构Structure、晶胞Unit cell和原子占位Atom site。你在VESTA里看到的三维模型本质上是晶胞参数、对称操作和原子坐标三者共同作用的结果。建完美晶格非常简单下面以BCC铁为例说明完整流程。2.2 用VESTA创建BCC铁完美晶胞和超胞打开VESTA点击File - New 新建一个结构文件。进入新建结构面板后先设置晶胞参数。BCC铁的晶格常数要按你所用势函数的平衡值来设置很多EAM势的平衡晶格常数在2.85到2.87 Å之间先用一个合理值建出结构后面再用NPT弛豫校正。在“Unit cell”标签下填好a、b、c三个方向的长度角度设为90度晶格类型选P简单格子。然后切到添加原子的标签加入Fe元素坐标设为(0,0,0)占位率100%。这里有个容易出错的地方BCC结构的空间群是Im-3m但在VESTA里直接用P格子加一个(0,0,0)原子就能表达BCC因为(1/2,1/2,1/2)位置的原子由对称操作自动生成。如果你手动加两个Fe原子分别放在(0,0,0)和(1/2,1/2,1/2)也不是不行但要小心后续导出时出现重复原子的问题。稳妥做法是让软件自己生成完整晶胞。接下来构建超胞。选中结构后点击Edit - Edit Data - Unit Cell在对话框里找到重复倍数设置把三个方向都改成你需要的数值。比如想做20x20x20的超胞就填20、20、20VESTA会自动把原子坐标展开到每个重复单元。这个“超胞”大小直接决定了MD模拟的盒子和原子总数20x20x20的BCC铁约有8000个原子适合练手正式计算一般用30x30x30左右约27000个原子能容纳更高能量的级联过程。超胞建好后用File - Export Data导出为VASP POSCAR格式文件名尽量用英文且不带空格。这一步完成后你就拿到了MD计算的初始结构文件。2.3 从POSCAR转成LAMMPS输入的三个细节VESTA导出的POSCAR默认用分数坐标描述原子位置LAMMPS的data文件则需要笛卡尔坐标和显式的原子类型、质量、盒子边界。我习惯用Atomsk做转换这是一款开源的原子建模和格式转换工具。命令非常简单atomsk Fe_POSCAR lammps执行后生成Fe_POSCAR.lmp文件在LAMMPS输入文件里用read_data读入即可。这里提醒三个细节转换时可以通过-mass、-fix等选项调整原子种类编号避免多元素体系里原子类型错乱。LAMMPS的data文件需要明确的masses段Atomsk会自动补充常见元素质量但如果你用的势函数文件里已经定义了质量就要保持一致不能出现两种质量定义互相冲突。转换完成以后务必打开.lmp文件看一眼前几行确认原子数、盒子尺寸和原子坐标数量对得上。这个环节出错后面所有步骤都会白费。我还遇到过一种情况VESTA导出POSCAR后元素种类那行有时会包含多余标记Atomsk转换时会对每一个标记都建立一种原子类型导致LAMMPS读入时说发现了多种原子类型而你其实只想用一种。这时候在POSCAR里把多余的种类标记删掉即可。3. OVITO找弗伦克尔缺陷Wigner-Seitz分析实战3.1 Wigner-Seitz分析原理蛋托模型OVITO识别弗伦克尔缺陷最常用的工具是Wigner-Seitz缺陷分析。它的本质是比较当前构型和完美参考晶格的占位关系。以完美晶格每个原子位置为中心做三维Voronoi分割得到一系列Wigner-Seitz胞一个格点一个胞然后统计每个胞里当前构型原子的个数。0个原子是空位1个是正常位2个及以上是间隙原子相关结构。用“蛋托”类比就很好懂完整蛋托每个坑位刚好一个鸡蛋剧烈晃动后有的坑空了有的坑塞了两个鸡蛋。OVITO就是替你数坑位的工具。这个方法不依赖原子绝对坐标所以热振动不会干扰它的判定这也是它适合高温构型缺陷分析的原因。3.2 参考构型设置最容易翻车的环节在OVITO中点击Add modification选择Wigner-Seitz defect analysis然后在modifier面板里点击Reference configuration - Load file选择之前保存的完美晶格构型。可以用LAMMPS输出一帧初始结构也可以直接用POSCAR转成的data文件。设置好之后OVITO会自动计算每一帧的缺陷数量。这里有个参数要特别注意参考构型的晶格常数应该与MD模拟在目标温度下的平衡晶格常数尽量一致。如果你在1000 K下跑退火模拟却用0 K晶格常数作为参考热膨胀会让每个原子偏离格点位置WS分析会把大量正常原子误判为间隙原子缺陷数量瞬间爆炸。解决办法我推荐一个在MD模拟前先跑一段NPT系综零压力让体系热膨胀到目标温度下的平衡体积再从这平衡构型开始做级联模拟并把平衡构型保存下来作为参考。这个方法比手动缩放晶格常数更可靠因为不同势函数描述的平衡晶格常数有差异理论值往往和势函数实际值对不上。3.3 输出统计与团簇分析WS分析跑完后OVITO右侧的modifier信息里会直接显示当前帧的空位数和间隙原子数。这两个数可以直接用来评估级联碰撞的残余缺陷数量。比如一个10 keV PKA在BCC铁中级联结束后通常会产生从几个到几十个不等的弗伦克尔对不同势函数和温度下数值有波动。随着退火时间增加空位和间隙原子数会因复合而减少。但要注意WS分析统计的是“异常占位格点的原子总数”不是“团簇数”。当间隙原子聚集形成crowdion或哑铃结构时一个格点可能挤了2个或更多原子它们对应同一个物理缺陷。因此如果你想得到“团簇尺寸分布”还需要叠加Cluster analysis modifier通过设定截断半径BCC铁常用2.0到2.6 Å范围内的最近邻截断把所有互相连通的间隙原子归并成一个团簇。我自己的习惯是三步走第一步先用WS分析看总体的空位数和间隙原子数。第二步加Cluster analysis按尺寸统计间隙型团簇和空位型团簇。第三步对最终构型用DXA提取位错环确认是否有可观的环状位错结构。3.4 Voronoi分析间隙位置判定的补充手段Wigner-Seitz分析能直接告诉你哪些格点空了、哪些塞多了但如果你想知道间隙原子具体占据什么间隙位置四面体间隙还是八面体间隙需要额外用Voronoi analysis。OVITO的Voronoi modifier会把空间按原子位置做Voronoi分割统计每个原子胞的多面体指数从而判断局部原子配位情况。对BCC金属间隙原子常见的是110哑铃和111挤列子它们在Voronoi指数上与正常格点原子有明显差异。不过说实话在大多数辐照损伤模拟分析中Voronoi分析用得不如WS分析多。它更适合做晶体结构分类、局域原子环境分析比如判断非晶区或晶界区的配位变化。我通常只在需要确认间隙原子具体位置和类型时才做这个补充分析。4. OVITO提取位错环DXA配置、判据与避坑4.1 DXA原理与适用边界DXADislocation extraction algorithm是OVITO里最有分量的分析工具之一。它基于拓扑分析先把体系中所有非完美配位的原子标记出来再通过表面重建等方法把位错线提取成线段对象同时给出伯氏矢量和滑移面信息。DXA在结构规整的单晶体系里表现非常稳定但在非晶态、高密度缺陷区、晶界等区域会失效或产生误导。因此在跑DXA之前先确认你的体系已经恢复到足够好的晶体有序度。对于级联碰撞模拟就是等缺陷复合基本停止、体系接近稳态后再做位错分析。我之前做过一个FCC铜的级联模拟在碰撞后1 ps时就急着上DXA结果输出了一堆乱七八糟的短线段完全没有物理意义。等体系弛豫到30 ps之后再做位错环就很干净了。这说明“分析时机”和“工具本身”同样重要。4.2 配置DXA并提取位错环操作很简单在modifier列表里添加Dislocation extraction algorithm然后设置Input particle type。如果体系只有一种原子默认即可。DXA运行时会自动识别并构建位错网络在viewport里显示为线条。如果位错环太多你可以用Selection功能选中位错环线段读取其长度和伯氏矢量。位错环在渲染图上通常表现为闭合的圆形或椭圆形线圈可以直接目视确认。对于需要定量输出的场景建议导出位错线数据。OVITO界面里可以在modifier输出列表上查看每条位错线的属性用Python脚本也可以批量提取。下面给一个从轨迹文件中提取位错环数据的Python示例import ovito from ovito.io import import_file from ovito.modifiers import DislocationAnalysisModifier pipeline import_file(dump.lammpstrj) dxa DislocationAnalysisModifier() pipeline.modifiers.append(dxa) # 只分析最后一帧 data pipeline.compute(pipeline.source.num_frames - 1) dislocations data.dislocations print(位错线段数量:, len(dislocations.lines)) for idx, line in enumerate(dislocations.lines): b line.burgers_vector length line.length print(idx, 伯氏矢量:, b, 长度:, length)这样你可以快速获得每条位错线的长度和伯氏矢量再结合环的闭合状态来判断是否是位错环。4.3 位错环类型的判定方法有了伯氏矢量和环形状如何判断这个环是空位型还是间隙型我的经验是先把WS缺陷分析叠加在同一个pipeline里直接观察位错环内部原子的性质。以BCC铁为例常见的位错环伯氏矢量有1/2111和100两种。当位错环区域内的WS胞计数为2即存在间隙原子时该环通常是间隙型位错环当环区域内WS胞计数为0即存在空位时则是空位型位错环。这两种环在辐照条件下都可能出现其中间隙型位错环在级联碰撞模拟中更常见因为大量间隙原子在高能碰撞后更容易聚集。不过在复杂情况下比如环里同时有空位和间隙原子团簇或者环太小时直接目视可能会误判。这个时候可以统计位错环围成区域内的净缺陷数量即间隙数减空位数为正就是间隙型为负就是空位型。这个判断方法虽然不是绝对严格但在我的模拟体系里基本可靠。4.4 周期性边界伪环的排查DXA的另一个常见问题是周期性边界造成的伪环。当位错线穿过模拟盒边界时由于周期性镜像位错线可以在显示上连成闭合环但物理上并不存在这个环。这种“伪环”在新手的结果里相当常见。排查方法也很直接在OVITO中切换到非周期显示模式或者查看位错线两个端点的坐标是否落在盒边界上。如果端点坐标接近盒子的边界值比如x最小值或x最大值那么这条位错线很可能是边界伪影而非真实位错环。对于尺寸较小的模拟盒这个问题尤其明显必要时可以把盒子放大再做验证。5. 常见问题与排查技巧四个高频大坑5.1 参考构型不匹配导致缺陷数量爆炸前面反复提到的高温参考构型问题我再展开讲讲。如果你在目标温度下做MD模拟直接拿0 K的完美晶格作为WS分析的参考构型那么由于热膨胀和原子振动会有大量正常格点被判成空位大量间隙位置被判成间隙原子缺陷数量轻松多出几个数量级。解决办法是在模拟开始前先在目标温度、零压力下用NPT系综弛豫足够长时间让晶格常数趋于平衡值然后取平衡后的一帧作为参考构型。如果模拟中温度变化很大比如从高温淬火到低温最好按时间段分片设置参考构型或者只对单个温度区间做精确统计。这个坑很隐蔽因为缺陷演化的趋势看起来是正常的但绝对数值全错了。5.2 dump文件缺box信息导致构型错乱有时候从LAMMPS输出的dump文件只是简单地用“dump 1 all custom 100 dump.lammpstrj id type x y z”这种格式OVITO加载时如果路径里不含box信息周期性就重建不了。许多人在OVITO里看到原子飞散到盒子外、构型完全错乱就是这个问题。解决办法是再加一行dump_modify写出三斜盒信息和镜像标志或者直接用OVITO支持的lammpstrj格式它本身包含box信息。另外如果使用wrap选项确保原子坐标落到周期盒内也有助于后续分析。下面是一个参考写法dump 1 all custom 100 dump.lammpstrj id type x y z dump_modify 1 sort id用这种格式输出后OVITO能正确识别周期性边界WS分析和DXA才能正常工作。5.3 大数据量下的性能优化与Python批量处理几万个原子的轨迹还好百万原子级别拖时间轴就能卡到怀疑人生。我的做法是把轨迹文件先做降采样每隔几帧采样一次或者先用OVITO的Expression selection把大量正常原子过滤掉只保留缺陷或位错相关原子。这样在交互浏览时系统负担小很多。批量统计还是推荐Python脚本。下面这个脚本可以批量导出每帧的空位数和间隙原子数import ovito from ovito.io import import_file from ovito.modifiers import WignerSeitzAnalyzerModifier pipeline import_file(dump.lammpstrj) ws WignerSeitzAnalyzerModifier() ws.reference_configuration.load(perfect.lmp) pipeline.modifiers.append(ws) with open(defects.csv, w) as f: f.write(frame,vacancies,interstitials\n) for frame in range(pipeline.source.num_frames): data pipeline.compute(frame) vacancies data.attributes[Wigner-Seitz.vacancy_count] interstitials data.attributes[Wigner-Seitz.interstitial_count] f.write(f{frame},{vacancies},{interstitials}\n)这样可以在服务器后台运行把CSV结果导出来不需要一直开着OVITO图形界面。后面用Excel或Origin画演化曲线都很方便。5.4 从零到一的最小复现流程清单如果你现在想完整走一遍这个流程我给你一个从零开始的最小清单用VESTA创建BCC铁晶胞构建20x20x20超胞导出POSCAR。用Atomsk把POSCAR转成LAMMPS data文件。在LAMMPS里设置好势函数比如铁常用的EAM势弛豫到目标温度记录一帧平衡构型。给定PKA能量比如5到10 keV设置级联模拟输出lammpstrj轨迹帧间隔按0.1 ps或更密。在OVITO中导入轨迹添加Wigner-Seitz缺陷分析以平衡构型为参考观察空位和间隙原子数演化。对最终构型添加DXA提取位错环结合WS分析判断环的类型。用Python批量导出每帧缺陷数和位错环数据。按照这个顺序走基本不会走弯路。如果你刚起步建议先用小体系、低PKA能量练手等把流程跑通再逐步加大规模。现象可能原因处理方式缺陷数量爆炸参考构型与温度不匹配用NPT弛豫后取平衡构型作参考原子飞出盒子外dump缺box信息改用lammpstrj格式并写出box位错环杂乱无章分析时机太早等体系弛豫稳定后再跑DXA边界出现闭合“环”周期性边界镜像查看位错线端点坐标是否落在边界这套流程我自己用了快五年从最初在OVITO里手忙脚乱到现在基本一条脚本写到底。中间踩过最多坑的其实不是分析本身而是前期建模和dump格式这两块。很多学生跑完MD花了大量时间在OVITO里找缺陷结果发现是参考构型没选好白白浪费几天。所以我特别强调只要初始结构干净、dump输出完整、参考构型匹配OVITO的WS和DXA几乎不会让你失望。最后再分享一个习惯任何自动化分析结果我至少要随机抽三帧肉眼复核。OVITO的渲染能力太强看到的“彩色图景”容易让人误以为分析绝对准确。但实际上WS分析在高密度非晶区可能不稳定DXA在缺陷密集区域可能提取出伪线段。只有抽样目检才能保证每个结论真的经得起推敲。这个习惯看着笨却在很多次关键时刻救了我的数据希望也能帮到你。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进