这个例子通过固体界面ZnS(110)反应作为训练集,展示如何将AMS 中的几个不同的ReaxFF力场组合,得到一个新力场的很好起点(注意:永远不可能通过组合不同力场得到一个不需要训练的新力场,组合出来的新力场一定是缺参数未优化的),进行训练的方式。
关于与ReaxFF训练集建立和BAND、Quantum Espresso基本操作部分将不再赘述,详见相关模块的教程,以及ParAMS的第一篇教程
AMS中包含的ReaxFF力场覆盖了元素周期表的很大一部分,但仍然存在一些没有相互作用的参数。本教程的目标是,对ZnS表面上的H2S吸附进行模拟,但AMS不包括ZnS-ReaxFF力场。现有力场中,ZnOH.ff中的O元素与S元素行为方式非常相似,因此可以考虑直接将该力场中用得到的含O参数可以作为含S参数导入,然后结合LiS.ff和Mue2016.ff的一些参数:
这两个力场中的这几个参数,显然比ZnOH.ff中的更好,因此将这几个参数合并进来,代替ZnOH.ff → ZnSH.ff后的对应参数。
SCM → ParAMS → Parameter → ReaxFF,得到一个如下图所示,0值的ReaxFF力场参数的Gen部分(Gen是General的缩写,这部分参数实际上就是力场的头部的37个通用参数,有2个not used没有导入)。 选中所有的空参数(黄色即为选中,注意不是勾选Active。选中第一条参数行,按住Shit键再选中最后一条参数行,则所有行都选中了),Parameters → Initialize ReaxFF block → GEN from GEN:(不填入内容表示所有Gen属性的参数都需要初始化,因此如果需要初始化其他Block,则在此处类似输入Block名字即可) → 直接点击OK → 选择ZnOH.ff → OK,所有Gen这个Block的参数被ZnOH.ff对应的参数覆盖:
这里讲解如何导入包括原子参数ATM:S、键参数BND:S.S、键角参数ANG:S.S.S。
Parameters → Add ReaxFF block(新建一个新的Block),参考提示格式的样子,输入ATM:S,即新建硫的原子参数Block。此时下方增加了29个新的参数,Value为0,Block名为ATM(即Atom的缩写,表示是原子参数),Atoms这一栏显示是S原子。如下所示:
然后类似步骤2中的方式,从LiS.ff中导入S原子参数。然后类似地,创建键参数BND:S.S, 键角参数ANG:S.S.S,并从LiS.ff中导入。
注意:在这里,不要使用中文符号,会报错。也可一次性输入上述参数,中间用空格或英文的逗号隔开即可:ATM:S,BND:S.S,ANG:S.S.S。
和上面完全类似地,新建ATM:H BND:S.H ANG:H.S.H参数,并从Mue2016.ff力场导入。创建新的力场时,一定要把所有元素之间的键参数BND都新建出来,否则分子动力学模拟中会提示缺少键参数,但键角和二面角参数不需要所有元素之间都有,只需要模拟中涉及到的参数,注意键角和二面角参数有元素顺序要求,例如S-Zn-S,Zn为角顶点。
原因:
新建多个参数导入时,注意检查是不是所有参数都被选中了(主要看Block和Atoms那两列就能检查好)。
接下来新建:ATM:Zn, BND:H.H, BND:Zn.H, BND:Zn.Zn, BND:Zn.S, ANG:Zn.Zn.S, ANG:Zn.S.Zn, ANG:Zn.S.S, ANG:S.Zn.S,HBD:S.H.S,然后从ZnOH.ff导入。不过要注意:导入的时候将所有S替换成O(如下图所示),这样就会用O相关的参数导入作为S相关的对应参数,因为我们是将Zn-O作为Zn-S的初始参数。
以上整合了三个力场的参数,作为训练的起点。
File→Save保存作业,例如reaxff-zns.params。避免力场参数遗失,重新导入参数的麻烦。后面设置完具体训练方式后,再保存运行即可。
在本教程中,以下参数不优化:GEN,ATM,H-Zn和H-H等BND参数(训练集中无相关数据),ANG: S-S-S(训练集中无相关数据),参数为0的也不优化。
注意:对于不同体系大家应该思考如何选择优化的参数,以及为什么要优化该参数,否则会浪费大量时间精力,而且需要优化的参数空间太大时,结果的合理性也会受到影响。 对于需要优化的参数也可进行敏感度测试的准则,具体参考第一篇教程。本次优化参数包括:
可以利用窗口底部的搜索框功能,快速找到参数以供勾选,还可以结合Block和Category快速筛选以供勾选,如此将需要优化的参数勾选成Active状态。 勾选完毕后,Block选择All,Active下拉菜单去掉Show Non-active的勾选),仔细核对需要优化的参数类型和结果:
通常情况下,默认的参数变动范围是20%,在这里我们为了缩小参数优化空间,可选择8.3%。这个范围根据经验和体系不同可以变化,如果Error function很难收敛到理想的结果,可以适当放大参数空间,对于一些有物理意义的体系,一般参数范围不超过30%(例如键解离能D_e^sigma)。设置方法:首先将所有需要变化的参数选中(黄色高亮),Parameters → Adjust Min and Max → Range-Scale-1.2改为1.083 → OK,可以看到参数表中的Min、Max值发生了变化。 保存作业,防止丢失。
训练集是训练所依靠的数据,验证集则是另一批完全不同的数据,与训练集没有交集更好,训练完成之后,如果对验证集来测试(软件自动完成测试,并得到点线图)也得到不错的符合度,就表示训练比较成功。
计算晶体的生成焓和状态方程(Equation of States),即拉伸压缩晶胞体积得到的能量变化的曲线。 可以从AMS中直接搜到部分晶体结构,如果没有你需要的结构晶体结构可从文献和数据库(例如Material Project)中寻找,注意选择正确的晶型结构。 这里使用BAND(或Quantum Espresso)模进行势能面扫描,参数设置如下(BAND的参数设置、Quantum Espresso的势能面扫描参考相关教程:晶体、低维材料:BAND & Quantum Espresso) 点击PES Scan后面的 > 按钮进入Geometry Constraints and PES Scan设置面板设置详细的势能面扫描参数:点击Cell Volume前的+,设置Volume的Scale范围为0.9到1.1,SC-1中设置扫描的点数为21,我们晶胞体积为39.6Å3,那么变化范围从35.64到43.56。
保存作业,并运行。计算完成后SCM → Movie中可以看到状态方程曲线,即能量随体积压缩的结果:
回到前面的ParAMS界面,如果界面关闭了,重新打开打开reaxff-zns.params这个作业就可以了。 Jobs → Add Job选则刚刚计算的状态方程的作业的*results/ams.rkf: 导入训练集的对话框:Use Results Importer选择Add PES Scan Single Point,Task(for new job)选择Single Point,Properties中选择Relative energy。
其中Add PES Scan Single Point与Add Single Job的区别是,前者会将PES中收敛的每个点当作一个单独的单点计算导入为Job,后者则是将PES作为整个特征数据导入成为训练集。
注意:
Job本身不是训练集,但Job中包含的一些数据可以成为训练集。训练集中的数据类型,可以点击顶部右侧第一个下拉菜单Type看到,从Energy、PES……到Cell angle为训练集的数据类型。每个Job的能量特征等,可以导入到训练集(下文中可以看到如何操作)。真正的训练集,点击在窗口顶部右侧的Training Set按钮可以看到训练集列表。
使用ADF或BAND、Quantum Espresso,做一个对H2S进行结构优化的作业,然后Jobs → Add Job导入。注意导入时,选择任务类型和导入的性质,可以根据具体希望导入的结果调整。例如,如果导入是解离曲线和能量、电荷或者力等输入,TASK中选择Single Point,如果是希望导入结构参数(键长键角等),则选择Geometry Optimization, Property中空置。
此处我们将气相的训练集结果输入导入:
导入该结构优化的训练集后,如果需要额外添加键长、键角、二面角等结构数据。如上图所示,窗口右上部分中,选中该Job。如果要添加键长数据,左边窗口选中S原子和O原子,Training Set → Add → Bonds即可添加S-O键长数据。如果没有选中制定原子,则添加所有键长数据。类似地可以添加键角、二面角等数据。
File → Save保存作业。
用户可以自行尝试ZnS(110)切面吸附等,并类似地导入训练集。如何切面、进行吸附能和表面能计算,大家可以查阅相关教程:晶体、低维材料:BAND & Quantum Espresso
注意:计算训练集作业和参数优化ParAMS是不同的界面,不要混为一谈。也不要重复开启多个ParAMS,否则之前生成的初始力场、导入的训练集,在新建的ParAMS窗口就都没有了。
上述部分我们介绍了如何建立新的力场参数,如何计算训练集,并导入到ParAMS中,接下来的部分我们将介绍如何进行参数优化。作为教程,这里我们使用例子$AMSHOME/scripting/scm/params/examples/ZnS_ReaxFF中现成的训练集进行演示,例子的训练集存储在*.yaml文件中。前面我们保存作业时,也会生成这些*.yaml文件,您可以打开保存的作业的*..params文件夹对比一下。
SCM → ParAMS → File → Open 打开其中的job_collection.yaml文件。就得到了正常的训练集、力场初始参数、训练方法与参数设置的窗口。
注意:图中有的训练集例如Energy条目,显示为两个结构的能量差,选中这种条目,在左边模型窗口,用键盘←、→可以看到2个结构。
保存作业,并运行。
下面是运行结果,其中第一个图是Loss function(包括训练集和验证集),所谓训练集就是我们进行拟合力场参数所参考、依赖的数据,我们可以看到两者的误差函数均随着拟合过程呈现下降趋势,说明我们拟合的参数合理,即使不在训练集中的情况也描述的很好(Validation loss,验证集)。第二个图是力的平均偏差,第三个图是力的偏差值。通过选择不同的图像,可以查看我们的训练集结果,例如电荷,键解离曲线,能量等相关数据,具体文件位置等可以查看上一个教程。
感谢苏州大学刘越老师整理资料。