tests/testthat/test-Binzer.R

test_that("The two versions of Unscaled converge", {
  set.seed(123)
  n_species <- 50
  n_basal <- 20
  
  #body mass of species
  masses <- 10 ^ c(sort(runif(n_basal, 1, 6)),
                   sort(runif(n_species - n_basal, 2, 9)))
  # 2) create the food web
  # create the L matrix
  L <- create_Lmatrix(masses,n_basal, Ropt = 100, gamma = 2, th = 0.01)
  # create the 0/1 version of the food web
  fw <- L
  fw[fw > 0] <- 1

  # 3) create the models:
  model <- create_model_Unscaled(n_species, n_basal, masses, fw)
  # model2 uses same parameters as model
  model2 <- new(ATNr:::Unscaled_loops, n_species, n_basal)
  model2[["BM"]] <- masses
  # model2[["log_BM"]] <- log10(masses)
  model2[["fw"]] <- fw
  
  biomasses <- runif(n_species, 30, 35)
  
  # 5) define the desired integration time.
  model$ext = 1e-6
  model <- initialise_default_Unscaled(model)

  
  # initialise properly model2
  model2$K = model$K
  model2$X = model$X
  model2$a = model$a
  model2$c = model$c
  model2$e = model$e
  model2$ext = model$ext
  model2$h = model$h
  model2$q = model$q
  model2$r = model$r
  model2$alpha = model$alpha

  
  model$initialisations()
  times <- seq(0, 355000000, 1000000)

  sol <- lsoda_wrapper(times, biomasses, model)
  sol2 <-   deSolve::lsoda( biomasses, times,
            func = function(t, y, pars) list(pars$ODE(y, t)),
            model2,
            )
  
  extinct = tail(sol,1) < model$ext
  
  expect_equal(sol[nrow(sol),], sol2[nrow(sol2),], tolerance = 0.0001)
})

# library(rbenchmark)
# benchmark("arma: " = {sol <- lsoda_wrapper(times, biomasses, model)},
#           "loops:  " = {sol2 <- lsoda_wrapper(times, biomasses, model2)},
#           replications = 100)

Try the ATNr package in your browser

Any scripts or data that you put into this service are public.

ATNr documentation built on Sept. 4, 2023, 5:07 p.m.