Home
2430 words
12 minutes
【計算化学】自作pythonモジュールで遷移状態構造を求めてみる(カルベンを用いるシクロプロパン化)

最終更新:2025-07-26

概要#

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

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

カルベノイドを用いるシクロプロパン化について:

使用した自作モジュール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. 初期構造の準備#

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

9

C     -0.148408305162     -0.370360754454     -1.074100528219
H      0.356810520851     -1.312864859120     -1.157238258666
H     -1.211101280357     -0.381577884827     -1.219448682997
C      0.506695938579      0.749884087877     -0.815013349982
H      0.005007139695      1.695686713356     -0.747962894429
H      1.571235848297      0.765127122809     -0.685046312052
C      0.063163086789      0.217480255791      1.721708428144
Cl     0.663906161853     -1.532627481324      2.061408057440
Cl    -1.807309110545      0.169252799892      1.915693540761
初期パスを求めるための初期構造

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

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

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

python optmain.py carbene_cyclopropane.xyz -pyscf -spin 0 -elec 0 -func hf -bs 3-21g -ma 100 1,4 7 -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を用いることを示す。
  • -ns 55は電子状態計算の反復回数を最大55回までとすることを示す。これは、塩化物イオンが解離したため、計算効率を上げるために指定した
  • -modelhess-optでニュートン法ファミリーのoptimzierを使用した際に、電子状態計算でへシアンを算出する場合よりも大幅に低い計算コストで、精度の粗い初期へシアンを計算することを指定するオプションである。

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

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

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

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

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

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

9
OptimizedStructure
C     -0.278857652071     -0.517202105792     -0.713999975640
H      0.296663139407     -1.348230515996     -1.065759564866
H     -1.242235024497     -0.391905703714     -1.162929912723
C      0.479131407338      0.738102812207     -0.283342431698
H      0.008902374767      1.685959062128     -0.447173575322
H      1.547057577530      0.727025947043     -0.358498080617
C     -0.139085743914     -0.154708482438      0.696098869508
Cl     0.943756098002     -1.177619398117      1.747863975920
Cl    -1.615332176561      0.438578384680      1.587740695437
初期パスを求めるための構造最適化の結果(安定構造ではない)

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

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

python nebmain.py carbene_cyclopropane_traj.xyz -ns 10 -modelhess -nd 0.3 -func hf -bs 3-21g -pyscf -elec 0 -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値を確認できる。

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

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

carbene_cyclopropane_traj_3.xyz

9
0 0
C      -0.182191947830     -0.404180138156     -0.965138964461
H       0.337236806659     -1.333788668411     -1.083256267321
H      -1.230279875918     -0.387692235600     -1.185486118604
C       0.472296849594      0.716455609672     -0.606817641832
H      -0.011096257128      1.674174614107     -0.633319818007
H       1.542218485532      0.733544559826     -0.530849452348
C       0.090322700664      0.272646189833      1.382559545214
Cl      0.744509078289     -1.492660928165      1.878825938176
Cl     -1.763015839863      0.221500996894      1.743482779184
NEB法により緩和したパスのエネルギー極大値を示す構造

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

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

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

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

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

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

9
OptimizedStructure
C     -0.197796574486     -0.400688998004     -0.892308574523
H      0.294899544548     -1.345827280563     -0.975732203539
H     -1.251778316569     -0.373612367133     -1.069466352658
C      0.491603687068      0.726431695751     -0.577346447971
H      0.019445983510      1.687968198665     -0.608810032439
H      1.561450800571      0.718691272307     -0.515359257558
C      0.090019048739      0.266044491099      1.274024710805
Cl     0.800237485415     -1.459242478845      1.761526772224
Cl    -1.808081658797      0.180235466723      1.603471385659
遷移状態構造

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

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

Mode                                 0                   1                   2
Freq [cm^-1]                     -241.9258             76.6354            230.2310
Reduced mass [au]                   9.7461              2.0892              6.3954
Force const [Dyne/A]               -0.3361              0.0072              0.1997
Char temp [K]                       0.0000            110.2612            331.2510
Normal mode                   x         y         z            x         y         z            x         y         z   
       C                 0.02136    0.02357   -0.10803   -0.09866    0.06201   -0.00597   -0.12586    0.07911   -0.00763
       H                 0.00852    0.01168   -0.07275   -0.30572   -0.05156    0.05790   -0.15513    0.07066   -0.10201
       H                 0.01313    0.00879   -0.07247   -0.08005    0.29404   -0.08127   -0.13902    0.11423    0.08419
       C                 0.01063    0.00171   -0.15764    0.12779   -0.08033    0.00775   -0.06818    0.04285   -0.00413
       H                 0.00149   -0.00027   -0.08046    0.34156    0.02198   -0.04988   -0.04793    0.05647    0.09974
       H                 0.00609   -0.00317   -0.08017    0.12273   -0.31382    0.07802   -0.06271    0.01307   -0.10644
       C                 0.02956    0.06494    0.18578   -0.02387    0.01501   -0.00145    0.05020   -0.03155    0.00305
      Cl                -0.00993   -0.01638    0.01818    0.01919    0.03451   -0.00568    0.01904   -0.03020    0.07694
      Cl                -0.01203   -0.01507    0.01805   -0.02326   -0.03195    0.00543    0.04199   -0.00816   -0.07324

(...snip...)

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

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

終わりに#

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

参考#

  • 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モジュールで遷移状態構造を求めてみる(カルベンを用いるシクロプロパン化)
https://ss0832.github.io/posts/20250726_mop_usage_28/
Author
ss0832
Published at
2025-07-26