Dispersal

Species may move independently in a model domain using any number of available dispersal methods. They are added to a species using the Species (Populations) add_dispersal() method, which is specified using one of the available methods listed in popdyn.dispersal.METHODS.

These methods, and their keys are used to add each to a species are listed below:

density_flux(population, total_population, …) ‘density-based dispersion’
distance_propagation(population, …) ‘distance propagation’
masked_density_flux(population, …) ‘masked density-based dispersion’
density_network(args) ‘density network dispersal’
fixed_network(args) ‘fixed network movement’

Note

Poplulation is never moved outside of the model domain or to where carrying capacity is 0

A description of Minimum Viable Population is included herein as well, although it is a mortality driver. This method relies on spatial distributions and is considered appropriate for this section.

Dispersal methods are described as follows:

Interhabitat Dispersal

dispersal.density_flux(population, total_population, carrying_capacity, distance, csx, csy, **kwargs)

‘density-based dispersion’

Dispersal is calculated using the following sequence of methods:

Portions of populations at each element (node, or grid cell) in the study area array (raster) are moved to surrounding elements (a neighbourhood) within a radius that is defined by the input distance (\(d\)), as presented in the conceptual figure below.

_images/density_flux_neighbourhood.png

Attention

No dispersal will occur if the provided distance is less than the distance between elements (grid cells) in the model domain, as none will be included in the neighbourhood

The mean density (\(\rho\)) of all elements in the neighbourhood is calculated as:

\[\rho=\frac{\sum_{i=1}^{n} \frac{pop_T(i)}{k_T(i)}}{n}\]

where,

\(pop_T\) is the total population (of the entire species) at each element (\(i\)); and

\(k_T\) is the total carrying capacity for the species

The density gradient at each element (\(\Delta\)) with respect to the mean is calculated as:

\[\Delta(i)=\frac{pop_T(i)}{k_T(i)}-\rho\]

If the centroid element is above the mean \([\Delta(i_0) > 0]\), it is able to release a portion of its population to elements in the neighbourhood. The eligible population to be received by surrounding elements is equal to the sum of populations at elements with negative density gradients, the \(candidates\):

\[candidates=\sum_{i=1}^{n} \Delta(i)[\Delta(i) < 0]k_T(i)\]

The minimum of either the population above the mean at the centroid element - \(source=\Delta(i_0)*k_T(i_0)\), or the \(candidates\) are used to determine the total population that is dispersed from the centroid element to the other elements in the neighbourhood:

\[dispersal=min\{source, candidates\}\]

The population at the centroid element becomes:

\[pop_a(i_0)=pop_a(i_0)-\frac{pop_a(i_0)}{pop_T(i_0)}dispersal\]

where,

\(pop_a\) is the age (stage) group population, which is a sub-population of the total.

The populations of the candidate elements in the neighbourhood become (a net gain due to negative gradients):

\[pop_a(i)=pop_a(i)-\frac{\Delta(i)[\Delta(i) < 0]k_T(i)}{candidates}dispersal\frac{pop_a(i)}{pop_T(i)}\]
Parameters:
  • population (da.Array) – Sub-population to redistribute (subset of the total_population)
  • total_population (da.Array) – Total population
  • carrying_capacity (da.Array) – Total Carrying Capacity (k)
  • distance (float) – Maximum dispersal distance
  • csx (float) – Cell size of the domain in the x-direction
  • csy (float) – Cell size of the domain in the y-direction

Attention

Ensure the cell sizes are in the same units as the specified direction

Keyword Arguments:
 
mask (array) –

A weighting mask that scales dispersal based on the normalized mask value (default: None)

Returns:

Redistributed population

Max Dispersal

dispersal.distance_propagation(population, total_population, carrying_capacity, distance, csx, csy, **kwargs)

‘distance propagation’

Distance propagation is used to redistribute populations to distal locations based on density gradients. Portions of populations at each element (node, or grid cell) in the study area array (raster) are moved to a target element at a radius that is defined by the input distance (\(d\)), as presented in the conceptual figure below.

_images/distance_propagation_neighbourhood.png

Attention

No dispersal will occur if the provided distance is less than the distance between elements (grid cells) in the model domain, as none will be included in the neighbourhood

The density (\(\rho\)) of all distal elements (\(i\)) is calculated as:

\[\rho(i)=\frac{pop_T(i)}{k_T(i)}\]

where,

\(pop_T\) is the total population (of the entire species) at each element (\(i\)); and

\(k_T\) is the total carrying capacity for the species

The distal element with the minimum density is chosen as a candidate for population dispersal from the centroid element. If the density of distal elements is homogeneous, one element is picked at random. The density gradient \(\Delta\) is then calculated using the centroid element \(i_0\) and the chosen distal element \(i_1\):

\[\rho=\frac{pop_T(i_0)/k_T(i_0)+pop_T(i_1)/k_T(i_1)}{2}\]
\[\Delta(i)=\frac{pop_T(i)}{k_T(i)}-\rho\]

If the centroid element is above the mean \([\Delta(i_0) > 0]\), and the distal element is below the mean \([\Delta(i_1) < 0]\), dispersal may take place. The total population dispersed is calculated by taking the minimum of the population constrained by the gradient:

\[dispersal=min\{|\Delta(i_0)k_T(i_0)|, |\Delta(i_1)k_T(i_1)|\}\]

The population at the centroid element becomes:

\[pop_a(i_0)=pop_a(i_0)-dispersal\]

where,

\(pop_a\) is the age (stage) group population, which is a sub-population of the total.

The population at the distal element becomes (a net gain due to a negative gradient):

\[pop_a(i_1)=pop_a(i_1)-dispersal\]
Parameters:
  • population (da.Array) – Sub-population to redistribute (subset of the total_population)
  • total_population (da.Array) – Total population
  • carrying_capacity (da.Array) – Total Carrying Capacity (n)
  • distance (float) – Maximum dispersal distance
  • csx (float) – Cell size of the domain in the x-direction
  • csy (float) – Cell size of the domain in the y-direction

Attention

Ensure the cell sizes are in the same units as the specified direction

Returns:Redistributed population

Masked Dispersal

dispersal.masked_density_flux(population, total_population, carrying_capacity, distance, csx, csy, **kwargs)

‘masked density-based dispersion’

See density_flux(). The dispersal logic is identical to that of density_flux, however a mask is specified as a keyword argument to scale the dispersal. The \(mask\) elements \(i\) are first normalized to ensure values are not less than 0 and do not exceed 1:

\[mask(i)=\frac{mask(i)-min\{mask\}}{max\{mask\}-min\{mask\}}\]

When the \(candidates\) are calculated (as outlined in density_flux()) they are first scaled by the mask value:

\[candidates=\sum_{i=1}^{n} \Delta(i)[\Delta(i) < 0]k_T(i)mask(i)\]

and are scaled by the mask when transferring populations from the centroid element:

\[pop_a(i)=pop_a(i)-\frac{\Delta(i)[\Delta(i) < 0]k_T(i)mask(i)}{candidates}dispersal\frac{pop_a(i)}{pop_T(i)}\]
Parameters:
  • population (array) – Sub-population to redistribute (subset of the total_population)
  • total_population (array) – Total population
  • carrying_capacity (array) – Total Carrying Capacity (k)
  • distance (float) – Maximum dispersal distance
  • csx (float) – Cell size of the domain in the x-direction
  • csy (float) – Cell size of the domain in the y-direction

Attention

Ensure the cell sizes are in the same units as the specified direction

Keyword Arguments:
 
mask (array) –

A weighting mask that scales dispersal based on the normalized mask value (default: None)

Returns:

Redistributed population

Density Network Dispersal

dispersal.density_network(args)

‘density network dispersal’

Note

In Development

Compute dispersal based on a density gradient along a least cost path network analysis using a cost surface.

Raises:NotImplementedError
Parameters:args

Fixed Network Dispersal

dispersal.fixed_network(args)

‘fixed network movement’

Note

In Development

Compute dispersal based on a least cost path network analysis using a cost surface.

Raises:NotImplementedError
Parameters:args

Minimum Viable Population

dispersal.minimum_viable_population(population, min_pop, area, csx, csy, domain_area, filter_std=5)

Eliminate clusters of low populations using a minimum population and area thresholds

The spatial distribution of populations are assessed using a gaussian filter over a neighourhood of elements that is calculated using the filter_std (standard deviation) argument:

\[k=(4\sigma)+0.5\]

where \(k\) is the neighbourhood size (in elements), and \(\sigma\) is the standard deviation.

A threshold \(T\) is then calculated to be used as a contour to constrain regions:

Calculate an areal density per element, \(\rho_a\):

\[\rho_a=\frac{p}{(A/(dx\cdot dy)}\]

where \(p\) is the population, \(A\) is the minimum area, and \(dx\) and \(dy\) are the spatial gradients in the x and y direction, respectively.

Calculate the threshold within the filtered regions by normalizing the region range with the population range

\[T=min\{k\}+\bigg[\frac{((\rho_a/p_m)+(\rho_a/max\{p\})}{2}\cdot (max\{k\}-min\{k\})\bigg]\]

Populations in the study area within the threshold contour are removed and applied to mortality as a result of the minimum viable population.

Parameters:
  • population (dask.Array) – Input population
  • min_pop (float) – Minimum population of cluster
  • area (float) – Minimum cluster area
  • filter_std (int) – Standard deviation of gaussian filter to find clusters
Returns:

A coefficient for populations. I.e. 1 (No Extinction) or 0 (Extinction)