I have not updated these notes for a while, so today I will discuss several changes to the code and some subsequent results.

## Rates

One major problem with past simulations was the use of the diffusion rates of the form

,

where is an atom’s local energy (determined by bond counting) and was a constant prefactor I had originally set to . This was too small, which meant the atoms were not diffusing as fast as they should. As a rule of thumb (e.g. in Orr’s simulations) the prefactor should be somewhere on the order of . When I used this, however, the code once again ran slower (in fact, this is why the prefactor was set so low to begin with). To understand why, consider a atom diffusing on an terminated substrate:

Here the energy barrier for diffusion is . Using the energies defined in this post, , and hence the diffusion potential was set at . This is low for on a substrate. The simulations would spend too much time on diffusing on the surface. By symmetry, on a terminated surface would hop just as fast.

The proper energy barrier to diffusion is around . Smereka suggested the following form for the rates to guarantee this:

,

where is the local energy of a surface (equiv. surface ), namely and . Here and are positive numbers.

*N.B.* I use this or a similar form for all exchanges in the simulation, even those exchanging two non-vacuum positions (i.e. diffusing through a droplet and exchanges between the droplet and substrate interface). That is, the most general form for the rate of exchanging atoms and is given by:

,

where are the local energies of atoms , respectively, and is the diffusion coefficient I had described in my earlier post. Namely:

To clarify what exactly the above cases mean:

- By “ is an atom and is a droplet atom,” I mean is any atom and is of extended type . This includes those exchanges in the droplet proper, and those on the droplet surface:
- By “ is an atom on the droplet-substrate interface and is a droplet atom,” I mean is any atom and is a atom with exactly 2 neighbors and 2 neighbors.
- Except for the case of an atom diffusing on the surface, exchanging with a vacuum, all other next-nearest neighbor exchanges are not allowed.

This may be overly complicated and we may wish to specify these coefficients more carefully. In fact, we may be able to use the simplification in energies described in the next section to address this in a similar manner.

## Energies

Recall we used pairwise specified in the matrix:

We had noted this was symmetric. Those pairs with large bond strengths satisfy . That is

,

i.e. the average coordination number is at least 3; almost fully coordinated. This leads to a convenient interpretation of these energies: those bonds between atoms that are almost to fully coordinated are large and we consider such bonds to be **partially or fully reacted** while those between atoms that aren’t almost fully coordinated are weak and should be considered **unreacted**. We can thus think of the pairwise bonds as tabulated in the matrix:

where are bonding energies for unreacted, partially reacted and fully reacted bonds, respectively.

This interpretation could give us a more natural way to determine the correct diffusion coefficients for exchanges. That is, we can specify a lower coefficient for exchange between an and atom if the bond between them is an unreacted bond. This would magnify the already lowered (by virtue of the presence of the lower bond) local energies. Further coefficients of exchange can be analogously defined for bonds, presumably larger and possibly infinite.

While this may address the case of an atom diffusing through a droplet in a natural manner, it doesn’t work for exchanges at the droplet/substrate interface. Considering this, we may hope that specifying a lower barrier of exchange between a and (corresponding to a bond) may be sufficient. However this is not enough information to distinguish between a droplet/substrate interface and a vacuum/substrate interface. We need more information than the -coordination of the atom. We had previously addressed this by requiring the atom be of type , i.e. exactly two neighbors and two neighbors.

## Rate Cache

Among smaller changes to the code, I implemented a cache for rate computations. All the rates for events which can occur at a position are functions of that position’s local neighborhood. If two atoms have the same local neighborhood, then their rates are identical. We can use this to implement a rate cache — a large lookup table indexed by local neighborhood that stores all the appropriate rates for that neighborhood. Then instead of calculating the rates, we can simply copy the memory from the cache into the cdf table. Of course, there are a large number of local neighborhoods, and so we cannot simply have an array indexed by neighborhood as the this table would be too big. Instead we implement a (next-available-spot) hashtable which stores neighborhood and rates as a (key,value) pair. At periodic intervals, I flush the hashtable as a simple evacuation strategy.

This simple scheme works very well because at any time in the simulation, the system can be described by a small number of local neighborhoods (on the order of 100-300 neighborhoods). Because of this low number of neighborhoods, we can design a hash function so that the average chain length is less than 2. That is, when we try to find a rate in the hashtable, it will take one to two lookups on average. If the neighborhood is found, we update the rates via a memory copy instead of computing them explicitly.

## Leave a Reply