Setting up an OPLS force field calculation

Setting up an OPLS force field calculation#

In order to facilitate the definition of structures for the use of OPLS force fields, there are some helper classes.

Modified xyz#

Suppose, we define the ethanal molecule as extended xyz file (172_ext.xyz):

7
Lattice="6.0 0.0 0.0 0.0 6.0 0.0 0.0 0.0 6.0" Properties=species:S:1:pos:R:3:molid:I:1:type:S:1 pbc="T T T"
O       1.613900000000000     -0.762100000000000     -0.000000000000000 1 O
C      -0.327900000000000      0.522700000000000      0.000000000000000 1 CT
C       0.392400000000000     -0.722900000000000     -0.000000000000000 1 C
H      -0.960000000000000      0.580900000000000      0.887500000000000 1 HC
H      -0.960000000000000      0.580900000000000     -0.887500000000000 1 HC
H       0.346400000000000      1.382000000000000      0.000000000000000 1 HC
H      -0.104900000000000     -1.581400000000000     -0.000000000000000 1 H1


Then we can read and view the structure using:

from ase.io.opls import OPLSStructure
from ase.visualize import view

# 172_mod.xyz if the file name for the structure above
s = OPLSStructure('172_mod.xyz')
view(s)  # view with real elements
elements = {'CT': 'Si', 'HC': 'H', 'H1': 'He'}
view(s.colored(elements))  # view with fake elements

Defining the force field#

The definitions of the force field can be stored in an Amber like style (172_defs.par):

# the blocks are separated by empty lines
# comments are allowed
#
# one body - LJ-parameters and charge
CT 0.0028619844 3.50  0.000
C  0.0028619844 3.50  0.000
O  0.0073717780 3.12 -0.683
HC 0.0013009018 2.50  0.000
H1 0 0 0

# bonds
C -CT  13.75    1.522       JCC,7,(1986),230; AA
C -O   24.72   1.229       JCC,7,(1986),230; AA,CYT,GUA,THY,URA
CT-HC  14.74    1.090       changed from 331 bsd on NMA nmodes; AA, SUGARS
C -H1  14.74    1.090

# angles
CT-C -O     3.47     120.40
HC-CT-HC    1.52      109.50
CT-C -H1    3.04      117.00

# dihedrals
O -C -CT-HC      0.0 0.0 0.0 0.0

# cutoffs
C -CT 2.0
C -O  1.8
CT-HC 1.4
C -H1 1.4
C3-O1 1.8 # extra stuff, should not bother

We can write LAMMPS input using the information above:

from ase.io.opls import OPLSff, OPLSStructure

s = OPLSStructure('172_ext.xyz')
with open('172_defs.par') as fd:
    opls = OPLSff(fd)
opls.write_lammps(s, prefix='lmp')

which writes the LAMMPS input files lmp_atoms defining atoms, bonds, etc., and lmp_opls defining the corresponding OPLS force field. A rudimentary lmp_in is also written.