Home
2198 words
11 minutes
【計算化学】自作pythonモジュールで遷移状態構造を求めてみる(1,3-ブタジエンの電子環状反応)

最終更新:2025-05-21

概要#

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

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

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

1.9.6

環境#

WSL2 (Ubuntu-22.04)

手順#

1. 初期構造の準備#

モデル反応系として、1,3-ブタジエンの2位の炭素と3位の炭素間結合を軸に回転させた,1,2,3位の炭素が作る平面と2,3,4の炭素が作る平面の二面角が90度となるように構造をxyzファイル形式で用意した。今回は名前をelectrocyclic_rxn.xyzとした。

s-cis体の安定構造を初期構造としてみたが、うまくパスが求められなかったため、今回は構造最適化を使用せずに以下の初期構造を使用した。

10

 C                 -1.45485358    0.98323656    1.17363762
 H                 -0.91988915    0.97706720    2.10028480
 H                 -2.52478244    0.99557527    1.17363762
 C                 -0.77729862    0.97542281    0.00000000
 H                 -1.31226305    0.98159217   -0.92664719
 C                  0.76259899    0.95766429    0.00000000
 C                  1.42662012   -0.22370905    0.00000000
 H                  2.49654897   -0.23604777    0.00000000
 H                  1.30824905    1.87808050    0.00000000
 H                  0.88097005   -1.14412526    0.00000000


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

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

a. 以下のURLにアクセスし、Source codeをダウンロードする。#

wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.9.6.zip
unzip v1.9.6.zip
cd MultiOptPy-1.9.6

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

python optmain.py electrocyclic_rxn.xyz -opt rsirfo_fsb -pyscf -spin 0 -ma 600 1 7
  • -opt rsirfo_fsbは準ニュートン法であるRS-I-RFO法を構造最適化に使用することを示す。初期のへシアンに関しては、特にオプションで指定しない限り、単位行列が使われる。
  • -pyscfは使用する電子状態計算ソフトウェアをPySCFにすることを示す。
  • -spinはスピン多重度の指定である。PySCFを使用するときは目的とするスピン多重度に1を引いた値を指定する。
  • -ma 600 1 7は600kJ/molの活性化障壁を超えうる力を原子のラベル番号1と7のペアに、構造最適化時に加えることを示す。今回かなり大きめの力を加えている。

これを実行すると、-bs(基底関数の指定)と-func(計算手法の指定)がないので、デフォルトの設定である計算レベルB3LYP/6-31G(d)で指定した人工力ポテンシャルをかけた上で初期構造を構造最適化することができる。

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

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

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

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

(この人工力ポテンシャルを加えて行った構造最適化の結果はelectrocyclic_rxn_optimized.xyzで確認できる。構造を可視化して、生成系になっているか確認する。反応系のままであれば、-maの設定を見直してb.をやり直す。)

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

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

LUP法と呼ばれるNEB法とよく似た方法があるが、本モジュールではNEB法を用いている。

python nebmain.py electrocyclic_rxn_traj.xyz -ns 15 -pyscf -spin 0 -spng -nd 0.2
  • -nd 0.2はノード間の距離を0.2Åとして初期パスを作成することを示す。
  • -ns 15は15回分NEB法による経路の緩和を行うことを示す。初期パスの作成のために大きめのバイアスポテンシャルを付加したので、10回のNEB計算では足りないと判断して増やした。
  • -pyscfは使用する電子状態計算ソフトウェアをPySCFにすることを示す。
  • -spngは緩和中のパスのエネルギープロファイルや各ノードの勾配のRMS値をmatplotlibで可視化するオプションである。

(参考)

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

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

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

-155.976589837477,-155.97645786452995,-155.97167340610454,-155.96074773878394,-155.9452487562773,-155.92876754675382,-155.90917033150788,-155.89904957958328,-155.89980787418077,-155.9399987664415,-155.9301506326851,-155.9053969267773,-155.90030210308473,-155.89408225329876,-155.88592050170996,-155.87700632117622,-155.8705371055196,-155.87135879742397,-155.87963851817062,-155.9004898100749,-155.92495200449423,-155.94129883639084,-155.94940731796794,-155.9555853385724,-155.95830884304397,-155.95946448648817,-155.96278756970003,-155.9663046805655,-155.9675213443125,-155.96989488924973,-155.97003746013692

私が実行した環境では、16番のノードがエネルギー極大値を示していた。 path_ITR_15_electrocyclic_rxnディレクトリ内のelectrocyclic_rxn_traj_16.xyzを可視化する。

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

electrocyclic_rxn_traj_16.xyz

10
0 0
C      -0.857367405315     -0.106699127551      0.564897415044
H      -0.285563013977      0.051128456869      1.445424957851
H      -1.823136545167     -0.589553597822      0.817959131319
C      -0.686297842976      0.704198568041     -0.588291855491
H      -1.428919195966      0.873297218019     -1.366274811897
C       0.701116978466      0.580257500856     -0.696226403939
C       0.849506066829     -0.574737620786      0.116569175831
H       1.806659262337     -0.838854964859      0.610531373790
H       1.454561819528      1.349595078748     -0.856758365646
H       0.269439876241     -1.448631511514     -0.047830616862



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

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

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

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

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

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

10
OptimizedStructure
C     -1.002893705032     -0.084845425216      0.636591377502
H     -0.570823428752      0.208314270188      1.586090893471
H     -1.939845217452     -0.643867283027      0.737360930238
C     -0.675232257430      0.665681407353     -0.531030175106
H     -1.384932862663      1.142490071966     -1.205601900752
C      0.688940046505      0.523129670049     -0.657842917532
C      0.994449437430     -0.648105918577      0.096393129770
H      1.923657355533     -0.759604713232      0.666195236501
H      1.411829624348      1.189401944748     -1.126436267892
H      0.554851007512     -1.592594024253     -0.201720306200

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

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

Mode                                 0                   1                   2
Freq [cm^-1]                     -742.5047            472.8307            653.7701
Reduced mass [au]                   2.1968              2.0341              1.1153
Force const [Dyne/A]               -0.7136              0.2679              0.2809
Char temp [K]                       0.0000            680.2979            940.6294
Normal mode                   x         y         z            x         y         z            x         y         z     
       C                -0.12782    0.06946   -0.00892   -0.06249   -0.04559   -0.02639   -0.02059    0.00100    0.02408
       H                 0.15279   -0.22875   -0.05022   -0.13872   -0.20897    0.05900   -0.28509    0.03977    0.13362
       H                -0.20924    0.22512    0.03894   -0.08979   -0.03299   -0.21013    0.10757   -0.26183   -0.25153
       C                -0.02764   -0.04308    0.02746    0.02724    0.09712    0.07806    0.03507    0.00846    0.04560
       H                -0.00589   -0.15280   -0.07374    0.05209    0.26821    0.16899   -0.00153   -0.39762   -0.20407
       C                 0.02682   -0.02777    0.04339   -0.02702   -0.07776   -0.09745    0.03547    0.04523    0.00892
       C                 0.12871    0.00745   -0.06800    0.06226    0.02568    0.04630   -0.02022    0.02424    0.00077
       H                 0.21132   -0.04144   -0.22267    0.09176    0.20906    0.03411    0.10791   -0.25281   -0.26077
       H                 0.00500    0.07363    0.15282   -0.05090   -0.16837   -0.26870    0.00049   -0.20419   -0.39806
       H                -0.15490    0.05204    0.22701    0.13562   -0.06056    0.21053   -0.28339    0.13682    0.03581

(...snip...)

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

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

終わりに#

   自作モジュールで、計算レベルB3LYP/6-31G(d)で1,3-ブタジエンの電子環状反応の遷移状態構造を算出する手順を説明した。

参考#

  • 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モジュールで遷移状態構造を求めてみる(1,3-ブタジエンの電子環状反応)
https://ss0832.github.io/posts/20250521_mop_usage_9/
Author
ss0832
Published at
2025-05-21