Model setup

The P-hydro model (Joshi et al., 2022) is used here to illustrate the effect of acclimating P50 (leaf water potential at 50% loss of conductivity) and K (whole plant conductivity) on the response of stomatal conductance and transpiration to VPD and soil moisture.

# other environmental factors held constant
kphio = 0.087;       # quantum yield efficiency
ppfd = 300;          # umol/m2/s
vpd  = 1000;         # Pa
co2  = 400;          # ppm
elv  = 0;            # m.a.s.l.
fapar = 0.7;         # fraction
rdark = 0.015;
tc = 25;
vwind = 3;
netrad = ppfd/2

# cost parameters for the optimality model (not directly observable)
par_cost = list(alpha = 0.1, gamma = 1)

# model options
options = list(gs_method = "GS_IGF", 
               et_method = "ET_DIFFUSION",
               ftemp_vj_method = "FV_kumarathunge19",
               ftemp_rd_method = "FR_heskel16",
               ftemp_br_method = "FB_atkin15",
               scale_alpha = FALSE
               )

# long-term average VPD to which Vcmax25 and Jmax25 are acclimated
vpd_acc = 100

Reference simulation

With P50 and K at reference values, calculate stomatal conductance and transpiration in response to VPD at two different soil moisture levels (-0.1 kPa and -3 kPa).

par_plant_no_acclim = list(conductivity = 3e-17, 
                           psi50 = -2, 
                           b = 2)

acc2 = rphydro_analytical(tc, 
                          tc, 
                          ppfd, 
                          netrad, 
                          vpd_acc, 
                          co2, 
                          elv, 
                          fapar, 
                          kphio, 
                          0, 
                          rdark, 
                          vwind, 
                          par_plant_no_acclim, 
                          par_cost, 
                          options)

dat2 = list(vpd = exp(seq(log(100), log(5000), length.out = 100 )),
            psi_soil = c(-0.1, -3)) %>%
  expand.grid() %>% 
  mutate(dat = purrr::map2(.x = psi_soil, 
                           .y = vpd, 
                           .f = ~rphydro_instantaneous_analytical(acc2$vcmax25, 
                                                                  acc2$jmax25, 
                                                                  tc, 
                                                                  tc, 
                                                                  ppfd, 
                                                                  netrad, 
                                                                  .y, 
                                                                  co2, 
                                                                  elv, 
                                                                  fapar, 
                                                                  kphio, 
                                                                  .x, 
                                                                  rdark, 
                                                                  vwind, 
                                                                  par_plant_no_acclim, 
                                                                  par_cost, 
                                                                  options))) %>% 
  unnest_wider(dat)

Acclimated hydraulic traits

Assume that the acclimation of hydraulic traits to sustained hydraulic stress leads to a more negative P50 and a lower conductivity.

par_plant_acclim = list(conductivity = 2e-17, 
                        psi50 = -4, 
                        b = 2)

acc1 = rphydro_analytical(tc, 
                          tc, 
                          ppfd, 
                          netrad, 
                          vpd_acc, 
                          co2, 
                          elv, 
                          fapar, 
                          kphio, 
                          0, 
                          rdark, 
                          vwind, 
                          par_plant_acclim, 
                          par_cost, 
                          options
                          )

dat1 = list(vpd = exp(seq(log(100), log(5000), length.out = 100)),
            psi_soil = c(-0.1, -3)) %>%
  expand.grid() %>% 
  mutate(dat = purrr::map2(.x = psi_soil, 
                           .y = vpd, 
                           .f = ~rphydro_instantaneous_analytical(acc1$vcmax25, 
                                                                  acc1$jmax25, 
                                                                  tc, 
                                                                  tc, 
                                                                  ppfd, 
                                                                  netrad, 
                                                                  .y, 
                                                                  co2, 
                                                                  elv, 
                                                                  fapar, 
                                                                  kphio, 
                                                                  .x, 
                                                                  rdark, 
                                                                  vwind, 
                                                                  par_plant_acclim, 
                                                                  par_cost, 
                                                                  options))) %>% 
  unnest_wider(dat)

Plot

tmp <- dat1 %>% 
  select(vpd, psi_soil, gs, e, a) %>% 
  mutate(type = "With acclimation") %>% 
  rbind(dat2 %>% 
          select(vpd, psi_soil, gs, e, a) %>% 
          mutate(type = "No acclimation")) %>% 
  melt(c("vpd", "psi_soil", "type"))

gg1 <- tmp %>%
  filter(variable == "gs") %>% 
  ggplot(aes(x = vpd, y = value, col = factor(psi_soil), group = factor(psi_soil))) + 
  facet_wrap(facets = c("type"), scales = "fixed", nrow = 1) +
  geom_line(size = 1) +
  labs(x = "VPD", y = "Stomatal conductance") +
  scale_color_manual(labels = c("Dry soil", "Moist soil"), 
                     values = c('#E69F00','#56B4E9'), name = "") +
  ylim(0, NA) +
  theme_cowplot() +
  theme(
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        legend.position = c(0.75, 0.6))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
gg2 <- tmp %>%
  filter(variable == "e") %>% 
  ggplot(aes(x = vpd, y = value, col = factor(psi_soil), group = factor(psi_soil))) + 
  facet_wrap(facets = c("type"), scales = "fixed", nrow = 1) +
  geom_line(size = 1) +
  labs(x = "VPD", y = "Transpiration") +
  scale_color_manual(labels = c("Dry soil", "Moist soil"), 
                     values = c('#E69F00','#56B4E9'), name = "") +
  ylim(0, NA) +
  theme_cowplot() +
  theme(
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        axis.line.y = element_line(),
        legend.position = "none")

gg3 <- tmp %>%
  filter(variable == "a") %>% 
  ggplot(aes(x = vpd, y = value, col = factor(psi_soil), group = factor(psi_soil))) + 
  facet_wrap(facets = c("type"), scales = "fixed", nrow = 1) +
  geom_line(size = 1) +
  labs(x = "VPD", y = "Assimilation") +
  scale_color_manual(labels = c("Dry soil", "Moist soil"), 
                     values = c('#E69F00','#56B4E9'), name = "") +
  ylim(0, NA) +
  theme_cowplot() +
  theme(
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        axis.line.y = element_line(),
        legend.position = "none")

cowplot::plot_grid(gg1, gg2, nrow = 2)

ggsave("../fig/acclimating_vpd_response.png", width = 6, height = 5)

cowplot::plot_grid(gg1, gg2, gg3, nrow = 3)

ggsave("../fig/acclimating_vpd_response_with_assim.png", width = 6, height = 7)