# i-PI

i-PI is a Python interface for ab initio path integral molecular dynamics simulations. i-PI is composed of a Python server (i-pi itself, that does not need to be compiled but only requires a relatively recent version of Python and Numpy) that propagates the (path integral) dynamics of the nuclei, and of an external code that acts as a client and computes the electronic energy and forces.

The i-PI documentation can be found at https://ipi-code.org.

Please cite Kapil2016 and Kapil2018 if you use i-PI with CP2K.

Published work using i-PI with CP2K:

- J. Phys. Chem. Lett. 2020, 11, 9, 3724–3730

- PNAS 01, 22, 2019 116 (4) 1110-1115

- Nature Communications 12, 766 (2021)

## Download i-PI from Github

    git clone https://github.com/i-pi/i-pi.git

To run i-PI, one need to source the environment file from the i-PI directory

    source ${PATH_TO_IPI}/env.sh

Then one can run i-PI by using

    i-pi input.xml > log &

There are many input examples in i-pi examples folder, which contains different methods, e.g. NVE, NVT, NPT, PIMD, REMP, etc.

## Run i-PI with INET socket

To use CP2K as the client code using an internet domain socket on the HOST address “host_address” and on the PORT number “port” the following lines must be added to its input file:

    &MOTION
    ...
       &DRIVER
          HOST host_address
          PORT port
       &END DRIVER
    ...
    &END MOTION

In the `input.xml`, one need to use the same host_address and port to CP2K input.

    <ffsocket mode='inet' name='driver'>
      <address>host_address</address>
      <port>port</port>
      <latency>0.01</latency>
      <timeout>5000</timeout>
    </ffsocket>

## Run i-PI with UNIX socket

If instead a UNIX domain socket is required then the following modification is necessary:

    &MOTION
    ...
       &DRIVER
          HOST host_address
          PORT port
          UNIX
       &END DRIVER
       ...
    &END MOTION

In the input.xml, one to specify the mode=unix to enable the communication via UNIX socket.

    <ffsocket mode='unix' name='driver'>
      <address>host_address</address>
      <port>port</port>
      <latency>0.01</latency>
      <timeout>5000</timeout>
    </ffsocket>

## Run I-PI with CP2K on a supercomputer

To run I-PI with CP2K on a supercomputer is also straightforward, one needs to get the hostname where the i-PI is executed, and then replace this variable in the CP2K input files. Here is an example script one can use to run I-PI with CP2K on the Daint machine (CSCS).

    HOST=$(hostname)

    source ~/i-pi/env.sh

    if [ -e simulation.restart ]; then
       sed -i "s/address>[^<]*</address>$HOST</" simulation.restart
       i-pi simulation.restart  >> log.ipi 2>&1 &
    else
       sed -i "s/address>[^<]*</address>$HOST</" input.xml
       i-pi input.xml &> log.ipi &
    fi
    sleep 5

    sed -i "s/HOST.*/HOST $HOST/" cp2k.inp

    srun cp2k.psmp -i cp2k.inp -o cp2k.out

    wait