#' Reporting for the coupled EDGE-T Transport Sector Model (REMIND Module edge_esm)
#'
#' Data is loaded from the EDGE-T subfolder in the output folder.
#' The input files can be (re-) generated calling
#' `Rscript EDGETransport.R --reporting`
#' from the output folder.
#'
#' *Warning* The function modifies the "REMIND_generic_<scenario>.mif" file by appending the
#' additional reporting variables and replaces the "_withoutPlus" version.
#'
#' Region subsets are obtained from fulldata.gdx
#'
#' @param output_folder path to the output folder, default is current folder.
#' @param remind_root path to the REMIND root directory, defaults to two levels up from output_folder.
#' @author Alois Dirnaichner
#'
#' @importFrom rmndt approx_dt
#' @importFrom data.table fread fwrite rbindlist
#' @export
reportEDGETransport <- function(output_folder=".",
remind_root=NULL) {
if(is.null(remind_root)){
remind_root <- file.path(output_folder, "../..")
}
gdx <- file.path(output_folder, "fulldata.gdx")
regionSubsetList <- toolRegionSubsets(gdx)
sub_folder = "EDGE-T/"
## NULL Definitons for codeCheck compliance
RegionCode <- CountryCode <- cfg <- `.` <- sector <- subsector_L3 <- region <- year <- NULL
subsector_L2 <- subsector_L1 <- aggr_mode <- vehicle_type <- det_veh <- aggr_nonmot <- NULL
demand_F <- demand_EJ <- remind_rep <- V25 <- aggr_veh <- technology <- NULL
load(file.path(output_folder, "config.Rdata"))
datapath <- function(fname){
file.path(output_folder, sub_folder, fname)
}
REMIND2ISO_MAPPING <- fread(file.path(remind_root, cfg$regionmapping))[, .(iso = CountryCode, region = RegionCode)]
## load input data from last EDGE run
demand_km <- readRDS(datapath(fname = "demandF_plot_pkm.RDS")) ## detailed energy services demand, million km
demand_ej <- readRDS(datapath(fname = "demandF_plot_EJ.RDS")) ## detailed final energy demand, EJ
name_mif = list.files(output_folder, pattern = "REMIND_generic", full.names = F)
name_mif = file.path(output_folder, name_mif[!grepl("withoutPlu", name_mif)])
stopifnot(typeof(name_mif) == "character")
miffile <- fread(name_mif, sep=";", header=T)
## ES Demand
reportingESandFE <- function(datatable, mode){
## datatable <- datatable[, c("sector", "subsector_L3", "subsector_L2", "subsector_L1", "vehicle_type", "technology", "iso", "year", "demand_F")]
datatable[, sector := ifelse(sector %in% c("trn_pass", "trn_aviation_intl"), "Pass", "Freight")]
## attribute aggregated mode and vehicle names for plotting purposes, and aggregate
## Large Categories (as used by REMIND)
datatable[subsector_L2 == "trn_pass_road_LDV",
aggr_mode := "Pass|Road|LDV"]
datatable[subsector_L2 != "trn_pass_road_LDV" & sector == "Pass",
aggr_mode := "Pass|non-LDV"]
## Freight is already in the "normal" reporting
## datatable[is.na(aggr_mode), aggr_mode := "Freight"]
## A little more detail: Vehicle Aggregates
datatable[grepl("^Truck", vehicle_type), aggr_veh := "Freight|Road"]
datatable["Freight Rail_tmp_vehicletype" == vehicle_type, aggr_veh := "Freight|Rail"]
## there seem to be no passenger ships in EDGE-T!
datatable[grepl("Ship", subsector_L3), aggr_veh := "Freight|Shipping"]
datatable[grepl("bus|Bus", vehicle_type), aggr_veh := "Pass|Road|Bus"]
if(mode == "ES")
datatable[grepl("Cycle|Walk", subsector_L3), aggr_nonmot := "Pass|Road|Non-Motorized"]
## Rail & Aviation
datatable[grepl("Passenger Rail|HSR", vehicle_type), aggr_veh := "Pass|Rail"]
datatable[grepl("Aviation", subsector_L3), aggr_veh := "Pass|Aviation"]
## High Detail: Ecoinvent-Compatible Output
datatable[grepl("Compact|Subcompact", vehicle_type),
det_veh := "Pass|Road|LDV|Small"]
datatable[grepl("Mini|Three-Wheeler", vehicle_type),
det_veh := "Pass|Road|LDV|Mini"]
datatable[vehicle_type == "Midsize Car", det_veh := "Pass|Road|LDV|Medium"]
datatable[vehicle_type == "Large Car", det_veh := "Pass|Road|LDV|Large"]
datatable[grepl("SUV", vehicle_type),
det_veh := "Pass|Road|LDV|SUV"]
datatable[grepl("Van|Multipurpose", vehicle_type),
det_veh := "Pass|Road|LDV|Van"]
datatable[grepl("Motorcycle|Scooter|Moped", vehicle_type),
det_veh := "Pass|Road|LDV|Two-Wheelers"]
datatable = datatable[REMIND2ISO_MAPPING, on = "iso"]
prepare4MIF <- function(dt, remind_unit, valcol, varcol){
## REMIND years, loading from MIF File would take too long
yrs <- c(seq(2005, 2060, 5), seq(2070, 2110, 10), 2130, 2150)
remind_scenario <- cfg$title
prefix <- ifelse(mode == "ES", "ES|Transport|", "FE|Transport|")
## we only care for non-NA variables (NA is basically *all others*)
toadd = dt[!is.na(get(varcol)), .(model="REMIND", scenario=remind_scenario, region,
variable=paste0(prefix, get(varcol)),
unit=remind_unit, period=year,
value=get(valcol))]
toadd <- approx_dt(toadd, yrs, xcol="period", ycol = "value",
idxcols=colnames(toadd)[1:5],
extrapolate=T)
return(toadd)
}
if(mode == "ES"){
report <- rbindlist(list(
prepare4MIF(
datatable[sector == "Pass", sum(demand_F, na.rm=T),
by = c("region", "year", "aggr_mode")],
"bn pkm/yr", "V1", "aggr_mode"),
prepare4MIF(
datatable[sector == "Freight" & !is.na(aggr_veh), sum(demand_F, na.rm=T),
by = c("region", "year", "aggr_veh")],
"bn tkm/yr", "V1", "aggr_veh"),
prepare4MIF(
datatable[sector == "Pass" & !is.na(aggr_veh), sum(demand_F, na.rm=T),
by = c("region", "year", "aggr_veh")],
"bn pkm/yr", "V1", "aggr_veh"),
prepare4MIF(
datatable[!is.na(aggr_nonmot), sum(demand_F, na.rm=T),
by = c("region", "year", "aggr_nonmot")],
"bn pkm/yr", "V1", "aggr_nonmot"),
prepare4MIF(
datatable[!is.na(det_veh), sum(demand_F, na.rm=T),
by = c("region", "year", "det_veh")], "bn pkm/yr", "V1", "det_veh")))
}else{
report <- rbindlist(list(
prepare4MIF(
datatable[!is.na(aggr_mode), sum(demand_EJ, na.rm=T),
by = c("region", "year", "aggr_mode")],
"EJ/yr", "V1", "aggr_mode"),
prepare4MIF(
datatable[!is.na(aggr_veh), sum(demand_EJ, na.rm=T),
by = c("region", "year", "aggr_veh")],
"EJ/yr", "V1", "aggr_veh"),
prepare4MIF(
datatable[!is.na(det_veh), sum(demand_EJ, na.rm=T),
by = c("region", "year", "det_veh")],
"EJ/yr", "V1", "det_veh")))
}
## with energy carrier
## remove cycling and walking placeholder techs for ESs
techmap <- data.table(technology=unique(datatable$technology),
key="technology")[!c("Cycle_tmp_technology", "Walk_tmp_technology")]
if(mode == "ES"){
## for energy services, it is better to refer to the actual technologies
## and not the fuel types (-> LCA)
techmap[, remind_rep := technology]
techmap["LA-BEV", remind_rep := "BEV"]
techmap["NG", remind_rep := "Gases"]
datatable <- datatable[techmap, on="technology"]
report_tech <- rbindlist(list(
prepare4MIF(
datatable[sector == "Pass", sum(demand_F, na.rm=T),
by = c("region", "year", "aggr_mode", "remind_rep")
][, aggr_mode := paste0(aggr_mode, "|", remind_rep)],
"bn pkm/yr", "V1", "aggr_mode"),
prepare4MIF(
datatable[sector == "Freight" & !is.na(aggr_veh), sum(demand_F, na.rm=T),
by = c("region", "year", "aggr_veh", "remind_rep")
][, aggr_veh := paste0(aggr_veh, "|", remind_rep)],
"bn tkm/yr", "V1", "aggr_veh"),
prepare4MIF(
datatable[sector == "Pass" & !is.na(aggr_veh), sum(demand_F, na.rm=T),
by = c("region", "year", "aggr_veh", "remind_rep")
][, aggr_veh := paste0(aggr_veh, "|", remind_rep)],
"bn pkm/yr", "V1", "aggr_veh"),
prepare4MIF(datatable[!is.na(det_veh), sum(demand_F, na.rm=T),
by = c("region", "year", "det_veh", "remind_rep")
][, det_veh := paste0(det_veh, "|", remind_rep)],
"bn pkm/yr", "V1", "det_veh")))
}else{
techmap["BEV", remind_rep := "Electricity"]
techmap["Electric", remind_rep := "Electricity"]
techmap["LA-BEV", remind_rep := "Electricity"]
techmap["FCEV", remind_rep := "Hydrogen"]
techmap["Liquids", remind_rep := "Liquids"]
techmap["Hybrid Liquids", remind_rep := "Liquids"]
techmap["NG", remind_rep := "Gases"]
datatable <- datatable[techmap, on="technology"]
report_tech <- rbindlist(list(
prepare4MIF(
datatable[!is.na(aggr_mode), sum(demand_EJ, na.rm=T),
by = c("region", "year", "aggr_mode", "remind_rep")
][, aggr_mode := paste0(aggr_mode, "|", remind_rep)],
"EJ/yr", "V1", "aggr_mode"),
prepare4MIF(
datatable[!is.na(aggr_veh), sum(demand_EJ, na.rm=T),
by = c("region", "year", "aggr_veh", "remind_rep")
][, aggr_veh := paste0(aggr_veh, "|", remind_rep)],
"EJ/yr", "V1", "aggr_veh"),
prepare4MIF(
datatable[!is.na(det_veh), sum(demand_EJ, na.rm=T),
by = c("region", "year", "det_veh", "remind_rep")
][, det_veh := paste0(det_veh, "|", remind_rep)],
"EJ/yr", "V1", "det_veh")))
}
return(rbindlist(list(report, report_tech)))
}
toMIF <- rbindlist(list(
reportingESandFE(demand_km, "ES"),
reportingESandFE(demand_ej, "FE")
))
if(!is.null(regionSubsetList)){
toMIF <- toMIF[region %in% regionSubsetList]
}
## Make sure there are no duplicates!
idx <- anyDuplicated(toMIF, by = c("region", "variable", "period"))
if(idx){
warning(paste0("Duplicates found in EDGE-T reporting output:",
capture.output(toMIF[idx]), collapse="\n"))
}
toMIF <- data.table::dcast(toMIF, ... ~ period, value.var="value")
if(length(toMIF) < length(miffile)){
toMIF[, V25 := ""]
}
fwrite(toMIF, name_mif, append=T, sep=";")
deletePlus(name_mif, writemif=T)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.