Sound through a medium

No preview image

1 collaborator

Default-person Michael Novak (Author)

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by the author
Model was written in NetLogo 6.0.1 • Viewed 564 times • Downloaded 21 times • Run 0 times
Download the 'Sound through a medium' 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?

HOW IT WORKS

HOW TO USE IT

THINGS TO TRY

EXTENDING THE MODEL

NETLOGO FEATURES

CREDITS AND REFERENCES

Developed by Michael Novak, Northwestern University, Evanston, IL.

This model is based on the code from the NetLogo Wave Machine model: http://ccl.northwestern.edu/netlogo/models/WaveMachine. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.

HOW TO CITE

If you mention this model in a publication, we ask that you include this citation

COPYRIGHT AND LICENSE

Copyright 1997 Uri Wilensky.

CC BY-NC-SA 3.0

This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Commercial licenses are also available. To inquire about commercial licenses, please contact Uri Wilensky at uri@northwestern.edu.

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.

This model was converted to NetLogo as part of the projects: PARTICIPATORY SIMULATIONS: NETWORK-BASED DESIGN FOR SYSTEMS LEARNING IN CLASSROOMS and/or INTEGRATED SIMULATION AND MODELING ENVIRONMENT. The project gratefully acknowledges the support of the National Science Foundation (REPP & ROLE programs) -- grant numbers REC #9814682 and REC-0126227. Converted from StarLogoT to NetLogo, 2001.

Comments and Questions

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

Click to Run Model

;extensions [profiler]


globals [
  membrane-edge-x  ;; horizontal distance from center to edge of membrane
  membrane-edge-y  ;; vertical distance from center to edge of membrane
  membrane-center
  detector-value-1
  detector-value-2
  membrane-surface
  atom-batch-twist
 ; driver-vibration-frequency
  red-detector-size
  blue-detector-size
  length-of-simulation
 ; stength-of-push
  empty-space
  #atoms
  vibrate-particles?
  dark-friction-in-medium
  stiffness
  distance-of-blue-squares-from-sound-source
  particle-shape
  friction-in-medium
]


breed [grids grid]
breed [particles particle]
breed [dark-particles dark-particle]
breed [boundaries boundary]
breed [atoms atom ]
breed [detectors detector]
breed [graphics-detectors graphic-detector]

particles-own [
  edge?            ;; are we on the edge of the membrane?
  driver?          ;; are we part of the green driving plate?
  x                ;; position on x axis in space
  y                ;; position on y axis in space
  z                ;; position on z axis in space
  velocity         ;; velocity along z axis
  neighbor-particles ;; agentset of particles adjacent to us
]

dark-particles-own [
  edge?
  driver?
  x                ;; position on x axis in space
  y                ;; position on y axis in space
  z                ;; position on z axis in space
  velocity         ;; velocity along z axis
  neighbor-particles ;; agentset of particles adjacent to us
]

boundaries-own [
  edge?
  driver?
  x                ;; position on x axis in space
  y                ;; position on y axis in space
  z                ;; position on z axis in space
  velocity         ;; velocity along z axis
  neighbor-particles ;; agentset of particles adjacent to us
]


patches-own [detector? detector-number]

atoms-own [kind x y offset-distance tracking?]

to setup
  clear-all
  set stiffness 3.0
  set vibrate-particles? true
  set empty-space 1
  set #atoms 3
  set friction-in-medium 0
  set distance-of-blue-squares-from-sound-source 1
  set dark-friction-in-medium 6
  ;set stength-of-push 15
  set length-of-simulation 499
 ; set driver-vibration-frequency 30
  set red-detector-size 1
  set blue-detector-size 1
  set atom-batch-twist false
  set membrane-surface ""
  set membrane-surface "rigid"
  set particle-shape "offset-circle"

create-graphics-detectors 1 [set color black setxy -3.5 0 set size 6 set shape "detector" set hidden? not show-detector-region?]

  ask patches [set detector? false set pcolor white]
  ask patches with [(pxcor <= max-pxcor  - 1) and pycor = 0]
    [ sprout 1
        [ set breed particles
         ; set color [0 255 0 150]
           set hidden? true
           set edge? false
           set driver? false
           set size 1.1
          if (( pxcor >= (min-pxcor + 2) and pxcor <= min-pxcor + 3) and pxcor != max-pxcor )
             [set driver? true  set shape "rectangle" set color orange set hidden? false set size 3.6
             ; if  pxcor = (min-pxcor + 4) [set shape "half-face"]

           ]
          set x xcor
          set y ycor
          set z 0
          set velocity 0
         ; repack-new
          ]
        ]

   ask patches with [(pxcor <= max-pxcor  - 1) and pycor = 0][
     sprout 1
     [
       set breed dark-particles
       set edge? false
       set driver? false

       set x xcor
       set y ycor
       set z 0

       set velocity 0
       set hidden? true
      ; repack-new
     ]
   ]

   ask patches with [(pxcor = max-pxcor) and pycor >= (min-pycor + empty-space) and pycor <= (max-pycor - empty-space)][
     sprout 1
     [
       set breed boundaries
       set edge? false
       set driver? false
       set color violet
       set x xcor
       set y ycor
       set z 0
       set velocity 0
       set hidden? true
     ;  repack-new
     ]
   ]

  ask particles
    [
      let these-particle-neighbors particles-on neighbors4
      let these-boundary-neighbors boundaries-on neighbors4
      let myxcor x
    ;  if (driver?) [set hidden? false]
    ;  set shape "square"
    ;  set size 2

    ifelse myxcor = (max-pxcor - 1) [set neighbor-particles (turtle-set these-particle-neighbors these-boundary-neighbors) with [x != myxcor] ]
      [  set neighbor-particles these-particle-neighbors with [x != myxcor]  ]
     ]

    ask dark-particles
    [
      let these-dark-neighbors dark-particles-on neighbors4
      let these-boundary-neighbors boundaries-on neighbors4
      let myxcor x
      ifelse myxcor = (max-pxcor - 1) [ set neighbor-particles (turtle-set these-dark-neighbors these-boundary-neighbors) with [x != myxcor]]
      [ set neighbor-particles these-dark-neighbors with [x != myxcor]   ]
   ]

   ask boundaries
    [
      let these-dark-neighbors dark-particles-on neighbors4
      let these-particle-neighbors particles-on neighbors4
      let myxcor x
      set neighbor-particles (turtle-set these-dark-neighbors these-particle-neighbors) with [x != myxcor]
     ]

    ask patches [
     let min-xpos -5

      if (pxcor >= (min-xpos + distance-of-blue-squares-from-sound-source) and pxcor <= (min-xpos + distance-of-blue-squares-from-sound-source + 1)  ) and (abs pycor < 2 )
      [set detector? true]


    ]

  ;  ask patches [
  ;  sprout 1 [set breed grids set shape "grid" set color [255 255 255 55] stamp die]
  ;  ]
  make-atoms-new
   ;   ask atoms [
     ;  ifelse show-particles-in-medium?
   ;    [set hidden? not show-particles-in-medium?]
  ;     [set hidden? not show-particles-in-medium?]
  ;    ]
  repack-new
  calculate-detector-values


  reset-ticks
end 

to make-atoms-new
   let counter-x 0
   let min-x (min-pxcor + 5)
   let x-offset -.45
   let x-offset-2 0
   let x-offset-3 0
   let counter-y 0
   let min-y -1.4
   let closest-particle nobody

   repeat 3 [
   repeat 2 [

   repeat 2 [

     repeat (abs (min-x * 2) + 4) [
       create-atoms 1 [set breed atoms set size (.45 * particle-size) set color [50 175 50] set shape "offset-circle" set hidden? false
            setxy (min-x + counter-x + x-offset + x-offset-2 + x-offset-3 ) (min-y + counter-y)
            set offset-distance (pxcor - xcor)
            rt random 360
            set color [50 175 50]
            set closest-particle min-one-of particles [distance myself]
            create-link-from closest-particle [tie set hidden? true]
            set x xcor
            set y ycor
            set tracking? false
       ]
       set counter-x counter-x + 1

     ]
     set counter-x 0
     set x-offset x-offset + 0.5
     set counter-y counter-y + 0.25
   ]
     set x-offset -.45
     set x-offset-2 x-offset-2 + (0.052)
   ]

     set x-offset -.45
    ; set x-offset-2  0
     set x-offset-3 x-offset-3 - (0.16)

   ]



ask particles with [not edge? and not driver?] [set hidden? true]
end 

to repack  ;; turtle procedure'
  let my-xcor 0
 ask (turtle-set particles boundaries dark-particles) [
  if not edge?
    [
      setxy x y
      set heading -90

      fd z / slide-step

      ]
   ]
end 

to repack-new  ;; turtle procedure'
  let my-xcor 0

  ask (turtle-set particles boundaries dark-particles) [
  if not edge?
    [
      setxy x y
      set heading -90
      fd z / slide-step
      ]
   ]

 ask (particles) [
  if not edge?
    [

      let this-z z
    ;  fd z / slide-step
      if breed = particles and any? link-neighbors [
        set my-xcor x
        let left-neighbor-particle  one-of neighbor-particles with [x < my-xcor]
        let right-neighbor-particle one-of neighbor-particles with [x > my-xcor]
        let z-left [z] of left-neighbor-particle
        let z-right[z] of right-neighbor-particle

        ask link-neighbors [
          set xcor x
          set ycor y
          set heading -90
          fd this-z / slide-step
          if offset-distance < 0 [fd offset-distance *  (z-left  - this-z) / slide-step]
          if offset-distance > 0 [fd offset-distance *  (this-z - z-right) / slide-step]
        ;  if wiggle? [rt random 360]
        ]

       ]  ;ask atoms with []
      ]
   ]
end 

to check-driver

    ask particles

    [
       let driver-vibration-frequency vibration-frequency * 30
      ifelse driver?
        [ set z (vibration-amplitude * -1 * (sin (0.1 * driver-vibration-frequency * ticks)))
          if (0.1 * driver-vibration-frequency * ticks) / 360 >= #-of-repeated-vibrations [set z 0] ]
        [ set z (z + velocity)]
     ; set hidden? true
     ]
  ask boundaries      [ set z (z + velocity)]
  ask dark-particles  [ set z (z + velocity)]
end 

to go
  if (ticks >  length-of-simulation) [stop]


  ask particles with [not edge?]
    [ propagate-across-particles friction-in-medium ]
  ask boundaries
    [ propagate-across-particles friction-in-medium]
  ask dark-particles
    [ propagate-across-particles dark-friction-in-medium]

  check-driver

  check-mouse-click

  repack-new
  calculate-detector-values

  tick
end 

to check-mouse-click
  if mouse-down? and mouse-inside? [
    let this-mouse-xcor mouse-xcor
    let this-mouse-ycor mouse-ycor

    let atoms-near-mouse atoms with [sqrt (((xcor - mouse-xcor) ^ 2) + ((ycor - mouse-ycor) ^ 2)) <= .25  ]
    ask atoms [set tracking? false set color [50 175 50]]
    if any? atoms-near-mouse [ask atoms-near-mouse [set tracking? true]]
  ]


    ifelse mouse-inside?
      [ask atoms with [tracking? = true][set color red] ]
      [ask atoms with [tracking? = true][set tracking? false set color [50 175 50]] ]
end 

to calculate-detector-values
  ask graphics-detectors [set hidden? not show-detector-region?]
end 

to propagate-across-particles [this-friction-in-medium]  ;; turtle procedure -- propagates the wave from neighboring particles
  set velocity (velocity +  (stiffness * 0.01) *  (sum [z] of neighbor-particles -  2 * z))
  set velocity (((1000 - this-friction-in-medium) / 1000) * velocity)
end 

to-report #-atoms-at-detector
  let p 0
  ifelse show-detector-region?
     [set p (count atoms with [pxcor >= -4 and pxcor <= -3] )]
      [set p "N/A"]
  report p
end 





; Copyright 1997 Uri Wilensky.
; See Info tab for full copyright and license.

There is only one version of this model, created about 7 years ago by Michael Novak.

Attached files

No files

This model does not have any ancestors.

This model does not have any descendants.