Mercurial > repos > greg > bmsb
comparison BMSB.R @ 31:aefd45f2fa43 draft
Uploaded
| author | greg |
|---|---|
| date | Thu, 15 Dec 2016 11:04:41 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 30:53d2ac56c953 | 31:aefd45f2fa43 |
|---|---|
| 1 #!/usr/bin/env Rscript | |
| 2 | |
| 3 suppressPackageStartupMessages(library("optparse")) | |
| 4 | |
| 5 options_list <- list( | |
| 6 make_option(c("-adult_mort", "--adult_mort"), action="store", help="Adjustment rate for adult mortality"), | |
| 7 make_option(c("-adult_nymph_accum", "--adult_nymph_accum"), action="store", help="Adjustment of DD accumulation (old nymph->adult)"), | |
| 8 make_option(c("-egg_mort", "--egg_mort"), action="store", help="Adjustment rate for egg mortality"), | |
| 9 make_option(c("-latitude", "--latitude"), action="store", help="Latitude of selected location"), | |
| 10 make_option(c("-location", "--location"), action="store", help="Selected location"), | |
| 11 make_option(c("-min_clutch_size", "--min_clutch_size"), action="store", help="Adjustment of minimum clutch size"), | |
| 12 make_option(c("-max_clutch_size", "--max_clutch_size"), action="store", help="Adjustment of maximum clutch size"), | |
| 13 make_option(c("-nymph_mort", "--nymph_mort"), action="store", help="Adjustment rate for nymph mortality"), | |
| 14 make_option(c("-old_nymph_accum", "--old_nymph_accum"), action="store", help="Adjustment of DD accumulation (young nymph->old nymph)"), | |
| 15 make_option(c("-output", "--output"), action="store", help="Output dataset"), | |
| 16 make_option(c("-oviposition", "--oviposition"), action="store", help="Adjustment for oviposition rate"), | |
| 17 make_option(c("-photoperiod", "--photoperiod"), action="store", help="Critical photoperiod for diapause induction/termination"), | |
| 18 make_option(c("-replications", "--replications"), action="store", help="Number of replications"), | |
| 19 make_option(c("-se_plot", "--se_plot"), action="store", help="Plot SE"), | |
| 20 make_option(c("-start_year", "--start_year"), action="store", help="Starting year"), | |
| 21 make_option(c("-sim_year", "--sim_year"), action="store", help="Simulation year"), | |
| 22 make_option(c("-temperature_datasets", "--temperature_datasets"), action="store", help="Temperature data for selected location"), | |
| 23 make_option(c("-young_nymph_accum", "--young_nymph_accum"), action="store", help="Adjustment of DD accumulation (egg->young nymph)"), | |
| 24 ) | |
| 25 | |
| 26 parser <- OptionParser(usage="%prog [options] file", options_list) | |
| 27 arguements <- parse_args(parser, positional_arguments=TRUE) | |
| 28 opt <- args$options | |
| 29 args <- arguments$args | |
| 30 | |
| 31 temperature_datasets <- strsplit(opt$temperature_datasets, ",") | |
| 32 | |
| 33 # read in the input temperature datafile | |
| 34 data.input(opt$location, opt$start_year, temperature_datasets) | |
| 35 | |
| 36 input.name<-paste(opt$location, opt$sim_year, ".Rdat" ,sep="") | |
| 37 output.name<-paste(opt$location, opt$sim_year, "sim.Rdat", sep="") | |
| 38 load(input.name) | |
| 39 | |
| 40 # initialize matrix for results from all replications | |
| 41 S0.rep<-S1.rep<-S2.rep<-S3.rep<-S4.rep<-S5.rep<-matrix(rep(0,365*n.rep),ncol=n.rep) | |
| 42 newborn.rep<-death.rep<-adult.rep<-pop.rep<-g0.rep<-g1.rep<-g2.rep<-g0a.rep<-g1a.rep<-g2a.rep<-matrix(rep(0,365*n.rep),ncol=n.rep) | |
| 43 | |
| 44 # loop through replications | |
| 45 for (N.rep in 1:n.rep) | |
| 46 { | |
| 47 # during each replication | |
| 48 n<-1000 # start with 1000 individuals -- user definable as well? | |
| 49 # Generation, Stage, DD, T, Diapause | |
| 50 vec.ini<-c(0,3,0,0,0) | |
| 51 # overwintering, previttelogenic,DD=0, T=0, no-diapause | |
| 52 vec.mat<-rep(vec.ini,n) | |
| 53 vec.mat<-t(matrix(vec.mat,nrow=5)) # complete matrix for the population | |
| 54 ph.p<-daylength(L) # complete photoperiod profile in a year, requires daylength function | |
| 55 | |
| 56 tot.pop<-NULL # time series of population size | |
| 57 gen0.pop<-rep(0,365) # gen.0 pop size | |
| 58 gen1.pop<-rep(0,365) | |
| 59 gen2.pop<-rep(0,365) | |
| 60 S0<-S1<-S2<-S3<-S4<-S5<-rep(0,365) | |
| 61 g0.adult<-g1.adult<-g2.adult<-rep(0,365) | |
| 62 N.newborn<-N.death<-N.adult<-rep(0,365) | |
| 63 dd.day<-rep(0,365) | |
| 64 | |
| 65 ptm <- proc.time() # start tick | |
| 66 | |
| 67 # all the days | |
| 68 for (day in 1:365) | |
| 69 { | |
| 70 photoperiod<-ph.p[day] # photoperiod in the day | |
| 71 temp.profile<-hourtemp(L,day) | |
| 72 mean.temp<-temp.profile[1] | |
| 73 dd.temp<-temp.profile[2] | |
| 74 dd.day[day]<-dd.temp | |
| 75 death.vec<-NULL # trash bin for death | |
| 76 birth.vec<-NULL # new born | |
| 77 #n<-length(vec.mat[,1]) # population size at previous day | |
| 78 | |
| 79 # all individuals | |
| 80 for (i in 1:n) | |
| 81 { | |
| 82 vec.ind<-vec.mat[i,] # find individual record | |
| 83 # first of all, still alive? | |
| 84 # adjustment for late season mortality rate | |
| 85 if (L<40) | |
| 86 { | |
| 87 post.mort<-1 | |
| 88 day.kill<-300 | |
| 89 } | |
| 90 else | |
| 91 { | |
| 92 post.mort<-2 | |
| 93 day.kill<-250 | |
| 94 } | |
| 95 # egg | |
| 96 if(vec.ind[2]==0) | |
| 97 { | |
| 98 death.prob=ar.em*mortality.egg(mean.temp) | |
| 99 } | |
| 100 else if (vec.ind[2]==1 | vec.ind[2]==2) | |
| 101 { | |
| 102 death.prob=ar.nm*mortality.nymph(mean.temp) | |
| 103 } | |
| 104 # for adult | |
| 105 else if (vec.ind[2]==3 | vec.ind[2]==4 | vec.ind[2]==5) | |
| 106 { | |
| 107 if (day<day.kill) | |
| 108 { | |
| 109 death.prob=ar.am*mortality.adult(mean.temp) | |
| 110 } | |
| 111 else | |
| 112 { | |
| 113 death.prob=ar.am*post.mort*mortality.adult(mean.temp)} # increase adult mortality after fall equinox | |
| 114 } | |
| 115 #(or dependent on temperature and life stage?) | |
| 116 u.d<-runif(1) | |
| 117 if (u.d<death.prob) | |
| 118 { | |
| 119 death.vec<-c(death.vec,i) | |
| 120 } | |
| 121 else | |
| 122 { | |
| 123 # aggregrate index of dead bug | |
| 124 # event 1 end of diapause | |
| 125 if (vec.ind[1]==0 && vec.ind[2]==3) | |
| 126 { | |
| 127 # overwintering adult (previttelogenic) | |
| 128 if (photoperiod>ph.cr && vec.ind[3]>68 && day<180) | |
| 129 { | |
| 130 # add 68C to become fully reproductively matured | |
| 131 vec.ind<-c(0,4,0,0,0) # transfer to vittelogenic | |
| 132 vec.mat[i,]<-vec.ind | |
| 133 } | |
| 134 else | |
| 135 { | |
| 136 vec.ind[3]<-vec.ind[3]+dd.temp # add to DD | |
| 137 vec.ind[4]<-vec.ind[4]+1 # add 1 day in current stage | |
| 138 vec.mat[i,]<-vec.ind | |
| 139 } | |
| 140 } | |
| 141 if (vec.ind[1]!=0 && vec.ind[2]==3) | |
| 142 { | |
| 143 # NOT overwintering adult (previttelogenic) | |
| 144 current.gen<-vec.ind[1] | |
| 145 if (vec.ind[3]>68) | |
| 146 { | |
| 147 # add 68C to become fully reproductively matured | |
| 148 vec.ind<-c(current.gen,4,0,0,0) # transfer to vittelogenic | |
| 149 vec.mat[i,]<-vec.ind | |
| 150 } | |
| 151 else | |
| 152 { | |
| 153 vec.ind[3]<-vec.ind[3]+dd.temp # add to DD | |
| 154 vec.ind[4]<-vec.ind[4]+1 # add 1 day in current stage | |
| 155 vec.mat[i,]<-vec.ind | |
| 156 } | |
| 157 } | |
| 158 | |
| 159 # event 2 oviposition -- where population dynamics comes from | |
| 160 if (vec.ind[2]==4 && vec.ind[1]==0 && mean.temp>10) | |
| 161 { | |
| 162 # vittelogenic stage, overwintering generation | |
| 163 if (vec.ind[4]==0) | |
| 164 { | |
| 165 # just turned in vittelogenic stage | |
| 166 n.birth=round(runif(1,2+min.ovi.adj,8+max.ovi.adj)) | |
| 167 } | |
| 168 else | |
| 169 { | |
| 170 p.birth=ar.ovi*0.01 # daily probability of birth | |
| 171 u1<-runif(1) | |
| 172 if (u1<p.birth) | |
| 173 { | |
| 174 n.birth=round(runif(1,2,8)) | |
| 175 } | |
| 176 } | |
| 177 vec.ind[3]<-vec.ind[3]+dd.temp # add to DD | |
| 178 vec.ind[4]<-vec.ind[4]+1 # add 1 day in current stage | |
| 179 vec.mat[i,]<-vec.ind | |
| 180 if (n.birth>0) | |
| 181 { | |
| 182 # add new birth -- might be in different generations | |
| 183 new.gen<-vec.ind[1]+1 # generation +1 | |
| 184 new.ind<-c(new.gen,0,0,0,0) # egg profile | |
| 185 new.vec<-rep(new.ind,n.birth) | |
| 186 new.vec<-t(matrix(new.vec,nrow=5)) # update batch of egg profile | |
| 187 birth.vec<-rbind(birth.vec,new.vec) # group with total eggs laid in that day | |
| 188 } | |
| 189 } | |
| 190 | |
| 191 # event 2 oviposition -- for gen 1. | |
| 192 if (vec.ind[2]==4 && vec.ind[1]==1 && mean.temp>12.5 && day<222) | |
| 193 { | |
| 194 # vittelogenic stage, 1st generation | |
| 195 if (vec.ind[4]==0) | |
| 196 { | |
| 197 # just turned in vittelogenic stage | |
| 198 n.birth=round(runif(1,2+min.ovi.adj,8+max.ovi.adj)) | |
| 199 } | |
| 200 else | |
| 201 { | |
| 202 p.birth=ar.ovi*0.01 # daily probability of birth | |
| 203 u1<-runif(1) | |
| 204 if (u1<p.birth) | |
| 205 { | |
| 206 n.birth=round(runif(1,2,8)) | |
| 207 } | |
| 208 } | |
| 209 vec.ind[3]<-vec.ind[3]+dd.temp # add to DD | |
| 210 vec.ind[4]<-vec.ind[4]+1 # add 1 day in current stage | |
| 211 vec.mat[i,]<-vec.ind | |
| 212 if (n.birth>0) | |
| 213 { | |
| 214 # add new birth -- might be in different generations | |
| 215 new.gen<-vec.ind[1]+1 # generation +1 | |
| 216 new.ind<-c(new.gen,0,0,0,0) # egg profile | |
| 217 new.vec<-rep(new.ind,n.birth) | |
| 218 new.vec<-t(matrix(new.vec,nrow=5)) # update batch of egg profile | |
| 219 birth.vec<-rbind(birth.vec,new.vec) # group with total eggs laid in that day | |
| 220 } | |
| 221 } | |
| 222 | |
| 223 # event 3 development (with diapause determination) | |
| 224 # event 3.1 egg development to young nymph (vec.ind[2]=0 -> egg) | |
| 225 if (vec.ind[2]==0) | |
| 226 { | |
| 227 # egg stage | |
| 228 vec.ind[3]<-vec.ind[3]+dd.temp # add to DD | |
| 229 if (vec.ind[3]>=(68+dd.adj1)) | |
| 230 { | |
| 231 # from egg to young nymph, DD requirement met | |
| 232 current.gen<-vec.ind[1] | |
| 233 vec.ind<-c(current.gen,1,0,0,0) # transfer to young nym stage | |
| 234 } | |
| 235 else | |
| 236 { | |
| 237 vec.ind[4]<-vec.ind[4]+1 # add 1 day in current stage | |
| 238 } | |
| 239 vec.mat[i,]<-vec.ind | |
| 240 } | |
| 241 | |
| 242 # event 3.2 young nymph to old nymph (vec.ind[2]=1 -> young nymph: determines diapause) | |
| 243 if (vec.ind[2]==1) | |
| 244 { | |
| 245 # young nymph stage | |
| 246 vec.ind[3]<-vec.ind[3]+dd.temp # add to DD | |
| 247 if (vec.ind[3]>=(250+dd.adj2)) | |
| 248 { | |
| 249 # from young to old nymph, DD requirement met | |
| 250 current.gen<-vec.ind[1] | |
| 251 vec.ind<-c(current.gen,2,0,0,0) # transfer to old nym stage | |
| 252 if (photoperiod<ph.cr && day > 180) | |
| 253 { | |
| 254 vec.ind[5]<-1 | |
| 255 } # prepare for diapausing | |
| 256 } | |
| 257 else | |
| 258 { | |
| 259 vec.ind[4]<-vec.ind[4]+1 # add 1 day in current stage | |
| 260 } | |
| 261 vec.mat[i,]<-vec.ind | |
| 262 } | |
| 263 | |
| 264 # event 3.3 old nymph to adult: previttelogenic or diapausing? | |
| 265 if (vec.ind[2]==2) | |
| 266 { | |
| 267 # old nymph stage | |
| 268 vec.ind[3]<-vec.ind[3]+dd.temp # add to DD | |
| 269 if (vec.ind[3]>=(200+dd.adj3)) | |
| 270 { | |
| 271 # from old to adult, DD requirement met | |
| 272 current.gen<-vec.ind[1] | |
| 273 if (vec.ind[5]==0) | |
| 274 { | |
| 275 # non-diapausing adult -- previttelogenic | |
| 276 vec.ind<-c(current.gen,3,0,0,0) | |
| 277 } | |
| 278 else | |
| 279 { | |
| 280 # diapausing | |
| 281 vec.ind<-c(current.gen,5,0,0,1) | |
| 282 } | |
| 283 } | |
| 284 else | |
| 285 { | |
| 286 vec.ind[4]<-vec.ind[4]+1 # add 1 day in current stage | |
| 287 } | |
| 288 vec.mat[i,]<-vec.ind | |
| 289 } | |
| 290 | |
| 291 # event 4 growing of diapausing adult (unimportant, but still necessary)## | |
| 292 if (vec.ind[2]==5) | |
| 293 { | |
| 294 vec.ind[3]<-vec.ind[3]+dd.temp | |
| 295 vec.ind[4]<-vec.ind[4]+1 | |
| 296 vec.mat[i,]<-vec.ind | |
| 297 } | |
| 298 } # else if it is still alive | |
| 299 } # end of the individual bug loop | |
| 300 | |
| 301 # find how many died | |
| 302 n.death<-length(death.vec) | |
| 303 if (n.death>0) | |
| 304 { | |
| 305 vec.mat<-vec.mat[-death.vec, ]} | |
| 306 # remove record of dead | |
| 307 # find how many new born | |
| 308 n.newborn<-length(birth.vec[,1]) | |
| 309 vec.mat<-rbind(vec.mat,birth.vec) | |
| 310 # update population size for the next day | |
| 311 n<-n-n.death+n.newborn | |
| 312 | |
| 313 # aggregate results by day | |
| 314 tot.pop<-c(tot.pop,n) | |
| 315 s0<-sum(vec.mat[,2]==0) #egg | |
| 316 s1<-sum(vec.mat[,2]==1) # young nymph | |
| 317 s2<-sum(vec.mat[,2]==2) # old nymph | |
| 318 s3<-sum(vec.mat[,2]==3) # previtellogenic | |
| 319 s4<-sum(vec.mat[,2]==4) # vitellogenic | |
| 320 s5<-sum(vec.mat[,2]==5) # diapausing | |
| 321 gen0<-sum(vec.mat[,1]==0) # overwintering adult | |
| 322 gen1<-sum(vec.mat[,1]==1) # first generation | |
| 323 gen2<-sum(vec.mat[,1]==2) # second generation | |
| 324 n.adult<-sum(vec.mat[,2]==3)+sum(vec.mat[,2]==4)+sum(vec.mat[,2]==5) # sum of all adults | |
| 325 gen0.pop[day]<-gen0 # gen.0 pop size | |
| 326 gen1.pop[day]<-gen1 | |
| 327 gen2.pop[day]<-gen2 | |
| 328 S0[day]<-s0 | |
| 329 S1[day]<-s1 | |
| 330 S2[day]<-s2 | |
| 331 S3[day]<-s3 | |
| 332 S4[day]<-s4 | |
| 333 S5[day]<-s5 | |
| 334 g0.adult[day]<-sum(vec.mat[,1]==0) | |
| 335 g1.adult[day]<-sum((vec.mat[,1]==1 & vec.mat[,2]==3) | (vec.mat[,1]==1 & vec.mat[,2]==4) | (vec.mat[,1]==1 & vec.mat[,2]==5)) | |
| 336 g2.adult[day]<-sum((vec.mat[,1]==2 & vec.mat[,2]==3) | (vec.mat[,1]==2 & vec.mat[,2]==4) | (vec.mat[,1]==2 & vec.mat[,2]==5)) | |
| 337 | |
| 338 N.newborn[day]<-n.newborn | |
| 339 N.death[day]<-n.death | |
| 340 N.adult[day]<-n.adult | |
| 341 print(c(N.rep,day,n,n.adult)) | |
| 342 } # end of 365 days | |
| 343 | |
| 344 #proc.time() - ptm | |
| 345 dd.cum<-cumsum(dd.day) | |
| 346 # save(dd.day,dd.cum,S0,S1,S2,S3,S4,S5,N.newborn,N.death,N.adult,tot.pop,gen0.pop,gen1.pop,gen2.pop,g0.adult,g1.adult,g2.adult,file="wenatchee2013sim.Rdat") | |
| 347 #newborn.rep<-death.rep<-adult.rep<-pop.rep<-g0.rep<-g1.rep<-g2.rep<-g0a.rep<-g1a.rep<-g2a.rep<-matrix(rep(0,365*n.rep),ncol=n.rep) | |
| 348 # collect all the outputs | |
| 349 S0.rep[,N.rep]<-S0 | |
| 350 S1.rep[,N.rep]<-S1 | |
| 351 S2.rep[,N.rep]<-S2 | |
| 352 S3.rep[,N.rep]<-S3 | |
| 353 S4.rep[,N.rep]<-S4 | |
| 354 S5.rep[,N.rep]<-S5 | |
| 355 newborn.rep[,N.rep]<-N.newborn | |
| 356 death.rep[,N.rep]<-N.death | |
| 357 adult.rep[,N.rep]<-N.adult | |
| 358 pop.rep[,N.rep]<-tot.pop | |
| 359 g0.rep[,N.rep]<-gen0.pop | |
| 360 g1.rep[,N.rep]<-gen1.pop | |
| 361 g2.rep[,N.rep]<-gen2.pop | |
| 362 g0a.rep[,N.rep]<-g0.adult | |
| 363 g1a.rep[,N.rep]<-g1.adult | |
| 364 g2a.rep[,N.rep]<-g2.adult | |
| 365 } | |
| 366 | |
| 367 save(dd.day,dd.cum,S0.rep,S1.rep,S2.rep,S3.rep,S4.rep,S5.rep,newborn.rep,death.rep,adult.rep,pop.rep,g0.rep,g1.rep,g2.rep,g0a.rep,g1a.rep,g2a.rep,file=opt$output) | |
| 368 # maybe do not need to export this bit, but for now just leave it as-is | |
| 369 # do we need to export this Rdat file? | |
| 370 | |
| 371 | |
| 372 ######################################### | |
| 373 # input starting year and how many years | |
| 374 # n.yr and start.yr needs to be integer | |
| 375 # loc.name needs to be CHARACTER and matches exactly the name in the csv file!!! | |
| 376 data.input=function(loc, start.yr, temperature.datasets) | |
| 377 { | |
| 378 n.yr <- length(temperature_datasets) | |
| 379 for (i in 1:n.yr) | |
| 380 { | |
| 381 expdata<-matrix(rep(0,365*3),nrow=365) | |
| 382 yr<-start.yr+i # replace 2004 with start. yr | |
| 383 name.input<-paste(temperature.datasets[i], ".csv", sep="") | |
| 384 namedat<-paste(loc, yr,".Rdat",sep="") | |
| 385 temp.data<-read.csv(file=name.input, header=T) | |
| 386 | |
| 387 expdata[,1]<-c(1:365) | |
| 388 expdata[,2]<-temp.data[c(1:365),3] #minimum | |
| 389 expdata[,3]<-temp.data[c(1:365),2] #maximum | |
| 390 save(expdata,file=namedat) | |
| 391 } | |
| 392 } | |
| 393 ######################################### | |
| 394 | |
| 395 ######################################### | |
| 396 daylength=function(L) | |
| 397 { | |
| 398 # from Forsythe 1995 | |
| 399 p=0.8333 | |
| 400 dl<-NULL | |
| 401 for (i in 1:365) | |
| 402 { | |
| 403 theta<-0.2163108+2*atan(0.9671396*tan(0.00860*(i-186))) | |
| 404 phi<-asin(0.39795*cos(theta)) | |
| 405 dl[i]<-24-24/pi*acos((sin(p*pi/180)+sin(L*pi/180)*sin(phi))/(cos(L*pi/180)*cos(phi))) | |
| 406 } | |
| 407 dl # return a vector of daylength in 365 days | |
| 408 } | |
| 409 ######################################### | |
| 410 | |
| 411 ######################################### | |
| 412 hourtemp=function(L,date) | |
| 413 { | |
| 414 threshold<-14.17 # base development threshold for BMSB | |
| 415 dnp<-expdata[date,2] # daily minimum | |
| 416 dxp<-expdata[date,3] # daily maximum | |
| 417 dmean<-0.5*(dnp+dxp) | |
| 418 dd<-0 # initialize degree day accumulation | |
| 419 | |
| 420 if (dxp<threshold) | |
| 421 { | |
| 422 dd<-0 | |
| 423 } | |
| 424 else | |
| 425 { | |
| 426 dlprofile<-daylength(L) # extract daylength data for entire year | |
| 427 T<-NULL # initialize hourly temperature | |
| 428 dh<-NULL #initialize degree hour vector | |
| 429 # date<-200 | |
| 430 y<-dlprofile[date] # calculate daylength in given date | |
| 431 z<-24-y # night length | |
| 432 a<-1.86 # lag coefficient | |
| 433 b<-2.20 # night coefficient | |
| 434 #tempdata<-read.csv("tempdata.csv") #import raw data set | |
| 435 # Should be outside function otherwise its redundant | |
| 436 risetime<-12-y/2 # sunrise time | |
| 437 settime<-12+y/2 # sunset time | |
| 438 ts<-(dxp-dnp)*sin(pi*(settime-5)/(y+2*a))+dnp | |
| 439 for (i in 1:24) | |
| 440 { | |
| 441 if (i>risetime && i<settime) | |
| 442 { | |
| 443 m<-i-5 # number of hours after Tmin until sunset | |
| 444 T[i]=(dxp-dnp)*sin(pi*m/(y+2*a))+dnp | |
| 445 if (T[i]<8.4) | |
| 446 { | |
| 447 dh[i]<-0 | |
| 448 } | |
| 449 else | |
| 450 { | |
| 451 dh[i]<-T[i]-8.4 | |
| 452 } | |
| 453 } | |
| 454 else if (i>settime) | |
| 455 { | |
| 456 n<-i-settime | |
| 457 T[i]=dnp+(ts-dnp)*exp(-b*n/z) | |
| 458 if (T[i]<8.4) | |
| 459 { | |
| 460 dh[i]<-0 | |
| 461 } | |
| 462 else | |
| 463 { | |
| 464 dh[i]<-T[i]-8.4 | |
| 465 } | |
| 466 } | |
| 467 else | |
| 468 { | |
| 469 n<-i+24-settime | |
| 470 T[i]=dnp+(ts-dnp)*exp(-b*n/z) | |
| 471 if (T[i]<8.4) | |
| 472 { | |
| 473 dh[i]<-0 | |
| 474 } | |
| 475 else | |
| 476 { | |
| 477 dh[i]<-T[i]-8.4 | |
| 478 } | |
| 479 } | |
| 480 } | |
| 481 dd<-sum(dh)/24 | |
| 482 } | |
| 483 return=c(dmean,dd) | |
| 484 return | |
| 485 } | |
| 486 ######################################### | |
| 487 | |
| 488 ######################################### | |
| 489 dev.egg=function(temperature) | |
| 490 { | |
| 491 dev.rate=-0.9843*temperature+33.438 | |
| 492 return=dev.rate | |
| 493 return | |
| 494 } | |
| 495 ######################################### | |
| 496 | |
| 497 ######################################### | |
| 498 dev.young=function(temperature) | |
| 499 { | |
| 500 n12<--0.3728*temperature+14.68 | |
| 501 n23<--0.6119*temperature+25.249 | |
| 502 dev.rate=mean(n12+n23) | |
| 503 return=dev.rate | |
| 504 return | |
| 505 } | |
| 506 ######################################### | |
| 507 | |
| 508 ######################################### | |
| 509 dev.old=function(temperature) | |
| 510 { | |
| 511 n34<--0.6119*temperature+17.602 | |
| 512 n45<--0.4408*temperature+19.036 | |
| 513 dev.rate=mean(n34+n45) | |
| 514 return=dev.rate | |
| 515 return | |
| 516 } | |
| 517 ######################################### | |
| 518 | |
| 519 ######################################### | |
| 520 dev.emerg=function(temperature) | |
| 521 { | |
| 522 emerg.rate<--0.5332*temperature+24.147 | |
| 523 return=emerg.rate | |
| 524 return | |
| 525 } | |
| 526 ######################################### | |
| 527 | |
| 528 ######################################### | |
| 529 mortality.egg=function(temperature) | |
| 530 { | |
| 531 if (temperature<12.7) | |
| 532 { | |
| 533 mort.prob=0.8 | |
| 534 } | |
| 535 else | |
| 536 { | |
| 537 mort.prob=0.8-temperature/40 | |
| 538 if (mort.prob<0) | |
| 539 { | |
| 540 mort.prob=0.01 | |
| 541 } | |
| 542 } | |
| 543 return=mort.prob | |
| 544 return | |
| 545 } | |
| 546 ######################################### | |
| 547 | |
| 548 ######################################### | |
| 549 mortality.nymph=function(temperature) | |
| 550 { | |
| 551 if (temperature<12.7) | |
| 552 { | |
| 553 mort.prob=0.03 | |
| 554 } | |
| 555 else | |
| 556 { | |
| 557 mort.prob=temperature*0.0008+0.03 | |
| 558 } | |
| 559 return=mort.prob | |
| 560 return | |
| 561 } | |
| 562 ######################################### | |
| 563 | |
| 564 ######################################### | |
| 565 mortality.adult=function(temperature) | |
| 566 { | |
| 567 if (temperature<12.7) | |
| 568 { | |
| 569 mort.prob=0.002 | |
| 570 } | |
| 571 else | |
| 572 { | |
| 573 mort.prob=temperature*0.0005+0.02 | |
| 574 } | |
| 575 return=mort.prob | |
| 576 return | |
| 577 } | |
| 578 ######################################### |
