Specification and documentation of the PWN model.
Trees are represented individually with state variables representing health state, beetle colonization and nematode infestation.
Beetles are represented in an abstract way when no nematode is involved. There is a beetle presence flag for trees, and a simple annual dispersal process based on a mass-conserving kernel.
Beetles are represented individually only where relevant for nematode dispersal:
- [TODO] Eggs, larvae and pupae in nematode-infested trees
- Adults with nematodes during maturation and ovipositioning
The model has a weekly time step.
Trees are positioned on a grid with either one large tree or multiple small trees per cell. Cell size is in the order of magnitude of 10m.
The world is divided into blocks of 1×1 km (rounded to whole tree cells; blocks at the
upper world edges may be smaller), and each block is forested with probability km2_probability.
In forested blocks, each tree cell holds a tree with probability tree_probability.
A tree is initially damaged with probability damage_prevalence (Damaged tag),
and a damaged tree is additionally colonized with probability beetle_prevalence (Colonized tag).
Time advances in weekly ticks, with ticks_per_year ticks per year.
Most submodels act once per year, at a fixed tick of the year (tick_of_year).
Infected trees become damaged (Damaged tag) ticks_to_damage ticks after infection.
At tick tick_of_infection, num_trees healthy, uninfected trees, randomly selected
from the entire world, are infected with nematodes (Infected tag, with the time of infection).
Trees with the Damaged tag are removed from the simulation with a fixed annual probability removal_probability.
Removal takes place in the same tick as background damage, right before it.
Healthy trees are damaged with a fixed annual probability damage_probability.
When damaged, the tree gets a Damaged tag.
Once per year, beetles_per_tree individual beetles emerge from each tree that is both damaged and infected.
Each beetle starts at its source tree, and gets an exponentially distributed life span with mean life_expectancy ticks.
Once per year, two attraction fields on the fine grid are calculated, which guide beetle movement: one for healthy trees (maturation feeding) and one for damaged trees (egg laying).
Each tree cell density_radius that contain a tree of the same type.
The attraction of cell half_distance:
with density_weight. Thus, denser tree clusters attract beetles from farther away.
Beetles move on the fine grid, making steps_per_tick steps per tick.
For the first duration_feeding ticks after emergence, beetles are feeding and target healthy trees.
For the following duration_egg_laying ticks, they are egg laying and target damaged trees [not yet implemented, see Background beetle colonization for now].
Afterwards, they are inactive.
In each step, a beetle on a target tree stays there with probability 1 - leave_tree_probability.
Otherwise, it moves to a neighboring cell (Moore neighborhood):
with probability random_walk_probability to a random one,
otherwise to the one with the highest attraction (see Tree attraction).
For each step that a beetle ends on a target tree, a feeding event is counted for that tree's cell.
Beetles are removed when they reach the end of their life span.
Beetle dispersal operates on a separate dispersal grid with cell size cell_size
(a multiple of the fine grid's cell size).
For each cell, the number of trees colonized by beetles is counted.
Multiplied with the fixed beetles_per_tree factor, this gives the available emerging beetles.
These are distributed to the source cell as well as the surrounding cells using an exponential,
mass-preserving (i.e., normalized) kernel, giving the arriving beetles per cell.
with half-distance kernel_half_distance (i.e. kernel_radius, rounded up to full cells.
Multiplied with the fixed trees_per_beetle,
this gives the number of colonization attempts
or, equivalently but numerically more stable:
After the Colonized flag is removed from all source trees (as beetles fly out),
this probability is applied in an independent Bernoulli trial
to each individual susceptible (damaged) tree,
adding the Colonized tag on success.
Note:
beetles_per_tree*trees_per_beetle=$R_0$ of the system.
Note: With
$\sigma = 1-\text{removal-probability}$ (from tree removal) and$p$ being the target beetle prevalence (in damaged trees), theoretically:
$$R_0 = \dfrac{1}{\sigma(1-\sigma p)}$$
Each tick, healthy, uninfected trees become infected based on the infection_probability