关于为什么Multiwfn算的出RESP电荷与Antechamber的有所差异
关于为什么Multiwfn算的出RESP电荷与Antechamber的有所差异
Regarding why the RESP charge calculated by Multiwfn is different from that of Antechamber
文/Sobereva@北京科音 2019-Sep-27
0 前言
RESP电荷的原理、细节以及计算在《RESP拟合静电势电荷的原理以及在Multiwfn中的计算》(http://sobereva.com/441)有详细说明,Multiwfn是计算RESP电荷最方便易用和灵活的程序。有Multiwfn用户发现,Multiwfn算出的某些分子的RESP电荷与antechamber的不同,在此文我说一下原因。使用Multiwfn算RESP电荷的用户不是很有必要看此文,Multiwfn给的结果肯定是合理的。但如果想了解一些细节的话也可以看看。
简单来说导致差异的原因主要有两点:
(1)拟合点的分布不同
(2)等价约束设置不同
下文涉及的体系的相关文件可以在这里下:http://sobereva.com/attach/516/file.rar。本文用的是2019-Sep-26更新的Multiwfn 3.7(dev)版。
1 拟合点的分布不同带来的差异
Multiwfn在计算RESP电荷的时候,对于3.6、3.7版默认用的是MK方式设置拟合点(以后版本有可能会改变,届时看Multiwfn的RESP模块界面上的选项提示便知默认的是什么),拟合点位置由Multiwfn自己的代码设置,静电势由Multiwfn自己的代码计算或者调用cubegen计算。Antechamber计算RESP电荷时是从Gaussian的pop=MK IOp(6/33=2) IOp(6/42=6)输出文件里直接读取MK拟合点的坐标和静电势。虽然MK原文虽然定义了拟合点的分布规则,即每个原子上在不同原子半径倍数上有几层拟合点,但在具体确定拟合点坐标上,不同程序的细节不同,比如在球面上的拟合点以什么算法生成排布?拟合点的密度是多少?在原子接缝的地方是否自动去除过密的拟合点?等等。由于Multiwfn设置的拟合点的位置和Gaussian在这方面有一些不同,导致Multiwfn和Antechamber算的RESP电荷会有些许差别,但这个因素造成的差异通常不大,也没法说哪个程序更对,因为都是合理的。注:前述IOp(6/33=2)是让Gaussian把拟合点的位置和静电势数值打印到输出文件里的选项,而IOp(6/42=6)用来将拟合点的密度设为高于默认值。在Multiwfn的RESP电荷计算界面里也可以直接设拟合点的密度。
下面我们拿乙醇这个体系来对比一下。这里笔者直接用gview画了一个乙醇,保存成了.mol2文件。然后用antechamber产生了对应的gjf文件,里面的关键词是#HF/6-31G* SCF=tight Test Pop=MK iop(6/33=2) iop(6/42=6),原本带着的opt我给删了,对于本文的讨论没意义。然后用Gaussian 09 E.01进行计算,得到的chk文件我转成了fch文件。
用Multiwfn载入fch文件,进入RESP计算界面,直接选标准两步式RESP电荷计算,结果如下
Center Charge
1(C ) -0.250749
2(H ) 0.064449
3(H ) 0.064449
4(H ) 0.064449
5(C ) 0.547451
6(H ) -0.091298
7(H ) -0.091298
8(O ) -0.714589
9(H ) 0.407135
在计算第二步的时候提示用了以下等价性约束
Constraint 1: 2(H ) 3(H ) 4(H )
Constraint 2: 6(H ) 7(H )
再用antechamber计算RESP电荷,会出现一批文件,其中有两个RESP计算模块输出的文件ANTECHAMBER_RESP1.OUT和ANTECHAMBER_RESP2.OUT。第一个就是第一步拟合的输出,第二个就是第二步拟合的输出,最终结果看第二个里面的下面的部分
Point Charges Before & After Optimization
no. At.no. q(init) q(opt) ivary d(rstr)/dq
1 6 -0.229693 -0.229799 0 0.003990
2 1 0.077688 0.059374 0 0.000000
3 1 0.077682 0.059374 2 0.000000
4 1 0.034340 0.059374 2 0.000000
5 6 0.464072 0.533889 0 0.001841
6 1 -0.057092 -0.086155 0 0.000000
7 1 -0.057098 -0.086155 6 0.000000
8 8 -0.720426 -0.720426 -99 0.001375
9 1 0.410526 0.410526 -99 0.000000
q(init)是第一步拟合之后产生的电荷,q(opt)是经过第二步拟合最终得到的RESP电荷。ivary是等价性约束关系,比如no.为3和4的原子的ivary是2,就代表2、3、4在拟合过程中保持等价,这和前面看到的Multiwfn自动用的约束完全一样。8和9号原子的ivary为-99,代表它们在第二步拟合过程中电荷被约束为保持不变。
Antechamber这里产生的RESP电荷和前面给的Multiwfn算出来的有轻微差异,但顶多也就差0.01几。如果我们想让Multiwfn算出的电荷与Antechamber的精确一样,那就在选择开始计算RESP电荷之前先选一下选项8,然后再选1开始标准两步式拟合,按屏幕提示的要求把Gaussian输出文件路径输进去,这时Multiwfn就和Antechamber一样从Gaussian输出文件里读取拟合点的位置和静电势了,输出信息如下,和Antechamber给出的完全相同(个别原子仍有10的负六次方的差异是收敛限设置、舍入误差等数值细节导致的,完全可忽略不计)
Center Charge
1(C ) -0.229798
2(H ) 0.059373
3(H ) 0.059373
4(H ) 0.059373
5(C ) 0.533887
6(H ) -0.086155
7(H ) -0.086155
8(O ) -0.720426
9(H ) 0.410526
2 等价约束设置不同带的差异
下面我们看苯甲醛这个例子。哪怕Multiwfn也直接从Gaussian输出文件里读取拟合点的信息,结果与Antechamber给出的仍有轻微差异,这是由于两个程序用的等价性约束设置不同所带来的。
我们先用Multiwfn基于Gaussian里的拟合点信息计算RESP电荷。启动Multiwfn,载入本文文件包里的C6H5CHO.fchk,进入RESP模块,先选择8,再选择1,再输入C6H5CHO.out的路径,得到的结果如下
Center Charge
1(C ) -0.115868
2(C ) -0.111841
3(C ) -0.114944
4(C ) -0.146385
5(H ) 0.137991
6(H ) 0.134593
7(H ) 0.153718
8(H ) 0.139930
9(C ) 0.391423
10(H ) 0.059972
11(C ) -0.223448
12(H ) 0.155781
13(C ) 0.034578
14(O ) -0.495500
Sum of charges: 0.000000
RMSE: 0.001373 RRMSE: 0.079595
从屏幕上的提示可见,这个体系的RESP电荷计算过程只做了第一步,因为按照RESP电荷定义的规则,这个体系本身不需要做第二步。在第一步计算的时候没有自动做任何等价性约束。
也用antechamber进行计算,从给出的ANTECHAMBER_RESP2.OUT中可以看到所有原子的ivary都为-99,即第二步相当于什么也没做,因此最终得到的RESP电荷来自于第一步。然后看ANTECHAMBER_RESP1.OUT,输出信息为
no. At.no. q(init) q(opt) ivary d(rstr)/dq
1 6 0.000000 -0.101223 0 0.003514
2 6 0.000000 -0.148518 0 0.002793
3 6 0.000000 -0.139285 0 0.002916
4 6 0.000000 -0.148518 2 0.002793
5 1 0.000000 0.136078 0 0.000000
6 1 0.000000 0.140390 0 0.000000
7 1 0.000000 0.147385 0 0.000000
8 1 0.000000 0.140390 6 0.000000
9 6 0.000000 0.404823 0 0.001199
10 1 0.000000 0.028701 0 0.000000
11 6 0.000000 -0.139285 3 0.002916
12 1 0.000000 0.147385 7 0.000000
13 6 0.000000 0.001412 0 0.004999
14 8 0.000000 -0.469734 0 0.001041
可见结果与Multiwfn产生的略有差异,特别是第11号原子。从ivary可见,第一步拟合的时候约束了4=2、8=6、11=3、12=7。此体系结构如下
可见antechamber自动把苯环上左右对称的原子电荷约束为了相同,而Multiwfn默认情况下没有做这个约束,因此俩程序结果不同。
如果想让Multiwfn也实现同样的约束,自己写个约束设置文件即可。写个文本文件比如叫eqs.txt,内容为
4,2
8,6
11,3
12,7
在Multiwfn计算RESP电荷前,选择设置等价性约束的选项,再选读取约束文件,输入eqs.txt的路径,然后选择2开始一步式RESP电荷拟合,此时自定义的约束会被利用上,结果为
Center Charge
1(C ) -0.101222
2(C ) -0.148519
3(C ) -0.139284
4(C ) -0.148519
5(H ) 0.136078
6(H ) 0.140390
7(H ) 0.147385
8(H ) 0.140390
9(C ) 0.404824
10(H ) 0.028701
11(C ) -0.139284
12(H ) 0.147385
13(C ) 0.001411
14(O ) -0.469734
Sum of charges: 0.000000
RMSE: 0.002020 RRMSE: 0.117100
可见此时结果和Antechamber给出的精确相同了。
对苯环上对称的原子设置等价性约束并不是RESP电荷原文里提出的标准做法,纯粹是Amber的开发者自己定义的规则。这个规则有一点道理,但带来的坏处是会使得静电势重现性误差增加。如上述信息所示,不做这个约束时RMSE是0.001373,做约束后就增加到了0.002020。对于Multiwfn用户,这种约束想施加就施加,不想施加就不施加。如果懒得手动一条一条写这种等价性约束设置,在Multiwfn中可以直接利用结构的对称性自动产生等价性约束设置文件,看《RESP拟合静电势电荷的原理以及在Multiwfn中的计算》(http://sobereva.com/441)第3.5节的例子。