The following document provides a full code documentation of the
mrwater
library including a range of arguments that can be
varied to produce cellular pre-processed water-related outputs. The
fullWATER.R
gives an overview of functions generating the
main model outputs. It can be executed with the function call
madrat:::retrieveData(WATER)
that will generate a .tgz file
with all relevant outputs.
The mrwater
library relies on a range of input data.
Open-source data is directly downloaded and imported via
downloadSource
and readSource
functions that
are part of the madrat
library. Data that is not openly
available needs to be stored in a specific folder structure
(inputdata/sources/DataSource
) where the respective
DataSource folder must have the same name as the readSource
function (e.g. readRamankutty refers to the inputdata/sources/Ramankutty
folder). The read functions of this library and the underlying libraries
necessary to run the code
(e.g. mrwater:::readIrrigationSystem
;
mrcommons:::readFAO
; mrland:::readZabel2014
)
access this folder to include the required data.
The mrwater library can be used to generate stand-alone spatially explicit irrigation potentials (irrigation water potentials (withdrawals and consumption) and irrigation area potentials) and (aggregated) input data for land-system models. Potential aggregation units are spatial clusters (based on bio-physical similarity of grid cells), country- or basin-scale.
Furthermore, its outputs are a useful disaggregation tool for land-system model outputs. For example irrigation water withdrawals from land-use models such as MAgPIE can be disaggregated to a 0.5-degree spatial resolution using spatially explicit irrigation potentials.
It is designed as hydrological input data processing tool for the global land-use model MAgPIE (Model of Agricultural Production and its Impact on the Environment). Nevertheless, it is applicable for other land-system models and its spatially explicit as well as aggregated outputs can be used for a variety of land-system models (e.g. CGEs, PEs, etc.).
Note: To return spatially explicit function outputs, the
madrat:::calcOutput()
function call must include the
argument aggregate = FALSE
. For aggregation, a mapping is
required.
In this version of the mrwater library, all hydrological input data is provided by the process-based hydrology-vegetation model LPJmL. Data that is based on natural vegetation runs is provided by LPJmL4. Data that includes management is based on LPJmL5.
The river routing consists of several functions. The first iteration
determines naturalized discharge based on yearly runoff and lake
evaporation using the STN river structure
(rs <- readRDS(system.file("extdata/riverstructure_stn_coord.rds", package = "mrwater"))
)
that determines the flow direction and basin attribution of the 67420
grid cells of the underlying land mask. The function returns natural
discharge and lake evaporation that are required for further
calculations in the river routing routine.
natQ <- calcOutput("RiverNaturalFlows", selectyears = 2010,
climatetype = "GFDL-ESM4:ssp126",
lpjml = c(natveg = "LPJmL4_for_MAgPIE_44ac93de",
crop = "ggcmi_phase3_nchecks_9ca735cb"), aggregate = FALSE)[, , "discharge_nat"]
The required arguments are selectyears
(determining the
year(s) for which the output shall be generated),
climatetype
(selecting the GCM data and scenario underlying
the process-based vegetation model), and lpjml
(selecting
the LPJmL model versions used for natural vegetation
(natveg
) input data and management (crop
)
input data)
Environmental flow requirements (EFRs) and accessible discharge are
also calculated based on hydrological LPJmL data only. Both are based on
monthly discharge. The calculation method and strictness of EFR can be
selected via the efrMethod
argument (e.g. “Smakhtin:good”,
“VMF:fair”). Inaccessible discharge is based on the assumption that the
higher the long-term seasonal variability of discharge is, the harder it
is to access the water by humans and bring it into productive use.
Different accessibility rules can be selected via the
accessibilityrule
argument (e.g. “CV:2” stands for the
coefficient of variation approach to a base of 2; “Q:75” stands for a
quantile approach where discharge that exceeds the 75th quantile is
inaccessible to humans).
selectyears <- 2010
lpjml <- c(natveg = "LPJmL4_for_MAgPIE_44ac93de", crop = "ggcmi_phase3_nchecks_bft_6277d36e")
climatetype <- "GFDL-ESM4:ssp126"
efr <- calcOutput("EnvmtlFlowRequirements", efrMethod = "VMF:fair",
selectyears = selectyears, climatetype = climatetype, lpjml = lpjml,
aggregate = FALSE)[, , "EFR"]
inaccessibleQ <- calcOutput("DischargeInaccessible", accessibilityrule = "CV:2",
selectyears = selectyears, climatetype = climatetype, lpjml = lpjml,
aggregate = FALSE)
efrMethod <- "VMF:fair"
accessibilityrule <- "CV:2"
Note: The integration of alternative biophysical and hydrological input data is possible.
Human water abstractions are considered in consecutive river routing iterations that reserve the respective water abstraction and update cellular discharge respectively. They are determined through the following function call:
humanQ <- calcOutput("RiverDischargeNatAndHuman", iniyear = 2010, comAg = TRUE,
selectyears = selectyears, multicropping = FALSE,
climatetype = climatetype, lpjml = lpjml,
efrMethod = efrMethod, aggregate = FALSE)
iniyear <- 2010
comAg <- TRUE
Non-agricultural water abstractions as provided by ISIMIP (and for
future scenarios WATERGAP) have priority over agricultural water
abstractions. They are determined through the function call
calcOutput("RiverHumanUses", humanuse = "non_agriculture", ...)
and report reserved non-agricultural water consumption (“currHuman_wc”)
and withdrawal (“currHuman_ww”).
Taking so-called “committed agricultural uses”, i.e. reserving water
abstractions of currently irrigated areas, into account is optional (it
can be activated via the com_ag
argument). In case of an
activation of committed agricultural uses, the required consumption and
withdrawal for currently irrigated areas as determined in
calcOutput("WaterUseCommittedAg", ...)
are reserved in
addition to non-agricultural water abstractions via the function call
calcOutput("RiverHumanUses", humanuse = "committed_agriculture", ..., iniyear = 2010)
.
The argument iniyear
determines the chosen cellular
irrigated crop mix (i.e. the crop mix as reported by FAOSTAT for the
year 2010 on cellular cropland as reported by LUH2). Cellular irrigated
areas for specific years are provided via
calcOutput("Croparea", years = iniyear, sectoral = "kcr", physical = TRUE, cells = "lpjcell", cellular = TRUE, irrigation = TRUE, aggregate = FALSE)
through combining (irrigated and rainfed) cropland area provided by LUH2
and country-level FAO crop production data. Note that areas reported as
irrigated depreciate at a rate of 10 percent per annum for future time
steps (years after iniyear
).
Compared to the previous section, this section requires additional
input data: ISIMIP non-agricultural water abstraction data (for the
historical time period and fixed at this level for the future), WATERGAP
non-agricultural water abstraction data (for future scenarios), LPJmL5
crop water requirements, country level irrigation system shares as
provided by Jägermeyr (2015), LUH2 cellular cropland area (see also:
mrcommons:::calcLUH2v2
), and FAO country-level
crop-specific production data (see also:
mrcommons:::readFAO_online
).
Spatial-explicit land-use and irrigation area data provided by LUH2
(see also mrcommons:::calcLUH2v2
). Since the LUH2 cropland
map is subdivided into only five crop functional types (C3 annuals; C4
annuals; C3 perennials; C4 perennials; C3 nitrogen fixers), we use the
spatial distribution of LUH2 and FAOSTAT information on total
country-level crop-specific production to derive spatially-explicit
crop-specific areas (see mrcommons:::calcCroparea
). The
country-level FAOSTAT cropmix is distributed equally across physical
cropland of the respective country while maintaining the spatially
explicit cropland area distribution as provided by LUH2. The
distribution of rice area is derived more explicitly. LUH2 provides
cellular flooded area shares and only rice is flooded according to the
data set. The distribution of physical rice areas is therefore
determined by assigning the country’s rice production to flooded areas
provided at cellular level by LUH2. Aerobic (non-paddy) rice is
accounted by distributing country-level FAO rice areas beyond
country-aggregated LUH2 flooded area (i.e. where FAO reports higher
country-level rice areas than there are LUH2 flooded areas in the
respective country) equally across the remaining country’s cropland
area. Note that flooded areas are not accounted as irrigated areas. For
one, because flooded rice production is often only partially irrigated
and also because it fulfills a special management purpose in terms of
pest control.
croparea <- calcOutput("Croparea", years = iniyear, sectoral = "kcr",
physical = TRUE, cells = "lpjcell", cellular = TRUE, irrigation = TRUE, aggregate = FALSE)
The physical
argument determines accounts for the
cropping intensity in that physical = TRUE
returns cropland
areas that match physical area. With physical = FALSE
croparea can exceed physical land area, due to multicropping.
Finally, the function
calcRiverSurplusDischargeAllocation
determines the
allocation of “surplus discharge”, i.e. the discharge of the estuary
cell that is not (yet) consumed along the river in the last iteration of
the previous river routings that reserved environmental and human water
uses. The function returns the water that is potentially available for
irrigation considering biophysical, economic and management
constraints.
iwp <- calcOutput("RiverDischargeAllocation", output = "potIrrigWat",
selectyears = selectyears, climatetype = climatetype, lpjml = lpjml,
efrMethod = efrMethod, accessibilityrule = accessibilityrule,
iniyear = iniyear, com_ag = com_ag,
allocationrule = "optimization",
rankmethod = "USD_ha:TRUE", yieldcalib = TRUE, cropmix = "hist_total",
thresholdtype = "USD_ha", gainthreshold = 500,
landScen = "potCropland:HalfEarth",
irrigationsystem = "initialization", multicropping = FALSE, aggregate = FALSE)
The mrwater
library includes different surplus discharge
allocation rules representing different management strategies
(“upstreamfirst” vs. “optimization”) that can be set in the
allocationrule
argument. The upstreamfirst algorithm allows
irrigation water abstractions provided that there is sufficient local
discharge available and a positive yield gain through irrigation
reserving these irrigation water abstractions in upstream grid cells
first following the calculation order of cells from upstream to
downstream (for more details on the river structure and calculation
order see riverstructure.Rmd
). The optimization algorithm
ranks grid cells according to their yield value gain through irrigation
allocating available local discharge to the grid cell with the highest
productivity first, such that water resources are made available at the
most efficient location rather than upstream before downstream.
The yield value gain can be expressed in USD per hectare irrigated
area or USD per cubic meter of irrigation water set via the
unit
argument in
calcIrrigYieldImprovementPotential
and via the
rankmethod
argument in
calcRiverSurplusDischargeAllocation
. The
rankmethod
argument consists of two components: the unit
selections (“USD_ha” or “USD_m3”) and a boolean determining whether grid
cells are ranked according to their full yield gain potential (TRUE) or
taking a two step approach ranking according to their 75% potential and
their full potential allocating 50% of irrigation water requirements in
each of the two iterations (FALSE) separated by a “:”.
The yield gain through irrigation - as calculated from LPJmL5
irrigated and rainfed yields - is valued with global average crop prices
as provided by FAOSTAT (see
mrcommons:::calcOutput("IniFoodPrice", datasource = "FAO", products = "kcr", years = NULL, year = iniyear, aggregate = FALSE))
.
Depending on the modeling application, LPJmL irrigated and rainfed
crop yields can be calibrated to meet FAO crop yields via the
yieldcalib
argument. The cropmix
argument
determines the selection of crops (“hist_total” refers to the cellular
cropmix as determined in calcCroparea
considering irrigated
and rainfed areas, “hist_irrig” refers to cellular cropmix as determined
in calcCroparea
considering only irrigated areas. Besides
these crop mixes, a selection of one or several proxycrop(s) can be
selected. This setting is relevant when calculating irrigation
potentials for the future).
yieldGain <- calcOutput("IrrigYieldImprovementPotential", unit = "USD_ha:GLO",
selectyears = selectyears,
climatetype = climatetype, lpjml = lpjml,
iniyear = iniyear,
cropmix = "hist_total", yieldcalib = TRUE,
multicropping = FALSE, aggregate = FALSE)
To represent economic aspects of irrigation, different yield value
gain thresholds can be chosen to calculate the respective IWP. It is set
via the arguments thresholdtype
and
gainthreshold
. The chosen valuation method is determined
via the unit argument that determines whether water or irrigation area
is valued (USD_ha or USD_m3) and whether global average prices (GLO) or
country-level agricultural prices (ISO) are used.
Please refrain from using the multicropping = TRUE
argument. This implementation is still work-in-progress and will be
updated soon.
The irrigation potentials can be calculated for various scenarios of
potential cropland cover that are set via the landScen
argument. It consists of two parts: (1) the potentially available land
component where currently irrigated area (currIrrig), current cropland
area (currCropland) or potential cropland area (potCropland) can be
selected, and (2) a protection component that selects which land areas
shall be protected, i.e. no irrigation taking place in these areas.
Possible selections are: WDPA, BH, FF, CPD, LW, BH_IFL, HalfEarth. For
example landScen = "currCropland:NA"
selects current
cropland extent as of the year set in iniyear without land protection;
landScen = "potIrrig:HalfEarth"
is potential cropland while
respecting a Half Earth land protection scenario.
The calcIrrigatableArea
function translates potential
irrigation water (PIW) into potentially irrigated areas (PIA) and
returns the area that can potentially be irrigated given the assumptions
that are set via the arguments.
allocationrule <- "optimization"
rankmethod <- "USD_ha:TRUE"
yieldcalib <- TRUE
cropmix <- "hist_total"
thresholdtype <- "USD_ha"
gainthreshold <- 500
landScen <- "potCropland:HalfEarth"
irrigationsystem <- "initialization"
multicropping <- FALSE
iap <- calcOutput("PotIrrigAreas", selectyears = selectyears, iniyear = iniyear,
lpjml = lpjml, climatetype = climatetype,
efrMethod = efrMethod, accessibilityrule = accessibilityrule,
rankmethod = rankmethod, yieldcalib = yieldcalib, allocationrule = allocationrule,
thresholdtype = thresholdtype, gainthreshold = gainthreshold,
irrigationsystem = irrigationsystem, landScen = landScen,
cropmix = cropmix, com_ag = com_ag,
potential_wat = TRUE, multicropping = FALSE, aggregate = FALSE)
For a representation of irrigation potentials at various irrigation yield value gains, the river routing routine has to be executed for varying irrigation yield value gain thresholds. The generated data can be used to create PIA curves and/or aggregated to different scales (e.g. country-, basin-scale).
iad <- calcOutput("EconOfIrrig", scenario = "ssp2", output = "IrrigArea",
gtrange = c(0, 250, 500, 1000, 2000, 3000), selectyears = 2010, iniyear = 2010,
lpjml = lpjml, climatetype = climatetype, efrMethod = efrMethod, accessibilityrule = accessibilityrule,
rankmethod = rankmethod, yieldcalib = yieldcalib, transDist = transDist,
allocationrule = allocationrule, thresholdtype = thresholdtype,
irrigationsystem = irrigationsystem, landScen = landScen, cropmix = cropmix,
potential_wat = TRUE, com_ag = FALSE, multicropping = FALSE, aggregate = FALSE)