计算化学公社

标题: 用CASSCF优化激发态,应该用态平均吗? [打印本页]

作者
Author:
Freeman    时间: 2021-11-13 12:59
标题: 用CASSCF优化激发态,应该用态平均吗?
大家好!
我想用CASSCF优化一个分子的激发态。听说用CASSCF算激发态时应该用态平均,这样可以使得轨道同时适用于基态和激发态,比较“公平”。不过如果是优化激发态的几何结构呢?用态平均的话,岂不是去找那个令两个态的平均能量最低的结构了吗?那么这时还应不应该用态平均呢?请大家为我解惑。


作者
Author:
zjxitcc    时间: 2021-11-13 13:08
本帖最后由 zjxitcc 于 2021-11-13 13:10 编辑

不是非得需要态平均,但态平均确实可以说是最常见的做法。以S0/S1两态平均为例,一个单点计算会出现3种能量:(1)态平均能量,通常没啥意义;(2)态平均计算的轨道下算出的S0态能量;(3)态平均计算的轨道下算出的S1态能量。

你要优化S1态几何结构,需要指定感兴趣的电子态为S1态(即上述(3)),然后才能做结构优化。没有人会用上述(1)能量去做结构优化的,所以不会出现“找那个令两个态的平均能量最低的结构”。
作者
Author:
sobereva    时间: 2021-11-14 05:36
态平均是指CASSCF优化轨道的对象是被考虑的那些电子态的平均能量(及令平均能量尽可能低来优化轨道),而不是像其它情况仅针对一个态(通常是基态)的能量来优化轨道。

基于态平均方式优化的轨道做CASCI,照样对不同电子态会算出不同的能量(即态平均CASSCF得到的各个态的能量),或者态平均CASSCF下各个电子态照样有各自的势能面,因此和优化指定的激发态的几何结构并不矛盾。
作者
Author:
Freeman    时间: 2021-11-14 11:46
本帖最后由 Freeman 于 2021-11-14 12:02 编辑

谢谢大神们解答。我问这个问题的原因主要是用pyscf时发现似乎有多种几何优化casscf激发态的算法,用在我计算的体系的效果不一样。

第一是态指定的优化。这样一来cas就不收敛了,我就没有再用了。
第二是态平均的优化。代码如下(这是官网给的实例代码。我的实际情况是cas(2,2),而非这里说的cas(4,4)。)
  1. # 2. Geometry optimization over an averaged state.
  2. # Note the state-averaged gradients are optimized.
  3. #
  4. mc = mcscf.CASCI(mf, 4,4)
  5. mc.state_average_([0.25, 0.25, 0.25, 0.25])
  6. excited_grad = mc.nuc_grad_method().as_scanner()
  7. mol1 = excited_grad.optimizer().kernel()

  8. mc = mcscf.CASSCF(mf, 4,4)
  9. mc.state_average_([0.25, 0.25, 0.25, 0.25])
  10. excited_grad = mc.nuc_grad_method().as_scanner()
  11. mol1 = excited_grad.optimizer().kernel()
复制代码
这个的梯度计算非常快,没一会儿就算了好几个点。不过我观察它的输出文件,好像优化的目标是使得平均能量最低。输出文件我稍后放上来。
第三是另一个态平均的优化。代码如下
  1. # 4. Geometry optimization of the 3rd of 4 states
  2. #
  3. mc = mcscf.CASSCF(mf, 4,4)
  4. mc.state_average_([0.25, 0.25, 0.25, 0.25])
  5. excited_grad = mc.nuc_grad_method().as_scanner(state=2)
  6. mol1 = excited_grad.optimizer().kernel()
复制代码
这个可以肯定是在优化激发态的几何结构。不过我看它的输出文件,虽然cas部分算得很快,但梯度部分算得超级慢(还牵扯到什么拉格朗日乘子法,难道是限制性优化?看不懂。),差不多一个小时算出一个点。


第二个方法算得快,但优化目标可能不对;第三个方法优化目标对了,但是算得太慢。我就在想,自己是不是对第二个方法的优化目标有误解?有没有可能第二个方法的优化目标也确实是激发态优化呢?毕竟优化平均能量最低的结构没有任何意义,开发者为什么会开发没有意义的算法并作为实例放在官网上呢?如果是的话,那我干脆用第二个方法好了,毕竟它那么快。



作者
Author:
hebrewsnabla    时间: 2021-11-14 12:44
Freeman 发表于 2021-11-14 11:46
谢谢大神们解答。我问这个问题的原因主要是用pyscf时发现似乎有多种几何优化casscf激发态的算法,用在我计 ...

PySCF的state specific确实有些问题,不过你可以利用态平均来做态特定。比如说你要算第二个态,就把态平均权重设置成[0.0, 1.0, 0.0, 0.0],这样结果是和态特定等价的,但是收敛成功率更高。如果还不行可以再增加几个0.0,或者读取态平均单点的波函数。

我觉得第二种方法是在态平均势能面上优化的。至于第二/第三种为什么有速度差异,不是很清楚。我看到你在pyscf issue也提了问题,你应该也说一下这个速度差异的问题,在那里得到解答的可能性更大。
作者
Author:
pwzhou    时间: 2021-11-14 14:37
Freeman 发表于 2021-11-14 11:46
谢谢大神们解答。我问这个问题的原因主要是用pyscf时发现似乎有多种几何优化casscf激发态的算法,用在我计 ...

没用过pyscf,但是从输入文件来看,第二个应该不是在优化激发态,优化激发态需要指定优化哪个态,就像第三个里面的state=2。第二个看起来就是在优化一个平均态,这个实际中似乎没啥意义。
作者
Author:
ABQTrap    时间: 2023-9-6 10:47
hebrewsnabla 发表于 2021-11-14 12:44
PySCF的state specific确实有些问题,不过你可以利用态平均来做态特定。比如说你要算第二个态,就把态平 ...

老师,我想请教“利用态平均来做态特定。比如说你要算第二个态,就把态平均权重设置成[0.0, 1.0, 0.0, 0.0],这样结果是和态特定等价的,但是收敛成功率更高”。比如,我优化的是基态的结构,但是单独算基态往往很难优化成功,但是我用态平均(基态+4个激发态)来做基态的几何优化(设置成[1.0,0.0,0.0,0.0,0.0]),结构优化就成功了。请问为什么用态平均来做结构优化更容易成功呢?
作者
Author:
hebrewsnabla    时间: 2023-9-6 13:27
ABQTrap 发表于 2023-9-6 10:47
老师,我想请教“利用态平均来做态特定。比如说你要算第二个态,就把态平均权重设置成[0.0, 1.0, 0.0, 0. ...

多算几个态的话,在前几步找到正确基态的概率更高。

另外pyscf的态特定现在应该没有问题,只是同样需要指定多算几个root。




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3