The basic aTAM and kTAM models assume that monomer tiles are present at a fixed concentration throughout the assembly. In cases where there are sufficiently many crystals forming that the monomer concentration is significantly depleted, this assumption fails. Correctly treating the depletion of resources shared by a distribution of crystal forms is a complex issues, and so Xgrow currently contains a hack: the user specifies that the flake being simulated is representative of some typical concentration [flake]=exp(-Gfc) of crystals, and thus every time a monomer accretes to the flake, [flake] is subtracted from the concentration of the monomer in solution. This leads to a balance developing, which sets a stable size for the crystal.
Xgrow can simulate many flakes simultaneously. This is really only interesting in the case described above, where the growth of crystals depletes the concentration of monomers. Although Xgrow's treatment of this case is a hack, nonetheless, one can see genuine effects such as winner-take-all (the first crystal to nucleate grows, depletes the monomer tile concentration, and thereby increases the critical nucleus size, making it harder for other crystals to nucleate -- so they don't) and Ostwald ripening (many crystals have nucleated; over time, the larger ones get larger and the smaller ones get smaller, because larger crystals have a higher number of bonds formed per tile -- a surface-to-volume effect).
Xgrow's main feature is that it is (usually) fast. All possible events in the Markov process (of which there could be S*S*N*F for F flakes built from N tile types in an S x S field) are stored in a quad-tree for logarithmic-time selection of the next event.
In the case of multiple flakes, you can view a sample of them chosen at random to get some visual sense of the distribution. A button allows you to move from one flake to the next, or to jump to the largest one. You can save a flake, and load it back in later (using the command-line).
It's important to know that Xgrow keeps track of a special tile, called the seed. At the start of a simulation, this is just the first tile. Usually, the seed is fixed to be the same throughout time -- in this case, Xgrow will never allow that tile to dissociate. Alternatively, you can ask the seed to "wander" -- in which case, if the seed tile is chosen to dissociate, a neighboring tile is designated the seed. As you might infer from the name, the seed designation wanders around from tile to tile.
Another important feature is whether the flake can fission. To have a
set of strictly reversible reactions in the model, the fact that only
monomers can associate implies that only monomers can leave. This
means that a flake which consists of two lobes, held together by a
single tile with weak bonds to its two neighbors, cannot fall apart.
If the linking tile were chosen to dissociate, the flake would be
disconnected after the tile is gone -- and the reverse reaction (association of two large flakes)
is not in the kTAM. So by default, such moves are not allowed.
However, you can set the "fission" option, which allows these actions (at the
cost of no longer being a well-defined reversible model -- i.e. it no longer satisfies detailed balance).
Note, however, that for the two-lobed flake to break, the critical tile must dissociate
by breaking all boths to
Xgrow is all best learned by poking around and by example, so we've included several. Try them all. See below.
Run the shell script makecc, after making sure the library and include paths are correct for your system, and there you have it: xgrow.
Try a few command-line examples from example-runs using the tile sets provided in tilesets. Run "xgrow --" to see help on the command-line parameters.
Xgrow is known to compile under Red Hat Linux 8 and under Mac OSX.
The following Xgrow releases are available, but you probably just want the most recent one: Sep 15, 2006 (tar file). Jun 3, 2004 (directory). April 9, 2004 (directory); Nov 17, 2003 (directory).
Please send questions and bug reports to winfree@caltech.edu. Until I have time to prepare complete documentation, this web page will be updated with information primarily in response to your queries. If you modify these files, either to add features or incorporate them into your own programs, please let me know!