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://emf-creaf.github.io/medfatebook/index.html.
Model inputs are explained in greater detail in vignette ‘Simulation inputs’. Here we only review the different steps required to run function spwb()
.
Soil information needs to be entered as a data frame
with soil layers in rows and physical attributes in columns. Soil physical attributes can be initialized to default values, for a given number of layers, using function defaultSoilParams()
:
= defaultSoilParams(2) spar
The soil input for water balance simulation is actually a list of class soil
that is created using a function with the same name:
= soil(spar) examplesoil
As explained in the package overview, models included in medfate
were primarily designed to be ran on forest inventory plots. Here we use the example object provided with the package:
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"
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
Finally, simulations in medfate
require a data frame with species parameter values, which we load using defaults for Catalonia (NE Spain):
data("SpParamsMED")
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()
:
= defaultControl("Sperry") control
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”). This is automatically done when calling function defaultControl()
with "Sperry"
as parameter input.
A last object is needed before calling simulation functions, called spwbInput
. It consists in the compilation of aboveground and belowground parameters and the specification of additional parameter values for each plant cohort. This is done by calling function spwbInput()
, but if one has a forest
object, the object can be generated more directly using function forest2spwbInput()
:
= forest2spwbInput(exampleforestMED, examplesoil, SpParamsMED, control) x
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):
$cohorts x
## SP Name
## T1_54 54 Pinus halepensis
## T2_68 68 Quercus ilex
## S1_65 65 Quercus coccifera
Element canopy
contains state variables within the canopy:
$canopy x
## zlow zmid zup Tair Cair VPair
## 1 0 50 100 NA 386 NA
## 2 100 150 200 NA 386 NA
## 3 200 250 300 NA 386 NA
## 4 300 350 400 NA 386 NA
## 5 400 450 500 NA 386 NA
## 6 500 550 600 NA 386 NA
## 7 600 650 700 NA 386 NA
## 8 700 750 800 NA 386 NA
## 9 800 850 900 NA 386 NA
## 10 900 950 1000 NA 386 NA
## 11 1000 1050 1100 NA 386 NA
## 12 1100 1150 1200 NA 386 NA
## 13 1200 1250 1300 NA 386 NA
## 14 1300 1350 1400 NA 386 NA
## 15 1400 1450 1500 NA 386 NA
## 16 1500 1550 1600 NA 386 NA
## 17 1600 1650 1700 NA 386 NA
## 18 1700 1750 1800 NA 386 NA
## 19 1800 1850 1900 NA 386 NA
## 20 1900 1950 2000 NA 386 NA
## 21 2000 2050 2100 NA 386 NA
## 22 2100 2150 2200 NA 386 NA
## 23 2200 2250 2300 NA 386 NA
## 24 2300 2350 2400 NA 386 NA
## 25 2400 2450 2500 NA 386 NA
## 26 2500 2550 2600 NA 386 NA
## 27 2600 2650 2700 NA 386 NA
## 28 2700 2750 2800 NA 386 NA
Canopy temperature, water vapour pressure and \(CO_2\) concentration are state variables needed for canopy energy balance. If the canopy energy balance assumes a single canopy layer, the same values will be assumed through the canopy. Variation of within-canopy state variables is modelled if a multi-canopy energy balance is used (see control parameter multiLayerBalance
).
As you may already known, element above
contains the aboveground structure data that we already know:
$above x
## H CR N LAI_live LAI_expanded LAI_dead
## T1_54 800 0.7150421 168.0000 0.81670117 0.81670117 0
## T2_68 660 0.6055642 384.0000 0.79779523 0.79779523 0
## S1_65 80 0.8032817 749.4923 0.04817502 0.04817502 0
Belowground parameters can be seen in below
:
$below x
## Z50 Z95 fineRootBiomass coarseRootSoilVolume
## T1_54 750 3000 1292.135 20.0000
## T2_68 750 3000 2769.406 20.5000
## S1_65 300 1500 1198.107 0.4375
and in belowLayers
:
$belowLayers x
## $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 spwbInput
object also includes cohort parameter values for several kinds of traits. For example, plant anatomy parameters are described in paramsAnatomy
:
$paramsAnatomy x
## 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 conduit2sapwood SRL RLD r635
## T1_54 0.7 0.925 3870 10 1.964226
## T2_68 0.7 0.700 3870 10 1.805872
## S1_65 0.7 0.700 3870 10 2.289452
Parameters related to plant transpiration and photosynthesis can be seen in paramsTranspiration
:
$paramsTranspiration x
## Gswmin Gswmax 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
:
$paramsWaterStorage x
## 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.
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.
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
.
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.
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:
= 100
d transp_stomatalRegulationPlot(x, examplemeteo, day = d, timestep=12,
latitude = 41.82592, elevation = 100, type="E")
transp_stomatalRegulationPlot(x, examplemeteo, day = d, timestep=12,
latitude = 41.82592, elevation = 100, type="An")
transp_stomatalRegulationPlot(x, examplemeteo, day = d, timestep=12,
latitude = 41.82592, elevation = 100, type="Gsw")
transp_stomatalRegulationPlot(x, examplemeteo, day = d, timestep=12,
latitude = 41.82592, elevation = 100, type="T")
transp_stomatalRegulationPlot(x, examplemeteo, day = d, timestep=12,
latitude = 41.82592, elevation = 100, type="VPD")
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")
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:
<-spwb_day(x, rownames(examplemeteo)[d],
sd1$MinTemperature[d], examplemeteo$MaxTemperature[d],
examplemeteo$MinRelativeHumidity[d], examplemeteo$MaxRelativeHumidity[d],
examplemeteo$Radiation[d], examplemeteo$WindSpeed[d],
examplemeteolatitude = 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" "LWRExtinction" "CanopyTurbulence"
Element WaterBalance
contains the soil water balance flows of the day (precipitation, infiltration, transpiration, …)
$WaterBalance sd1
## 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.7105549 0.7105549
## HydraulicRedistribution
## 0.0000000
And Soil
contains water evaporated from each soil layer, water transpired from each soil layer and the final soil water potential:
$Soil sd1
## SoilEvaporation HydraulicInput HydraulicOutput PlantExtraction psi
## 1 4.999998e-01 0 0.2269333 0.2269333 -0.03491133
## 2 1.529512e-07 0 0.4836216 0.4836216 -0.03365454
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"
## [4] "TemperatureLayers" "VaporPressureLayers"
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")
Element Plants
contains output values by plant cohort. Several output variables can be inspected in this element.
$Plants sd1
## LAI Extraction Transpiration GrossPhotosynthesis NetPhotosynthesis
## T1_54 0.81670117 0.18570955 0.18570955 1.6316944 1.52397412
## T2_68 0.79779523 0.47743593 0.47743593 1.8912016 1.76080451
## S1_65 0.04817502 0.04740944 0.04740944 0.1041818 0.09392334
## RootPsi StemPsi StemPLC LeafPsiMin LeafPsiMax dEdP
## T1_54 -0.4854113 -0.7178578 9.937190e-13 -1.0477214 -0.04656859 0.3966169
## T2_68 -0.4201719 -0.6018090 1.568463e-06 -0.9855217 -0.04663371 1.1133172
## S1_65 -0.4379612 -0.5879157 2.748895e-04 -1.0467467 -0.05217213 1.6343537
## DDS StemRWC LeafRWC StemSympRWC LeafSympRWC WaterBalance
## T1_54 0.058460002 0.9954216 0.9764944 0.9771082 0.9719504 8.077306e-18
## T2_68 0.017672510 0.9990308 0.9835556 0.9951601 0.9825340 -1.062518e-17
## S1_65 0.002623683 0.9988637 0.9829413 0.9954179 0.9785550 -5.421011e-20
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)
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:
$SunlitLeaves sd1
## LAI Vmax298 Jmax298 LeafPsiMin LeafPsiMax GSWMin
## T1_54 0.39267054 48.58012 100.65801 -1.403281 -0.04656859 0.002055530
## T2_68 0.30498777 50.32556 98.82662 -1.668651 -0.04663371 0.004753608
## S1_65 0.01249631 70.01225 114.55776 -1.700586 -0.05217213 0.010478568
## GSWMax TempMin TempMax
## T1_54 0.07383584 3.245560 12.51715
## T2_68 0.15429608 2.687039 19.09085
## S1_65 0.25019269 3.177896 16.14867
$ShadeLeaves sd1
## LAI Vmax298 Jmax298 LeafPsiMin LeafPsiMax GSWMin
## T1_54 0.42403063 41.02069 84.99488 -0.7942828 -0.04656859 0.002042967
## T2_68 0.49280746 45.36770 89.09065 -0.5724256 -0.04663371 0.004639902
## S1_65 0.03567871 70.01225 114.55776 -0.8008696 -0.05217213 0.010478568
## GSWMax TempMin TempMax
## T1_54 0.05657344 2.884079 11.54897
## T2_68 0.12441239 2.506224 11.00487
## S1_65 0.30527932 2.641953 11.06835
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)
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:
$soil$W x
## [1] 0.9886701 0.9958542
And the temperature of soil layers:
$soil$Temp x
## [1] 9.445066 7.738206
We can also see the current state of canopy variables:
$canopy x
## zlow zmid zup Tair Cair VPair
## 1 0 50 100 6.243896 386 0.5170718
## 2 100 150 200 6.243896 386 0.5170718
## 3 200 250 300 6.243896 386 0.5170718
## 4 300 350 400 6.243896 386 0.5170718
## 5 400 450 500 6.243896 386 0.5170718
## 6 500 550 600 6.243896 386 0.5170718
## 7 600 650 700 6.243896 386 0.5170718
## 8 700 750 800 6.243896 386 0.5170718
## 9 800 850 900 6.243896 386 0.5170718
## 10 900 950 1000 6.243896 386 0.5170718
## 11 1000 1050 1100 6.243896 386 0.5170718
## 12 1100 1150 1200 6.243896 386 0.5170718
## 13 1200 1250 1300 6.243896 386 0.5170718
## 14 1300 1350 1400 6.243896 386 0.5170718
## 15 1400 1450 1500 6.243896 386 0.5170718
## 16 1500 1550 1600 6.243896 386 0.5170718
## 17 1600 1650 1700 6.243896 386 0.5170718
## 18 1700 1750 1800 6.243896 386 0.5170718
## 19 1800 1850 1900 6.243896 386 0.5170718
## 20 1900 1950 2000 6.243896 386 0.5170718
## 21 2000 2050 2100 6.243896 386 0.5170718
## 22 2100 2150 2200 6.243896 386 0.5170718
## 23 2200 2250 2300 6.243896 386 0.5170718
## 24 2300 2350 2400 6.243896 386 0.5170718
## 25 2400 2450 2500 6.243896 386 0.5170718
## 26 2500 2550 2600 6.243896 386 0.5170718
## 27 2600 2650 2700 6.243896 386 0.5170718
## 28 2700 2750 2800 6.243896 386 0.5170718
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)
$soil$W x
## [1] 1 1
$soil$Temp x
## [1] NA NA
$canopy x
## zlow zmid zup Tair Cair VPair
## 1 0 50 100 NA 386 NA
## 2 100 150 200 NA 386 NA
## 3 200 250 300 NA 386 NA
## 4 300 350 400 NA 386 NA
## 5 400 450 500 NA 386 NA
## 6 500 550 600 NA 386 NA
## 7 600 650 700 NA 386 NA
## 8 700 750 800 NA 386 NA
## 9 800 850 900 NA 386 NA
## 10 900 950 1000 NA 386 NA
## 11 1000 1050 1100 NA 386 NA
## 12 1100 1150 1200 NA 386 NA
## 13 1200 1250 1300 NA 386 NA
## 14 1300 1350 1400 NA 386 NA
## 15 1400 1450 1500 NA 386 NA
## 16 1500 1550 1600 NA 386 NA
## 17 1600 1650 1700 NA 386 NA
## 18 1700 1750 1800 NA 386 NA
## 19 1800 1850 1900 NA 386 NA
## 20 1900 1950 2000 NA 386 NA
## 21 2000 2050 2100 NA 386 NA
## 22 2100 2150 2200 NA 386 NA
## 23 2200 2250 2300 NA 386 NA
## 24 2300 2350 2400 NA 386 NA
## 25 2400 2450 2500 NA 386 NA
## 26 2500 2550 2600 NA 386 NA
## 27 2600 2650 2700 NA 386 NA
## 28 2700 2750 2800 NA 386 NA
Now we are ready to call function spwb()
. In this example, we only simulate 61 days to save computational time:
= spwb(x, examplemeteo[110:170,], latitude = 41.82592, elevation = 100) S
## Initial soil water content (mm): 180.814
## Initial snowpack content (mm): 0
## Performing daily simulations
## Year 2001:......done.
## Final soil water content (mm): 130.643
## Final snowpack content (mm): 0
## Change in soil water content (mm): -50.1704
## Soil water balance result (mm): -50.1704
## 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) 56
## Plant extraction from soil (mm) 56 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"
## [4] "WaterBalance" "EnergyBalance" "Temperature"
## [7] "TemperatureLayers" "Soil" "Stand"
## [10] "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" "soil" "canopy"
## [4] "cohorts" "above" "below"
## [7] "belowLayers" "paramsPhenology" "paramsAnatomy"
## [10] "paramsInterception" "paramsTranspiration" "paramsWaterStorage"
## [13] "internalPhenology" "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.9743992
## 2001-04-23 3.633982 1.4698434 1.4698434 0.000000 0.61355932 9.1836281
## 2001-04-24 3.891957 0.1538991 0.1538991 0.000000 0.06424237 0.0000000
## 2001-04-25 4.171116 0.1317847 0.1317847 0.000000 0.05501111 0.0000000
## Infiltration Runoff DeepDrainage Evapotranspiration Interception
## 2001-04-20 0.00000000 0 0.0000000 0.3439143 0.00000000
## 2001-04-21 0.00000000 0 0.0000000 0.3326714 0.00000000
## 2001-04-22 0.97439921 0 0.2362379 0.4092011 0.00000000
## 2001-04-23 9.79718742 0 7.4957804 1.8073721 0.85628412
## 2001-04-24 0.06424237 0 1.3172083 0.9517376 0.08965673
## 2001-04-25 0.05501111 0 0.0000000 1.0651217 0.07677357
## SoilEvaporation PlantExtraction Transpiration
## 2001-04-20 0.0000000 0.3439143 0.3439143
## 2001-04-21 0.0000000 0.3326714 0.3326714
## 2001-04-22 0.0000000 0.4092011 0.4092011
## 2001-04-23 0.5000000 0.4510880 0.4510880
## 2001-04-24 0.1825183 0.6795626 0.6795626
## 2001-04-25 0.1234042 0.8649439 0.8649439
## HydraulicRedistribution
## 2001-04-20 0.0000000000
## 2001-04-21 0.0000000000
## 2001-04-22 0.0000000000
## 2001-04-23 0.0007097401
## 2001-04-24 0.0002608162
## 2001-04-25 0.0000000000
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.4128029 -0.4529725 -0.7035846
## 2001-04-21 -0.4392954 -0.4123552 -0.7136055
## 2001-04-22 -0.5556731 -0.5502508 -0.6862007
## 2001-04-23 -0.7462753 -0.6723655 -0.6887720
## 2001-04-24 -0.9713620 -0.8058627 -0.9194939
## 2001-04-25 -1.1406034 -0.9963778 -1.0415017
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.9829044 0.9936297 63.06393 115.90986 178.9738 997.7506 1.573445
## 2001-05-01 0.9335450 0.9442024 59.89699 110.14401 170.0410 999.0110 0.000000
## 2001-06-01 0.7893390 0.7817614 50.64462 91.19479 141.8394 1000.0000 0.000000
## PlantExt.1 PlantExt.2 HydraulicInput.1 HydraulicInput.2 psi.1
## 2001-04-01 0.1896593 0.4061543 9.069265e-05 0 -0.03675537
## 2001-05-01 0.2857484 0.6152679 2.847453e-05 0 -0.04857017
## 2001-06-01 0.3615237 0.7804961 1.062982e-05 0 -0.10820605
## psi.2
## 2001-04-01 -0.03444799
## 2001-05-01 -0.04522381
## 2001-06-01 -0.10327764
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.05068688 0.01416438 0.002015303
## 2001-05-01 0.07112035 0.02216089 0.003730681
## 2001-06-01 0.10811119 0.03452195 0.005805447
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.03498542 0.0013953094 0.007565403
## 2001-04-21 0.03722678 0.0018024791 0.007746996
## 2001-04-22 0.03857803 0.0012447156 0.009861354
## 2001-04-23 0.03793887 0.0008845961 0.009354063
## 2001-04-24 0.05226359 0.0017991112 0.013680107
## 2001-04-25 0.07033384 0.0029797918 0.020741876
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.05068688 0.002015303 0.01416438
## 2001-05-01 0.07112035 0.003730681 0.02216089
## 2001-06-01 0.10811119 0.005805447 0.03452195