GLOBIOM-G4M processing steps and data flow.

Before using this notebook, please first read the introductory documentation. Run the code chunks in first-to-last order. You can have RStudio run all chunks in one go, but to configure and test your setup—and because some chunks take a long time to run—it is advisable to start out by running chunks one-by-one at least until you have verified that everything is working smoothly.

Carefully check the output of each chunk for errors, and if present make adjustments and re-run the chunk that failed.

Read the default configuration and list of optional configuration settings

# Remove any objects from environment and read the default configuration
rm(list=ls())
source("R/configuration/default.R")

# Collect the names and types of the default config parameters
config_names <- ls()
config_types <- lapply(lapply(config_names, get), typeof)

# Read list of optional config settings and remove mandatory settings from the environment
source("R/configuration/optional.R")
rm(list=config_names[!(config_names %in% OPTIONAL_CONFIG_SETTINGS)])

Load required packages

library(gdxrrw)
suppressWarnings(library(tidyverse))
library(stringr) # part of the tidyverse, but not attached by default
library(fs)

Customize configuration

custom_configuration_file <- "R/configuration/custom.R"

# Check that a custom configuration exists, edit a new one otherwise.
if (!file_exists(custom_configuration_file)) {
  warning("Custom configuration file missing, please customize.")
  file_copy("R/configuration/default.R", custom_configuration_file)
  rstudioapi::navigateToFile(custom_configuration_file)
}

Load and check custom configuration

When all if fine, the configuration is echoed.

source(custom_configuration_file, local=TRUE, echo=FALSE)
source("R/configuration/check_and_echo.R")

Check that submodules and a GLOBIOM branch are available

When executing this chunk fails, read this.

if (!file_exists(path("Condor_run_R", "Condor_run.R"))) stop ("Condor_run_R submodule content is missing!")
if (!file_exists(path(WD_DOWNSCALING, "README.md"))) stop ("DownScaling submodule content is missing!")
if (!dir_exists(path(WD_GLOBIOM, "Model"))) stop ("No GLOBIOM branch has been checked out!")

Set up directories and functions

# Cache working directory, should equal the root directory of the repo's working tree.
CD <- getwd()

# Canonicalize path to temporary directory for this R session
TEMP_DIR <- path(tempdir())

# Source support functions
source("R/run_submission.R")
source("R/transfer.R")
source("R/post_processing.R")
source("R/helper_functions.R")

# Compile G4M
compile_g4m_model()

# Compile G4M output processing library
compile_table_merger()

# Load dll with G4M report generation routine
dyn.load(path(CD,WD_G4M,"/tableMergeForLinker/merge_files.so"))

1. Run GLOBIOM scenarios

cluster_nr_globiom <- run_globiom_scenarios()

print("GLOBIOM scenarios run complete.")

2. Run initial post-processing

Merge and export GLOBIOM output for use by downscaling and G4M.

run_initial_postproc(cluster_nr_globiom)

print("Initial post processing complete.")

3a. Perform the initial downscaling - needs data from the initial GLOBIOM run

if (!file_exists(path(WD_DOWNSCALING,"input",str_glue("output_landcover_{PROJECT}_{DATE_LABEL}.gdx"))))
  stop("File for downscaling not found! Please call the intial GLOBIOM run before downscaling")

cluster_nr_downscaling <- run_initial_downscaling()

print("Initial downscaling complete")

3b. Merge downscaling outputs and transfer them to G4M


# Transfer downscaled output to G4M input folder
merge_and_transfer(cluster_nr_downscaling)

3c. Generate CSV input files for G4M

if (!file_exists(path(PATH_FOR_G4M, str_glue("GLOBIOM2G4M_output_LC_abs_{PROJECT}_{DATE_LABEL}.csv"))))
  stop("File for G4M run not found! Please perform intial downscaling first.")

gdx_to_csv_for_g4m()

4. Preliminary: Run baseline G4M scenarios—needs data from the intial downscaling

run_g4m(baseline = TRUE)

print("G4M baseline scenario run complete")

5a. Preliminary: Run G4M scenarios—needs data from the intial downscaling and G4M baseline scenarios

allfiles <- dir_ls(path(CD, str_glue("{WD_G4M}"), "out", str_glue("{PROJECT}_{DATE_LABEL}"), "baseline"))
base_files <- str_detect(allfiles,"NPVbau_[:print:]+.bin")
if (!any(base_files)) stop("Baseline G4M run not found! Please run the baseline before the G4M scenarios")

# Run G4M - final scenarios
run_g4m(baseline = FALSE)

print("G4M scenario run complete")

5b. Preliminary: Compile G4M data and produce the report for GLOBIOM—needs data from the G4M run

compile_g4m_data(baseline = FALSE)

6. Preliminary: Perform the final post-processing—needs data from the G4M run

if (USE_LIMPOPO_POSTPROC) {
  run_final_postproc_limpopo(cluster_nr_globiom)
} else {
  run_final_postproc(cluster_nr_globiom)
}

print("Final post-processing complete")

7. Remove files and plot results

# Generate plots for results
if (GENERATE_PLOTS) plot_results(SCENARIOs_PLOT_LOOKUP,SCENARIOS_PLOT_GLOBIOM)

# Remove global environment files
clear_environment()

# Remove GLOBIOM gdx files
clear_glob_files()

# Remove Downscaling gdx files
clear_downs_files()

# Remove G4M output files
clear_g4m_files()
LS0tCnRpdGxlOiAiR0xPQklPTS1HNE0tbGluayIKc3VidGl0bGU6IFIgbm90ZWJvb2sgZm9yIGF1dG9tYXRpemluZyB0aGUgbGluayBiZXR3ZWVuIEdMT0JJT00gYW5kIEc0TS4KYXV0aG9yOgotIEFuZHJleSBMLiBELiBBdWd1c3R5bmN6aWsKLSBBbGJlcnQgQnJvdXdlciAKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIgJVknKWAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiFbR0xPQklPTS1HNE0gcHJvY2Vzc2luZyBzdGVwcyBhbmQgZGF0YSBmbG93Ll0oaW1hZ2VzL2xpbmtfc2NoZW1lLmpwZykKCkJlZm9yZSB1c2luZyB0aGlzIG5vdGVib29rLCBwbGVhc2UgZmlyc3QgcmVhZCB0aGUgW2ludHJvZHVjdG9yeSBkb2N1bWVudGF0aW9uXShodHRwczovL2lpYXNhLmdpdGh1Yi5pby9HTE9CSU9NLUc0TS1saW5rKS4gUnVuIHRoZSBjb2RlIGNodW5rcyBpbiBmaXJzdC10by1sYXN0IG9yZGVyLiBZb3UgY2FuIGhhdmUgUlN0dWRpbyBydW4gYWxsIGNodW5rcyBpbiBvbmUgZ28sIGJ1dCB0byBjb25maWd1cmUgYW5kIHRlc3QgeW91ciBzZXR1cC0tLWFuZCBiZWNhdXNlIHNvbWUgY2h1bmtzIHRha2UgYSBsb25nIHRpbWUgdG8gcnVuLS0taXQgaXMgYWR2aXNhYmxlIHRvIHN0YXJ0IG91dCBieSBydW5uaW5nIGNodW5rcyBvbmUtYnktb25lIGF0IGxlYXN0IHVudGlsIHlvdSBoYXZlIHZlcmlmaWVkIHRoYXQgZXZlcnl0aGluZyBpcyB3b3JraW5nIHNtb290aGx5LgoKQ2FyZWZ1bGx5IGNoZWNrIHRoZSBvdXRwdXQgb2YgZWFjaCBjaHVuayBmb3IgZXJyb3JzLCBhbmQgaWYgcHJlc2VudCBtYWtlIGFkanVzdG1lbnRzIGFuZCByZS1ydW4gdGhlIGNodW5rIHRoYXQgZmFpbGVkLgoKIyMgUmVhZCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGFuZCBsaXN0IG9mIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKCmBgYHtyfQojIFJlbW92ZSBhbnkgb2JqZWN0cyBmcm9tIGVudmlyb25tZW50IGFuZCByZWFkIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24Kcm0obGlzdD1scygpKQpzb3VyY2UoIlIvY29uZmlndXJhdGlvbi9kZWZhdWx0LlIiKQoKIyBDb2xsZWN0IHRoZSBuYW1lcyBhbmQgdHlwZXMgb2YgdGhlIGRlZmF1bHQgY29uZmlnIHBhcmFtZXRlcnMKY29uZmlnX25hbWVzIDwtIGxzKCkKY29uZmlnX3R5cGVzIDwtIGxhcHBseShsYXBwbHkoY29uZmlnX25hbWVzLCBnZXQpLCB0eXBlb2YpCgojIFJlYWQgbGlzdCBvZiBvcHRpb25hbCBjb25maWcgc2V0dGluZ3MgYW5kIHJlbW92ZSBtYW5kYXRvcnkgc2V0dGluZ3MgZnJvbSB0aGUgZW52aXJvbm1lbnQKc291cmNlKCJSL2NvbmZpZ3VyYXRpb24vb3B0aW9uYWwuUiIpCnJtKGxpc3Q9Y29uZmlnX25hbWVzWyEoY29uZmlnX25hbWVzICVpbiUgT1BUSU9OQUxfQ09ORklHX1NFVFRJTkdTKV0pCmBgYAoKIyMgTG9hZCByZXF1aXJlZCBwYWNrYWdlcwoKYGBge3J9CmxpYnJhcnkoZ2R4cnJ3KQpzdXBwcmVzc1dhcm5pbmdzKGxpYnJhcnkodGlkeXZlcnNlKSkKbGlicmFyeShzdHJpbmdyKSAjIHBhcnQgb2YgdGhlIHRpZHl2ZXJzZSwgYnV0IG5vdCBhdHRhY2hlZCBieSBkZWZhdWx0CmxpYnJhcnkoZnMpCmBgYAoKIyMgQ3VzdG9taXplIGNvbmZpZ3VyYXRpb24KCmBgYHtyfQpjdXN0b21fY29uZmlndXJhdGlvbl9maWxlIDwtICJSL2NvbmZpZ3VyYXRpb24vY3VzdG9tLlIiCgojIENoZWNrIHRoYXQgYSBjdXN0b20gY29uZmlndXJhdGlvbiBleGlzdHMsIGVkaXQgYSBuZXcgb25lIG90aGVyd2lzZS4KaWYgKCFmaWxlX2V4aXN0cyhjdXN0b21fY29uZmlndXJhdGlvbl9maWxlKSkgewogIHdhcm5pbmcoIkN1c3RvbSBjb25maWd1cmF0aW9uIGZpbGUgbWlzc2luZywgcGxlYXNlIGN1c3RvbWl6ZS4iKQogIGZpbGVfY29weSgiUi9jb25maWd1cmF0aW9uL2RlZmF1bHQuUiIsIGN1c3RvbV9jb25maWd1cmF0aW9uX2ZpbGUpCiAgcnN0dWRpb2FwaTo6bmF2aWdhdGVUb0ZpbGUoY3VzdG9tX2NvbmZpZ3VyYXRpb25fZmlsZSkKfQpgYGAKCiMjIExvYWQgYW5kIGNoZWNrIGN1c3RvbSBjb25maWd1cmF0aW9uCgpXaGVuIGFsbCBpZiBmaW5lLCB0aGUgY29uZmlndXJhdGlvbiBpcyBlY2hvZWQuCgpgYGB7cn0Kc291cmNlKGN1c3RvbV9jb25maWd1cmF0aW9uX2ZpbGUsIGxvY2FsPVRSVUUsIGVjaG89RkFMU0UpCnNvdXJjZSgiUi9jb25maWd1cmF0aW9uL2NoZWNrX2FuZF9lY2hvLlIiKQpgYGAKCiMjIENoZWNrIHRoYXQgc3VibW9kdWxlcyBhbmQgYSBHTE9CSU9NIGJyYW5jaCBhcmUgYXZhaWxhYmxlCgpXaGVuIGV4ZWN1dGluZyB0aGlzIGNodW5rIGZhaWxzLCBbcmVhZCB0aGlzXShodHRwczovL2lpYXNhLmdpdGh1Yi5pby9HTE9CSU9NLUc0TS1saW5rLyNnZXR0aW5nLXNldCkuCgpgYGB7cn0KaWYgKCFmaWxlX2V4aXN0cyhwYXRoKCJDb25kb3JfcnVuX1IiLCAiQ29uZG9yX3J1bi5SIikpKSBzdG9wICgiQ29uZG9yX3J1bl9SIHN1Ym1vZHVsZSBjb250ZW50IGlzIG1pc3NpbmchIikKaWYgKCFmaWxlX2V4aXN0cyhwYXRoKFdEX0RPV05TQ0FMSU5HLCAiUkVBRE1FLm1kIikpKSBzdG9wICgiRG93blNjYWxpbmcgc3VibW9kdWxlIGNvbnRlbnQgaXMgbWlzc2luZyEiKQppZiAoIWRpcl9leGlzdHMocGF0aChXRF9HTE9CSU9NLCAiTW9kZWwiKSkpIHN0b3AgKCJObyBHTE9CSU9NIGJyYW5jaCBoYXMgYmVlbiBjaGVja2VkIG91dCEiKQpgYGAKCiMjIFNldCB1cCBkaXJlY3RvcmllcyBhbmQgZnVuY3Rpb25zCgpgYGB7cn0KIyBDYWNoZSB3b3JraW5nIGRpcmVjdG9yeSwgc2hvdWxkIGVxdWFsIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcmVwbydzIHdvcmtpbmcgdHJlZS4KQ0QgPC0gZ2V0d2QoKQoKIyBDYW5vbmljYWxpemUgcGF0aCB0byB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciB0aGlzIFIgc2Vzc2lvbgpURU1QX0RJUiA8LSBwYXRoKHRlbXBkaXIoKSkKCiMgU291cmNlIHN1cHBvcnQgZnVuY3Rpb25zCnNvdXJjZSgiUi9ydW5fc3VibWlzc2lvbi5SIikKc291cmNlKCJSL3RyYW5zZmVyLlIiKQpzb3VyY2UoIlIvcG9zdF9wcm9jZXNzaW5nLlIiKQpzb3VyY2UoIlIvaGVscGVyX2Z1bmN0aW9ucy5SIikKCiMgQ29tcGlsZSBHNE0KY29tcGlsZV9nNG1fbW9kZWwoKQoKIyBDb21waWxlIEc0TSBvdXRwdXQgcHJvY2Vzc2luZyBsaWJyYXJ5CmNvbXBpbGVfdGFibGVfbWVyZ2VyKCkKCiMgTG9hZCBkbGwgd2l0aCBHNE0gcmVwb3J0IGdlbmVyYXRpb24gcm91dGluZQpkeW4ubG9hZChwYXRoKENELFdEX0c0TSwiL3RhYmxlTWVyZ2VGb3JMaW5rZXIvbWVyZ2VfZmlsZXMuc28iKSkKYGBgCgojIyAxLiBSdW4gR0xPQklPTSBzY2VuYXJpb3MKCmBgYHtyfQpjbHVzdGVyX25yX2dsb2Jpb20gPC0gcnVuX2dsb2Jpb21fc2NlbmFyaW9zKCkKCnByaW50KCJHTE9CSU9NIHNjZW5hcmlvcyBydW4gY29tcGxldGUuIikKYGBgCgojIyAyLiBSdW4gaW5pdGlhbCBwb3N0LXByb2Nlc3NpbmcKCk1lcmdlIGFuZCBleHBvcnQgR0xPQklPTSBvdXRwdXQgZm9yIHVzZSBieSBkb3duc2NhbGluZyBhbmQgRzRNLgoKYGBge3J9CnJ1bl9pbml0aWFsX3Bvc3Rwcm9jKGNsdXN0ZXJfbnJfZ2xvYmlvbSkKCnByaW50KCJJbml0aWFsIHBvc3QgcHJvY2Vzc2luZyBjb21wbGV0ZS4iKQpgYGAKCiMjIDNhLiBQZXJmb3JtIHRoZSBpbml0aWFsIGRvd25zY2FsaW5nIC0gbmVlZHMgZGF0YSBmcm9tIHRoZSBpbml0aWFsIEdMT0JJT00gcnVuCgpgYGB7cn0KaWYgKCFmaWxlX2V4aXN0cyhwYXRoKFdEX0RPV05TQ0FMSU5HLCJpbnB1dCIsc3RyX2dsdWUoIm91dHB1dF9sYW5kY292ZXJfe1BST0pFQ1R9X3tEQVRFX0xBQkVMfS5nZHgiKSkpKQogIHN0b3AoIkZpbGUgZm9yIGRvd25zY2FsaW5nIG5vdCBmb3VuZCEgUGxlYXNlIGNhbGwgdGhlIGludGlhbCBHTE9CSU9NIHJ1biBiZWZvcmUgZG93bnNjYWxpbmciKQoKY2x1c3Rlcl9ucl9kb3duc2NhbGluZyA8LSBydW5faW5pdGlhbF9kb3duc2NhbGluZygpCgpwcmludCgiSW5pdGlhbCBkb3duc2NhbGluZyBjb21wbGV0ZSIpCmBgYAoKIyMgM2IuIE1lcmdlIGRvd25zY2FsaW5nIG91dHB1dHMgYW5kIHRyYW5zZmVyIHRoZW0gdG8gRzRNCgpgYGB7cn0KCiMgVHJhbnNmZXIgZG93bnNjYWxlZCBvdXRwdXQgdG8gRzRNIGlucHV0IGZvbGRlcgptZXJnZV9hbmRfdHJhbnNmZXIoY2x1c3Rlcl9ucl9kb3duc2NhbGluZykKYGBgCgojIyAzYy4gR2VuZXJhdGUgQ1NWIGlucHV0IGZpbGVzIGZvciBHNE0KCmBgYHtyfQppZiAoIWZpbGVfZXhpc3RzKHBhdGgoUEFUSF9GT1JfRzRNLCBzdHJfZ2x1ZSgiR0xPQklPTTJHNE1fb3V0cHV0X0xDX2Fic197UFJPSkVDVH1fe0RBVEVfTEFCRUx9LmNzdiIpKSkpCiAgc3RvcCgiRmlsZSBmb3IgRzRNIHJ1biBub3QgZm91bmQhIFBsZWFzZSBwZXJmb3JtIGludGlhbCBkb3duc2NhbGluZyBmaXJzdC4iKQoKZ2R4X3RvX2Nzdl9mb3JfZzRtKCkKYGBgCgojIyA0LiBQcmVsaW1pbmFyeTogUnVuIGJhc2VsaW5lIEc0TSBzY2VuYXJpb3MtLS1uZWVkcyBkYXRhIGZyb20gdGhlIGludGlhbCBkb3duc2NhbGluZwoKYGBge3J9CnJ1bl9nNG0oYmFzZWxpbmUgPSBUUlVFKQoKcHJpbnQoIkc0TSBiYXNlbGluZSBzY2VuYXJpbyBydW4gY29tcGxldGUiKQpgYGAKCiMjIDVhLiBQcmVsaW1pbmFyeTogUnVuIEc0TSBzY2VuYXJpb3MtLS1uZWVkcyBkYXRhIGZyb20gdGhlIGludGlhbCBkb3duc2NhbGluZyBhbmQgRzRNIGJhc2VsaW5lIHNjZW5hcmlvcwoKYGBge3J9CmFsbGZpbGVzIDwtIGRpcl9scyhwYXRoKENELCBzdHJfZ2x1ZSgie1dEX0c0TX0iKSwgIm91dCIsIHN0cl9nbHVlKCJ7UFJPSkVDVH1fe0RBVEVfTEFCRUx9IiksICJiYXNlbGluZSIpKQpiYXNlX2ZpbGVzIDwtIHN0cl9kZXRlY3QoYWxsZmlsZXMsIk5QVmJhdV9bOnByaW50Ol0rLmJpbiIpCmlmICghYW55KGJhc2VfZmlsZXMpKSBzdG9wKCJCYXNlbGluZSBHNE0gcnVuIG5vdCBmb3VuZCEgUGxlYXNlIHJ1biB0aGUgYmFzZWxpbmUgYmVmb3JlIHRoZSBHNE0gc2NlbmFyaW9zIikKCiMgUnVuIEc0TSAtIGZpbmFsIHNjZW5hcmlvcwpydW5fZzRtKGJhc2VsaW5lID0gRkFMU0UpCgpwcmludCgiRzRNIHNjZW5hcmlvIHJ1biBjb21wbGV0ZSIpCmBgYAoKIyMgNWIuIFByZWxpbWluYXJ5OiBDb21waWxlIEc0TSBkYXRhIGFuZCBwcm9kdWNlIHRoZSByZXBvcnQgZm9yIEdMT0JJT00tLS1uZWVkcyBkYXRhIGZyb20gdGhlIEc0TSBydW4KCmBgYHtyfQpjb21waWxlX2c0bV9kYXRhKGJhc2VsaW5lID0gRkFMU0UpCmBgYAoKIyMgNi4gUHJlbGltaW5hcnk6IFBlcmZvcm0gdGhlIGZpbmFsIHBvc3QtcHJvY2Vzc2luZy0tLW5lZWRzIGRhdGEgZnJvbSB0aGUgRzRNIHJ1bgoKYGBge3J9CmlmIChVU0VfTElNUE9QT19QT1NUUFJPQykgewogIHJ1bl9maW5hbF9wb3N0cHJvY19saW1wb3BvKGNsdXN0ZXJfbnJfZ2xvYmlvbSkKfSBlbHNlIHsKICBydW5fZmluYWxfcG9zdHByb2MoY2x1c3Rlcl9ucl9nbG9iaW9tKQp9CgpwcmludCgiRmluYWwgcG9zdC1wcm9jZXNzaW5nIGNvbXBsZXRlIikKYGBgCgojIyA3LiBSZW1vdmUgZmlsZXMgYW5kIHBsb3QgcmVzdWx0cwoKYGBge3J9CiMgR2VuZXJhdGUgcGxvdHMgZm9yIHJlc3VsdHMKaWYgKEdFTkVSQVRFX1BMT1RTKSBwbG90X3Jlc3VsdHMoU0NFTkFSSU9zX1BMT1RfTE9PS1VQLFNDRU5BUklPU19QTE9UX0dMT0JJT00pCgojIFJlbW92ZSBnbG9iYWwgZW52aXJvbm1lbnQgZmlsZXMKY2xlYXJfZW52aXJvbm1lbnQoKQoKIyBSZW1vdmUgR0xPQklPTSBnZHggZmlsZXMKY2xlYXJfZ2xvYl9maWxlcygpCgojIFJlbW92ZSBEb3duc2NhbGluZyBnZHggZmlsZXMKY2xlYXJfZG93bnNfZmlsZXMoKQoKIyBSZW1vdmUgRzRNIG91dHB1dCBmaWxlcwpjbGVhcl9nNG1fZmlsZXMoKQpgYGAK