Skip to content
Snippets Groups Projects
reportCEScalib.R 10.9 KiB
Newer Older
Lavinia Baumstark's avatar
Lavinia Baumstark committed
# |  (C) 2006-2019 Potsdam Institute for Climate Impact Research (PIK)
# |  authors, and contributors see CITATION.cff file. This file is part
# |  of REMIND and licensed under AGPL-3.0-or-later. Under Section 7 of
# |  AGPL-3.0, you are granted additional permissions described in the
# |  REMIND License Exception, version 1.0 (see LICENSE file).
# |  Contact: remind@pik-potsdam.de
#---------------------------------------------------------------------------
#----------------------------     PREPARATION     --------------------------
#---------------------------------------------------------------------------
library(tidyverse)
library(remind)
library(gridExtra)
library(quitte)
require(lucode)
require(colorspace)

gdx_name     <- "fulldata.gdx"        # name of the gdx  
gdx_ref_name <- "input_ref.gdx"       # name of the reference gdx (for policy cost calculation)
Lavinia Baumstark's avatar
Lavinia Baumstark committed

if(!exists("source_include")) {
  #Define arguments that can be read from command line
   outputdir <- "output/R17IH_SSP2_postIIASA-26_2016-12-23_16.03.23"     # path to the output folder
   readArgs("outputdir","gdx_name","gdx_ref_name")
} 
gdx      <- path(outputdir,gdx_name)
gdx_ref  <- path(outputdir,gdx_ref_name)
if(!file.exists(gdx_ref)) { gdx_ref <- NULL }
Lavinia Baumstark's avatar
Lavinia Baumstark committed
scenario <- getScenNames(outputdir)

#---------------------------------------------------------------------------
#----------------------------     FUNCTIONS     ----------------------------
#---------------------------------------------------------------------------

quant_outliers = function(df, threshold){
  
  target_period_items = df %>% filter(iteration == "target") %>%
    select(t,pf) %>%
    unique()
  
  tmp  = left_join(target_period_items,df, by = c("pf","t")) %>%
    filter(variable == "quantity", iteration %in% c("target", iter.max),
           t <= 2100) %>%
    group_by( t, regi, variable, pf )  %>%
    filter(abs((value[iteration == "target"] - value[iteration == iter.max])/value[iteration == "target"]) > threshold) %>% 
    ungroup() %>% 
    filter(value > eps) %>%
    select(regi, pf, t) %>%
    unique() %>% 
    group_by(regi, pf ) %>%
   # filter(length(t) > 1) %>% 
    mutate(period = paste(t, collapse = ", ")) %>%
    select(-t) %>% 
    unique() %>% 
    ungroup() %>% 
    arrange(regi, pf, period) 
  
  return(tmp)
}

price_outliers <- function(df, threshold){
  tmp = df %>% 
    filter(variable == "price",
           iteration %in% c(iter.max),
           pf != "inco",
           t        <= 2100,
           value < threshold) %>%
    select(regi, pf, t) %>%
    group_by(regi, pf ) %>%
    filter(length(t) > 1) %>% 
    mutate(period = paste(t, collapse = ", ")) %>%
    select(-t) %>% 
    unique() %>% 
    ungroup() %>% 
    arrange(regi, pf, period) 
  return(tmp)
}

#---------------------------------------------------------------------------
#---------------------------- READ INPUT DATA    ---------------------------
#---------------------------------------------------------------------------

filename<-"CES_calibration.csv"
cat("Reading CES calibration output from ",filename,"\n")
if (file.exists(filename)) {
  CES.cal.report <- read.table(filename, header = TRUE, sep = ",", quote = "\"") %>% 
    as.data.frame()
} else if (file.exists(path(outputdir,filename))) {
Lavinia Baumstark's avatar
Lavinia Baumstark committed
  
  CES.cal.report <- read.table(path(outputdir,filename), header = TRUE, sep = ",", quote = "\"") %>% 
Lavinia Baumstark's avatar
Lavinia Baumstark committed
    as.data.frame() 
} else {
  stop("No CES_calibration.csv file found. CES_calibration.csv is normally produced during calibration runs")
}


#---------------------------------------------------------------------------
#----------------------------   Parameters      ----------------------------
#---------------------------------------------------------------------------


in_set = readGDX(gdx, "in", "sets")
Lavinia Baumstark's avatar
Lavinia Baumstark committed

itr <- getColValues(CES.cal.report,"iteration")
itr_num <- sort(as.double(setdiff(itr, c("origin","target"))))
itr <- c("origin", "target", itr_num)
 
col <- c("#fc0000", "#000000", 
         rainbow_hcl(length(itr_num) - 1),
         "#bc80bd"#,
         #"#808080"
         )
names(col) <- c("origin", "target", seq(1,length(itr_num)))
Lavinia Baumstark's avatar
Lavinia Baumstark committed


lns <- c(rep("solid", 2), rep("longdash", length(itr_num)))
names(lns) <-  c("origin", "target", seq(1,length(itr_num)))
Lavinia Baumstark's avatar
Lavinia Baumstark committed

.pf <- list("TE" = c("gastr", "refliq", "biotr", "coaltr","hydro", "ngcc","ngt","pc", "apCarDiT","apCarPeT","apCarElT","dot","gaschp","wind","tnrs"))



eps = 1e-2
threshold_quant = 0.15
threshold_price = 0.01




#---------------------------------------------------------------------------
#---------------------------- Process Data      ----------------------------
#---------------------------------------------------------------------------
CES.cal.report = CES.cal.report %>%
  order.levels(iteration = itr)

CES.cal.report <- unique(CES.cal.report)
CES.cal.report <- CES.cal.report %>% tbl_df()
CES.cal.report$scenario = as.character(CES.cal.report$scenario)

CES.cal.report$scenario = as.factor(CES.cal.report$scenario)
CES.cal.report$t <- as.numeric(as.character(CES.cal.report$t))
CES.cal.report$value <- as.numeric(as.character(CES.cal.report$value)) 


CES.cal.report = CES.cal.report %>% filter(iteration %in% c("target", "origin", itr_num))



iter.max = max(itr_num)

.pf$structure = sort(intersect(in_set,getColValues(CES.cal.report,"pf")))

#---------------------------------------------------------------------------
#------------------------      PLOTS     ----------------------------------
#---------------------------------------------------------------------------

pdf(path(outputdir,paste0("CES calibration report_",scenario,".pdf")), 
    width = 42 / 2.54, height = 29.7 / 2.54, title = "CES calibration report")


# Include tables with quantities outliers
try(grid.table(quant_outliers(CES.cal.report, threshold_quant), rows = NULL))
grid.text(paste0("Quantities diverge by more than ",threshold_quant *100," %"),rot = 90,x = 0.05, y = 0.5,
          gp=gpar(fontsize=20, col="grey38"))

# nclude tables with price outliers
grid.newpage()
try(grid.table(price_outliers(CES.cal.report, threshold_price), rows = NULL))
grid.text(paste0("Prices below ",threshold_price),rot = 90,x = 0.05, y = 0.5,
          gp=gpar(fontsize=20, col="grey38"))



for (s in levels(CES.cal.report$scenario)) {
  for (r in unique(CES.cal.report[CES.cal.report$scenario == s,][["regi"]])) {
    
    # plot quantities
    CES.cal.report %>% 
      filter(scenario == s, 
             t        <= 2100, 
             regi     == r, 
             variable == "quantity") %>% 
      order.levels(pf = getElement(.pf,"structure" )) %>% 
      ggplot(aes(x = t, y = value, colour = iteration, 
                 linetype = iteration)) + 
      geom_line() + 
      facet_wrap(~ pf, scales = "free", as.table = FALSE) + 
      expand_limits(y = 0) + 
      scale_colour_manual(values = col) + 
      scale_linetype_manual(values = lns) + 
      ggtitle(paste("quantities", r, s)) -> p
    
    plot(p)
    
    
    # plot prices
    CES.cal.report %>% 
      filter(scenario == s, 
             t        <= 2100, 
             regi     == r, 
             variable == "price") %>% 
      order.levels(pf = getElement(.pf,"structure" )) %>%  
      ggplot(aes(x = t, y = value, colour = iteration, 
                 linetype = iteration)) + 
      geom_line() + 
      facet_wrap(~ pf, scales = "free", as.table = FALSE) + 
      expand_limits(y = 0) + 
      scale_colour_manual(values = col) + 
      scale_linetype_manual(values = lns) + 
Lavinia Baumstark's avatar
Lavinia Baumstark committed
      ggtitle(paste("prices", r, s)) -> p
    plot(p)
    
    # plot efficiencies
    CES.cal.report %>% 
      filter(scenario == s, 
             t        <= 2100, 
             regi     == r, 
             variable == "total efficiency",
             iteration != "origin") %>% 
      group_by(scenario,t,regi,pf,variable) %>%
      mutate(value = value / value[as.character(iteration) == "1"]) %>% 
      ungroup() %>% 
Lavinia Baumstark's avatar
Lavinia Baumstark committed
      order.levels(pf = getElement(.pf,"structure" )) %>% 
      ggplot(aes(x = t, y = value, colour = iteration, 
                 linetype = iteration)) + 
      geom_line() + 
      facet_wrap(~ pf, scales = "free", as.table = FALSE) + 
      scale_colour_manual(values = col) + 
      scale_linetype_manual(values = lns) + 
      ggtitle(paste("total efficiency (1 = iteration 1)", r, s)) -> p
Lavinia Baumstark's avatar
Lavinia Baumstark committed
    plot(p)
Lavinia Baumstark's avatar
Lavinia Baumstark committed
    # plot Putty quantities
    if ( dim(CES.cal.report %>% filter(variable == "quantity_putty"))[1] > 0){
    CES.cal.report %>% 
      filter(scenario == s, 
             t        <= 2100, 
             regi     == r, 
             variable == "quantity_putty") %>% 
      order.levels(pf = getElement(.pf,"structure" )) %>% 
      ggplot(aes(x = t, y = value, colour = iteration, 
                 linetype = iteration)) + 
      geom_line() + 
      facet_wrap(~ pf, scales = "free", as.table = FALSE) + 
      expand_limits(y = 0) + 
      scale_colour_manual(values = col) + 
      scale_linetype_manual(values = lns) + 
      ggtitle(paste("Putty quantities", r, s)) -> p
    
    plot(p)
    
    # plot prices putty
    CES.cal.report %>% 
      filter(scenario == s, 
             t        <= 2100, 
             regi     == r, 
             variable == "price_putty") %>% 
      order.levels(pf = getElement(.pf,"structure" )) %>%  
      ggplot(aes(x = t, y = value, colour = iteration, 
                 linetype = iteration)) + 
      geom_line() + 
      facet_wrap(~ pf, scales = "free", as.table = FALSE) + 
      expand_limits(y = 0) + 
      scale_colour_manual(values = col) + 
      scale_linetype_manual(values = lns) + 
Lavinia Baumstark's avatar
Lavinia Baumstark committed
      ggtitle(paste("prices", r, s)) -> p
    plot(p)
    
    # plot efficiencies
    CES.cal.report %>% 
      filter(scenario == s, 
             t        <= 2100, 
             regi     == r, 
             variable == "total efficiency putty",
             iteration != "origin") %>% 
      group_by(scenario,t,regi,pf,variable) %>%
      mutate(value = value / value[as.character(iteration) == "1"]) %>% 
      ungroup() %>% 
Lavinia Baumstark's avatar
Lavinia Baumstark committed
      order.levels(pf = getElement(.pf,"structure" )) %>% 
      ggplot(aes(x = t, y = value, colour = iteration, 
                 linetype = iteration)) + 
      geom_line() + 
      facet_wrap(~ pf, scales = "free", as.table = FALSE) + 
      expand_limits(y = 0) + 
      scale_colour_manual(values = col) + 
      scale_linetype_manual(values = lns) + 
      ggtitle(paste("total efficiency (1 = iteration 1)", r, s)) -> p
Lavinia Baumstark's avatar
Lavinia Baumstark committed
    plot(p)
    
    }
    
    
    
    
   
    
    # plot delta_cap
    CES.cal.report %>% 
      filter(scenario == s, 
             t        <= 2100,
             t >= 1980,
             regi     == r, 
             variable == "vm_deltaCap",
             pf%in% .pf$TE) %>% 
      order.levels(pf = getElement(.pf, "TE")) %>% 
      ggplot(aes(x = t, y = value, colour = iteration, 
                 linetype = iteration)) + 
      geom_line() + 
      facet_wrap(~ pf, scales = "free", as.table = FALSE) + 
      expand_limits(y = 0) + 
      scale_colour_manual(values = col) + 
      scale_linetype_manual(values = lns) + 
Lavinia Baumstark's avatar
Lavinia Baumstark committed
      geom_vline(xintercept = 2005) +
      ggtitle(paste("vm_deltaCap", r, s)) -> p
    plot(p)
    
  }
}


dev.off()