提示:下面的操作,除了DFT计算之外,其他只在Linux、Mac系统测试过。本教程仅适用于2019.1以下版本。
ADF软件集成了使用蒙特卡洛方法优化力场参数的脚本。目前已经可以较为方便的使用,脚本经过测试,可以正常工作,但大都是在命令行下工作。用“优化”的方式,也可以创建一些新的力场:一般在相似力场的基础上,对力场中的元素进行修改,使用DFT计算这些新元素体系的一些结构的能量,然后使用MCFF对力场参数进行优化。
工作过程分为如下几步:
本文以石墨烯片层为例,DFT计算得到的层间距为3.355埃(如下图中所示,单胞内的两层石墨烯):
而CHO.ff力场优化得到的间距是3.10埃。
本文尝试通过优化CHO.ff的参数,使得新的CHO.ff力场也能优化出与DFT接近的间距。因此DFT计算主要围绕这一点,计算了平衡间距附近的一些结构的能量,用这些计算结果优化CHO.ff力场。如果用户关心其他方面,例如其他键长,也可以用DFT计算类似的计算。ReaxFF中有的晶体常数计算不准确,也可以通过调整不同的晶格常数来计算DFT能量,并以此优化对应的力场。
下文生成的geo、trainset.in、ffield、ffield_min、ffield_max、ffield_bool、ffield、mcff.run文件必须在同一个目录下,优化力场的过程也是通过命令行,在该文件夹进行。因此要确保在该文件夹下,可以直接运行*.run,并且该文件夹的完整路径中不包含中文字符、空格等。
Windows中的运行命令行的方法:
$ADFBIN/startpython LT_to_trainset.py *.t21
后面其他的命令,也需要在前面加${$ADFBIN/}$,但是像cp、chmod这样的命令,并不是ADF的命令,而是系统的基本命令,前面不需要加${$ADFBIN/}$,用户需要自行尝试。
这里我们使用ADF软件中,用于计算周期性体系DFT计算的BAND模块进行计算。改变两层石墨烯之间的距离,分别为3.913、3.718、3.416、3.355、2.992、2.618、2.316埃,计算了他们的能量。如下图所示:
说明:
这里只是为了演示过程,因此DFT计算的时候,没有设置很精确的参数,用户应该根据自己的体系,选择适合的基组、泛函,具体可以参考:不同泛函的特点、ADF:一般情况下如何选择基组Basis Set、diffbasisfordiffelement,另外因为不关心能带等性质,因此可以设置k点为1 1 1,也就是只计算Gamma点(ADFinput > Details > Numerical Quality > k-space : Gamma Only),这样可以大大节省计算量,而不影响力场优化的可靠程度。
计算结束后,在*.logfile尾部可以看到以三种单位显示的形成能:
我们需要其中单位为kcal/mol的数值,例如该结构能量为-544.6622 kcal/mol。
能量是一个相对值,BAND直接给出形成能,对同一个体系(原子相同),形成能可以代替总能量。
geo文件的格式:
BIOGRF 200 DESCRP 1_reax REMARK Created by ADFinput RUTYPE SINGLE POINT CRYSTX 2.46000 2.46000 6.71000 90.00000 90.00000 120.00000 HETATM 1 C 0.00000 0.00000 1.67750 C 1 1 0.0 HETATM 2 C 0.00000 0.00000 -1.67750 C 1 1 0.0 HETATM 3 C 0.71014 -1.23000 1.67750 C 1 1 0.0 HETATM 4 C -0.71014 1.23000 -1.67750 C 1 1 0.0 UNIT ENERGY kcalmol ENERGY -596.8255 END …… BIOGRF 200 DESCRP 3_reax REMARK Created by ADFinput RUTYPE SINGLE POINT CRYSTX 2.46000 2.46000 6.71000 90.00000 90.00000 120.00000 HETATM 1 C 0.00000 0.00000 0.63850 C 1 1 0.0 HETATM 2 C 0.00000 0.00000 -1.67750 C 1 1 0.0 HETATM 3 C 0.71014 -1.23000 0.63850 C 1 1 0.0 HETATM 4 C -0.71014 1.23000 -1.67750 C 1 1 0.0 UNIT ENERGY kcalmol ENERGY -544.6622 END
里面有晶体结构信息、能量信息等,手写起来非常麻烦。我们可以通过如下操作,快捷生成该信息:
这个文件并不是geo文件相同的作用,而是对力场优化的过程进行一些权重设置,也就是用户可能特别要求某些参数更重要,权重就可以设置的很高,这样在优化力场过程中,就会更大程度地满足该参数条件。
这个文件最多包含5个部分(详细说明,参考英文手册 page 27),包括CHARGE、HEATFO、GEOMETRY、CELL PARAMETER、ENERGY。例如关于原子电荷的:
CHARGE #Iden Weight Atom Lit chexane 0.1 1 -0.15 ENDCHARGE
表示geo文件里面叫做chexane的那个结构,第1个原子的电荷值(来自文献或DFT计算,其中Lit是“文献”的意思,不过这一行以#开头,只是注释,并不影响计算)为-0.15,优化时权重为0.1(权重之和不需要等于1,程序会自动归一化)。如果权重很大,那么在优化力场的过程中,将努力保证新力场能符合该要求。不需要五个部分全部设置,设置几个部分,就生效几个部分。
我们可以用脚本自动生成一个trainset.in文件,有必要的话,在它的基础上修改。在命令行执行:
adfreport geo -rxtrainset > trainset.in
即可生成trainset.in文件。其中adfreport是ADF软件内置命令。
本例生成的trainset.in文件:
CHARGE 1_reax 0.1 1 0.0 1_reax 0.1 2 0.0 1_reax 0.1 3 0.0 1_reax 0.1 4 0.0 3_reax 0.1 1 0.0 3_reax 0.1 2 0.0 3_reax 0.1 3 0.0 3_reax 0.1 4 0.0 2_reax 0.1 1 0.0 2_reax 0.1 2 0.0 2_reax 0.1 3 0.0 2_reax 0.1 4 0.0 2.5_reax 0.1 1 0.0 2.5_reax 0.1 2 0.0 2.5_reax 0.1 3 0.0 2.5_reax 0.1 4 0.0 4_reax 0.1 1 0.0 4_reax 0.1 2 0.0 4_reax 0.1 3 0.0 4_reax 0.1 4 0.0 5_reax 0.1 1 0.0 5_reax 0.1 2 0.0 5_reax 0.1 3 0.0 5_reax 0.1 4 0.0 6_reax 0.1 1 0.0 6_reax 0.1 2 0.0 6_reax 0.1 3 0.0 6_reax 0.1 4 0.0 ENDCHARGE GEOMETRY 1_reax 0.1 1 3 1.420281246655042 1_reax 0.1 2 4 1.420281246655042 3_reax 0.1 1 3 1.420281246655042 3_reax 0.1 2 4 1.420281246655042 2_reax 0.1 1 3 1.420281246655042 2_reax 0.1 2 4 1.420281246655042 2.5_reax 0.1 1 3 1.420281246655042 2.5_reax 0.1 2 4 1.420281246655042 4_reax 0.1 1 3 1.420281246655042 4_reax 0.1 2 4 1.420281246655042 5_reax 0.1 1 3 1.420281246655042 5_reax 0.1 2 4 1.420281246655042 6_reax 0.1 1 3 1.420281246655042 6_reax 0.1 2 4 1.420281246655042 ENDGEOMETRY
可以看到7个结构中,每个结构的4个原子,电荷都是0。
1_reax 0.1 1 0.0
表示结构名为1_reax的那个结构里面第1个原子的电荷为0,这一条要求的权重为0.1(当然后面的其他权重也都是0.1,不过对石墨烯而言,电荷为0是比较符合实际情况的,因此步需要修改)。
另外,GEOMETRY这一块,例如:
1_reax 0.1 1 3 1.420281246655042
表示1_reax这个结构第1、3原子之间键长为1.420281246655042埃,这实际上就是六元环的键长,这个我们并不关心,也不想去优化它,因此也可以要求优化力场的过程中,保持这一点不变。权重默认值也是0.1。
对本例而言,没有需要修改的地方。如果一定要修改,可以直接将DFT优化得到的层间距(也就是第1、2原子间距离)写入到这个文件里面:
1_reax 1.0 1 2 3.355
第一个结构1_reax就是DFT优化的最优结构。可以设置这个权重非常大,例如是其他条件的权重的10倍(即1.0)。但本例中,实际上并没有这样做。使用了默认的trainset.in文件。
Trainset.in文件格式,参考:https://www.scm.com/doc/ReaxFF/trainset_descrp.html
本例中,我们可以直接在CHO.ff的基础上修改,所以直接将其拷贝过来,改名为ffield即可。
ffield的格式、参数的具体含义,参考英文手册(page 16)。
我们这里可以只优化:
1 1 156.5953 100.0397 80.0000 -0.8157 -0.4591 1.0000 37.7369 0.4235 0.4527 -0.1000 9.2605 1.0000 -0.0750 6.8316 1.0000 0.0000
这部分的四个键能:156.5953 100.0397 80.0000 -0.8157 其中“1 1”表示这一部分参数,是关于第一个元素和第一个元素之间的键,也就是C-C键的。前四个键能分别表示:
其他C-C键参数可能也有影响,但这四个对我们本例影响是最主要的,因此作为范例,只优化了这4个参数。
因此我们直接执行:
cp ffield ffield_min cp ffield ffield_max
然后分别修改ffield_min和ffield_max里面,这四个参数的值,优化这四个参数的结果,将会在ffield_min和ffield_max设定的下限和上限之间。可以酌情分别在原值基础上减小、增大约30%。
执行命令:
adfreport ffield -ffield-bool > ffield_bool
因为只优化4个参数,所以只将ffield_bool文件中,四个参数对应位置的数字,从0改为1。
注意根据实际需求,灵活修改(参数的含义在本文前面已经进行了说明):
到这里为止,所有文件都齐全了,都放在当前目录里面。
在命令行运行:
chmod 700 mcff.run ./mcff.run
生成的summery.txt列出了蒙特卡洛的过程,比较重要的数据是能量误差(Current error这一列数据),当然误差越小越好。生成的ffield_best是优化得到的力场,修改成自己希望的名字,例如CHO_modified.ff即可。
使用该力场,在ReaxFF中优化,我们得到的层间距3.41埃,很接近DFT的结果3.355埃:
注意,这里我们没有优化二面角参数,也没有在trainset.in里面限定二面角,所以为了保证层间距,优化键能的同时,二面角的结果变差了,石墨烯变得不是平面的了。