Level: ⚫⚫⚫⚫⚪ Advanced

Requirements

  • Have GAMS installed (https://www.gams.com)
  • Have R installed (https://www.r-project.org/)
  • Have R packages gms and magpie4 installed
  • Have a local copy of the MAgPIE master checked out from https://github.com/magpiemodel/magpie
  • Have downloaded the MAgPIE default data via Rscript start.R -> “download data”

Content

  • Changing the MAgPIE GAMS code
  • adding In-Code documentation
  • adding a new module realization
  • integrate new realization

Overview

Introduction

MAgPIE has a modular concept. Each module (e.g. pasture) can have several realizations (e.g. dynamic and static). The purpose of these realizations is a) to maintain the current default model behavior and b) to keep the model operational while developing a new realization. A typical use case is the extension of a realization by a specific feature. In this case, one would copy the current default realization, rename it properly, and apply the wanted changes. Then, the model behavior can be compared between the two realizations. Possibly, the new realization might become the new default at some point and the old realization is deleted.

This tutorial shows how to add a new realization to a module in the MAgPIE model. To illustrate the different steps, we will expand the urban land module. In the current MAgPIE master, the urban land module has a static and exo_nov21 realization. In static, urban land is just static over time. In exo_nov21, future urban land is prescribed based on existing scenarios of urbanization. In this tutorial, we will add a new realization called pop_growth, which changes urban land based on population growth. Note that this should be only used for illustrative purposes.

Adding a new realization

We want to add a new realization to the urban land module. The urban land module is located here: modules/34_urban.

Add a new realization by duplicating an existing one

Duplicate the static folder and rename it to pop_growth. Now we need to edit and add files in the pop_growth folder. In the end, you should have the following files:

declarations.gms

positive variables
 vm_cost_urban(j)			Technical adjustment cost
;

equations
 q34_urban(j)       		urban land (mio. ha)
;

parameters
 p34_pop_growth(t_all,i) 		annual population growth rate (1)
;

equations.gms

$ontext
Urban land in the current time step (vm_land) is forced to the value from the previous 
time step (pcm_land) multiplied by 1 + population growth between these time steps.
$offtext

q34_urban(j2)..
 vm_land(j2,"urban") =e= 
 pcm_land(j2,"urban") * (1 + sum((ct,cell(i2,j2)), p34_pop_growth(ct,i2)) * m_timestep_length);

preloop.gms

$ontext
#Calculate annual population growth rate
Since the temporal resolution of t_all is 5-year time steps, we have to divide the change 
between time steps by the number of years between these time steps (m_yeardiff) to get 
annual values.
$offtext

loop(t_all$(ord(t_all) > 1),
 p34_pop_growth(t_all,i) = (im_pop(t_all,i)/im_pop(t_all-1,i) - 1) / m_yeardiff(t_all);
);

presolve.gms

*fix carbon stocks to zero
vm_carbon_stock.fx(j,"urban",c_pools) = 0;
*Biodiversity
vm_bv.fx(j,"urban", potnatveg) = pcm_land(j,"urban") * fm_bii_coeff("urban",potnatveg) * fm_luh2_side_layers(j,potnatveg);
*fix costs to zero
vm_cost_urban.fx(j) = 0;

realization.gms

*' @description In this realization, urban land expands based on population growth.
*' Carbon stocks are assumed zero.

*' @limitations Only for illustrative purpose

Update the code

To include the new realization pop_growth properly into the GAMS code we run a specific R command in the main folder. First navigate in your command line to the MAgPIE main folder, then open a new R session (type R followed by ENTER), and then copy-paste the following R commands:

gms::update_fulldataOutput()
gms::update_modules_embedding()

These two commands will add a postsolve.gms file, and update the realization.gms and declarations.gms files. Hint: If you change, add or delete variables/parameters always run these commands to avoid GAMS compilation errors.

Run codeCheck to check if all module interfaces exist.

gms::codeCheck(interactive = TRUE)

codeCheck will detect a problem with interfaces in 34_urban. Follow the instructions, which will add a not_used.txt file.

Now you can quit the R session with q().

Testing a new realization

Start a model run

For a quick GAMS test, we simply set the new realization in the file main.gms: $setglobal urban pop_growth. We can then check if the model compiles correctly with this command evoked from the command line.

gams main.gms action=C

If you get compilation errors, you have to resolve these first. Look into the main.lst file. It will tell you what kind of error occurred.

To make our test run as fast as possible, we reduce the number of time steps to 3. For this, we set $setglobal c_timesteps quicktest in main.gms.

Now we can start a test run with this command. This can take up to 10-15 minutes, depending on the resources of your machine.

gams main.gms

GAMS will create a fulldata.gdx file in the main folder.

For starting a productive model run, we would have to change cfg$gms$urban in the config file config/default.cfg (cfg$gms$urban <- "pop_growth"). We could now start a model run with Rscript start.R -> 1: default -> 1: Direct execution. Or, even better write a start script without changing config/default.cfg.

Check the results

Start a new R session in the MAgPIE main folder, and execute these commands.

options(digits=2)
library(magpie4)
gdx <- "fulldata.gdx"
land(gdx,level="glo",type="urban")
land(gdx,level="reg",type="urban")

Overview