02_sp_output - YoshioNishimoto/sandbox GitHub Wiki

䞀点蚈算出力ファむル

入力ファむルからの続きです。 次の入力ファむルでの蚈算が正しくできたこずを前提にしおいたす。

from pyscf import gto, scf 
mol = gto.M(atom='H 0 0 0; H 0 0 1.2', basis='ccpvdz')
mf = scf.RHF(mol)
mf.kernel()

converged SCF energy = -1.06111199785749が埗られおいるかず思いたす。 これが、いわゆる分子の「゚ネルギヌ」です。 党゚ネルギヌずも蚀いたす。 この党゚ネルギヌは栞間反発、電子-栞間盞互䜜甚、電子間反発、そしお電子の運動゚ネルギヌを含めた゚ネルギヌです。 単䜍は原子単䜍atomic unitたたはハヌトリヌhartreeです。 基本的にはこの゚ネルギヌ絶察゚ネルギヌ; absolute energyをグルヌプでのれミ、孊䌚、論文においおそのたた報告するこずは少ないです。 いく぀かの構造や状態の゚ネルギヌ差盞察゚ネルギヌ; relative energyを蚈算しお、さらに単䜍を倉換倚くの堎合、kcal/mol、kJ/mol、eVしおから報告するこずが倚いです。

ですが、この蚈算だず゚ネルギヌしか衚瀺しおくれないので、䜕をしおいるのかは䜕も分かりたせん。 もっずたくさんの情報を埗られるようにしたしょう。

from pyscf import gto, scf 
mol = gto.M(atom='H 0 0 0; H 0 0 1.2', basis='ccpvdz', verbose=4) # この行にverbose=4を远加
mf = scf.RHF(mol)
mf.kernel()

二行目に、ずりあえずverbose=4を远加しおみたした。 これでもう䞀床同じ蚈算をしおみたしょう。 するず、今回は66行ぐらいのアりトプットになるかず思いたす。

  1 #INFO: **** input file is /data/home/nisimoto/lib/pyscf/test/test/verbose4.py ****
  2 from pyscf import gto, scf, mp
  3 mol = gto.M(atom="H 0 0 0; H 0 0 1.2", basis="ccpvdz", verbose=4)
  4 mf = scf.RHF(mol)
  5 mf.kernel()
  6 #INFO: ******************** input file end ********************
  7 
  8 
  9 System: uname_result(system='Linux', node='yn1.fukui.kyoto-u.ac.jp', release='3.10.0-957.1.3.el7.x86_64', version='#1 SMP Thu Nov 29 14:49:43 UTC 2018',     machine='x86_64', processor='x86_64')  Threads 6
 10 Python 3.6.8 (default, Aug 10 2019, 06:54:07)
 11 [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
 12 numpy 1.12.1  scipy 0.18.1
 13 Date: Fri Apr 10 16:31:55 2020
 14 PySCF version 1.7.1
 15 PySCF path  /usr/local/lib64/python3.6/site-packages/pyscf
 16 
 17 [CONFIG] conf_file None
 18 [INPUT] verbose = 4
 19 [INPUT] num. atoms = 2
 20 [INPUT] num. electrons = 2
 21 [INPUT] charge = 0
 22 [INPUT] spin (= nelec alpha-beta = 2S) = 0
 23 [INPUT] symmetry False subgroup None
 24 [INPUT] Mole.unit = angstrom
 25 [INPUT]  1 H      0.000000000000   0.000000000000   0.000000000000 AA    0.000000000000   0.000000000000   0.000000000000 Bohr
 26 [INPUT]  2 H      0.000000000000   0.000000000000   1.200000000000 AA    0.000000000000   0.000000000000   2.267671349478 Bohr
 27 
 28 nuclear repulsion = 0.4409810091
 29 number of shells = 6
 30 number of NR pGTOs = 14
 31 number of NR cGTOs = 10
 32 basis = ccpvdz
 33 ecp = {}
 34 CPU time:         0.41
 35 
 36 
 37 ******** <class 'pyscf.scf.hf.RHF'> ********
 38 method = RHF
 39 initial guess = minao
 40 damping factor = 0
 41 level_shift factor = 0
 42 DIIS = <class 'pyscf.scf.diis.CDIIS'>
 43 diis_start_cycle = 1
 44 diis_space = 8
 45 SCF conv_tol = 1e-09
 46 SCF conv_tol_grad = None
 47 SCF max_cycles = 50
 48 direct_scf = True
 49 direct_scf_tol = 1e-13
 50 chkfile to save SCF result = /data/home/nisimoto/lib/pyscf/test/test/tmp9t4rz7tj
 51 max_memory 4000 MB (current use 45 MB)
 52 Set gradient conv threshold to 3.16228e-05
 53 init E= -0.723311777193342
 54   HOMO = -0.384475369076883  LUMO = 0.0412923973727384
 55 cycle= 1 E= -1.06041428904839  delta_E= -0.337  |g|= 0.0437  |ddm|= 0.657
 56   HOMO = -0.489119550273032  LUMO = 0.0965414834755516
 57 cycle= 2 E= -1.06109707888331  delta_E= -0.000683  |g|= 0.00632  |ddm|= 0.027
 58   HOMO = -0.485303877789622  LUMO = 0.100214479170792
 59 cycle= 3 E= -1.06111199673962  delta_E= -1.49e-05  |g|= 4.67e-05  |ddm|= 0.0048
 60   HOMO = -0.485252323944246  LUMO = 0.100245919708501
 61 cycle= 4 E= -1.06111199785719  delta_E= -1.12e-09  |g|= 7.28e-07  |ddm|= 7.37e-05
 62   HOMO = -0.485256027853135  LUMO = 0.100245669077032
 63 cycle= 5 E= -1.06111199785749  delta_E= -2.99e-13  |g|= 4.36e-12  |ddm|= 1.23e-06
 64   HOMO = -0.485256027850804  LUMO = 0.100245669075863
 65 Extra cycle  E= -1.06111199785749  delta_E=    0  |g|= 8.01e-13  |ddm|= 5.91e-12
 66 converged SCF energy = -1.06111199785749

デフォルト初期蚭定、あるいは特に䜕も蚭定しない堎合のverbose=0は出力が少なすぎるため、どんな蚈算を行ったのかが分からなくなっおしたうので、個人的にはやめた方が良いず思いたす。 この匕数は0最小から9最倧たで倉化させられたす。 自分にずっお郜合の良い倀を遞んでください。

やや曞く方は面倒ですが、出力の行を説明しおいきたいず思いたす。

1行目から6行目

これは説明の必芁もないでしょう。 入力ファむルの内容をリピヌトしおいたす。

9行目から15行目

これはシステムや甚いおいるPySCFの蚭定等を衚瀺しおいたす。 たぁ、この蟺りはどちらかず蚀えば開発者甚の情報で、ここで説明する必芁もないかず思いたす。

17行目から26行目

ここは、gto.Mを甚いお入力した分子の情報を分析し、出力しおくれおいたす。 25行目・26行目でH2を入力したこずが明らかではないでしょうか。 ちなみに、AAはオングストロヌムを意味しおいたす。 あずは、 verbose=4ずしたオプションが18行目に反映されおいるこずが確認できるかず思いたす。 そしお、原子の数19行目、電子の数20行目、電荷の数21行目、スピンの数22行目を内郚で蚈算しお衚瀺しおくれおいたす。 最初はこれらの情報が自分の意図しおいるものず合っおいるか、毎回確認する方が無難です原子の皮類も含む。 これらのセッティングが異なる堎合には、゚ネルギヌを比范するこずはできたせん。 このため、異なる組成の分子で゚ネルギヌを比范するこずも、基本的にはありたせん。 䟋えば、ethaneずethyleneは原子や電子の数が異なるため゚ネルギヌを比范するこずに意味はありたせんが、 cis-1,3-butadieneずtrans-1,3-butadieneは配座が異なるだけなので、゚ネルギヌの比范に意味があり、どちらが安定存圚確率が高いかを議論するこずができたす。

ちなみに、䟋えばOH-を蚈算したいずかだったら、

mol = gto.M(atom="O 0 0 0; H 0 0 1.2", basis="ccpvdz", verbose=4, charge=-1)

ず、露わにcharge=-1ず電荷の数を指定する必芁がありたす。 系の電子数が䞀぀増えたす。chargeを指定しない堎合は、charge=0が自動的に遞ばれたす。 䞀方OHラゞカル二重項; doubletだったら、

mol = gto.M(atom="O 0 0 0; H 0 0 1.2", basis="ccpvdz", verbose=4, spin=1)

ず、スピンの数α電子ずβ電子の差をspin=1ず入力したす。 ちなみに、この堎合はrestricted open-shellのHartree--Fockを蚈算するこずになりたすが、詳现は開殻系の蚈算や適宜教科曞を参照しおください。

OHラゞカルのように系の電子数が奇数になっおいる堎合の蚈算には特に泚意が必芁で、 スピンの数たで正しく入力しないず゚ラヌが出お蚈算ができたせん。 電子の数が奇数だず、軌道に電子を詰める際に二重項なのか四重項なのかが分からず、困っおしたうわけです。 同様に、電子の数が偶数の堎合でも䞀重項なのか䞉重項なのかが分かりたせんが、基本的にはどのプログラムでもデフォルトずしお䞀重項が遞ばれるようになっおいたす。 䞉重項の堎合には、spin=2ず指定する必芁があるのでしょう。

28行目

栞間反発nuclear repulsionの゚ネルギヌを出力しおいたす。 原子単䜍での゚ネルギヌです。 量子化孊蚈算ず蚀えど、この項は叀兞論での蚈算を行っおいたす原子栞を量子論で扱う方法も存圚する。

f1

ZAは原子Aの栞電荷、RABは原子AずBの距離です。 電卓で蚈算しおみたしょう。

29行目から33行目

ここでは基底関数に関する情報を瀺しおいたす。 基底関数の導入的な蚘述は、Szabo: Sec.3.6をご参照ください。 より詳しい情報はverbose=5にするず甚いた基底関数cc-pVDZに぀いおの情報を出力しおくれたす。

[INPUT] ---------------- BASIS SET ---------------- 
[INPUT] l, kappa, [nprim/nctr], expnt,             c_1 c_2 ... 
[INPUT] H
[INPUT] 0    0    [3    /1   ]  13.01             0.019685
                                1.962             0.137977
                                0.4446            0.478148
[INPUT] 0    0    [1    /1   ]  0.122                1
[INPUT] 1    0    [1    /1   ]  0.727                1

ずは蚀え、基底関数の勉匷をしないず理解しづらいです。 ここではs軌道が2぀、p軌道が1぀1セット、それぞれのH原子に乗っおいるず考えおください。 するず、殻の数number of shellsは合蚈で6぀になりたす。

30行目・31行目の"pGTOs"ず"cGTOs"は、それぞれ"primitive Gaussian-type orbitals"ず"contracted Gaussian-type orbitals"の意味ですNRはnon-relativistic?。 基底「関数」ずいうのは、ガりス関数ずいうわけです。 で、pGTOsずcGTOsの蚈算の仕方ですが、たずcGTOsから曞きたす。 この"cGTOs"の"c"は"contracted"に察応しおおり、これは軌道をガりス関数の線圢結合で衚すこずを意味しおいたす。 䞀぀前の段萜で、それぞれのH原子にはs軌道が2぀、p軌道が1぀がH原子に乗っおいるず曞きたした。 s軌道は方向䟝存性がないので、s軌道2぀は2぀の原子軌道に盞圓したす。 䞀方でp軌道はx、y、zの方向性を持぀ため、p軌道1぀1セットは、3぀の原子軌道に盞圓したす。 なので、䞀぀の原子には5぀の原子軌道が茉っおいるため、合蚈でcGTOsは10ずなりたす。

䞀方でpGTOsは、甚いおいるガりス関数の合蚈です。 䞊の衚より、䞀぀目のs軌道l = 0は3぀のガりス関数expnt = 13.01, 1.962, 0.446の線圢結合で衚珟しおおり、2぀めのs軌道は1぀のガりス関数expnt = 0.122を甚いおいたす。 s軌道のpGTOsは4です。 p軌道に関しおは、これも䞀぀のガりス関数を甚いおいたすが、やはりx、y、z方向があるため、p軌道のpGTOsは3です。 なので、䞀぀の原子には7぀のpGTOsが茉っおいるため、合蚈でpGTOsは14ずなりたす。

数え方はあたり重芁ではありたせんが、゚ネルギヌを比范する際は䞊のように原子の数や皮類、電子の数だけではなく、 基底関数の数cGTOsで数えるこずが倚いず思いたすが䞀臎しおいるこずも確認したしょう。 前回の挔習問題ではcc-pVDZ、cc-pVTZ、cc-pVQZの基底関数を甚いお「盞察゚ネルギヌ」を蚈算したしたが、基底関数の数が違う以䞊、倧しお意味のある蚈算ではないです。 単䜍の倉換の緎習です。

32行目は基底関数の名前を衚瀺しおいたす。 33行目は、ECP (effective core potential)です。 内殻電子を有効ポテンシャルで眮き換えた蚈算を行うずきに甚いられたす䟋えば重原子内殻電子は化孊反応にあたり寄䞎しないため。

38行目から52行目

具䜓的に行うHartree--Fock蚈算の詳现です。 党お説明できるわけではありたせん。 マニュアルに曞いおあるものもありたすので、ある皋床重芁そうな行・語句をご玹介したす。

method = RHF

restricted Hartree--Fock制限HFを行うずいう宣蚀です。 これは、α軌道ずβ軌道で同じ空間軌道を甚いるずいう意味です。 䞀方で、unrestricted非制限HFでは、別の空間軌道を甚いる蚈算で、スピンがある堎合に甚いられるこずが倚いです。 さらに、既出ですがrestricted open-shell HFずいう方法が存圚し、スピン汚染がないメリットがありたすが、SCFの収束埌述予定がしづらいずいわれおいたす。 Szabo: Sec.2.5.3をご参照ください。

initial guess

SCFself-consistent field; 自己無撞着むどうちゃく・自己無矛盟の初期掚枬・初期軌道のこずです。 SCF蚈算は、最小の゚ネルギヌを䞎えるような分子軌道を蚈算する手続きのこずですSzabo先生の教科曞で勉匷するこずになるず思いたす。 これは解析的に求めるこずができない䞀般解を数匏で導出するこずができないずいう意味ので、繰り返し蚈算を甚いお数倀的に方皋匏を解きたす。 このような繰り返し蚈算では、最小倀に近い解を甚いお蚈算を始めれば、より早く少ない繰り返し蚈算で解が芋぀けられるような気がするず思いたす。

最初のサむクルはどのような軌道を甚いれば良いかずいうず、それほど自明ではありたせん。 倚くのプログラムでは、拡匵ヒュッケル法で蚈算した軌道をSCFの初期軌道ずしお甚いるこずが倚いです。 ですが、もしも過去に行った蚈算結果が残っおおり、䌌たような分子軌道が埗られおいれば、その分子軌道を甚いお蚈算を始めるのが良いでしょう。 そこでinit_guessずいうオプションを䜿うず䟿利です。 䟋えばこんな感じ。

from pyscf import gto, scf, mp
mol = gto.M(atom="H 0 0 0; H 0 0 1.2", basis="ccpvdz", verbose=4)
mf = scf.RHF(mol)
mf.chkfile = "h2.chk" # この行で軌道などの情報をh2.chkに保存
mf.kernel()

mol = gto.M(atom="H 0 0 0; H 0 0 1.205", basis="ccpvdz", verbose=4)
mf = scf.RHF(mol)
mf.chkfile = "h2.chk" # この行で軌道などの情報をh2.chkから読み出せるようにする
mf.init_guess = "chkfile" # 初期軌道をチェックポむントファむルh2.chkから読み出すようにする
mf.kernel()

なんか゚ラヌメッセヌゞが出たしたが。 initial guessを甚いるず、143行目のdelta_Eが、甚いない堎合に比べお小さくなっおいるはずです。 他にもいろいろ方法がありたすので、PySCFのむンストヌルディレクトリからexamples/scf/14-restart.pyをご参考ください。

DIIS

direct inversion in the iterative subspaceのこずです。 SCFを収束させるのは思ったよりも難しく、単玔に繰り返し蚈算をするだけでは倧抵収束したせん。 そのため、DIISずいう方法を甚いおSCFの収束をしやすく速くしおいたす。

direct SCF

二電子積分の蚈算に関連しおいたす。 direct SCFは、SCFのサむクルごずに二電子積分を蚈算しおいたす。 direct SCFでない堎合は、最初に二電子積分を蚈算し、メモリ䞊やディスク䞊に保存し、SCF䞭では二電子積分を蚈算するこずなくFock行列を蚈算しおいきたす。 蚈算効率的には埌者が優れおいたすが、䞭皋床の分子でもメモリ・ディスクがたくさん必芁になる4乗に比䟋しお倧きくなりたすので、最近はdirect SCFが䞻流です。

メモリ

51行目のmax_memory 4000 MB (current use 45 MB)ずいう郚分です。 量子化孊蚈算は基底関数や掻性空間の数が倧きくなるず、メモリが倧量に必芁になる堎合がありたす。 ディスクに倧量に曞き蟌む手法やアルゎリズムもありたすが、ここでのメモリはRAM (= random access memory; 普通のノヌトパ゜コンだず16 GB以䞋のアレですのこずです。 倚くの量子化孊蚈算は線型代数の手法぀たり行列挔算を甚いたす。 行列は二次元のメモリが必芁になるため、基底関数瞊や暪の芁玠数が2倍になるず、その行列を保存するのに必芁なメモリは4倍になりたす。 テン゜ル䞉次元以䞊の行列(?)を扱う手法もあるので、そのような堎合にはメモリが足りなくなる恐れがありたす。

max_memoryの方は、PySCFが䜿うこずのできる最倧倀です。玄4 GBです。 これを超えるず、他のプログラムに圱響を及がす恐れがあるため、自動的に゚ラヌで匷制終了するこずになるず思いたす。 リミットを倉曎するこずはできる.pyscf_conf.pyで環境倉数を倉曎するらしい 参考のですが、この挔習ではこのリミットが問題になるこずはないず思いたす。 䞀方、current use 45 MBずいうのは、この蚈算で䜿うメモリが45 MBだず蚀っおいたす。 たかが2原子なので、ただただ䜙裕がありたすね。

53行目から65行目

これがSCF蚈算で、広矩のHartree--Fockの蚈算そのものです。 詳现はSzabo: Sec. 3.4.6に曞いおありたす。 前述の通り、Hartree--Fock蚈算は䟋えば二次方皋匏みたいに解析的な答えがあるわけではありたせんし、 耇雑な蚈算を䞀床行えば答えが埗られるわけでもありたせん。 Hartree--Fock方皋匏が非線圢な方皋匏であるため、繰り返し蚈算を通じお方皋匏を解きたす答えが埗られない堎合もありたす。

  • E: そのサむクルでの゚ネルギヌ
  • delta_E: 前のサむクルずの゚ネルギヌ差
  • |g|: 電子状態の募配ノルム
  • |ddm|: 分かりたせん。前のサむクルずの密床行列差
  • HOMO: HOMOの軌道゚ネルギヌ単䜍はおそらくeV: 27.21138 eV = 1 a.u.
  • LUMO: LUMOの軌道゚ネルギヌ

最終的に、delta_EがSCF conv_tol = 1e-09より小さくなるず、「SCFが収束した」ず衚珟し、゚ネルギヌが決たりたす。 収束しない堎合は、収束するたであの手この手を尜くすか、分子構造を芋盎すか、諊めお「SCFが収束したせんでした」ず報告したす。 Hartree--Fock法は䞀般的にHOMO--LUMOギャップが倧きくなる傟向があるため、SCFの収束は容易です。 Hartree--Fock法でSCFが収束しない堎合には、䜕かが臎呜的に間違っおいる可胜性が高いです。

66行目

ここたで蚈算しお、やっず゚ネルギヌを埗られたす。 この䞀行倍粟床の数字䞀぀を埗るために、Szabo先生の教科曞玄230ペヌゞ分英語版を勉匷しお、膚倧なプログラムを蚘述する必芁があるずいうわけですね。 その蟺りを党お省略しお、PySCFずいうプログラムを甚いお゚ネルギヌ蚈算をしたした。


以䞊がPySCFを甚いたHartree--Fockの出力ファむルの説明になりたす。 䜕か適圓な分子を䜜成し、蚈算しおみたしょう。

挔習問題

  • 栞間反発の゚ネルギヌを再珟6桁ぐらいする蚈算匏を考えおみたしょう。どのような単䜍倉換が必芁でしょうか。

  • 量子化孊の授業では、氎玠原子のシュレディンガヌ方皋匏を解くず、スレヌタヌ型関数で軌道を衚珟するず勉匷したず思いたす。 しかし、倚くの量子化孊蚈算プログラムではガりス型関数を甚いお軌道を衚珟したす。 スレヌタヌ型関数ず比范しお、ガりス型関数は距離が増えるに埓っお急激に枛少するずいう違いがあるにもかかわらず、 量子化孊蚈算にわざわざガりス型関数を甚いおいる理由は䜕でしょうか。

  • H2の距離を0.5から5.0 Angstromぐらいたで倉化0.05刻みさせお蚈算しおみたしょう。 さらに、蚈算しお埗た゚ネルギヌを、暪軞を距離、瞊軞を゚ネルギヌにしおプロットしおみたしょう。 ポテンシャル゚ネルギヌカヌブを描くこずができるようになりたす。 ただし、きちんずグラフが成立するために必芁な情報を曞くようにしおください。 ちなみに、RHF/cc-pVDZだず0.75 Angstromに極小点が芋぀かりたす構造最適化による倀は0.748 Angstrom。 実隓倀は0.74 AngstromのようですWikipedia。 距離を倉化させるのは手動ではなく、forルヌプを甚いるこずができるず良いず思いたす。

  • H2の0.748 Angstromでの結合゚ネルギヌを蚈算したしょう。 結合゚ネルギヌは、氎玠原子の゚ネルギヌの倍ずH2の゚ネルギヌの差ずしお蚈算するこずができたす。 ぀たり、2EH - EH2で蚈算するこずができたす。 このために、氎玠原子の゚ネルギヌを远加で蚈算する必芁がありたす電子の数に泚意。 Szabo先生のテキスト英語版の165ペヌゞによるず、実隓倀は4.75 eVだずか。

  • 氎玠原子間を100 Angstrom皋床に離したずきのH2の゚ネルギヌは、2぀の氎玠原子を別々に蚈算したずきの゚ネルギヌの和に䞀臎するでしょうか。

  • Koopmansの定理によりH2のむオン化゚ネルギヌを予枬しおください。Szabo先生のテキスト英語版の194ペヌゞによるず、実隓倀は0.584 a.u.だずか。

⚠ **GitHub.com Fallback** ⚠