knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)
library(dplyr)
library(ggplot2)
library(rpmodel)

Functional dependencies in the model exposed and visualized!

C3 Photosynthesis

Temperature

At constant conditions (VPD = 300 Pa, CO2 = 400 ppm, fAPAR = 1, PPFD = 30 mol m-2 d-1, elevation = 0 m a.s.l.)

out_ts <- rpmodel::rpmodel( 
  tc             = seq(10, 30, by = 1),
  vpd            = 300,
  co2            = 400,
  fapar          = 1,
  ppfd           = 30,
  elv            = 0,         
  c4             = FALSE,
  do_ftemp_kphio = FALSE,
  do_soilmstress = FALSE
  ) %>% 
  as_tibble() %>% 
  mutate(setup = "ORG",
             tc = seq(10, 30, by = 1)) %>% 
  bind_rows(
    rpmodel::rpmodel( 
      tc             = seq(10, 30, by = 1),
      vpd            = 300,
      co2            = 400,
      fapar          = 1,
      ppfd           = 30,
      elv            = 0,         
      c4             = FALSE,
      do_ftemp_kphio = TRUE,
      do_soilmstress = FALSE
      ) %>% 
      as_tibble() %>% 
      mutate(setup = "BRC",
             tc = seq(10, 30, by = 1))
      )

out_ts %>% 
  ggplot(aes(x = tc, y = gpp, color = setup)) +
  geom_line() +
  labs(x = "Temperature (deg C)", y = "GPP (g m-2 d-1)")

out_ts %>% 
  ggplot(aes(x = tc, y = chi, color = setup)) +
  geom_line() +
  labs(x = "Temperature (deg C)", y = "chi")

out_ts %>% 
  ggplot(aes(x = tc, y = vcmax, color = setup)) +
  geom_line() +
  labs(x = "Temperature (deg C)", y = "Vcmax (g m-2 d-1)")

VPD

At constant conditions (T = 20 deg C, CO2 = 400 ppm, fAPAR = 1, PPFD = 30 mol m-2 d-1, elevation = 0 m a.s.l.)

out_ts <- rpmodel::rpmodel( 
  tc             = 20,
  vpd            = seq(0, 4000, by = 50),
  co2            = 400,
  fapar          = 1,
  ppfd           = 30,
  elv            = 0,         
  c4             = FALSE,
  do_ftemp_kphio = FALSE,
  do_soilmstress = FALSE
  ) %>% 
  as_tibble() %>% 
  mutate(setup = "ORG",
             vpd = seq(0, 4000, by = 50)) %>% 
  bind_rows(
    rpmodel::rpmodel( 
      tc             = 20,
      vpd            = seq(0, 4000, by = 50),
      co2            = 400,
      fapar          = 1,
      ppfd           = 30,
      elv            = 0,         
      c4             = FALSE,
      do_ftemp_kphio = TRUE,
      do_soilmstress = FALSE
      ) %>% 
      as_tibble() %>% 
      mutate(setup = "BRC",
             vpd = seq(0, 4000, by = 50))
      )

out_ts %>% 
  ggplot(aes(x = vpd, y = gpp, color = setup)) +
  geom_line() +
  labs(x = "VPD (Pa)", y = "GPP (g m-2 d-1)")

out_ts %>% 
  ggplot(aes(x = vpd, y = chi, color = setup)) +
  geom_line() +
  labs(x = "VPD (Pa)", y = "chi")

out_ts %>% 
  ggplot(aes(x = vpd, y = vcmax, color = setup)) +
  geom_line() +
  labs(x = "VPD (Pa)", y = "Vcmax (g m-2 d-1)")

PPFD

At constant conditions (T = 20 deg C, VPD = 300 Pa, CO2 = 400 ppm, fAPAR = 1, elevation = 0 m a.s.l.)

out_ts <- rpmodel::rpmodel( 
  tc             = 20,
  vpd            = 300,
  co2            = 400,
  fapar          = 1,
  ppfd           = seq(1, 50, by = 1),
  elv            = 0,         
  c4             = FALSE,
  do_ftemp_kphio = FALSE,
  do_soilmstress = FALSE
  ) %>% 
  as_tibble() %>% 
  mutate(setup = "ORG",
         ppfd = seq(1, 50, by = 1)) %>% 
  bind_rows(
    rpmodel::rpmodel( 
      tc             = 20,
      vpd            = 300,
      co2            = 400,
      fapar          = 1,
      ppfd           = seq(1, 50, by = 1),
      elv            = 0,         
      c4             = FALSE,
      do_ftemp_kphio = TRUE,
      do_soilmstress = FALSE
      ) %>% 
      as_tibble() %>% 
      mutate(setup = "BRC",
             ppfd = seq(1, 50, by = 1))
      )

out_ts %>% 
  ggplot(aes(x = ppfd, y = gpp, color = setup)) +
  geom_line() +
  labs(x = "PPFD (mol m-2 d-1)", y = "GPP (g m-2 d-1)")

out_ts %>% 
  ggplot(aes(x = ppfd, y = chi, color = setup)) +
  geom_line() +
  labs(x = "PPFD (mol m-2 d-1)", y = "chi")

out_ts %>% 
  ggplot(aes(x = ppfd, y = vcmax, color = setup)) +
  geom_line() +
  labs(x = "PPFD (mol m-2 d-1)", y = "Vmax (g m-2 d-1)")

Atmospheric pressure

At constant conditions (T = 20 deg C, VPD = 300 Pa, CO2 = 400 ppm, fAPAR = 1, PPFD = 30 mol m-2 d-1)

calc_patm <- function( elv, patm0 = 101325 ){

  # Define constants:
  kTo <- 298.15    # base temperature, K (Prentice, unpublished)
  kL  <- 0.0065    # adiabiatic temperature lapse rate, K/m (Allen, 1973)
  kG  <- 9.80665   # gravitational acceleration, m/s^2 (Allen, 1973)
  kR  <- 8.3145    # universal gas constant, J/mol/K (Allen, 1973)
  kMa <- 0.028963  # molecular weight of dry air, kg/mol (Tsilingiris, 2008)

  # Convert elevation to pressure, Pa:
  patm <- patm0*(1.0 - kL*elv/kTo)^(kG*kMa/(kR*kL))

  return(patm)
}

out_ts <- rpmodel::rpmodel( 
  tc             = 20,
  vpd            = 300,
  co2            = 400,
  fapar          = 1,
  ppfd           = 30,
  patm           = calc_patm(seq(0, 4000, by = 40)),         
  c4             = FALSE,
  do_ftemp_kphio = FALSE,
  do_soilmstress = FALSE
  ) %>% 
  as_tibble() %>% 
  mutate(setup = "ORG",
         patm = calc_patm(seq(0, 4000, by = 40))) %>% 
  bind_rows(
    rpmodel::rpmodel( 
      tc             = 20,
      vpd            = 300,
      co2            = 400,
      fapar          = 1,
      ppfd           = 30,
      patm           = calc_patm(seq(0, 4000, by = 40)),         
      c4             = FALSE,
      do_ftemp_kphio = TRUE,
      do_soilmstress = FALSE
      ) %>% 
      as_tibble() %>% 
      mutate(setup = "BRC",
             patm = calc_patm(seq(0, 4000, by = 40)))
      )

out_ts %>% 
  ggplot(aes(x = patm, y = gpp, color = setup)) +
  geom_line() +
  labs(x = "P (Pa)", y = "GPP (g m-2 d-1)")

out_ts %>% 
  ggplot(aes(x = patm, y = chi, color = setup)) +
  geom_line() +
  labs(x = "P (Pa)", y = "chi")

out_ts %>% 
  ggplot(aes(x = patm, y = vcmax, color = setup)) +
  geom_line() +
  labs(x = "P (Pa)", y = "Vcmax (g m-2 d-1)")

C4 Photosynthesis

Temperature

At constant conditions (VPD = 300 Pa, CO2 = 400 ppm, fAPAR = 1, PPFD = 30 mol m-2 d-1, elevation = 0 m a.s.l.)

out_ts <- rpmodel::rpmodel( 
  tc             = seq(10, 30, by = 1),
  vpd            = 300,
  co2            = 400,
  fapar          = 1,
  ppfd           = 30,
  elv            = 0,         
  c4             = TRUE,
  do_ftemp_kphio = FALSE,
  do_soilmstress = FALSE
  ) %>% 
  as_tibble() %>% 
  mutate(setup = "ORG",
             tc = seq(10, 30, by = 1)) %>% 
  bind_rows(
    rpmodel::rpmodel( 
      tc             = seq(10, 30, by = 1),
      vpd            = 300,
      co2            = 400,
      fapar          = 1,
      ppfd           = 30,
      elv            = 0,         
      c4             = TRUE,
      do_ftemp_kphio = TRUE,
      do_soilmstress = FALSE
      ) %>% 
      as_tibble() %>% 
      mutate(setup = "BRC",
             tc = seq(10, 30, by = 1))
      )

out_ts %>% 
  ggplot(aes(x = tc, y = gpp, color = setup)) +
  geom_line() +
  labs(x = "Temperature (deg C)", y = "GPP (g m-2 d-1)")

out_ts %>% 
  ggplot(aes(x = tc, y = chi, color = setup)) +
  geom_line() +
  labs(x = "Temperature (deg C)", y = "chi")

out_ts %>% 
  ggplot(aes(x = tc, y = vcmax, color = setup)) +
  geom_line() +
  labs(x = "Temperature (deg C)", y = "Vcmax (g m-2 d-1)")

VPD

At constant conditions (T = 20 deg C, CO2 = 400 ppm, fAPAR = 1, PPFD = 30 mol m-2 d-1, elevation = 0 m a.s.l.)

out_ts <- rpmodel::rpmodel( 
  tc             = 20,
  vpd            = seq(0, 4000, by = 50),
  co2            = 400,
  fapar          = 1,
  ppfd           = 30,
  elv            = 0,         
  c4             = TRUE,
  do_ftemp_kphio = FALSE,
  do_soilmstress = FALSE
  ) %>% 
  as_tibble() %>% 
  mutate(setup = "ORG",
             vpd = seq(0, 4000, by = 50)) %>% 
  bind_rows(
    rpmodel::rpmodel( 
      tc             = 20,
      vpd            = seq(0, 4000, by = 50),
      co2            = 400,
      fapar          = 1,
      ppfd           = 30,
      elv            = 0,         
      c4             = TRUE,
      do_ftemp_kphio = TRUE,
      do_soilmstress = FALSE
      ) %>% 
      as_tibble() %>% 
      mutate(setup = "BRC",
             vpd = seq(0, 4000, by = 50))
      )

out_ts %>% 
  ggplot(aes(x = vpd, y = gpp, color = setup)) +
  geom_line() +
  labs(x = "VPD (Pa)", y = "GPP (g m-2 d-1)")

out_ts %>% 
  ggplot(aes(x = vpd, y = chi, color = setup)) +
  geom_line() +
  labs(x = "VPD (Pa)", y = "chi")

out_ts %>% 
  ggplot(aes(x = vpd, y = vcmax, color = setup)) +
  geom_line() +
  labs(x = "VPD (Pa)", y = "Vcmax (g m-2 d-1)")

PPFD

At constant conditions (T = 20 deg C, VPD = 300 Pa, CO2 = 400 ppm, fAPAR = 1, elevation = 0 m a.s.l.)

Varying PPFD from 1 to 50 mol m-2 d-1.

out_ts <- rpmodel::rpmodel( 
  tc             = 20,
  vpd            = 300,
  co2            = 400,
  fapar          = 1,
  ppfd           = seq(1, 50, by = 1),
  elv            = 0,         
  c4             = TRUE,
  do_ftemp_kphio = FALSE,
  do_soilmstress = FALSE
  ) %>% 
  as_tibble() %>% 
  mutate(setup = "ORG",
         ppfd = seq(1, 50, by = 1)) %>% 
  bind_rows(
    rpmodel::rpmodel( 
      tc             = 20,
      vpd            = 300,
      co2            = 400,
      fapar          = 1,
      ppfd           = seq(1, 50, by = 1),
      elv            = 0,         
      c4             = TRUE,
      do_ftemp_kphio = TRUE,
      do_soilmstress = FALSE
      ) %>% 
      as_tibble() %>% 
      mutate(setup = "BRC",
             ppfd = seq(1, 50, by = 1))
      )

out_ts %>% 
  ggplot(aes(x = ppfd, y = gpp, color = setup)) +
  geom_line() +
  labs(x = "PPFD (mol m-2 d-1)", y = "GPP (g m-2 d-1)")

out_ts %>% 
  ggplot(aes(x = ppfd, y = chi, color = setup)) +
  geom_line() +
  labs(x = "PPFD (mol m-2 d-1)", y = "chi")

out_ts %>% 
  ggplot(aes(x = ppfd, y = vcmax, color = setup)) +
  geom_line() +
  labs(x = "PPFD (mol m-2 d-1)", y = "Vmax (g m-2 d-1)")

Atmospheric pressure

At constant conditions (T = 20 deg C, VPD = 300 Pa, CO2 = 400 ppm, fAPAR = 1, PPFD = 30 mol m-2 d-1)

calc_patm <- function( elv, patm0 = 101325 ){

  # Define constants:
  kTo <- 298.15    # base temperature, K (Prentice, unpublished)
  kL  <- 0.0065    # adiabiatic temperature lapse rate, K/m (Allen, 1973)
  kG  <- 9.80665   # gravitational acceleration, m/s^2 (Allen, 1973)
  kR  <- 8.3145    # universal gas constant, J/mol/K (Allen, 1973)
  kMa <- 0.028963  # molecular weight of dry air, kg/mol (Tsilingiris, 2008)

  # Convert elevation to pressure, Pa:
  patm <- patm0*(1.0 - kL*elv/kTo)^(kG*kMa/(kR*kL))

  return(patm)
}

out_ts <- rpmodel::rpmodel( 
  tc             = 20,
  vpd            = 300,
  co2            = 400,
  fapar          = 1,
  ppfd           = 30,
  patm           = calc_patm(seq(0, 4000, by = 40)),         
  c4             = TRUE,
  do_ftemp_kphio = FALSE,
  do_soilmstress = FALSE
  ) %>% 
  as_tibble() %>% 
  mutate(setup = "ORG",
         patm = calc_patm(seq(0, 4000, by = 40))) %>% 
  bind_rows(
    rpmodel::rpmodel( 
      tc             = 20,
      vpd            = 300,
      co2            = 400,
      fapar          = 1,
      ppfd           = 30,
      patm           = calc_patm(seq(0, 4000, by = 40)),         
      c4             = TRUE,
      do_ftemp_kphio = TRUE,
      do_soilmstress = FALSE
      ) %>% 
      as_tibble() %>% 
      mutate(setup = "BRC",
             patm = calc_patm(seq(0, 4000, by = 40)))
      )

out_ts %>% 
  ggplot(aes(x = patm, y = gpp, color = setup)) +
  geom_line() +
  labs(x = "P (Pa)", y = "GPP (g m-2 d-1)")

out_ts %>% 
  ggplot(aes(x = patm, y = chi, color = setup)) +
  geom_line() +
  labs(x = "P (Pa)", y = "chi")

out_ts %>% 
  ggplot(aes(x = patm, y = vcmax, color = setup)) +
  geom_line() +
  labs(x = "P (Pa)", y = "Vcmax (g m-2 d-1)")

Temperature-dependence of quantum yield

ftemp_c3_stocker <- function(...){0.081785 * ftemp_kphio(...)}
ftemp_c3_caiprentice <- function(tc){0.044 + 0.00275 * tc - 0.425e-4 * tc^2}

ggplot() +
  geom_function(fun = ftemp_c3_stocker, args = list(c4 = FALSE)) +
  geom_function(fun = ftemp_c3_caiprentice, color = "royalblue") +
  xlim(0, 30) + 
  ylim(0, 0.1) +
  labs(x = expression(paste("Temperature (", degree, "C)")), y = expression(varphi),
       title = "Temperature dependence of quantum yield of C3 photosynthesis (BRC setup)",
       subtitle = "Black: Stocker et al., 2020 | Blue: Cai & Prentice, 2020")

ftemp_c4_stocker <- function(...){1.0 * ftemp_kphio(...)}
ftemp_c4_caiprentice <- function(tc){-0.064 + 0.03 * tc - 0.000464 * tc^2 }

ggplot() +
  geom_function(fun = ftemp_c4_stocker, args = list(c4 = TRUE), size = 2) +
  geom_function(fun = ftemp_c4_caiprentice, color = "royalblue") +
  xlim(0, 30) +
  labs(x = expression(paste("Temperature (", degree, "C)")), y = expression(varphi),
       title = "Temperature dependence of quantum yield of C4 photosynthesis (BRC setup)",
       subtitle = "Black: Stocker et al., 2020 | Blue: Cai & Prentice, 2020")


stineb/rpmodel documentation built on Feb. 21, 2023, 8:37 a.m.