HPCシステムズではエンジニアを募集しています。詳しくはこちらをご覧ください。
HPCシステムズのエンジニア達による技術ブログ

Tech Blog

VASP 6.4.1:i-PIを用いて経路積分分子動力学

LAMMPSユーザーの場合は、古くからtoolsに含まれているのでi-PIをご存じの方は多いと思いますが、VASPのユーザーの場合、知らないという方も多いかと思います。

i-PI: a universal force engine
Home-page for the i-PI universal interface for atomistic simulations.

i-PI は、Python で書かれたab initio 経路積分分子動力学(PIMD)の Python インターフェイスです。原子間の相互作用の ab-initio、機械学習、または力場ベースの評価と併用するように設計されています。イオンの位置の問題と、原子間力を計算する問題を切り離すという目的の為に開発されました。i-PI がサーバーとして機能し、位置エネルギー、力、および圧力ビルアルの位置エネルギー部分の計算はi-PIが行ないます。

Pythonとしてはかなり重い計算を行なう事になるのですが、この部分はnumpyで実行します。このくらいの規模になるとnumpyで使用しているBLASの性能が大きく影響する為、開発陣もnumpyではMKLを使用する事を勧めています。

MKLを使用したnumpyに関しては、こちらの記事 で紹介しているので、ご参考にして下さい。

このi-PIですが、LAMMPSでの使用は有名ですが、ab-initioの部分をVASPで実行してしまう事が可能です。ただし、VASPそのままではi-PIサーバーとの通信が出来ない為、ソースにi-PI用のパッチを当てる必要があります。patch はこちらのページにVASP 5.4.4、6.2.1および6.3.0用があります。残念ながらVASP 6.4.1用はありませんでした。VASP 6.4.1のソースとi-PI VASP 6.3.0 patchを見比べてみたところ、patchがinsertされる部分は同じだったので、手動でpatchを当ててみました。

手動でpatchを当ててビルドしたバイナリを使用して、i-PIのVASP用のexampleを動かしてみました。

cd water-1-npt-md-vasp; i-pi input.xml & sleep 5; \
  for i in `seq 1 1`; do mkdir -p run_$i; cp INCAR KPOINTS POTCAR POSCAR run_$i;
 cd run_$i; vasp_std-ipi & cd ..; done; \
wait
cp: cannot stat 'KPOINTS': No such file or directory
 running    1 mpi-ranks, on    1 nodes
 distrk:  each k-point on    1 cores,    1 groups
 distr:  one band on    1 cores,    1 groups
 vasp.6.4.1 05Apr23 (build Apr 20 2023 16:08:20) complex                        
  
 POSCAR found type information on POSCAR O H 
 POSCAR found :  2 types and       3 ions
 Reading from existing POTCAR
 scaLAPACK will be used
 Reading from existing POTCAR
 LDA part: xc-table for Pade appr. of Perdew
  DRIVER - Connecting to host localhost
  on port        23333  using an internet socket.
 VASP ipi driver (written by Wei Fang) successfully starting
  @ DRIVER MODE: Message from server: STATUS
  @ DRIVER MODE: Message from server: STATUS
  @ DRIVER MODE: Message from server: POSDATA
  @ DRIVER MODE: Received initial lattice 
  @ DRIVER MODE: Received initial positions 
 -----------------------------------------------------------------------------
|                                                                             |
|           W    W    AA    RRRRR   N    N  II  N    N   GGGG   !!!           |
|           W    W   A  A   R    R  NN   N  II  NN   N  G    G  !!!           |
|           W    W  A    A  R    R  N N  N  II  N N  N  G       !!!           |
|           W WW W  AAAAAA  RRRRR   N  N N  II  N  N N  G  GGG   !            |
|           WW  WW  A    A  R   R   N   NN  II  N   NN  G    G                |
|           W    W  A    A  R    R  N    N  II  N    N   GGGG   !!!           |
|                                                                             |
|     The requested file  could not be found or opened for reading            |
|     k-point information. Automatic k-point generation is used as a          |
|     fallback, which may lead to unwanted results.                           |
|                                                                             |
 -----------------------------------------------------------------------------

 INCAR ok, starting setup
 POSCAR ok, starting setup
 FFT: planning ... GRIDC
 FFT: planning ... GRID_SOFT
 FFT: planning ... GRID
 WAVECAR not read
 entering main loop
       N       E                     dE             d eps       ncg     rms     
     rms(c)
DAV:   1     0.396267865901E+02    0.39627E+02   -0.23087E+03   192   0.467E+02
DAV:   2    -0.128657296769E+02   -0.52493E+02   -0.51962E+02   200   0.135E+02
DAV:   3    -0.162114941026E+02   -0.33458E+01   -0.33559E+01   128   0.408E+01
DAV:   4    -0.162437504688E+02   -0.32256E-01   -0.32203E-01   208   0.436E+00
DAV:   5    -0.162437999012E+02   -0.49432E-04   -0.49431E-04   168   0.126E-01    0.789E+00
DAV:   6    -0.143805787674E+02    0.18632E+01   -0.93029E+00   136   0.214E+01    0.326E+00
DAV:   7    -0.142757331033E+02    0.10485E+00   -0.95919E-02   200   0.260E+00    0.199E+00
DAV:   8    -0.141981664700E+02    0.77567E-01   -0.69247E-02   176   0.246E+00    0.200E-01
DAV:   9    -0.142023545980E+02   -0.41881E-02   -0.26790E-03   200   0.312E-01    0.131E-01
DAV:  10    -0.142097352605E+02   -0.73807E-02   -0.40226E-03   160   0.512E-01    0.654E-02
DAV:  11    -0.142162092838E+02   -0.64740E-02   -0.51823E-03   152   0.411E-01    0.103E-01
DAV:  12    -0.142175582968E+02   -0.13490E-02   -0.13316E-03   200   0.239E-01    0.306E-02
DAV:  13    -0.142189978608E+02   -0.14396E-02   -0.26874E-04   160   0.112E-01    0.111E-02
DAV:  14    -0.142192559635E+02   -0.25810E-03   -0.35299E-05   184   0.313E-02    0.109E-02
DAV:  15    -0.142193887888E+02   -0.13283E-03   -0.26567E-05   160   0.295E-02    0.104E-03
DAV:  16    -0.142194118473E+02   -0.23058E-04   -0.21435E-06   176   0.828E-03    0.144E-03
DAV:  17    -0.142194240937E+02   -0.12246E-04   -0.16195E-06   168   0.629E-03    0.349E-04
DAV:  18    -0.142194268530E+02   -0.27594E-05   -0.11865E-07   200   0.224E-03
   1 F= -.14219427E+02 E0= -.14223292E+02  d E =0.115962E-01
  @ DRIVER MODE: Message from server: STATUS
  @ DRIVER MODE: Message from server: GETFORCE
  @ DRIVER MODE: Returning v,forces,stress
~~~~~~~~~~~~~~~~~~
中略
~~~~~~~~~~~~~~~~~~
 # Average timings at MD step      90. t/step: 2.89977e+00
 @SOCKET: 23/05/17-18:03:47 Assigning [match] request id    0 to client with last-id    0 (  0/  1 : ('127.0.0.1', 39840))
 # Average timings at MD step      91. t/step: 2.87474e+00
 @SOCKET: 23/05/17-18:03:50 Assigning [match] request id    0 to client with last-id    0 (  0/  1 : ('127.0.0.1', 39840))
 # Average timings at MD step      92. t/step: 2.86642e+00
 @SOCKET: 23/05/17-18:03:53 Assigning [match] request id    0 to client with last-id    0 (  0/  1 : ('127.0.0.1', 39840))
 # Average timings at MD step      93. t/step: 2.86649e+00
 @SOCKET: 23/05/17-18:03:55 Assigning [match] request id    0 to client with last-id    0 (  0/  1 : ('127.0.0.1', 39840))
 # Average timings at MD step      94. t/step: 2.92478e+00
 @SOCKET: 23/05/17-18:03:58 Assigning [match] request id    0 to client with last-id    0 (  0/  1 : ('127.0.0.1', 39840))
 # Average timings at MD step      95. t/step: 2.86643e+00
 @SOCKET: 23/05/17-18:04:01 Assigning [match] request id    0 to client with last-id    0 (  0/  1 : ('127.0.0.1', 39840))
 # Average timings at MD step      96. t/step: 2.86641e+00
 @SOCKET: 23/05/17-18:04:04 Assigning [match] request id    0 to client with last-id    0 (  0/  1 : ('127.0.0.1', 39840))
 # Average timings at MD step      97. t/step: 2.86643e+00
 @SOCKET: 23/05/17-18:04:07 Assigning [match] request id    0 to client with last-id    0 (  0/  1 : ('127.0.0.1', 39840))
 # Average timings at MD step      98. t/step: 2.86646e+00
 @SOCKET: 23/05/17-18:04:10 Assigning [match] request id    0 to client with last-id    0 (  0/  1 : ('127.0.0.1', 39840))
 # Average timings at MD step      99. t/step: 2.86648e+00
SOFTEXIT CALLED FROM THREAD   @ SIMULATION: Exiting cleanly.
 !W! Soft exit has been requested with message: ' @ SIMULATION: Exiting cleanly.'. Cleaning up.
 @SOCKET: Shutting down the driver interface.
SOFTEXIT: Saving the latest status at the end of the step
Backup performed: RESTART -> #RESTART#0#

このように、i-PIとVASPとの間でソケット通信を行なって、PIMDが実行出来ました。

系に重い原子を使用している場合には、あまり関係は無いかもしれませんが、軽い原子を使用している場合、量子効果の影響が出て、実際の分子のふるまいとシミュレーションがズレてしまっているかもしれません。そういった場合、PIMDを使用して比較するなどが必要になる場合もあるかと思います。

PIMDの為にシミュレーションを行なうアプリを変えると、使い方や計算手法、解析方法などに関して、新しいアプリで経験を積んだり、ツールを新しく揃えたりする必要がありますが、i-PIを使えば、慣れ親しんだVASPをそのまま使用してPIMDをかなりお手軽に行なう事が可能となります。

もっとも、MKL版のnumpyでないと計算に時間が余計にかかったり、numpyのバージョンは1.23まででないとnumpy 1.24の仕様変更の問題が起きる場合があるなど、Python特有の面倒な部分が無い訳ではありませんが、まったく新しいアプリを導入するよりは敷居はかなり低いのではないでしょうか。

i-PI用のpatchを当てたVASP 6.4.1については弊社にお問い合わせ下さい。