i-PI Path Integral MD with AMS

Use AMS as an ASE socket client for an i-PI path-integral molecular dynamics setup. The notebook prepares the i-PI input files and the AMS client script needed for a short RPMD run.

Note

i-PI is not included with AMS and is not supported by SCM.

Downloads: Notebook | Script ?

Requires: AMS2026 or later

Related examples
Related documentation

i-PI path integral MD with AMS

This example prepares the files needed to couple i-PI to AMS through the ASE socket interface.

i-PI can be used to run, for example, path integral molecular dynamics. The example shows how to run thermostatted ring polymer molecular dynamics for a water molecule, together with the UFF force field.

For more information about i-PI, refer to the i-PI documentation and examples.

Note that the provided setup uses a Unix socket and therefore runs on Linux.

Create Input File for i-PI

First, write the input for i-PI to an xml file.

from pathlib import Path

Path("input.xml").write_text(
    """\
<simulation mode="md" verbosity="medium">
   <output prefix='simulation'>
      <properties stride='10' filename='out'> [ step, time{picosecond}, conserved{electronvolt}, temperature{kelvin}, pressure_cv{megapascal} ] </properties>
      <trajectory filename='pos' stride='10'> positions{angstrom} </trajectory>
      <trajectory filename='xc' stride='10'> x_centroid{angstrom} </trajectory>
      <trajectory filename='vc' stride='10'> v_centroid </trajectory>
      <checkpoint stride='4000'/>
   </output>
   <total_steps> 40 </total_steps>
   <!-- <total_time> 840000000 </total_time> -->
   <prng><seed> 31415 </seed></prng>
   <ffsocket name="ase" mode="unix">
      <address> driver-irpmd-16 </address>
   </ffsocket>
   <system>
      <initialize nbeads='8'>
         <file mode='xyz' units='angstrom'> firstframe.xyz </file>
         <velocities mode="thermal" units='kelvin'> 300 </velocities>
         <cell units='angstrom' mode='abc'> [ 12.412, 12.412, 12.412 ] </cell>
      </initialize>
      <forces><force forcefield="ase"> </force></forces>
      <motion mode='dynamics'>
         <dynamics mode='nvt'>
           <timestep units='femtosecond'> 0.25 </timestep>
           <thermostat mode='pile_g'>
             <tau units='femtosecond'> 100 </tau>
             <pile_lambda> 0.5 </pile_lambda>
           </thermostat>
         </dynamics>
      </motion>
      <ensemble>
         <temperature units='kelvin'> 300 </temperature>
      </ensemble>
   </system>
</simulation>
    """
);

Create a simple xyz file with a water molecule:

Path("firstframe.xyz").write_text(
    """\
3

O -0.691870 1.324715 0.212227
H -1.523797 1.656370 -0.135379
H -0.797941 0.389809 0.486593
VEC1 12.412 0. 0.
VEC2 0. 12.412 0.
VEC3 0. 0. 12.412
"""
);

Create script to launch i-PI server (the variable ipi_exec can be adjusted to your installation).

ipi_exec = "i-pi"
Path("run-server.sh").write_text(
    f"""\
#!/usr/bin/env bash
# Example launcher for i-PI server
{ipi_exec} input.xml
"""
);

Launch the i-PI Server

Now in a separate window, run sh run-server.sh. Once the server is up and running we can proceed with the AMS calculation.

i-PI is external to AMS and must be installed separately. The provided setup uses a Unix socket and therefore runs on Linux and Mac.

print("Start i-PI server by running in a new terminal: 'sh run-server.sh'")
Start i-PI server by running in a new terminal: 'sh run-server.sh'

Run AMS Calculator

from ase.calculators.socketio import SocketClient
from ase.io import read
from scm.plams import Settings, from_smiles
from scm.plams.interfaces.adfsuite.ase_calculator import AMSCalculator
atoms = read("firstframe.xyz")

sett = Settings()
sett.input.ams.Task = "SinglePoint"
sett.input.ams.Properties.Gradients = "True"
sett.input.ams.Properties.StressTensor = "False"
sett.input.forcefield.type = "UFF"
sett.runscript.nproc = 1

with AMSCalculator(settings=sett, amsworker=True) as calc:
    atoms.calc = calc
    client = SocketClient(unixsocket="driver-irpmd-16")
    client.run(atoms, use_stress=False)

See also

Python Script

#!/usr/bin/env python
# coding: utf-8

# ## i-PI path integral MD with AMS
#
# This example prepares the files needed to couple [i-PI](https://ipi-code.org/) to AMS through the ASE socket interface.
#
# i-PI can be used to run, for example, path integral molecular dynamics. The example shows how to run thermostatted ring polymer molecular dynamics for a water molecule, together with the UFF force field.
#
# For more information about i-PI, refer to the i-PI documentation and examples.
#
# Note that the provided setup uses a Unix socket and therefore runs on Linux.

# ### Create Input File for i-PI

# First, write the input for i-PI to an xml file.

from pathlib import Path

Path("input.xml").write_text(
    """\
<simulation mode="md" verbosity="medium">
   <output prefix='simulation'>
      <properties stride='10' filename='out'> [ step, time{picosecond}, conserved{electronvolt}, temperature{kelvin}, pressure_cv{megapascal} ] </properties>
      <trajectory filename='pos' stride='10'> positions{angstrom} </trajectory>
      <trajectory filename='xc' stride='10'> x_centroid{angstrom} </trajectory>
      <trajectory filename='vc' stride='10'> v_centroid </trajectory>
      <checkpoint stride='4000'/>
   </output>
   <total_steps> 40 </total_steps>
   <!-- <total_time> 840000000 </total_time> -->
   <prng><seed> 31415 </seed></prng>
   <ffsocket name="ase" mode="unix">
      <address> driver-irpmd-16 </address>
   </ffsocket>
   <system>
      <initialize nbeads='8'>
         <file mode='xyz' units='angstrom'> firstframe.xyz </file>
         <velocities mode="thermal" units='kelvin'> 300 </velocities>
         <cell units='angstrom' mode='abc'> [ 12.412, 12.412, 12.412 ] </cell>
      </initialize>
      <forces><force forcefield="ase"> </force></forces>
      <motion mode='dynamics'>
         <dynamics mode='nvt'>
           <timestep units='femtosecond'> 0.25 </timestep>
           <thermostat mode='pile_g'>
             <tau units='femtosecond'> 100 </tau>
             <pile_lambda> 0.5 </pile_lambda>
           </thermostat> 
         </dynamics>
      </motion>
      <ensemble>
         <temperature units='kelvin'> 300 </temperature>
      </ensemble>
   </system>
</simulation>
    """
)
# Create a simple xyz file with a water molecule:

Path("firstframe.xyz").write_text(
    """\
3

O -0.691870 1.324715 0.212227
H -1.523797 1.656370 -0.135379
H -0.797941 0.389809 0.486593
VEC1 12.412 0. 0.
VEC2 0. 12.412 0.
VEC3 0. 0. 12.412
"""
)
# Create script to launch i-PI server (the variable `ipi_exec` can be adjusted to your installation).

ipi_exec = "i-pi"
Path("run-server.sh").write_text(
    f"""\
#!/usr/bin/env bash
# Example launcher for i-PI server 
{ipi_exec} input.xml
"""
)
# ### Launch the i-PI Server

# Now in a separate window, run `sh run-server.sh`. Once the server is up and running we can proceed with the AMS calculation.
#
# i-PI is external to AMS and must be installed separately. The provided setup uses a Unix socket and therefore runs on Linux and Mac.

print("Start i-PI server by running in a new terminal: 'sh run-server.sh'")


# ### Run AMS Calculator

from ase.calculators.socketio import SocketClient
from ase.io import read
from scm.plams import Settings, from_smiles
from scm.plams.interfaces.adfsuite.ase_calculator import AMSCalculator


atoms = read("firstframe.xyz")

sett = Settings()
sett.input.ams.Task = "SinglePoint"
sett.input.ams.Properties.Gradients = "True"
sett.input.ams.Properties.StressTensor = "False"
sett.input.forcefield.type = "UFF"
sett.runscript.nproc = 1

with AMSCalculator(settings=sett, amsworker=True) as calc:
    atoms.calc = calc
    client = SocketClient(unixsocket="driver-irpmd-16")
    client.run(atoms, use_stress=False)