# Sandpile 3D

### 1 collaborator

Uri Wilensky (Author)

### Tags

(This model has yet to be categorized with any tags)
Model group CCL | Visible to everyone | Changeable by group members (CCL)
Model was written in NetLogo 3D 4.1pre7 • Viewed 794 times • Downloaded 39 times • Run 0 times

### WHAT IS IT?

This model illustrates a phenomenon known as self-organized criticality. The world is filled with sand organized in columns. Falling sand stacks on top of the sand that is already there. Eventually a column will fall over because it gets too high, and the sand will spill into the surrounding area. This is called a cascade. When a falling column causes other columns to fall, the series of cascades is called an avalanche. The size of an avalanche is the number of cascades that occur from one grain of sand falling.

### HOW IT WORKS

Initially the world is either empty or full, at each step of the model a grain of sand drops from the top of the world. The sand continues to fall until it hits another grain of sand; at that point it rests where it is and checks to see if it is the fourth grain of sand in the current pile. If it is it causes a cascade, which distributes the four grains of sand in the current pile in the four cardinal directions. These grains of sand then in turn check to see if they make their new sandpile taller than three grains, if they do then they cascade as well. If a particle of sand goes over the edge of the world then it disappears forever.

### HOW TO USE IT

SETUP EMPTY initializes the model with no sand in it.

SETUP FULL initializes the model with all the piles at random heights but below the threshold of four.

GO ONCE will add one particle of sand to the world.

GO will continue adding particles of sand at random locations.

### THINGS TO NOTICE

The graph illustrates the relationship between the logarithm of the size of cascades and the logarithm of the frequency of their occurrence. Per Bak and others pointed out that in this model this graph would eventually become a straight line. A straight line on a log-log graph is indicative of a power law, which means that the relationship between the x and y axes is of the form y = A^Bx. The fact that this power law occurs regardless of the starting circumstances and despite the fact that the process is random is what Per Bak called self-organized criticality.

### THINGS TO TRY

Slow down the model using the speed slider to watch the avalanches occur.

Try using SETUP EMPTY and SETUP FULL; is the resultant pattern any different?

Can you explain why the graph is not a perfectly straight line?

### EXTENDING THE MODEL

The particles are currently colored by their depth in the sandpile. What if you colored them based on whether or not they were involved in an avalanche recently?

What if you make the limit on high the sandpiles can go larger than four? How about eight or twelve?

### NETLOGO FEATURES

This model makes use of the fact that you can set the origin of a 3D model anywhere you want. It also creates its own logarithmic graph.

### RELATED MODELS

There is a 2D version of this model in the Community Models called SANDPILE.

### CREDITS AND REFERENCES

Self organized criticality was originally investigated by Per Bak and collaborators. The basis for this model is in Per Bak's book "How Nature Works".

### HOW TO CITE

If you mention this model in an academic publication, we ask that you include these citations for the model itself and for the NetLogo software:

- Wilensky, U. (2006). NetLogo Sandpile 3D model. http://ccl.northwestern.edu/netlogo/models/Sandpile3D. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.

- Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.

Permission to use, modify or redistribute this model is hereby granted, provided that both of the following requirements are followed:

a) this copyright notice is included.

b) this model will not be redistributed for profit without permission from Uri Wilensky. Contact Uri Wilensky for appropriate licenses for redistribution for profit.

Click to Run Model

```globals [ cascade-count cascade-list ]

;;
;; Setup Procedures
;;

to setup
ca
set-default-shape turtles "circle"
setxyz (max-pxcor * 2) (max-pycor * 2) (max-pzcor * 1.5)
facexyz 0 0 (min-pzcor)
end

;; fill up the world with sand piles
;; each column should have between 0 and 3 grains of sand.

to fill-world
ask patches with [ pzcor = min-pzcor ] [
let number-of-grains random 4
sprout number-of-grains [
set pitch -90
while [ any? other turtles-here ]
[
set zcor zcor + 1
]
set color brown + zcor
]
]
end

;;
;; Runtime Procedures
;;

to go
ask one-of patches with [pzcor = max-pzcor] [
sprout 1 [
set pitch -90
set color brown
fall
]
]
tick
end

;; have any grains of sand that can fall, fall

to fall ;; turtle procedure
while [ (not any? turtles-on patch-ahead 1) and (zcor > min-pzcor) ]
[ fd 1 display ]

set color brown + zcor
end

;; have any sand which should cascade
while [any? turtles with [zcor >= (min-pzcor + 3)]]
update-plot
end

;; distribute the current sand pile to the neighboring sand piles

ask one-of turtles with [ zcor >= (min-pzcor + 3) and not any? turtles-at 0 0 1 ] [

;;  we really don't want all the turtles in the column just the top four.
let turtles-in-column turtles with
[xcor = [xcor] of myself and ycor = [ycor] of myself and zcor >= (([zcor] of myself) - 3)]
set pitch 0
;; make sure each of the grains of sand
;; go in four different directions.
set heading 90 * (zcor mod 4)

;; if it falls off the edge remove it
ifelse out-of-bounds?
[ die ]
[
set zcor min-pzcor
fd 1
let my-column turtles with [ xcor = [xcor] of myself and ycor = [ycor] of myself ]
let top-turtle max-one-of my-column [ zcor ]

;; if we are not the top turtle then move to the top of the pile
if top-turtle != self [ set zcor [zcor] of top-turtle + 1 ]
set color brown + zcor
]
]
]
end

to-report out-of-bounds? ;; turtle reporter
report (abs( [pxcor] of p - xcor ) > 1 or
abs( [pycor] of p - ycor ) > 1)
end

;;
;; Plotting Procedures
;;

to update-plot

;; Check to see if we have anything to plot this turn

;; clear the old line
plot-pen-reset

;; put the current count on the list of all counts

;; create a list of -1's as long as size of the greatest cascade
let log-histogram n-values (max cascade-list + 1) [-1]

;; foreach element of the list calculate the frequency with which it occurred
let old-value item ?1 log-histogram
if old-value = -1 [
set old-value 0
]
set log-histogram replace-item ?1 log-histogram (old-value + 1)
]

;; take the log of that frequency
set log-histogram map [safe-log ?] log-histogram

;; now determine the log of that value and plot the relationship
let counter 1
foreach log-histogram [
if (?1 >= 0) [
plotxy (log (counter - 1) 10) ?1
]
set counter counter + 1
]
]
end

;; a special reporter so we do not ask for the log of -1

to-report safe-log [input]
ifelse input = -1
[ report -1 ]
end

; The full copyright notice is in the Information tab.
```

There are 3 versions of this model.