globals [g b dt k external-energy internal-energy total-energy gravity? damping?] turtles-own[x y vx vy ax ay xtemp ytemp vxtemp vytemp kinetic-energy elastic-energy kx1 kx2 kx3 ky1 ky2 ky3 jx1 jx2 jx3 jy1 jy2 jy3] to setup ca set dt 0.01 set mode "damping" ask patches [ if pycor < (5 + min-pycor) [set pcolor green ]] ;ask patches with [pycor = 10 ][set pcolor white] cct particle-number [;set color blue set shape "circle" set x (random-float (2 * rest-length + 1)) - rest-length set y (random-float (2 * rest-length + 1)) - rest-length + 10 set vx 0 set vy 0 set ax 0 set ay 0 set elastic-energy 0 set kinetic-energy 0 setxy x y] end to go if mode = "damping" [set gravity? false set damping? true] if mode = "gravity" [set gravity? true set damping? false] if mode = "neither" [set gravity? false set damping? false] if mode = "both" [set gravity? true set damping? true] ifelse gravity? [set g 9.81][set g 0] ifelse damping? [set b 2.0][set b 0 ] set k spring-constant ;; Here we solve the equations of motion using Runge-Kutta ask turtles [find-acceleration ] ask turtles [find-k1] ask turtles [find-acceleration ] ask turtles [find-k2] ask turtles [find-acceleration ] ask turtles [find-k3] ask turtles [find-acceleration-and-energy ] ask turtles [update-coordinates] find-energy do-plots ask turtles [set elastic-energy 0 ] end ; find new velocity and position of particles based on Runge Kutta. to update-coordinates let kx4 vx let ky4 vy let jx4 (ax - b * vx ) let jy4 (ay - b * vy - g) set vx vxtemp + (dt / 6)*(jx1 + (2 * jx2) + (2 * jx3) + jx4) set vy vytemp + (dt / 6)*(jy1 + (2 * jy2) + (2 * jy3) + jy4) set x xtemp + (dt / 6)*(kx1 + (2 * kx2) + (2 * kx3) + kx4) set y ytemp + (dt / 6)*(ky1 + (2 * ky2) + (2 * ky3) + ky4) set ax 0 set ay 0 set kinetic-energy (vx * vx + vy * vy) / 2 ;; If particle are found below the green ground then give them positive velocity. This process conserves ;; energy and corresponds to a perfectly elastic collision with the ground. if y < 5 + min-pycor [ set vy abs vy ] ;; Here we hide particles that have moved off screen. They are still part of the simulation, and ;; if they return on screen they become visible again. ifelse (y > max-pycor) or (y < min-pycor) [ set hidden? true setxy x max-pycor] [set hidden? false setxy x y ] end ;; The following three procedures are steps in the Runge Kutta process. to find-k1 set xtemp x set ytemp y set vxtemp vx set vytemp vy set kx1 vx set ky1 vy set jx1 (ax - b * vx ) set jy1 (ay - b * vy - g) set vx vxtemp + jx1 * (dt / 2) set vy vytemp + jy1 * (dt / 2) set x xtemp + kx1 * (dt / 2) set y ytemp + ky1 * (dt / 2) set ax 0 set ay 0 end to find-k2 set kx2 vx set ky2 vy set jx2 (ax - b * vx ) set jy2 (ay - b * vy - g) set vx vxtemp + jx2 * (dt / 2) set vy vytemp + jy2 * (dt / 2) set x xtemp + kx2 * (dt / 2) set y ytemp + ky2 * (dt / 2) set ax 0 set ay 0 end to find-k3 set kx3 vx set ky3 vy set jx3 (ax - b * vx ) set jy3 (ay - b * vy - g) set vx vxtemp + jx3 * dt set vy vytemp + jy3 * dt set x xtemp + kx3 * dt set y ytemp + ky3 * dt set ax 0 set ay 0 end ;; Using Newton's second law F=ma, find the acceleration of each particle based on the interaction with ;; each of the other particles. The mass is set to 1. to find-acceleration ask turtles with [self != myself] [ let xrel x - ( x-of myself ) let yrel y - ( y-of myself ) let d sqrt( (xrel * xrel) + (yrel * yrel) ) ;; distance between particles if d = 0 [set d 0.0001] ;; This avoids divide by zero errors ;; when particles are on top of each other let extension (rest-length - d) set ax ax + ( k * extension ) * xrel / d set ay ay + ( k * extension ) * yrel / d ] end ;; This procedure is almost the same as above, but computes the eleastic potentail energy of the particles ;; as well as the acceleration. The energy stored in a spring is kx^2/2, but since each spring is ;; connects two particles we add kx^2/4 for each particle to find-acceleration-and-energy ask turtles with [self != myself] [ let xrel x - ( x-of myself ) let yrel y - ( y-of myself ) let d sqrt( (xrel * xrel) + (yrel * yrel) ) if d = 0 [set d 0.0001] let extension (rest-length - d) set ax ax + ( k * extension ) * xrel / d set ay ay + ( k * extension ) * yrel / d set elastic-energy elastic-energy + k * ( extension * extension ) / 4 ] end ;; computes total graviational energy, kinetic energy of particles and elastic energy and then separates ;; these into internal and external energy. to find-energy let total-kinetic-energy sum values-from turtles [kinetic-energy] let x-cm mean values-from turtles [x] let y-cm mean values-from turtles [y] let vx-cm mean values-from turtles [vx] let vy-cm mean values-from turtles [vy] let kinetic-cm (count turtles )*((vx-cm * vx-cm) + (vy-cm * vy-cm)) / 2 let total-elastic-energy sum values-from turtles [elastic-energy] set internal-energy total-elastic-energy + total-kinetic-energy - kinetic-cm set external-energy (9.81 * (sum values-from turtles [y + max-pycor - 5]) + kinetic-cm ) set total-energy ( internal-energy + external-energy ) end ;; This procedure allows the user to add a new particle to the system at anytime by clicking ;; the mouse down. To avoid adding multiple particle there is a sligh delay after a particle is added. to add-particle if mouse-down? [ cct 1 [set color yellow set shape "circle" set x mouse-xcor set y mouse-ycor set vx 0 set vy 0 set ax 0 set ay 0 setxy x y ] wait 0.2] end ;; plot energies to do-plots set-current-plot-pen "total" plot total-energy set-current-plot-pen "internal" plot internal-energy set-current-plot-pen "external" plot external-energy end @#$#@#$#@ GRAPHICS-WINDOW 303 10 721 449 25 25 8.0 1 10 1 1 1 0 1 0 1 -25 25 -25 25 CC-WINDOW 5 464 730 559 Command Center 0 BUTTON 9 18 99 75 NIL setup NIL 1 T OBSERVER T NIL SLIDER 7 150 288 183 spring-constant spring-constant 0 50 31 1 1 NIL BUTTON 103 18 193 74 NIL go T 1 T OBSERVER T NIL SLIDER 6 114 288 147 rest-length rest-length 0 10 4 1 1 NIL SLIDER 7 77 288 110 particle-number particle-number 1 50 25 1 1 NIL BUTTON 196 17 288 74 NIL add-particle T 1 T OBSERVER T NIL MONITOR 5 188 123 237 Total Energy total-energy 0 1 PLOT 6 239 294 450 Energy Time Energy 0.0 10.0 0.0 10.0 true true PENS "Total" 1.0 0 -16777216 true "Internal" 1.0 0 -2674135 true "External" 1.0 0 -13345367 true CHOOSER 128 188 288 233 mode mode "damping" "gravity" "neither" "both" 1 @#$#@#$#@ WHAT IS IT? ----------- This bouncing ball model illustrates the concept of entropy change as a result of the redistribution of energy in a system to available microstates. The system in this case is a simulation of a rubber ball composed of a number of particles that are bound together with Hookian springs, with particular equilibrium length and spring constants. The ball of particles starts above the ground and when allowed to fall under the influence of gravity rebounds off the ground. Energy is conserved in this process, nevertheless the height of the ball of particles decreases with each bounce as the initial potential energy of the system is transferred to disordered vibrations of the internal particles. External mechanical energy, such as potential energy and ordered kinetic energy is transferred to internal potential energy of the springs and disordered kinetic energy. It is possible to investigate how the rate at which this energy is redistributed relates to factors such as the strength of the springs and number of particles. HOW IT WORKS ------------ Particles are created randomly in a small area near the top of the world view. In the simulation each particle interacts pair-wise with every other particle via a Hooke's law F=-kx force, where x is the distance between the two interacting particles minus the equilibrium length of the spring. (Note: the particles do not interact in any other way, which means that they can pass through each other if they move fast enough to overcome the repulsion from the springs). The motion is simulated numerically based on Newton's second law F=ma. In order to have precision with the simulation and to conserve energy we use a fourth order Runge Kutta, rather than Euler's method. (Euler's method tends to result in energy loss over time due to numerical errors). There are options to include a number of other forces in the simulation. The initial default is to add a damping force that serves to gradually dampen out the motion so that the particles can reach an equilibrium configuration. When this equilibrium is established, damping can be turned off and gravity turned on to allow the ball to fall. It is also possible to have both damping and gravity at the same time, and neither. The elastic, gravitational and kinetic energy of each particle is calculated at each time step. The internal energy is set equal to the total elastic energy of the particles and the kinetic energy that is in excess of the center of mass kinetic energy. The total energy is the total gravitational potential energy and the center of mass kinetic energy. HOW TO USE IT ------------- Choose the number of particles, the rest length of the springs connecting them and the spring constant and the click setup. The particles are in a group near the top of the screen. Now click go. The default mode is "damping", in order that the particles will reach an equilibrium configuration corresponding to a ball of particles. When the particles have reached equilibrium change the mode to "gravity". Now gravity acts on the particles and there is no damping. Total energy is conserved, but as the ball bounces the distribution of energy between internal and external energy shifts, with the result that the ball of particles does not return to its original height. It is possible to change the mode so that both damping and gravity apply or neither applies. The later mode is interesting to try out if you want to see how a large number of particles with springs interact. It is possible to add additional particles by using the add-particle button and clicking on the screen. Be aware that if you add particles a long way from the other particles you will be adding a large amount of elastic energy to the system, which may result in particles disappearing from the screen. THINGS TO NOTICE ---------------- Notice that when the ball of particles bounces external energy is always converted to internal energy. The bounce allows other energy states (namely vibrations of the particles) to become available. Notice also that external energy is never totally lost, as long as damping and gravity are not both on at the same time. Try changing the spring constant and rest length of the spring and see how this changes how quickly the ball of particles looses its external energy to internal energy. You can make a quantitative comparison using the behavior space feature of NetLogo. THINGS TO TRY --------------- Initially, with damping on, the particles settle into a configuration with symmetry depending on the number of particles. Try starting with a low number of particles and then adding particles. You should observe definite symmetry breaking transitions at particular numbers of particles. With about 25 particles try putting gravity and damping on. The ball of particles will reach terminal velocity and settle on the ground in a configuration. Observe how the configuration changes with shape with different values of k. Allow about 25 particles to come to an equilibrium configuration with damping on. Then turn the spring constant off. Now turn on gravity only and observe the particles falling. Because there is no internal interaction the particles gradually loose their cohesion, due to the difference in time it takes for the different parts of the ball to drop during each bounce. EXTENDING THE MODEL ------------------- It would be interesting to change the interaction force to be a more realistic force like the Lenard-Jones 6-12 potential, which is Hookian in a small range around the equilibrium length, but diminishes for larger extensions and becomes very large for high compression. RELATED MODELS -------------- See the other Entropy Models in this series COPYRIGHT NOTICE ---------------------- Copyright 2006 David McAvity This model was created at the Evergreen State College, in Olympia Washington as part of a series of applets to illustrate principles in physics and biology. Funding was provided by the Plato Royalty Grant. The model may be freely used, modified and redistributed provided this copyright is included and it not used for profit. Contact David McAvity at mcavityd@evergreen.edu if you have questions about its use. @#$#@#$#@ default true 0 Polygon -7500403 true true 150 5 40 250 150 205 260 250 link true 0 Line -7500403 true 150 0 150 300 link direction true 0 Line -7500403 true 150 150 30 225 Line -7500403 true 150 150 270 225 airplane true 0 Polygon -7500403 true true 150 0 135 15 120 60 120 105 15 165 15 195 120 180 135 240 105 270 120 285 150 270 180 285 210 270 165 240 180 180 285 195 285 165 180 105 180 60 165 15 arrow true 0 Polygon -7500403 true true 150 0 0 150 105 150 105 293 195 293 195 150 300 150 box false 0 Polygon -7500403 true true 150 285 285 225 285 75 150 135 Polygon -7500403 true true 150 135 15 75 150 15 285 75 Polygon -7500403 true true 15 75 15 225 150 285 150 135 Line -16777216 false 150 285 150 135 Line -16777216 false 150 135 15 75 Line -16777216 false 150 135 285 75 bug true 0 Circle -7500403 true true 96 182 108 Circle -7500403 true true 110 127 80 Circle -7500403 true true 110 75 80 Line -7500403 true 150 100 80 30 Line -7500403 true 150 100 220 30 butterfly true 0 Polygon -7500403 true true 150 165 209 199 225 225 225 255 195 270 165 255 150 240 Polygon -7500403 true true 150 165 89 198 75 225 75 255 105 270 135 255 150 240 Polygon -7500403 true true 139 148 100 105 55 90 25 90 10 105 10 135 25 180 40 195 85 194 139 163 Polygon -7500403 true true 162 150 200 105 245 90 275 90 290 105 290 135 275 180 260 195 215 195 162 165 Polygon -16777216 true false 150 255 135 225 120 150 135 120 150 105 165 120 180 150 165 225 Circle -16777216 true false 135 90 30 Line -16777216 false 150 105 195 60 Line -16777216 false 150 105 105 60 car false 0 Polygon -7500403 true true 300 180 279 164 261 144 240 135 226 132 213 106 203 84 185 63 159 50 135 50 75 60 0 150 0 165 0 225 300 225 300 180 Circle -16777216 true false 180 180 90 Circle -16777216 true false 30 180 90 Polygon -16777216 true false 162 80 132 78 134 135 209 135 194 105 189 96 180 89 Circle -7500403 true true 47 195 58 Circle -7500403 true true 195 195 58 circle false 0 Circle -7500403 true true 0 0 300 circle 2 false 0 Circle -7500403 true true 0 0 300 Circle -16777216 true false 30 30 240 cow false 0 Polygon -7500403 true true 200 193 197 249 179 249 177 196 166 187 140 189 93 191 78 179 72 211 49 209 48 181 37 149 25 120 25 89 45 72 103 84 179 75 198 76 252 64 272 81 293 103 285 121 255 121 242 118 224 167 Polygon -7500403 true true 73 210 86 251 62 249 48 208 Polygon -7500403 true true 25 114 16 195 9 204 23 213 25 200 39 123 cylinder false 0 Circle -7500403 true true 0 0 300 dot false 0 Circle -7500403 true true 90 90 120 face happy false 0 Circle -7500403 true true 8 8 285 Circle -16777216 true false 60 75 60 Circle -16777216 true false 180 75 60 Polygon -16777216 true false 150 255 90 239 62 213 47 191 67 179 90 203 109 218 150 225 192 218 210 203 227 181 251 194 236 217 212 240 face neutral false 0 Circle -7500403 true true 8 7 285 Circle -16777216 true false 60 75 60 Circle -16777216 true false 180 75 60 Rectangle -16777216 true false 60 195 240 225 face sad false 0 Circle -7500403 true true 8 8 285 Circle -16777216 true false 60 75 60 Circle -16777216 true false 180 75 60 Polygon -16777216 true false 150 168 90 184 62 210 47 232 67 244 90 220 109 205 150 198 192 205 210 220 227 242 251 229 236 206 212 183 fish false 0 Polygon -1 true false 44 131 21 87 15 86 0 120 15 150 0 180 13 214 20 212 45 166 Polygon -1 true false 135 195 119 235 95 218 76 210 46 204 60 165 Polygon -1 true false 75 45 83 77 71 103 86 114 166 78 135 60 Polygon -7500403 true true 30 136 151 77 226 81 280 119 292 146 292 160 287 170 270 195 195 210 151 212 30 166 Circle -16777216 true false 215 106 30 flag false 0 Rectangle -7500403 true true 60 15 75 300 Polygon -7500403 true true 90 150 270 90 90 30 Line -7500403 true 75 135 90 135 Line -7500403 true 75 45 90 45 flower false 0 Polygon -10899396 true false 135 120 165 165 180 210 180 240 150 300 165 300 195 240 195 195 165 135 Circle -7500403 true true 85 132 38 Circle -7500403 true true 130 147 38 Circle -7500403 true true 192 85 38 Circle -7500403 true true 85 40 38 Circle -7500403 true true 177 40 38 Circle -7500403 true true 177 132 38 Circle -7500403 true true 70 85 38 Circle -7500403 true true 130 25 38 Circle -7500403 true true 96 51 108 Circle -16777216 true false 113 68 74 Polygon -10899396 true false 189 233 219 188 249 173 279 188 234 218 Polygon -10899396 true false 180 255 150 210 105 210 75 240 135 240 house false 0 Rectangle -7500403 true true 45 120 255 285 Rectangle -16777216 true false 120 210 180 285 Polygon -7500403 true true 15 120 150 15 285 120 Line -16777216 false 30 120 270 120 leaf false 0 Polygon -7500403 true true 150 210 135 195 120 210 60 210 30 195 60 180 60 165 15 135 30 120 15 105 40 104 45 90 60 90 90 105 105 120 120 120 105 60 120 60 135 30 150 15 165 30 180 60 195 60 180 120 195 120 210 105 240 90 255 90 263 104 285 105 270 120 285 135 240 165 240 180 270 195 240 210 180 210 165 195 Polygon -7500403 true true 135 195 135 240 120 255 105 255 105 285 135 285 165 240 165 195 line true 0 Line -7500403 true 150 0 150 300 line half true 0 Line -7500403 true 150 0 150 150 pentagon false 0 Polygon -7500403 true true 150 15 15 120 60 285 240 285 285 120 person false 0 Circle -7500403 true true 110 5 80 Polygon -7500403 true true 105 90 120 195 90 285 105 300 135 300 150 225 165 300 195 300 210 285 180 195 195 90 Rectangle -7500403 true true 127 79 172 94 Polygon -7500403 true true 195 90 240 150 225 180 165 105 Polygon -7500403 true true 105 90 60 150 75 180 135 105 plant false 0 Rectangle -7500403 true true 135 90 165 300 Polygon -7500403 true true 135 255 90 210 45 195 75 255 135 285 Polygon -7500403 true true 165 255 210 210 255 195 225 255 165 285 Polygon -7500403 true true 135 180 90 135 45 120 75 180 135 210 Polygon -7500403 true true 165 180 165 210 225 180 255 120 210 135 Polygon -7500403 true true 135 105 90 60 45 45 75 105 135 135 Polygon -7500403 true true 165 105 165 135 225 105 255 45 210 60 Polygon -7500403 true true 135 90 120 45 150 15 180 45 165 90 square false 0 Rectangle -7500403 true true 30 30 270 270 square 2 false 0 Rectangle -7500403 true true 30 30 270 270 Rectangle -16777216 true false 60 60 240 240 star false 0 Polygon -7500403 true true 151 1 185 108 298 108 207 175 242 282 151 216 59 282 94 175 3 108 116 108 target false 0 Circle -7500403 true true 0 0 300 Circle -16777216 true false 30 30 240 Circle -7500403 true true 60 60 180 Circle -16777216 true false 90 90 120 Circle -7500403 true true 120 120 60 tree false 0 Circle -7500403 true true 118 3 94 Rectangle -6459832 true false 120 195 180 300 Circle -7500403 true true 65 21 108 Circle -7500403 true true 116 41 127 Circle -7500403 true true 45 90 120 Circle -7500403 true true 104 74 152 triangle false 0 Polygon -7500403 true true 150 30 15 255 285 255 triangle 2 false 0 Polygon -7500403 true true 150 30 15 255 285 255 Polygon -16777216 true false 151 99 225 223 75 224 truck false 0 Rectangle -7500403 true true 4 45 195 187 Polygon -7500403 true true 296 193 296 150 259 134 244 104 208 104 207 194 Rectangle -1 true false 195 60 195 105 Polygon -16777216 true false 238 112 252 141 219 141 218 112 Circle -16777216 true false 234 174 42 Rectangle -7500403 true true 181 185 214 194 Circle -16777216 true false 144 174 42 Circle -16777216 true false 24 174 42 Circle -7500403 false true 24 174 42 Circle -7500403 false true 144 174 42 Circle -7500403 false true 234 174 42 turtle true 0 Polygon -10899396 true false 215 204 240 233 246 254 228 266 215 252 193 210 Polygon -10899396 true false 195 90 225 75 245 75 260 89 269 108 261 124 240 105 225 105 210 105 Polygon -10899396 true false 105 90 75 75 55 75 40 89 31 108 39 124 60 105 75 105 90 105 Polygon -10899396 true false 132 85 134 64 107 51 108 17 150 2 192 18 192 52 169 65 172 87 Polygon -10899396 true false 85 204 60 233 54 254 72 266 85 252 107 210 Polygon -7500403 true true 119 75 179 75 209 101 224 135 220 225 175 261 128 261 81 224 74 135 88 99 wheel false 0 Circle -7500403 true true 3 3 294 Circle -16777216 true false 30 30 240 Line -7500403 true 150 285 150 15 Line -7500403 true 15 150 285 150 Circle -7500403 true true 120 120 60 Line -7500403 true 216 40 79 269 Line -7500403 true 40 84 269 221 Line -7500403 true 40 216 269 79 Line -7500403 true 84 40 221 269 x false 0 Polygon -7500403 true true 270 75 225 30 30 225 75 270 Polygon -7500403 true true 30 75 75 30 270 225 225 270 @#$#@#$#@ NetLogo 3.1 @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ @#$#@#$#@