Diffusion-Limited Aggregation

1) On a 2 Dimensional lattice place "seed" particles, usually a single point in the center of the lattice.

2) Release particles on the lattice, which will commence randomly walk the lattice until the particle either:

3) And then release a new particle and repeat step (2)

dla_polar.png

A DLA cluster generated with J601 and rendered with viewmat.

Here is the J601 code I have been working with.

For some commentary on this code and some suggested revisions, look here and here.

load 'coutil'
cocurrent 'dla'

NB. State settings
size =: 0 NB.Keep track of the size of the cluster
nbs =: 1 1j1 0j1 _1j1 _1 _1j_1 0j_1 1j_1 NB. Neighbors to a point in complex numbers
space =: 500 500 $ 0                     NB. Lattice to grow the cluster

NB. Operations and helpers
getCenter =: (j./) @ ( -: @ $)         NB. Get the center of the lattice
seed =: 3 : '1 (< +. getCenter y) } y' NB. place a single point in the center of lattice
csign =: (+.^:_1) @ ( * @ +.)          NB. get the 'sign' of a complex number i.e 0.25j_0.5 -> 1j_1
walk =: 3 : 'y + (? # nbs) { nbs'      NB. Simple form of random walk
walk2 =: 3 : 'y + (? 1 +  # nbs) { nbs, csign center - y' NB. Baised toward center of lattice
NB. Used to calculate the max radius of the cluster
dist =: 4 : 0 
        d =:(0 { *. (x - y))
        >.(size >. d )
)
NB. release a new particle distance x + 5 from center y
release =: 4 : 0
        r =. (x + 5) r. (2p1 * ? 0)
        <. r + y
)
add_to_cluster =: 3 : 0 
        space =: 1 (< +. y) } space
)
NB. This probably could be improved. Used to find if a point has landed on the cluster
NB. Look at the 8 neighbors around a point and see if there are any occupied cells.
range =: <:,],>:
drange =: (range@(0&{@+.)); (range@(1&{@+.))
check_collision =: 3 : '+/+/(< drange y) { space'
NB. Check to see if the point has wandered far away from the cluster.   
outOfBounds =: 4 : '(size + 10) <(0 { *. (x - y))'

NB. Init
center =: getCenter space
space =: seed space

NB. Process
grow =: 3 : 0
        c =. 0
        point =: size release center
        while. y > c do.
                point =: walk point
                if. point outOfBounds center do.
                        point =: size release center
                else.
                        if. check_collision point do.
                                add_to_cluster point
                                size =: center dist point
                                break.
                        end.
                end.
                c =. >: c
        end.
)

And here is how I typically use the module in a J session:

    load 'c:\j601\temp\cdla6.ijs'
    load 'viewmat'

    grow_dla_"0 (1000#1000)
1 2 2 2 3 3 3 3 4 4 4 4 4 4 5 5 5 5 6 6 6 6 6 7 7 7 7 7 8 8 ...
NB. List of steps till point reached the cluster
    +/ +/ space_dla_
1001 NB. Number of particles in the cluster
    viewmat space_dla_

Outline for this page's development:

1) Improve J code for generating DLA clusters (For some commentary on this code and some suggested revisions, look here.)

2) Show how different types of random walks and rules for detecting collisions can change the morphology of the cluster.

3) Put up pictures of different morphologies.

MikeNardell


CategoryWorkInProgress

Studio/Gallery/DLA (last edited 2012-04-16 15:14:31 by DevonMcCormick)