Home
3563 words
18 minutes
【計算化学】自作pythonモジュールで遷移状態構造を求めてみる(Heck反応, 挿入素過程, NNP使用)

最終更新:2025-08-14

概要#

本記事では、自作モジュール(MultiOptPy)で、Heck反応の挿入素過程の遷移状態構造を算出してみる。使用する計算レベルは、Meta社のFAIR Chemistryが開発したニューラルネットワークポテンシャル(NNP)であるUMA(Meta’s Universal Model for Atoms)を使用する。

MultiOptPyは電子状態計算ソフトウェアを用いた分子構造最適化手法の勉強を目的として作成したpythonモジュールである。

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

Heck反応について:

今回使用したニューラルネットワークポテンシャルについて:

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

v1.12

環境#

Windows 11

※Windows 11環境下でAnaconda PowerShell Promptを使用した。

Source codeのダウンロード#

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

環境構築手順#

今回は、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.12ディレクトリ内に存在するsoftware_path.confに対して、uma-s-1.ptの絶対パスを用いて以下を追記する。

uma-s-1::(uma-s-1.ptの絶対パス)

これで、MultiOptPy-v1.12が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. 初期構造の準備#

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

33

C     -1.086989998472     -1.040991500739     -1.346249861701
C     -0.789934792417      0.196128946977     -1.867915007210
H     -1.578938605814      0.810096706280     -2.286775708402
H      0.212565861200      0.416054313557     -2.206726888349
C     -2.499986179257     -1.562190095293     -1.302133615075
H     -3.225922784674     -0.801464783424     -1.589591162063
H     -2.588698488118     -2.391710372587     -2.008880588265
H     -2.740804185884     -1.944151152384     -0.308293818343
C     -0.043683533990     -2.111656128051     -1.174167729881
H     -0.115077836345     -2.558458942043     -0.181116063660
H     -0.237366482871     -2.901250260616     -1.906189892328
H      0.965189797328     -1.735620616719     -1.319868163664
Pd    -0.819969123653      0.554453306371      0.248645283651
Br    -1.588999315302     -1.027351719141      2.437667525055
C      1.200577801638      0.340833656864      0.263058846388
C      2.024284335431      1.137852914292     -0.525989968796
C      1.781483777352     -0.603511771230      1.106720106790
C      3.405286238513      0.971188249575     -0.503293705366
H      1.595664711195      1.899506580878     -1.167771623171
C      3.160100717570     -0.767745020264      1.127534158512
H      1.149390733154     -1.210537052530      1.743852640656
C      3.976415408836      0.013621101926      0.320116680645
H      4.031653010173      1.595167627913     -1.129051774756
H      3.597847272319     -1.512118887751      1.781442520072
H      5.050510711091     -0.118721287250      0.339060760624
P     -3.161682871591      1.051114791181      0.552642566766
H     -3.483902730993      1.744225984962      1.726736201478
H     -3.894639391279      1.859007957350     -0.345601226103
H     -4.066745524934     -0.009040704143      0.662319902325
P     -0.199652146229      2.117404697061      1.854484290819
H      0.546195526147      3.254517732748      1.502465457408
H     -1.190976866407      2.731737647558      2.637089869723
H      0.616804956283      1.603608078672      2.865779986221
初期パスを求めるための初期構造

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

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

python .\optmain.py .\heck_rxn_insertion.xyz -modelhess -os uma-s-1 -opt rsirfo_fsb -ma 200 1 13 200 2 15
  • -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(今日の年月日)ディレクトリの中に存在するディレクトリを開いて確認できる。

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

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

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

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

33
OptimizedStructure
C     -1.032100390838     -1.035550686512     -0.499635688220
C      0.010104465189     -0.523835962485     -1.531664219333
H     -0.421146697476      0.324490136927     -2.074452289930
H      0.133157384733     -1.321404712277     -2.277978583004
C     -2.368046916793     -1.235783351996     -1.235827531200
H     -2.689654798368     -0.364862803503     -1.812232342764
H     -2.270041885058     -2.054360409780     -1.958070686459
H     -3.169859022661     -1.507402859330     -0.546346963808
C     -0.622456251148     -2.427368202395     -0.009681490950
H     -1.322680643945     -2.806914845009      0.735047813124
H     -0.629254954731     -3.117181795013     -0.864166407865
H      0.365688844644     -2.443142233142      0.437886689012
Pd    -1.125799417674      0.259873864285      0.980052526621
Br     0.306058640853     -0.970893829846      2.656318969659
C      1.289621749332     -0.146589310382     -0.981732708807
C      1.536103930694      1.169107728609     -0.587457735922
C      2.305636875568     -1.079207424244     -0.784331944077
C      2.729016678327      1.533895108198      0.016785549082
H      0.777386052512      1.924725604234     -0.768410734187
C      3.500845678891     -0.723650421275     -0.177839782580
H      2.153156634569     -2.102775671521     -1.105886365114
C      3.714550358454      0.582721654604      0.234441976611
H      2.890465704150      2.562417789908      0.314631042052
H      4.267811725835     -1.472087152295     -0.025043526271
H      4.645533767041      0.859539003848      0.711547833672
P     -2.442032999849      1.615589963510     -0.239074071374
H     -2.560992252723      2.941717560530      0.206858808601
H     -2.179222205778      1.885594211469     -1.592780295468
H     -3.809948999356      1.317959980377     -0.348137654102
P     -1.046617235566      1.787279753945      2.871118363327
H     -1.688881882573      3.047000621707      2.919831876797
H     -1.483611731193      1.299268108234      4.109803064047
H      0.237209794935      2.221830580616      3.226426508832
初期パスを求めるための構造最適化の結果(安定構造ではない)

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

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

python .\nebmain.py heck_rxn_insertion_traj.xyz -os uma-s-1 -ns 20 -modelhess -spng -nd 0.3
  • -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.12と同じディレクトリ内に、NEBという名前を含むディレクトリが生成されている。 そのディレクトリ内のenergy_plot.csvを確認し、緩和後のパスのエネルギー極大値を示す構造を確認する。

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

NEB計算の結果の可視化
NEB計算の結果の可視化

bias_force_rms.csvにて、各Iterationごとのすべてのノードの勾配のRMS値を確認できる。

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

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

heck_rxn_insertion_traj_18.xyz

33
0 1
C      -1.064667990706     -1.078757601442     -1.032449638286
C       0.060649441057     -0.295267546574     -1.569761281104
H      -0.203070747611      0.565516581898     -2.176566458600
H       0.857468650364     -0.861169527956     -2.043353423277
C      -2.404747834970     -1.057611648813     -1.739998217332
H      -2.740062984579     -0.059445496244     -2.018663366855
H      -2.362296441929     -1.675496762694     -2.643902296003
H      -3.162310974634     -1.506163147485     -1.091806231802
C      -0.711668286474     -2.491252864709     -0.597165733850
H      -1.168649266637     -2.747760801885      0.357860639046
H      -1.063134938045     -3.198872918878     -1.355096747748
H       0.361115597021     -2.635507244962     -0.499861531906
Pd     -0.876499726750      0.433870331436      0.360237338728
Br     -1.077773295621     -0.886439339809      2.842681995974
C       1.188433691018      0.228454315734     -0.268531439340
C       1.919478476599      1.377380073334     -0.586806087159
C       1.822595466401     -0.797128206351      0.439693331216
C       3.268492752321      1.458838188710     -0.281639255604
H       1.429806042807      2.205327915912     -1.084924704221
C       3.174659166489     -0.722120799439      0.715022991317
H       1.259391545505     -1.644659098916      0.798756865117
C       3.912429791287      0.388386009178      0.327759144059
H       3.831066064826      2.343252627283     -0.550869648342
H       3.655925201794     -1.543837329557      1.227830125456
H       4.979210463883      0.421489339286      0.509890055506
P      -3.174925734259      0.754271815386      0.787158770080
H      -3.472984214002      1.562565834408      1.892997691480
H      -4.078571184626      1.353354784166     -0.120197907608
H      -3.934878396928     -0.378655260578      1.106331928691
P      -0.232196687722      2.271721172252      1.749403550394
H       0.084075387601      3.567961943007      1.287260673953
H      -1.040144434960      2.642082700665      2.833639607091
H       0.963785401479      2.005671963638      2.425069260929
NEB法により緩和したパスのエネルギー極大値を示す構造

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

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

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

python .\optmain.py heck_rxn_insertion_traj_18.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と同等)

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

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

33
OptimizedStructure
C     -1.232129585479     -1.104514734501     -1.164066362766
C      0.153348934321     -0.832351378113     -1.451705787254
H      0.354563257772     -0.233717010876     -2.331595346553
H      0.828176195267     -1.672634302057     -1.342394502314
C     -2.260056374668     -0.614563688910     -2.163139122142
H     -2.030218710181      0.386703427229     -2.528089139487
H     -2.290826086522     -1.294943853585     -3.022086171012
H     -3.263683018199     -0.600127543565     -1.735025895946
C     -1.546253304680     -2.452274575333     -0.552060960759
H     -2.548034730746     -2.474819116561     -0.123959078718
H     -1.504054514933     -3.224569436909     -1.329318947734
H     -0.849185479756     -2.707097346473      0.244900337310
Pd    -0.763741396532      0.328026419986      0.285060289160
Br    -0.843958723942     -1.108497240021      2.933335992712
C      1.290097988988      0.202956448514     -0.250504639739
C      1.868512205129      1.300066435959     -0.890623098069
C      2.051390899109     -0.548352164513      0.647026614285
C      3.176085066243      1.664570578958     -0.608162520789
H      1.290455779862      1.874883266856     -1.604957197067
C      3.356006710810     -0.175515675299      0.928097408906
H      1.603138650729     -1.394611649599      1.153974786672
C      3.921710511302      0.929305014993      0.304096707936
H      3.613994399937      2.523156323050     -1.101665732867
H      3.931519356213     -0.747619641668      1.644716641150
H      4.942905704874      1.212719271658      0.523331735789
P     -2.967920243589      0.416862252273      0.975487909366
H     -3.225478363757      1.031136872608      2.204778096648
H     -3.956757361014      1.065021342115      0.205438346830
H     -3.614773704328     -0.807617567602      1.168885594719
P     -0.051908647306      1.951578437330      1.896094134560
H      0.307784981991      3.265934434621      1.532730466391
H     -0.868124636877      2.250894538970      2.996433968197
H      1.127414239963      1.590011860465      2.554965472582
遷移状態構造

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

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

Mode                                 0                   1                   2
Freq [cm^-1]                     -369.3080             33.3753             48.4118
Reduced mass [au]                   6.9826              3.7624              4.4585
Force const [Dyne/A]               -0.5611              0.0025              0.0062
Char temp [K]                       0.0000             48.0195             69.6538
Normal mode                   x         y         z            x         y         z            x         y         z     
       C                 0.03613    0.05274    0.05702   -0.00318   -0.00602    0.00974   -0.02085    0.01431   -0.03154
       C                 0.10467    0.03810    0.04422    0.01918   -0.07296    0.05505   -0.00025   -0.04019    0.01886
       H                 0.03707   -0.03427   -0.02547    0.07461   -0.13127    0.02820    0.05505   -0.06981    0.01146
       H                 0.00306   -0.07094   -0.10158   -0.01771   -0.09290    0.13036   -0.03302   -0.05987    0.06984
       C                 0.04915    0.00137    0.00613    0.05664    0.02926   -0.03461    0.03590    0.07189   -0.06202
       H                 0.01554    0.00827    0.00197    0.12145    0.01076   -0.04467    0.10171    0.06050   -0.05196
       H                 0.08672   -0.00748    0.01071    0.05093    0.01548   -0.02353    0.02586    0.07642   -0.06534
       H                 0.04056   -0.02937   -0.01122    0.04278    0.09041   -0.06930    0.02382    0.12685   -0.09265
       C                 0.02960    0.02125   -0.00191   -0.08765    0.01535    0.01412   -0.10129    0.02109   -0.05681
       H                 0.01450    0.00328   -0.03626   -0.11463    0.05756   -0.04680   -0.13819    0.04463   -0.14173
       H                 0.06061    0.04378   -0.02391   -0.07055    0.00216    0.02820   -0.05811    0.01954   -0.05275
       H                 0.00239    0.00014    0.01544   -0.14299    0.00325    0.05864   -0.17030    0.00467   -0.00116
      Pd                -0.02221    0.00415    0.01123    0.01035   -0.00900    0.00821   -0.01244   -0.00795   -0.01096
      Br                 0.00124   -0.00053    0.00057   -0.02414   -0.01660    0.00143    0.05391    0.01386    0.00991
       C                 0.01070   -0.11349   -0.14735    0.00931   -0.00560    0.00330   -0.00870   -0.01779    0.01466
       C                -0.00359   -0.03769   -0.04658   -0.02145   -0.01403   -0.03976   -0.00371   -0.01983    0.01559
       C                -0.00973   -0.03557   -0.05025    0.03668    0.04009    0.01809   -0.01914   -0.01063    0.02868
       C                -0.02796    0.00746    0.01281   -0.02617    0.02368   -0.06822   -0.01100   -0.01039    0.03655
       H                 0.01829   -0.05925   -0.08199   -0.04214   -0.05143   -0.05314    0.00486   -0.02732    0.00257
       C                -0.03138    0.00545    0.00914    0.03324    0.07610   -0.01234   -0.02590   -0.00182    0.04863
       H                 0.00609   -0.06197   -0.08040    0.05964    0.04718    0.05077   -0.02335   -0.00930    0.02657
       C                -0.02765    0.00514    0.01226    0.00159    0.06824   -0.05484   -0.02268   -0.00058    0.05438
       H                -0.03955    0.02911    0.04086   -0.05088    0.01701   -0.10172   -0.00764   -0.01032    0.03967
       H                -0.04657    0.02174    0.03377    0.05568    0.11052   -0.00280   -0.03480    0.00447    0.06077
       H                -0.03257    0.01320    0.02557   -0.00120    0.09623   -0.07800   -0.02866    0.00773    0.07157
       P                 0.00678    0.00069   -0.00494    0.00447    0.03574   -0.01622   -0.00259   -0.02697    0.01911
       H                 0.02380    0.00518   -0.00495    0.00694    0.04631   -0.02080    0.01185   -0.01133    0.01433
       H                 0.00666    0.00075   -0.00434    0.02494    0.05441   -0.02638   -0.02816   -0.05415    0.02912
       H                 0.01705   -0.00377    0.00125   -0.02431    0.05140   -0.01401    0.02143   -0.03382    0.05294
       P                 0.00733    0.01100    0.01149    0.01433   -0.02960    0.02945   -0.01308    0.01210   -0.02834
       H                 0.00868    0.01616    0.02322    0.03900   -0.03273    0.04197   -0.04454    0.01533   -0.04812
       H                 0.02400    0.01528    0.02341   -0.00100   -0.02282    0.01617   -0.00039    0.00834   -0.01782
       H                 0.01018    0.01430    0.01208   -0.00279   -0.04931    0.04852    0.00561    0.04226   -0.04506

(...snip...)

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

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

終わりに#

   自作モジュールで、UMAモデルのニューラルネットワークポテンシャル(NNP)を用いて、Heck反応の 挿入素過程のある1つの遷移状態構造を算出する手順を説明した。

参考#

【計算化学】自作pythonモジュールで遷移状態構造を求めてみる(Heck反応, 挿入素過程, NNP使用)
https://ss0832.github.io/posts/20250814_mop_usage_48/
Author
ss0832
Published at
2025-08-14