Skip to content
Snippets Groups Projects
start_bundle_climate.R 5.83 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
source("scripts/start_functions.R")

require(lucode, quietly = TRUE, warn.conflicts = FALSE)

.setgdxcopy <- function(needle, stack, new) {
  # delete entries in stack that contain needle and append new
  out <- c(stack[-grep(needle, stack)], new)
  return(out)
}

# check for config file parameter
config.file <- commandArgs(trailingOnly = TRUE)[1]
if (  is.na(config.file)                          # no parameter given
    | -1 == file.access(config.file, mode = 4))   # if file can't be read
  config.file <- "config/scenario_config.csv" 

cat(paste("reading config file", config.file, "\n"))
  
# Read-in the switches table, use first column as row names
settings <- read.csv2(config.file, stringsAsFactors = FALSE, row.names = 1, 
                      comment.char = "#", na.strings = "")

# Select scenarios that are flagged to start
scenarios  <- settings[settings$start==1,]

if (length(grep("\\.",rownames(scenarios))) > 0) stop("One or more titles contain dots - GAMS would not tolerate this, and quit working at a point where you least expect it. Stopping now. ")

#AJS runs all scenarios as all SSPs, as specified in this file:
meta_tcre = read.csv('config/scenario_meta_rcp.csv',stringsAsFactors = FALSE,comment.char = "#")
rownames(meta_tcre) = meta_tcre[,1]

print(names(meta_tcre))
print(names(scenarios))

scenarios = do.call(rbind,lapply( rownames(meta_tcre),function(s){
  tmp = cbind(scenarios,meta_tcre[s,])
  rownames(tmp) = paste0(rownames(tmp),"_",s)
  tmp
}))

print(scenarios)

#really, land-use libraries?
settings = scenarios

# Modify and save cfg for all runs
for (scen in rownames(scenarios)) {
  #source cfg file for each scenario to avoid duplication of gdx entries in files2export
  source("config/default.cfg")
  
  # Have the log output written in a file (not on the screen)
  cfg$logoption  <- 2
  cfg$sequential <- NA
  
  # Edit run title
  cfg$title <- scen
  cat("\n", scen, "\n")

  # Edit regional aggregation
  if( "regionmapping" %in% names(scenarios)){
    cfg$regionmapping <- scenarios[scen,"regionmapping"] 
  }
  
  # Edit switches in default.cfg according to the values given in the scenarios table
  for (switchname in intersect(names(cfg$gms), names(scenarios))) {
    cfg$gms[[switchname]] <- scenarios[scen,switchname]
  }
  
  # check if full input.gdx path is provided and, if not, search for correct path
  if (!substr(settings[scen,"path_gdx"], nchar(settings[scen,"path_gdx"])-3, nchar(settings[scen,"path_gdx"])) == ".gdx"){
    #if there is no correct scenario folder within the output folder path provided, take the config/input.gdx
    if(length(grep(scen,list.files(path=settings[scen,"path_gdx"]),value=T))==0){
      settings[scen,"path_gdx"] <- "config/input.gdx"
    #if there is only one instance of an output folder with that name, take the fulldata.gdx from this 
    } else if (length(grep(scen,list.files(path=settings[scen,"path_gdx"]),value=T))==1){
      settings[scen,"path_gdx"] <- paste0(settings[scen,"path_gdx"],"/",
                                          grep(scen,list.files(path=settings[scen,"path_gdx"]),value=T),"/fulldata.gdx")
    } else {
      #if there are multiple instances, take the newest one
      settings[scen,"path_gdx"] <- paste0(settings[scen,"path_gdx"],"/",
                                          substr(grep(scen,list.files(path=settings[scen,"path_gdx"]),value=T),1,
                                                 nchar(grep(scen,list.files(path=settings[scen,"path_gdx"]),value=T))-19)[1],      
      max(substr(grep(scen,list.files(path=settings[scen,"path_gdx"]),value=T),
                               nchar(grep(scen,list.files(path=settings[scen,"path_gdx"]),value=T))-18,
                               nchar(grep(scen,list.files(path=settings[scen,"path_gdx"]),value=T)))),"/fulldata.gdx")
    }
  }
  
  # if the above has not created a path to a valid gdx, take config/input.gdx
  if (!file.exists(settings[scen,"path_gdx"])){
    settings[scen,"path_gdx"] <- "config/input.gdx"
    #if even this is not existent, stop
    if (!file.exists(settings[scen,"path_gdx"])){
    stop("Cant find a gdx under path_gdx, please specify full path to gdx or else location of output folder that contains previous run")
    }
  }
 
  # Define path where the GDXs will be taken from
  gdxlist <- c(input.gdx     = settings[scen, "path_gdx"],
               input_ref.gdx = settings[scen, "path_gdx_ref"],
               input_bau.gdx = settings[scen, "path_gdx_bau"],
               input_opt.gdx = settings[scen, "path_gdx_opt"])

  # Remove potential elements that contain ".gdx" and append gdxlist
  cfg$files2export$start <- .setgdxcopy(".gdx", cfg$files2export$start, gdxlist)

  # add gdx information for subsequent runs
  cfg$subsequentruns        <- rownames(settings[settings$path_gdx_ref == scen & !is.na(settings$path_gdx_ref) & settings$start == 1,])
  cfg$RunsUsingTHISgdxAsBAU <- rownames(settings[settings$path_gdx_bau == scen & !is.na(settings$path_gdx_bau) & settings$start == 1,])
  
  # save the cfg data for later start of subsequent runs (after preceding run finished)
  cat("Writing cfg to file\n")
  save(cfg,file=paste0(scen,".RData"))
}

# Directly start runs that have a gdx file location given as path_gdx_ref or where this field is empty
for (scen in rownames(scenarios)) {
  if (substr(settings[scen,"path_gdx_ref"], nchar(settings[scen,"path_gdx_ref"])-3, nchar(settings[scen,"path_gdx_ref"])) == ".gdx" 
     | is.na(settings[scen,"path_gdx_ref"])){
   cat("Starting: ",scen,"\n")
   load(paste0(scen,".RData"))
   start_run(cfg)
   }
}