from lammps import IPyLammps

L = IPyLammps()

# 3d Lennard-Jones melt

L.units("lj")
L.atom_style("atomic")
L.atom_modify("map array")

L.lattice("fcc", 0.8442)
L.region("box block", 0, 4, 0, 4, 0, 4)
L.create_box(1, "box")
L.create_atoms(1, "box")
L.mass(1, 1.0)

L.velocity("all create", 1.44, 87287, "loop geom")

L.pair_style("lj/cut", 2.5)
L.pair_coeff(1, 1, 1.0, 1.0, 2.5)

L.neighbor(0.3, "bin")
L.neigh_modify("delay 0 every 20 check no")

L.fix("1 all nve")

L.variable("fx atom fx")

L.run(10)

L.image(zoom=1)

"""
Explanation: Using LAMMPS with iPython and Jupyter
LAMMPS can be run interactively using iPython easily. This tutorial shows how to set this up.
Installation

Download the latest version of LAMMPS into a folder (we will calls this $LAMMPS_DIR from now on)

Compile LAMMPS as a shared library and enable exceptions and PNG support
   bash
   cd $LAMMPS_DIR/src
   python Make.py -m mpi -png -s exceptions -a file
   make mode=shlib auto


Create a python virtualenv
   bash
   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
   bash
   (testing) pip install ipython jupyter


Run jupyter notebook
   bash
   (testing) jupyter notebook


Example
End of explanation
"""


L.system

L.system.natoms

L.communication

L.fixes

L.computes

L.dumps

L.groups

"""
Explanation: Queries about LAMMPS simulation
End of explanation
"""


L.variable("a index 2")

L.variables

L.variable("t equal temp")

L.variables

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

L.variables['t'].value

L.eval("v_t/2.0")

L.variable("b index a b c")

L.variables['b'].value

L.eval("v_b")

L.variables['b'].definition

L.variable("i loop 10")

L.variables['i'].value

L.next("i")
L.variables['i'].value

L.eval("ke")

"""
Explanation: Working with LAMMPS Variables
End of explanation
"""


L.atoms[0]

[x for x in dir(L.atoms[0]) if not x.startswith('__')]

L.atoms[0].position

L.atoms[0].id

L.atoms[0].velocity

L.atoms[0].force

L.atoms[0].type

L.variables['fx'].value

"""
Explanation: Accessing Atom data
End of explanation
"""


L.runs

L.runs[0]

L.runs[0].thermo

L.runs[0].thermo.Temp

"""
Explanation: Accessing thermo data
End of explanation
"""


L.write_script("in.output")

"""
Explanation: Saving session to as LAMMPS input file
End of explanation
"""


