Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
425 views

Python Verlet

The document describes how to write a molecular dynamics program in Python using the Verlet algorithm. It includes how to write functions to calculate the Lennard-Jones potential between atom pairs, the total potential and kinetic energy of the system, atomic accelerations using finite differences, and implementing the Verlet algorithm to update atomic positions and velocities over simulation steps. The program takes atomic properties like masses and initial coordinates as input, calculates forces and energies, then outputs atomic positions in xyz format with the total energy at each step.

Uploaded by

Marco Santia
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
425 views

Python Verlet

The document describes how to write a molecular dynamics program in Python using the Verlet algorithm. It includes how to write functions to calculate the Lennard-Jones potential between atom pairs, the total potential and kinetic energy of the system, atomic accelerations using finite differences, and implementing the Verlet algorithm to update atomic positions and velocities over simulation steps. The program takes atomic properties like masses and initial coordinates as input, calculates forces and energies, then outputs atomic positions in xyz format with the total energy at each step.

Uploaded by

Marco Santia
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

Verlet Algorithm in Python

Introduction
The goal is to write a simple molecular dynamics program in Python. The program will read initial atomic
coordinates, and will print in a xyz file the coordinates of the atoms at every step of the dynamics. The
xyz file will be readable by molden for example.
We will have to program:

1. The potential energy for a pair of atoms (Lennard-Jones potential)


2. The potential and kinetic energy of a system of atoms
3. The acceleration of the particles by finite difference
4. The Verlet algorithm
The following parameters will be used for the Argon atom:

mass : 39.948 g/mol


= 0.0661 j/mol
= 0.3345 nm
The atom coordinates will be expressed in nm.

Lennard-Jones potential
Write a function that computes the Lennard-Jones potential:

V(r) =4 (r )12 (r )6
The values of and will be given as global variables at the beginning of the script.
This is the output you should get:

Enter inter-atomic distance?


0.3
V = 0.468192418088

Molecular geometry
Read the molecular data
Modify your program such that it reads from the standard input:

The number of atoms


The atomic masses
The atomic coordinates (x,y,z on each line)

def main():
Natoms = read_Natoms()
mass = read_atom_mass(Natoms)
coord = read_atom_coord(Natoms)
print mass
print coord

The output should be


Number of atoms?
3
For each atom: mass
40
10
20
For each atom: x, y, z
0 0 0
1 2 3
-1 0 2
mass = [40.0, 10.0, 20.0]
coord = [[0.0, 0.0, 0.0], [1.0, 2.0, 3.0], [-1.0, 0.0, 2.0]]

Compute the distance matrix


Add a function to your program to compute the distance matrix:

def main():
Natoms = read_Natoms()
coord = read_atom_coord(Natoms)
distances = get_distances(coord)
for d in distances:
print d

The output should be

Number of atoms?
3
For each atom: x, y, z
0 0 0
1 2 3
-1 0 2
[0.0, 3.7416573867739413, 2.23606797749979]
[3.7416573867739413, 0.0, 3.0]
[2.23606797749979, 3.0, 0.0]

Potential for multiple atoms


Change your Lennard-Jones function such that it computes the Lennard-Jones potential of the whole
system:
NatomsNatoms
XX
VLJ = V(rij)
i =1 j >i

The main function should look like this:

def main():
Natoms = read_Natoms()
coord = read_atom_coord(Natoms)
print V_lj(coord)

And the output:


Number of atoms?
3
For each atom: x, y, z
0 0 0
0 0 .3
.1 .2 -.3
0.396856906955

Total energy
Write a function that computes the total energy of the system:
Natoms
X
E =T +VLJ T = 12 mi vi2
i =1

Your main should look like this:

def main():
Natoms = read_Natoms()
mass = read_atom_mass(Natoms)
coord = read_atom_coord(Natoms)
velocity = [ [0.1,0.2,0.3] for i in range(Natoms) ]
print E_tot(coord,mass,velocity)

And your output like that:

Number of atoms?
3
For each atom: mass
10
20
15
For each atom: x, y, z
0 0 0
0 0 .3
.1 .2 -.3
3.54685690696

Acceleration
The acceleration vector is given by:
V
axi =m1i x
i

where is the coordinate of atom .


Write the function to compute the approximate derivative of the potential with respect to atomic
coordinates:
V V(xi +xi )V(xi xi )
xi
2xi

Here is the main function:

def main():
Natoms = read_Natoms()
mass = read_atom_mass(Natoms)
coord = read_atom_coord(Natoms)
velocity = [ [0.1,0.2,0.3] for i in range(Natoms) ]
print get_acceleration(coord,mass)

and the expected output

f atoms?
3
For each atom: mass
10
20
15
For each atom: x, y, z
0 0 0
0 0 .3
.1 .2 -.3
[[-0.0012143469700354181, -0.0024287378274090443, -2.8852483886704636],
[0.0003772257075318475, 0.0007544514316476514, 1.4421824477393457],
[0.00030659703662931176, 0.000613223309409161, 0.0005889954611815185]]

Verlet Algorithm
The Verlet algorithm is the following:
2
rn +1 =rn +vn t +an t2
vn +1 =vn + 12 (an +an +1 )t
where:

is the position vector (atomic coordinates)


is the velocity vector
is the acceleration vector
is a time step
Write the verlet algorithm in a function. At each time step, print the atom coordinates (for the Argon atom)
in xyz format with the total energy in the title.
Here is the main fuction:

def main():
Natoms = read_Natoms()
mass = [ mass_Argon for i in range(Natoms) ]
coord = read_atom_coord(Natoms)
velocity = [ [0.,0.,0.] for i in range(Natoms) ]
coord,velocity = verlet(Nsteps=1000,Delta_t=.1,coord,mass,velocity)

and the ouput:

Number of atoms?
3
For each atom: x, y, z
0 0 0
0 0 .3
.1 .2 -.3
3
Step 0 E = 0.396856906955
Ar 0.000000 0.000000 0.000000
Ar 0.000000 0.000000 0.300000
Ar 0.100000 0.200000 -0.300000
3
Step 1 E = 0.371644652669
Ar -0.000002 -0.000003 -0.003611
Ar 0.000001 0.000002 0.303610
Ar 0.100001 0.200001 -0.299999
[...]
3
Step 998 E = 0.377839040613
Ar -1.656240 -3.312489 -5.790241
Ar 0.000898 0.001795 10.642537
Ar 1.755342 3.510694 -4.852296
3
Step 999 E = 0.377839040613
Ar -1.657894 -3.315796 -5.796029
Ar 0.000898 0.001797 10.652901
Ar 1.756995 3.513999 -4.856872

You might also like