Chemisorption Onto a Crystal Surface

The METRIC Project

Introduction

In this piece of work you're asked to set up a single plane of a sodium chloride crystal lattice and examine the forces it exerts on a nearby ion. The aim is to study the phenomenon of chemical adsorption, or chemisorption, in which the ion comes to take up a stable equilibrium position close to the lattice plane. In reality, this is a quantum mechanical process, but you'll be modelling it as a Newtonian one; for ionic interactions in particular, the Newtonian approximation is a good one.

Objectives

In this exercise you will be asked to use the principle of superposition to determine the combined effect of the electrostatic forces of the ions comprising the crystal surface on the adsorbed ion. You will also be asked to determine where the adsorbed ion is in stable equilibrium.

1. Preliminaries

Once again we have provided you with a notebook which contains the code needed for this exercise. This session's notebook is stored as Chemisorption.nb in the MathsLab folder. 

Before we get started you will need to define some new functions and set the values of some constants.

1.1 Loading a package

We want a way of showing arrows in three dimensions (to represent forces). We've found a special package on the internet that can be loaded to do this. To load this package, type

<< Graphics`Arrow3D`

1.2 Physical constants

The next priority is to inform Mathematica of the values of the various physical constants that this assignment requires.

The permittivity of the vacuum:

(Subscript[ϵ, 0]) =  8.85419*^-12

The charge, in Coulombs, on an electron:

e  =  1.60219*^-19

The equilibrium bond length of the NaCl dipole, in metres:

rbond =  2.5*^-10

Interionic separation in the NaCl lattice, in metres:

rlat = 2.815*^-10

2. Building the Crystal Surface

We showed you in the previous exercise how to create a crystal from a basis mapped onto a crystal lattice. Here we're not going to use that formalism. Instead we are using quite a straightforward approach to creating a crystal surface. The basic code you need is this:

color[chloride] = RGBColor[0, 0.8, 0];

color[sodium] = RGBColor[0.8, 0, 0];

radius[chloride] = 0.05;

radius[sodium] = 0.04;

particlePoint[{particle_, coords_}] := {color[particle], 
        PointSize[radius[particle]], Point[coords]}

Here's a simple example to illustrate how the code works:

sampleLattice = {{sodium, {-rlat, -rlat, 0}}, {
          sodium, {-rlat, rlat, 0}}, {sodium, {0, 0, 0}}, {
          sodium, {rlat, -rlat, 0}}, {sodium, {rlat, rlat, 0}}, {
          chloride, {-rlat, 0, 0}}, {chloride, {0, -rlat, 0}}, {
          chloride, {0, rlat, 0}}, {chloride, {rlat, 0, 0}}}

Map[particlePoint,  sampleLattice]

Show[Graphics3D[%], ViewPoint -> {0, 0, 5}]

To save typing, here's some code for generating planar square regions of the sodium chloride automatically:

sodiumLattice[size_] := 
      Flatten[Table[{sodium, {i rlat, j rlat, 0}}, {i, -size, size}, {
            j, Mod[i + size, 2] - size, size - Mod[i + size, 2], 2}], 1]

chlorideLattice[size_] := 
      Flatten[Table[{chloride, {i rlat, j rlat, 0}}, {i, -size, size}, {
            j, Mod[i + 1 + size, 2] - size, size - Mod[i + 1 + size, 2], 2}], 
        1]

lattice[size_] := Join[sodiumLattice[size], chlorideLattice[size]]

Here's how it works:

lattice[2]

Map[particlePoint, lattice[2]]

Show[Graphics3D[%], ViewPoint -> {0, 0, 5}]

3. Attraction and repulsion forces

We're treating the ions as point charges. Between two ions of like charge there's a Coulomb force of magnitude

((e^2)/(4 π (Subscript[ϵ, 0]) (r^2))),

where r is the distance between the centres. This is a repulsion: the force that particle B exerts on particle A is in the opposite direction to the vector pointing from A to B. The easiest way to represent that is to say that if the vector pointing from A to B = r then

F=-(((e^2) r)/(4 π (Subscript[ϵ, 0]) ((\[LeftBracketingBar]r\[RightBracketingBar])^3))).

In Mathematica, the magnitude of r becomes

mag[vector_] := Sqrt[vector . vector]

where we have taken the square root of the dot product of vector.Hence

(Subscript[F, like])[r_List]  := 
      -(((e^2) r)/(4 π (Subscript[ϵ, 0 ]) 
              mag[r]^3))

The force between two particles of opposite charge is more complicated: at long enough distance there's a Coulomb attraction, but when the particles are close together there is a strong repulsion. The following formula models this force well:

(Subscript[F, opp])[r_List]  := 
      (((e^2) r)/(4 π (Subscript[ϵ, 0]))) 
        ((1/mag)[r]^3 - ((((rbond))^8)/mag)[r]^11)

Here's the code for getting this to work for sodium and chloride ions. This sets up a function called force that gives the force that particle2 exerts on particle1, expressed as a (row) vector:

forceBetween[{particle1_, coords1_}, {particle2_, coords2_}] := 
      forceFunction[particle1, particle2][coords2 - coords1]

The remaining code in this section tells Mathematica which of the two force functions to apply in different sets of circumstances:

forceFunction[chloride, chloride] = (Subscript[F, like]);

forceFunction[sodium, sodium] = (Subscript[F, like]);

forceFunction[chloride, sodium] = (Subscript[F, opp]);

forceFunction[sodium, chloride] = (Subscript[F, opp]);

You can test this code:

forceBetween[{sodium, {1.87*^-10, 9.37*^-11, -1.87*^-10}}, {
        sodium, {0, 0, 0}}]

Exercises and Explorations

1: Equilibrium separation of a dipole

Use forceBetween to show that the z-component of the force exerted on a chloride ion at the point (0, 0, 3.0×(10^(-10))) by a sodium ion at the origin is -1.97 nanonewtons.

Generate a graphic showing the positions of these two ions by typing

ions = {{chloride, {0, 0, 3.0*^-10}}, {sodium, {0, 0, 0}}};

Map[particlePoint, ions]

Show[Graphics3D[%], 
      PlotRange -> {{-4.0*^-10, 4.0*^-10}, {-4.0*^-10, 4.0*^-10}, {
            -4.0*^-10, 4.0*^-10}}]

Add a force arrow to your diagram by typing

\(scaling\  = \ 0.05; 
z = 3.0*^-10; 
force = {0, 0, \(-1.97*^-9\)}; 
    
{Arrow3D[{0, 0, z}, {0, 0, z} + force*scaling], 
      Map[particlePoint, ions]}; \)

then

Show[Graphics3D[%], 
      PlotRange -> {{-4.0*^-10, 4.0*^-10}, {-4.0*^-10, 4.0*^-10}, {
            -4.0*^-10, 4.0*^-10}}]

Vary the position of the chloride ion systematically, keeping the sodium ion at the origin. Illustrate the force on the chloride ion at several different separations. Can you make this force equal to zero? (Hint: look at the definition of (Subscript[F, opp])). What do you believe to be the equilibrium separation of the two ions?

To keep things tidy, finish this section by typing

Clear[scaling, z, force]

2: Resultant force close to a crystal plane

Find the z-component of the force exerted on a chloride ion at the point (0, 0, 3.0×(10^(-10))) by the sampleLattice you generated above. Note that whereas you could do this by laboriously adding up the forces...

forceBetween[{chloride, {0, 0, 3*^-10}}, {
          sodium, {-rlat, -rlat, 0}}] + 
      forceBetween[{chloride, {0, 0, 3*^-10}}, {
          sodium, {-rlat, rlat, 0}}]

... there's actually a much quicker way involving the use of the Map and Apply commands. First you can define a function to calculate the contribution to the resultant from each ion in the lattice:

forceFrom[ion_] := forceBetween[{chloride, {0, 0, 3.0*^-10}}, ion]

Then this command calculates these contributions...

forces = Map[forceFrom, sampleLattice]

And this one adds them all up, giving the resultant as a vector:

Apply[Plus, forces]

Explain why the x- and y-components must in fact be zero. Generate a plot of sampleLattice, together with the nearby chloride ion, by typing

allIons = Prepend[sampleLattice, {chloride, {0, 0, 3.0*^-10}}]

Map[particlePoint, allIons]

Show[Graphics3D[%]]

Add a force vector to your diagram.

Illustrate the force on the chloride ion when it is in different positions. Can you find, at least approximately, a position for which the ion is in equilibrium? 

What happens if you move the ion "off-centre"; that is, if the x- and y-coordinates are set at something other than zero? Illustrate.

3: Adsorption

In the last exercise, you found, perhaps by trial and error, a position for which the chloride ion and sampleLattice appeared to be in equilibrium. We can improve on trial and error, however. The following code finds the equilibrium position exactly:

Clear[z]

forceFrom[ion_] := forceBetween[{chloride, {0, 0, z}}, ion]

forces = Map[forceFrom, sampleLattice]

zforce = Apply[Plus, forces][[3]]

FindRoot[zforce == 0, {z, rbond}, AccuracyGoal -> 15]

Repeat this process, this time using lattice[2] instead of sampleLattice. Repeat using lattice[3], and so on. What happens to the equilibrium distance as you increase the size of the square? Explain this phenomenon, and illustrate it using an appropriate (and appropriately labelled) Mathematica plot.

In a real chemical situation, we can treat the size of the crystal as effectively infinite. Estimate the equilibrium adsorption distance in this situation (stick to the "single plane" assumption, however).

4: Stability of equilibrium

For a lattice of reasonable size, analyse the stability of the chemisorption equilibrium; that is, investigate what happens if you move the chloride ion a small distance away from the equilibrium position. Does it matter what direction you move it? Write up your findings.