力技でSCF計算

SCF計算がまともに収束しないので力技で網羅的に計算を行った。
計算対象は伏せておくが、使ったオプションと結果は以下のとおり。
論文発表前だし、何かあると面倒なのでここに挙げたデータはちょっといじってある。
2つ計算値がある場合は下のほうが最終的な計算値。上はアルゴリズム切り替え前の計算値。

オプション:
scf=(xqc, maxconv=1~7,vtl)
scf=(xqc, maxconv=1~7)
scf=(xqc,maxconv=1,novaracc)
scf=yqc
scf=ssd
scf=(xqc,maxconv=1,vtl,vshift=50 or 1000 or 10000)


結果:
# UM06/6-31+G** scf=(xqc,maxconv=1,vtl)
SCF Done: E(UM06) = -555.736771470 A.U. after 2 cycles
SCF Done: E(UM06) = -555.994301760 a.u. after 19 cycles
Job cpu time: 0 days 0 hours 11 minutes 10.9 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=2,vtl)
SCF Done: E(UM06) = -555.815032856 A.U. after 3 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 21 cycles
Job cpu time: 0 days 0 hours 7 minutes 59.8 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=3,vtl)
SCF Done: E(UM06) = -555.957790071 A.U. after 4 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 20 cycles
Job cpu time: 0 days 0 hours 7 minutes 48.2 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=4,vtl)
SCF Done: E(UM06) = -555.981373939 A.U. after 5 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 15 cycles
Job cpu time: 0 days 0 hours 7 minutes 14.7 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=5,vtl)
SCF Done: E(UM06) = -555.983189973 A.U. after 6 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 18 cycles
Job cpu time: 0 days 0 hours 8 minutes 18.0 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=6,vtl)
SCF Done: E(UM06) = -555.984044437 A.U. after 7 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 8 cycles
Job cpu time: 0 days 0 hours 7 minutes 13.7 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=7,vtl)
SCF Done: E(UM06) = -555.984835916 A.U. after 8 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 8 cycles
Job cpu time: 0 days 0 hours 6 minutes 8.0 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=1)
SCF Done: E(UM06) = -555.736771470 A.U. after 2 cycles
SCF Done: E(UM06) = -555.994301760 a.u. after 18 cycles
Job cpu time: 0 days 0 hours 7 minutes 33.3 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=2)
SCF Done: E(UM06) = -555.815032856 A.U. after 3 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 21 cycles
Job cpu time: 0 days 0 hours 7 minutes 54.9 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=3)
SCF Done: E(UM06) = -555.957790071 A.U. after 4 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 20 cycles
Job cpu time: 0 days 0 hours 8 minutes 4.7 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=4)
SCF Done: E(UM06) = -555.981373939 A.U. after 5 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 15 cycles
Job cpu time: 0 days 0 hours 7 minutes 48.0 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=5)
SCF Done: E(UM06) = -555.983189973 A.U. after 6 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 18 cycles
Job cpu time: 0 days 0 hours 7 minutes 49.5 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=6)
SCF Done: E(UM06) = -555.984044437 A.U. after 7 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 8 cycles
Job cpu time: 0 days 0 hours 6 minutes 21.0 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=7)
SCF Done: E(UM06) = -555.984835916 A.U. after 8 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 8 cycles
Job cpu time: 0 days 0 hours 6 minutes 28.1 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=1,novaracc)
SCF Done: E(UM06) = -555.736771470 A.U. after 2 cycles
SCF Done: E(UM06) = -555.994301760 a.u. after 18 cycles
Job cpu time: 0 days 0 hours 9 minutes 44.7 seconds.

# UM06/6-31+G** scf=(yqc)
SCF Done: E(UM06) = -555.991797197 a.u. after 7 cycles
SCF Done: E(UM06) = -555.992542926 A.U. after 14 cycles
Job cpu time: 0 days 0 hours 3 minutes 8.9 seconds.

# UM06/6-31+G** scf=ssd
SCF Done: E(UM06) = -555.992542926 a.u. after 37 cycles
Job cpu time: 0 days 0 hours 14 minutes 13.7 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=1,vtl,vshift=1000)
SCF Done: E(UM06) = -555.736771470 A.U. after 2 cycles
SCF Done: E(UM06) = -555.992542926 a.u. after 37 cycles
Job cpu time: 0 days 0 hours 9 minutes 2.5 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=1,vtl,vshift=10000)
SCF Done: E(UM06) = -555.736771470 A.U. after 2 cycles
SCF Done: E(UM06) = -555.992542927 a.u. after 381 cycles
Job cpu time: 0 days 1 hours 28 minutes 47.2 seconds.

# UM06/6-31+G** scf=(xqc,maxconv=1,vtl,vshift=50)
SCF Done: E(UM06) = -555.736771470 A.U. after 2 cycles
SCF Done: E(UM06) = -555.994301761 a.u. after 18 cycles
Job cpu time: 0 days 0 hours 11 minutes 28.8 seconds.



まず、最終的に得られた計算値がそれぞれの手法で異なっているのがわかる。これは極小値にハマって正確なSCF計算ができずに偽のエネルギー値を出しているからである。ここには載せてないがデフォルトのアルゴリズムだとSCF計算初期に現れた極小値に見事にハマってしまい、とんでもなく大きなエネルギーを出す。

scf=(xqc,maxconv=1,vtl)は今回の場合は信用できる手段のようだ(データを載せてないが、xqcの代わりにqc使っても高エネルギーで収束してしまう。)。というか、scf=(xqc,maxconv=1)以外の方法だと事実上このシステムは信頼できるエネルギーを計算できない。
エネルギーの信頼性は、構造を少し変化させつつポテンシャルエネルギー曲面全体をプロットすることで判断することができる。(間違った値が得られるとそこだけ曲線から外れる)

アルゴリズムのyqcには期待してたがあんまり有効でないようだ。
また、vshiftの値を大きくすると折角maxconv=1を使っていても間違った値が出る。
デフォルト(vshift=100)か、あるいは小さめに設定するといい。



(追記)
Stableキーワードも有効っぽい
www.hpc.co.jp
しかしながら、現在自分が扱っているシステムでは
The wavefunction is stable under the perturbations considered.
The wavefunction is already stable.
という結果が出ても偽の値が出てくる。