Hector version 3 introduces a new capability to the model: permafrost thaw. The is important because enormous amounts of organic carbon are stored in high-latitude permafrost soils, frozen pools that can destabilized, thawed, and released to the atmosphere by climatic warming. This process has the potential to significantly accelerate climate change (Schuur et al. 2015).
It is important to note that (1) permafrost is currently OFF by default, and (2) the model’s permafrost dynamics have not been fully checked against the original implementation (Woodard et al. 2021). As a result, this is currently an EXPERIMENTAL feature that is not ready for scientific simulations.
Woodard, D. L., Shiklomanov, A. N., Kravitz, B., Hartin, C., Bond-Lamberty, B. (2021). A permafrost implementation in the simple carbon-climate model Hector v.2.3pf. Geosci. Model Dev., 14, 4751–4767. https://doi.org/10.5194/gmd-14-4751-2021
Setup
Start by setting up a default Hector core and running it:
library(hector)
ini <- system.file("input/hector_ssp245.ini", package = "hector")
core <- newcore(ini, name = "ssp245-default")
As noted above, currently by default the model is initialized with no permafrost carbon:
fetchvars(core, dates = NA, vars = PERMAFROST_C())
#> scenario year variable value units
#> 1 ssp245-default NA permafrost_c 865 Pg C
Run the default core and save its outputs:
invisible(run(core))
# Output variables we want to retrieve
climate_vars <- c(ATMOSPHERIC_CO2(), GLOBAL_TAS(), RF_CO2(), RF_TOTAL())
permafrost_vars <- c(PERMAFROST_C(), THAWEDP_C(), RH(), CONCENTRATIONS_CH4())
run1 <- fetchvars(core, dates = 1745:2300, vars = c(climate_vars, permafrost_vars))
shutdown(core)
#> Hector core (INACTIVE)
Enabling permafrost
Set up a new core and set its initial permafrost carbon to 865 Pg C, the value used by Woodard et al. (2021):
core <- newcore(ini, name = "ssp245-permafrost")
setvar(core, 0, PERMAFROST_C(), 865, "Pg C")
invisible(run(core))
#> Auto-resetting core to -1
run2 <- fetchvars(core, dates = 1745:2300, vars = c(climate_vars, permafrost_vars))
We can check and confirm that permafrost was lost to the atmosphere as the climate warmed…
fetchvars(core, 2300, PERMAFROST_C())
#> scenario year variable value units
#> 1 ssp245-permafrost 2300 permafrost_c 672.0806 Pg C
shutdown(core)
#> Hector core (INACTIVE)
…leading to earth system and climate differences:
A closer look at permafrost dynamics
The thaw rate is controlled by biome-specific air temperature, and thawed permafrost slowly decomposes into both CH\(_4\) and CO\(_2\). We can look at some of these effects in more detail:
ggplot(subset(results, variable %in% permafrost_vars),
aes(year, value, color = scenario)) +
geom_line() +
facet_wrap(~variable, scales = "free")
Here we can see how permafrost thaws and then, in the 22nd century, slightly refreezes; the thawed permafrost pool peaks in the second half of the 20th century and then declines; and both atmospheric methane and total heterotrophic respiration are significantly higher in the permafrost than non-permafrost simulations.
Controlling the behavior of permafrost thaw
As described by Woodard et al. (2021), the relationship between air temperature and thaw fraction is controlled by two parameters that are calibrated to CMIP6 data:
core <- newcore(ini, name = "ssp245-permafrost")
setvar(core, 0, PERMAFROST_C(), 865, "Pg C")
fetchvars(core, NA, c(PERMAFROST_MU(), PERMAFROST_SIGMA()))
#> scenario year variable value units
#> 1 ssp245-permafrost NA pf_mu 1.670 degC
#> 2 ssp245-permafrost NA pf_sigma 0.986 degC
We can test the effect of varying these parameters:
run_fn <- function(value, core, variable) {
setvar(core, NA, variable, value, "degC")
reset(core)
run(core)
out <- fetchvars(core, 2100:2300, vars = GLOBAL_TAS())
out$varying <- variable
out$param_value <- value
out
}
# Run basic parameter sensitivity test
results_mu <- lapply(seq(1.4, 2.1, length.out = 6), run_fn, core, PERMAFROST_MU())
#> Auto-resetting core to -1
results_sigma <- lapply(seq(0.7, 1.2, length.out = 6), run_fn, core, PERMAFROST_SIGMA())
# Combine results and plot
results <- do.call("rbind", c(results_mu, results_sigma))
default <- subset(run2, variable == GLOBAL_TAS() & year %in% 2100:2300)
ggplot(results, aes(year, value, color = param_value, group = paste(varying, param_value))) +
geom_line(linetype = 2) +
ylab(GLOBAL_TAS()) +
facet_wrap(~varying) +
# add a thick black line to show default behavior
annotate(geom = "line", x = default$year, y = default$value, linewidth = 1.5)
Hector’s permafrost capability is planned to be fully science-ready in v3.2.