最終更新:2025-08-14
概要
本記事では、自作モジュール(MultiOptPy)で、SN2反応(基質-chloromethane, 求核剤-iodide ion)の遷移状態構造を算出してみる。使用する計算レベルは、Meta社のFAIR Chemistryが開発したニューラルネットワークポテンシャル(NNP)であるUMA(Meta’s Universal Model for Atoms)を使用する。
MultiOptPyは電子状態計算ソフトウェアを用いた分子構造最適化手法の勉強を目的として作成したpythonモジュールである。
MultiOptPyのレポジトリ:https://github.com/ss0832/MultiOptPy
SN2反応について:
今回使用したニューラルネットワークポテンシャルについて:
- https://ai.meta.com/blog/meta-fair-science-new-open-source-releases/ (UMAの公開に関する記事)
- https://github.com/facebookresearch/fairchem (FAIR Chemistryの提供するGitHubのレポジトリ)
- https://fair-chem.github.io/ (同上のレポジトリの内容に関して説明したサイト)
- https://huggingface.co/facebook/UMA (NNPの配布サイト, Hugging Faceへのアカウント登録と配布元の使用許諾が必要である。)
使用した自作モジュールMultiOptPyのバージョン
v1.12b
環境
Windows 11
※Windows 11環境下でAnaconda PowerShell Promptを使用した。
Source codeのダウンロード
wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.12b.zip
unzip v1.12b.zip
cd MultiOptPy-v1.12b
環境構築手順
今回は、Windows 11のPower Shellを使用した。初めに、NNPを使用できる環境が整ったAnaconda PowerShell Promptを用意する手順を説明する。
1, https://repo.anaconda.com/archive/ より、Anaconda3-2025.06-1-Windows-x86_64.exe
でAnacondaをインストールする。
2, 検索機能を使い、スタートからAnaconda PowerShell Prompt
を開く。
3, 以下のコマンドを実行し、仮想環境を作成する。
conda create -n (任意の仮想環境名) python=3.12.7
4, 先ほど作成した仮想環境をconda activate (仮想環境名)
で起動させる。
5, 以下のコマンドを実行し、必要なライブラリを導入する。
pip install fairchem-core==2.2.0 ase==3.25.0 torch==2.6.0
- fairchem-coreは、FAIR Chemistryが管理しているNNPを動作させるために必要なライブラリである。
- aseはNNPに電子エネルギーを算出したい分子構造を渡すために必要なインターフェイスの役割を果たすために必要なライブラリである。
- torchはPyTorchライブラリを指す。これはニューラルネットワークなどの機械学習を行ったり、学習結果を扱ったりするために必須なライブラリである。
これで、Anaconda PowerShell Prompt
から仮想環境を立ち上げることで、NNPを使用する準備が整えることが出来る。
次に、NNPを使用するために必要なModelの情報が保存されている.pt
ファイルのダウンロードおよびNNPの自作モジュールへの導入方法について説明する。
1, 以下のサイトにアクセスして、uma-s-1.pt
をダウンロードする。(使用許諾が下りていれば可能である。)
https://huggingface.co/facebook/UMA
2, ダウンロード後、MultiOptPy-v1.12b
ディレクトリ内に存在するsoftware_path.conf
に対して、uma-s-1.pt
の絶対パスを用いて以下を追記する。
uma-s-1::(uma-s-1.ptの絶対パス)
これで、MultiOptPy-v1.12b
がNNPuma-s-1
を使用できるようになる。
使用するNNPに関する具体的な説明
今回使用するNNPについて具体的に説明する。
UMAのModel Checkpointは
uma-s-1
を使用した。小分子系のトレーニングセットである
Omol25
(omol
)を使用して学習したニューラルネットワークポテンシャルを使用する。
※自作モジュールでの具体的な使用の仕方に関しては、https://github.com/ss0832/MultiOptPy/blob/main/multioptpy/ase_calculation_tools.py を参照
手順
1. 初期構造の準備
モデル反応系として、以下の構造を用意した。今回はファイルの名前をsn2_Cl_I.xyz
とした。 初期構造は以下のものを使用した。
6
C 0.142986291042 0.264967288252 -0.443589721771
H 0.513914579398 -0.754176333165 -0.460253127196
H 0.512875424655 0.787119414583 0.432357211595
H -0.942091059629 0.269041867756 -0.450962685660
Cl 0.736244554357 1.106895773976 -1.901023934045
I -0.963929789822 -1.673848011401 2.823472257076
2. 遷移状態構造最適化のための初期構造の算出
a. 初期構造をカレントディレクトリにsn2_Cl_I.xyz
として保存し、以下を実行する。
python .\optmain.py sn2_Cl_I.xyz -opt rsirfo_fsb -os uma-s-1 -ma 300 1 6 -elec -1
-opt rsirfo_fsb
は準ニュートン法であるRS-I-RFO法を構造最適化に使用することを示す。初期のへシアンに関しては、特にオプションで指定しない限り、単位行列が使われる。-spin
はスピン多重度の指定である。PySCFを使用するときは目的とするスピン多重度に1を引いた値を指定する。(デフォルトでは1が指定される。)-elec M
は形式電荷をMとすることを示す。(デフォルトでは0が指定される。)-ma yyy a b
はyyykJ/molの活性化障壁を超えうるペア同士を近づける力を原子のラベル番号aとbのペアに構造最適化時に加えることを示す。-os uma-s-1
は今回使用するNNPを指定している。これを使用する際にASEライブラリが必要である。
これを実行すると、omol
のデータセットを使用したuma-s-1
モデルのNNPで得たエネルギーに対して、指定した人工力ポテンシャルを加えた上で初期構造を構造最適化することができる。
結果はyyyy_mm_dd
(今日の年月日)ディレクトリの中に存在するディレクトリを開いて確認できる。
正常終了していれば、このディレクトリ中に、sn2_Cl_I_traj.xyz
が存在するので、これをコピーして、MultiOptPy-v1.12b
ディレクトリに置く。
sn2_Cl_I_traj.xyz
は構造最適化の過程をAvogadro(公式ページ:https://avogadro.cc/ )等で可視化して確認できるようにしている。このsn2_Cl_I_traj.xyz
は次のNEB計算に使用する。
※sn2_Cl_I_traj.xyz
をアニメーションとして表示したい場合は、[https://github.com/ss0832/molecule_movie] を使うと良い。
(この人工力ポテンシャルを加えて行った構造最適化の結果はsn2_Cl_I_optimized.xyz
で確認できる。構造を可視化して、生成系になっているか確認する。反応系のままであれば、-ma
の設定を見直してb.をやり直す。今回の場合以下の構造が得られた。生成系の安定構造に近いものが得られていると判断できるため、次のNEB計算を行うことが可能である。)
6
OptimizedStructure
C -0.131667702131 -0.192812215274 0.332260536437
H 0.467701791422 -0.832471446035 -0.304402711522
H 0.463022891258 0.677326486766 0.583222692204
H -0.982515952092 0.145408263553 -0.246967111891
Cl 0.897918838177 1.360265739912 -2.333384672312
I -0.714459866634 -1.157716828922 1.969271267084
b. sn2_Cl_I_traj.xyz
を初期パスとして、NEB法で経路の緩和を行う。
NEB法を用いることで、先ほど得られたsn2_Cl_I_traj.xyz
全体のエネルギーを下げることができる。これにより、パスのエネルギー極大値を持つ構造を遷移状態構造に近づける。(この時点ではまだ正確な遷移状態構造は求められていない。)
python .\nebmain.py sn2_Cl_I_traj.xyz -os uma-s-1 -ns 10 -modelhess -spng -nd 0.15 -elec -1
-nd N
はノード間の距離をN Åとして初期パスを作成することを示す。-ns n
はn回分NEB法による経路の緩和を行うことを示す。-fc M
はM回あたりの経路緩和回数に対して1回だけ正確なHessianを計算し、経路緩和に使用する。これを使用すると、Hessianを使用しない場合の経路緩和アルゴリズムとは別のものを使用して、経路緩和を行う。-spng
は緩和中のパスのエネルギープロファイルや各ノードの勾配のRMS値をmatplotlibで可視化するオプションである。-os uma-s-1
は今回使用するNNPを指定している。これを使用する際にASEライブラリが必要である。
c. 初期構造の決定及び遷移状態構造の計算
MultiOptPy-v1.12b
と同じディレクトリ内に、NEBという名前を含むディレクトリが生成されている。 そのディレクトリ内のenergy_plot.csv
を確認し、緩和後のパスのエネルギー極大値を示す構造を確認する。
パスの緩和後の各ノードのエネルギー一覧(単位
※bias_force_rms.csv
にて、各Iterationごとのすべてのノードの勾配のRMS値を確認できる。
私が実行した環境では、9番のノード(グラフでは10番)がエネルギー極大値を示していた。また、Walden反転の図解のような反応に関わる分子構造の部位が平面となっている。
※こちら[https://ss0832.github.io/molecule_viewer/] を使うことでも可視化は可能である。
sn2_Cl_I_traj_9.xyz
6
-1 1
C -0.060834676392 -0.062698122252 0.110568763170
H 0.498699111720 -0.845183678949 -0.368520652839
H 0.494486159709 0.740980916046 0.559168583699
H -1.017530512609 0.187324569526 -0.317248753030
Cl 0.788955170094 1.187572951343 -2.031881062984
I -0.703775252522 -1.207996635714 2.047913121984
構造が壊れていないので、これを遷移状態を求めるための初期構造とする。
sn2_Cl_I_traj_9.xyz
をMultiOptPy-v1.12b
と同じディレクトリ内にコピーする。
そして、以下を実行する。
python .\optmain.py sn2_Cl_I_traj_9.xyz -freq -tcc -opt rsirfo_bofill -fc 5 -order 1 -os uma-s-1
-opt rsirfo_bofill
は遷移状態構造の最適化向けのoptimizerを指定することを意味する。準ニュートン法であるRS-I-RFO法を使用する。今回は-fc
で正確なへシアンを計算するようにしているので、初期へシアンは正確なへシアンを使用するようになっている。-order 1
は一次の鞍点を求めることを指定する。(デフォルトだと極小値を求めるようになっている。)-fc 5
は5回の反復回数当たり1回正確なへシアンを計算することを指定する。-freq
は収束条件を満たした後に基準振動解析を行うことを示す。(自前で実装しているため、あくまで目安として使用することを推奨する。各振動モードをvibration_animation
内のxyzファイルで可視化できる。)UMAモデルから算出されるHessianは数値微分により求めているため、原子数Zが多いとZの二乗オーダーで計算コストが急増する。-tcc
は収束条件を厳しくすることを示す。(Gaussianのtightと同等)
実行して得られた正確な遷移状態構造を以下に示す。
(実行して得られた正確な遷移状態構造はsn2_Cl_I_traj_9_optimized.xyz
として保存されている。)
6
OptimizedStructure
C -0.003960022121 -0.006384821537 0.010872980651
H 0.528116713909 -0.854112066593 -0.373213615163
H 0.524316404606 0.744646347834 0.564177530968
H -1.004959003926 0.185948277689 -0.321216642408
Cl 0.725144726030 1.168376739253 -1.989765791403
I -0.768658818498 -1.238474476645 2.109145537356
10回程度の反復計算で遷移状態構造が得られた。-freq
オプションにより生成されたnormal_modes.txt
やvibration_animation
ディレクトリ内の振動モードのアニメーションを確認した。
以下に-freq
オプションで生成されたnormal_modes.txt
の一部を示す。
Mode 0 1 2
Freq [cm^-1] -392.6930 160.6860 169.2066
Reduced mass [au] 12.6063 32.1714 4.1522
Force const [Dyne/A] -1.1454 0.4894 0.0700
Char temp [K] 0.0000 231.1913 243.4506
Normal mode x y z x y z x y z
C -0.08191 -0.13197 0.22475 -0.01468 -0.02330 0.03997 -0.20732 0.12193 -0.00401
H -0.01343 -0.00084 0.02371 -0.01464 -0.02109 0.03852 -0.20802 0.12879 -0.01231
H -0.01338 -0.02032 0.01227 -0.01464 -0.02312 0.03735 -0.21110 0.12405 -0.00375
H 0.00526 -0.01351 0.02308 -0.01271 -0.02242 0.03848 -0.21369 0.11942 0.00391
Cl 0.01433 0.02309 -0.03932 -0.04266 -0.06882 0.11713 0.04612 -0.02706 0.00079
I 0.00397 0.00639 -0.01089 0.01348 0.02170 -0.03696 0.01192 -0.00703 0.00026
(...snip...)
その結果、虚振動が1つであることが確認できた。
次に、vibration_animation
内のmode_1_393i_wave_number.xyz
をAvogadroで確認すると、想定される反応系と生成系をつなぐ方向に振動していることを確認できた。
終わりに
自作モジュールで、UMAモデルのニューラルネットワークポテンシャル(NNP)を用いて、SN2反応(基質-chloromethane, 求核剤-iodide ion)のある1つの遷移状態構造を算出する手順を説明した。
参考
- https://github.com/ss0832/MultiOptPy (自作モジュールMultiOptPyのレポジトリ)
- https://avogadro.cc/ (Avogadro、分子構造可視化ツール)
- https://ai.meta.com/blog/meta-fair-science-new-open-source-releases/ (UMAの公開に関する記事)
- https://github.com/facebookresearch/fairchem (FAIR Chemistryの提供するGitHubのレポジトリ)
- https://fair-chem.github.io/ (同上のレポジトリの内容に関して説明したサイト)
- https://huggingface.co/facebook/UMA (NNPの配布サイト, Hugging Faceへのアカウント登録と配布元の使用許諾が必要である。)
- 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.