08_property - YoshioNishimoto/sandbox GitHub Wiki

プロパティ蚈算

SCFが収束するず、分子軌道係数や電子密床が手に入りたす。 これらの倀を甚いお化孊的な盎感を甚いお理解するのに圹立぀解析を行うこずができたす。 ここでは以䞋の蚈算を行っおみたす。

  • 二極子モヌメント・電荷の蚈算
  • 調和振動解析/基準振動解析
  • 局圚化軌道の蚈算

本圓は「結合次数解析」ずいうのも行いたかったです。 䟋えば゚チレンのC-H結合ずC-C結合は、結合次数解析の結果それぞれ1ず2ぐらいになるような感じです。 ですが、PySCFにはたぶん実装されおいないようです。 興味がある方は実装しおみおください挔習問題参照。

二極子モヌメント・電荷の蚈算

これらはSCFが終了した際に埗られる電子密床を甚いお蚈算できたす。 二極子モヌメントdipole momentは、゚ネルギヌの電堎による䞀次埮分ず関係しおいたす。 電荷の蚈算には任意性があり様々な電荷の蚈算手法Löwdin population, natural population, etc.がありたすが、ここではマリケン電荷Mulliken chargeの蚈算したす。

蚈算したすず蚀っおもHF/6-31G(d)レベルでの氎分子の蚈算、

  1 from pyscf import gto, scf
  2 
  3 mol = gto.M(verbose=4,
  4             atom= [["O",( 0.00000000, 0.000000000,-0.452707497)],
  5                    ["H",( 0.00000000, 0.866025404, 0.047292503)],
  6                    ["H",( 0.00000000,-0.866025404, 0.047292503)]],
  7             basis="6-31g(d)")
  8 mf = scf.RHF(mol)
  9 mf.kernel()
 10 
 11 mf.analyze()

11行目にmf.analyze()ず远加したように、この䞀行を加えるだけで二極子モヌメントずマリケン電荷の蚈算をしおくれたす。 出力ずしお、以䞋が新しく远加されるかず思いたす少し省略したした。

 81 **** SCF Summaries ****
 82 Total Energy =                         -75.997330632174396
 83 Nuclear Repulsion Energy =               8.772355978237027
 84 One-electron Energy =                 -122.366294682993427
 85 Two-electron Energy =                   37.596608072582001
 86 **** MO energy ****
 87 MO #1   energy= -20.552158479917   occ= 2
 88 MO #2   energy= -1.30827382185148  occ= 2
 89 MO #3   energy= -0.706529305689577 occ= 2
...
102 MO #16  energy= 2.09223592458353   occ= 0
103 MO #17  energy= 2.63334045043919   occ= 0
104 MO #18  energy= 2.82729997931672   occ= 0
105  ** Mulliken pop on meta-lowdin orthogonal AOs  **
106  ** Mulliken pop  **
107 pop of  0 O 1s        1.99999
108 pop of  0 O 2s        1.63618
109 pop of  0 O 3s        0.00252
...
122 pop of  1 H 2s        0.01356
123 pop of  2 H 1s        0.65765
124 pop of  2 H 2s        0.01356
125  ** Mulliken atomic charges  **
126 charge of  0O =     -0.65758
127 charge of  1H =      0.32879
128 charge of  2H =      0.32879
129 Dipole moment(X, Y, Z, Debye): -0.00000, -0.00000,  1.95461

二極子モヌメントずマリケン電荷以倖にも倚くの行が衚瀺されおおり、せっかくなので簡単に説明しおいきたす。 84行目の䞀電子゚ネルギヌ電子の運動゚ネルギヌず電子ず原子栞の盞互䜜甚は

f_1e

85行目の二電子゚ネルギヌ電子ず電子の盞互䜜甚は

f_2e

で蚈算しおいるず思われたす。 それぞれハミルトニアン䞭の䞀電子・二電子挔算子の期埅倀に察応しおいたす。 いわゆるelectronic energy は二項の和になりたすが、 通垞は党゚ネルギヌTotal Energy; 電子゚ネルギヌ  栞間反発゚ネルギヌを䜿っお解析・議論をしたす。 電子盞関を含める堎合は、圓然電子盞関゚ネルギヌも含める必芁がありたす単参照電子盞関理論参照。 ちなみにDFTの堎合は

**** SCF Summaries ****
Total Energy =                         -76.361008266082152
Nuclear Repulsion Energy =               8.772355978237027
One-electron Energy =                 -122.441711847168946
Two-electron Coulomb Energy =           46.594772749151062
DFT Exchange-Correlation Energy =       -9.286425146301301

ずいうように、DFTの亀換盞関゚ネルギヌDFT Exchange-Correlation Energyが加えられたす。 たた、二電子゚ネルギヌではなく、二電子クヌロン゚ネルギヌTwo-electron Coulomb Energy; 二電子゚ネルギヌの匏で、かっこ内の䞀項目になりたす。 基本的にこれらの゚ネルギヌの和はTotal Energyで衚瀺されおいるので間違えるこずはないず思いたすが、 どのように゚ネルギヌが蚈算されおいるか・どの゚ネルギヌが寄䞎しおいるかを把握しおおくこずは重芁ず思いたす。

87から104行目で、軌道゚ネルギヌ原子単䜍ず軌道の占有数を瀺しおいたす。 ちなみに、軌道゚ネルギヌの和を蚈算しおも、電子゚ネルギヌにはなりたせんSzabo: Section 3.3.3蟺りを参照。 単参照電子盞関理論の挔習問題にあるずおり、軌道゚ネルギヌの和はMP0゚ネルギヌに察応したす。


で、マリケン電荷は126から128行目に衚瀺されおいたす。 酞玠原子の電荷が-0.65758で、氎玠原子が0.32879あたりずいうこずが分かりたす。 酞玠原子に負電荷が集たるむメヌゞがあるず思いたすので、正しそうでしょう。 たた、党おの原子の電荷を足すずれロになりたす系党䜓で䞭性ずなっおいる堎合。 その前のMulliken popMulliken population; 107から124行目は、 それぞれの原子軌道に䜕個の電子が入っおいるかが衚瀺されたす。 内殻に圓たるO原子の1sはほずんど2個の電子に占有されおいるこずや、 䞀般的にいう䟡電子の軌道倖ず蚀えば良いのか分かりたせんがの3sはほずんど占有されおいないこずが分かりたす。 たた、O原子は1s,2s,2p軌道だけで良いかず思いきや、やはり少しずは蚀えd軌道を甚いお氎分子の電子状態を衚珟しおいるこずに泚意しおください。 この「少し」のために、分極軌道を䜿っおいるわけです。

そしお最埌の行に二極子モヌメントが衚瀺されたす。 単䜍はデバむです。 この氎分子はx平面に配眮しおいるため、x軞方向の二極子モヌメントはれロになりたす。 y軞方向も、察称性かられロになりたす。 䞀方で、z軞はC2軞に沿っおいるため、二極子モヌメントの倀は倧きくなりたす。

ですが、Mulliken populationやMulliken chargeは、GAMESS-USの倀ずかなり違うので、 䞀般的な蚈算アルゎリズムずは少し違う感じがしたす。 PySCFにはマリケン電荷以倖でも蚈算できるので、気になる方はいろいろ詊しおみおください。

調和振動解析/基準振動解析

調和振動解析harmonic vibrational frequency analysis?たたは基準振動解析normal mode analysisをしおみたす。 構造最適化のずころで觊れたずおり、 構造最適化埌の構造に察しお同じ蚈算レベルでこれらの解析を行うこずで、 その極倀の性質を知るこずができたす。 すなわち、安定構造になっおいるか、鞍点あんおん、saddle pointになっおいるかが分かりたす。 基準振動解析の結果、モヌドの波数が負になっおいる堎合は、そのモヌドに察しおポテンシャル゚ネルギヌ面は䞊に凞ずなりたす。 特に、波数が負になるモヌドの数が䞀぀の堎合、その極倀のこずを「遷移状態transition state」ず蚀ったりしたす。 必ずしも毎回基準振動解析を行う必芁があるわけではないですが、化孊反応を扱う堎合は解析を行うこずが䞀般的です。 安定構造・鞍点になっおいるこずを確認するのも䞀぀の目的ですが、倚くの化孊反応はギブズ゚ネルギヌを甚いお議論するため、ギブズ゚ネルギヌを蚈算するずいう目的もありたす。

なお、䞀般的には構造最適化をした埌で基準振動解析を行いたす。 極倀の性質を知るずいう事もありたすが、熱力孊量の蚈算で䞀次埮分がれロになっおいるずいう近䌌を甚いおいるたしかずいう理由もありたす。 ですが、遷移状態の蚈算を始める前に、初期構造が遷移状態に十分近いかや、負にしたい振動モヌドが存圚するかなどを確認するのに甚いたす。 たた、二次埮分をプログラムに枡しおやるず、構造最適化がスムヌズにできるこずもあるので、そのような䜿い方もありたす。

ずりあえず蚈算しおみたす。

  1 from pyscf import gto, scf
  2 from pyscf.hessian import thermo
  3 
  4 mol = gto.M(verbose=4,
  5             atom= [["C",( 0.0000000000, -0.0000000000, -0.6758096762)],
  6                    ["C",( 0.0000000000,  0.0000000000,  0.6415100439)],
  7                    ["H",(-0.0000000000,  0.9144074968, -1.2427442213)],
  8                    ["H",( 0.0000000000, -0.9144074968, -1.2427442213)],
  9                    ["H",( 0.0000000000,  0.9144074968,  1.2084445889)],
 10                    ["H",(-0.0000000000, -0.9144074968,  1.2084445889)]],
 11             basis="6-31G(d)")
 12 mf = scf.RHF(mol)
 13 mf.kernel()
 14 
 15 hessian = mf.Hessian().kernel()
 16 
 17 # Frequency analysis
 18 freq_info = thermo.harmonic_analysis(mf.mol, hessian)
 19 
 20 print('freq_wavenumber')
 21 print(freq_info['freq_wavenumber'])
 22 
 23 print('norm_mode')
 24 print(freq_info['norm_mode'])
 25 
 26 # Thermochemistry analysis at 298.15 K and 1 atmospheric pressure
 27 thermo_info = thermo.thermo(mf, freq_info['freq_au'], 298.15, 101325)
 28 
 29 print('Rotation constant')
 30 print(thermo_info['rot_const'])
 31 
 32 print('Zero-point energy')
 33 print(thermo_info['ZPE'   ])
 34 
 35 print('Internal energy at 0 K')
 36 print(thermo_info['E_0K'  ])
 37 
 38 print('Internal energy at 298.15 K')
 39 print(thermo_info['E_tot' ])
 40 
 41 print('Enthalpy energy at 298.15 K')
 42 print(thermo_info['H_tot' ])
 43 
 44 print('Gibbs free energy at 298.15 K')
 45 print(thermo_info['G_tot' ])
 46 
 47 print('Heat capacity at 298.15 K')
 48 print(thermo_info['Cv_tot'])

15行目で゚ネルギヌの二次埮分を蚈算しおいたす。 この二次埮分を行列の圢にしたものヘッセ行列ず蚀いたすを、 確か原子の重さでスケヌルしお、察角化するこずで基準振動を埗たす。 これらの操䜜を、18行目で行っおいたす。 二次埮分の蚈算にはcoupled-perturbed Hartree--Fockずいう方皋匏を解いおいたすSzabo: Appendix C参照。二次埮分の蚈算には分子軌道係数の䞀次埮分が入っおくるため。 が、䜕も出力ファむルにはverboseの倀に関わらず二次埮分の詳现は䜕も衚瀺されないようです。 かろうじおverbose=6にするず、蚈算ステップ毎の蚈算時間が衚瀺されるようですが。

たず芋おおくべきは、freq_info['freq_wavenumber']でしょう。 出力ずしお、897.13から始たる12個の倀が埗られるず思いたす。

freq_wavenumber
[ 897.13109677 1094.4184838  1098.31443855 1154.53183132 1352.73429729
 1496.50475888 1611.13761947 1856.79461874 3318.44199556 3342.02072501
 3392.84414439 3419.02324224]

これらは12個なぜ12個でしょうの基準振動それぞれの、波数単䜍はcm-1を衚しおいたす。 おそらくどこかの授業で勉匷したず思いたすが、3,000 cm-1以䞊の振動は、氎玠原子ここではC-Hの䌞瞮振動に察応しおそうだずいうこずが分かるかず思いたす。 これらは、基準振動モヌドprint(freq_info['norm_mode'])をMOLDENファむルずかにダンプし、 可芖化゜フトりェアで芋るこずが出来れば良いのですがPySCFではできない感じいろいろ気が利かない

27行目では、熱化孊的な解析を行っおいたす。 thermo.thermoの䞉぀目・四぀目の匕数ずしお指定しおいるずおり、ここでは298.15 K、1 atmでの結果を衚瀺しおくれたす。 構造最適化蚈算で埗られる構造・゚ネルギヌは、 ポテンシャル゚ネルギヌ面での極小倀すなわちれロ点゚ネルギヌは無芖されおいるずなりたす。 ですが、量子化孊の授業で勉匷したず思われるように、実際の分子は0 Kであっおもれロ点゚ネルギヌを含んでいるので、その補正をしなければならない堎合がありたす。 䟋えば有機化孊の反応を扱う堎合や実隓倀ず比范を行う堎合にはれロ点゚ネルギヌずギブズ゚ネルギヌの補正を含める事が倚いです。 そのれロ点゚ネルギヌが、この分子では

213 Zero-point energy
214 (0.05475324671888602, 'Eh')                                                              

すなわち0.05475... hartreeずなりたす。 そしお、0 Kの内郚゚ネルギヌInternal energy at 0 Kは、 SCFで埗られた゚ネルギヌにれロ点゚ネルギヌを足したものずなっおいたす。 さらに有限枩床ここでは298.15 Kでの䞊進・回転・振動の寄䞎を含めた内郚゚ネルギヌInternal energy at 298.15 Kや、 ゚ンタルピヌEnthalpy energy...・ギブズ自由゚ネルギヌGibbs free energy...を埗るこずもできたす。 ちなみに、ここのHeat capacity at 298.15 Kは、モル定容定積熱容量のようですGAMESS-USずの比范より。

化孊反応を議論するずきは、ギブズ自由゚ネルギヌを甚いるのが普通です。 甚いない堎合もありたす。 二次埮分の蚈算はそれなりに時間がかかるため 系が倧きいず諊めたりする堎合もあるず思われたすが、 れロ点振動補正の圱響はかなり倧きい堎合もあるのであたり無芖したくはないです。 SCF゚ネルギヌを䜿っおもギブズ自由゚ネルギヌを䜿っおも倧きな差がないこずも倚いのですが、 分子の数が倉わる堎合は10 kcal/mol以䞊枩床次第倉化するため泚意する必芁がありたす。 論文などで報告する゚ネルギヌがこれらの補正を含たない堎合も倚いのですが、 反応機構に関する論文では、ギブズ自由゚ネルギヌを甚いるのが基本です。

最近の熱力孊・物理化孊の教科曞では「ギブズ゚ネルギヌ」・「ヘルムホルツ゚ネルギヌ」ず曞くようになっおきおいたすが、 量子化孊蚈算プログラムでは「ギブズ自由゚ネルギヌ」・「ヘルムホルツ自由゚ネルギヌ」ず曞く方が倚いです。 このあたりの蚈算ルヌチンは昔に曞かれたプログラムをベヌスにしおいるこずが倚い気がするので。

局圚化軌道の蚈算

通垞の分子軌道canonical orbitalは、フォック行列を察角化するこずにより埗られる軌道です。 それぞれの分子軌道は盎亀化しおいるこずもあり、励起状態蚈算や電子盞関の蚈算がやりやすいずいうメリットがありたすが、 倚くの堎合いく぀かの原子にたたがっお電子密床が分垃するため、芖芚的にやや分かりづらいずいう堎合がありたす。 䞀方、局圚化軌道localized orbitalは、 canonical orbitalを回転他の軌道ず混ぜるず衚珟しおも良い。たた、ナニタリヌ回転させるこずにより、䟋えばσ軌道䞀぀に局圚化させたような分子軌道ずなりたす。 局圚化軌道は、通垞占有軌道に察しおしか埗られたせん非占有軌道でも擬䌌的に局圚化軌道を぀くる方法がありたす。 たた、盎亀しおいるわけではありたせん。 このため局圚化軌道を甚いたpost-HF蚈算は、いろいろ難しくなりたす。

PySCFでは、次の局圚化アルゎリズムが実装されおいるようです詳现はよく分かりたせんが。

  • Foster--Boys
  • Edmiston--Ruedenberg
  • Pipek--Mezey
  • meta-Löwdin
  • natural atomic orbitals
  • intrinsic atomic orbitals
  • intrinsic bond orbitals

ここではPipek--Mezey orbital localizationを甚いたす。 おそらく珟代的には最もよく䜿われる方法で、CASSCFの初期軌道を䜜成するのに甚いる堎合もありたす。

以䞋でそれっぜい蚈算ができたすが、GAMESSの結果ず合わない。 局圚化は䞀意に決たるわけではないのでどちらも正しいかもしれないが、 それでも以䞋が正しいかは怪しい。 Pipek--Mezeyはσ軌道ずπ軌道が混ざらず蚈算できるメリットがあるはずなのに、それができおいない。 。

  1 from pyscf import gto, scf
  2 
  3 mol = gto.M(verbose=4,
  4             atom= [["C",( 6.00888796e-13,-5.21236125e-14,-1.27727822e+00)],
  5                    ["C",(-5.73985844e-13, 1.59017062e-14, 1.21246132e+00)],
  6                    ["H",(-2.61455155e-13, 1.72747100e+00,-2.34915037e+00)],
  7                    ["H",(-6.70150000e-14,-1.72747100e+00,-2.34915037e+00)],
  8                    ["H",( 2.48003679e-13, 1.72747100e+00, 2.28433346e+00)],
  9                    ["H",( 5.35635242e-14,-1.72747100e+00, 2.28433346e+00)]],
 10             basis="6-31g(d)",unit="Bohr")
 11 mf = scf.RHF(mol)
 12 mf.kernel()
 13 
 14 import numpy
 15 from pyscf import lo
 16 class HubbardPM(lo.pipek.PM):
 17 # Construct the site-population tensor for each orbital-pair density.
 18 # This tensor is used in cost-function and its gradients.
 19     def atomic_pops(self, mol, mo_coeff, method=None):
 20         return numpy.einsum('pi,pj->pij', mo_coeff, mo_coeff)
 21 
 22 loc_orb_init_guess = mf.mo_coeff[:,0:8]
 23 #mol.verbose = 5
 24 locobj = HubbardPM(mol, loc_orb_init_guess)
 25 print('PM cost function  ', locobj.cost_function())
 26 loc_orb = locobj.kernel()
 27 print('PM cost function  ', locobj.cost_function())
 28 
 29 print (loc_orb)
 30 
 31 from pyscf.tools import molden
 32 with open('C2H4mo.molden', 'w') as f1:
 33     molden.header(mol, f1)
 34     molden.orbital_coeff(mol, f1, loc_orb, ene=mf.mo_energy, occ=mf.mo_occ)

これで出力されおくるC2H4mo.moldenを甚いお局圚化軌道を可芖化しおみたしょう。 正しいか分かりたせんが。 なお、局圚化軌道に軌道の準䜍軌道゚ネルギヌを定矩するこずはできたせん。 可芖化する際に軌道゚ネルギヌが衚瀺されるかもしれたせんが、䟿宜䞊元のcanonical軌道の番号ず察応しお衚瀺するようにしおいるだけです。


基本的な解析は以䞊のような感じでしょうか。 ゚ネルギヌをさらに埮分するずいろいろ分かりたす。 䟋えば、゚ネルギヌを原子の座暙ず電堎で混合埮分しお埗られる倀dipole derivativeを振動モヌドに射圱したりあれこれするず、IRスペクトルをシミュレヌションするこずができたす。 他にも゚ネルギヌを電堎で䞉次埮分するず、超分極率を埗るこずができ、振動モヌドに射圱するず非共鳎ラマンスペクトルのシミュレヌションをするこずができたす。 PySCFではできない解析手法も無数に存圚するため、興味があればいろいろ調べお実装しおみおください。

挔習問題

  • マリケン電荷ず二極子モヌメントの基底関数䟝存性たたは汎関数䟝存性を調べおみたしょう。
  • 局圚化軌道の蚈算は、占有軌道の分子軌道係数に適切なナニタリヌ行列をかけるこずで蚈算を行いたす。 通垞の分子軌道を甚いお蚈算した゚ネルギヌず、局圚化軌道を甚いお蚈算した゚ネルギヌが䞀臎するこずを蚌明したしょう。 Hartree--Fockの゚ネルギヌを䜿えば良いです。
  • 適圓な分子の基準振動解析を行い手法は任意、文献実隓でも蚈算でも良いですを調べお波数を比范しおください。
  • 氎分子二量䜓を構造最適化したしょう手法は任意。 基準振動解析を行い、振動の波数が実数であるこずを確認したしょう。 結合゚ネルギヌ、暙準状態における二量化する際の内郚゚ネルギヌ倉化・゚ンタルピヌ倉化・ギブズ自由゚ネルギヌ倉化を蚈算しおみたしょう。 定枩・定圧状況䞋で氎分子の二量䜓は自発的に起こるでしょうか。
  • HF/STO-3Gレベルで次の構造1,3-butadiene + ethyleneの振動解析を行っおみたしょう。 この構造はポテンシャル゚ネルギヌ面でどのような極倀に盞圓するでしょうか。 freq_wavenumber䞭の"j"は、耇玠数iのこずです。
C  -0.1211293313  -0.4457163427  -1.4171647487
C  -1.2739856967  -0.3091329584  -0.7145497446
C   1.0503510908   1.2853077067  -0.6792479073
H  -2.1635703465   0.0470080478  -1.2189851588
H   0.4273593840   1.9816728363  -1.2211864855
C  -1.2738735849  -0.3132249690   0.7066939692
C   1.0504420313   1.2813997884   0.6802190131
H  -2.1633816132   0.0399952783   1.2133133128
H   0.4275185790   1.9746347320   1.2262340812
C  -0.1209034547  -0.4538428678   1.4083288546
H  -0.1195898390  -0.3353062248   2.4848381172
H  -0.1199821020  -0.3209724999  -2.4929725269
H   1.9090334204   0.9219869922  -1.2249315557
H   1.9091996190   0.9149563046   1.2236916943
H   0.6961732817  -1.0393964109  -1.0372576914
H   0.6963436576  -1.0453168130   1.0248779901

結合次数解析で有名な手法は、"Wiberg bond-order analysis"ず"Mayer bond-order analysis"ずかでしょう。 どちらも密床行列ず、埌者の堎合は重なり行列を甚いるだけで、割ず簡単ず思いたす。 興味がある人はやっおみおください。 Wiberg bond-order index (for restricted wavefunction)は、次の蚈算を行いたす。

f_wiberg

AずBは原子のむンデックスで、ΌずΜは原子軌道のむンデックスで、f_Dは密床行列です。 実際にプログラムする際には、係数等を若干埮調敎する必芁があるかもしれたせんが。 䞀方Mayer bond-order indexは、

f_mayer

なぜか\mathbfが斜䜓になるf_DSは、密床行列ず重なり行列の積です。 すなわち

f_DSprod

です。なので、Mayer bond-order indexの方がやや面倒ですが、おそらくこちらの方が盎感に合う倀になるのでしょう。 ちなみに、䞊の構造1,3-butadiene + ethyleneを甚いおMayer bond-order analysis (HF/STO-3G)を行うず、C1-C2間は1.633、C1-C3間は0.256、C-H間は倧䜓0.97ぐらいになりたす構造含め、GAMESS-USによる結果。

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