最終更新:2025-08-28
概要
本記事では、自作モジュール(MultiOptPy)で、Prilezhaevエポキシ化 (過酸化物
MultiOptPyは電子状態計算ソフトウェアを用いた分子構造最適化手法の勉強を目的として作成したpythonモジュールである。
MultiOptPyのレポジトリ:https://github.com/ss0832/MultiOptPy
Prilezhaevエポキシ化反応について:
- https://www.chem-station.com/odos/2009/06/prilezhaev-prilezhaev-epoxidat.html
- https://en.wikipedia.org/wiki/Epoxide
今回使用したニューラルネットワークポテンシャルについて:
- 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.15.1b
環境
Windows 11
※Windows 11環境下でAnaconda PowerShell Promptを使用した。
Source codeのダウンロード
wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.15.1b.zip
unzip v1.15.1b.zip
cd MultiOptPy-v1.15.1b
環境構築手順
今回は、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.15.1b
ディレクトリ内に存在するsoftware_path.conf
に対して、uma-s-1.pt
の絶対パスを用いて以下を追記する。
uma-s-1::(uma-s-1.ptの絶対パス)
これで、MultiOptPy-v1.15.1b
がNNPuma-s-1
を使用できるようになる。
使用するNNPに関する具体的な説明
今回使用するNNPについて具体的に説明する。
- UMAのModel Checkpointは
uma-s-1
を使用した。 - 小分子系のトレーニングセットである
Omol25
(omol
)を使用して学習したニューラルネットワークポテンシャルを使用する。
※自作モジュールでの具体的な使用の仕方に関しては、ase_calculation_tools.py
を参照
手順
1. 初期構造の準備
モデル反応系として、以下の構造を用意した。今回はファイルの名前をepoxidation_H.xyz
とした。 初期構造は以下のものを使用した。
12
C -0.845905155952 -0.851358633506 1.522932657034
H -0.187921890166 -1.599089660070 1.097403580068
H -1.885744803725 -1.123899124225 1.653756186833
C -0.393212241360 0.344393020172 1.869141992852
H -1.045460040630 1.095640342539 2.296726495957
H 0.648552597120 0.609961921240 1.737093212247
C 1.292815940301 0.089533086428 -1.991018805220
O -0.835718012152 0.708865208235 -1.424714900729
H 2.010277834660 0.062473771592 -2.817611669204
H -0.390002202633 0.327439853865 -0.636054908049
O 0.158744649149 0.631638551018 -2.437440850448
O 1.473573325387 -0.295598337287 -0.870212991340
2. 遷移状態構造最適化のための初期構造の算出
a. 初期構造をカレントディレクトリにepoxidation_H.xyz
として保存し、以下を実行する。
python .\optmain.py .\epoxidation_H.xyz -opt rsirfo_fsb -os uma-s-1 -modelhess -ma 200 1,4 8 200 10 12
-opt rsirfo_fsb_gdiis
は準ニュートン法であるRS-I-RFO法を構造最適化に使用することを示す。初期のへシアンに関しては、特にオプションで指定しない限り、単位行列が使われる。RS-I-RFO法で算出したステップとGDIIS法で算出したステップを混ぜて最適化する。-spin
はスピン多重度の指定である。PySCFを使用するときは目的とするスピン多重度に1を引いた値を指定する。(デフォルトでは1が指定される。)-elec M
は形式電荷をMとすることを示す。(デフォルトでは0が指定される。)-ma yyy a,b c
はyyykJ/molの活性化障壁を超えうるペア同士を近づける力を原子のラベル番号a,bのフラグメントとcのペアに構造最適化時に加えることを示す。-os uma-s-1
は今回使用するNNPを指定している。これを使用する際にASEライブラリが必要である。
これを実行すると、omol
のデータセットを使用したuma-s-1
モデルのNNPで得たエネルギーに対して、指定した人工力ポテンシャルを加えた上で初期構造を構造最適化することができる。
結果はyyyy_mm_dd
(今日の年月日)ディレクトリの中に存在するディレクトリを開いて確認できる。
正常終了していれば、このディレクトリ中に、epoxidation_H_traj.xyz
が存在するので、これをコピーして、MultiOptPy-v1.15.1b
ディレクトリに置く。
epoxidation_H_traj.xyz
は構造最適化の過程をAvogadro(公式ページ:https://avogadro.cc/ )等で可視化して確認できるようにしている。このepoxidation_H_traj.xyz
は次のNEB計算に使用する。
※epoxidation_H_traj.xyz
をアニメーションとして表示したい場合は、[https://github.com/ss0832/molecule_movie] を使うと良い。
(この人工力ポテンシャルを加えて行った構造最適化の結果はepoxidation_H_optimized.xyz
で確認できる。構造を可視化して、生成系になっているか確認する。反応系のままであれば、-ma
の設定を見直してb.をやり直す。今回の場合以下の構造が得られた。生成系の安定構造に近いものが得られていると判断できるため、次のNEB計算を行うことが可能である。)
b. epoxidation_H_traj.xyz
を初期パスとして、NEB法で経路の緩和を行う。
NEB法を用いることで、先ほど得られたepoxidation_H_traj.xyz
全体のエネルギーを下げることができる。これにより、パスのエネルギー極大値を持つ構造を遷移状態構造に近づける。(この時点ではまだ正確な遷移状態構造は求められていない。)
python .\nebmain.py epoxidation_H_traj.xyz -os uma-s-1 -modelhess -ns 10 -spng -nd 0.3
-nd N
はノード間の距離をN Åとして初期パスを作成することを示す。-ns n
はn回分NEB法による経路の緩和を行うことを示す。-fc M
はM回あたりの経路緩和回数に対して1回だけ正確なHessianを計算し、経路緩和に使用する。これを使用すると、Hessianを使用しない場合の経路緩和アルゴリズムとは別のものを使用して、経路緩和を行う。-spng
は緩和中のパスのエネルギープロファイルや各ノードの勾配のRMS値をmatplotlibで可視化するオプションである。-modelhess
は経路の緩和に計算コストの低いHessianを用いることを指定する。これに伴い、Hessianを使う経路緩和アルゴリズムに変更となる。-os uma-s-1
は今回使用するNNPを指定している。これを使用する際にASEライブラリが必要である。
c. 初期構造の決定及び遷移状態構造の計算
MultiOptPy-v1.15.1b
と同じディレクトリ内に、NEBという名前を含むディレクトリが生成されている。 そのディレクトリ内のenergy_plot.csv
を確認し、緩和後のパスのエネルギー極大値を示す構造を確認する。
パスの緩和後の各ノードのエネルギー一覧(単位
※bias_force_rms.csv
にて、各Iterationごとのすべてのノードの勾配のRMS値を確認できる。
経路緩和の結果得られた経路のエネルギー極大値を示す構造を遷移状態構造を求める初期構造とした。
※こちら[https://ss0832.github.io/molecule_viewer/] を使うことでも可視化は可能である。
epoxidation_H_traj_10.xyz
(グラフでは11番)
12
0 1
C -0.911111923723 -0.705129702515 1.196138929995
H -0.226235854302 -1.484308119411 0.871448560394
H -1.963696037790 -0.902112679015 1.114929839329
C -0.433057565535 0.410634999932 1.762082747409
H -1.099579350385 1.193193375929 2.103420488914
H 0.632041010148 0.637300088605 1.810516235066
C 1.097658733796 0.111517163674 -1.998123940566
O -0.597906215726 0.333851572162 -0.626991964187
H 1.693350360758 0.215405653389 -2.897534288942
H 0.369149374903 0.009600010440 -0.340838912262
O -0.148280868950 0.438050765301 -2.077473460533
O 1.587668336806 -0.258003128490 -0.917574234617
構造が壊れていないので、これを遷移状態を求めるための初期構造とする。
epoxidation_H_traj_10.xyz
をMultiOptPy-v1.15.1b
と同じディレクトリ内にコピーする。
そして、以下を実行する。
python .\optmain.py .\epoxidation_H_traj_10.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と同等)
実行して得られた正確な遷移状態構造と思われる構造を以下に示す。
(実行して得られた正確な遷移状態構造は計算開始時に、yyyy_mm_dd
ディレクトリ内に生成された新規ディレクトリ内のYYY_optimized.xyz
として保存されている。)
12
OptimizedStructure
C -0.978544704169 -0.775734161212 1.314858458778
H -0.340072481661 -1.648456012474 1.296175063394
H -2.032212272959 -0.921038755368 1.133357721489
C -0.488430542955 0.441991822141 1.666795276574
H -1.141495525074 1.294122262017 1.777098702168
H 0.550335841678 0.567803357916 1.938509716920
C 1.139605353809 0.212020746711 -2.126767461136
O -0.481986943776 0.263313283786 -0.321572127890
H 1.609380037370 0.350316940028 -3.110626117919
H 0.470360816756 -0.100374376446 -0.326262063806
O -0.066518523950 0.623479479064 -2.051827602151
O 1.759578944932 -0.307444586163 -1.189739566421
停留点に収束した分子構造が得られた。-freq
オプションにより生成されたnormal_modes.txt
やvibration_animation
ディレクトリ内の振動モードのアニメーションを確認した。
以下に-freq
オプションで生成されたnormal_modes.txt
の一部を示す。
Mode 0 1 2
Freq [cm^-1] -650.5788 71.3731 135.2815
Reduced mass [au] 12.0044 2.6731 3.1547
Force const [Dyne/A] -2.9936 0.0080 0.0340
Char temp [K] 0.0000 102.6900 194.6399
Normal mode x y z x y z x y z
C 0.00841 0.00139 -0.08658 0.11402 -0.05284 0.01694 0.00129 0.00933 -0.09979
H 0.00487 0.00030 -0.02849 0.27219 0.06129 0.06230 0.01850 0.02269 -0.13785
H -0.00234 -0.00519 -0.01003 0.14618 -0.24575 -0.01477 0.02002 0.00388 -0.20299
C 0.02212 0.03439 -0.07549 -0.11084 0.04825 -0.01955 -0.06052 -0.02673 0.11391
H 0.00442 0.00946 -0.00018 -0.26682 -0.06502 -0.06720 -0.08934 -0.05232 0.14233
H 0.01057 0.00901 -0.02816 -0.14417 0.24187 0.01629 -0.08705 -0.03749 0.21926
C -0.01770 0.01147 -0.02125 -0.00538 -0.01811 -0.00353 -0.03208 -0.08141 -0.04367
O -0.02196 -0.05038 0.19600 0.00951 0.03477 0.00828 0.05814 0.08396 0.04677
H 0.08323 -0.04143 0.01456 -0.00484 -0.02984 -0.00488 -0.11388 -0.23581 -0.10484
H 0.05222 0.01009 -0.06489 -0.00293 0.00161 -0.00132 0.08293 0.14984 0.05757
O 0.02704 0.01371 -0.07676 0.02831 0.07575 0.02038 -0.01617 -0.04230 -0.00069
O -0.02435 0.00234 0.02568 -0.03615 -0.09123 -0.02346 0.03717 0.04187 -0.02223
(...snip...)
その結果、虚振動が1つであることが確認できた。つまりこの構造は遷移状態構造である。
次に、vibration_animation
内の虚振動を示す分子振動が示されたxyzファイル(mode_1_XXXi_wave_number.xyz
)をAvogadroで確認すると、想定される反応系と生成系をつなぐ方向に振動していることを確認できた。
終わりに
自作モジュールで、UMAモデルのニューラルネットワークポテンシャル(NNP)を用いて、Prilezhaevエポキシ化 (過酸化物
参考
- 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.