最終更新:2025-07-25
概要
本記事では、自作モジュール(MultiOptPy)で、カルベンの二量化のある1つの素過程の遷移状態構造を算出してみる。電子状態計算ソフトウェアに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_dimer.xyz
とした。 初期構造は以下のものを使用した。
6
C -2.033315482724 -0.386881237452 0.330615542003
C 1.902722921613 0.297008852250 0.130298307493
F -3.337039281709 -0.538210791191 0.489968786138
F -1.920771464505 0.170613468221 -0.862243427163
F 2.659203648155 1.134262279115 -0.557609516122
F 2.729199659170 -0.676792570943 0.468970307651
2. 遷移状態構造最適化のための初期構造の算出
※あらかじめpythonで利用できる電子状態計算ソフトウェアのPySCF(導入方法はpipを使えば可能である。)が使える環境を用意しておく。
a. 初期構造をカレントディレクトリにcarbene_dimer.xyz
として保存し、以下を実行する。
python optmain.py carbene_dimer.xyz -opt rsirfo_fsb -ma 10 1 2 -func hf -bs 3-21g -pyscf -elec 0 -spin 0
-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回までとすることを示す。これは、塩化物イオンが解離したため、計算効率を上げるために指定した
これを実行すると、計算レベルHF/3-21G
で指定した人工力ポテンシャルをかけた上で初期構造を構造最適化することができる。
結果はyyyy_mm_dd
(今日の年月日)ディレクトリの中に存在するディレクトリを開いて確認できる。
正常終了していれば、このディレクトリ中に、carbene_dimer_traj.xyz
が存在するので、これをコピーして、MultiOptPy-1.9.12c
ディレクトリに置く。
carbene_dimer_traj.xyz
は構造最適化の過程をAvogadro(公式ページ:https://avogadro.cc/ )等で可視化して確認できるようにしている。このcarbene_dimer_traj.xyz
は次のNEB計算に使用する。
※carbene_dimer_traj.xyz
をアニメーションとして表示したい場合は、[https://github.com/ss0832/molecule_movie] を使うと良い。
(この人工力ポテンシャルを加えて行った構造最適化の結果はcarbene_dimer_optimized.xyz
で確認できる。構造を可視化して、生成系になっているか確認する。反応系のままであれば、-ma
の設定を見直してb.をやり直す。今回の場合以下の構造が得られた。生成系の安定構造に近いものが得られていると判断できるため、次のNEB計算を行うことが可能である。)
b. carbene_dimer_traj.xyz
を初期パスとして、NEB法で経路の緩和を行う。
NEB法を用いることで、先ほど得られたcarbene_dimer_traj.xyz
全体のエネルギーを下げることができる。これにより、パスのエネルギー極大値を持つ構造を遷移状態構造に近づける。(この時点ではまだ正確な遷移状態構造は求められていない。)
python nebmain.py carbene_dimer_traj.xyz -ns 10 -modelhess -nd 0.15 -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
を確認し、緩和後のパスのエネルギー極大値を示す構造を確認する。
パスの緩和後の各ノードのエネルギー一覧(単位
※bias_force_rms.csv
にて、各Iterationごとのすべてのノードの勾配のRMS値を確認できる。
私が実行した環境では、40番のノード(グラフでは41番)がエネルギー極大値を示していた。
※こちら[https://ss0832.github.io/molecule_viewer/] を使うことでも可視化は可能である。
carbene_dimer_traj_40.xyz
6
0 0
C -1.111142667024 0.281509166054 0.115884920527
C 1.071045660424 -0.117199939487 -0.212744612589
F -1.604443973462 -0.825074941336 0.653199873039
F -1.661295211252 0.352099702725 -1.083389898999
F 1.727869362586 1.019685157062 -0.325620783345
F 1.577966828728 -0.711019145018 0.852670501367
構造が壊れていないので、これを遷移状態を求めるための初期構造とする。
carbene_dimer_traj_40.xyz
をMultiOptPy-1.9.12c
と同じディレクトリ内にコピーする。
そして、以下を実行する。
python optmain.py carbene_dimer_traj_40.xyz -opt rsirfo_bofill -fc 5 -order 1 -func hf -bs 3-21g -pyscf -elec 0 -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と同等)
実行して得られた正確な遷移状態構造を以下に示す。
(実行して得られた正確な遷移状態構造はcarbene_dimer_traj_17_optimized.xyz
として保存されている。)
6
OptimizedStructure
C -1.004787000959 0.184361766239 0.154875559964
C 1.004786699700 -0.184378335515 -0.154859263090
F -1.613004535323 -0.933062634307 0.509133195433
F -1.570073814661 0.552112632352 -0.980587404299
F 1.612973611199 0.933048367486 -0.509164740019
F 1.570105040044 -0.552081796256 0.980602652012
160回程度の反復計算で遷移状態構造が得られた。-freq
オプションにより生成されたnormal_modes.txt
やvibration_animation
ディレクトリ内の振動モードのアニメーションを確認した。
以下に-freq
オプションで生成されたnormal_modes.txt
の一部を示す。
Mode 0 1 2
Freq [cm^-1] -214.6615 80.7760 116.6937
Reduced mass [au] 14.5098 18.0024 18.9970
Force const [Dyne/A] -0.3939 0.0692 0.1524
Char temp [K] 0.0000 116.2186 167.8962
Normal mode x y z x y z x y z
C -0.14011 0.03716 0.03301 -0.00128 -0.04438 0.04452 -0.00005 -0.00163 0.00164
C 0.14011 -0.03716 -0.03301 -0.00128 -0.04438 0.04452 -0.00005 -0.00163 0.00164
F -0.07628 -0.00764 -0.01739 -0.07667 -0.03774 -0.06788 -0.07936 0.06029 0.05679
F -0.07649 -0.01521 -0.00979 0.07748 0.06577 0.03976 0.07939 -0.05926 -0.05782
F 0.07628 0.00764 0.01738 -0.07667 -0.03775 -0.06788 -0.07936 0.06029 0.05679
F 0.07650 0.01521 0.00980 0.07748 0.06578 0.03976 0.07939 -0.05926 -0.05782
(...snip...)
その結果、虚振動が1つであることが確認できた。
次に、vibration_animation
内のmode_1_215i_wave_number.xyz
をAvogadroで確認すると、想定される反応系と生成系をつなぐ方向に振動していることを確認できた。
終わりに
自作モジュールで、電子状態計算モジュールであるPySCFを用いて、計算レベルHF/3-21G
でカルベンの二量化の1つの素過程の遷移状態構造を算出する手順を説明した。
参考
- 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.