Kris's Research Notes

March 29, 2011

Simulations Update

Filed under: GaAs Simulations — Kris Reyes @ 10:57 pm

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


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

\displaystyle R_0 e^{-\beta E_\ell},

where E_\ell is an atom’s local energy (determined by bond counting) and R_0 was a constant prefactor I had originally set to 10^9. 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 R_0 = 10^{13}. 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 Ga atom diffusing on an As terminated substrate:

Here the energy barrier for diffusion is 2\times \gamma(Ga(2), As(3)). Using the energies defined in this post, \gamma(Ga(2), As(3)) = 0.19 eV, and hence the diffusion potential was set at 0.38 eV. This is low for Ga on a GaAs substrate. The simulations would spend too much time on diffusing Ga on the surface. By symmetry, As on a Ga terminated surface would hop just as fast.

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

R_0 \exp\left[ -\beta \left( E_\ell - E^* + E_d\right) \right],

where E^* is the local energy of a surface Ga (equiv. surface As), namely E^* = 2\gamma(Ga(2), As(3)) = 2\gamma(Ga(3), As(2)) and R_0 = 10^{13}. Here E_\ell, E^* and E_d 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. As diffusing through a Ga droplet and exchanges between the droplet and substrate interface). That is, the most general form for the rate of exchanging atoms A and B is given by:

R(A,B) = R_0 \exp \left[ -\beta \alpha(A,B)\left(E_\ell(A) + E_\ell(B) - E^* + E_d\right) \right],

where E_\ell(A), E_\ell(B) are the local energies of atoms A, B, respectively, and \alpha(A,B) is the diffusion coefficient I had described in my earlier post. Namely:

\alpha(A,B) = \begin{cases} 1 & \text{either } A \text{ or } B \text{ are vacuum (but not both);} \\ \epsilon & A \text{ is an } As \text{ atom and } B \text{ is a } Ga \text{ droplet atom, or vice versa;} \\ & \text{or } A \text{ is an } As \text{ atom on the droplet-substrate interface and } B \text{ is a } Ga \text{ droplet atom, or vice versa;} \\ \infty   & \text{otherwise.}\end{cases}

To clarify what exactly the above cases mean:

  • By “A is an As atom and B is a Ga droplet atom,” I mean A is any As atom and B is of extended type Ga(1). This includes those As - Ga exchanges in the droplet proper, and those on the droplet surface:

  • By “A is an As atom on the droplet-substrate interface and B is a Ga droplet atom,” I mean A is any As atom and B is a Ga atom with exactly 2 Ga neighbors and 2 As 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.


Recall we used pairwise Ga(i)-As(j) specified in the matrix:

\begin{pmatrix} 0.19 & 0.19 & 0.19 & 0.19 \\ 0.19 & 0.19 & 0.19 & 0.95 \\ 0.19 & 0.19 & 0.95 & 0.95 \\ 0.19 & 0.95 & 0.95 & 0.95 \end{pmatrix}.

We had noted this was symmetric. Those pairs with large bond strengths satisfy i + j \geq 6. That is

\frac{i + j}{2} \geq 3,

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 Ga(i)-As(j) bonds as tabulated in the matrix:

\begin{pmatrix} \gamma_{u} & \gamma_{u} & \gamma_{u} & \gamma_{u} \\ \gamma_{u} & \gamma_{u} & \gamma_{u} & \gamma_{p} \\ \gamma_{u} & \gamma_{u} & \gamma_{p} & \gamma_{p} \\ \gamma_{u} & \gamma_{p} & \gamma_{p} & \gamma_{f} \end{pmatrix},

where \gamma_u, \gamma_p, \gamma_f are bonding energies for unreacted, partially reacted and fully reacted Ga - As bonds, respectively.

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

While this may address the case of an As atom diffusing through a droplet in a natural manner, it doesn’t work for exchanges at the Ga droplet/substrate interface. Considering this, we may hope that specifying a lower barrier of exchange between a Ga(2) and As(4) (corresponding to a \gamma_p 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 As-coordination of the Ga atom. We had previously addressed this by requiring the Ga atom be of type Ga(2,2), i.e. exactly two Ga neighbors and two As 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 Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: