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)