Advanced water and energy balance simulation

Miquel De Caceres

2020-11-05

About this vignette

This document describes how to run a water and energy balance model that uses a more detailed approach for hydraulics and stomatal regulation described in De Cáceres et al. (2021). This document is meant to teach users to run the simulation model within R. All the details of the model design and formulation can be found at https://vegmod.ctfc.cat/software/medfate.

Preparing model inputs

Most details of the soil plant water balance model inputs are already covered in vignette 1. Introduction to water balance simulation. Here only differences are mentioned.

Soils

The soil input for function is actually an object of class soil that is created using a function with the same name:

examplesoil = soil(defaultSoilParams(2))

Advanced soil plant energy and water balance modelling requires considering the temperature of soil. Hence, Temp contains the temperature (in degrees) of soil layers:

examplesoil$Temp
## [1] NA NA

Soil layer temperatures are initialized to missing values, so that at the first time step they will be set to atmospheric temperature. While simple water balance modeling can be run using either Saxton’s or Van Genuchten’s equations as water retention curves, Van Genuchten’s model is forced for advanced modelling.

Species data table

Simulation models in medfate require a data frame with species parameter values. The package provides a default data set of parameter values for 89 Mediterranean species (rows), resulting from bibliographic search, fit to empirical data or expert-based guesses:

data("SpParamsMED")

These species commonly occur in the Spanish forest inventory of Catalonia, but may not be sufficient for other areas. A large number of parameters (columns) can be found in SpParamsMED:

names(SpParamsMED)
##  [1] "Name"               "IFNcodes"           "SpIndex"           
##  [4] "Group"              "Order"              "Family"            
##  [7] "GrowthForm"         "Hmed"               "Hmax"              
## [10] "Z50"                "Z95"                "a_ash"             
## [13] "a_bsh"              "b_bsh"              "cr"                
## [16] "a_fbt"              "b_fbt"              "c_fbt"             
## [19] "d_fbt"              "a_cr"               "b_1cr"             
## [22] "b_2cr"              "b_3cr"              "c_1cr"             
## [25] "c_2cr"              "a_cw"               "b_cw"              
## [28] "PhenologyType"      "LeafDuration"       "Sgdd"              
## [31] "SLA"                "LeafDensity"        "WoodDensity"       
## [34] "FineRootDensity"    "r635"               "pDead"             
## [37] "Al2As"              "LeafWidth"          "SRL"               
## [40] "RLD"                "minFMC"             "maxFMC"            
## [43] "LeafPI0"            "LeafEPS"            "LeafAF"            
## [46] "StemPI0"            "StemEPS"            "StemAF"            
## [49] "LigninPercent"      "ParticleDensity"    "LeafLitterFuelType"
## [52] "Flammability"       "SAV"                "HeatContent"       
## [55] "gammaSWR"           "alphaSWR"           "kPAR"              
## [58] "g"                  "Psi_Extract"        "Psi_Critic"        
## [61] "WUE"                "pRootDisc"          "Gwmin"             
## [64] "Gwmax"              "VCleaf_kmax"        "VCleaf_c"          
## [67] "VCleaf_d"           "Kmax_stemxylem"     "VCstem_c"          
## [70] "VCstem_d"           "Kmax_rootxylem"     "VCroot_c"          
## [73] "VCroot_d"           "Narea"              "Vmax298"           
## [76] "Jmax298"            "WoodC"              "RGRsapwoodmax"     
## [79] "fHDmin"             "fHDmax"

Not all parameters are needed for all models. The user can find parameter definitions in the help page of this data set. However, to fully understand the role of parameters in the model, the user should read the details of model design and formulation (https://vegmod.ctfc.cat/software/medfate).

Vegetation

Models included in medfate were primarily designed to be ran on forest inventory plots (these are explained in detail in 1. Introduction to water balance simulation):

data(exampleforestMED)
exampleforestMED
## $ID
## [1] "1"
## 
## $patchsize
## [1] 10000
## 
## $treeData
##   Species   N   DBH Height Z50  Z95
## 1      54 168 37.55    800 750 3000
## 2      68 384 14.60    660 750 3000
## 
## $shrubData
##   Species Cover Height Z50  Z95
## 1      65  3.75     80 300 1500
## 
## $herbCover
## [1] 10
## 
## $herbHeight
## [1] 20
## 
## attr(,"class")
## [1] "forest" "list"

Meteorological forcing

Advanced water and energy balance modeling requires daily precipitation, radiation, wind speed, min/max temparatures and relative humitidy as inputs:

data(examplemeteo)
head(examplemeteo)
##            MeanTemperature MinTemperature MaxTemperature Precipitation
## 2001-01-01      3.57668969     -0.5934215       6.287950      4.869109
## 2001-01-02      1.83695972     -2.3662458       4.569737      2.498292
## 2001-01-03      0.09462563     -3.8541036       2.661951      0.000000
## 2001-01-04      1.13866156     -1.8744860       3.097705      5.796973
## 2001-01-05      4.70578690      0.3288287       7.551532      1.884401
## 2001-01-06      4.57036721      0.5461322       7.186784     13.359801
##            MeanRelativeHumidity MinRelativeHumidity MaxRelativeHumidity
## 2001-01-01             78.73709            65.15411           100.00000
## 2001-01-02             69.70800            57.43761            94.71780
## 2001-01-03             70.69610            58.77432            94.66823
## 2001-01-04             76.89156            66.84256            95.80950
## 2001-01-05             76.67424            62.97656           100.00000
## 2001-01-06             89.01940            74.25754           100.00000
##            Radiation WindSpeed WindDirection       PET
## 2001-01-01  12.89251  2.000000           172 1.3212770
## 2001-01-02  13.03079  7.662544           278 2.2185985
## 2001-01-03  16.90722  2.000000           141 1.8045176
## 2001-01-04  11.07275  2.000000           172 0.9200627
## 2001-01-05  13.45205  7.581347           321 2.2914449
## 2001-01-06  12.84841  6.570501           141 1.7255058

Simulation models in medfate have been designed to work along with data generated from package meteoland. The user is strongly recommended to resort to this package to obtain suitable weather input for soil water balance simulations.

Simulation control

Apart from data inputs, the behaviour of simulation models is controlled using a set of global parameters. The default parameterization is obtained using function defaultControl():

control = defaultControl()

To use the complex soil water balance model we must change the values of transpirationMode (to switch from “Granier” to “Sperry”) and soilFunctions (to switch from Saxton’s retention curve, “SX”, to Van Genuchten’s retention curve, “VG”):

control$transpirationMode = "Sperry"
control$soilFunctions = "VG"

Water balance input object

A last step is needed before running the simulation function, consisting in the compilation of parameters and the calculation of additional parameter values for each plant cohort. If one has a forest object, the spwbInput object can be generated in directly from it:

x = forest2spwbInput(exampleforestMED, examplesoil, SpParamsMED, control)

The spwbInput object for advanced water and energy balance is similar to that of simple water balance simulations, but contains more elements. Information about the cohort species is found in element cohorts (i.e. code, species and name):

x$cohorts
##       SP              Name
## T1_54 54  Pinus halepensis
## T2_68 68      Quercus ilex
## S1_65 65 Quercus coccifera

Element canopy contains state variables of the whole canopy, which include growth degree days and canopy temperature:

x$canopy
## $Temp
## [1] NA

Canopy temperature is a state variable (as soil temperature) needed for energy balance. As you may already known, element above contains the aboveground structure data that we already know:

x$above
##         H        CR        N  LAI_live LAI_expanded LAI_dead Status
## T1_54 800 0.7150421 168.0000 0.8167012    0.8167012        0  alive
## T2_68 660 0.6055642 384.0000 0.7977952    0.7977952        0  alive
## S1_65  80 0.9738889 773.9235 0.0653033    0.0653033        0  alive

Belowground parameters can be seen in below:

x$below
##       Z50  Z95 fineRootBiomass coarseRootSoilVolume
## T1_54 750 3000        1292.135              20.0000
## T2_68 750 3000        2769.406              20.5000
## S1_65 300 1500        1572.816               0.4375

and in belowLayers:

x$belowLayers
## $V
##               1         2
## T1_54 0.1933638 0.8066362
## T2_68 0.1933638 0.8066362
## S1_65 0.5554389 0.4445611
## 
## $L
##               1        2
## T1_54 2639.0335 4652.149
## T2_68 2668.0909 4697.519
## S1_65  886.3285 1401.005
## 
## $VGrhizo_kmax
##                1         2
## T1_54    9734564  14254988
## T2_68   47915201  72392801
## S1_65 1285615340 396706496
## 
## $VCroot_kmax
##               1        2
## T1_54 0.4631615 1.096039
## T2_68 1.2450374 2.949965
## S1_65 4.0265291 2.038831
## 
## $Wpool
##       1 2
## T1_54 1 1
## T2_68 1 1
## S1_65 1 1
## 
## $RhizoPsi
##       1 2
## T1_54 0 0
## T2_68 0 0
## S1_65 0 0

The spwbInputobject also includes cohort parameter values for several kinds of traits. For example, plant anatomy parameters are described in paramsAnatomy:

x$paramsAnatomy
##         Hmax Hmed    Al2As   SLA LeafWidth LeafDensity WoodDensity
## T1_54 2000.0  970 1317.523 4.340       0.1         0.7     0.55253
## T2_68 1421.8  650 2512.563 5.870       3.0         0.7     0.90000
## S1_65  180.0   70 2512.563 5.859       1.0         0.7     0.92000
##       FineRootDensity  SRL RLD     r635
## T1_54             0.7 3870  10 1.964226
## T2_68             0.7 3870  10 1.805872
## S1_65             0.7 3870  10 2.289452

Parameters related to plant transpiration and photosynthesis can be seen in paramsTranspiration:

x$paramsTranspiration
##         Gwmin     Gwmax Vmax298  Jmax298 Kmax_stemxylem Kmax_rootxylem
## T1_54 0.00203 0.1900000    62.5 129.5000      0.1500000       0.893000
## T2_68 0.00450 0.2100000    66.2 130.0000      0.7735834       3.094334
## S1_65 0.01045 0.4518345   100.0 163.6253      0.2900000       1.160000
##       VCleaf_kmax  VCleaf_c  VCleaf_d VCstem_kmax  VCstem_c  VCstem_d
## T1_54           6 12.712961 -3.526895    1.257285 12.712961 -5.290342
## T2_68           8  2.188265 -4.138168    4.299811  4.581685 -7.723800
## S1_65           8  2.511383 -6.122057    8.176212  2.511383 -9.183085
##       VCroot_kmax VCroot_c  VCroot_d VGrhizo_kmax Plant_kmax
## T1_54    1.559201 1.056898 -1.244767     23989551  0.6236803
## T2_68    4.195002 1.494098 -2.134283    120308002  1.6780008
## S1_65    6.065360 2.655734 -6.198418   1682321836  2.4261439

Finally, parameters related to pressure-volume curves and water storage capacity of leaf and stem organs are in paramsWaterStorage:

x$paramsWaterStorage
##       LeafPI0 LeafEPS LeafAF     Vleaf   StemPI0  StemEPS StemAF Vsapwood
## T1_54   -2.11   12.18  0.162 0.1795440 -1.778525 10.43383    0.8 3.893453
## T2_68   -2.39   19.26  0.170 0.1327463 -3.224000 46.25763    0.8 1.091657
## S1_65   -2.37   17.23  0.240 0.1329955 -3.307200 50.36679    0.8 0.128187

Finally, remember that one can play with plant-specific parameters for soil water balance (instead of using species-level values) by modifying manually the parameter values in this object.

Static analysis of submodels

Before using the advanced water and energy balance model, is important to understand the parameters that influence the different sub-models. Package medfate provides low-level functions corresponding to sub-models (light extinction, hydraulics, transpiration, photosynthesis…). In addition, there are several high-level plotting functions that allow examining several aspects of these processes.

Vulnerability curves

Given a spwbInput object, we can use function hydraulics_vulnerabilityCurvePlot() to inspect vulnerability curves (i.e. how hydraulic conductance of a given segment changes with the water potential) for each plant cohort and each of the different segments of the soil-plant hydraulic network: rhizosphere, roots, stems and leaves:

hydraulics_vulnerabilityCurvePlot(x, type="leaf")

hydraulics_vulnerabilityCurvePlot(x, type="stem")

hydraulics_vulnerabilityCurvePlot(x, type="root")

hydraulics_vulnerabilityCurvePlot(x, examplesoil, type="rhizo")

The maximum values and shape of vulnerability curves for leaves and stems are regulated by parameters in paramsTranspiration. Roots have vulnerability curve parameters in the same data frame, but maximum conductance values need to be specified for each soil layer and are given in belowLayers$VCroot_kmax. Note that the last call to hydraulics_vulnerabilityCurvePlot() includes a soil object. This is because the van Genuchten parameters that define the shape of the vulnerability curve for the rhizosphere are stored in this object. Maximum conductance values in the rhizosphere are given in belowLayers$VGrhizo_kmax.

Supply functions

The vulnerability curves conformng the hydraulic network are used in the model to build the supply function, which relates water flow (i.e. transpiration) with the drop of water potential along the whole hydraulic pathway. The supply function contains not only these two variables, but also the water potential of intermediate nodes in the the hydraulic network. Function hydraulics_supplyFunctionPlot() can be used to inspect any of this variables:

hydraulics_supplyFunctionPlot(x, examplesoil, type="E")

hydraulics_supplyFunctionPlot(x, examplesoil, type="ERhizo")

hydraulics_supplyFunctionPlot(x, examplesoil, type="dEdP")

hydraulics_supplyFunctionPlot(x, examplesoil, type="StemPsi")

Calls to hydraulics_supplyFunctionPlot() always need both a spwbInput object and a soil object. The soil moisture state (i.e. its water potential) is the starting point for the calculation of the supply function, so different curves will be obtained for different values of soil moisture.

Stomatal regulation and photosynthesis

The soil water balance model determines stomatal conductance and transpiration separately for sunlit and shade leaves. Stomatal conductance is determined after building a photosynthesis function corresponding to the supply function and finding the value of stomatal conductance that maximizes carbon revenue while avoiding hydraulic damage (a profit-maximization approach). Given a meteorological and soil inputs and a chosen day and timestep, function transp_stomatalRegulationPlot() allows displaying the supply and photosynthesis curves for sunlit and shade leaves, along with an indication of the values corresponding to the chosen stomatal aperture:

d = 100
transp_stomatalRegulationPlot(x, examplesoil, examplemeteo, day = d, timestep=12,
                              latitude = 41.82592, elevation = 100, type="E")

transp_stomatalRegulationPlot(x, examplesoil, examplemeteo, day = d, timestep=12,
                              latitude = 41.82592, elevation = 100, type="An")

transp_stomatalRegulationPlot(x, examplesoil, examplemeteo, day = d, timestep=12,
                              latitude = 41.82592, elevation = 100, type="Gw")

transp_stomatalRegulationPlot(x, examplesoil, examplemeteo, day = d, timestep=12,
                              latitude = 41.82592, elevation = 100, type="T")

transp_stomatalRegulationPlot(x, examplesoil, examplemeteo, day = d, timestep=12,
                              latitude = 41.82592, elevation = 100, type="VPD")

Pressure volume curves

moisture_pressureVolumeCurvePlot(x, segment="leaf", fraction="symplastic")

moisture_pressureVolumeCurvePlot(x, segment="leaf", fraction="apoplastic")

moisture_pressureVolumeCurvePlot(x, segment="stem", fraction="symplastic")

moisture_pressureVolumeCurvePlot(x, segment="stem", fraction="apoplastic")

Water balance for a single day

Running the model

Soil water balance simulations will normally span periods of several months or years, but since the model operates at a daily and subdaily temporal scales, it is possible to perform soil water balance for one day only. This is done using function spwb_day(). In the following code we select the same day as before from the meteorological input data and perform soil water balance for that day only:

sd1<-spwb_day(x, examplesoil, rownames(examplemeteo)[d],  
             examplemeteo$MinTemperature[d], examplemeteo$MaxTemperature[d], 
             examplemeteo$MinRelativeHumidity[d], examplemeteo$MaxRelativeHumidity[d], 
             examplemeteo$Radiation[d], examplemeteo$WindSpeed[d], 
             latitude = 41.82592, elevation = 100, 
             slope= 0, aspect = 0, prec = examplemeteo$Precipitation[d])

The output of spwb_day() is a list with several elements:

names(sd1)
##  [1] "cohorts"          "WaterBalance"     "EnergyBalance"    "Soil"            
##  [5] "Stand"            "Plants"           "RhizoPsi"         "SunlitLeaves"    
##  [9] "ShadeLeaves"      "ExtractionInst"   "PlantsInst"       "SunlitLeavesInst"
## [13] "ShadeLeavesInst"  "LightExtinction"  "WindExtinction"

Water balance output

Element WaterBalance contains the soil water balance flows of the day (precipitation, infiltration, transpiration, …)

sd1$WaterBalance
##                     PET                    Rain                    Snow 
##               5.0233468               0.0000000               0.0000000 
##                 NetRain                Snowmelt                   Runon 
##               0.0000000               0.0000000               0.0000000 
##            Infiltration                  Runoff            DeepDrainage 
##               0.0000000               0.0000000               0.0000000 
##         SoilEvaporation         PlantExtraction           Transpiration 
##               0.5000000               0.7427327               0.7427327 
## HydraulicRedistribution 
##               0.0000000

And Soil contains water evaporated from each soil layer, water transpired from each soil layer and the final soil water potential:

sd1$Soil
##   SoilEvaporation HydraulicInput HydraulicOutput PlantExtraction         psi
## 1    4.999998e-01              0       0.2436810       0.2436810 -0.03495676
## 2    1.529512e-07              0       0.4990517       0.4990517 -0.03367563

Soil and canopy energy balance

Element EnergyBalance contains subdaily variation in atmosphere, canopy and soil temperatures, as well as canopy and soil energy balance components.

names(sd1$EnergyBalance)
## [1] "Temperature"         "CanopyEnergyBalance" "SoilEnergyBalance"

Package medfate provides a plot function for objects of class spwb_day that can be used to inspect the results of the simulation. We use this function to display subdaily dynamics in plant, soil and canopy variables. For example, we can use it to display temperature variations (only the temperature of the topmost soil layer is drawn):

plot(sd1, type = "Temperature")

plot(sd1, type = "CanopyEnergyBalance")

plot(sd1, type = "SoilEnergyBalance")

Plant output

Element Plants contains output values by plant cohort. Several output variables can be inspected in this element.

sd1$Plants
##             LAI Extraction Transpiration GrossPhotosynthesis NetPhotosynthesis
## T1_54 0.8167012 0.18680692    0.18680692           1.6346975          1.524251
## T2_68 0.7977952 0.48882193    0.48882193           1.9038468          1.766434
## S1_65 0.0653033 0.06710387    0.06710387           0.1450806          0.130408
##          RootPsi    StemPsi      StemPLC LeafPsiMin  LeafPsiMax      dEdP
## T1_54 -0.4854113 -0.7178578 1.179459e-12 -1.0477214 -0.04656859 0.3964539
## T2_68 -0.4201719 -0.6018090 1.743165e-06 -0.9855217 -0.04663371 1.1125529
## S1_65 -0.4501776 -0.6046705 3.024621e-04 -1.0775720 -0.05217213 1.6339053
##               DDS   StemRWC   LeafRWC StemSympRWC LeafSympRWC  WaterBalance
## T1_54 0.058847069 0.9953953 0.9763595   0.9769767   0.9717894  2.656295e-18
## T2_68 0.018346864 0.9990103 0.9831357   0.9950586   0.9821476 -2.493665e-17
## S1_65 0.002897315 0.9988067 0.9822022   0.9952435   0.9776863  2.683400e-18

While Plants contains one value per cohort and variable that summarizes the whole simulated day, information by disaggregated by time step can be accessed in PlantsInst. Moreover, we can use function plot.spwb_day() to draw plots of sub-daily variation per species of plant transpiration per ground area (L·m\(^{-2}\)), transpiration per leaf area (also in L·m\(^{-2}\)), plant net photosynthesis (in g C·m\(^{-2}\)), and plant water potential (in MPa):

plot(sd1, type = "PlantTranspiration", bySpecies = T)

plot(sd1, type = "TranspirationPerLeaf", bySpecies = T)

plot(sd1, type = "NetPhotosynthesis", bySpecies = T)

plot(sd1, type = "LeafPsiAverage", bySpecies = T)

Output for sunlit and shade leaves

The model distinguishes between sunlit and shade leaves for stomatal regulation. Static properties of sunlit and shade leaves, for each cohort, can be accessed via:

sd1$SunlitLeaves
##              LAI  Vmax298   Jmax298 LeafPsiMin  LeafPsiMax         GW
## T1_54 0.39267054 48.58012 100.65801  -1.403281 -0.04656859 0.03162754
## T2_68 0.30498777 50.32556  98.82662  -1.668651 -0.04663371 0.06026471
## S1_65 0.01659467 70.01225 114.55776  -1.858994 -0.05217213 0.10959391
sd1$ShadeLeaves
##              LAI  Vmax298   Jmax298 LeafPsiMin  LeafPsiMax        GW
## T1_54 0.42403063 41.02069  84.99488 -0.8449378 -0.04656859 -99998.98
## T2_68 0.49280746 45.36770  89.09065 -0.6176509 -0.04663371 -99998.96
## S1_65 0.04870863 70.01225 114.55776 -0.8315427 -0.05217213 -99998.89

Instantaneous values are also stored for sunlit and shade leaves. We can also use the plot function for objects of class spwb_day to draw instantaneous variations in temperature for sunlit and shade leaves:

plot(sd1, type = "LeafTemperature", bySpecies=TRUE)

Note that sunlit leaves of some species reach temperatures higher than the canopy. We can also plot variations in instantaneous gross and net photosynthesis rates:

plot(sd1, type = "LeafGrossPhotosynthesis", bySpecies=TRUE)

plot(sd1, type = "LeafNetPhotosynthesis", bySpecies=TRUE)

Or variations in stomatal conductance:

plot(sd1, type = "LeafStomatalConductance", bySpecies=TRUE)

Or variations in vapour pressure deficit:

plot(sd1, type = "LeafVPD", bySpecies=TRUE)

Or variations in leaf water potential:

plot(sd1, type = "LeafPsi", bySpecies=TRUE)

plot(sd1, type = "LeafCi", bySpecies=TRUE)

plot(sd1, type = "LeafIntrinsicWUE", bySpecies=TRUE)

Water balance for multiple days

Running the model

Users will often use function spwb() to run the soil water balance model for several days. This function requires the spwbInput object, the soil object and the meteorological data frame. However, running spwb_day() modified the input objects. In particular, the soil moisture at the end of the simulation was:

examplesoil$W
## [1] 0.9884091 0.9957219

And the temperature of soil layers:

examplesoil$Temp
## [1] 9.978633 8.069908

We can also see the current state of canopy variables:

x$canopy
## $Temp
## [1] 6.390621

We simply use function resetInputs() to reset state variables to their default values, so that the new simulation is not affected by the end state of the previous simulation:

resetInputs(x, examplesoil)
examplesoil$W
## [1] 1 1
examplesoil$Temp
## [1] NA NA
x$canopy
## $Temp
## [1] 6.390621

Now we are ready to call function spwb(). In this example, we only simulate 61 days to save computational time:

S = spwb(x, examplesoil, examplemeteo[110:170,], latitude = 41.82592, elevation = 100)
## Initial soil water content (mm): 180.814
## Initial snowpack content (mm): 0
## Performing daily simulations .......done.
## Final soil water content (mm): 127.791
## Final snowpack content (mm): 0
## Change in soil water content (mm): -53.0227
## Soil water balance result (mm): -53.0227
## Change in snowpack water content (mm): 0
## Snowpack water balance result (mm): 0
## Water balance components:
##   Precipitation (mm) 36
##   Rain (mm) 26 Snow (mm) 10
##   Interception (mm) 6 Net rainfall (mm) 20
##   Infiltration (mm) 30 Runoff (mm) 0 Deep drainage (mm) 19
##   Soil evaporation (mm) 4 Transpiration (mm) 60
##   Plant extraction from soil (mm) 60  Plant water balance (mm) -0 Hydraulic redistribution (mm) 0

Function spwb() returns an object of class spwb. If we inspect its elements, we realize that the output is arranged differently than in spwb_day():

names(S)
##  [1] "latitude"      "topography"    "spwbInput"     "soilInput"    
##  [5] "WaterBalance"  "EnergyBalance" "Temperature"   "Soil"         
##  [9] "Stand"         "Plants"        "SunlitLeaves"  "ShadeLeaves"  
## [13] "subdaily"

In particular, element spwbInput contains a copy of the input parameters that were used to run the model:

names(S$spwbInput)
##  [1] "control"             "canopy"              "cohorts"            
##  [4] "above"               "below"               "belowLayers"        
##  [7] "paramsPhenology"     "paramsAnatomy"       "paramsInterception" 
## [10] "paramsTranspiration" "paramsWaterStorage"  "internalPhenology"  
## [13] "internalWater"

As before, WaterBalance contains water balance components, but in this case in form of a data frame with days in rows:

head(S$WaterBalance)
##                 PET Precipitation      Rain     Snow    NetRain  Snowmelt
## 2001-04-20 2.641801     2.1625135 0.0000000 2.162513 0.00000000 0.0000000
## 2001-04-21 1.875251     3.7992356 0.0000000 3.799236 0.00000000 0.0000000
## 2001-04-22 2.903129     4.1962782 0.0000000 4.196278 0.00000000 0.9488218
## 2001-04-23 3.633982     1.4698434 1.4698434 0.000000 0.60780639 9.2092055
## 2001-04-24 3.891957     0.1538991 0.1538991 0.000000 0.06364001 0.0000000
## 2001-04-25 4.171116     0.1317847 0.1317847 0.000000 0.05449531 0.0000000
##            Infiltration Runoff DeepDrainage Evapotranspiration Interception
## 2001-04-20   0.00000000      0    0.0000000          0.3617748   0.00000000
## 2001-04-21   0.00000000      0    0.0000000          0.3443605   0.00000000
## 2001-04-22   0.94882184      0    0.1925089          0.4274248   0.00000000
## 2001-04-23   9.81701186      0    7.4880088          1.8501180   0.86203705
## 2001-04-24   0.06364001      0    1.2985618          1.0149715   0.09025908
## 2001-04-25   0.05449531      0    0.0000000          1.1029712   0.07728938
##            SoilEvaporation PlantExtraction Transpiration
## 2001-04-20       0.0000000       0.3617748     0.3617748
## 2001-04-21       0.0000000       0.3443605     0.3443605
## 2001-04-22       0.0000000       0.4274248     0.4274248
## 2001-04-23       0.5000000       0.4880810     0.4880810
## 2001-04-24       0.1787971       0.7459154     0.7459154
## 2001-04-25       0.1190087       0.9066731     0.9066731
##            HydraulicRedistribution
## 2001-04-20            0.000000e+00
## 2001-04-21            0.000000e+00
## 2001-04-22            0.000000e+00
## 2001-04-23            7.227166e-04
## 2001-04-24            8.403783e-05
## 2001-04-25            0.000000e+00

Elements Plants is itself a list with several elements that contain daily output results by plant cohorts, for example leaf minimum (midday) water potentials are:

head(S$Plants$LeafPsiMin)
##                 T1_54      T2_68      S1_65
## 2001-04-20 -0.4633126 -0.4529725 -0.6642795
## 2001-04-21 -0.4393126 -0.4123707 -0.7136245
## 2001-04-22 -0.6062683 -0.6004999 -0.6862058
## 2001-04-23 -0.7462772 -0.6723673 -0.7199321
## 2001-04-24 -1.0220902 -0.8474271 -0.9472434
## 2001-04-25 -1.1914531 -0.9964572 -1.1010720

Plotting and summarizing results

Package medfate also provides a plot function for objects of class spwb. It can be used to show the meteorological input. Additionally, it can also be used to draw soil and plant variables. In the code below we draw water fluxes, soil water potentials, plant transpiration and plant (mid-day) water potential:

plot(S, type="Evapotranspiration")

plot(S, type="SoilPsi", bySpecies = TRUE)

plot(S, type="PlantTranspiration", bySpecies = TRUE)

plot(S, type="LeafPsiMin", bySpecies = TRUE)

While the simulation model uses daily steps, users may be interested in outputs at larger time scales. The package provides a summary for objects of class spwb. This function can be used to summarize the model’s output at different temporal steps (i.e. weekly, annual, …). For example, to obtain the average soil moisture and water potentials by months one can use:

summary(S, freq="months",FUN=mean, output="Soil")
##                  W.1       W.2     ML.1      ML.2    MLTot       WTD     SWE
## 2001-04-01 0.9820773 0.9930555 63.01086 115.84287 178.8537  997.7825 1.57577
## 2001-05-01 0.9291018 0.9406884 59.61191 109.73410 169.3460  999.0702 0.00000
## 2001-06-01 0.7740663 0.7703620 49.66471  89.86501 139.5297 1000.0000 0.00000
##            PlantExt.1 PlantExt.2 HydraulicInput.1 HydraulicInput.2       psi.1
## 2001-04-01  0.2083249  0.4291536     7.611931e-05                0 -0.03696234
## 2001-05-01  0.3123779  0.6486149     2.726384e-05                0 -0.05007007
## 2001-06-01  0.3853457  0.8144845     7.633831e-05                0 -0.11949987
##                  psi.2
## 2001-04-01 -0.03457436
## 2001-05-01 -0.04620826
## 2001-06-01 -0.11045013

Parameter output is used to indicate the element of the spwb object for which we desire summaries. Similarly, it is possible to calculate the average stress of plant cohorts by months:

summary(S, freq="months",FUN=mean, output="PlantStress")
##                 T1_54      T2_68       S1_65
## 2001-04-01 0.05231622 0.01505455 0.002225519
## 2001-05-01 0.07367799 0.02357702 0.004165031
## 2001-06-01 0.11307235 0.03670031 0.006379269

The summary function can be also used to aggregate the output by species. In this case, the values of plant cohorts belonging to the same species will be averaged using LAI values as weights. For example, we may average the daily drought stress across cohorts of the same species (here there is only one cohort by species, so this does not modify the output):

head(summary(S, freq="day", output="PlantStress", bySpecies = TRUE))
##            Pinus halepensis Quercus coccifera Quercus ilex
## 2001-04-20       0.03605580       0.001215380  0.007811625
## 2001-04-21       0.03723173       0.001802601  0.007748108
## 2001-04-22       0.03922423       0.001278679  0.010071293
## 2001-04-23       0.03959946       0.001030047  0.009985359
## 2001-04-24       0.05523427       0.002001836  0.015119216
## 2001-04-25       0.07211146       0.003194190  0.021429306

Or we can combine the aggregation by species with a temporal aggregation (here monthly averages):

summary(S, freq="month", FUN = mean, output="PlantStress", bySpecies = TRUE)
##            Pinus halepensis Quercus coccifera Quercus ilex
## 2001-04-01       0.05231622       0.002225519   0.01505455
## 2001-05-01       0.07367799       0.004165031   0.02357702
## 2001-06-01       0.11307235       0.006379269   0.03670031