LAMMPS can be run interactively using iPython easily. This tutorial shows how to set this up.
$LAMMPS_DIR
from now on)Compile LAMMPS as a shared library and enable exceptions and PNG support
cd $LAMMPS_DIR/src
make yes-molecule
make mpi mode=shlib LMP_INC="-DLAMMPS_PNG -DLAMMPS_EXCEPTIONS" JPG_LIB="-lpng"
Create a python virtualenv
virtualenv testing
source testing/bin/activate
Inside the virtualenv install the lammps package
(testing) cd $LAMMPS_DIR/python
(testing) python install.py
(testing) cd # move to your working directory
Install jupyter and ipython in the virtualenv
(testing) pip install ipython jupyter
Run jupyter notebook
(testing) jupyter notebook
In [ ]:
from lammps import IPyLammps
In [ ]:
L = IPyLammps()
In [ ]:
# 2d circle of particles inside a box with LJ walls
import math
b = 0
x = 50
y = 20
d = 20
# careful not to slam into wall too hard
v = 0.3
w = 0.08
L.units("lj")
L.dimension(2)
L.atom_style("bond")
L.boundary("f f p")
L.lattice("hex", 0.85)
L.region("box", "block", 0, x, 0, y, -0.5, 0.5)
L.create_box(1, "box", "bond/types", 1, "extra/bond/per/atom", 6)
L.region("circle", "sphere", d/2.0+1.0, d/2.0/math.sqrt(3.0)+1, 0.0, d/2.0)
L.create_atoms(1, "region", "circle")
L.mass(1, 1.0)
L.velocity("all create 0.5 87287 loop geom")
L.velocity("all set", v, w, 0, "sum yes")
L.pair_style("lj/cut", 2.5)
L.pair_coeff(1, 1, 10.0, 1.0, 2.5)
L.bond_style("harmonic")
L.bond_coeff(1, 10.0, 1.2)
L.create_bonds("many", "all", "all", 1, 1.0, 1.5)
L.neighbor(0.3, "bin")
L.neigh_modify("delay", 0, "every", 1, "check yes")
L.fix(1, "all", "nve")
L.fix(2, "all wall/lj93 xlo 0.0 1 1 2.5 xhi", x, "1 1 2.5")
L.fix(3, "all wall/lj93 ylo 0.0 1 1 2.5 yhi", y, "1 1 2.5")
In [ ]:
L.image(zoom=1.8)
In [ ]:
L.thermo_style("custom step temp epair press")
L.thermo(100)
output = L.run(40000)
L.image(zoom=1.8)
In [ ]:
L.system
In [ ]:
L.system.natoms
In [ ]:
L.system.nbonds
In [ ]:
L.system.nbondtypes
In [ ]:
L.communication
In [ ]:
L.fixes
In [ ]:
L.computes
In [ ]:
L.dumps
In [ ]:
L.groups
In [ ]:
L.variable("a index 2")
In [ ]:
L.variables
In [ ]:
L.variable("t equal temp")
In [ ]:
L.variables
In [ ]:
import sys
if sys.version_info < (3, 0):
# In Python 2 'print' is a restricted keyword, which is why you have to use the lmp_print function instead.
x = float(L.lmp_print('"${a}"'))
else:
# In Python 3 the print function can be redefined.
# x = float(L.print('"${a}"')")
# To avoid a syntax error in Python 2 executions of this notebook, this line is packed into an eval statement
x = float(eval("L.print('\"${a}\"')"))
x
In [ ]:
L.variables['t'].value
In [ ]:
L.eval("v_t/2.0")
In [ ]:
L.variable("b index a b c")
In [ ]:
L.variables['b'].value
In [ ]:
L.eval("v_b")
In [ ]:
L.variables['b'].definition
In [ ]:
L.variable("i loop 10")
In [ ]:
L.variables['i'].value
In [ ]:
L.next("i")
L.variables['i'].value
In [ ]:
L.eval("ke")
In [ ]:
L.atoms[0]
In [ ]:
[x for x in dir(L.atoms[0]) if not x.startswith('__')]
In [ ]:
L.atoms[0].position
In [ ]:
L.atoms[0].id
In [ ]:
L.atoms[0].velocity
In [ ]:
L.atoms[0].force
In [ ]:
L.atoms[0].type
In [ ]: