详细内容

LAMMPS讲解34-ReaxFF力场之键结参数验证-对比DFT和ReaxFF

当你找到一个力场,要针对自己的体系进行验证,你就需要将自己的体系中的分子进行简化,使其在包含关键化学基团的同时越简单越好。验证的主要过程就是对比由DFT计算得到的能量和ReaxFF计算得到的能量,分子越简单能量对比越有效。为说明这里验证的方法的可行性(好像可行,后面会说明),本例复现一下论文中的结果。以下是论文Extension of the ReaxFF Combustion Force Field toward Syngas Combustion and Initial Oxidation Kinetics中的力场部分验证结果。

 image.png

image.png

 

    为了验证力场,首先要获得DFT的计算结果,也就是采用DFT方法对势能面性扫描。扫描采用高斯16软件进行刚性扫描。刚性扫描速度快,并且对于小分子来说柔性扫描和刚性扫描结果相差不大。下面通过上图中第六个图的结果说明高斯中如何进行刚性扫描。首先根据图中的分子在Avogadro软件中绘制出分子结构并保存为pdb文件。在绘制分子的时候尽量和图中的分子构象保持一致,如下图。

image.png 

利用GaussView将保存的pdb文件打开,并保存为gif格式。保存的流程是在打开的窗口中鼠标右击选择File->Save…,打开保存窗口。

image.png 

在打开的保存窗口中File name中设置文件名称,Files of type中选择Know files,取消Write Cartesians的勾选,然后点击保存。

image.png 

在刚才打开的pdb文件窗口中鼠标在原子上左击选择要扫描的二面角的四个原子。查看窗口左下角处构成该二面角的四个原子的编号。

image.png 

用文本编辑器将刚才保存的gif文件打开。将第二行改为b3lyp/6-31g(d) scan nosymm,其中b3lyp/6-31g(d)表示DFT计算要选择的基组,scan表示执行扫描任务,做刚性扫描的过程中,如果涉及到点群的改变,不加nosymm关键词的话有时会出问题,而且看到的扫描轨迹可能不连续。要扫描的二面角由编号为7 3 2 1四个原子组成,从文件中可以看出这个二面角的编号是D4。因此将下面D4行中的二面角角度改为-90.0 24 10.0-90.0表示扫描初始角度为-90°24表示扫描24个角度,10.0表示按10.0°进行角度递增。这里需要说明涉及到浮点数的一定要写为浮点数形式,比如角度要写为-90.010.0,而不能是-9010。修改完后保存文件。

image.png 

GaussView打开刚刚修改并保存的gif文件,右击窗口空白处,按下图进行选择,打开计算设置窗口(不要关闭gif窗口)。

image.png 

在打开的计算设置窗口中点击下方Quick Launch启动高斯开始计算。

image.png 

Quick Launch点击后会自动弹出高斯计算界面和另一个chk窗口。可以看到控制台在持续输出,由于是小分子,计算会比较快。计算完成后会弹出是否关闭高斯的对话框,点击是。稍等几秒钟,在chk窗口空白处鼠标右击,按下图进行选择打开保存临时文件窗口,在打开的窗口中设置保存的文件名称,点击保存。

image.png 

会输出四个新的文件分别是chkfchgiflog文件。将log文件用文本编辑器打开,拉到文件末尾可以看到扫描得到的每个角度对应的能量,包括初始角度本例中会得到25行数据。将数据拷贝到绘图软件中。得到的能量的单位是Hartree,需要转换为Kcal/mol以和lammps的计算结果进行对比。1 Hartree=625.7 Kcal/mol。在对比DFT结果和ReaxFF结果时都会采用相对能量,即将所有计算得到的能量减去能量的最小值。

image.png 

log文件中不仅会有扫描的最终结果,还会记录每一个角度对应的所有原子的坐标,通过提取这些坐标就可以得到每个角度对应的data文件,用以LAMMPS计算。提取log文件中的坐标并转换为一系列data文件的python脚本如下:

#设置log文件的路径

work_path = 'E:\\work\\ester_reax\\diester\\varify_new\\ref\\DO1C1O1O1\\'

input_file = open(work_path + '2.log','r')

#设置原子个数

natom = 8

line = input_file.readline()

no = 0

while line:

    tmp1 = line.split()

    if len(tmp1) == 2:

        if tmp1[0] == "Z-Matrix" and tmp1[1] == "orientation:":

            no += 1   

            line = input_file.readline()

            line = input_file.readline()

            line = input_file.readline()

            line = input_file.readline()

            output_file = open(work_path + 'data.'+str(no),'w')

            #LAMMPS的头部内容,可按需修改,这里只有CHO三种元素

            output_file.write("LAMMPS data file Created\n")

            output_file.write("\n")

            output_file.write(str(natom) + " atoms\n")

            output_file.write("\n")

            output_file.write("3 atom types\n")

            output_file.write("\n")

            output_file.write("-20 20.0 xlo xhi\n")

            output_file.write("-20 20.0 ylo yhi\n")

            output_file.write("-20 20.0 zlo zhi\n")

            output_file.write("\n")

            output_file.write("Masses\n")

            output_file.write("\n")

            output_file.write("1 12.011\n")

            output_file.write("2 1.008\n")

            output_file.write("3 15.999\n")

            output_file.write("\n")

            output_file.write("Atoms\n")

            output_file.write("\n")

            for i in range(natom):

                line = input_file.readline().split()

                atom_id = line[0]

                mol_id = "1"

                #根据原子序号分配data文件中的原子type编号,这里只有CHO三种元素

                if line[1] == "6":

                    atom_type = "1"

                elif line[1] == "1":

                    atom_type = "2"

                else:

                    atom_type = "3"

                atom_q = "0"

                x = line[3]

                y = line[4]

                z = line[5]

                tmp = atom_id + " " + mol_id + " " + atom_type + " " + atom_q + " " + x + " " + y + " " + z + "\n"

                output_file.write(tmp)

            output_file.close()

    line = input_file.readline()

利用得到的一系列data文件就可以计算ReaxFF下的能量,计算的in文件如下:

variable a loop 25

log log.$a

variable b index 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

16 17 18 19 20 21 22 23 24 25

units real

atom_style full

neighbor 2.0

bin

neigh_modify every

1 delay 0 check no

read_data data.$b

pair_style reaxff

NULL

pair_coeff * * ffield2016.reax.cho C H O

timestep 0.25

velocity all create 300.0 4928459 rot yes dist

gaussian

thermo 100

thermo_style custom step temp pe ke etotal

thermo_modify flush yes

fix 3 all qeq/reaxff 1 0.0 10.0 1e-6 reaxff

variable mye equal etotal

run 1000

print ${mye} append info.dat screen no

clear

next b

next a

jump system.in

在输出的info.dat文件中就是所有data文件对应的能量,将数据拷贝到绘图软件中,并将所有数据减去这些能量中的最小值,得到相对能量。由此便可对比DFTReaxFF的计算结果了。以上就是力场验证的所有过程。本例中对应文献中的六个图进行对比了DFTReaxFF的结果,如下图。从图中可以看出得到的对比图和文献中的差不多。但是还是有差别,特别是对于键来说,当键长小于平衡键长后这里计算的能量总是比文献中的较大,对于键角来说,当键角小于平衡键角后能量也比文献中的较大,对于二面角来说当二面角在零度左右也比文献中的大。但是对于ReaxFFDFT对比的可接受程度来说,这里的验证是合理的。因为得到的误差和文献中的基本一致。至于为什么LAMMPS计算的ReaxFF的能量会与文献中的有符合很好,也有不符合的,我也百思不得其解。知道原因的可以加我微信lmp_zhushou,我们一起讨论。

 

 

 

感谢鲍路瑶老师的分享,内容来自于鲍老师分享出来的资料

如有需要添加微信:lmp_zhushou  进入微信群,帮助他人,共建社区

获取完整版lammps讲义可以加微信lmp_zhushou或加入QQ994359511

 

 


最新评论
请先登录才能进行回复登录
技术支持: CLOUD | 管理登录
seo seo