Salmon migration and mating in the Snake River
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
WHAT IS IT?
This model simulates salmon migration up a large river body, specifically the Salmon River, but could be tweaked to represent the Columbia. Large dams impede migration on these rivers, so the fish must try to navigate fish ladders and avoid fallback after they get over the dam. Recently, some organizations have suggested removing dams in the Snake River, so this model can help to say to what extent that would help fish populations.
HOW IT WORKS
Once fish start migrating, they follow a set of rules and probabilities. They are assigned a swimming speed and move upstream, experiencing a small chance of mortality on any turn. When they encounter a dam, they must spend time (and a greater exposure to mortality) as they try to cross it. If the fish learns how to cross ladders, then it is more likely to cross the next one more quickly.
HOW TO USE IT
Setup: Sets up the world and agents
Go: Runs the program
Initial-number-fish: Input a whole number to create starting number of agents
Probability-of-starting-migration: This is the probability that a fish will start their migration on each tick at the first dam in the Snake River. This is to spread the fish out to get a more realistic spread of arrival times at the last dam.
Initial-mortality-constant: This is the probability that on any given tick a fish will die. Mortality factors here include: fishing, predators, disease, or being lost to a smaller tributary.
Dam-death-multiplier: Additional mortality factors occur while fish are trying to cross a dam. This input multiplies the initial-mortality-constant for as long as the fish is trying to cross.
Probability-making-thru-dam: If fish is at a dam, this is the initial likelihood of crossing the dam on any given tick. More about this in Dam-learning?
Flow-rate: River discharge rate, in m3/s. Historical data can be found online. Typical values are ~3500-4500 for spring, and ~500-1200 for the fall.
RiverTemp-Fahrenheit: River temperature in Fahrenheit. Typical values in the spring are ~45-50 and in the fall, ~65-70.
Speed-stdev: Changes how great of a spread of swimming velocities the fish have.
Destroy-dam-XX: These three switches allow you to 'destroy' dams 2, 3, and 4. This allows fish to pass freely through where the structures impeded them before.
Dam-learning?: This switch lets you decide if the fish 'learn' how to cross dams. That is, a fish that was more successful in a prior dam crossing is more likely to be more successful in upstream crossings.
THINGS TO NOTICE
Notice how if probability-of-making-through dam is low that the fish get hung up at each dam crossing? Additionally, there is greater mortality there so more fish die. Also, you'll see a greater spread of fish arriving at the end if dam-learning? is turned on and the output 'Mean time at dam' will be lower.
THINGS TO TRY
Play with all of the sliders! Ones that are particularly interesting are: initial-mortality-constant, probability-of-making-through-dam, speed-stdev, destroying dams, and dam-learning?
EXTENDING THE MODEL
Daily fish counts exist at these dams. So, you could force the model each 24 ticks with the daily counts from Ice Harbor Dam (1st one) and get rid of the probability-of-starting-migration slider. Then, you'd be able to see much more accurately and precisely how the fish arriving at the last dam (Lower Granite) match that dam's actual daily fish count.
Can you find where along the path the fish experience death the most?
You could extend the model to include full migration with the 4 dams downstream on the Columbia River. The tricky part would be estimating which proportion of fish choose to go up the Snake River instead of continuing up the Columbia.
CREDITS AND REFERENCES
Thanks to Ben Pauli for teaching the class and learning us up real good in NetLogo. Also, thanks to Andrea Leonard, Reggie Walters, Shital Dhakal, and Hamid Dashti for providing input and feedback on model design.
Salinger, D. H., & Anderson, J. J. (2006). Effects of water temperature and flow on adult salmon migration swim speed and delay. Transactions of the American Fisheries Society, 135(1), 188-199.
Comments and Questions
;: All credit for base model created by Amy Steimke, Boise State University ;: Further edits by Colin McCarthy, Whitman College ;: Last edit: 4/17/17 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;; PARAMETERS ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; currently: 1 tick = 1 hour, ; each patch = 1 km ( with the exception of dams ) globals [ velocity ] ; average velocity of movement (km/hr), calculated in set-velocity procedure turtles-own [ start-movement ; true/false, says if they can start migrating movement-speed ; fish's velocity, remains constant thru each run prob-death ; probability of death on any tick while migrating at-dam? ; if turtle is within 1 tick of a dam, goes to true time-at-dam ; total time turtle spends at dams probability-of-passage ; probability of passing through a dam matelife ; time alive once at end of the model partner ; numerical value representing partner agent probability-of-reproduction ; probability that reproduction is successful ] patches-own [ dam1 ; x-coordinate of Ice Harbor Dam (first one) dam2 ; x-coordinate of Lower Monumental Dam (second dam) dam3 ; x-coordinate of Little Goose Dam (third dam) dam4 ; x-coordinate of Lower Granite Dam (last one) matezone ; x-coordinate of mating zone ] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;:::;;;;;;;;;;;;;;;;;::: SETUP ;:;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to setup clear-all reset-ticks file-close set-velocity setup-patches setup-turtles destroy-dams end ;;; creates river corridor and locations of dams ;;; to setup-patches ask patches [ set pcolor 55 ; sets up river banks set dam1 1 ; these 4 lines are x-coordinates of the dams set dam2 52 set dam3 97 set dam4 157 set matezone 167 if (pycor < 10) and (pycor > -10) [ set pcolor 105 ] ; sets up river corridor if (pxcor = dam1) [ set pcolor 2 ] ; sets up first dam if (pxcor = dam2) [ set pcolor 2 ] ; sets up second dam if (pxcor = dam3) [ set pcolor 2 ] ; sets up third dam if (pxcor = dam4) [ set pcolor 2 ] ; sets up last dam if ((pxcor = matezone and pycor < -1) or (pxcor = matezone and pycor > 1)) [set pcolor 15] ] end ;;; sets average velocity for fish ;;; to set-velocity ; velocity equation from Salinger & Anderson, 2006 let flow (FlowRate-m3/s / 1000) ; flowrate in 10^3 m3/s let rivertemp (( RiverTemp-farenheit - 32 ) / 1.8 ) ; change river temperature to Celsius ifelse rivertemp <= 16.3 [ set velocity ((27.3 + ( 2 * rivertemp ) - (1.5 * flow)) / 24)] ; velocity in km/hr for temperatures below 16.3C [ set velocity ((100.7 - ( 2.5 * rivertemp) - (1.5 * flow)) / 24)] ; velocity in km/hr for temperatures above 16.3C end ;;; sets up initial fish variables ;;; to setup-turtles create-turtles initial-number-fish [ choose-sex set shape "fish" set size 2 setxy 2 8 - random(17) ; places fish in starting corridor set heading 90 set probability-of-passage probability-making-thru-dam set at-dam? false set time-at-dam 0 set matelife abs(round(random-normal 24 24)) set probability-of-reproduction probability-successfully-reproducing set partner 0 set start-movement false set movement-speed random-normal velocity speed-stdev ; normally distributes speeds based off of calculated velocity and chosen stdev from slider on interface if movement-speed <= 0 [set movement-speed movement-speed * -1] ; makes sure movement-speed is not negative, otherwise error occurs while checking for dams and is unrealistic ] end to choose-sex ;; turtle procedure for determining sex of agent set color one-of [magenta red]; end ;;; procedure for destroying dams in the world, switches are on the interface ;;; to destroy-dams if destroy-dam-2? ; procedure for destroying 2nd dam [ask patches [if pxcor = dam2 [if (pycor < 10) and (pycor > -10) [ set pcolor 105 ]] ] ] if destroy-dam-3? ; procedure for destroying 3rd dam [ask patches [if pxcor = dam3 [if (pycor < 10) and (pycor > -10) [ set pcolor 105 ]] ] ] if destroy-dam-4? ; procedure for destroying 4th dam [ask patches [if pxcor = dam4 [if (pycor < 10) and (pycor > -10) [ set pcolor 105 ]] ] ] end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; MOVEMENT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to go tick start-migration move-turtles fish-die mate if-else Opportunity-Mating? [if not any? turtles with [xcor < matezone + 1 and matelife > 0] [stop] ; stops ticking once all fish are past last dam and have had the chance to mate ] [if not any? turtles with [xcor < dam4 ] [stop] ; stops ticking once all fish are past last dam ignoring the mating submodel ] check-for-dams dam-learn end ; procedure tells turtles when they can start moving, and when to stop movement after last dam to start-migration ask turtles [ if random-float 1 < probability-of-starting-migration ; starts fish migrating [set start-movement true] if xcor > dam4 + movement-speed ; stops fish migrating [set start-movement false] ] end ; procedure checks for dams ahead of turtle in the length of their movement-speed (only get stopped once by each dam) to check-for-dams ask turtles [ ifelse any? patches in-cone movement-speed 1 with [pcolor = 2] ; checks for dams ahead of them [set at-dam? true] [set at-dam? false] if at-dam? = true [set time-at-dam time-at-dam + 1] ; calculates how many ticks they are stopped by dams ] end ; procedure calls for fish who have successfully navigated previous dams in a shorter period of time to have a ; higher likelihood of navigating next dam they encounter more quickly to dam-learn if dam-learning? ; switch is located on interface [ask turtles [ if at-dam? = true and xcor > dam2 and xcor < dam3 and time-at-dam <= 3 ; if second dam crossing took 3 or less ticks, they will get a higher probability for next dam [set probability-of-passage probability-of-passage * (random-float 1 + 1) ] ; will multiply their previous probability anywhere from ~1.01 - 1.99 if at-dam? = true and xcor > dam3 and xcor < dam4 and time-at-dam <= 5 ; if second & third dam crossings took 5 or less ticks, they will get a higher probability for next dam [set probability-of-passage probability-of-passage * (random-float 1 + 1) ] ; will multiply their previous probability anywhere from ~1.01 - 1.99 ] ] end to mate if Opportunity-Mating? [ask turtles [if (xcor >= dam4 and xcor < dam4 + 9) [setxy matezone 0] if xcor = matezone [set matelife matelife - 1 if partner = 0 [set partner one-of other turtles with [partner = 0 and color != [color] of myself and xcor = matezone] ifelse partner = nobody [set partner 0] [ask partner [ set partner myself ] ] ] if matelife != nobody [if matelife <= 0 [die] ] if partner != nobody [if partner != 0 [if color = magenta [setxy matezone + 5 8 - random(17) set color pink] ] ] ] ] ] end ; procedure for movement; each tick turtles move their movement-speed (km/hr) ; if at-dam? is true for turtle, then turtle takes time trying to navigate/find fish ladder to cross dam to move-turtles ask turtles [ if start-movement = true [ ifelse at-dam? = false [ set heading 90 forward movement-speed] [if random-float 1 < probability-of-passage ; set on interface tab, probability of fish finding the ladder [set heading 90 forward movement-speed] ] ] ] end ; Procedure for fish to die on each tick with probability set on interface tab ; Mortality factors - fishing, disease, unsuccessful dam crossing to fish-die ask turtles [ ifelse at-dam? = false [if xcor <= dam4 [set prob-death initial-mortality-constant] ; chance of dying on any turn if xcor > dam4 [set prob-death 0 ] ; no death after the cross 4th dam ] [ set prob-death initial-mortality-constant * dam-death-multiplier ] ; higher likelihood of death while they are trying to cross dam if random-float 1 < prob-death [die] ; death procedure ] end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;; END ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
There is only one version of this model, created over 8 years ago by Colin McCarthy.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
Salmon migration and mating in the Snake River.png | preview | Preview for 'Salmon migration and mating in the Snake River' | over 8 years ago, by Colin McCarthy | Download |
This model does not have any ancestors.
This model does not have any descendants.