Created with
NetLogo version NetLogo 3.0.2

Running with NetLogoLite.jar version 302.

This project simulates wave motion within a membrane. It is based on the original Wave Machine from the NetLogo Model library. The four edges of a membrane are (optionaly) fixed to a frame. A selected green rectangular or circular area is connected to a plate that moves up and down, exhibiting sinusoidal motion. Rather than just showing the nodes of the membrane, extra turtles are used to show the edges connecting the nodes of the membrane. Also, the points of the membrane are free to move in three dimentions.

Controls that must be set before SETUP:

The GRID-SIZE slider controls the number of "nodes" in the membrane.

The number of turtles is the GRID-SIZE squared.

This is the resolution of the membrane.

The WIDTH slider controls the size of the driving plate (the number of green turtles)

The X-D-POINT slider controls the x-coordinate of the center of the driving force.

The Y-D-POINT slider controls the y-coordinate of the center of the driving force.

Controls of membrane properties:

The FRICTION slider controls the amount of friction or attenuation in the membrane.

The K slider controls the stiffness, really the force exerted on a turtle by a unit deflection difference between the turtle and its four neighbors.

Controls of the driving force:

The FREQUENCY slider controls the frequency at which the green selected area of the membrane (the driving force) moves up and down.

The AMPLITUDE slider controls the maximum height of the green area of the membrane.

Move? starts or stops the plate

Connected? connects or disconnects the plate from the membrane. if the plate is disconnected, the membrane moves freely.

Controls for viewing:

The THREE-D? switch controls the view point of the projection. OFF is for the top view (2-D looking down), and ON gives a rotateable perpective view.

Theta-x is the amount the view is rotated in the x axis

Theta-z is the amount the view is rotated in the z axis.

Delta-tx is the amount that theta-x is automatically incremented.

Delta-tz is the amount that theta-z is automatically incremented.

Click the SETUP button to set up the membrane. Click GO to make the selected area of the membrane (the green turtles) begin moving up and down.

The membrane is made up of lines of turtles. Each turtle acts as it were connected to its four neighboring turtles by springs. In the prior model, turtles move only up and down -- the force's direction IS only up and down. The greater the distance between a turtle and its neighbors, the stronger the force.

In this version, turtles can move in any direction. Forces along the x, y, and z axis are added together to obtain the net force the turtles neighbors exert on it. (A force of zero would be all turtles right on top of each other)

When the selected area of the membrane (the green turtles) moves up, they "pull" the turtles which are their neighbors, which in turn pull up the turtles which are their neighbors, and so on. In that way, a wave moves within the membrane. When the wave reaches the edges of the membrane (the blue turtles), the wave is reflected back to the center of the membrane.

The green turtles (within the selected area) continue to put more energy into the membrane. If there were no friction in the membrane, the waves in the membrane would keep getting bigger and bigger.

To render the membrane to the edge of the window, the edges "rays" use a trick. Since they are drawn from a source to a target, if the source or the target was off the screen, they couldn't be drawn. So instead, what the rays do is change context, and always draw from the on-screen end-point out, rather than always drawing from one end-point or the other. They point towards the virtual, rather than the actual, endpoint.

Try different membranes. Soft membranes have smaller stiffness values and hard membranes have larger stiffness values.

Try different driving forces, or try changing the frequency or amplitude. It is very interesting to change the size and the position of the driving force to see symmetrical and asymmetrical wave motions.

Try to create a "standing wave," in which some points in the membrane do not move at all.

Try releaseing the membrane border, see how the constrained border affects the behavior of the membrane.

Change the value of gravity. How does gravity affect the membrane?

NetLogo Version: NetLogo 3.0.2

;;;; Summary ;; An enhanced 3d wave machine ;; COPYRIGHT & LICENSE ;;;; Copyright (C) 2005 James P. Steiner ;;;; Based on prior work (C) Uri Wilensky. See code for details. ;;;; Some Rights Reserved, Creative Commons Attribution-NonCommercial-ShareAlike License v. 2.0. ;;;; Visit http://creativecommons.org/licenses/by-nc-sa/2.0/ for more information. ;;; globals [ rows cols max-peak max-pit curr-peak curr-pit dist-fact time drive-zpos setup-2d? old-freq old-3d old-x-d-point old-y-d-point old-width old-boundary old-pers pers-exp spacing ; all-nodes drive-nodes free-nodes edge-nodes grid-edge xtheta-control ytheta-control oldmx oldmy ] breeds [ nodes rays ] nodes-own [ x1 y1 z1 ;; computed xcor ycor zpos xpos ypos zvel ;; zcor component of velocity xvel yvel xorig yorig zorig p phi theta node-type link-set link-set-2 link-count link-count-2 i zpos-sum zpos-count neighbor xpos-sum xpos-count ypos-sum ypos-count row col vxcor vycor vzcor ] rays-own [ source target col row link-set vxcor vycor ] to setup locals [ ] no-display ca clear-output set setup-2d? not three-d? set rows grid-size set cols grid-size set grid-edge (grid-size - 1) / 2 set dist-fact 1 / ( sqrt 2 ) cct-nodes grid-size * grid-size ;; create enough nodes to fill a square grid [ hide-turtle set color base-color set node-type 1 ; free-node ;; line up the turtles so that turtle who + 1 is on your right, ;; turtle who - 1 is on your left, turtle who + columns, ;; is beneath you, and turtle who - columns is above you. set row int ( who / grid-size ) set col (who mod grid-size) set xorig (0.0 - .5 * cols + col ) set yorig (0.0 - .5 * rows + row ) set zorig 0 set zvel 0 set zpos 0 set xpos xorig set ypos yorig set time 0 set shape "small-pix" ] define-node-links define-nodes define-rays ; for wire-frame view set constrained? true go display end to define-nodes define-node-types define-node-sets end to define-node-types define-free-nodes define-drive-nodes define-edge-nodes end to define-node-links ask nodes ;; each turtle has an agent set that points to it's neighbor turtles [ without-interruption [ set link-set nodes with [ ( ( row = row-of myself ) and ( abs ( col - col-of myself ) = 1 ) ) or ( ( col = col-of myself ) and ( abs ( row - row-of myself ) = 1 ) ) ] set link-count count link-set ] ] end to get-peak locals [new-peak new-pit] set new-peak max values-from turtles [zpos] if new-peak > max-peak [ set max-peak new-peak ] set new-pit min values-from turtles [zpos] set-current-plot-pen "peak" plot new-peak set-current-plot-pen "pit" plot new-pit end to define-node-sets set free-nodes turtles with [ node-type = 1 ] set drive-nodes turtles with [ node-type = 2 ] set edge-nodes turtles with [ node-type = 3 ] end to define-free-nodes ask turtles [ set node-type 1 ; free-node ] end to define-edge-nodes ;; observer procedure ;; color edges of wave "membrane" blue ask turtles with [ row = 0 or row = grid-size - 1 or col = 0 or col = grid-size - 1 ] [ set node-type 3 ; edge set color edge-color ] end to define-drive-nodes ;;observer procedure ;; tell turtles that they are part of the the drive point ifelse circular-dp? [ ask turtles with [ sqrt( (row - rows * .5 - x-d-point + .5) ^ 2 + (col - cols * .5 - y-d-point + .5) ^ 2 ) + 1 <= width ] [ set node-type 2 ; drive-plate set color green ] ] [ ask turtles with [ row >= ( rows * .5 + x-d-point - width - 1 ) and row <= ( rows * .5 + x-d-point + width ) and col >= ( cols * .5 + y-d-point - width - 1 ) and col <= ( cols * .5 + y-d-point + width ) ] [ set node-type 2 ; drive-plate set color green ] ] end to define-rays ; for wire-frame view ask nodes [ if any? link-set with [ (col - 1) = col-of myself ] [ hatch 1 [ set breed rays set shape "ray" set source myself set target one-of (link-set) with [ (col - 1) = col-of myself ] ] ] if any? link-set with [ (row - 1) = row-of myself ] [ hatch 1 [ set breed rays set shape "ray" set source myself set target one-of (link-set) with [ (row - 1) = row-of myself ] ] ] ] end to go if move? [ set time time + speed set drive-zpos (amplitude * grid-size * (sin (time))) ] drive-force project if not any? free-nodes [stop] end to-report dist-3d [ b a ] locals [ ax ay az bx by bz dist ] set ax xpos-of a set ay ypos-of a set az zpos-of a set bx xpos-of b set by ypos-of b set bz zpos-of b set dist sqrt ((ax - bx) ^ 2 + (ay - by) ^ 2 + (az - bz) ^ 2 ) ifelse dist = 0 [ report 0.000001 ] [ report dist ] end to drive-force ;; turtle procedure ;; propagates the wave to neighboring turtles ifelse connected? [ ask drive-nodes [ set zpos drive-zpos set ypos yorig set xpos xorig ] ] [ ask drive-nodes [ accelerate ] ] ifelse constrained? [ ask edge-nodes [ set zvel 0 set xvel 0 set yvel 0 if xpos != xorig [set xpos xpos + ( xorig - xpos ) * .1] if ypos != yorig [set ypos ypos + ( yorig - ypos ) * .1] if zpos != zorig [set zpos zpos + ( zorig - zpos ) * .1] ] ] [ ask edge-nodes [ accelerate ] ] ask free-nodes [ accelerate ] end to color-nodes locals [ allz maxz minz ] set allz values-from nodes [ zpos ] set minz abs min allz set maxz abs max allz ifelse minz > maxz [ set maxz minz ] [ set minz maxz ] set minz 0 - minz if minz = maxz [ set minz minz - 1 set maxz maxz + 1 ] set minz minz * 1.1 set maxz maxz * 1.1 ask free-nodes [ set color scale-color base-color zpos minz maxz ] ask edge-nodes [ set color edge-color ] ; scale-color edge-color zpos minz maxz show-turtle ] ask drive-nodes [ set color drive-color ] ; scale-color green zpos minz maxz show-turtle ] end to accelerate set link-count count link-set ;; add up inter-node forces set xpos-sum ( sum ( map [ ( ( ?1 - xpos) + ( 0 - ?2 + xorig ) ) ] ( values-from link-set [ xpos ]) ( values-from link-set [ xorig ]) ; ( values-from link-set [ (dist-3d myself self) ] ) ) ) / link-count set ypos-sum ( sum ( map [ ( ( ?1 - ypos) + ( 0 - ?2 + yorig ) ) ] ( values-from link-set [ ypos ] ) ( values-from link-set [ yorig ] ) ; ( values-from link-set [ ( dist-3d myself self ) ] ) ) ) / link-count set zpos-sum ( sum ( map [ ( ( ?1 - zpos ) + ( 0 - ?2 + zorig ) ) ] ( values-from link-set [ zpos ] ) ( values-from link-set [ zorig ] ) ; ( values-from link-set [ ( dist-3d myself self ) ] ) ) ) / link-count ;; apply acceleration due to inter-atom forces set zvel zvel + (k * zpos-sum ) set xvel xvel + (k * xpos-sum ) set yvel yvel + (k * ypos-sum ) ;; apply (de)acceleration due to viscosity set zvel zvel * (1 - friction) set xvel xvel * (1 - friction) set yvel yvel * (1 - friction) ;; apply deelleration due to extreme occeclation ;if zvel > grid-size ;[ set xvel xvel * ( 1 - ( (log xvel 10) * .1 )) ; set yvel yvel * ( 1 - ( (log yvel 10) * .1 )) ; set zvel zvel * ( 1 - ( (log zvel 10) * .1 )) ;] ;; apply acceleration due to gravity set zvel zvel - gravity set zpos (zpos + zvel) set xpos (xpos + xvel) set ypos (ypos + yvel) end to project ifelse three-d? [ set setup-2d? false project-3d ] [ if any? rays with [ not hidden? ] [ ask rays [ hide-turtle ] ] project-2d ] color-nodes end to project-3d set theta-x (theta-x + delta-tx) mod 360 set theta-z (theta-z + delta-tz) mod 360 ;if perspective != old-pers ;[ set old-pers perspective ; set pers-exp 10 ^ perspective ;] monitor-mouse ask nodes [ set x1 xpos set y1 ypos set z1 zpos rotate-on-z-axis rotate-on-x-axis set vzcor y1 - (nearness * .01 * screen-edge-y) set vxcor ((0 - x1) * ( 1 - ( (vzcor) / (vzcor + perspective )))) / eye set vycor ((0 - z1) * ( 1 - ( (vzcor) / (vzcor + perspective )))) / eye + (altitude * .01 * screen-edge-y) ] ask nodes [ ifelse abs vycor > screen-edge-y or abs vxcor > screen-edge-x or vzcor < 0 - perspective [ hide-turtle ] [ set xcor vxcor set ycor vycor show-turtle ] ] ask rays [ ifelse (hidden?-of source) [ ifelse (hidden?-of target) [ hide-turtle ] [ setxy (vxcor-of target) (vycor-of target) set heading towardsxy-nowrap (vxcor-of source) (vycor-of source) set size distancexy-nowrap (vxcor-of source) (vycor-of source) set color color-of target if hidden? [ show-turtle ] ] ] [ setxy (vxcor-of source) (vycor-of source) set heading towardsxy-nowrap (vxcor-of target) (vycor-of target) set size distancexy-nowrap (vxcor-of target) (vycor-of target) set color color-of target if hidden? [ show-turtle ] ] ;; don't draw turtles that "wrap" around the edge of the ;; screen; we need no-display, above, because otherwise ;; the turtle would briefly be drawn before the hide-turtle ;; command had a chance to take effect ] end to project-2d ;; this is only needed for if the user turns three-d? off ;; while the model is running color-nodes ask nodes [ setxy xpos ypos show-turtle ] end to rotate-on-z-axis ; rotate nodes on z axis set p sqrt((x1 * x1) + (y1 * y1) + (z1 * z1)) set phi (atan sqrt((x1 * x1) + (y1 * y1)) z1) set theta (atan y1 x1) set theta theta + (theta-z mod 360) ; incrementing the angle to simulate rotation set y1 (p * (sin phi) * (sin theta)) set x1 (p * (sin phi) * (cos theta)) ; z is not changed by change in theta ; set z1 (p * (cos phi)) end to rotate-on-x-axis set p sqrt ( ( x1 ^ 2 ) + ( y1 ^ 2 ) + ( z1 ^ 2 ) ) set phi ( atan sqrt ( ( y1 ^ 2 ) + ( z1 ^ 2 ) ) x1 ) set theta ( atan z1 y1 ) set theta theta + ( theta-x mod 360 ) ; incrementing the angle to simulate rotation set y1 ( p * ( sin phi ) * ( sin theta ) ) set z1 ( p * ( sin phi ) * ( cos theta ) ) set x1 ( p * ( cos phi ) ) end to disintegrate ; end to event-manager every .1 [ if x-d-point != old-x-d-point or y-d-point != old-y-d-point or width != old-width [ print "Change Drive Point" set old-x-d-point x-d-point set old-y-d-point y-d-point set old-width width define-nodes ] ] end to monitor-mouse locals [ mx my ] ifelse mouse-down? [ set mx mouse-xcor set my mouse-ycor if oldmx = -9999 [ set oldmx mx set oldmy my ] if oldmx != mx or oldmy != my [ set theta-x (theta-x - (oldmy - my ) ) mod 360 set theta-z (theta-z - (oldmx - mx ) ) mod 360 set oldmx mx set oldmy my ] ] [ set oldmx -9999 ] if shape-of one-of rays != edge-shape [ ask rays [ set shape edge-shape ] ] end ; ***NetLogo Model Copyright Notice*** ; This model was created as part of the project: CONNECTED MATHEMATICS: ; MAKING SENSE OF COMPLEX PHENOMENA THROUGH BUILDING OBJECT-BASED PARALLEL ; MODELS (OBPML) ; The project gratefully acknowledges the support of the National Science ; Foundation (Applications of Advanced Technologies Program) -- grant numbers ; RED #9552950 and REC #9632612. ; Copyright 1996 by Uri Wilensky. All rights reserved. ; converted to NetLogo from StarLogoT, 2001. ; 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. ; To refer to this model in academic publications, please use: ; Wilensky, U. (1996). NetLogo Wave Machine model. ; http://ccl.northwestern.edu/netlogo/models/WaveMachine. ; Center for Connected Learning and Computer-Based Modeling, ; Northwestern University, Evanston, IL. ; ***End NetLogo Model Copyright Notice***

wave-machine_6.1

View or download the complete model file (to download: right-click, save-link-as):

-- Download wave-machine_6.1 --