ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用hybrid混合势函数跑通FeCMnSiTi五元合金分子动力学模拟

用hybrid混合势函数跑通FeCMnSiTi五元合金分子动力学模拟 接合金项目最怕的不是算不动而是打开NIST势函数库检索一圈回来两手空空。Fe-Mn有EAMFe-Ti有MEAMSi有TersoffC有LJ参数但要把它们凑成一个FeCMnSiTi五元体系全网找不到一个现成的统一势函数。这种时候大多数人要么硬着头皮改合金成分要么自己从DFT开始拟合——前者丢掉了自己的研究问题后者一拟合就是小半年。我用pair_style hybrid把三套风格完全不同的势函数拼起来跑通了FeCMnSiTi的分子动力学模拟从零开始到拿到可用的平衡结构只用了一个多星期。这篇文章把整套思路和完整脚本都写出来包括怎么分配原子对、怎么处理EAM多体势的元素映射、以及验收混合势函数时必须做的几个测试。准备接手新合金模拟、又不想从零拟合势函数的人可以直接照抄。1. 为什么新合金的势函数总是缺胳膊少腿1.1 势函数是拟合出来的不是查出来的很多刚接触分子动力学的人会默认一个前提原子间的相互作用应该像数据库一样随便一个材料组合都能查到现成参数。实际上完全不是这么回事。一个EAM势函数背后是一整套DFT训练集、实验晶格常数、弹性常数、空位形成能、层错能甚至熔点的联合拟合光收集数据就要几个月。所以势函数领域的规律非常现实越常见的工业体系、越是二元三元体系可用的势函数越多一旦到了四元五元基本只能自己动手。以Fe-C-Mn-Si-Ti为例你能找到的势函数分布大概是这样的体系可用的势函数类型常见来源Fe-CEAMBecquart、Hepburn等NIST势函数库Fe-MnEAMMendelev等NIST/论文附件Si-TiEAM/FS、MEAMOpenKIMFe-C-Mn-Si-Ti五元几乎为零只能自己拼这个几乎为零不是文献不努力而是五元体系的拟合空间实在太大。势函数拟合本质上是高维参数优化元素越多需要约束的数据点成倍增长拟合出的势函数就越难保证可迁移性。所以现实就是要么接受精度损失去拼一个混合势函数要么花半年时间拟合新的。1.2 混合势函数不是偷懒是一种工程妥协用pair_style hybrid混合势函数的物理直觉其实很朴素金属键是短程相互作用一个原子周围的化学环境主要由最近邻决定。如果你能把体系按元素分成几个子体系每个子体系内用各自靠谱的势函数描述再把不同子体系之间的交叉相互作用用简单的对势兜底整体上就能得到一个能用的近似。但这里有个边界你得清醒如果体系里存在明显的电荷转移、共价成键或者跨势函数的强相互作用混合方案的误差可能大到结果失去意义。比如C和Ti之间如果形成强方向性键你用LJ描述Fe-C和Ti-C能定性说明问题就不错了别指望定量复现碳化钛的析出能。混合势函数解决的是有没有的问题不是严不严谨的问题——所有结果必须经过第5章的验收流程之后才能用于发文章。1.3 hybrid和hybrid/overlay的区别先搞清楚pair_style hybrid和pair_style hybrid/overlay是两码事很多人混着用。hybrid模式下每一对原子类型(I,J)只归其中一个子势函数管算能量时只有这一个势函数在起作用。hybrid/overlay则是同一对原子可以让多个子势函数同时算然后把所有贡献加起来。听起来overlay更强大但如果你叠加的是两个EAM同一个Fe原子会被两套嵌入函数分别算一次嵌入能等于把电子密度算了两遍能量立刻翻倍。所以对于多体势之间的组合老老实实用hybridoverlay一般只用于在原有势函数上叠加墙势、或者加一个远程修正项这类场景。2. pair_style hybrid的运行机制一个pair一个归宿2.1 语法骨架pair_style与pair_coeff一一对应pair_style hybrid的语法是pair_style hybrid 子势函数1 子势函数1的参数 ... 子势函数2 子势函数2的参数 ...子势函数之间的顺序不影响物理结果但后面的pair_coeff命令必须指明你要把这对原子分配给哪个子势函数。比如pair_style hybrid eam/alloy lj/cut 4.0 pair_coeff 1 1 eam/alloy FeMn.eam.alloy Fe pair_coeff 2 2 lj/cut 0.040 2.80 pair_coeff 1 2 lj/cut 0.046 2.95这段的意思是1-1这对原子用EAM算2-2和1-2用LJ算。LJ的截断半径是4.0埃EAM的截断半径由势函数文件内部定义。每个子势函数负责哪几对完全由你写的pair_coeff决定这一步是整个混合势函数的核心。2.2 pair_coeff的分配规则与元素映射在hybrid模式下pair_coeff的写法有个容易被新手忽略的规则一对原子(I,J)如果被多条pair_coeff匹配LAMMPS采用的是先到先得——第一条匹配的命令生效后面的不会重复覆盖。所以写pair_coeff * *这种通配符时要非常小心它表示除了已经分配过的所有剩余原子对。更隐蔽的是多体势的元素映射问题。EAM这种势函数文件里带有一组固定的元素列表pair_coeff后面跟的元素名是按原子类型顺序对应的不是按(I,J)对应的。举个例子如果体系里原子类型1是Fe、类型2是Mn你想让1-1、1-2、2-2全用FeMn.eam.alloy正确写法是pair_coeff 1 1 eam/alloy FeMn.eam.alloy Fe pair_coeff 2 2 eam/alloy FeMn.eam.alloy Mn pair_coeff 1 2 eam/alloy FeMn.eam.alloy Fe Mn你可以分多次把类型-元素映射告诉同一个子势函数但这个子势函数涉及的所有原子类型最终必须都有唯一的元素名。如果某个类型既被EAM管着、又在pair_coeff里没给它映射元素LAMMPS会直接报错。不同版本对这个检查的严格程度不一样我有一次把脚本从老版本换到新版就遇到了这个坑。2.3 全覆盖检查5种原子就是15个原子对一个都不能少N种原子类型一共有N(N1)/2个原子对hybrid模式下每一个原子对都必须有归属漏掉任何一个LAMMPS都会报All pair coeffs are not set或者Pair coeff for ... is not set。当年我第一次拼五元体系时就栽在这只写了14对愣是查了半天才想起来Fe-Ti这对没分配。提示写脚本时先把原子对矩阵画出来分配完一行行打勾。5种原子就是15对6种就是21对别偷懒。如果你确定某对原子在物理上可以忽略比如两个元素永远不会近邻可以用pair_coeff I J none显式告诉LAMMPS这对不计算相互作用。但none不是万能药它会让这两个原子的距离无限靠近而没有任何排斥跑短程MD很容易原子重叠。稳妥做法是给一个很短的LJ排斥尾巴保证结构不塌。3. FeCMnSiTi案例从零拼出一套可跑的势函数3.1 先盘家底你能找到哪些子势函数我的这个FeCMnSiTi案例背景是轻量化钢Fe-Mn合金作为基体Si和Ti作为合金化元素C是间隙固溶元素。开工前先花半天时间把势函数库翻了个遍最后锁定三套材料第一套是FeMn合金的EAM文件FeMn.eam.alloy来自NIST势函数库覆盖Fe和Mn两个元素用于描述基体的Fe-Fe、Fe-Mn、Mn-Mn相互作用。这是整个体系的地基选它是因为Fe-Mn二元势函数成熟度最高拟合数据充分。第二套是SiTi的EAM/FS文件SiTi.eam.fs来自OpenKIM覆盖Si和Ti用于描述Si-Ti亚系统的相互作用。Si和Ti在钢中容易形成金属间化合物和碳化物这个子系统的描述质量直接影响析出相的模拟。第三套是C相关的相互作用。最理想是找一个同时覆盖Fe和C的EAM但问题在于如果用Fe-C EAM处理Fe-C同时再用FeMn EAM处理Fe-Fe同一个Fe原子会被两套EAM各算一次嵌入能。所以我的方案是C相关的一律用LJ兜底虽然精度有限但至少不会双重计算。3.2 原子类型重排与15个原子对的归属拿到势函数后的第一件事不是写脚本而是规划原子类型编号。原则是同一个势函数文件里的元素尽量占用连续的原子类型编号方便元素映射。我最后定的方案是原子类型元素归属子势函数1Feeam/alloy2Mneam/alloy3Sieam/fs4Tieam/fs5Clj/cut对应的15个原子对归属如下原子对子势函数备注1-1, 1-2, 2-2eam/alloyFe-Mn基体3-3, 3-4, 4-4eam/fsSi-Ti亚系统5-5lj/cutC-C1-5, 2-5, 3-5, 4-5lj/cut含C交叉项1-3, 1-4, 2-3, 2-4lj/cut跨亚体系金属对无现成势函数时的兜底这里最需要说明的是最后4个跨亚体系金属对。Fe-Si、Fe-Ti、Mn-Si、Mn-Ti在真实钢中非常重要但手头没有同时覆盖这几个元素的可靠势函数。对这部分我有两个选择一是从文献里找Fe-Ti、Fe-Si二元EAM二是先用LJ兜底。考虑到目前案例主要做的是基体相变和C的扩散行为Si和Ti含量低我选了LJ兜底并在验收阶段对结论做了限定。3.3 完整输入脚本与逐行解读# FeCMnSiTi 混合势函数案例 # 原子类型1Fe, 2Mn, 3Si, 4Ti, 5C units metal boundary p p p atom_style atomic lattice bcc 2.87 region box block 0 10 0 10 0 10 create_box 5 box create_atoms 1 box # 后续用set type或read_data把部分Fe替换/添加为Mn Si Ti C pair_style hybrid eam/alloy eam/fs lj/cut 4.0 # --- 基体Fe(1)-Mn(2) --- pair_coeff 1 1 eam/alloy FeMn.eam.alloy Fe pair_coeff 2 2 eam/alloy FeMn.eam.alloy Mn pair_coeff 1 2 eam/alloy FeMn.eam.alloy Fe Mn # --- 亚系统Si(3)-Ti(4) --- pair_coeff 3 3 eam/fs SiTi.eam.fs Si pair_coeff 4 4 eam/fs SiTi.eam.fs Ti pair_coeff 3 4 eam/fs SiTi.eam.fs Si Ti # --- 含C(5)的相互作用全走LJ --- pair_coeff 5 5 lj/cut 0.040 2.80 pair_coeff 1 5 lj/cut 0.046 2.95 pair_coeff 2 5 lj/cut 0.046 2.95 pair_coeff 3 5 lj/cut 0.035 2.80 pair_coeff 4 5 lj/cut 0.030 2.60 # --- 跨亚体系金属对LJ兜底 --- pair_coeff 1 3 lj/cut 0.100 2.60 pair_coeff 1 4 lj/cut 0.120 2.65 pair_coeff 2 3 lj/cut 0.100 2.60 pair_coeff 2 4 lj/cut 0.120 2.65 mass 1 55.845 mass 2 54.938 mass 3 28.085 mass 4 47.867 mass 5 12.011 velocity all create 300 12345 neighbor 0.3 bin neigh_modify delay 0 every 1 check yes fix 1 all nvt temp 300 300 0.1 timestep 0.001 thermo 100 thermo_style custom step temp press pe etotal run 50000这里有个细节pair_style hybrid的LJ截断我设成4.0埃比两个EAM文件内部的截断半径都大或相当。原因后面第4章详述但先记住一点同一个体系里所有子势函数的有效截断半径必须相互协调否则会出现能量跳跃。3.4 生成合金初始结构与标准弛豫流程上面的脚本用create_atoms生成纯Fe实际合金需要你把部分原子替换成Mn、Si、Ti再随机加入间隙C。我一般用set type加随机数实现set atom 1 type 2 # 把所有原子暂时设为Mn再按比例切分或者用region限定更常用的做法是直接用read_data读入一个自己用原子替换脚本比如Python脚本生成的合金构型。替换时注意不要制造原子重叠——C作为间隙原子要放在八面体间隙位不要随手放在Fe的最近邻位置否则一开始能量就爆炸。弛豫顺序建议是先在0 K下做一次能量最小化minimize把局部的原子重叠消除再用fix box/relax在零压下弛豫晶格常数最后升温到目标温度跑NPT平衡。时间步长先用0.5 fs跑几千步观察能量是否发散稳定后再放大到1 fs。别一上来就2 fs混合势函数的力场拼接处比统一势函数脆弱得多。4. 混合势函数最容易翻车的四个坑4.1 截断半径打架不同子势的截止距离必须统一口径EAM的截断半径是写在势函数文件里的比如FeMn.eam.alloy的截断可能到4.2埃而SiTi.eam.fs的截断可能只有3.9埃。你自定义的LJ截断又是另一个值。问题在于LAMMPS的邻居列表是按所有子势函数里最大的截断半径来构建的但某个具体的原子对只在自己的截断范围内计算相互作用。后果就是一对Fe-Si原子如果距离在3.9埃到4.2埃之间Fe-Fe的EAM在算Si-Si的EAM也在算但Fe-Si的LJ已经截断消失了。能量曲线上会出现一个不连续的悬崖高温下原子一旦跨越这个距离受力突变体系温度瞬间飙升。我的经验是把所有对势LJ、Morse、table的截断半径统一设成不低于任何多体势文件的截断半径。你可以在读入势函数后用write_coeff输出看每个子势函数的实际截断值再回头调整LJ的参数。4.2 多体势的双重嵌入同一个Fe被算了两遍这是混合多体势最大的物理陷阱。EAM能量由两部分组成对势项加嵌入能。嵌入能是每个原子基于周围电子密度算出来的。如果Fe同时出现在两套EAM里——比如你既用FeMn EAM描述Fe-Fe又用Fe-C EAM描述Fe-C——那么同一个Fe原子会被两套EAM分别计算一次嵌入能。这等于把Fe周围的电子密度重复计费总能量不是物理上的体系能量而是两套近似势函数的简单叠加。在某些配置下误差可能互相抵消在另一些配置下则急剧放大。所以我的建议是在多体势层面每个原子类型只让它出现在一个子势函数里。所有涉及C的相互作用全部下放到LJ层面就是为了避免Fe被二次计费。4.3 LJ参数不能瞎填金属-C体系的LJ参数经常被随手拿来用这是混合势函数里误差最大的来源。LJ的12-6形式在短程太硬用来描述C在Fe晶格间隙的溶解行为会明显高估间隙形成能因为真实的Fe-C排斥要比12-6缓和得多。我用的Fe-C的sigma2.95埃、epsilon0.046 eV这组参数来自对Fe-C体系DFT数据的拟合文献不是猜的。如果你找不到合适的LJ参数有两个更好的选择一是用Morse势它在短程比LJ软更适合金属-间隙原子二是直接从DFT算几个关键构型C在八面体间隙、C在表面、C在晶界的能量拟合一个table样式的对势精度会好很多。提示在你能接受的精度范围内宁可让C相关参数偏保守弱一些也不要为了追求结合能而把LJ参数调大。参数太强会导致模拟中C异常团聚甚至析出假相。4.4 编译打包与版本差异为什么别人能跑你不能pair_style hybrid本身在LAMMPS核心包里但EAM需要MANYBODY包eam/fs配套的一些工具在EXTRA-COMPUTE里如果你后面用table样式还需要确认table包被编译进去。最省事的方案是重新编译时直接make yes-all然后make mpi把能装的包全装上虽然编译时间长一点但至少不会被莫名其妙的ERROR: Illegal pair_style command卡住。用conda安装LAMMPS的话conda-forge的构建一般默认带全大部分常用包装上直接能跑。但要注意版本差异不同版本对hybrid模式下多体势元素列表的检查严格程度不一样我遇到过同一套脚本在2021年版本上跑得很顺、换到2023版本就报元素映射错误。这是因为新版对pair_coeff的解析做了调整。遇到这种情况不要慌先查版本发布说明然后改元素映射的写法。5. 混完怎么验收一套低成本的势函数校验流程5.1 单点能量与力残差检查混合势函数拼好之后能不能直接跑生产模拟绝对不能。第一步先做单点能量和力残差检查。取一个纯Fe的bcc超胞分别用原始的FeMn EAM和现在的hybrid设置跑一次run 0对比总能量。理论上Fe-Fe对都归eam/alloy管能量应该完全一致。如果这里就不一致说明你的pair_coeff分配出了问题元素映射有冲突先解决这个再往下走。然后构建一个含C的构型做能量最小化看minimize结束后max force是否降到1e-6 eV/Angstrom量级。如果最小化后仍然有原子受力在1e-2量级多半是C落在了距离过近的位置或者LJ参数给的排斥太弱导致原子位置漂移。这时候去看dump文件里最近邻距离是否小于0.8倍晶格常数的一半直接就能定位问题。5.2 晶格常数与弹性常数的0K标定0 K下的晶格常数和弹性常数是势函数的体检报告。用fix box/relax做零压弛豫得到平衡晶格常数a0。纯Fe的实验值是2.87埃左右FeMn基体略高一点。如果hybrid算出来的a0和已知值偏差超过3%说明混合时的某个分配严重影响了基体描述。再进一步可以算弹性常数compute elastic all elastic在新的平衡构型上施加几个小应变得到C11、C12、C44。和实验或文献值做一个对照表。偏差在10%以内可以接受超过这个范围就要回头审查势函数分配。这个步骤花不了多长时间但能帮你建立对这套混合势函数的基本信任。5.3 短程MD稳定性测试与结构合理性判断0 K验证通过后跑一个10 ps的NPT温度选在300 K和一个你关心的实际工作温度比如1000 K。观察标准有三条总能量是否在恒定水平波动而不是漂移体系压力是否在合理范围内波动是否有原子距离异常接近。检查原子重叠有个小技巧写个awk脚本直接扫dump文件统计所有原子对的最小距离awk NR9 $20 {for(i3;iNF;i) min...} dump.lammpstrj如果最小距离小于1.5埃说明势函数在某处产生了非物理吸引大概率是跨亚体系金属对的LJ参数太弱没有提供足够的排斥。温度越高这种问题越容易暴露所以务必在目标温度下测试。5.4 和DFT对一对关键构型混合势函数的底线在哪前面所有检查都是自洽性测试只能说明这组势函数内部没有矛盾不能证明它算对了。真正能确定误差底线的是和DFT对照关键构型。我的做法是挑4到5个你后续研究最关心的局部结构比如C在Fe基体中的八面体间隙、C在Ti原子附近的偏聚位、Si替换Mn后的最近邻弛豫。这些小构型超胞不大DFT算起来也就一两天。然后比较DFT和hybrid势函数给出的相对能量排序。如果排序一致说明混合势函数至少定性地保住了关键化学趋势如果排序反了那这个混合方案不适合研究这类问题你需要在那个关键相互作用上换更好的子势函数比如把LJ换成DFT拟合的table势。这一步不做前面所有测试过了也白搭。混合势函数最怕的就是整体看着对、局部化学错了——只有DFT对照能揪出这个问题。整套流程走下来我的体会是混合势函数不是科学上的完美答案但它是工程上的高效答案。关键是你得对自己的混合方案有清醒的认知知道哪部分可靠、哪部分是兜底近似。最后再分享一个小习惯把用到的每个势函数文件、下载地址、LAMMPS版本、所有pair_coeff参数都记进一个README文件和输入脚本放在同一个目录下。这不仅是学术可复现性的要求后面你自己回头改体系的时候也会感谢当时记下的这些细节——我在这个案例上就靠这份记录省下了至少三天的重复排查时间。
返回列表