---
title: "Summary of functional dependencies"
author: "Beni Stocker"
output: 
  rmarkdown::html_vignette:
    md_extensions: ["-autolink_bare_uris"]
vignette: >
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
  %\VignetteIndexEntry{Summary of functional dependencies}
---

```{r setup, include=FALSE}
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.)

```{r}
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.)

```{r}
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.)

```{r}
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)

```{r}
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.)

```{r}
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.)

```{r}
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.

```{r}
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)

```{r}
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

```{r}
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")
```
