Sandpile 3D

Sandpile 3D preview image

1 collaborator

Uri_dolphin3 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 624 times • Downloaded 32 times • Run 0 times
Download the 'Sandpile 3D' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


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.

In other publications, please use:

- Copyright 2006 Uri Wilensky. All rights reserved. See http://ccl.northwestern.edu/netlogo/models/Sandpile3D for terms of use.

COPYRIGHT NOTICE

Copyright 2006 Uri Wilensky. All rights reserved.

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.

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

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)
  set cascade-list []
  set cascade-count 0
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
        set heading 0
        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 heading 0
      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 ]

  trigger-cascade
  set color brown + zcor
end 

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

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

to cascade
  ;; ask one of the grains of sands that needs to cascade to cascade
  ask one-of turtles with [ zcor >= (min-pzcor + 3) and not any? turtles-at 0 0 1 ] [
    ;; update the cascade-count
    set cascade-count cascade-count + 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)]
    ask turtles-in-column [
      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
  let p patch-ahead 1
  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
  if cascade-count > 0 [

    ;; clear the old line
    plot-pen-reset

    ;; put the current count on the list of all counts
    set cascade-list fput cascade-count cascade-list

    ;; 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
    foreach cascade-list [
      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 ]
  [ report log input 10 ]
end 


; Copyright 2006 Uri Wilensky. All rights reserved.
; The full copyright notice is in the Information tab.

There are 3 versions of this model.

Uploaded by When Description Download
Uri Wilensky almost 9 years ago Updated from NetLogo 4.1 Download this version
Uri Wilensky almost 9 years ago Model from NetLogo distribution Download this version
Uri Wilensky almost 9 years ago Sandpile 3D Download this version

Attached files

File Type Description Last updated
Sandpile 3D.png preview Preview for 'Sandpile 3D' about 6 years ago, by Uri Wilensky Download

This model does not have any ancestors.

This model does not have any descendants.