-
Lavinia Baumstark authoredLavinia Baumstark authored
start_bundle.R 5.75 KiB
# | (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. ")
# 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 main file of model
if( "model" %in% names(scenarios)){
cfg$model <- scenarios[scen,"model"]
}
# Edit regional aggregation
if( "regionmapping" %in% names(scenarios)){
cfg$regionmapping <- scenarios[scen,"regionmapping"]
}
# Edit input data revision
if( "revision" %in% names(scenarios)){
cfg$revision <- scenarios[scen,"revision"]
}
# 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]
}
# Set reporting script
if( "output" %in% names(scenarios)){
cfg$output <- paste0("c(\"",gsub(",","\",\"",gsub(", ",",",scenarios[scen,"output"])),"\")")
}
# 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)
}
}