3 CBM_vol2biomass_SK

This documentation is work in progress. Potential discrepancies and omissions may exist for the time being. If you find any, please contact us here.

3.1 Overview

The main change agent in CBM is forest growth. The model needs increments of carbon for its three above ground carbon pools, Merch for stem wood carbon of merchantable-sized trees, Foliage for foliage-carbon, and Other which combines bark, branches and the stem wood carbon of live, nonmerchantable-sized trees. This module translates stand-level volume \(m^3/ha\) values the user provides into the tonnes of carbon/ha increments that CBM_core needs to simulate annual carbon fluxes and estimate stocks in spadesCBM simulations. This is an implementation of the Boudewyn et al. (2007) stand-level volume to biomass translation. Other CBM implementation use the same equations, but we added a smoothing algorithm to fill-in the gap between age 0 and the age at which growth curves have data. In SpaDES-speak, this module has just one event. It only needs to be run once in simulations.

Like many statistical models, this translation is not always successful. The user is advised to review the resulting biomass increments as these are the only representation of vegetation dynamics in CBM and spadesCBM

This module can be run independently of the spadesCBM deck. It relies on multiple CBMutils functions. We describe how these functions relate to the Boudewyn et al. (2007) equations, and also describe our smoothing algorithm below.

3.2 Background

The module uses the subset of Boudewyn et al. (2007) empirical models that calculate volume-to-biomass conversion models for forested (treed) land. These were developed from plot data supplied from forest inventory agencies throughout Canada. Figure 1 (Figure 3 in Boudewyn et al. (2007)) outline the model development procedure (upper) and the calculation workflow (lower). We matched our calculation and functions to the Boudewyn et al. (2007) calculation workflow.

Figure 1: Figure 3 from Boudewyn et al. (2007)

3.3 Inputs

The pieces of information needed to apply the Boudewyn et al. (2007) conversion models are growth curves, the leading species for that growth curve, and where on the landscape (which pixel) each growth curve applies to. The user provides the stand-level \(m^3/ha\) via userGCM3. In this module, gcMeta links the growth curve to the leading species, and the objects spatialDT provides location information. The table below lists the inputs to this module. Inputs table3 through table7 are the Boudewyn et al. (2007) parameters which are hosted on the National Forest Information System website. We provide the cbmAdmin object to help user with the equivalence between provincial and territorial boudaries, Canadian ecozones (as defined in the shapefile use in our model here), and spatialUnit

Name Class Description Source
userGcM3 Data table User provided growth curve data Google Drive
gcMeta Data table Species and growth curve IDs Google Drive
spatialDT Data table Summary table of raster input data with 1 row for each masterRaster pixel that is not NA CBM_dataPrep_SK
table3 Data table Boudewyn table used in volume-to-biomass translations National Forest Inventory
table4 Data table Boudewyn table used in volume-to-biomass translations National Forest Inventory
table5 Data table Boudewyn table used in volume-to-biomass translations National Forest Inventory
table6 Data table Boudewyn table used in volume-to-biomass translations National Forest Inventory
table7 Data table Boudewyn table used in volume-to-biomass translations National Forest Inventory
cbmAdmin Data table Provides ecozone and spatial unit information for provincial boundaries CBM_defaults

3.4 Module functioning

This module begins by reading-in the provided growth curves, matches the correct Boudewyn et al. (2007) parameters (table3 through table7) to the location for each curve, makes sure the appropriate metadata is available to apply the parameters to the growth curve and processes each curve. It outputs some visuals for the growth curves, the translations of these curves, and the final curves that have gone through a smoothing process if needed. Plots of the cumulative curve for each pool (totMerch, fol, other) raw translation and smoothed curves are saved in the outputs folder of the SpaDES project. It main output is growth_increments, a matrix of yearly carbon increments that is passed along to the CBM_core module.

3.4.1 Input check

This module starts off by checking if the provided growth curves (user-provided via userGcM3) are in annual time steps. If not, interpolated values between provided steps are added. Growth curves are saved as a ggplot object in the simulation list (sim$...) for visual inspection (volCurves) anytime during and post simulation.

3.4.2 Choosing parameters

The Boudewyn et al. (2007) models were developed for most locations in the managed forests of Canada. They were developed, when enough data were available, by ecozone and stand-level leading species. For ecozone and species combinations that did not have enough data for model development, the user will have to find alternatives. We chose to replace the models that did not converge with models of similar species in similar ecozone in our example. These are the ecozones in the tables 3 through 7 (table3, table4, table5, table6 and table7):

ID Name
4 Taiga Plains
5 Taiga Shield West
6 Boreal Shield West
7 Atlantic Maritime
9 Boreal Plains
10 Subhumid Prairies
12 Boreal Cordillera
13 Pacific Maritime
14 Montane Cordillera

These are the ones that are not:

Original ID Name Equivalent ID Equivalent ID Name
8 Mixedwood Plains 7 Atlantic Maritime
11 Taiga Cordillera 4 taiga plains
15 Hudson Plains 6 Boreal Shield West
16 Taiga Shield East 5 Taiga Shield West
17 Boreal Shield East 6 Boreal Shield West
18 Semiarid Prairies 10 Subhumid Prairies

In table5 in the NFIS website, there are 5/13 possible jurisdiction id (juris_id column). These are the provinces available: AB BC NB NL NT. For the provinces that did nothave a match, we chose the following equivalence in our example:

Province Equivalent
PE NB
QC NL
ON NL
MB AB
SK AB
YK NT
NU NT
NS NB

3.4.3 From \(m^3\) to carbon

Each growth curve is processed by species, one at a time. This requires a match between the species specified in Boudewyn et al. (2007) and the leading species associated with each curve provided by the user. We provide means to complete this match and full-stops if there is not match. Growth curves are often developed by strata or multiple characteristics. The simulation list object curveID permits the user to identify multiple columns to define growth curves. In our example, the column gcids is used to identify unique growth curves.

Once we have all the required information assembled for our study area, we process the information by species, as the Boudewyn et al. (2007) parameters are leading species-specific (CBMutils::cumPoolsCreate()), and for each species, we processes each growth curve one at a time (using CBMutils::convertM3biom()). Values of merchantable volume at each age and (boudewyn?) parameters available on the NFIS, are used in Equation 1 (matches Eq. 1 in Figure 1) to get b_m, total stem wood biomass of merchantable-sized live trees (biomass includes stumps and tops), in metric tonnes per ha (CBMutils::b_m() used in CBMutils::convertM3biom()).

Equation 1.
\(b_m = a * volume^b\)

Where:

  • \(volume\) = gross merchantable volume/ha (net in B.C.) of all live trees (volume does not include stumps, tops, or trees < merchantable DBH), in m3/ha.

  • \(a\), \(b\) = non-linear model parameters fit separately by jurisdiction, ecozone, and lead tree species (Table 3 in Boudewyn et al. (2007)).

The stem wood content of smaller trees in tonnes/ha (\(b_n\)) are calculated via Equation 2 (CBMutils::nmfac() used in CBMutils::convertM3biom() matches Eq. 2 in Figure 1).

Equation 2.
\(nonmerchfactor = k + a * b_m^b\)

Where:

  • \(nonmerchfactor = b_{nm}/b_m\)

  • \(b_{nm} = b_m + b_n\)

  • \(k\), \(a\), and \(b\) are model parameters fit separately by jurisdiction, ecozone, and lead tree species (Table 4 in Boudewyn et al. (2007)).

The stem wood biomass of live, sapling-sized trees in tonnes/ha (\(b_s\)) is extracted from Equation 3 (CBMutils::sapfac() used in CBMutils::convertM3biom() matches Eq. 3 in Figure 1).

Equation 3.
\(saplingfactor = k + a * b_m^b\)

Where:

  • \(saplingfactor = b_{snm}/b_{nm}\)

  • \(b_snm = b_nm + b_s\)

  • \(k\), \(a\), and \(b\) are model parameters fit separately by jurisdiction, ecozone, and lead tree species (Table 5 in Boudewyn et al. (2007)). Note that sparse data resulted in incomplete coverage of managed forests of Canada. Module users have to decide on parameter selection appropriate for their study area, as we do in our CBM_vol2biomass_SK example.

Proportions of total tree biomass in stem wood, stem bark, branches and foliage for live trees of all sizes are calculated with Equations 4, 5, 6, and 7 respectively (CBMutils::biomProp() returns a vector of proportion that matches Eq. 4, 5, 6 and 7 in Figure 1 and is used in CBMutils::convertM3biom()).

Equation 4.
\(P_{(stemwood)} = 1/(1 + e^{(a1+a2*vol+a3*lvol)} + e^{(b1+b2*vol+b3*lvol)} + e^{(c1+c2*vol+c3*lvol)} )\)

Equation 5.
\(P_{(bark)} = 1/(1 + e^{(a1+a2*vol+a3*lvol)} + e^{(b1+b2*vol+b3*lvol)} + e^{(c1+c2*vol+c3*lvol)} )\)

Equation 6.
\(P_{(branches)} = 1/(1 + e^{(a1+a2*vol+a3*lvol)} + e^{(b1+b2*vol+b3*lvol)} + e^{(c1+c2*vol+c3*lvol)} )\)

Equation 7.
\(P_{(foliage)} = 1/(1 + e^{(a1+a2*vol+a3*lvol)} + e^{(b1+b2*vol+b3*lvol)} + e^{(c1+c2*vol+c3*lvol)} )\)

Where:

  • \(vol\) gross merchantable volume per ha (provided by the user)

  • \(lvol\) is the natural logarithm of (\(vol\) + 5)

  • \(a1, a2, a3, b1, b2, b3, c1, c2, c3\) are model parameters fit separately by jurisdiction, ecozone and lead tree species (Table 6 in Boudewyn et al. (2007)).

Our CBMutils::biomProp() function also implements the caps on proportion models (Table 7 in Boudewyn et al. (2007)). Tonnes of biomass per hectare are converted to tonnes of carbon per hectare in our CBMutils::cumPoolsCreate() functions (this is currently a constant at 0.5 tonnes of carbon per tonnes of biomass but users can modify this value).

3.4.4 Smoothing algorithm

Forest management is based on forest inventory data. These were developed to calculate how forest growth for the purposes of sustainable production of forests products (\(m^3/ha\)). Tree diameters are measured for these purposes, and by consequence, trees only start getting measured once they have reached a minimum diameter (which varies per jurisdiction). This leaves a gap between age 0 of the stand and the age at which trees reach this specified diameter. To fill this gap we use a smoothing algorithm based on the Chapman_Richards function (Gove (2019)). We apply this smoothing to the cumulative curves for each of the three pools (totMerch, fol, other).

The module automatically plots both the direct translation (no smoothing totMerch, fol, other)) and the smoothed (totMerch_New, fol_New, other_New) curves for all three pools. These figures are save in the SpaDES project folder under outputs/CBM_vol2biomass_figures/cumPools_smoothed_postChapmanRichards.png. The CBMutils::cumPoolsSmooth function implements the smoothing procedure.

3.5 Outputs

Name Class Description
cumPoolsClean Data table Tonnes of carbon/ha both cumulative and increments, for each growth curve id, by age and ecozone
growth_increments Data table growth increment matrix
gcMetaAllCols Data table gcMeta with ecozones
volCurves Plot Plots of all growth curves provided by the user

3.6 Usage

This module can be run independently. The global script below runs the module for the managed forests of Saskatchewan. Inputs would have to be adapted by the user to be run elsewhere.

#project path and package install
projectPath <- "~/CBM_vol2biomass_SK"
repos <- unique(c("predictiveecology.r-universe.dev", getOption("repos")))
install.packages("SpaDES.project",
                 repos = repos)

#setup
out <- SpaDES.project::setupProject(
  paths = list(projectPath = projectPath),
  overwrite = TRUE,
  
  options = options(
    repos = c(repos = repos),
    reproducible.destinationPath = "inputs"
  ),
  modules =  c("PredictiveEcology/CBM_vol2biomass_SK@development"),
  require = c("SpaDES.core"),
  
  
  ######### inputs #########
  
  spatialDT = data.table(
    gcids = c(55, 49, 52, 58, 28, 37, 34, 31, 40, 61, 50, 35, 29, 56, 62),
    spatial_unit_id = c(28, 28, 28, 28, 27, 27, 27, 27, 27, 28, 28, 27, 27, 28, 28),
    ecozones = c(9, 9, 9, 9, 6, 6, 6, 6, 6, 9, 9, 6, 6, 9, 9)),

#run
simBiomass <- simInitAndSpades2(out)