A model (as defined in the SpaDES
world) consists of multiple interacting components (sub-models), which in the vocabulary of SpaDES
we have been referring to as ‘modules’
One could imagine an example model:
And we would give this ensemble of modules a name, like “LCC2005” (or maybe even a better name, but we will go with this)
library(igraph)
library(SpaDES)
workDirectory <- file.path(dirname(tempdir()), "Lcc2005")
moduleDir <- file.path(workDirectory, "modules") %>%
checkPath(., create = TRUE)
downloadModule("LCC2005", moduleDir)
openModules("LCC2005", moduleDir)
SpaDES
developers) create problems?moduleRepo/
|_ childModuleA1/
|_ childModuleA2/
|_ childModuleB1/
|_ childModuleB2/
|_ grandparentModule/
|_ parentModuleA/
|_ parentModuleB/
# setup simulation
outputDir <- file.path(workDirectory, "simOutputs")
cacheDir <- checkPath(file.path(outputDir, "cache"), create = TRUE)
times <- list(start = 2005.0, end = 2020.0, timeunit = "year")
parameters <- list(
.globals = list(burnStats = "fireStats"),
fireSpreadLcc = list(drought = 1.2),
caribouMovementLcc = list(N = 1e3, startTime = times$start + 1,
glmInitialTime = NA_real_)
)
modules <- list("LCC2005")
paths <- list(
cachePath = cacheDir,
modulePath = moduleDir,
inputPath = moduleDir,
outputPath = outputDir
)
There are a few tools that can help visualize the relationships between modules:
# This next step will download data if they do not yet exist locally
lcc <- simInit(times = times, params = parameters,
modules = modules, paths = paths)
objectDiagram(lcc)
moduleDiagram(lcc)
eventDiagram(lcc)
lcc <- spades(lcc) ## compare the diagrams after running sim
The newModule
function creates a module template for you to edit to suit your needs:
newModule('moduleName', file.path('path/to/my/module/directory'),
type = 'parent', children = c('child1', 'child2'))
Alternatively, use the RStudio addin which is simply a GUI wrapper for this function (select ‘parent’ type):
The new CFS-FD model (Forest Dynamics Model)
But the vegetation module is actually a parent module with 3 modules:
fire module is actually 4 modules:
make a child module that does all the stuff you might think of as parent module content, add appropriate data dependencies
(i.e., outputs are required by the other modules as inputs)
SpaDES
function defineModule
# What are the 15 items?