In [1]:
from __future__ import print_function
In [2]:
%matplotlib notebook
import matplotlib.pyplot as plt
In [3]:
import random, math
In [4]:
from lammps import IPyLammps
In [5]:
L = IPyLammps()
In [6]:
L.units("lj")
L.atom_style("atomic")
L.atom_modify("map array sort", 0, 0.0)
L.dimension(2)
L.lattice("hex", 1.0)
L.region("box block", 0, 10, 0, 5, -0.5, 0.5)
L.create_box(1, "box")
L.create_atoms(1, "box")
L.mass(1, 1.0)
L.pair_style("lj/cut", 2.5)
L.pair_coeff(1, 1, 1.0, 1.0, 2.5)
L.pair_modify("shift", "yes")
L.neighbor(0.3, "bin")
L.neigh_modify("delay", 0, "every", 1, "check", "yes")
In [7]:
L.image(zoom=1.6)
Out[7]:
In [8]:
L.run(0);
In [9]:
emin = L.eval("pe")
In [10]:
L.dump("3 all movie 25 movie.mp4 type type zoom 1.6 adiam 1.0")
In [11]:
random.seed(27848)
deltaperturb = 0.2
In [12]:
for i in range(L.system.natoms):
x, y = L.atoms[i].position
dx = deltaperturb * random.uniform(-1, 1)
dy = deltaperturb * random.uniform(-1, 1)
L.atoms[i].position = (x+dx, y+dy)
In [13]:
L.run(0);
In [14]:
L.image(zoom=1.6)
Out[14]:
In [15]:
estart = L.eval("pe")
elast = estart
In [16]:
naccept = 0
In [17]:
energies = [estart]
In [18]:
niterations = 3000
deltamove = 0.1
kT = 0.05
In [19]:
natoms = L.system.natoms
for i in range(niterations):
iatom = random.randrange(0, natoms)
current_atom = L.atoms[iatom]
x0, y0 = current_atom.position
dx = deltamove * random.uniform(-1, 1)
dy = deltamove * random.uniform(-1, 1)
current_atom.position = (x0+dx, y0+dy)
L.run(1, "pre no post no")
e = L.eval("pe")
energies.append(e)
if e <= elast:
naccept += 1
elast = e
elif random.random() <= math.exp(natoms*(elast-e)/kT):
naccept += 1
elast = e
else:
current_atom.position = (x0, y0)
In [20]:
plt.xlabel('iteration')
plt.ylabel('potential energy')
plt.plot(energies)
Out[20]:
In [21]:
L.eval("pe")
Out[21]:
In [22]:
emin
Out[22]:
In [23]:
estart
Out[23]:
In [24]:
naccept
Out[24]:
In [25]:
L.image(zoom=1.6)
Out[25]:
In [26]:
# close dump file to access it
L.undump(3)
In [27]:
L.video("movie.mp4")
Out[27]:
In [ ]: