Home
2610 words
13 minutes
【計算化学】自作pythonモジュールで遷移状態構造を求めてみる(SN2’反応)

最終更新:2025-07-26

概要#

本記事では、自作モジュール(MultiOptPy)で、SN2’反応の遷移状態構造を算出してみる。電子状態計算ソフトウェアにPySCFを使用する。 MultiOptPyは電子状態計算ソフトウェアを用いた分子構造最適化手法の勉強を目的として作成したpythonモジュールである。

MultiOptPyのレポジトリ:https://github.com/ss0832/MultiOptPy

SN2’反応について:

使用した自作モジュールMultiOptPyのバージョン#

1.9.12c

環境#

WSL2 (Ubuntu-22.04)

Source codeのダウンロード#

wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.9.12c.zip
unzip v1.9.12c.zip
cd MultiOptPy-1.9.12c

手順#

1. 初期構造の準備#

モデル反応系として、以下の構造を用意した。今回はファイルの名前をsn2_prime.xyzとした。 初期構造は以下のものを使用した。

20

C     -1.034153805025     -0.819106298347     -1.358292534711
H     -0.549556247694     -1.759130327391     -1.503329467562
H     -2.097789351706     -0.817910008265     -1.465474072901
C     -0.367868532027      0.282788371221     -1.081516726524
H     -0.890596976355      1.214988002806     -0.951932618198
C      1.105123947664      0.365691183391     -0.782186576461
C      1.610757980319      1.808397736695     -0.855009816397
H      1.073931342933      2.396462899424     -0.115939250982
H      2.669368916131      1.857140229787     -0.634295724639
H      1.434022974686      2.231884054841     -1.835446970204
C      1.428530232134     -0.263800564363      0.575863918330
H      0.974530624905      0.355343469092      1.343958068555
H      0.981660376196     -1.244342938268      0.659569679888
H      2.498483822937     -0.309550940727      0.742957636429
Br     2.186648670469     -0.665953061246     -2.181011259333
S     -1.754995683434     -2.402406677662      1.069230209817
C     -2.244464729858     -0.797056758040      1.960915853065
H     -1.800558708109      0.058547702138      1.461138577918
H     -3.322925206134     -0.676983103716      1.961306257599
H     -1.900149648030     -0.815002971371      2.989494816311
初期パスを求めるための初期構造

2. 遷移状態構造最適化のための初期構造の算出#

※あらかじめpythonで利用できる電子状態計算ソフトウェアのPySCF(導入方法はpipを使えば可能である。)が使える環境を用意しておく。

a. 初期構造をカレントディレクトリにsn2_prime.xyzとして保存し、以下を実行する。#

python optmain.py sn2_prime.xyz -pyscf -spin 0 -elec -1 -func hf -bs 3-21g -opt rsirfo_fsb -ma 200 1 16 -modelhess
  • -opt rsirfo_fsbは準ニュートン法であるRS-I-RFO法を構造最適化に使用することを示す。初期のへシアンに関しては、特にオプションで指定しない限り、単位行列が使われる。
  • -pyscfは使用する電子状態計算ソフトウェアをPySCFにすることを示す。
  • -spinはスピン多重度の指定である。PySCFを使用するときは目的とするスピン多重度に1を引いた値を指定する。
  • -elec Mは形式電荷をMとすることを示す。
  • -ma yyy a bはyyykJ/molの活性化障壁を超えうるペア同士を近づける力を原子のラベル番号aとbのペアに構造最適化時に加えることを示す。
  • -func hfはHartree-Fock法を用いることを示す。
  • -bs 3-21gは基底関数にPople系である3-21Gを用いることを示す。
  • -modelhess-optでニュートン法ファミリーのoptimzierを使用した際に、電子状態計算でへシアンを算出する場合よりも大幅に低い計算コストで、精度の粗い初期へシアンを計算することを指定するオプションである。

これを実行すると、計算レベルHF/3-21Gで指定した人工力ポテンシャルをかけた上で初期構造を構造最適化することができる。

結果はyyyy_mm_dd(今日の年月日)ディレクトリの中に存在するディレクトリを開いて確認できる。

正常終了していれば、このディレクトリ中に、sn2_prime_traj.xyzが存在するので、これをコピーして、MultiOptPy-1.9.12cディレクトリに置く。

sn2_prime_traj.xyzは構造最適化の過程をAvogadro(公式ページ:https://avogadro.cc/ )等で可視化して確認できるようにしている。このsn2_prime_traj.xyzは次のNEB計算に使用する。

sn2_prime_traj.xyzをアニメーションとして表示したい場合は、[https://github.com/ss0832/molecule_movie] を使うと良い。

(この人工力ポテンシャルを加えて行った構造最適化の結果はsn2_prime_optimized.xyzで確認できる。構造を可視化して、生成系になっているか確認する。反応系のままであれば、-maの設定を見直してb.をやり直す。今回の場合以下の構造が得られた。生成系の安定構造に近いものが得られていると判断できるため、次のNEB計算を行うことが可能である。)

20
OptimizedStructure
C     -1.184647603874     -1.292416418637     -0.335797410790
H     -0.511187259883     -2.094475546061     -0.597979935430
H     -2.043092012057     -1.367530632795     -0.990442047179
C     -0.529969196526      0.052794762749     -0.513207991970
H     -1.193663583279      0.842309476903     -0.819926129261
C      0.755538534088      0.330019010580     -0.364563653620
C      1.301868828916      1.719189449652     -0.621183347992
H      1.726257779494      2.124217861268      0.294697822870
H      2.104056201499      1.656096247749     -1.351577215786
H      0.530302681811      2.394551078897     -0.974299528342
C      1.823440748790     -0.661302472107      0.039508749902
H      2.252757881287     -0.357287956686      0.991209346049
H      1.446574774268     -1.668860736613      0.150187707919
H      2.619571970151     -0.638550144419     -0.700233799622
Br     4.366117488957      0.514292098120     -2.653143255427
S     -1.721771898922     -1.673276287719      1.340384231889
C     -2.788542747871     -0.171387413643      1.716124649923
H     -2.174323708482      0.713595831365      1.679355708533
H     -3.595322912450     -0.107927930687      1.000814688410
H     -3.183965965919     -0.314050277919      2.710071409923
初期パスを求めるための構造最適化の結果(安定構造ではない)

b. sn2_prime_traj.xyzを初期パスとして、NEB法で経路の緩和を行う。#

NEB法を用いることで、先ほど得られたsn2_prime_traj.xyz全体のエネルギーを下げることができる。これにより、パスのエネルギー極大値を持つ構造を遷移状態構造に近づける。(この時点ではまだ正確な遷移状態構造は求められていない。)

python nebmain.py sn2_prime_traj.xyz -ns 10 -modelhess -nd 0.1 -func hf -bs 3-21g -pyscf -elec -1 -spin 0 -spng
  • -nd Nはノード間の距離をN Åとして初期パスを作成することを示す。
  • -ns nはn回分NEB法による経路の緩和を行うことを示す。
  • -modelhessは少ない計算コストで算出された近似へシアンを用いることを示す。これを指定すると経路緩和のアルゴリズムが-fcを1以上に指定した場合と同様のものになる。
  • -pyscfは使用する電子状態計算ソフトウェアをPySCFにすることを示す。
  • -spngは緩和中のパスのエネルギープロファイルや各ノードの勾配のRMS値をmatplotlibで可視化するオプションである。
  • -spinはスピン多重度の指定である。PySCFを使用するときは目的とするスピン多重度に1を引いた値を指定する。

c. 初期構造の決定及び遷移状態構造の計算#

MultiOptPy-1.9.12cと同じディレクトリ内に、NEBという名前を含むディレクトリが生成されている。 そのディレクトリ内のenergy_plot.csvを確認し、緩和後のパスのエネルギー極大値を示す構造を確認する。

パスの緩和後の各ノードのエネルギー一覧(単位) (energy_plot.csvに保存されている。)

NEB計算の結果の可視化
NEB計算の結果の可視化

bias_force_rms.csvにて、各Iterationごとのすべてのノードの勾配のRMS値を確認できる。

私が実行した環境では、11番のノード(グラフでは12番)がエネルギー極大値を示していた。

※こちら[https://ss0832.github.io/molecule_viewer/] を使うことでも可視化は可能である。

sn2_prime_traj_11.xyz

20
-1 0
C      -1.132291968884     -0.986003868910     -1.006729016666
H      -0.564314741580     -1.782572658764     -1.468743054224
H      -2.099750648974     -0.888972922552     -1.479246231829
C      -0.414128755429      0.260837212735     -0.914174137373
H      -0.956321678921      1.187292505213     -1.041266015106
C       0.980671655371      0.378705855242     -0.672768568396
C       1.524508309610      1.801197320973     -0.806435127012
H       1.037424523770      2.420191692674     -0.059123568041
H       2.596073916002      1.831537929803     -0.644698393710
H       1.312205845942      2.197650621920     -1.789692242792
C       1.492407453631     -0.298409267288      0.606786724627
H       1.081949513481      0.290693855132      1.430405666023
H       1.087020843803     -1.291471780312      0.697459061063
H       2.570331234295     -0.314670955832      0.689740528734
Br      2.255691704219     -0.746764186366     -2.280129892442
S      -1.653912449957     -2.083705551334      0.729283453723
C      -2.210610254555     -0.691634251294      1.849610781617
H      -1.796950004755      0.219434651223      1.437705584564
H      -3.289111466305     -0.643679485672      1.880096979546
H      -1.820893030764     -0.859656716593      2.841917467693
NEB法により緩和したパスのエネルギー極大値を示す構造

構造が壊れていないので、これを遷移状態を求めるための初期構造とする。

sn2_prime_traj_11.xyzMultiOptPy-1.9.12cと同じディレクトリ内にコピーする。

そして、以下を実行する。

python optmain.py sn2_prime_traj_11.xyz -opt rsirfo_bofill -fc 5 -order 1 -func hf -bs 3-21g -pyscf -elec -1 -spin 0 -tcc -freq
  • -opt rsirfo_bofillは遷移状態構造の最適化向けのoptimizerを指定することを意味する。準ニュートン法であるRS-I-RFO法を使用する。今回は-fcで正確なへシアンを計算するようにしているので、初期へシアンは正確なへシアンを使用するようになっている。
  • -order 1は一次の鞍点を求めることを指定する。(デフォルトだと極小値を求めるようになっている。)
  • -fc 5は5回の反復回数当たり1回正確なへシアンを計算することを指定する。
  • -freqは収束条件を満たした後に基準振動解析を行うことを示す。(自前で実装しているため、あくまで目安として使用することを推奨する。各振動モードをvibration_animation内のxyzファイルで可視化できる。)
  • -tccは収束条件を厳しくすることを示す。(Gaussianのtightと同等)

実行して得られた正確な遷移状態構造を以下に示す。

(実行して得られた正確な遷移状態構造はsn2_prime_traj_11_optimized.xyzとして保存されている。)

20
OptimizedStructure
C     -0.925862333944     -1.283562502347     -1.085359983041
H     -0.326952765021     -2.144843228378     -0.891699855544
H     -1.871594812526     -1.475114701461     -1.542437383030
C     -0.389100738597     -0.027950774959     -1.124286166482
H     -0.978245010692      0.775511752724     -1.523567290882
C      0.897103652634      0.296823904517     -0.643486171989
C      1.144071883862      1.754933187876     -0.299130337961
H      0.623130242148      1.961864541857      0.633655413434
H      2.196507302061      1.953901985303     -0.174818397909
H      0.752895702590      2.402683156937     -1.070227863962
C      1.619895697142     -0.697626312966      0.242918641384
H      1.019492497876     -0.841472965601      1.137485208589
H      1.731406876380     -1.652145552272     -0.246149733469
H      2.602201250786     -0.331527087835      0.502005760064
Br     2.488470508543      0.236918084885     -2.556992653268
S     -2.061970071773     -1.820014217272      1.170828143704
C     -2.125636298583     -0.037130047436      1.783746034582
H     -1.537356933175      0.578274197108      1.110941908201
H     -3.146467763533      0.322306576735      1.794713606666
H     -1.711988886180      0.028170002585      2.781861120912
遷移状態構造

75回程度の反復計算で遷移状態構造が得られた。-freqオプションにより生成されたnormal_modes.txtvibration_animationディレクトリ内の振動モードのアニメーションを確認した。

以下に-freqオプションで生成されたnormal_modes.txtの一部を示す。

Mode                                 0                   1                   2
Freq [cm^-1]                     -309.2250             42.4446             61.9035
Reduced mass [au]                   9.1508              3.3034              5.0154
Force const [Dyne/A]               -0.5155              0.0035              0.0113
Char temp [K]                       0.0000             61.0682             89.0654
Normal mode                   x         y         z            x         y         z            x         y         z
       C                -0.05649   -0.04241    0.11449    0.00343    0.00626   -0.02351   -0.00679    0.09484   -0.01895
       H                 0.00052   -0.02878    0.00812    0.01298    0.01582   -0.01077   -0.00289    0.08404   -0.07938
       H                 0.00187   -0.05145   -0.00616    0.01310   -0.00819   -0.03734   -0.01650    0.11955   -0.00944
       C                -0.04786    0.00194    0.10078   -0.01417    0.01338   -0.01952   -0.00168    0.09387    0.02473
       H                -0.05761   -0.02540    0.06054   -0.02027    0.00267   -0.03257    0.00026    0.11177    0.05737
       C                -0.11049    0.00212    0.10916   -0.02027    0.03529   -0.01450    0.01381    0.06423    0.00623
       C                -0.01581    0.00641    0.00387   -0.03647    0.04770   -0.05216    0.05335    0.06265   -0.01390
       H                 0.04672    0.09097    0.02235   -0.05256    0.07256   -0.06695    0.06086    0.09026   -0.01566
       H                -0.00031   -0.03947   -0.06906   -0.03979    0.05873   -0.04136    0.05927    0.03564   -0.01833
       H                -0.02337   -0.01974   -0.01354   -0.02832    0.02196   -0.07803    0.06986    0.06267   -0.02243
       C                -0.01577   -0.00073    0.02158   -0.02326    0.06658    0.02391   -0.01029    0.05947    0.02115
       H                 0.06110   -0.04335    0.06761   -0.02342    0.09928    0.02877   -0.00982    0.09476    0.02668
       H                -0.02022    0.01900   -0.01726   -0.02302    0.04830    0.06011   -0.04427    0.04523    0.04184
       H                -0.00729    0.01833   -0.04349   -0.02387    0.07565    0.01310    0.00300    0.03411    0.00716
      Br                 0.02479   -0.00189   -0.02699   -0.00089   -0.01777    0.01814   -0.01609   -0.03900    0.00510
       S                 0.02920    0.02293   -0.06468   -0.03774   -0.01022   -0.04404    0.05849   -0.03924   -0.02539
       C                 0.00441   -0.00462   -0.00201    0.16224   -0.04479    0.07379   -0.08125   -0.05611    0.01095
       H                 0.01958    0.00473    0.02267    0.13777   -0.04901    0.04802   -0.07655   -0.00454    0.06171
       H                 0.00267   -0.01520   -0.01250    0.19091    0.03204    0.20182   -0.10288   -0.11550   -0.04022
       H                -0.00953   -0.04536    0.00424    0.27174   -0.13549    0.03459   -0.14460   -0.05696    0.03720

(...snip...)

その結果、虚振動が1つであることが確認できた。

次に、vibration_animation内のmode_1_309i_wave_number.xyzをAvogadroで確認すると、想定される反応系と生成系をつなぐ方向に振動していることを確認できた。

終わりに#

   自作モジュールで、電子状態計算モジュールであるPySCFを用いて、計算レベルHF/3-21GでSN2’反応の遷移状態構造を算出する手順を説明した。

参考#

  • https://github.com/pyscf/pyscf (PySCFのgithubのレポジトリ)
  • https://github.com/ss0832/MultiOptPy (自作モジュールMultiOptPyのレポジトリ)
  • https://avogadro.cc/ (Avogadro、分子構造可視化ツール)
  • The Journal of Chemical Physics 2010, 132, 241102.
  • The Journal of Chemical Physics 1991, 94, 751–760.
  • In Classical and Quantum Dynamics in Condensed Phase Simulations; WORLD SCIENTIFIC: LERICI, Villa Marigola, 1998; pp 385–404.
  • The Journal of Chemical Physics, 2020, 153, 024109.
  • The Journal of Chemical Physics, 2022, 144, 214108.
【計算化学】自作pythonモジュールで遷移状態構造を求めてみる(SN2’反応)
https://ss0832.github.io/posts/20250726_mop_usage_29/
Author
ss0832
Published at
2025-07-26