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

最終更新:2025-06-23

概要#

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

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

E2反応:

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

1.9.12b

環境#

WSL2 (Ubuntu-22.04)

Source codeのダウンロード#

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

手順#

1. 初期構造の準備#

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

19
-1 0
 C                  1.29178157    0.12596507   -0.00022224
 H                  0.93509531   -0.37828551   -0.87395347
 H                  2.36178157    0.12594838   -0.00023660
 H                  0.93511875   -0.37857888    0.87334919
 C                  1.29183241    2.30364281    1.25754813
 H                  2.36183241    2.30362612    1.25753377
 H                  0.93518149    3.31245404    1.25772229
 H                  0.93516960    1.79909887    2.13111956
 Br                 1.41513068    2.47853350   -1.55933741
 O                 -2.72956063    0.10674480    2.47693797
 C                 -3.98796063    0.10674498    2.47693798
 H                 -4.34462723    0.58035060    3.36766053
 H                 -4.34462723    0.64133059    1.62142225
 H                 -4.34462744   -0.90144611    2.44173117
 C                  0.77847089    1.57789898    0.00002841
 C                 -0.76152911    1.57792301    0.00004908
 H                 -1.11821505    1.07367132   -0.87368165
 H                 -1.11819161    1.07338028    0.87362134
 H                 -1.11818023    2.58673417    0.00022190



初期パスを求めるための初期構造

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

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

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

python optmain.py e2_rxn.xyz -pyscf -spin 0 -elec -1 -func hf -bs 3-21g -ma 150 10 18 -ns 50 -opt rsirfo_fsb
  • -opt rsirfo_fsbは準ニュートン法であるRS-I-RFO法を構造最適化に使用することを示す。初期のへシアンに関しては、特にオプションで指定しない限り、単位行列が使われる。
  • -pyscfは使用する電子状態計算ソフトウェアをPySCFにすることを示す。
  • -spinはスピン多重度の指定である。PySCFを使用するときは目的とするスピン多重度に1を引いた値を指定する。
  • -elec -1は形式電荷を-1とすることを示す。
  • -ma 150 10 18は150kJ/molの活性化障壁を超えうるペア同士を近づける力を原子のラベル番号10と18のペアに、構造最適化時に加えることを示す。
  • -func hfはHartree-Fock法を用いることを示す。
  • -bs 3-21gは基底関数にPople系である3-21Gを用いることを示す。
  • -ns 50は構造最適化時の電子状態計算の反復回数を最大50回とすることを示す。(デフォルトは1000回である。)

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

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

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

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

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

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

初期パスを求めるための構造最適化の結果(安定構造ではない)

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

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

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

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

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

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

NEB計算の結果の可視化

私が実行した環境では、4番のノード(グラフでは5番)がエネルギー極大値を示していた。 path_ITR_10_e2_rxnディレクトリ内のe2_rxn_traj_4.xyzを可視化する。

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

e2_rxn_traj_4.xyz

19
-1 0
C       1.835877508529     -0.953894716397     -0.858248510511
H       1.482236719857     -1.454626987193     -1.748749862357
H       2.921094667311     -0.912148380228     -0.895461621779
H       1.521695363696     -1.525707465112      0.008266468993
C       1.834748322905      1.237530383715      0.405696828025
H       2.919903848752      1.249707895430      0.351287932532
H       1.481191339324      2.259195770721      0.392960551414
H       1.521325228912      0.773758573932      1.334813273449
Br      1.928192839400      1.453702364864     -2.499282783133
O      -1.816838433025     -0.703225262723      1.178760640716
C      -3.183990495335     -0.836655428490      1.401975403583
H      -3.543120741475     -0.435220135574      2.376316536903
H      -3.860440228715     -0.367047880386      0.667199479953
H      -3.554709780431     -1.884893712334      1.462590596429
C       1.184979962584      0.419778491565     -0.709366314674
C      -0.324518074639      0.417734525253     -0.710745467070
H      -0.656190118257     -0.050979438669     -1.635926507183
H      -1.032192609207     -0.139685976810      0.236330427977
H      -0.659245320187      1.452677378434     -0.758417073267

NEB法により緩和したパスのエネルギー極大値を示す構造

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

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

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

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

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

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

19
OptimizedStructure
C      1.542037032753     -1.005885053731     -0.790821042763
H      1.427390801115     -1.438733542771     -1.775364134281
H      2.588766507206     -1.017911083989     -0.517922694119
H      0.958511193856     -1.578015298251     -0.076117741870
C      1.244262021631      1.109594703473      0.566083108239
H      2.288118964810      1.049345102524      0.844123292383
H      0.950180009147      2.149165098338      0.512536560185
H      0.619469010104      0.591420494099      1.286222480484
Br     2.318370268110      1.504835489209     -2.191997702990
O     -1.135325358216     -0.895939954415      0.980183175927
C     -2.429252491213     -0.679032326131      1.477577471266
H     -2.437582251917     -0.459653700721      2.552609998113
H     -2.943433079642      0.168958577801      1.002333699212
H     -3.101935793669     -1.537471982978      1.343371799552
C      0.968018318768      0.404831863262     -0.755007166671
C     -0.439094976575      0.461349010284     -1.145151807826
H     -0.647841166527     -0.033011906295     -2.086874695032
H     -0.923688631742     -0.259676800283     -0.087911223512
H     -0.846970378001      1.465831310577     -1.137873376297
遷移状態構造

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

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

Mode                                 0                   1                   2
Freq [cm^-1]                    -1242.6783             38.5684             71.0034
Reduced mass [au]                   1.1288              2.7921              1.4486
Force const [Dyne/A]               -1.0270              0.0024              0.0043
Char temp [K]                       0.0000             55.4913            102.1580
Normal mode                   x         y         z            x         y         z            x         y         z   
       C                -0.00103    0.00010    0.00244    0.06241   -0.01993   -0.01521    0.03948   -0.02374   -0.03156
       H                -0.00035   -0.00387    0.00318    0.08755   -0.02359   -0.01648    0.02181   -0.00909   -0.03596
       H                -0.00474   -0.02191    0.01504    0.06045    0.02015   -0.00587    0.04505   -0.02169   -0.05279
       H                -0.04608    0.03843    0.00128    0.08145   -0.04602   -0.02032    0.05988   -0.04192   -0.02882
       C                -0.00186   -0.00332    0.00135   -0.04107   -0.04112   -0.00835    0.04599   -0.05130    0.01282
       H                -0.00925   -0.00798    0.02775   -0.04402   -0.00448    0.01043    0.04863   -0.06083    0.00185
       H                -0.00147   -0.00216    0.00557   -0.07924   -0.05180   -0.00568    0.05167   -0.04884    0.03121
       H                -0.05392   -0.03223   -0.05233   -0.03658   -0.07085   -0.02596    0.04838   -0.05564    0.01219
      Br                -0.00590   -0.00326    0.00376   -0.01086    0.01713    0.01369   -0.01733    0.01178    0.00145
       O                -0.00450   -0.00897    0.02194   -0.02524   -0.06248   -0.03522    0.00145    0.01833    0.05223
       C                 0.02218   -0.00574   -0.00185    0.03903    0.14954    0.04235   -0.04073    0.04700   -0.06632
       H                -0.06934    0.01472    0.02402    0.13798    0.11668    0.04972   -0.11391    0.49308   -0.15724
       H                -0.03797    0.00423    0.01024    0.16202    0.25538    0.09788   -0.14101   -0.22113   -0.43712
       H                -0.04335    0.00782    0.01608   -0.11937    0.27221    0.05263    0.08658   -0.10286    0.26202
       C                 0.06962    0.02010   -0.01554    0.00815   -0.04204   -0.01780    0.03023   -0.02827    0.00332
       C                -0.03805   -0.02081    0.02462    0.01294   -0.09057   -0.04290    0.02232   -0.03299    0.02773
       H                 0.02173    0.03236   -0.01742    0.04620   -0.10083   -0.04501    0.01049   -0.02695    0.02725
       H                 0.14938    0.47961   -0.77436    0.00259   -0.08842   -0.04835    0.03745   -0.02108    0.03912
       H                 0.02290    0.00391   -0.03238   -0.01784   -0.10291   -0.05680    0.02103   -0.03358    0.03851


(...snip...)

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

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

終わりに#

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

参考#

  • 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モジュールで遷移状態構造を求めてみる(E2反応)
https://ss0832.github.io/posts/20250623_mop_usage_18/
Author
ss0832
Published at
2025-06-23