Lecture 1: The Lennard-Jones Potential

An org-mode example lesson plan.


Devon Walker

devonw@andrew.cmu.edu

The Lennard-Jones Potential

The Lennard-Jones (LJ) potential is perhaps the most commonly used potential in molecular dynamics simulations. It is used to describe the attractive and repulsive forces between two atoms.

\begin{align*} V_{LJ}(r) = 4 \epsilon \Big[ \Big ( \frac{\sigma}{r} \Big)^{12} - \Big(\frac{\sigma}{r} \Big)^{6} \Big] \end{align*}

\(\epsilon\) is a constant energy, while \(\sigma\) is a constant length, and they are both interaction-specific. We can remove these constants by using the dimensionless form of the potential.

\begin{align*} V_{LJ}(r) = 4 \Big[ \Big ( \frac{1}{r^{\star}} \Big)^{12} - \Big(\frac{1}{r^{\star}} \Big)^{6} \Big] \end{align*}

References

Dimensionless LJ

We can calculate the energy using the dimensionless form of the LJ potential for a given distance.

Figure 1: LJ potential for several nobel gases.

Code

import numpy as np
import matplotlib.pyplot as plt


def dim_LJ_energy(rstar):
    """Dimensionless form of the Lennard-Jones energy."""
    return 4. * ((1. / rstar**(12)) - (1. / rstar**6))


# Calculate energies over a range of distances
r_s = np.linspace(0.9, 2, 200)
u_s = [dim_LJ_energy(r) for r in r_s]


# Plot
plt.plot(r_s, u_s, label="$u^*$")
plt.plot(r_s, [0]*len(r_s), 'k--')
plt.xlabel('Atom-Atom Separation, $r^*$ (Dimensionless)')
plt.ylabel('Energy, $u^*$ (Dimensionless)')
plt.legend()
plt.xlim([0.9, 2])
plt.ylim([-2, 2])
plt.savefig("./img/lj-dim.png")

Parameters for noble gases

We can also look at the previously determined parameters and calculate the non-dimensionless form of the LJ potential.

Table 1: LJ parameters for noble gases.
Compound \(\epsilon/k_B\) [K] \(\sigma\) [\(10^{-12}\) m]
Ne 35.60 274.9
Ar 119.8 340.5
Kr 171.0 360.0
Xe 221.0 410.0

References

LJ for Noble Gases

We pull the data from the previous table directly into our code and then calculate the potential for each noble gas.

Figure 2: LJ potential for several nobel gases.

Code

import numpy as np
import matplotlib.pyplot as plt
from scipy.constants import Boltzmann as kb


def LJ_energy(r, eps, sigma):
    """Lennard-Jones energy."""
    return 4. * eps * ((sigma / r)**(12) - (sigma / r)**6)


### Select a row from the previous table
for row in table:
    # Parse table row
    compound = row[0]
    eps = row[1] * kb
    sigma = row[2] * 10**(-12)

    # Calculate energies over a range of distances
    r_s = np.linspace(1e-10, 7.5e-10, 200)
    u_s = [LJ_energy(r, eps, sigma) for r in r_s]

    # Plot
    plt.plot(r_s, u_s, label=compound)
    plt.plot(r_s, [0]*len(r_s), 'k--')

plt.xlabel('Atom-Atom Separation, $r$ (m)')
plt.ylabel('Energy, $u$ (J)')
plt.legend()
plt.xlim([2e-10, 7.5e-10])
plt.ylim([-0.35e-20, 0.2e-20])
plt.savefig("./img/lj.png")