目录

ParAMS:训练DFTB参数

本例子中训练集主要包括:

  1. DFT计算的LiF能量体积曲线,即状态方程
  2. 沿着能量-体积曲线的每个点的应力张量(可选)
  3. 实验的反应生成焓:0.5 F₂(气相) + Li(固相) → LiF(固相)
  4. 实验上F2的键长(1.41 Å)

本教程还将展示如何对不同的作业使用不同的k空间采样(GFN1-xTB)。

一、训练集1:LiF的能量-体积扫描

在BAND模块中导入LiF晶体结构,设置扫描作业:

注意:

对于能量-体积扫描,使用更密集的k点采样通常能够获得一定的精度提升,但是计算资源也随之增加,选取合适的k点很重要。在这里,我们将数值质量保持在默认值Normal,只是为了更快地完成计算。如果需要更快的计算,请将 Numerical Quality 后面的 > 按钮,将k-space改为Basic。

更详细的势能面扫描教程,参考:BAND对周期性体系进行势能面扫描(得到鞍点的初始猜测)Quantum Espresso对周期性体系进行势能面扫描

在这里我们可以选择更多的训练集数据,例如计算每个体积的应力张量,这样所消耗的计算资源会略多一些。勾选中Geometry Constraints and PES Scan 页面中的Results for all PES Points,Properties中的Gradients选中Stress tensor。 保存作业,并运行。

计算完毕后,SCM → Movie可以看到势能曲线:

二、将训练集导入ParAMS中

打开ParAMS,Parameters选择GFN1-xTB表示将训练DFTB的GFN1-xTB参数。Jobs → Add Jobs增加训练集,选择前面势能面扫描的作业的*.results/ams.rkf,导入势能面扫描的各个点的能量:

然后再次导入该Job,但是这次导入应力张量的对角项(这是三维体系,因此导入了更重要的stresstensor_diagonal_3d):

训练集包含:

注意:导入PES扫描结果有两种方式:Add Single Job和Add PES Scan SinglePoints。 应力张量只能使用Add PES Scan SinglePoints导入。 如果没有计算每个点的应力张量,只导入能量,则也可以将使用Add Single Job、Task(for new job):PESScan作为整体PES一起导入使用。相关内容可以参考:ParAMS训练ReaxFF力场的进阶案例:多力场合并、多个训练集

File → Save 保存作业为LiF.param。

三、导入实验数据

ParAMS可以使用实验数据为训练集进行训练,这样可以避免昂贵的DFT计算。在这里我们将使用反应 ½F2(g)+Li(s)→LiF(s)的反应焓变结果 ΔH⁰ = -617 kJ/mol = -147 kcal/mol = -0.2350 Ha = -6.394 eV。

首先,让我们做三个计算:

因为我们只需要一个训练集数据框架,将其导入后,将数值改为实验数据即可,因此这三个作业没有必要进行高精度计算。因此我们采用DFTB进行计算。

1,F2的结构优化

这里我们并不需要真正收敛,因为F2的键长也有实验值,所以可以勾选Pretend converged假装收敛了,不必优化很多次(实际上对于F2这种小体系,几步就收敛了):

计算完毕后,ParAMS → Jobs → Add Jobs添加该训练集:

后面统一修改为实验值。

2,Li(s)单点计算

从AMSinput的晶体结构数据库中导入LiF,并进行单点计算,设置略。作业名为LiF_bulk。

3,LiF(s)单点计算

从AMSinput的晶体结构数据库中导入Li,并进行单点计算,设置略。作业名为Li_bulk。

4,导入并修改为实验数据

将后面这两个作业导入:

注意:“Reference Engine”列显示DFTB,它对应于AMSinput中使用的设置。不过本教程中,我们将使用实验参考数据,因此可以将三个新条目的 Reference Engine删除掉。

按住Shift,选中F2,Li_bulk和 LiF_bulk这三个Job,双击之,在弹出的窗口中,将 Reference Engine ID 改为 None,点击OK:

这样我们在Jobs列表中,可以看到这三个Job的Reference Engine变为了None,去掉了原始计算引擎信息:

到此为止,这三个Job被导入ParAMS,但并未进入Training Set。

1)reaction energy实验数据:ParAMS → 在没有选中任何Job的情况下,菜单栏Training Set → Add → Energy (或快捷键Ctrl E)。如此,在Training set列表中会出现Energy Job ID:

双击这一行,在Energy框中输入:1.0*energy(“LiF_bulk”)-energy (“Li_bulk”)-energy(“F2”):

注意:

Values区域根据单位输入能量值:-617 kJ/mol 或 -147 kcal/mol 或 -0.2350 Ha 或 -6.394 eV,点击OK,保存文件。

注意:

这里,Li_bulk Job包含一个Li(Li元胞)的公式单位,LiF_bulk job具有一个LiF(LiF元胞)公式单位,F2 Job包含一个F2分子,这意味着化学系统与化学方程中的物种完全匹配。如果使用的LiF中含有4个LiF,即Li4F4,那么反应方程式需要写成2 F₂(g) + 4 Li(s) → Li₄F₄(s),那么 ΔH⁰ = -2468 kJ/mol。

这两种不同的方式来书写相同的反应,具有不同的反应能量。在参数化过程中,如果使用第二个方程2 F₂(g) + 4 Li(s) → Li₄F₄(s), ΔH⁰ = -2468 kJ/mol,那么预测反应能的误差将大4倍,实际效果等价于该条训练集权重变为4倍大了,从而挤占了其他训练集的权重。

2)导入F2键长:选中F2 Job,Training Set → Add → Bonds,然后回到Training Set窗口,双击新增的这个训练集,修改键长为1.41:

点击OK(注意经常Ctrl S保存任务)。

四、GFN1-xTB中关于k点的测试

GFN1-xTB是一种电子结构的计算方法,训练GFN1-xTB时,也会用到GFN1-xTB方法进行计算,因此也会使用k点。对于周期性晶体,k点采样的收敛是很重要的,特别是将能量作为训练集时。在本教程中,能量体积扫描和形成焓都利用了能量,并比较了不同晶格体积下的能量。对于这些工作,k点采样应该是什么?

由你来决定。

在这里,我们将演示如何为Li_bulk和LiF_bulk作业设置合适的训练k点,以及如何为体积扫描作业使用合适的k点。对于F2(气相)结构优化,因为周期性为None,所以不需要考虑k空间的设置。因为Li和LiF的元胞非常对称,所以我们会将KSpace Type设置为Symmetric,这样计算效率会更加高。

在ParAMS中,力场参数优化的引擎设置被称为“ParAMS Engines”(计算训练集的计算引擎被称为Reference Engine)。我们将创建两个新的ParAMS Engines,分别使用不同的k点,名为kspace_normal_symmetric : KSpace Type Symmetric and KSpace Quality Normal 和kspace_good_symmetric : KSpace Type Symmetric and KSpace Quality Good。

首先Jobs窗口,选中五个 volumescan_frame001- volumescan_frame005:

双击之,打开Details,将ParAMS Engine ID中选择New ParAMS Engine,则会出现一个ID-1:

点击右侧的AMSinput,会弹出对话框,点击确定: 会弹出新的AMSinput → DFTB → Periodic改为Bulk,K-space右侧>按钮 → K-space grid type:Symmetric,设置完毕Ctrl S保存(Pass to ParAMS点击Yes)。

在Job的对话框中,可以看到ParAMS engine中显示为ID-1。

到Engines窗口,双击ID-1,弹出对话框,将Engine ID改为kspace_normal_symmetric:

点击OK,可以看到相关的ParAMS Engine ID已经更新:

注意:当你选择多个Job时,双击Detail列,并进行任何更改,所有设置(AMS settings, Reference Engine ID, and ParAMS Engine ID)都将应用到所选的所有Job。如果您有多个作业,可以使用窗口底部的搜索框进行筛选,例如输入volumescan以仅查看与volumescan匹配的作业。

重复上述操作,设置LiF_bulk和 Li_bulk Job的Engin,唯一区别是K-Space Integration的K-Space设置为Good:

并将该Engine命名为kspace_good_symmetric。随时Ctrl s保存任务。

五、训练GFN1-xTB参数

在GFN1-xTB中,排斥势由每个元素的两个参数alpha和Z控制。

1.设置优化参数

在搜索框中搜索F:,分别将参数F:Z和F:alpha左边的Active选中,依次选中Li:Z和Li:alpha,可以通过更改“Min”和“Max”列中的数字来更改参数允许的最小值和最大值:

在Optimization中选择参数:

保存文件,并运行。

本例的文件在$AMSHOME/scripting/scm/params/ examples/xTB_LiF中,可以将内容复制到新的目录下,并通过SCM → ParAMS → File → Open打开job_collection.yaml(打开这个作业后,可直接运行这个作业)。

优化时,如果你认为结果已经足够好了,则不需要等待参数化完成。

2,查看结果

可以在下图所示位置查看Loss function,以及每个训练集的优化结果和初始结果的对比,也可以在Results中读取相关能量值。

注意:添加PES训练集时,选择Add PESScan SinglePoints,Task(for new job)选择SinglePoint时,图形界面不会绘制任何能量体积曲线(输出中的pes_ predictions文件夹为空)。要获得这样的图,导入时,选择Add Single Job,Task(for new job)选择PESScan。类似:ParAMS训练ReaxFF力场的入门案例