TESTATEWORLDWORKS2011!
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 the community dynamics of living testate amoebae and monitors the asssocaited preserved tests in the top of an accumulating sphagnum bog. The ecology of testate amoebae is poorly understood; however, relationships to watertable depth are observed. Testates with different watertable depth (WTD) preference are represented by triangle shaped turtles pointing in different directions with different sizes. For more information read the associated paper posted on my website:
https://sites.google.com/a/lehigh.edu/wanderswest/home/current-research
HOW IT WORKS
One theory proposed to explain differences between variable and stable WTD loving testate amoebae suggests they may exhibit traits of r-selection and K-selection respectively. Aspects of the ecological principle of r/K selection suggest that r-selected species reproduce quickly with less energy and persist in unfavorable conditions longer. Species that are K-selected take longer to reproduce but are better at competing for resources. This principle has not been previously tested with testate amoebae. The goal of this study is to apply r/K selection traits to three types of amoebae, then determine which environments each prefer. The three groups are: 1) K-selected species with ideal WTD ranging from dry to neutral (termed _D-species_in this model); 2) K-selected species with ideal WTD of neutral to wet (_W-species_; 3) r-selected species with ideal WTD circumneutral (_-species_. Note, KD and KW-species are separated for model testing but should function as one K-type species with a wide range of ideal WTD. This model seeks to answer the question: what testate amoebae characteristics allow species to dominate during variable conditions?
THINGS TO NOTICE
The goal of this study is to test whether r-selected species dominate the communities during variable climate. To this end, the following objectives were completed using Netlogo modeling software:
1. Create a simplified bog-like habitat with hydrology that responds to precipitation, peat hydraulic conductivity, and regional groundwater levels (termed _asin-hydrology_in the model).
2. Create an adjustable climate that uses randomly generated weather to produce consistent stable wet, stable dry, and variable conditions.
3. Use the turtles feature of Netlogo to represent testate amoebae with characteristics summarized in Table 1.
4. Verify the model by simulating stable wet, stable dry, stable intermediate, and variable conditions such that WTD remains high, low, circumneutral, or fluctuates over a period of a few months respectively.
5. Verify KD or KW-species dominate during stable dry, stable wet, and intermediate conditions.
6. Verify R-species do not dominate during stable conditions at any WTD.
7. Simulate variable conditions and see how testate amoebae respond!
EXTENDING THE MODEL
This project was written from scratch using open source code that allows the opportunity to add variables, such as humidity, and increasing levels of complexity. To further improve the model, better ecological equations for things like competition and reproduction energy cost should be integrated. One potential use would be to adjust climate to simulate the typical seasonality in region of interest. The model may also support future research identifying the importance of frequency and amplitude of external forcing on ecosystems.
CREDITS AND REFERENCES
Travis Andrews. 2011. TESTATEWORLDWORKS2011!. Lehigh University, Bethlehem PA.
Comments and Questions
breed [suns sun] breed [clouds cloud] breed [raindrops raindrop] breed [winds wind] breed [amoebaeR amoebaR] breed [amoebaeKW amoebaKW] breed [amoebaeKD amoebaKD] raindrops-own [ location amount-of-water] winds-own [ evaporation] clouds-own [ moisture] patches-own [ SurfMoist ;surface moisture (diffuses faster) SMoist ;Sphagnum Moisture WTD] amoebaeR-own [ locationA Ideal cyst-energy energy birth-energy decay ] amoebaeKD-own [ locationA Ideal cyst-energy energy birth-energy decay ] amoebaeKW-own [ locationA Ideal cyst-energy energy birth-energy decay ] globals [ surface sphagnum peat WTDstart ] ;****SETUP********************************************** to setup clear-all do-plots set surface min-pycor + 11 set sphagnum min-pycor + 10 set peat min-pycor + 5 set-default-shape raindrops "drop" set-default-shape clouds "cloud" set-default-shape winds "line2" set-default-shape amoebaeR "amoebaer" set-default-shape amoebaeKD "amoebaekd" set-default-shape amoebaeKW "amoebaekw" ;; On the first day.... create-suns 1 [ setxy max-pxcor - 2 max-pycor - 3 set color yellow set shape "circle" set size 4] ;; And on the second day...Create sky and grass ask patches [if pycor > 11 [ set pcolor 98]] ;sky ask patches [if pycor < 11 and pycor > 1 [ set pcolor 54]] ;sphagnum ask patches [if pycor = 11 [ set pcolor green]] ;surface ask patches [if pycor < 5 [ set pcolor 33]] ;peat end ;*****GO>>>>GO>>>>>GO!!!!!********************************************* to go make-wind-blow make-rain-fall make-clouds make-groundwater display-labels update-world breed-amoebaeR make-live-amoebaeR hatch-ameobaeR breed-amoebaeKD make-live-amoebaeKD hatch-ameobaeKD breed-amoebaeKW make-live-amoebaeKW hatch-ameobaeKW tick do-plots end ;********And on the third day....***************************************************** ;;make clouds that make rain to make-clouds if random-float 730 < (2.5 * Climate) and Climate-Variability = 1 ;; add climate and variability to cloudyness ; make clouds when cloudy and Cloudy [create-clouds (random-float 10) [ setxy (random-float 40) (random-float 9 + 11) set heading 90 set size 4 set color white set moisture random-float 3 ask clouds [fd random 0.8 + 0.05] ;;ask clouds [set label moisture] ask clouds [if count clouds > 10 [die]] ]] if random-float 730 < (Climate) and Climate-Variability > 1 ;; add climate and variability to cloudyness ; make clouds when cloudy and Cloudy and (Climate-Variability) < ((count clouds / 4) + random-normal 2 1) [create-clouds (random-float 10) [ setxy (random-float 40) (random-float 9 + 11) set heading 90 set size 4 set color white set moisture random-float 3 ask clouds [fd random 0.8 + 0.05] ;;ask clouds [set label moisture] ask clouds [if count clouds > 10 [die]] ]] ask clouds with [pycor > 10 ] [ fd 2 ] ask clouds at-points [[40 11] [40 12] [40 13] [40 14] [40 15] [40 16] [40 17] [40 18] [40 19] [40 20]] [die] if not Cloudy [ask clouds [fd 2] ask clouds at-points [[40 11] [40 12] [40 13] [40 14] [40 15] [40 16] [40 17] [40 18] [40 19] [40 20]] [die]] end ;; Create new rain to make-rain-fall if random-float 730 < (8 * Climate) and random-float 3 <= Climate-Variability [create-raindrops random-normal 100 50 [ setxy random-xcor max-pycor set heading 180 set color blue set location "falling" set amount-of-water ((count clouds) * (Climate-Variability ^ 2)) ;make raindrops same size per event!! ; make climate variable! by raindrop size set size (0.1 * amount-of-water) ]] ask raindrops with [location = "falling"] [ fd 1 ] ask raindrops [if count clouds = 0 [ die]] end ;;Create WTD ; starts with no groundwater -> takes few days to equilibrate. to make-groundwater ask raindrops with [location = "falling"][ if pycor = 10 [ set pcolor 84 set SurfMoist amount-of-water die]] ;ask patches [if pcolor = 84 [ ; set SMoist random-float 10 ; ]] ask patches [if pycor = (13 + (count clouds / 3)) [ ;max 10 clouds, slows down evaporation set SurfMoist 0]] ask patches [if pycor = 11 [ set Smoist SurfMoist]] ;convert surface water to ground water doing down, no converstion going up. ;;make groundwater leave ask patches [if pycor = 12 [ set SMoist 0]] ask patches [if pycor = 1 [ set SMoist (6 + Basin-hydrology)]] ;;if mega drought, set to -5 to simulate lower regional groundwater table diffuse SurfMoist .2 ; make surface water diffuse quicker than groundwater diffuse SMoist Conductivity ;;make groundwater behave end to update-world ;make things look correct ask patches [if pycor < 11 and pycor > 4 and SMoist > 5 [ set pcolor 93]] ask patches [if pycor < 11 and pycor > 4 and SMoist < 4 [ set pcolor 54]] ask patches [if pycor = 11 and SMoist < 4 [ set pcolor green]] ask patches [if pycor > 9 and SMoist > 5 [ set pcolor 85]] ask patches [if pycor <= 4 [ set pcolor 33]] ask patches [if pycor > 11 and SMoist < 4 [ set pcolor 98]] end to display-labels ;;display groundwater values;; values >5 are saturated? ask patches [set plabel ""] if Labels [ask patches [ set plabel round SMoist]] end ;;WIND and Evaporation to make-wind-blow if random-float 100 < Windy-days and Windy [ create-winds random-float 10 [ setxy 0 14 - random-float 4 set heading 90 set size 1 set color cyan]] ask winds [fd 1] ask winds at-points [[40 10] [40 11] [40 12] [40 13] [40 14]] [die] ;;have wind remove SurfMoist and Smoist at surface ask winds [if SurfMoist > 0 [ set SurfMoist (SurfMoist - 0.5)]] ask winds [if SMoist > 0 [ set SMoist (SMoist - 0.5)]] if not Windy [ ask winds [die]] end ;**********MAKE AmoebaeR!*************************************************************** to breed-amoebaeR ;ameobae input from atmosphere, then rain, not recycled if random-float 730 < Amoebae-Input [create-amoebaeR 1 [ set size random-normal 0.75 0.5 setxy (random-float 40) (20 - random-float 5) ; set color scale-color red Ideal -6 6 ;; "???------------------------------- set heading 90 set locationA "atmosphere" set energy (size + 0.5 ) set Ideal (random-float 4 + 3) ;make variable set cyst-energy 0.0005 ;make variable? or initial energy?---------------------------------- set birth-energy ((size + 1) * 1.15) ]] ask amoebaeR with [locationA = "atmosphere"] [ set heading (heading + random-normal 0 75 ) fd random-normal 0.75 0.2] ask amoebaeR with [locationA = "atmosphere"] [if count raindrops < 50 [ set heading 90]] ask amoebaeR with [locationA = "atmosphere"] [if count raindrops >= 50 [ set heading 180 fd (random-float 5)]] ask amoebaeR at-points [[40 11] [40 12] [40 13] [40 14] [40 15] [40 16] [40 17] [40 18] [40 19] [40 20]] [die] ask amoebaeR with [pycor < 12 and pycor > 4][ set locationA "sphagnum" ] ;set variables such as cyst time with countdown till die ;set shape based on r vs. k variables ? end to make-live-amoebaeR ask-concurrent amoebaeR with [locationA = "sphagnum"] [if SMoist <= Ideal + 2 and SMoist >= Ideal - 5 [ set heading random-float 360 fd 0.1 set energy (energy + (size / 25) - ((12 - pycor) / 100))]] ;add energy in ideal conditions realitive to size, less energy deeper ;make amoebae move toward ideal - NO! ;Cysting takes initial energy plus time ask-concurrent amoebaeR with [locationA = "sphagnum"] [if SMoist > Ideal + 5 or SMoist < Ideal - 2 [ ;or not AND! fd 0 set energy (energy - cyst-energy - ((12 - pycor) / 100))]] ;kill amoebae ask-concurrent amoebaeR with [pycor < 12 and pycor > 4][if energy <= 0 [ set heading 180 fd 2]] ;dead amoebae move to peat ;Accumulate dead amoebae in peat ask amoebaeR [if pycor <= 4 and locationA = "sphagnum" [ set locationA "peat" set energy 0 set decay 365 ]] ask amoebaeR with [locationA = "peat"] [ set heading 180 fd 0.003 set decay (decay - (1 / (decay-rate + 0.1)))] ask amoebaeR with [locationA = "peat"] [ if decay <= 0 [die]] ask amoebaeR [if pycor > 11 [ set locationA "atmosphere"]] ;limit # of ameobae per patch (intraspecific competition) ask amoebaeR [if (count amoebaeR-here > 2) [ set energy (energy - 0.2) ]] ;interspecific competition dominates R species ask amoebaeR [if (count amoebaeKD-here > 0) [ set energy (energy - 0.4) ]] ask amoebaeR [if (count amoebaeKW-here > 0) [ set energy (energy - 0.4) ]] end to hatch-ameobaeR ;; give birth to a new amoebaeR that inherits SAME variables of parent, but takes lots energy ask-concurrent amoebaeR with [locationA = "sphagnum"] [if energy > birth-energy [ set energy ((energy - 0.5) / 2) hatch 1 [ set energy (size) fd 1 set cyst-energy 0.0005 ;make variable set birth-energy ((size + 1) * 1.15) ]]] end ;*********;MAKE AmoebaeKD!******************************************************** to breed-amoebaeKD ;ameobae input from atmosphere, then rain, not recycled if random-float 730 < Amoebae-Input [create-amoebaeKD 1 [ set size random-normal 0.75 0.5 setxy (random-float 40) (20 - random-float 5) set heading 90 set locationA "atmosphere" set energy (size + 1) set Ideal (random-float 1 + 2) ;make variable set cyst-energy 0.05 ;make variable set birth-energy ((size + 1) * 4) ]] ask amoebaeKD with [locationA = "atmosphere"] [ set heading (heading + random-normal 0 75 ) fd random-normal 0.75 0.2] ask amoebaeKD with [locationA = "atmosphere"] [if count raindrops < 50 [ set heading 90]] ask amoebaeKD with [locationA = "atmosphere"] [if count raindrops >= 50 [ set heading 180 fd (random-float 5)]] ask amoebaeKD at-points [[40 11] [40 12] [40 13] [40 14] [40 15] [40 16] [40 17] [40 18] [40 19] [40 20]] [die] ask amoebaeKD with [pycor < 12 and pycor > 4][ set locationA "sphagnum" ] ;set variables such as cyst time with countdown till die ;set shape based on r vs. k variables ? end to make-live-amoebaeKD ask-concurrent amoebaeKD with [locationA = "sphagnum"] [if SMoist <= (Ideal + 1.5) and SMoist >= (Ideal - 1.5) [ set heading random-float 360 fd 0.1 set energy (energy + (size / 10) - ((12 - pycor) / 100))]] ;make amoebae move toward ideal - NO! ask-concurrent amoebaeKD with [locationA = "sphagnum"] [if SMoist > Ideal + 1.5 or SMoist < Ideal + -1.5 [ ;or not AND! fd 0 ;Cysting takes energy set energy (energy - cyst-energy - ((12 - pycor) / 100))]] ;kill amoebae ask-concurrent amoebaeKD with [pycor < 12 and pycor > 4][if energy <= 0 [ set heading 180 fd 2]] ;dead amoebae move to peat ;Accumulate dead amoebae in peat ask amoebaeKD [if pycor <= 4 and locationA = "sphagnum" [ set locationA "peat" set energy 0 set decay 365 ]] ask amoebaeKD with [locationA = "peat"] [ set heading 180 fd 0.003 set decay (decay - (1 / (decay-rate + 0.1)))] ask amoebaeKD with [locationA = "peat"] [ if decay <= 0 [die]] ;amoebae hatched in air float away ask-concurrent amoebaeKD [if pycor > 11 [ set locationA "atmosphere"]] ;limit # of ameobae per patch (intraspecific competition) ask-concurrent amoebaeKD [if (count amoebaeKD-here > 1) [ set energy (energy - 0.5) ]] ;intraspecific competition dominates R species ask-concurrent amoebaeKD [if (count amoebaeR-here > 1) [ set energy (energy - 0.3) ]] ask-concurrent amoebaeR [if (count amoebaeKW-here > 1) [ set energy (energy - 0.5) ]] end to hatch-ameobaeKD ;; give birth to a new amoebaeR that inherits SAME variables of parent, but takes lots energy ask-concurrent amoebaeKD with [locationA = "sphagnum"] [if energy > birth-energy [ set energy ((energy - 0.5) / 2) hatch 1 [ set energy (size + 1) fd 1 set cyst-energy 0.005 ;make variable set birth-energy ((size + 1) * 4) ]]] end ;; ;*********;MAKE AmoebaeKW!*********************************************** to breed-amoebaeKW ;ameobae input from atmosphere, then rain, not recycled if random-float 730 < Amoebae-Input [create-amoebaeKW 1 [ set size random-normal 0.75 0.5 setxy (random-float 40) (20 - random-float 5) set heading 90 set locationA "atmosphere" set energy (size + 1) set Ideal (random-float 2 + 4) ;make variable set cyst-energy 0.05 ;make variable set birth-energy ((size + 1) * 4) ]] ask amoebaeKW with [locationA = "atmosphere"] [ set heading (heading + random-normal 0 75 ) fd random-normal 0.75 0.2] ask amoebaeKW with [locationA = "atmosphere"] [if count raindrops < 50 [ set heading 90]] ask amoebaeKW with [locationA = "atmosphere"] [if count raindrops >= 50 [ set heading 180 fd (random-float 5)]] ask amoebaeKW at-points [[40 11] [40 12] [40 13] [40 14] [40 15] [40 16] [40 17] [40 18] [40 19] [40 20]] [die] ask amoebaeKW with [pycor < 12 and pycor > 4][ set locationA "sphagnum" ] ;set variables such as cyst time with countdown till die ;set shape based on r vs. k variables ? end to make-live-amoebaeKW ask-concurrent amoebaeKW with [locationA = "sphagnum"] [if SMoist > (Ideal) [ set heading random-float 360 fd 0.1 set energy (energy + (size / 10) - ((12 - pycor) / 100)) ]] ;make amoebae move toward ideal - NO! ;Cysting takes energy ask-concurrent amoebaeKW with [locationA = "sphagnum"] [if SMoist < (Ideal) [ ;or not AND! fd 0 set energy (energy - cyst-energy - ((12 - pycor) / 100))]] ;kill amoebae ask-concurrent amoebaeKW with [pycor < 12 and pycor > 4][if energy <= 0 [ set heading 180 fd 2]] ;dead amoebae move to peat ;Accumulate dead amoebae in peat for 3 year ask amoebaeKW [if pycor <= 4 and locationA = "sphagnum" [ set locationA "peat" set energy 0 set decay 365]] ask amoebaeKW with [locationA = "peat"] [ set heading 180 fd 0.003 set decay (decay - (1 / (decay-rate + 0.1)))] ask amoebaeKW with [locationA = "peat"] [ if decay <= 0 [die]] ask-concurrent amoebaeKW [if pycor > 11 [ set locationA "atmosphere"]] ;limit # of ameobae per patch (intraspecific competition) ask-concurrent amoebaeKW [if (count amoebaeKW-here > 1) [ set energy (energy - 0.5) ]] ;intraspecific competition dominates R species ask-concurrent amoebaeKW [if (count amoebaeR-here > 1) [ set energy (energy - 0.3) ]] ask-concurrent amoebaeKW [if (count amoebaeKD-here > 1) [ set energy (energy - 0.5) ]] end to hatch-ameobaeKW ;; give birth to a new amoebaeKW that inherits SAME variables of parent, but takes lots energy ask-concurrent amoebaeKW with [locationA = "sphagnum"] [if energy > birth-energy [ set energy ((energy - 0.5) / 2) hatch 1 [ set energy (size + 1) fd 1 set cyst-energy 0.005 ;make variable set birth-energy ((size + 1) * 4) ]]] end ;*************DISPLAY DATA************************************** to do-plots set-current-plot "Plot" set-current-plot-pen "AmoebaeR" plot count amoebaeR set-current-plot-pen "AmoebaeKD" plot count amoebaeKD set-current-plot-pen "AmoebaeKW" plot count amoebaeKW ask patches [if (pycor = 7) and (pxcor = 10)[ set-current-plot-pen "WTD" plot (SMoist * 50) ]] end ;histogram ;Differences btw R, KW, and KD variables table needed!
There is only one version of this model, created over 12 years ago by Travis Andrews.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
TESTATEWORLDWORKS2011!.png | preview | Preview for 'TESTATEWORLDWORKS2011!' | about 12 years ago, by Travis Andrews | Download |
This model does not have any ancestors.
This model does not have any descendants.